From a9342e5efe96afa610d7651742ba9890017d0090 Mon Sep 17 00:00:00 2001 From: lzt404 <2596933790@qq.com> Date: Wed, 29 Jul 2026 01:53:22 +0800 Subject: [PATCH] feat(ui): add persistent light and dark theme support --- src/App.tsx | 24 + src/i18n/ja.ts | 33 + src/i18n/resources.ts | 8 + src/main.tsx | 3 + src/styles.css | 1647 ++++++++++++++++++++++++----------------- src/theme.ts | 31 + 6 files changed, 1070 insertions(+), 676 deletions(-) create mode 100644 src/theme.ts diff --git a/src/App.tsx b/src/App.tsx index 2a1fdca..0faafe9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -14,10 +14,12 @@ import { Languages, LogIn, MessageCircle, + Moon, Network, PackageOpen, ServerCog, Settings, + Sun, X, } from 'lucide-react'; import appLogo from './assets/logo.jpg'; @@ -35,6 +37,7 @@ import { languageOptions, useI18n } from './i18n'; import { AppUpdateDialog, AppUpdateProvider, useAppUpdate } from './appUpdate'; import { appUpdateIndicatorState } from './appUpdateModel'; import { canOpenAppPage, isAlwaysAvailablePage } from './navigation'; +import { detectInitialTheme, saveTheme, type AppTheme } from './theme'; const CONTACT_URL = 'https://qm.qq.com/q/3queDaIG'; @@ -132,6 +135,7 @@ function AppContent() { const { info: appUpdateInfo, hasUpdate, processing: appUpdateProcessing } = useAppUpdate(); const [active, setActive] = useState('home'); const [languageMenuOpen, setLanguageMenuOpen] = useState(false); + const [theme, setTheme] = useState(detectInitialTheme); const [windowsClosePrompt, setWindowsClosePrompt] = useState(null); const closeDialogRef = useRef(null); const languageMenuRef = useRef(null); @@ -143,6 +147,10 @@ function AppContent() { const selectedLanguage = languageOptions.find((option) => option.value === locale) ?? languageOptions[0]; + useEffect(() => { + saveTheme(theme); + }, [theme]); + useEffect(() => { if (!canOpenAppPage(active, coreRunning)) { setActive('home'); @@ -300,6 +308,22 @@ function AppContent() {
+