diff options
| author | Adam <[email protected]> | 2025-12-28 15:47:05 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-28 15:47:05 -0600 |
| commit | a4411c21b6687e7392447da08dbaec2dc530075f (patch) | |
| tree | 6bbcdc798fb325da57a91ebec460e348a0d96d63 /packages/ui/src/theme | |
| parent | 9d61370ac458627c394195ef761669ba70c93237 (diff) | |
| download | opencode-a4411c21b6687e7392447da08dbaec2dc530075f.tar.gz opencode-a4411c21b6687e7392447da08dbaec2dc530075f.zip | |
feat(desktop): theme preview
Diffstat (limited to 'packages/ui/src/theme')
| -rw-r--r-- | packages/ui/src/theme/context.tsx | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx index d2fbed3a1..210773f0c 100644 --- a/packages/ui/src/theme/context.tsx +++ b/packages/ui/src/theme/context.tsx @@ -22,6 +22,10 @@ interface ThemeContextValue { setTheme: (id: string) => void setColorScheme: (scheme: ColorScheme) => void registerTheme: (theme: DesktopTheme) => void + previewTheme: (id: string) => void + previewColorScheme: (scheme: ColorScheme) => void + commitPreview: () => void + cancelPreview: () => void } const ThemeContext = createContext<ThemeContextValue>() @@ -104,6 +108,8 @@ export function ThemeProvider(props: { children: JSX.Element; defaultTheme?: str const [themeId, setThemeIdSignal] = createSignal(props.defaultTheme ?? "oc-1") const [colorScheme, setColorSchemeSignal] = createSignal<ColorScheme>("system") const [mode, setMode] = createSignal<"light" | "dark">(getSystemMode()) + const [previewThemeId, setPreviewThemeId] = createSignal<string | null>(null) + const [previewScheme, setPreviewScheme] = createSignal<ColorScheme | null>(null) onMount(() => { const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)") @@ -169,6 +175,46 @@ export function ThemeProvider(props: { children: JSX.Element; defaultTheme?: str })) } + const previewTheme = (id: string) => { + const theme = themes()[id] + if (!theme) return + setPreviewThemeId(id) + const previewMode = previewScheme() ? (previewScheme() === "system" ? getSystemMode() : previewScheme()!) : mode() + applyThemeCss(theme, id, previewMode as "light" | "dark") + } + + const previewColorScheme = (scheme: ColorScheme) => { + setPreviewScheme(scheme) + const previewMode = scheme === "system" ? getSystemMode() : scheme + const id = previewThemeId() ?? themeId() + const theme = themes()[id] + if (theme) { + applyThemeCss(theme, id, previewMode) + } + } + + const commitPreview = () => { + const id = previewThemeId() + const scheme = previewScheme() + if (id) { + setTheme(id) + } + if (scheme) { + setColorSchemePref(scheme) + } + setPreviewThemeId(null) + setPreviewScheme(null) + } + + const cancelPreview = () => { + setPreviewThemeId(null) + setPreviewScheme(null) + const theme = themes()[themeId()] + if (theme) { + applyThemeCss(theme, themeId(), mode()) + } + } + return ( <ThemeContext.Provider value={{ @@ -179,6 +225,10 @@ export function ThemeProvider(props: { children: JSX.Element; defaultTheme?: str setTheme, setColorScheme: setColorSchemePref, registerTheme, + previewTheme, + previewColorScheme, + commitPreview, + cancelPreview, }} > {props.children} |
