The logo is now stated by each of the fourteen themes rather than supplied by a default
none of them mentions. The base default stays empty, which is the right answer for a
theme written by a stranger — showing nothing beats showing someone else's brand.
Explicit costs one line and buys two things: a theme that ships a brand says so, and a
white-labelled build replaces a line it can see instead of hunting for the default that
was quietly doing the work.
Verified in the browser across four themes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer now ships fourteen themes. Eleven of them were written by other people, ported
unchanged, and none of them knows that panels, docks, glass, grids or scrollbars exist.
── What changed ──
`base.css` derives every surface from the standard tokens: a panel is `card` at 92%, the
header is `card` at 85%, grid lines are `border` faded, scrollbars are `muted-foreground`.
Those defaults sit on `:root`; a theme sits on `[data-theme='x']` and both land on
<html>, so a theme's own declaration simply outranks them. No machinery.
State tones are defaulted too — shadcn's vocabulary has `destructive` and nothing else,
and green-means-good is a convention rather than a palette decision. That is what drops
the required contract from 29 to 20: exactly the tokens every published shadcn palette
already ships.
So there are now three tiers, and an author picks one:
palette 20 tokens Tokyo Night, Gruvbox, Nord — surfaces derived
textured + a few surfaces glass, blur, radius, a wallpaper of its own
white-label + assets its own logo and background
Duck is tier three and is untouched — verified by probe: it still reports
`panel=#ffffff1f`, `blur=24px` and its own grid, because its declarations outrank the
new defaults.
── Verified before committing, not assumed ──
The whole HSL-triplet design existed to make `bg-card/50` work. Tested it: Tailwind v4
emits `color-mix(in oklab, var(--card) 50%, transparent)` for a HEX token, with a
`@supports` fallback. The unwrapped triplets were never necessary, and the ported
palettes are plain hex.
Six themes probed in the browser: each derives panels from its own card colour,
including the light one (Catppuccin Latte).
── Credit ──
The eleven palettes and the idea of a small standard contract come from the owner's
`vimazing` repository, which solved this more simply than we had. What Officer adds is
the surface layer underneath, so a palette gets a textured app for free.
── One open decision ──
`--logo-src` defaults to empty, so a palette theme shows no mark at all. Correct for a
third-party theme; probably wrong for Officer, where the alternative is defaulting to
the officer.dev logo and letting a white-label theme replace it. One line either way.
tsgo clean, suite unchanged, builds.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>