Skip to content

feat(viz): bring the memory web assets onto the published brand - #210

Merged
bkearns merged 1 commit into
mainfrom
feat/viz-brand-conformance
Aug 19, 2026
Merged

feat(viz): bring the memory web assets onto the published brand#210
bkearns merged 1 commit into
mainfrom
feat/viz-brand-conformance

Conversation

@bkearns

@bkearns bkearns commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

viz.html and workbench.html had drifted into a look of their own. They now use the same tokens as the site (ferrosa-docs docs/site.css), so the product and the marketing surface read as one system.

The monogram was an invented product element

Both assets rendered Fm with atomic number 100 — Fermium, invented for "Ferrosa Memory" — in the header mark and the favicon. The brand rules forbid this twice:

The Fe monogram is locked to the company mark only. Products do not get element tiles of their own.
Don't: swap element symbol or atomic number for products.

Both now carry the company Fe / 26 mark with the brand gradient ending in Blued Steel, matching logo.svg.

Tokens

Names now match the site: --primary is Core Blue and --accent is Electric Cyan. The assets had --accent holding Core Blue and --accent-warm holding cyan. Invented tokens --accent-cool and --accent-purple are retired onto --primary and --steel. Blued Steel, Pale Cyan and the border/hairline scale were missing entirely.

The graph palette extends the brand rather than inventing beside it

31 ad-hoc hues encoded entity and edge types — hot pink #ff7eb3, coral #ff6b6b, violet #c97eff, sky #87ceeb, and 20 more with no relationship to the brand. They are replaced by a categorical ramp built from the cool family (Electric Cyan → Core Blue → Blued Steel), with the semantic colours reserved for meaning rather than spent on categories.

Edges sit closer to steel than nodes do, so relationships recede behind the entities they connect instead of competing with them — which is also what brand guidance means by keeping Blued Steel to fills and strokes.

Colours resolve from CSS tokens at render time instead of being duplicated in JS, so the graph follows the theme rather than painting dark-ground hues onto a light ground.

Light theme

Neither asset had one. Both now support an explicit data-theme and the host's preference. Light values are darkened counterparts, not the dark values reused — a hue picked for #05070c does not survive on #f4f8fd, which is why the site darkens --accent to #0e7ea3 rather than reusing it.

Composite values became tokens for the reason the site documents: an rgba() or gradient literal cannot flip, because its alpha sits over a different ground in each theme. That covers chrome gradients, menus, inputs, films and shadows — including shadows that were pure black, which the brand says never to use, and several neutral greys that were not brand colours at all.

Other conformance

  • Focus ring is 3px Electric Cyan with an offset, not a 1px hairline
  • All 41 border-radius declarations sit on the 4/8/12/16 scale (6px alone appeared 11 times)
  • Pure-white selection rings and on-accent text became --text / --on-primary, which flip

Guard

scripts/check-viz-theme.py fails on three things: the two light blocks drifting, a dark token with no light counterpart, and a colour literal painted in a rule.

The first is not hypothetical — while writing this, --film was added to the explicit block and the prefers-color-scheme copy silently kept the old palette. That is invisible until someone views the page on a light-preference host with no saved choice. CSS cannot alias one block from the other, so the guard is the only thing keeping them honest. Wired into make test-unit.

The workbench branding test asserted the old state, including the Fm mark. It now asserts the brand contract and the absence of the invented tile.

Verification

Both assets rendered in both themes via headless Chrome, and exercised against a real 14,404-node / 54,510-edge graph — see ferrosadb/ferrosa-docs#25, which reshoots the homepage image from this build.

109 http tests pass; ferrosa-memory-core builds; check-viz-theme clean; cargo fmt --check clean.

Not merging this myself: standing rule is no auto-merge on public repos.

viz.html and workbench.html had drifted into a look of their own. They now use
the same tokens as the site (ferrosa-docs docs/site.css), so the product and the
marketing surface read as one system.

## The monogram was an invented product element

Both assets rendered "Fm" with atomic number 100 — Fermium, invented for Ferrosa
Memory — in the header mark and the favicon. The brand rules forbid exactly
this, twice: the Fe monogram is locked to the company mark, "products do not get
element tiles of their own", and under Don't, "swap element symbol or atomic
number for products". Both now carry the company Fe/26 mark with the brand
gradient that ends in Blued Steel, matching logo.svg.

## Tokens

Names now match the site: --primary is Core Blue and --accent is Electric Cyan
(the assets had --accent holding Core Blue and --accent-warm holding cyan).
Invented tokens --accent-cool and --accent-purple are retired onto --primary and
--steel. Blued Steel, Pale Cyan and the border/hairline scale were missing
entirely and are now present.

## The graph palette extends the brand rather than inventing beside it

31 ad-hoc hues encoded entity and edge types — hot pink #ff7eb3, coral #ff6b6b,
violet #c97eff, sky #87ceeb, and 20 more with no relationship to the brand. They
are replaced by a categorical ramp built from the cool family (Electric Cyan ->
Core Blue -> Blued Steel), with the semantic colours reserved for MEANING rather
than spent on categories. Edges sit closer to steel than nodes do, so
relationships recede behind the entities they connect instead of competing with
them — which is also what brand guidance means by keeping Blued Steel to fills
and strokes.

The colours resolve from CSS tokens at render time instead of being duplicated
in JS, so the graph follows the theme instead of painting dark-ground hues onto
a light ground.

## Light theme

Neither asset had one. Both now support an explicit data-theme and the host's
preference. Light values are DARKENED counterparts rather than the dark values
reused, the same way the site handles --accent and --primary; a hue picked for
#05070c does not survive on #f4f8fd.

Composite values became tokens for the reason the site documents: an rgba() or
gradient literal cannot flip, because its alpha sits over a different ground in
each theme. That covers the chrome gradients, menus, inputs, films and shadows —
including shadows that were pure black, which the brand says never to use, and
several neutral greys that were not brand colours at all.

## Other conformance

Focus ring is 3px Electric Cyan with an offset, not a 1px hairline. All 41
border-radius declarations sit on the 4/8/12/16 scale (6px alone appeared 11
times). Pure-white selection rings and on-accent text became --text and
--on-primary, which flip.

## Guard

scripts/check-viz-theme.py fails on three things: the two light blocks drifting,
a dark token with no light counterpart, and a colour literal painted in a rule.
The first is not hypothetical — while writing this, --film was added to the
explicit block and the media-query copy silently kept the old palette. Wired
into `make test-unit`.

The workbench branding test asserted the old state, including the Fm mark. It
now asserts the brand contract and the ABSENCE of the invented tile.

109 http tests pass; ferrosa-memory-core builds; check-viz-theme clean.
@bkearns
bkearns added this pull request to the merge queue Aug 19, 2026
Merged via the queue into main with commit c55c86f Aug 19, 2026
11 checks passed
@bkearns
bkearns deleted the feat/viz-brand-conformance branch August 19, 2026 16:27
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