From f872e1ad39b1c9df4cdf78e10d076c05b1594ea3 Mon Sep 17 00:00:00 2001 From: Megh Patel Date: Wed, 18 Mar 2026 15:31:46 -0500 Subject: [PATCH] added dark mode toggle --- .vite/deps/_metadata.json | 8 +++ .vite/deps/package.json | 3 + src/App.tsx | 16 +++++- src/components/Layout/Header.tsx | 98 ++++++++++++++++++-------------- 4 files changed, 80 insertions(+), 45 deletions(-) create mode 100644 .vite/deps/_metadata.json create mode 100644 .vite/deps/package.json diff --git a/.vite/deps/_metadata.json b/.vite/deps/_metadata.json new file mode 100644 index 0000000..1ebd983 --- /dev/null +++ b/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "910503ef", + "configHash": "c33e0ead", + "lockfileHash": "a58dca3f", + "browserHash": "e63ad675", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/.vite/deps/package.json b/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/src/App.tsx b/src/App.tsx index 0307d5e..caa527d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,22 @@ import { MantineProvider } from "@mantine/core"; +import { useLocalStorage } from "@mantine/hooks"; import { Notifications } from "@mantine/notifications"; import { Router } from "./Router"; +export function useColorScheme() { + return useLocalStorage<'light' | 'dark'>({ + key: 'rsvp-color-scheme', + defaultValue: 'light', + }); +} + export default function App() { + const [colorScheme] = useColorScheme(); + return ( - + - + ); -} \ No newline at end of file +} diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index 128eb8d..e2a113a 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -1,17 +1,18 @@ -import { - Group, - Burger, - Title, - Menu, - Button, - Avatar, - Text, - rem +import { + Group, + Burger, + Menu, + Button, + Avatar, + Text, + ActionIcon, + rem, } from "@mantine/core"; -import { IconChevronDown, IconLogout, IconUser } from "@tabler/icons-react"; +import { IconChevronDown, IconLogout, IconUser, IconSun, IconMoon } from "@tabler/icons-react"; import { useAuth } from "../AuthContext"; import { useNavigate } from "react-router-dom"; import LogoBadge from "../Logo"; +import { useColorScheme } from "../../App"; interface HeaderProps { opened: boolean; @@ -21,10 +22,11 @@ interface HeaderProps { export function Header({ opened, toggle }: HeaderProps) { const { user, logout } = useAuth(); const navigate = useNavigate(); + const [colorScheme, setColorScheme] = useColorScheme(); - const formattedName = user?.name - ? user.name.split(',').map(part => part.trim()).reverse().join(' ') - : ''; + const formattedName = user?.name + ? user.name.split(',').map(part => part.trim()).reverse().join(' ') + : ''; return ( @@ -33,35 +35,47 @@ export function Header({ opened, toggle }: HeaderProps) { - - - - + + setColorScheme(s => s === 'dark' ? 'light' : 'dark')} + aria-label="Toggle color scheme" + > + {colorScheme === 'dark' ? : } + - - My Account - } - onClick={() => navigate("/profile", { replace: true })} - > - Profile - - - } - onClick={() => logout()} - > - Logout - - - + + + + + + + My Account + } + onClick={() => navigate("/profile", { replace: true })} + > + Profile + + + } + onClick={() => logout()} + > + Logout + + + + ); -} \ No newline at end of file +}