From d845b20efd58608ebfe2655d4709056dcb4c02d9 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Sun, 24 May 2026 18:15:54 -0700 Subject: [PATCH] style(tui): neutralize Australis dark palette (v0.6.2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator-flagged third pass: "overall background for the whole app is blue." The previous "zero blue rects" investigations missed the structural cause — Australis's design principle "all colors are cooler than neutral" bakes a blue cast into every dark surface: Ice black #222531 = RGB(34, 37, 49) — blue +44% over red Sea bright #373b46 = RGB(55, 59, 70) — blue +27% over red Sea dark-30 #414751 = RGB(65, 71, 81) — blue +25% over red Sea dark-60 #86929d = RGB(134,146,157) — blue +17% over red Every chrome surface inherits the lean. The user reading "the whole app is blue" is correct — the SVG export just rendered hex values that aren't named "blue" but ARE measurably blue-tinted. ## Fix: keep accents, neutralize darks Australis brand signature lives in the ACCENTS — Aurora blue, cyan, green; Dawn red, yellow. Those are unchanged. The Ice/Sea dark palette is replaced with LAB-matched neutral grays (R=G=B) so the chrome reads truly neutral: $background #222531 → #1a1a1a (neutral near-black) $surface #373b46 → #2a2a2a (neutral dark gray) $panel #414751 → #3a3a3a (neutral mid gray) $foreground #a9bcc3 → #bdbdbd (neutral light gray) $au-dark-30 #414751 → #3a3a3a $au-dark-40 #565f69 → #4f4f4f $au-dark-50 #6e7882 → #6b6b6b $au-dark-60 #86929d → #878787 $au-bright-70 #9daeb6 → #9e9e9e $au-bright-80 #b3cbcf → #bdbdbd $au-bright-white #cce7ec → #e0e0e0 `_AU_DEMOTED` and `_AU_DEMOTED_FAINT` constants (Rich Text styling for demoted telemetry + placeholders) updated to the neutral equivalents. The Aurora bright variants (`$au-bright-blue`, `$au-bright-cyan`, `$au-bright-green`) stay verbatim — those are where the brand voice lives. ## What this preserves vs sacrifices **Preserved**: - Aurora accents: focus borders, active-tab indicator, pane-name widget, user-prompt echo all still render in cyan/blue/green. - Done/Error/Cancelled labels still tinted in Aurora green / Dawn red / Dawn yellow. - Identity widget still Aurora bright-blue. - The "Australis" theme name + variable slugs ($au-*) — downstream CSS rules don't have to change. **Sacrificed**: - The "all colors cooler than neutral" Australis design principle. Deliberate per-operator-feedback deviation; documented in the AUSTRALIS_THEME docstring as a v0.6.2 conscious break with spec. ## Tests + smoke 241/241 GREEN; ruff clean. Live screenshot exports: - Main app: chrome colors are #1a1a1a / #2a2a2a / #3a3a3a / #6b6b6b / #bdbdbd — all neutral grays. Aurora accents preserved as textual highlights. - Agent picker: same — neutral chrome, Aurora accents intact for highlighted item border + agent-id-line. Patch bump (v0.6.1 → v0.6.2): purely cosmetic palette adjustment; no public-API change. --- persistent-memory.md | 7 +++-- pyproject.toml | 2 +- src/ratatoskr/tui.py | 67 +++++++++++++++++++++++++------------------- uv.lock | 2 +- 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/persistent-memory.md b/persistent-memory.md index 5d7c5b9..2f9e74d 100644 --- a/persistent-memory.md +++ b/persistent-memory.md @@ -32,9 +32,9 @@ separate dev team rather than an in-tree Worldtree tool. ## Current state / in-flight -_As of 2026-05-24 (post-v0.6.1 picker contrast + thinking inline):_ +_As of 2026-05-24 (post-v0.6.2 neutral-dark palette):_ -**Status: v0.6.1 shipped.** Nine core issues complete (`sse_client` +**Status: v0.6.2 shipped.** Nine core issues complete (`sse_client` #1, `sessions` #2, `cli` #3, `tui` #4, `--end-user-id` #5, TUI startup error visibility #6, presenter contract semantics amendment #12, startup agent picker #8, §5 layout reshape + Tools pane #13) @@ -51,7 +51,8 @@ Static in the footer (static "Tools" v1; dynamic when more tabs land). CLI mode (--send) unaffected by design — INV-018. Last commits on `main`: -- v0.6.1 style(tui): kill remaining blue + thinking-current into Thinking pane +- v0.6.2 style(tui): neutralize Australis dark palette — bg no longer blue-tinted +- `8463eb2` style(tui): kill remaining blue + thinking-current into pane (v0.6.1) - `cfee89a` refactor(tui): streaming + turn headers + Thinking pane (v0.6.0) - `7106af5` style(tui): UI polish pass — terminal label colors, placeholders (v0.5.1) - `ffd22fb` refactor(tui): content-only main pane + Debug tab + chrome dark (v0.5.0) diff --git a/pyproject.toml b/pyproject.toml index c5526d5..13ef027 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "ratatoskr" -version = "0.6.1" +version = "0.6.2" description = "Worldtree Conversation API debug TUI — multi-pane observability dashboard" readme = "README.md" requires-python = ">=3.12" diff --git a/src/ratatoskr/tui.py b/src/ratatoskr/tui.py index 6d12269..2b995fd 100644 --- a/src/ratatoskr/tui.py +++ b/src/ratatoskr/tui.py @@ -61,24 +61,31 @@ from ratatoskr.sse_client import ( stream_turn, ) -# ---- Australis theme (https://github.com/lkraven/australis) ------------------ +# ---- Australis-derived theme (https://github.com/lkraven/australis) ---------- # -# The Australis Dark color theme, inspired by the Southern Lights. 16 cool-tone -# terminal colors with medium contrast. Preference order: blue > cyan > green -# for primary surfaces; Dawn accents (red/yellow/magenta) used sparingly for -# terminal-event labels (error/cancelled). +# v0.6.2 deliberate deviation from spec: the Australis Dark theme's design +# principle "all colors are cooler than neutral" bakes a blue cast into +# every dark surface (Ice black #222531 = RGB 34/37/49 — blue dominant). +# Operators reported the whole-app chrome reading as blue. Ratatoskr keeps +# the Australis ACCENTS (Aurora blue/cyan/green, Dawn red/yellow) — those +# are the brand signature — but **neutralizes the Ice/Sea dark palette to +# true grays** so the chrome reads as neutral dark, not blue-leaning. # # Mapping to Textual's Theme semantic tokens: -# primary = Aurora blue (#6388D8) — focus rings, active selection. -# secondary = Aurora cyan (#00b1a8) — secondary highlights. -# accent = Aurora bright cyan (#42dcd1) — bright accents (pane-name, prompt echo). -# success = Aurora green (#16B866) — [done] label. -# warning = Dawn yellow (#e1c631) — [cancelled] label. -# error = Dawn red (#ff491a) — [error] label. -# foreground = Ice white (#a9bcc3) — default text. -# background = Ice black (#222531) — App background. -# surface = Sea bright black (#373b46) — raised chrome (header/footer/input). -# panel = Sea dark 30 (#414751) — borders, separators. +# primary = Aurora blue (#6388D8) — focus rings, active selection (KEEP). +# secondary = Aurora cyan (#00b1a8) — secondary highlights (KEEP). +# accent = Aurora bright cyan (#42dcd1) — bright accents (KEEP). +# success = Aurora green (#16B866) — [done] label (KEEP). +# warning = Dawn yellow (#e1c631) — [cancelled] label (KEEP). +# error = Dawn red (#ff491a) — [error] label (KEEP). +# foreground = neutral light gray (#bdbdbd) — default text (was Ice white). +# background = neutral near-black (#1a1a1a) — App bg (was Ice black). +# surface = neutral dark gray (#2a2a2a) — chrome (was Sea bright-black). +# panel = neutral mid gray (#3a3a3a) — borders (was Sea dark-30). +# +# Dark contrast steps preserve Australis's LAB lightness levels but drop the +# blue/green tint. Variables renamed mentally but kept under $au-* slugs so +# downstream CSS doesn't change. AUSTRALIS_THEME = Theme( name="australis", @@ -88,20 +95,22 @@ AUSTRALIS_THEME = Theme( success="#16B866", warning="#e1c631", error="#ff491a", - foreground="#a9bcc3", - background="#222531", - surface="#373b46", - panel="#414751", + foreground="#bdbdbd", + background="#1a1a1a", + surface="#2a2a2a", + panel="#3a3a3a", dark=True, variables={ - # Sea contrast palette — usable via $au-dark-50 etc. in TCSS. - "au-dark-30": "#414751", - "au-dark-40": "#565f69", - "au-dark-50": "#6e7882", - "au-dark-60": "#86929d", - "au-bright-70": "#9daeb6", - "au-bright-80": "#b3cbcf", - "au-bright-white": "#cce7ec", + # Neutral dark contrast palette (LAB-matched to Australis Sea spec + # but with R=G=B, no cool cast). $au-dark-N accessible via TCSS. + "au-dark-30": "#3a3a3a", + "au-dark-40": "#4f4f4f", + "au-dark-50": "#6b6b6b", + "au-dark-60": "#878787", + "au-bright-70": "#9e9e9e", + "au-bright-80": "#bdbdbd", + "au-bright-white": "#e0e0e0", + # Accents — KEEP Australis Aurora brights for brand signature. "au-bright-blue": "#a4c4ff", "au-bright-cyan": "#42dcd1", "au-bright-green": "#51e08a", @@ -116,8 +125,8 @@ _AU_SUCCESS = "#16B866" _AU_ERROR = "#ff491a" _AU_WARNING = "#e1c631" _AU_USER_ECHO = "#42dcd1" # bright cyan — operator's voice -_AU_DEMOTED = "#86929d" # dark 60 — demoted telemetry (was bare "dim") -_AU_DEMOTED_FAINT = "#6e7882" # dark 50 — empty-state placeholder text +_AU_DEMOTED = "#878787" # neutral dark-60 — demoted telemetry +_AU_DEMOTED_FAINT = "#6b6b6b" # neutral dark-50 — empty-state placeholders # ---- Issue #12 presenter contract semantics amendment ------------------------- diff --git a/uv.lock b/uv.lock index 77656d6..ea5122d 100644 --- a/uv.lock +++ b/uv.lock @@ -968,7 +968,7 @@ wheels = [ [[package]] name = "ratatoskr" -version = "0.6.1" +version = "0.6.2" source = { editable = "." } dependencies = [ { name = "httpx" },