Skip to content

fix(tui): restore foreground hue step for tab status colors - #49899

Merged
kitlangton merged 1 commit into
v2from
tab-status-hue
Sep 19, 2026
Merged

kitlangton merged 1 commit into
v2from
tab-status-hue

Conversation

@kitlangton

@kitlangton kitlangton commented Sep 19, 2026

Copy link
Copy Markdown
Contributor

Why

In dark mode the session tab rail's running spinner, unread marker, and ! / ? attention markers render in a near-background shade, so a busy tab shows a barely visible flickering dot instead of a spinner. The /btw spinner and mini-mode status colors have the same problem.

Two theme refactors landed today a few hours apart. #49820 flipped hue steps to follow the mode's contrast direction, so in dark themes 100 is now the light end and 800 the dark end, and it moved the text.status.* tokens from .800 to .200 accordingly. #49846 then removed text.status.* and rewrote its consumers as raw hue lookups, but used the pre-flip step [800]:

-  const activeNumber = () => theme.text.status.running
+  const activeNumber = () => theme.hue.accent[800]   // dark end in dark mode

The dialogs converted in the same commit correctly use [200]; these call sites were the stragglers.

What Changes

Every theme.hue.accent[800] / theme.hue.interactive[800] status color moves to step 200, matching how the theme asset defines every other foreground token (text.base, text.feedback.*, text.formfield.* are all $hue.*.200). Light mode is unaffected in intent: its hue ramps are inverted in opencode.json, so 200 is the high-contrast foreground step in both modes.

Surface Before (dark) After (dark)
Tab rail running spinner accent[800]#271640 on #141414 accent[200]#9d7cd8
Tab rail unread and glow hue interactive[800]#3d1d06 interactive[200]#fab283
Tab rail ! / ? attention interactive[800] interactive[200]
/btw spinner accent[800] accent[200]
Mini mode running / question / permission accent[800] / interactive[800] accent[200] / interactive[200]

Demo

Both halves run the identical Drive script (dark opencode theme, vertical tabs, 120×30, simulated model streaming a slow reply so the session stays busy). Left: origin/v2 at 7125f5f. Right: this branch. Cropped to the left 600px of each frame so the tab rail stays legible side by side.

tab-status-demo.mp4

Zoomed tab rail from the same runs — top is before, bottom is after:

tab-status-zoom

Scope

Only the hue step at the call sites #49846 converted, plus the two tests that asserted on [800]. No theme schema or asset changes. Whether these should return to a semantic text.status token is a separate question for the theme work in flight.

Verification

cd packages/tui
bun run test test/component/session-tabs-status.test.tsx test/mini/theme.test.ts   # 26 pass
bun typecheck

End to end: the Drive before/after recording above, run against 7125f5f and this branch with the same script.

@kitlangton
kitlangton enabled auto-merge (squash) September 19, 2026 04:29
@kitlangton
kitlangton merged commit 5681662 into v2 Sep 19, 2026
14 checks passed
@kitlangton
kitlangton deleted the tab-status-hue branch September 19, 2026 04:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant