From af260e47488ee1cf0a738913ee2f3743c3a8f5be Mon Sep 17 00:00:00 2001 From: Felipe Cardoso Date: Sun, 2 Nov 2025 06:53:46 +0100 Subject: [PATCH] Add theme toggle with light, dark, and system support - **Header:** Integrate `ThemeToggle` component into the user menu area. - **Theme Provider:** Introduce `ThemeProvider` context for managing and persisting theme preferences. - **New Components:** Add `ThemeToggle` for switching themes and `ThemeProvider` to handle state and system preferences. - Ensure responsive updates and localStorage persistence for user-selected themes. --- frontend/src/components/layout/Header.tsx | 6 +- .../src/components/theme/ThemeProvider.tsx | 83 +++++++++++++++++++ frontend/src/components/theme/ThemeToggle.tsx | 51 ++++++++++++ frontend/src/components/theme/index.ts | 6 ++ 4 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/theme/ThemeProvider.tsx create mode 100644 frontend/src/components/theme/ThemeToggle.tsx create mode 100644 frontend/src/components/theme/index.ts diff --git a/frontend/src/components/layout/Header.tsx b/frontend/src/components/layout/Header.tsx index fd2537b..91a0941 100644 --- a/frontend/src/components/layout/Header.tsx +++ b/frontend/src/components/layout/Header.tsx @@ -22,6 +22,7 @@ import { Button } from '@/components/ui/button'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { Settings, LogOut, User, Shield } from 'lucide-react'; import { cn } from '@/lib/utils'; +import { ThemeToggle } from '@/components/theme'; /** * Get user initials for avatar @@ -97,8 +98,9 @@ export function Header() { - {/* Right side - User menu */} -
+ {/* Right side - Theme toggle and user menu */} +
+ + + + setTheme('light')}> + + Light + {theme === 'light' && } + + setTheme('dark')}> + + Dark + {theme === 'dark' && } + + setTheme('system')}> + + System + {theme === 'system' && } + + + + ); +} diff --git a/frontend/src/components/theme/index.ts b/frontend/src/components/theme/index.ts new file mode 100644 index 0000000..b8f4b2c --- /dev/null +++ b/frontend/src/components/theme/index.ts @@ -0,0 +1,6 @@ +/** + * Theme components + */ + +export { ThemeProvider, useTheme } from './ThemeProvider'; +export { ThemeToggle } from './ThemeToggle';