Skip to content

Repaint the site in the mark's own three colours - #31

Merged
yujiezhang-ops merged 1 commit into
mainfrom
feat/terracotta-brand-palette
Aug 13, 2026
Merged

yujiezhang-ops merged 1 commit into
mainfrom
feat/terracotta-brand-palette

Conversation

@yujiezhang-ops

@yujiezhang-ops yujiezhang-ops commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

What

Follows MaimoryLab/BootAgent#180 so the site and the app a visitor downloads read as one product. Both palettes derive from the mark: the cream ground, the ink ring, the terracotta stem.

The constraint that shaped it

The mark's terracotta cannot be the action colour. #D96E49 is 2.79:1 on --paper and 3.35:1 under white — failing AA as text, and failing even the 3:1 non-text UI needs. --brand keeps it for the logo and large decoration; --accent is a deeper #A94623 that clears AA as text on our grounds and as a fill under white.

Token Light Dark
--brand #D96E49 #E4855C
--accent #A94623 #E4855C
--ink #211F1B #F4EFE6
--paper #EFEAE0 #161410

--blue and --blue-deep collapse into one --accent

The split had stopped tracking anything. --blue-deep carried every link, label and fill because white on --blue was only 4.02:1, which left --blue holding borders and accent-color. Keeping two names for a distinction that no longer existed is how a tab label and its own underline ended up different colours. .chip-blue is renamed too, rather than left naming a colour it no longer holds.

The brand mark stops being an <img>

It is two-colour now, and an <img> is an isolated document: currentColor falls back to black there and a custom property does not cross into it at all, so the stem would not paint. Inlined, the ring takes currentColor off the wordmark plate's --ink and inverts with the theme by itself — no second asset. AgentMark hits the same wall and is already handled that way.

Assets

Every raster under public/images/brand/ plus favicon.png is re-rendered from the mark's geometry rather than scaled, and favicon.svg is added ahead of the PNG so 16px stays crisp.

NOTICE is corrected on a point that is now backwards: the mark is no longer traced from bootagent-logo.png. That file is a rendering of the geometry, not its source.

Tests

Two e2e assertions pinned literals that moved (--paper on body, --surface on row hover); both now name the token they track. focus-indicator.test.ts's prose cited --blue-soft values that no longer exist.

The six dark-theme visual baselines are regolded. The agents one had to be deleted first: a stale cool-grey baseline still passed on Playwright's per-pixel threshold while every other screen had gone warm, so --update-snapshots left it alone. Worth knowing that a palette shift at that darkness can sit inside the threshold and leave a baseline silently misrepresenting the product.

Verification

  • pnpm vitest run — 100 passed, 9 files
  • pnpm run build — clean, 50 pages, validate-build.mjs ok
  • pnpm run test:e2e198 passed, 36 skipped, including the axe color-contrast gates on every critical page in both schemes and the computed focus-ring contrast check
  • Live-inspected both themes: tokens, primary button, chips, and the inlined mark's two strokes all resolve correctly

🤖 Generated with Claude Code

@yujiezhang-ops yujiezhang-ops changed the title Feat/terracotta brand palette Repaint the site in the mark's own three colours Aug 13, 2026
Follows MaimoryLab/BootAgent, so the site and the app a visitor downloads
read as one product. Both palettes derive from the mark: the cream ground,
the ink ring, and the terracotta stem.

The mark's terracotta cannot be the action colour -- #D96E49 is 2.79:1 on
--paper and 3.35:1 under white, failing AA as text and failing even the 3:1
non-text UI needs. --brand keeps it for the logo and for large decoration;
--accent is a deeper #A94623 that clears AA as text on our grounds and as a
fill under white.

--blue and --blue-deep collapse into that one --accent. The split had stopped
tracking anything: --blue-deep carried every link, label and fill because
white on --blue was only 4.02:1, leaving --blue holding borders and
accent-color. Keeping two names for one distinction that no longer existed
was how a label and its own underline ended up different colours.

The brand mark stops being an <img> and is inlined. It is two-colour now, and
an <img> is an isolated document: currentColor falls back to black there and
a custom property does not cross into it at all, so the stem would not paint.
Inlined, the ring takes currentColor off the wordmark plate's --ink and
inverts with the theme on its own. AgentMark hits the same wall and is
already handled.

Every raster under public/images/brand/ plus favicon.png is re-rendered from
the mark's geometry rather than scaled, and favicon.svg is added ahead of the
PNG so 16px stays crisp. NOTICE is corrected: the mark is no longer traced
from bootagent-logo.png -- that file is now a rendering of the geometry, not
its source.

Two e2e assertions pinned literals that moved, and both now name the token
they track. The six dark-theme visual baselines are regolded; the agents one
had to be deleted first, because a stale cool-grey baseline passed on
Playwright's per-pixel threshold while every other screen had gone warm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@yujiezhang-ops
yujiezhang-ops force-pushed the feat/terracotta-brand-palette branch from a0dfa13 to 9275779 Compare August 13, 2026 13:03
@yujiezhang-ops
yujiezhang-ops merged commit 1290ff3 into main Aug 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant