From af10481ac19fa7930b351c70857cb95aa935ee60 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:44:05 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=A4=96=20feat:=20add=20system=20theme?= =?UTF-8?q?=20matching=20(light/dark=20based=20on=20OS)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 'System' theme preference that follows OS light/dark live - Persisted preference: 'system' | 'light' | 'dark' (defaults to 'system') - Live updates: subscribe to matchMedia changes when preference is 'system' - Update index.html and terminal.html early bootstrap for FOUC prevention - Wrap terminal window in ThemeProvider for theme consistency - Remove flexoki themes, keeping only light/dark - Self-heal invalid/legacy stored values to 'system' --- index.html | 52 ++----- src/browser/App.tsx | 10 +- .../Settings/sections/GeneralSection.tsx | 15 +- src/browser/components/ThemeSelector.tsx | 18 ++- src/browser/contexts/ThemeContext.tsx | 146 +++++++++--------- src/browser/terminal-window.tsx | 13 +- src/browser/utils/commands/sources.test.ts | 4 +- src/browser/utils/commands/sources.ts | 14 +- terminal.html | 43 +++++- 9 files changed, 174 insertions(+), 141 deletions(-) diff --git a/index.html b/index.html index 20943cff1f..0d82b23c0e 100644 --- a/index.html +++ b/index.html @@ -106,23 +106,8 @@
From adfb84aa49e9a06f212b16a093f531127c6d8182 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:48:51 +0000 Subject: [PATCH 2/5] fix: toggleTheme now toggles resolved theme, not preference cycle When preference is 'system', toggling now switches to the opposite of the currently displayed theme, making the toggle button behavior intuitive. Clicking 'Switch to dark theme' always switches to dark. --- src/browser/components/ThemeToggleButton.tsx | 2 +- src/browser/contexts/ThemeContext.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/browser/components/ThemeToggleButton.tsx b/src/browser/components/ThemeToggleButton.tsx index 12ddfdfd7c..ce467d6082 100644 --- a/src/browser/components/ThemeToggleButton.tsx +++ b/src/browser/components/ThemeToggleButton.tsx @@ -4,7 +4,7 @@ import { Tooltip, TooltipTrigger, TooltipContent } from "./ui/tooltip"; export function ThemeToggleButton() { const { theme, toggleTheme } = useTheme(); - const isLightTheme = theme === "light" || theme.endsWith("-light"); + const isLightTheme = theme === "light"; const label = isLightTheme ? "Switch to dark theme" : "Switch to light theme"; const Icon = isLightTheme ? MoonStar : SunMedium; diff --git a/src/browser/contexts/ThemeContext.tsx b/src/browser/contexts/ThemeContext.tsx index 9d66598207..44747f17fc 100644 --- a/src/browser/contexts/ThemeContext.tsx +++ b/src/browser/contexts/ThemeContext.tsx @@ -152,13 +152,13 @@ export function ThemeProvider({ [setRawPreference, isNestedUnderForcedProvider] ); + // Toggle between light and dark based on current resolved theme. + // This gives intuitive behavior: if it looks light, toggle to dark (and vice versa). const toggleTheme = useCallback(() => { if (!isNestedUnderForcedProvider) { - const currentIndex = PREFERENCE_VALUES.indexOf(themePreference); - const nextIndex = (currentIndex + 1) % PREFERENCE_VALUES.length; - setRawPreference(PREFERENCE_VALUES[nextIndex]); + setRawPreference(theme === "light" ? "dark" : "light"); } - }, [themePreference, setRawPreference, isNestedUnderForcedProvider]); + }, [theme, setRawPreference, isNestedUnderForcedProvider]); const value = useMemo