Skip to content

Commit a94aff7

Browse files
committed
Merge branch 'pr-140-transparent-theme' into integration
2 parents bb9c32c + 2d0af95 commit a94aff7

2 files changed

Lines changed: 31 additions & 7 deletions

File tree

packages/opencode/src/cli/cmd/tui/app.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import { render, useKeyboard, useRenderer, useTerminalDimensions } from "@opentu
22
import { Clipboard } from "@tui/util/clipboard"
33
import { TextAttributes } from "@opentui/core"
44
import { RouteProvider, useRoute } from "@tui/context/route"
5-
import { Switch, Match, createEffect, untrack, ErrorBoundary, createSignal, onMount, batch, Show, on } from "solid-js"
5+
import { Switch, Match, createEffect, untrack, ErrorBoundary, createSignal, onMount, batch, on } from "solid-js"
66
import { Installation } from "@/installation"
7-
import { Global } from "@/global"
87
import { Flag } from "@/flag/flag"
98
import { DialogProvider, useDialog } from "@tui/ui/dialog"
109
import { DialogProvider as DialogProviderList } from "@tui/component/dialog-provider"
@@ -165,7 +164,7 @@ function App() {
165164
const command = useCommandDialog()
166165
const { event, client: sdkClient } = useSDK()
167166
const toast = useToast()
168-
const { theme, mode, setMode } = useTheme()
167+
const { theme, mode, setMode, transparent, setTransparent } = useTheme()
169168
const sync = useSync()
170169
const exit = useExit()
171170
const promptRef = usePromptRef()
@@ -389,6 +388,15 @@ function App() {
389388
},
390389
category: "System",
391390
},
391+
{
392+
title: "Toggle transparency",
393+
value: "theme.transparency",
394+
onSelect: (dialog) => {
395+
setTransparent(!transparent())
396+
dialog.clear()
397+
},
398+
category: "System",
399+
},
392400
{
393401
title: "Help",
394402
value: "help.show",

packages/opencode/src/cli/cmd/tui/context/theme.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { SyntaxStyle, RGBA, type TerminalColors } from "@opentui/core"
22
import path from "path"
3-
import { createEffect, createMemo, onMount } from "solid-js"
3+
import { createEffect, createMemo } from "solid-js"
44
import { useSync } from "@tui/context/sync"
55
import { createSimpleContext } from "./helper"
66
import aura from "./theme/aura.json" with { type: "json" }
@@ -95,6 +95,7 @@ type ThemeColors = {
9595
type Theme = ThemeColors & {
9696
_hasSelectedListItemText: boolean
9797
thinkingOpacity: number
98+
transparent: boolean
9899
}
99100

100101
export function selectedForeground(theme: Theme): RGBA {
@@ -157,12 +158,12 @@ export const DEFAULT_THEMES: Record<string, ThemeJson> = {
157158
solarized,
158159
synthwave84,
159160
tokyonight,
160-
vesper,
161161
vercel,
162+
vesper,
162163
zenburn,
163164
}
164165

165-
function resolveTheme(theme: ThemeJson, mode: "dark" | "light") {
166+
function resolveTheme(theme: ThemeJson, mode: "dark" | "light", transparent: boolean) {
166167
const defs = theme.defs ?? {}
167168
function resolveColor(c: ColorValue): RGBA {
168169
if (c instanceof RGBA) return c
@@ -213,10 +214,17 @@ function resolveTheme(theme: ThemeJson, mode: "dark" | "light") {
213214
// Handle thinkingOpacity - optional with default of 0.6
214215
const thinkingOpacity = theme.theme.thinkingOpacity ?? 0.6
215216

217+
if (transparent) {
218+
resolved.background = RGBA.fromInts(0, 0, 0, 0)
219+
// NOTE: Could alternatively apply an alpha channel to the theme's base background color
220+
// instead of forcing full transparency, allowing for adjustable opacity levels
221+
}
222+
216223
return {
217224
...resolved,
218225
_hasSelectedListItemText: hasSelectedListItemText,
219226
thinkingOpacity,
227+
transparent,
220228
} as Theme
221229
}
222230

@@ -274,6 +282,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
274282
themes: DEFAULT_THEMES,
275283
mode: kv.get("theme_mode", props.mode),
276284
active: (sync.data.config.theme ?? kv.get("theme", "opencode")) as string,
285+
transparent: kv.get("theme_transparent", false),
277286
ready: false,
278287
})
279288

@@ -298,7 +307,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
298307
})
299308

300309
const values = createMemo(() => {
301-
return resolveTheme(store.themes[store.active] ?? store.themes.opencode, store.mode)
310+
return resolveTheme(store.themes[store.active] ?? store.themes.opencode, store.mode, store.transparent)
302311
})
303312

304313
const syntax = createMemo(() => generateSyntax(values()))
@@ -330,6 +339,13 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
330339
setStore("active", theme)
331340
kv.set("theme", theme)
332341
},
342+
transparent() {
343+
return store.transparent
344+
},
345+
setTransparent(transparent: boolean) {
346+
setStore("transparent", transparent)
347+
kv.set("theme_transparent", transparent)
348+
},
333349
get ready() {
334350
return store.ready
335351
},

0 commit comments

Comments
 (0)