@@ -71,9 +71,9 @@ const App = () => {
7171 // Track if we are waiting for an agent response
7272 const [ isWaitingForResponse , setIsWaitingForResponse ] = useState ( false ) ;
7373
74- const [ theme , setTheme ] = useState < "light" | "dark" > ( ( ) => {
74+ const [ theme , setTheme ] = useState < "light" | "dark" | "auto" > ( ( ) => {
7575 if ( typeof window !== "undefined" && window . matchMedia ) {
76- return window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ? "dark" : "light ";
76+ return "auto ";
7777 }
7878 return "light" ;
7979 } ) ;
@@ -138,8 +138,28 @@ const App = () => {
138138 } ) ) ;
139139 } ;
140140
141+ // 应用主题到 DOM
141142 useEffect ( ( ) => {
142- document . documentElement . setAttribute ( "data-theme" , theme ) ;
143+ const effectiveTheme =
144+ theme === "auto"
145+ ? window . matchMedia && window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
146+ ? "dark"
147+ : "light"
148+ : theme ;
149+ document . documentElement . setAttribute ( "data-theme" , effectiveTheme ) ;
150+ } , [ theme ] ) ;
151+
152+ // 监听系统主题变化(仅在 auto 模式下)
153+ useEffect ( ( ) => {
154+ if ( theme !== "auto" ) return ;
155+
156+ const mediaQuery = window . matchMedia ( "(prefers-color-scheme: dark)" ) ;
157+ const handleChange = ( e : MediaQueryListEvent ) => {
158+ document . documentElement . setAttribute ( "data-theme" , e . matches ? "dark" : "light" ) ;
159+ } ;
160+
161+ mediaQuery . addEventListener ( "change" , handleChange ) ;
162+ return ( ) => mediaQuery . removeEventListener ( "change" , handleChange ) ;
143163 } , [ theme ] ) ;
144164
145165 useEffect ( ( ) => {
@@ -176,8 +196,8 @@ const App = () => {
176196 }
177197 } ;
178198
179- const toggleTheme = ( ) => {
180- setTheme ( ( prev ) => ( prev === "light" ? "dark" : "light" ) ) ;
199+ const setThemeMode = ( newTheme : "light" | "dark" | "auto" ) => {
200+ setTheme ( newTheme ) ;
181201 } ;
182202
183203 const handlePermissionResponse = useCallback (
@@ -1265,7 +1285,13 @@ const App = () => {
12651285 return (
12661286 < ConfigProvider
12671287 theme = { {
1268- algorithm : theme === "dark" ? antdTheme . darkAlgorithm : antdTheme . defaultAlgorithm ,
1288+ algorithm : theme === "dark"
1289+ ? antdTheme . darkAlgorithm
1290+ : theme === "light"
1291+ ? antdTheme . defaultAlgorithm
1292+ : ( window . matchMedia && window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
1293+ ? antdTheme . darkAlgorithm
1294+ : antdTheme . defaultAlgorithm ) ,
12691295 token : {
12701296 colorPrimary : "#f97316" ,
12711297 } ,
@@ -1283,6 +1309,8 @@ const App = () => {
12831309 onConnectToggle = { handleConnect }
12841310 wallpaper = { wallpaper }
12851311 onWallpaperChange = { handleWallpaperChange }
1312+ theme = { theme }
1313+ onThemeChange = { setThemeMode }
12861314 />
12871315 < NewTaskModal
12881316 isOpen = { isNewTaskOpen }
@@ -1301,7 +1329,7 @@ const App = () => {
13011329 onRenameTask = { handleRenameTask }
13021330 onOpenSettings = { ( ) => setIsSettingsOpen ( true ) }
13031331 theme = { theme }
1304- onToggleTheme = { toggleTheme }
1332+ onThemeChange = { setThemeMode }
13051333 />
13061334
13071335 { /* Main Chat Area */ }
0 commit comments