fix: remove all opening, entrance, and load animations across entire application

This commit is contained in:
2026-10-23 18:22:23 +05:30
parent f67ed2cfdd
commit af75d7d4f4
32 changed files with 138 additions and 272 deletions

View File

@@ -7,7 +7,7 @@ export default function AboutPage() {
return (
<PublicLayout>
<div className="bg-background text-foreground flex flex-col pt-24 pb-16 min-h-[70vh]">
<main className="flex-1 flex flex-col items-center justify-center p-8 text-center animate-in fade-in duration-700">
<main className="flex-1 flex flex-col items-center justify-center p-8 text-center">
<h1 className="text-5xl font-bold tracking-tighter mb-6">About PragatiVeer</h1>
<p className="text-xl text-muted-foreground max-w-4xl leading-relaxed mb-8 mx-auto text-left md:text-center">
PragatiVeer is India's first AI-powered daily practice platform for JEE and NEET aspirants — a product of Gyannetra Pvt Ltd, the first company to bring the power of artificial intelligence into Indian exam preparation. We combine daily practice sheets, exam-realistic test series, and an AI coach that personalises every student's learning journey, making high-quality preparation accessible and affordable for every Indian student.

View File

@@ -1,4 +1,4 @@
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Activity, BrainCircuit, Zap, Server, ShieldCheck } from "lucide-react"
export default function AgentsPage() {
@@ -10,7 +10,7 @@ export default function AgentsPage() {
]
return (
<div className="p-8 space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-500">
<div className="p-8 space-y-8">
<div>
<h1 className="text-3xl font-bold tracking-tight">AI Agents Monitor</h1>
<p className="text-muted-foreground mt-1">Real-time telemetry for internal LLM orchestration nodes.</p>

View File

@@ -65,7 +65,7 @@ export default function CouponsAdmin() {
}
return (
<div className="p-8 max-w-6xl mx-auto space-y-8 animate-in fade-in duration-500">
<div className="p-8 max-w-6xl mx-auto space-y-8">
<div>
<h1 className="text-3xl font-bold tracking-tight">Coupon Management</h1>
<p className="text-muted-foreground mt-1 font-medium">Create and manage discount codes for subscriptions.</p>

View File

@@ -6,7 +6,7 @@ import { Terminal, Users, Database, Activity, RefreshCw } from "lucide-react"
export default function AdminDashboard() {
return (
<div className="p-8 max-w-7xl mx-auto space-y-8 animate-in fade-in duration-500">
<div className="p-8 max-w-7xl mx-auto space-y-8">
<header className="flex items-center justify-between border-b border-border pb-6">
<div>
<h1 className="text-3xl font-bold tracking-tighter text-foreground">Command Center</h1>

View File

@@ -1,4 +1,4 @@
import { Button } from "@/components/ui/button"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
import { Search, Plus, Filter, MoreHorizontal, Edit, Trash } from "lucide-react"
@@ -12,7 +12,7 @@ export default function QuestionsPage() {
]
return (
<div className="p-8 space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-500">
<div className="p-8 space-y-8">
<div className="flex justify-between items-center">
<div>
<h1 className="text-3xl font-bold tracking-tight">Question Bank</h1>

View File

@@ -58,7 +58,7 @@ export default function SettingsPage() {
if (loading) return <div className="p-8 animate-pulse text-muted-foreground font-bold">Loading System Settings...</div>;
return (
<div className="p-8 space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-500 max-w-4xl">
<div className="p-8 space-y-8 max-w-4xl">
<div>
<h1 className="text-3xl font-bold tracking-tight">System Settings</h1>
<p className="text-muted-foreground mt-1">Configure global application variables and security protocols.</p>

View File

@@ -102,7 +102,7 @@ export default function StudentKundliPage() {
)
return (
<div className="p-8 space-y-6 max-w-6xl mx-auto animate-in fade-in duration-500">
<div className="p-8 space-y-6 max-w-6xl mx-auto">
{/* Header */}
<div className="flex items-center justify-between">
<Button variant="ghost" onClick={() => router.back()} className="text-muted-foreground hover:text-foreground">

View File

@@ -224,7 +224,7 @@ export default function StudentsPage() {
}
return (
<div className="p-8 space-y-8 animate-in fade-in slide-in-from-bottom-4 duration-500">
<div className="p-8 space-y-8">
<div className="flex justify-between items-center">
<div>
<h1 className="text-3xl font-bold tracking-tight">Student Directory</h1>

View File

@@ -778,7 +778,7 @@ export default function AdminTestsPage() {
{/* SCHEDULE CONTROLLER MODAL */}
{editingTest && (
<div className="fixed inset-0 z-50 bg-black/80 backdrop-blur-sm flex items-center justify-center p-4">
<div className="bg-background border border-border rounded-2xl w-full max-w-lg overflow-hidden shadow-2xl animate-in fade-in zoom-in-95 duration-200">
<div className="bg-background border border-border rounded-2xl w-full max-w-lg overflow-hidden shadow-2xl">
<div className="p-5 border-b border-border bg-secondary/30 flex items-center justify-between">
<div className="flex items-center gap-2.5">
<div className="p-2 bg-[var(--cyan-ai-10)] rounded-xl border border-[var(--cyan-ai-20)] text-[var(--cyan-ai)]">

View File

@@ -282,7 +282,7 @@ export default function CBTExamPage({ params }: { params: Promise<{ examId: stri
if (status === 'NOT_STARTED') {
return (
<div className="h-screen flex flex-col items-center justify-center bg-background p-8 text-center animate-in fade-in duration-500">
<div className="h-screen flex flex-col items-center justify-center bg-background p-8 text-center">
<div className="max-w-2xl bg-secondary/10 border border-border p-8 rounded-2xl shadow-2xl">
<h1 className="text-3xl font-bold mb-4 flex items-center justify-center gap-3">
<Shield className="text-red-500" /> Secure Exam Environment
@@ -392,8 +392,8 @@ export default function CBTExamPage({ params }: { params: Promise<{ examId: stri
<div className="h-screen flex flex-col overflow-hidden">
{/* Warning Modal */}
{showWarning && (
<div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm animate-in fade-in duration-200">
<div className="bg-background border border-red-500 shadow-[0_0_50px_-10px_rgba(239,68,68,0.5)] rounded-2xl w-[400px] overflow-hidden animate-in zoom-in-95 duration-200">
<div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm">
<div className="bg-background border border-red-500 shadow-[0_0_50px_-10px_rgba(239,68,68,0.5)] rounded-2xl w-[400px] overflow-hidden">
<div className="p-6 text-center space-y-4">
<AlertTriangle size={64} className="text-red-500 mx-auto animate-pulse" />
<h3 className="text-2xl font-bold text-red-500">Warning!</h3>
@@ -737,7 +737,7 @@ export default function CBTExamPage({ params }: { params: Promise<{ examId: stri
{showSubmitConfirm && (
<div className="absolute inset-0 z-50 bg-background/80 backdrop-blur-sm flex items-center justify-center p-4">
<div className="bg-background border border-border shadow-2xl rounded-2xl p-6 max-w-md w-full animate-in fade-in zoom-in duration-200">
<div className="bg-background border border-border shadow-2xl rounded-2xl p-6 max-w-md w-full">
<h2 className="text-2xl font-bold mb-2">Submit Exam?</h2>
<p className="text-muted-foreground mb-6">Are you sure you want to submit your exam? You will not be able to change your answers after submission.</p>

View File

@@ -178,7 +178,7 @@ function CheckoutContent() {
if (success) {
return (
<div className="min-h-screen bg-background flex flex-col items-center justify-center p-6 animate-in fade-in zoom-in duration-500">
<div className="min-h-screen bg-background flex flex-col items-center justify-center p-6">
<Card className="max-w-md w-full border-border bg-secondary/10 backdrop-blur-xl shadow-2xl shadow-[var(--cyan-ai-20)] rounded-[2rem] text-center p-8">
<CheckCircle2 size={80} className="text-[var(--cyan-ai)] mx-auto mb-6" />
<h2 className="text-3xl font-black mb-2">Payment Successful!</h2>
@@ -198,7 +198,7 @@ function CheckoutContent() {
<ArrowLeft size={16} /> Back to Plans
</Link>
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8 animate-in fade-in slide-in-from-bottom-8 duration-700">
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-2 gap-8">
{/* Billing Details */}
<div className="space-y-6">
@@ -259,7 +259,7 @@ function CheckoutContent() {
</div>
{error && (
<div className="p-3 bg-red-500/10 border border-red-500/20 rounded-xl text-red-500 text-sm font-medium text-center animate-in zoom-in mt-4">
<div className="p-3 bg-red-500/10 border border-red-500/20 rounded-xl text-red-500 text-sm font-medium text-center mt-4">
{error}
</div>
)}

View File

@@ -8,7 +8,7 @@ export default function ContactPage() {
return (
<PublicLayout>
<div className="bg-background text-foreground flex flex-col pt-24 pb-16 min-h-[70vh]">
<main className="flex-1 flex flex-col items-center justify-center p-8 animate-in fade-in duration-700">
<main className="flex-1 flex flex-col items-center justify-center p-8">
<h1 className="text-5xl font-bold tracking-tighter mb-4 text-center">Contact Us</h1>
<p className="text-lg text-muted-foreground max-w-2xl text-center mb-12">
Have a question or need support? We're here to help you ace your preparation.

View File

@@ -1,4 +1,4 @@
"use client"
"use client"
import { useState, useEffect } from "react"
import { Card, CardContent } from "@/components/ui/card"
@@ -148,7 +148,7 @@ export default function AIComCBTDPPPage() {
</div>
{submitted && (
<Card className="border-emerald-500/30 bg-emerald-500/10 p-6 rounded-3xl space-y-4 animate-in zoom-in-95">
<Card className="border-emerald-500/30 bg-emerald-500/10 p-6 rounded-3xl space-y-4">
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<CheckCircle2 size={32} className="text-emerald-400" />
@@ -216,7 +216,7 @@ export default function AIComCBTDPPPage() {
</div>
{submitted && (
<div className="mt-6 p-4 rounded-2xl bg-[var(--cyan-ai-10)] border border-[var(--cyan-ai-30)] text-sm text-[var(--cyan-ai)] space-y-1 animate-in fade-in">
<div className="mt-6 p-4 rounded-2xl bg-[var(--cyan-ai-10)] border border-[var(--cyan-ai-30)] text-sm text-[var(--cyan-ai)] space-y-1">
<span className="font-extrabold uppercase text-xs tracking-wider block">AI Solution & Explanation:</span>
<p>{sampleQuestions[activeQuestion].explanation}</p>
</div>

View File

@@ -387,7 +387,7 @@ export default function CBTPage() {
{showUpgradeModal && (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm">
<div className="bg-background border border-border shadow-2xl rounded-2xl w-[450px] p-8 text-center space-y-6 animate-in zoom-in-95 duration-200">
<div className="bg-background border border-border shadow-2xl rounded-2xl w-[450px] p-8 text-center space-y-6">
<div className="size-16 rounded-full bg-red-500/10 flex items-center justify-center mx-auto text-red-500">
<Lock size={32} />
</div>

View File

@@ -273,7 +273,7 @@ export default function CommunityPage() {
{/* Ask Doubt Modal */}
{isAskModalOpen && (
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-background/80 backdrop-blur-sm">
<div className="bg-background border border-border w-full max-w-2xl rounded-2xl shadow-2xl overflow-hidden animate-in zoom-in-95 duration-200">
<div className="bg-background border border-border w-full max-w-2xl rounded-2xl shadow-2xl overflow-hidden">
<div className="flex justify-between items-center p-6 border-b border-border bg-secondary/30">
<h2 className="text-2xl font-bold flex items-center gap-2">
<MessageSquare className="text-[var(--cyan-ai)]" /> Ask a Doubt

View File

@@ -309,7 +309,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
{/* Functional User Dropdown */}
<div className="relative" ref={dropdownRef}>
{dropdownOpen && user && (
<div className="absolute bottom-full left-0 w-full mb-2 bg-background border border-border rounded-xl shadow-xl shadow-black/20 overflow-hidden animate-in fade-in slide-in-from-bottom-2 duration-200 z-50">
<div className="absolute bottom-full left-0 w-full mb-2 bg-background border border-border rounded-xl shadow-xl shadow-black/20 overflow-hidden z-50">
<div className="px-4 py-3 border-b border-border bg-secondary/30">
<p className="text-sm font-bold text-foreground truncate">{cleanDisplayName(user.name)}</p>
<p className="text-xs text-muted-foreground truncate">{user.email || user.phone}</p>

View File

@@ -1,4 +1,4 @@
"use client"
"use client"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
@@ -46,7 +46,7 @@ export default function ForgotPasswordPage() {
<ArrowLeft size={16} /> Back to Login
</Link>
<div className="w-full max-w-md space-y-8 animate-in fade-in slide-in-from-bottom-8 duration-700">
<div className="w-full max-w-md space-y-8">
<div className="flex justify-center mb-8">
<Logo href="/" className="w-72" imageClassName="object-contain" height={80} />
</div>

View File

@@ -116,25 +116,38 @@ body {
box-shadow: none !important;
}
/* ─── Intro/opening animations completely eliminated for instant, rock-solid page loading ─── */
*, *::before, *::after {
--tw-enter-opacity: 1 !important;
--tw-enter-scale: 1 !important;
--tw-enter-translate-x: 0 !important;
--tw-enter-translate-y: 0 !important;
}
.animate-page-enter,
.animate-section,
.animate-section-1,
.animate-section-2,
.animate-section-3,
.animate-section-4,
.animate-section-5,
.animate-section-6,
.animate-in,
[class*="animate-in"],
[class*="fade-in"],
[class*="slide-in"],
[class*="zoom-in"] {
animation: none !important;
opacity: 1 !important;
transform: none !important;
filter: none !important;
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
/* ─── Intro/opening animations removed for rock-solid instant page display ─── */
.animate-page-enter,
.animate-section,
.animate-section-1,
.animate-section-2,
.animate-section-3,
.animate-section-4,
.animate-section-5,
.animate-section-6 {
animation: none !important;
opacity: 1 !important;
transform: none !important;
}
.bg-grid {

View File

@@ -82,7 +82,7 @@ export default function LoginPage() {
<ArrowLeft size={16} /> Back to Home
</Link>
<div className="w-full max-w-md space-y-8 animate-in fade-in slide-in-from-bottom-8 duration-700">
<div className="w-full max-w-md space-y-8">
<div className="flex justify-center mb-8">
<Logo href="/" className="w-72" imageClassName="object-contain" height={80} />
</div>

View File

@@ -1,8 +1,7 @@
"use client";
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import { motion } from "framer-motion";
import {
CheckCircle2,
Zap,
@@ -41,7 +40,6 @@ export default function OnboardingPage() {
if (typeof window !== "undefined") {
localStorage.setItem("chosen_plan", plan);
}
// Small UX delay so the button animation feels intentional
await new Promise((r) => setTimeout(r, 600));
router.push("/dashboard");
};
@@ -54,19 +52,14 @@ export default function OnboardingPage() {
<div className="absolute bottom-0 right-1/4 size-[500px] bg-[var(--cyan-ai-10)] blur-[120px] rounded-full" />
</div>
<div className="w-full max-w-5xl space-y-12 animate-in fade-in slide-in-from-bottom-6 duration-700">
<div className="w-full max-w-5xl space-y-12">
{/* Logo */}
<div className="flex justify-center">
<Logo href="/" className="w-56" imageClassName="object-contain" height={64} />
</div>
{/* Header */}
<motion.div
initial={{ opacity: 0, y: 24 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="text-center space-y-4"
>
<div className="text-center space-y-4">
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-primary/10 border border-primary/20 text-primary font-bold text-sm mb-2">
<Sparkles size={14} className="animate-pulse" />
Account Created Successfully!
@@ -85,16 +78,12 @@ export default function OnboardingPage() {
<Clock size={16} />
Your 15-day free trial with all features starts now — Day 1 of 15
</div>
</motion.div>
</div>
{/* Plan Cards */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-4xl mx-auto">
{/* Pro Plan */}
<motion.div
initial={{ opacity: 0, x: -40 }}
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 0.15, type: "spring" }}
>
<div>
<div
className="relative rounded-[2rem] p-[1px] h-full group cursor-pointer"
style={{
@@ -103,7 +92,7 @@ export default function OnboardingPage() {
}}
onClick={() => !selecting && handleSelect("Pro")}
>
<div className="bg-background rounded-[calc(2rem-1px)] p-7 flex flex-col h-full transition-all duration-300 group-hover:bg-secondary/20">
<div className="bg-background rounded-[calc(2rem-1px)] p-7 flex flex-col h-full hover:bg-secondary/20">
{/* Header */}
<div className="mb-6">
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-yellow-500/10 border border-yellow-500/20 text-yellow-500 text-xs font-bold mb-3 uppercase tracking-wider">
@@ -135,7 +124,7 @@ export default function OnboardingPage() {
if (!selecting) handleSelect("Pro");
}}
disabled={!!selecting}
className="w-full h-12 rounded-xl bg-yellow-500 text-black font-bold text-base hover:bg-yellow-400 transition-all duration-300 shadow-[0_0_20px_-5px_rgba(234,179,8,0.5)] hover:shadow-[0_0_30px_-3px_rgba(234,179,8,0.7)] hover:-translate-y-0.5 disabled:opacity-70 disabled:cursor-not-allowed flex items-center justify-center gap-2"
className="w-full h-12 rounded-xl bg-yellow-500 text-black font-bold text-base hover:bg-yellow-400 shadow-[0_0_20px_-5px_rgba(234,179,8,0.5)] hover:shadow-[0_0_30px_-3px_rgba(234,179,8,0.7)] disabled:opacity-70 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
{selecting === "Pro" ? (
<>
@@ -151,14 +140,10 @@ export default function OnboardingPage() {
</button>
</div>
</div>
</motion.div>
</div>
{/* AI Coach Plan */}
<motion.div
initial={{ opacity: 0, x: 40 }}
animate={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 0.25, type: "spring" }}
>
<div>
<div
className="relative rounded-[2rem] p-[1px] h-full group cursor-pointer"
style={{
@@ -172,7 +157,7 @@ export default function OnboardingPage() {
<Sparkles size={12} /> Most Popular
</div>
<div className="bg-background rounded-[calc(2rem-1px)] p-7 flex flex-col h-full transition-all duration-300 group-hover:bg-secondary/20">
<div className="bg-background rounded-[calc(2rem-1px)] p-7 flex flex-col h-full hover:bg-secondary/20">
{/* Header */}
<div className="mb-6 pt-2">
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-[var(--cyan-ai-10)] border border-[var(--cyan-ai-20)] text-[var(--cyan-ai)] text-xs font-bold mb-3 uppercase tracking-wider">
@@ -204,7 +189,7 @@ export default function OnboardingPage() {
if (!selecting) handleSelect("AI Coach");
}}
disabled={!!selecting}
className="w-full h-12 rounded-xl bg-[var(--cyan-ai)] text-black font-bold text-base hover:bg-[var(--cyan-ai-80)] transition-all duration-300 shadow-[0_0_20px_-5px_rgba(12,96,96,0.5)] hover:shadow-[0_0_30px_-3px_rgba(12,96,96,0.8)] hover:-translate-y-0.5 disabled:opacity-70 disabled:cursor-not-allowed flex items-center justify-center gap-2"
className="w-full h-12 rounded-xl bg-[var(--cyan-ai)] text-black font-bold text-base hover:bg-[var(--cyan-ai-80)] shadow-[0_0_20px_-5px_rgba(12,96,96,0.5)] hover:shadow-[0_0_30px_-3px_rgba(12,96,96,0.8)] disabled:opacity-70 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
{selecting === "AI Coach" ? (
<>
@@ -220,18 +205,13 @@ export default function OnboardingPage() {
</button>
</div>
</div>
</motion.div>
</div>
</div>
{/* Bottom note */}
<motion.p
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.5 }}
className="text-center text-xs text-muted-foreground font-medium pb-8"
>
<p className="text-center text-xs text-muted-foreground font-medium pb-8">
🔒 No credit card required for trial &nbsp;·&nbsp; Cancel anytime &nbsp;·&nbsp; All prices inclusive of GST
</motion.p>
</p>
</div>
</div>
);

View File

@@ -1,4 +1,4 @@
"use client"
"use client"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
@@ -6,61 +6,20 @@ import { Card, CardContent } from "@/components/ui/card"
import { BrainCircuit, Activity, Zap, CheckCircle2, Shield, ArrowRight, Play, BookOpen, LineChart, Trophy, Sparkles, MessageSquare, X, Minus, Target, Calendar } from "lucide-react"
import Image from "next/image"
import Link from "next/link"
import { motion, useScroll, useTransform, Variants } from "framer-motion"
import { useRef, useEffect } from "react"
import { ThemeToggle } from "@/components/ThemeToggle"
export default function MarketingPage() {
const containerRef = useRef(null)
const { scrollYProgress } = useScroll({
target: containerRef,
offset: ["start start", "end start"]
})
// Slower background parallax
const yBg = useTransform(scrollYProgress, [0, 1], ["0%", "50%"])
// Stagger variants for the features
const containerVariants: Variants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.2
}
}
}
const itemVariants: Variants = {
hidden: { opacity: 0, y: 30 },
visible: {
opacity: 1,
y: 0,
transition: { type: "spring", stiffness: 100, damping: 12 }
}
}
return (
<div ref={containerRef} className="min-h-screen bg-background text-foreground overflow-x-hidden selection:bg-primary/20 relative">
<div className="min-h-screen bg-background text-foreground overflow-x-hidden selection:bg-primary/20 relative">
{/* Animated Deep Background */}
{/* Deep Background */}
<div className="fixed inset-0 z-0 pointer-events-none bg-grid opacity-30"></div>
<div className="fixed inset-0 z-0 pointer-events-none" style={{ background: 'radial-gradient(circle at 50% 0%, rgba(209, 255, 77, 0.05) 0%, transparent 50%)' }}></div>
<div className="fixed inset-0 z-0 pointer-events-none" style={{ background: 'radial-gradient(circle at 100% 50%, rgba(12, 96, 96, 0.03) 0%, transparent 40%)' }}></div>
{/* Floating Orbs (Using Framer Motion) */}
<motion.div
className="fixed top-1/4 left-1/4 size-[400px] rounded-full bg-primary/20 blur-[120px] pointer-events-none mix-blend-screen -z-10"
animate={{ x: [0, 50, -20, 0], y: [0, -30, 40, 0] }}
transition={{ duration: 15, repeat: Infinity, ease: "linear" }}
/>
<motion.div
className="fixed bottom-1/4 right-1/4 size-[500px] rounded-full bg-[var(--cyan-ai-10)] blur-[150px] pointer-events-none mix-blend-screen -z-10"
animate={{ x: [0, -60, 30, 0], y: [0, 40, -50, 0] }}
transition={{ duration: 20, repeat: Infinity, ease: "linear" }}
/>
{/* Ambient Glows */}
<div className="fixed top-1/4 left-1/4 size-[400px] rounded-full bg-primary/20 blur-[120px] pointer-events-none mix-blend-screen -z-10" />
<div className="fixed bottom-1/4 right-1/4 size-[500px] rounded-full bg-[var(--cyan-ai-10)] blur-[150px] pointer-events-none mix-blend-screen -z-10" />
{/* Navigation */}
<nav className="fixed top-0 w-full z-50 bg-background/50 backdrop-blur-xl border-b border-border/50">
@@ -93,56 +52,32 @@ export default function MarketingPage() {
<main className="relative z-10 pt-32 pb-24">
{/* Hero Section */}
<section className="px-6 max-w-7xl mx-auto text-center space-y-8 pt-12 pb-8">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
>
<div>
<Badge variant="outline" className="border-primary/50 text-primary bg-primary/10 px-4 py-1.5 rounded-full text-xs font-bold tracking-widest uppercase shadow-[0_0_15px_-5px_var(--color-primary)] mb-6">
The Next Evolution of Prep
</Badge>
</motion.div>
</div>
<motion.h1
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.8, type: "spring" }}
className="text-6xl md:text-8xl font-bold tracking-tighter max-w-5xl mx-auto leading-[1.1]"
>
<h1 className="text-6xl md:text-8xl font-bold tracking-tighter max-w-5xl mx-auto leading-[1.1]">
NEET/JEE Prep, <br className="hidden md:block" />
<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary via-[var(--cyan-ai)] to-primary animate-gradient pb-2 drop-shadow-[0_0_20px_rgba(209,255,77,0.3)]">Re-engineered by AI.</span>
</motion.h1>
</h1>
<motion.p
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.8, delay: 0.2 }}
className="text-xl md:text-2xl text-muted-foreground max-w-2xl mx-auto leading-relaxed font-medium"
>
<p className="text-xl md:text-2xl text-muted-foreground max-w-2xl mx-auto leading-relaxed font-medium">
Experience the most accurate CBT Exam Engine combined with adaptive DPPs generated specifically for your weak areas in real-time.
</motion.p>
</p>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.4 }}
className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-8"
>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-8">
<Link href="/login">
<Button size="lg" className="group rounded-full h-14 px-8 text-base font-bold shadow-[0_0_40px_-10px_var(--color-primary)] hover:shadow-[0_0_60px_-10px_var(--color-primary)] transition-all w-full sm:w-auto relative overflow-hidden">
<span className="relative z-10 flex items-center">Start Free Trial <ArrowRight className="ml-2 group-hover:translate-x-1 transition-transform" size={18} /></span>
<div className="absolute inset-0 -translate-x-full animate-shine bg-gradient-to-r from-transparent via-white/20 to-transparent z-0"></div>
</Button>
</Link>
</motion.div>
</div>
{/* Dashboard Preview Mockup */}
<motion.div
initial={{ opacity: 0, y: 40, scale: 0.95 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
transition={{ duration: 1, delay: 0.6, type: "spring" }}
className="relative max-w-5xl mx-auto mt-20 rounded-[2rem] border border-border/60 bg-secondary/5 backdrop-blur-xl shadow-[0_0_50px_-15px_rgba(12,96,96,0.15)] overflow-hidden"
>
<div className="relative max-w-5xl mx-auto mt-20 rounded-[2rem] border border-border/60 bg-secondary/5 backdrop-blur-xl shadow-[0_0_50px_-15px_rgba(12,96,96,0.15)] overflow-hidden">
{/* Top Window Chrome Bar */}
<div className="flex items-center justify-between px-6 py-4 border-b border-border/50 bg-background/50">
<div className="flex items-center gap-2">
@@ -303,7 +238,7 @@ export default function MarketingPage() {
</div>
</div>
</motion.div>
</div>
</section>
{/* Infinite Trust Bar (commented out)
@@ -334,25 +269,13 @@ export default function MarketingPage() {
{/* Animated DPP Engine Section */}
<section id="features" className="py-32 px-6 max-w-7xl mx-auto">
<motion.div
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 0.8 }}
className="text-center mb-20"
>
<div className="text-center mb-20">
<h2 className="text-4xl md:text-6xl font-bold tracking-tighter mb-6">Adaptive Engine</h2>
<p className="text-muted-foreground text-xl max-w-2xl mx-auto">Our AI analyzes every keystroke and hesitation to generate the exact problems you need to solve next.</p>
</motion.div>
</div>
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true, margin: "-50px" }}
className="grid grid-cols-1 md:grid-cols-3 gap-8"
>
<motion.div variants={itemVariants}>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<Card className="bg-secondary/10 backdrop-blur-xl border-border/50 hover:border-primary/50 transition-all duration-300 rounded-[2rem] h-full shadow-lg group">
<CardContent className="p-8 relative overflow-hidden">
<div className="absolute top-0 right-0 p-8 opacity-5 group-hover:opacity-10 transition-opacity transform group-hover:scale-110 group-hover:-rotate-12 duration-500">
@@ -367,9 +290,9 @@ export default function MarketingPage() {
</p>
</CardContent>
</Card>
</motion.div>
</div>
<motion.div variants={itemVariants}>
<div>
<Card className="bg-[var(--cyan-ai-10)] backdrop-blur-xl border-[var(--cyan-ai-20)] hover:border-[var(--cyan-ai-50)] transition-all duration-300 rounded-[2rem] h-full shadow-[0_0_30px_-15px_var(--cyan-ai)] group">
<CardContent className="p-8 relative overflow-hidden">
<div className="absolute top-0 right-0 p-8 opacity-5 group-hover:opacity-10 transition-opacity transform group-hover:scale-110 group-hover:rotate-12 duration-500">
@@ -384,9 +307,9 @@ export default function MarketingPage() {
</p>
</CardContent>
</Card>
</motion.div>
</div>
<motion.div variants={itemVariants}>
<div>
<Card className="bg-secondary/10 backdrop-blur-xl border-border/50 hover:border-primary/50 transition-all duration-300 rounded-[2rem] h-full shadow-lg group">
<CardContent className="p-8 relative overflow-hidden">
<div className="absolute top-0 right-0 p-8 opacity-5 group-hover:opacity-10 transition-opacity transform group-hover:scale-110 group-hover:-rotate-12 duration-500">
@@ -401,56 +324,22 @@ export default function MarketingPage() {
</p>
</CardContent>
</Card>
</motion.div>
</motion.div>
</div>
</div>
</section>
{/* Animated Pricing */}
{/* Pricing */}
<section id="pricing" className="py-24 px-6 max-w-7xl mx-auto relative">
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 size-[600px] bg-primary/5 blur-[120px] rounded-full pointer-events-none -z-10"></div>
<motion.div
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.8 }}
className="text-center mb-20"
>
<div className="text-center mb-20">
<h2 className="text-4xl md:text-6xl font-bold tracking-tighter mb-6">Simple, Transparent Pricing</h2>
<p className="text-muted-foreground text-xl max-w-2xl mx-auto">Unlock the ultimate unfair advantage for your NEET/JEE preparation.</p>
</motion.div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 max-w-4xl mx-auto items-stretch">
{/* Free Plan
<motion.div
initial={{ opacity: 0, x: -50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, type: "spring" }}
>
<Card className="bg-background/80 backdrop-blur-md border-border p-6 rounded-[2rem] flex flex-col hover:border-border/80 transition-colors h-full z-10 relative shadow-xl">
<h3 className="text-3xl font-bold mb-2">Free</h3>
<p className="text-muted-foreground mb-6 text-base">Perfect to get started.</p>
<div className="text-6xl font-bold tracking-tighter mb-6">₹0<span className="text-xl text-white/60 font-medium tracking-normal ml-1">/year</span></div>
<ul className="space-y-3 mb-6 flex-1 font-medium text-lg">
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-white" /> 1 Daily Practice Sheet</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-white" /> Basic Performance Analytics</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-white" /> Community Access</li>
</ul>
<Link href="/login">
<Button variant="outline" size="lg" className="w-full rounded-2xl h-12 border-white text-white font-bold text-lg hover:bg-secondary hover:text-white">Login</Button>
</Link>
</Card>
</motion.div>
*/}
{/* Pro Plan */}
<motion.div
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, type: "spring", delay: 0.1 }}
>
<div>
<Card className="bg-background/80 backdrop-blur-md border-border p-6 rounded-[2rem] flex flex-col hover:border-border/80 transition-colors h-full z-10 relative shadow-xl">
<h3 className="text-3xl font-bold mb-2 text-yellow-500">Pro</h3>
<p className="text-muted-foreground mb-6 text-base">Perfect for self-paced practice.</p>
@@ -465,31 +354,25 @@ export default function MarketingPage() {
<Button size="lg" className="w-full rounded-2xl h-12 bg-yellow-500 text-black font-bold text-lg hover:bg-yellow-400">Get Pro</Button>
</Link>
</Card>
</motion.div>
</div>
{/* AI Coach Plan */}
<motion.div
initial={{ opacity: 0, x: 50 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, type: "spring", delay: 0.2 }}
className="relative mt-8 lg:mt-0"
>
<Card className="bg-background/80 backdrop-blur-md border-border p-6 rounded-[2rem] flex flex-col hover:border-border/80 transition-colors h-full z-10 relative shadow-xl">
<h3 className="text-3xl font-bold mb-2 text-[var(--cyan-ai)]">AI Coach</h3>
<p className="text-muted-foreground mb-6 text-base">The complete AI-driven system.</p>
<div className="text-6xl font-bold tracking-tighter mb-6 text-[var(--cyan-ai)]">₹11,999<span className="text-xl text-[var(--cyan-ai-50)] font-medium tracking-normal ml-1">/year</span></div>
<ul className="space-y-3 mb-6 flex-1 font-medium text-lg">
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> Everything in Pro</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> AI Spaced Repetition (Mistakes)</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> 24/7 Streaming AI Tutor Chat</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> Predictive Rank & College Predictor</li>
</ul>
<Link href="/login">
<Button size="lg" className="w-full rounded-2xl h-12 font-bold text-lg bg-[var(--cyan-ai)] text-black hover:bg-[var(--cyan-ai-80)] transition-all">Get AI Coach</Button>
</Link>
</Card>
</motion.div>
<div className="relative mt-8 lg:mt-0">
<Card className="bg-background/80 backdrop-blur-md border-border p-6 rounded-[2rem] flex flex-col hover:border-border/80 transition-colors h-full z-10 relative shadow-xl">
<h3 className="text-3xl font-bold mb-2 text-[var(--cyan-ai)]">AI Coach</h3>
<p className="text-muted-foreground mb-6 text-base">The complete AI-driven system.</p>
<div className="text-6xl font-bold tracking-tighter mb-6 text-[var(--cyan-ai)]">₹11,999<span className="text-xl text-[var(--cyan-ai-50)] font-medium tracking-normal ml-1">/year</span></div>
<ul className="space-y-3 mb-6 flex-1 font-medium text-lg">
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> Everything in Pro</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> AI Spaced Repetition (Mistakes)</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> 24/7 Streaming AI Tutor Chat</li>
<li className="flex items-center gap-4"><CheckCircle2 size={24} className="text-[var(--cyan-ai)]" /> Predictive Rank & College Predictor</li>
</ul>
<Link href="/login">
<Button size="lg" className="w-full rounded-2xl h-12 font-bold text-lg bg-[var(--cyan-ai)] text-black hover:bg-[var(--cyan-ai-80)] transition-all">Get AI Coach</Button>
</Link>
</Card>
</div>
</div>
<p className="text-center mt-8 text-sm text-muted-foreground font-medium w-full">
* All above prices are inclusive of GST.

View File

@@ -87,7 +87,7 @@ export default function SignupPage() {
<ArrowLeft size={16} /> Back to Home
</Link>
<div className="w-full max-w-md space-y-8 animate-in fade-in slide-in-from-bottom-8 duration-700">
<div className="w-full max-w-md space-y-8">
<div className="flex justify-center mb-8">
<Logo href="/" className="w-72" imageClassName="object-contain" height={80} />
</div>
@@ -140,7 +140,7 @@ export default function SignupPage() {
<CardContent className="space-y-6 pt-4">
{step === 1 ? (
<div className="space-y-4 animate-in fade-in zoom-in-95">
<div className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<label className="text-sm font-bold text-foreground">First Name</label>
@@ -185,7 +185,7 @@ export default function SignupPage() {
{/* OTP verification section temporarily disabled
{showOTP && (
<div className="space-y-2 animate-in slide-in-from-top-2">
<div className="space-y-2">
<label className="text-sm font-bold text-foreground flex justify-between">
<span>Verification Code</span>
<span className="text-primary text-xs">Resend in 30s</span>
@@ -224,7 +224,7 @@ export default function SignupPage() {
</div>
</div>
) : (
<div className="space-y-4 animate-in fade-in slide-in-from-right-8">
<div className="space-y-4">
<div className="space-y-2">
<label className="text-sm font-bold text-foreground">Target Exam</label>
<select

View File

@@ -1,4 +1,4 @@
"use client"
"use client"
import { useState } from "react"
import { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from "@/components/ui/card"
@@ -21,7 +21,7 @@ export default function UpgradePage() {
}
return (
<div className="p-8 max-w-7xl mx-auto animate-in fade-in duration-500 min-h-screen">
<div className="p-8 max-w-7xl mx-auto min-h-screen">
<div className="text-center max-w-2xl mx-auto mb-16">
<h1 className="text-4xl font-extrabold tracking-tight mb-4">Upgrade Your Preparation</h1>
<p className="text-xl text-muted-foreground">Unlock the full power of PragatiVeer to master JEE & NEET.</p>

View File

@@ -64,8 +64,8 @@ export function Calculator({ isOpen, onClose }: CalculatorProps) {
const handleBackspace = () => setDisplay((prev) => prev.slice(0, -1));
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm animate-in fade-in duration-200">
<div className="bg-background border border-border shadow-2xl rounded-2xl w-[400px] overflow-hidden animate-in zoom-in-95 duration-200">
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm">
<div className="bg-background border border-border shadow-2xl rounded-2xl w-[400px] overflow-hidden">
<div className="p-4 border-b border-border flex justify-between items-center bg-secondary/50">
<h3 className="font-bold">Scientific Calculator</h3>
<button onClick={onClose} className="text-muted-foreground hover:text-foreground">

View File

@@ -49,7 +49,7 @@ export function ExamResult({ payload, attemptId, examType, onRetake }: ExamResul
};
return (
<div className="min-h-screen bg-background flex flex-col items-center py-12 px-4 sm:px-6 animate-in fade-in zoom-in duration-500">
<div className="min-h-screen bg-background flex flex-col items-center py-12 px-4 sm:px-6">
<div className="max-w-4xl w-full space-y-8">
<div className="text-center space-y-4">

View File

@@ -13,8 +13,8 @@ export function PeriodicTable({ isOpen, onClose }: PeriodicTableProps) {
if (!isOpen) return null;
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-md animate-in fade-in duration-300">
<div className="bg-background border border-border shadow-2xl rounded-2xl overflow-hidden animate-in zoom-in-95 duration-300 flex flex-col w-[95vw] max-w-[1400px] h-[95vh]">
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-md">
<div className="bg-background border border-border shadow-2xl rounded-2xl overflow-hidden flex flex-col w-[95vw] max-w-[1400px] h-[95vh]">
<div className="p-4 border-b border-border flex justify-between items-center bg-secondary/80">
<h3 className="font-bold text-lg">Periodic Table of Elements</h3>
<div className="flex gap-2">

View File

@@ -123,8 +123,8 @@ export function Scratchpad({ isOpen, onClose }: ScratchpadProps) {
};
return (
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-200 p-8">
<div className="bg-background border border-border shadow-2xl rounded-2xl overflow-hidden animate-in zoom-in-95 duration-200 flex flex-col w-full max-w-6xl h-full max-h-[800px]">
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-8">
<div className="bg-background border border-border shadow-2xl rounded-2xl overflow-hidden flex flex-col w-full max-w-6xl h-full max-h-[800px]">
<div className="p-4 border-b border-border flex justify-between items-center bg-secondary/50">
<h3 className="font-bold flex items-center gap-2"><Pen size={18}/> Split Workspace: Draw & Type</h3>
<div className="flex items-center gap-4">

View File

@@ -181,7 +181,7 @@ export function CalendarFilter({
<div
className={`absolute ${
align === "right" ? "right-0" : "left-0"
} top-full mt-2 w-72 sm:w-80 p-4 bg-card border border-border/80 rounded-2xl shadow-2xl shadow-black/30 z-50 animate-in fade-in zoom-in-95 origin-top duration-200 backdrop-blur-xl`}
} top-full mt-2 w-72 sm:w-80 p-4 bg-card border border-border/80 rounded-2xl shadow-2xl shadow-black/30 z-50 origin-top backdrop-blur-xl`}
>
{/* Quick presets */}
<div className="flex items-center gap-1 mb-3.5 pb-3 border-b border-border/60 overflow-x-auto custom-scrollbar">

View File

@@ -129,12 +129,12 @@ export function StreakOnboardingModal() {
return (
<div
className="fixed inset-0 z-50 flex items-center justify-center bg-black/75 backdrop-blur-md animate-in fade-in duration-300"
className="fixed inset-0 z-50 flex items-center justify-center bg-black/75 backdrop-blur-md"
onClick={handleDismiss}
>
{/* Centered Modal Card */}
<div
className="bg-background border border-border shadow-[0_0_60px_-10px_rgba(12,96,96,0.25)] rounded-3xl w-[90vw] max-w-5xl h-[85vh] max-h-[800px] relative overflow-hidden animate-in zoom-in-95 slide-in-from-bottom-4 duration-300 z-20 pointer-events-auto mx-4 flex flex-col justify-start"
className="bg-background border border-border shadow-[0_0_60px_-10px_rgba(12,96,96,0.25)] rounded-3xl w-[90vw] max-w-5xl h-[85vh] max-h-[800px] relative overflow-hidden z-20 pointer-events-auto mx-4 flex flex-col justify-start"
onClick={(e) => e.stopPropagation()}
>
{/* Close button */}

View File

@@ -1,16 +1,11 @@
"use client";
import { Wrench } from "lucide-react";
import { motion } from "framer-motion";
export default function MaintenanceScreen() {
return (
<div className="min-h-screen bg-background flex flex-col items-center justify-center p-4">
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
className="max-w-md w-full bg-secondary/20 border border-border rounded-2xl p-8 text-center space-y-6"
>
<div className="max-w-md w-full bg-secondary/20 border border-border rounded-2xl p-8 text-center space-y-6">
<div className="mx-auto w-16 h-16 bg-yellow-500/10 text-yellow-500 rounded-full flex items-center justify-center mb-6">
<Wrench size={32} />
</div>
@@ -26,7 +21,7 @@ export default function MaintenanceScreen() {
We'll be back shortly. Thank you for your patience!
</p>
</div>
</motion.div>
</div>
</div>
);
}

View File

@@ -1,7 +1,6 @@
"use client"
import { Flame } from "lucide-react"
import { motion } from "framer-motion"
interface StreakCounterProps {
streak: number
@@ -9,15 +8,11 @@ interface StreakCounterProps {
export function StreakCounter({ streak }: StreakCounterProps) {
return (
<motion.div
initial={{ scale: 0.5, opacity: 0, y: -10 }}
animate={{ scale: 1, opacity: 1, y: 0 }}
whileHover={{ scale: 1.1, rotate: 5 }}
transition={{ type: "spring", stiffness: 300, damping: 15 }}
className="flex items-center gap-1.5 px-3 py-1.5 rounded-xl bg-orange-500/10 border border-orange-500/20 text-orange-500 font-bold shadow-[0_0_10px_-2px_rgba(249,115,22,0.5)] cursor-default"
<div
className="flex items-center gap-1.5 px-3 py-1.5 rounded-xl bg-orange-500/10 border border-orange-500/20 text-orange-500 font-bold shadow-[0_0_10px_-2px_rgba(249,115,22,0.5)] cursor-default hover:scale-105 transition-transform"
>
<Flame size={18} className="animate-pulse" />
<span>{streak}</span>
</motion.div>
</div>
)
}

View File

@@ -6,7 +6,7 @@ const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElemen
<div
ref={ref}
className={cn(
"rounded-2xl border border-border bg-background text-foreground transition-all duration-300",
"rounded-2xl border border-border bg-background text-foreground",
className
)}
{...props}