From 43dfce5233d634fbedd55131cdb1541b844ffefe Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 21 Jul 2026 22:18:59 +0200 Subject: [PATCH] feat(ui): implement dark mode with theme toggle - Add global theme state in App.tsx with localStorage persistence - Implement dark mode CSS variables in index.css - Add theme toggle button in sidebar navigation - Update Dashboard with dark mode support for stats cards and badges - Update Settings page with dark mode for main layout and toggles This implements the core dark mode functionality with separation of concerns - theme state is managed globally in App.tsx and passed down to child components as props. --- docker/ui/src/App.tsx | 42 ++++++++-- docker/ui/src/index.css | 36 ++++++++ docker/ui/src/pages/Dashboard.tsx | 135 ++++++++++++++++++++++-------- docker/ui/src/pages/Settings.tsx | 51 ++++++----- 4 files changed, 200 insertions(+), 64 deletions(-) diff --git a/docker/ui/src/App.tsx b/docker/ui/src/App.tsx index 66302ef..643c06a 100644 --- a/docker/ui/src/App.tsx +++ b/docker/ui/src/App.tsx @@ -1,5 +1,5 @@ -import { useState } from 'react' -import { LayoutDashboard, Disc, Settings, LogOut } from 'lucide-react' +import { useState, useEffect } from 'react' +import { LayoutDashboard, Disc, Settings, LogOut, Sun, Moon } from 'lucide-react' import Dashboard from './pages/Dashboard' import MetadataPreview from './pages/MetadataPreview' import SettingsPage from './pages/Settings' @@ -8,6 +8,26 @@ type Page = 'dashboard' | 'metadata' | 'settings' function App() { const [page, setPage] = useState('dashboard') + const [darkMode, setDarkMode] = useState(false) + + useEffect(() => { + const savedTheme = localStorage.getItem('theme') + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches + + if (savedTheme === 'dark' || (!savedTheme && prefersDark)) { + setDarkMode(true) + document.documentElement.setAttribute('data-theme', 'dark') + } else { + document.documentElement.setAttribute('data-theme', 'light') + } + }, []) + + const toggleTheme = () => { + const newTheme = darkMode ? 'light' : 'dark' + setDarkMode(!darkMode) + localStorage.setItem('theme', newTheme) + document.documentElement.setAttribute('data-theme', newTheme) + } const navItems = [ { id: 'dashboard', label: 'Dashboard', icon: LayoutDashboard }, @@ -19,7 +39,7 @@ function App() {
{/* Sidebar */} -