a sixth tone, and no raw palette left in the core apps

The five core apps — FileBrowser, FileViewer, SystemMonitor, Chat, Plugins — now
contain ZERO raw Tailwind palette classes. Every colour in them names a state or a
surface, so all of it follows the theme.

── Busy ──

The 38 ambers were the blocker, and the answer was not to pick between two wrong
mappings. They mean RUNNING — Chat's own comment says "the amber a RUNNING task chip
wears" — and the vocabulary had no word for it. `warning` would have made a working
job look like a failing one, and `--status-in-progress` is blue.

So `tone.ts` has six tones instead of five. It was always written as a closed set that
could grow when a genuine sixth state appeared; this is that.

`--busy-ink` comes with it, and generalises: a fill bright enough to carry black text
is far too light to BE text. The other five tones are dark enough to do both jobs,
which is why the problem had not surfaced. `text-amber-950` — ink ON the fill — became
`text-busy-foreground`, which is what it always was.

── On fidelity, which stopped being the constraint ──

Duck's exact colours were preserved up to this point because an extraction has to be
provably invisible. The owner has since said the palette is not precious: the
wallpaper, the graph-paper grid and the mark are what matter, and everything else can
move. So shades collapse — one busy, one red, one green — rather than being
approximated to keep old pixels.

The verification built for the old constraint keeps its value: it proves the token
layer resolves, which is a different claim from "the colours did not change".

Verified: the utilities compile (`text-busy-ink`, `bg-busy`, `border-busy`,
`text-busy-foreground`) and resolve in the browser.

950 pass / 7 fail unchanged. tsgo clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 23:13:19 +00:00
co-authored by Claude Opus 5
parent a52d3e06f3
commit dfb8a6d6cb
12 changed files with 56 additions and 30 deletions
+9
View File
@@ -88,6 +88,15 @@
--color-info: hsl(var(--info));
--color-info-foreground: hsl(var(--info-foreground));
/* The sixth state, and the reason it exists: `running` is neither good news nor a warning. The chat
tray, the send button and the queue all wore amber for it, and the token set had nothing to offer —
`--status-in-progress` is blue, and `warning` would make a working job look like a failing one.
`-ink` is the readable-on-a-tint variant: the fill is bright enough to sit behind black text, which
makes it far too light to BE text. Every tone will want this eventually; busy needed it first. */
--color-busy: hsl(var(--busy));
--color-busy-foreground: hsl(var(--busy-foreground));
--color-busy-ink: hsl(var(--busy-ink));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
@@ -122,6 +122,11 @@
--info: 263 90% 70%;
--info-foreground: 0 0% 100%;
/* Busy: running, queued, in flight. See base.css. */
--busy: 43 96% 56%;
--busy-foreground: 20 14% 8%;
--busy-ink: 43 96% 70%;
--border: 217.2 32.6% 17.5%;
--input: 217.2 32.6% 17.5%;
--ring: 212.7 26.8% 83.9%;
@@ -128,6 +128,11 @@
--info: 263 70% 50%;
--info-foreground: 0 0% 100%;
/* Busy: running, queued, in flight. See base.css. */
--busy: 43 96% 50%;
--busy-foreground: 20 14% 8%;
--busy-ink: 32 81% 29%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 222.2 84% 4.9%;
@@ -126,6 +126,11 @@
--info: 0 0% 35%;
--info-foreground: 0 0% 100%;
/* Busy: running, queued, in flight. See base.css. */
--busy: 0 0% 45%;
--busy-foreground: 0 0% 100%;
--busy-ink: 0 0% 25%;
--border: 0 0% 0%;
--input: 0 0% 0%;
--ring: 0 0% 0%;