Mark · Foundations

Records

Every theme record in the repo, one column each, read from themes/*.json. Tokens documents the vocabulary; this is what each record actually says in it.

The sheet

3 records · 11 tokens

A row is one token across every record. That is the whole idea: a binding read on its own always looks deliberate, and only the row shows you the one that is out of step with its neighbours. Colour chips are the live value for that record rather than a restatement of the hex beside them — if the two ever disagree, believe the chip.

Token MarkImpactVolt
undertone
undertone neutralcoolcool
radius
control1 .375rem010px
surface2 .375rem010px
pill3 50rem50rem100px
type
family-base system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif"Poppins", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif"Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif
webfont4 not declared2 stylesheets/assets/fonts/poppins.css
weight-heading 800600800
tracking-heading5 -.02emnot declared-0.04em
tracking-eyebrow .08em.08em.14em
heading6 not declaredposternot declared
motion
duration7 .2snot declared.2s
modes.dark — what each record restates
overrides 0 tokens0 tokens0 tokens

What it caught

computed, not asserted

Flags are derived from the records on every render: a token some records bind and others leave to fall back, one token stated in two different units, and mixed opaque and translucent colour notation. Fix a record and its flag disappears here without anyone editing this page.

  1. 1radius/control — Stated in rem and px — a length in px stops scaling with the root font size.
  2. 2radius/surface — Stated in rem and px — a length in px stops scaling with the root font size.
  3. 3radius/pill — Stated in rem and px — a length in px stops scaling with the root font size.
  4. 4type/webfont — Not declared by Mark — the value falls back rather than being chosen.
  5. 5type/tracking-heading — Not declared by Impact — the value falls back rather than being chosen.
  6. 6type/heading — Not declared by Mark or Volt — the value falls back rather than being chosen.
  7. 7motion/duration — Not declared by Impact — the value falls back rather than being chosen.

How to read it

declared · fallen back · derived

Not declared does not mean broken. A record binds what it wants to move and leaves the rest to the reference rendering, which is the contract working as intended — the flag only says the value was inherited rather than chosen, which is worth knowing when two records disagree about whether a thing is part of their identity.

Some tokens never appear here at all, because a theme author never writes them: the -rgb triplets, the dark secondary tint, and the on-primary contrast fallback are all derived by dev/build-themes-css.mjs from the values above. They are real custom properties in the compiled CSS and they are not part of the binding, which is why this sheet does not offer them.

The modes.dark row counts what a record restates for dark, not what it ends up with. A record overriding one token is not thinner than one overriding seven; it is saying that only one thing about it changes in the dark.