diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e5db527..678bcfd 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -14,6 +14,7 @@ import { ParentalGate } from './features/auth/ParentalGate'; import { ProfileSelectionPage } from './features/auth/ProfileSelectionPage'; import { ParentHubPage } from './pages/ParentHubPage'; import { HistoryPage } from './features/quiz/HistoryPage'; +import { useThemeEffect } from './stores/useTheme'; function ProtectedRoute({ children }: { children: React.ReactNode }) { @@ -74,6 +75,8 @@ function ParentalProtectedRoute({ children }: { children: React.ReactNode }) { } function App() { + useThemeEffect(); + return ( diff --git a/frontend/src/components/ThemeToggle.tsx b/frontend/src/components/ThemeToggle.tsx new file mode 100644 index 0000000..a1174a5 --- /dev/null +++ b/frontend/src/components/ThemeToggle.tsx @@ -0,0 +1,21 @@ +import { useTheme } from '../stores/useTheme'; +import { Sun, Moon } from 'lucide-react'; + +export function ThemeToggle() { + const { isDark, toggleTheme } = useTheme(); + + return ( + + ); +} diff --git a/frontend/src/index.css b/frontend/src/index.css index 6c2d1e3..03e6957 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -11,16 +11,32 @@ text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + + /* Theme Tokens */ + --bg-primary: #FDFCF8; + --bg-secondary: #F8FAFC; + --bg-card: #FFFFFF; + --text-primary: #1E293B; + --text-secondary: #64748B; + --border-color: #E2E8F0; +} + +.dark { + --bg-primary: #0F172A; /* slate-900 */ + --bg-secondary: #020617; /* slate-950 */ + --bg-card: #1E293B; /* slate-800 */ + --text-primary: #F1F5F9; /* slate-100 */ + --text-secondary: #94A3B8; /* slate-400 */ + --border-color: #334155; /* slate-700 */ } body { margin: 0; min-width: 320px; min-height: 100vh; - background-color: #FDFCF8; - /* cream */ - color: #1E293B; - /* slate-800 */ + background-color: var(--bg-primary); + color: var(--text-primary); + transition: background-color 0.3s ease, color 0.3s ease; } @font-face { diff --git a/frontend/src/pages/DashboardPage.tsx b/frontend/src/pages/DashboardPage.tsx index 59249f5..43f42eb 100644 --- a/frontend/src/pages/DashboardPage.tsx +++ b/frontend/src/pages/DashboardPage.tsx @@ -9,6 +9,7 @@ import { RecentRevisionsWidget } from '../features/dashboard/RecentRevisionsWidg import { LogOut, Flame } from 'lucide-react'; import { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; +import { ThemeToggle } from '../components/ThemeToggle'; // --- Avatar Configuration (Original Fun-Emoji Style) --- const AVATAR_SEEDS = [ @@ -347,7 +348,7 @@ export default function DashboardPage() { const currentAvatarUrl = activeLearner?.avatar_url; return ( -
+
setIsAvatarPickerOpen(false)} /> {/* Navigation */} -