From da131d0f2fa1f6c6378ebbc6e98fb344d80d481c Mon Sep 17 00:00:00 2001 From: Monu123a Date: Mon, 1 Dec 2025 23:43:18 +0530 Subject: [PATCH 1/2] feat: Theme Switcher & UI Improvements (Fixes #24, #26) --- Frontend/src/App.jsx | 15 +++--- Frontend/src/components/Layout.jsx | 70 ++++++++++++++++---------- Frontend/src/components/ui/index.jsx | 28 +++++------ Frontend/src/index.css | 14 +++--- Frontend/src/pages/Settings.jsx | 75 ++++++++++++++-------------- Frontend/src/store/useStore.js | 9 +++- 6 files changed, 118 insertions(+), 93 deletions(-) diff --git a/Frontend/src/App.jsx b/Frontend/src/App.jsx index 0706fb2..4e17baa 100644 --- a/Frontend/src/App.jsx +++ b/Frontend/src/App.jsx @@ -19,20 +19,21 @@ function ProtectedRoute({ children }) { } function App() { - const { theme } = useStore(); + const { theme, setTheme } = useStore(); useEffect(() => { const root = window.document.documentElement; root.classList.remove('light', 'dark'); - if (theme === 'system' || theme === 'auto') { - const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; - root.classList.add(systemTheme); - return; + let effectiveTheme = theme; + if (theme !== 'light' && theme !== 'dark') { + effectiveTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + // Normalise the stored theme so future toggles are predictable + setTheme(effectiveTheme); } - root.classList.add(theme); - }, [theme]); + root.classList.add(effectiveTheme); + }, [theme, setTheme]); return ( diff --git a/Frontend/src/components/Layout.jsx b/Frontend/src/components/Layout.jsx index 59cd031..4d237a2 100644 --- a/Frontend/src/components/Layout.jsx +++ b/Frontend/src/components/Layout.jsx @@ -10,11 +10,13 @@ import { Menu, X, Bell, - ChevronDown + ChevronDown, + Sun, + Moon } from 'lucide-react'; export default function Layout({ children }) { - const { user, logout, notifications, unreadCount } = useStore(); + const { user, logout, notifications, unreadCount, theme, setTheme } = useStore(); const navigate = useNavigate(); const location = useLocation(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); @@ -25,6 +27,11 @@ export default function Layout({ children }) { navigate('/login'); }; + const toggleTheme = () => { + // Simple, predictable toggle between light and dark + setTheme(theme === 'dark' ? 'light' : 'dark'); + }; + const navItems = [ { icon: LayoutDashboard, label: 'Dashboard', path: '/' }, { icon: Users, label: 'My Groups', path: '/groups' }, @@ -33,15 +40,15 @@ export default function Layout({ children }) { ]; return ( -
+
{/* Sidebar (Desktop) */} -