design: cyan -> rgb(12,96,96) in light theme, #00F0FF stays in dark theme
- globals.css: add --cyan-ai CSS variable (rgb(12,96,96) light / #00F0FF dark) + opacity variants --cyan-ai-10/20/30/40/50/80 - Bulk replace all #00F0FF hardcoded Tailwind arbitrary values with var(--cyan-ai) / var(--cyan-ai-10) / etc across 55+ TSX/TS files - Shadow glow colours also updated (suppressed by box-shadow:none in light mode) - TypeScript: 0 errors
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
"use client"
|
||||
"use client"
|
||||
|
||||
import { ReactNode, useState, useEffect, useRef } from "react"
|
||||
import { BookOpen, LayoutDashboard, Settings, FileText, Activity, LineChart, Trophy, User, ChevronUp, Lock, ShieldAlert, Flame, Target, Gauge, Zap, Calendar, Clock, BrainCircuit, BarChart3, School, CheckSquare } from "lucide-react"
|
||||
@@ -67,7 +67,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
<div className="h-screen w-screen flex flex-col items-center justify-center bg-background">
|
||||
<div className="animate-pulse flex flex-col items-center gap-4">
|
||||
<Logo height={56} className="mb-4" />
|
||||
<div className="h-6 w-6 border-4 border-[#00F0FF] border-t-transparent rounded-full animate-spin"></div>
|
||||
<div className="h-6 w-6 border-4 border-[var(--cyan-ai)] border-t-transparent rounded-full animate-spin"></div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
@@ -79,7 +79,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
{switching && (
|
||||
<div className="fixed top-0 left-0 right-0 z-[9999] h-0.5 overflow-hidden">
|
||||
<div
|
||||
className="h-full bg-[#00F0FF] animate-[slideProgress_0.8s_ease-in-out_infinite]"
|
||||
className="h-full bg-[var(--cyan-ai)] animate-[slideProgress_0.8s_ease-in-out_infinite]"
|
||||
style={{ width: '60%', animation: 'slideProgress 0.9s ease-in-out infinite' }}
|
||||
/>
|
||||
<style>{`
|
||||
@@ -94,7 +94,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
{/* Sidebar */}
|
||||
<aside className="w-64 border-r border-border/60 bg-background/95 backdrop-blur-xl flex flex-col hidden md:flex relative">
|
||||
{/* Subtle gradient overlay */}
|
||||
<div className="absolute inset-0 bg-gradient-to-b from-[#00F0FF]/[0.02] via-transparent to-purple-500/[0.02] pointer-events-none" />
|
||||
<div className="absolute inset-0 bg-gradient-to-b from-[var(--cyan-ai)]/[0.02] via-transparent to-purple-500/[0.02] pointer-events-none" />
|
||||
|
||||
{/* Logo */}
|
||||
<div className="px-5 py-4 border-b border-border/40">
|
||||
@@ -163,7 +163,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="h-px flex-1 bg-gradient-to-r from-transparent via-cyan-500/50 to-transparent" />
|
||||
<span className="text-[10px] font-black uppercase tracking-[0.15em] text-cyan-600 dark:text-cyan-400 flex items-center gap-1.5 shrink-0">
|
||||
<span className="w-1 h-1 rounded-full bg-cyan-500 shadow-[0_0_6px_#00F0FF] dark:shadow-[0_0_8px_#00F0FF]"></span>
|
||||
<span className="w-1 h-1 rounded-full bg-cyan-500 shadow-[0_0_6px_var(--cyan-ai)] dark:shadow-[0_0_8px_var(--cyan-ai)]"></span>
|
||||
AI Coach
|
||||
</span>
|
||||
<div className="h-px flex-1 bg-gradient-to-l from-transparent via-cyan-500/50 to-transparent" />
|
||||
@@ -258,7 +258,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
href="/dashboard/settings"
|
||||
className={`flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all duration-200 border ${
|
||||
pathname.startsWith("/dashboard/settings")
|
||||
? "bg-[#00F0FF]/10 text-foreground font-semibold border-[#00F0FF]/20"
|
||||
? "bg-[var(--cyan-ai-10)] text-foreground font-semibold border-[var(--cyan-ai-20)]"
|
||||
: "text-muted-foreground hover:bg-secondary/60 hover:text-foreground border-transparent"
|
||||
}`}
|
||||
>
|
||||
@@ -311,7 +311,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
className="w-full flex items-center justify-between p-2.5 rounded-xl bg-secondary/40 hover:bg-secondary/70 transition-all duration-200 border border-border/50 hover:border-border group"
|
||||
>
|
||||
<div className="flex items-center gap-3 text-left">
|
||||
<div className="h-8 w-8 rounded-full bg-cyan-500/20 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-400 flex items-center justify-center font-bold text-sm shrink-0 border border-cyan-500/20 dark:shadow-[0_0_10px_-2px_#00F0FF]">
|
||||
<div className="h-8 w-8 rounded-full bg-cyan-500/20 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-400 flex items-center justify-center font-bold text-sm shrink-0 border border-cyan-500/20 dark:shadow-[0_0_10px_-2px_var(--cyan-ai)]">
|
||||
{userInitials}
|
||||
</div>
|
||||
<div className="flex-1 min-w-0">
|
||||
@@ -342,7 +342,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
{user ? `Welcome back, ${cleanDisplayName(user.name).split(" ")[0]}!` : "Welcome back!"}
|
||||
</h2>
|
||||
{user && (
|
||||
<Badge variant="outline" className="bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 border-cyan-500/20 font-bold tracking-wide uppercase px-2.5 py-0.5 animate-pulse shadow-none dark:shadow-[0_0_10px_-2px_#00F0FF]">
|
||||
<Badge variant="outline" className="bg-cyan-500/10 text-cyan-700 dark:text-cyan-400 border-cyan-500/20 font-bold tracking-wide uppercase px-2.5 py-0.5 animate-pulse shadow-none dark:shadow-[0_0_10px_-2px_var(--cyan-ai)]">
|
||||
{targetExamLabel} Target
|
||||
</Badge>
|
||||
)}
|
||||
@@ -367,7 +367,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
{isDemoUser(userId) && (
|
||||
<div className="flex items-center gap-2">
|
||||
{switching && (
|
||||
<span className="text-xs text-[#00F0FF] font-bold animate-pulse hidden lg:inline">Switching…</span>
|
||||
<span className="text-xs text-[var(--cyan-ai)] font-bold animate-pulse hidden lg:inline">Switching…</span>
|
||||
)}
|
||||
{!switching && (
|
||||
<span className="text-xs text-muted-foreground font-bold hidden lg:inline">Demo:</span>
|
||||
@@ -376,7 +376,7 @@ export default function DashboardLayout({ children }: { children: ReactNode }) {
|
||||
value={userId}
|
||||
disabled={switching}
|
||||
onChange={(e) => switchUser(e.target.value)}
|
||||
className="bg-secondary border border-border text-foreground px-2.5 py-1.5 rounded-xl text-xs font-bold focus:ring-2 focus:ring-[#00F0FF] outline-none cursor-pointer hover:bg-secondary/80 transition-colors disabled:opacity-50 disabled:cursor-wait"
|
||||
className="bg-secondary border border-border text-foreground px-2.5 py-1.5 rounded-xl text-xs font-bold focus:ring-2 focus:ring-[var(--cyan-ai)] outline-none cursor-pointer hover:bg-secondary/80 transition-colors disabled:opacity-50 disabled:cursor-wait"
|
||||
>
|
||||
<option value={DEMO_USERS.NEHA.id}>Neha Verma (AI Coach)</option>
|
||||
<option value={DEMO_USERS.AI_COACH.id}>Rahul (AI Coach)</option>
|
||||
@@ -412,30 +412,30 @@ function NavItem({ href, icon, label, active, isLocked, section }: { href: strin
|
||||
// Section-aware active color tokens (light mode only, dark mode falls back to cyan)
|
||||
const activeClasses = active
|
||||
? section === "pro"
|
||||
? "bg-yellow-50 light:bg-yellow-50 text-yellow-700 dark:bg-[#00F0FF]/10 dark:text-[#00F0FF] font-semibold border border-yellow-300/60 dark:border-[#00F0FF]/20 shadow-[0_0_12px_-4px_rgba(234,179,8,0.2)] dark:shadow-[0_0_12px_-4px_rgba(0,240,255,0.3)]"
|
||||
? "bg-yellow-50 light:bg-yellow-50 text-yellow-700 dark:bg-[var(--cyan-ai-10)] dark:text-[var(--cyan-ai)] font-semibold border border-yellow-300/60 dark:border-[var(--cyan-ai-20)] shadow-[0_0_12px_-4px_rgba(234,179,8,0.2)] dark:shadow-[0_0_12px_-4px_rgba(12,96,96,0.3)]"
|
||||
: section === "ai"
|
||||
? "bg-cyan-50 dark:bg-[#00F0FF]/10 text-cyan-800 dark:text-[#00F0FF] font-semibold border border-cyan-300/60 dark:border-[#00F0FF]/20 shadow-[0_0_12px_-4px_rgba(6,182,212,0.2)] dark:shadow-[0_0_12px_-4px_rgba(0,240,255,0.3)]"
|
||||
: "bg-[#00F0FF]/10 text-[#00F0FF] font-semibold border border-[#00F0FF]/20 shadow-[0_0_12px_-4px_rgba(0,240,255,0.3)]"
|
||||
? "bg-cyan-50 dark:bg-[var(--cyan-ai-10)] text-cyan-800 dark:text-[var(--cyan-ai)] font-semibold border border-cyan-300/60 dark:border-[var(--cyan-ai-20)] shadow-[0_0_12px_-4px_rgba(6,182,212,0.2)] dark:shadow-[0_0_12px_-4px_rgba(12,96,96,0.3)]"
|
||||
: "bg-[var(--cyan-ai-10)] text-[var(--cyan-ai)] font-semibold border border-[var(--cyan-ai-20)] shadow-[0_0_12px_-4px_rgba(12,96,96,0.3)]"
|
||||
: isLocked
|
||||
? "text-muted-foreground/40 cursor-not-allowed border border-transparent"
|
||||
: "text-muted-foreground/80 hover:bg-secondary/60 hover:text-foreground border border-transparent hover:border-border/40"
|
||||
|
||||
const iconActiveClass = active
|
||||
? section === "pro"
|
||||
? "text-yellow-600 dark:text-[#00F0FF]"
|
||||
? "text-yellow-600 dark:text-[var(--cyan-ai)]"
|
||||
: section === "ai"
|
||||
? "text-cyan-700 dark:text-[#00F0FF]"
|
||||
: "text-[#00F0FF]"
|
||||
? "text-cyan-700 dark:text-[var(--cyan-ai)]"
|
||||
: "text-[var(--cyan-ai)]"
|
||||
: isLocked
|
||||
? "text-muted-foreground/30"
|
||||
: "text-muted-foreground/60 group-hover:text-foreground/80"
|
||||
|
||||
const activeBarClass = active
|
||||
? section === "pro"
|
||||
? "w-1 h-4 rounded-full bg-yellow-500 dark:bg-[#00F0FF] shrink-0 shadow-[0_0_6px_rgba(234,179,8,0.6)] dark:shadow-[0_0_6px_rgba(0,240,255,0.8)]"
|
||||
? "w-1 h-4 rounded-full bg-yellow-500 dark:bg-[var(--cyan-ai)] shrink-0 shadow-[0_0_6px_rgba(234,179,8,0.6)] dark:shadow-[0_0_6px_rgba(12,96,96,0.8)]"
|
||||
: section === "ai"
|
||||
? "w-1 h-4 rounded-full bg-cyan-600 dark:bg-[#00F0FF] shrink-0 shadow-[0_0_6px_rgba(6,182,212,0.6)] dark:shadow-[0_0_6px_rgba(0,240,255,0.8)]"
|
||||
: "w-1 h-4 rounded-full bg-[#00F0FF] shrink-0 shadow-[0_0_6px_rgba(0,240,255,0.8)]"
|
||||
? "w-1 h-4 rounded-full bg-cyan-600 dark:bg-[var(--cyan-ai)] shrink-0 shadow-[0_0_6px_rgba(6,182,212,0.6)] dark:shadow-[0_0_6px_rgba(12,96,96,0.8)]"
|
||||
: "w-1 h-4 rounded-full bg-[var(--cyan-ai)] shrink-0 shadow-[0_0_6px_rgba(12,96,96,0.8)]"
|
||||
: ""
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user