summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorSebastian <[email protected]>2026-04-24 17:28:07 +0200
committerGitHub <[email protected]>2026-04-24 17:28:07 +0200
commit3a5507de95b36da811fc5d3521769a946b883174 (patch)
treea5431c24ab13e5d533f64bf547f79292829ac944 /packages
parent86715fecc469e7bf12e526d386e4927afc95fa3e (diff)
downloadopencode-3a5507de95b36da811fc5d3521769a946b883174.tar.gz
opencode-3a5507de95b36da811fc5d3521769a946b883174.zip
Use OpenTUI theme detection for initial TUI mode, again (#23846)
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/package.json4
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx8
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/theme.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/terminal.ts39
-rw-r--r--packages/plugin/package.json8
5 files changed, 8 insertions, 53 deletions
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index 5225ff54c..f1d72c640 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -123,8 +123,8 @@
"@opentelemetry/exporter-trace-otlp-http": "0.214.0",
"@opentelemetry/sdk-trace-base": "2.6.1",
"@opentelemetry/sdk-trace-node": "2.6.1",
- "@opentui/core": "0.1.99",
- "@opentui/solid": "0.1.99",
+ "@opentui/core": "0.1.103",
+ "@opentui/solid": "0.1.103",
"@parcel/watcher": "2.5.1",
"@pierre/diffs": "catalog:",
"@solid-primitives/event-bus": "1.1.2",
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index eb5cb44e8..30a597b91 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -1,7 +1,6 @@
import { render, TimeToFirstDraw, useKeyboard, useRenderer, useTerminalDimensions } from "@opentui/solid"
import * as Clipboard from "@tui/util/clipboard"
import * as Selection from "@tui/util/selection"
-import * as Terminal from "@tui/util/terminal"
import { createCliRenderer, MouseButton, type CliRendererConfig } from "@opentui/core"
import { RouteProvider, useRoute } from "@tui/context/route"
import {
@@ -121,12 +120,6 @@ export function tui(input: {
const unguard = win32InstallCtrlCGuard()
win32DisableProcessedInput()
- const mode = await Terminal.getTerminalBackgroundColor()
-
- // Re-clear after getTerminalBackgroundColor() because setRawMode(false)
- // restores the original console mode, including processed input on Windows.
- win32DisableProcessedInput()
-
const onExit = async () => {
unguard?.()
resolve()
@@ -137,6 +130,7 @@ export function tui(input: {
}
const renderer = await createCliRenderer(rendererConfig(input.config))
+ const mode = (await renderer.waitForThemeMode(1000)) ?? "dark"
await render(() => {
return (
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
index af9582cfb..3ae1eb869 100644
--- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
@@ -314,7 +314,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
setStore(
produce((draft) => {
const lock = pick(kv.get("theme_mode_lock"))
- const mode = lock ?? props.mode
+ const mode = lock ?? pick(renderer.themeMode) ?? props.mode
if (!lock && pick(kv.get("theme_mode")) !== undefined) {
kv.set("theme_mode", undefined)
}
diff --git a/packages/opencode/src/cli/cmd/tui/util/terminal.ts b/packages/opencode/src/cli/cmd/tui/util/terminal.ts
index a61390f2c..c026b7381 100644
--- a/packages/opencode/src/cli/cmd/tui/util/terminal.ts
+++ b/packages/opencode/src/cli/cmd/tui/util/terminal.ts
@@ -17,12 +17,6 @@ function parse(color: string): RGBA | null {
return null
}
-function mode(background: RGBA | null): "dark" | "light" {
- if (!background) return "dark"
- const luminance = (0.299 * background.r + 0.587 * background.g + 0.114 * background.b) / 255
- return luminance > 0.5 ? "light" : "dark"
-}
-
/**
* Query terminal colors including background, foreground, and palette (0-15).
* Uses OSC escape sequences to retrieve actual terminal color values.
@@ -100,36 +94,3 @@ export async function colors(): Promise<{
}, 1000)
})
}
-
-// Keep startup mode detection separate from `colors()`: the TUI boot path only
-// needs OSC 11 and should resolve on the first background response instead of
-// waiting on the full palette query used by system theme generation.
-export async function getTerminalBackgroundColor(): Promise<"dark" | "light"> {
- if (!process.stdin.isTTY) return "dark"
-
- return new Promise((resolve) => {
- let timeout: NodeJS.Timeout
-
- const cleanup = () => {
- process.stdin.setRawMode(false)
- process.stdin.removeListener("data", handler)
- clearTimeout(timeout)
- }
-
- const handler = (data: Buffer) => {
- const match = data.toString().match(/\x1b]11;([^\x07\x1b]+)/)
- if (!match) return
- cleanup()
- resolve(mode(parse(match[1])))
- }
-
- process.stdin.setRawMode(true)
- process.stdin.on("data", handler)
- process.stdout.write("\x1b]11;?\x07")
-
- timeout = setTimeout(() => {
- cleanup()
- resolve("dark")
- }, 1000)
- })
-}
diff --git a/packages/plugin/package.json b/packages/plugin/package.json
index 16c5e236b..45926f05b 100644
--- a/packages/plugin/package.json
+++ b/packages/plugin/package.json
@@ -22,8 +22,8 @@
"zod": "catalog:"
},
"peerDependencies": {
- "@opentui/core": ">=0.1.99",
- "@opentui/solid": ">=0.1.99"
+ "@opentui/core": ">=0.1.103",
+ "@opentui/solid": ">=0.1.103"
},
"peerDependenciesMeta": {
"@opentui/core": {
@@ -34,8 +34,8 @@
}
},
"devDependencies": {
- "@opentui/core": "0.1.99",
- "@opentui/solid": "0.1.99",
+ "@opentui/core": "0.1.103",
+ "@opentui/solid": "0.1.103",
"@tsconfig/node22": "catalog:",
"@types/node": "catalog:",
"typescript": "catalog:",