Ask for a role, never a hex.
The tokens come straight from tokens.json in the package, so this page cannot drift from it. Roles change with the theme; the named colors do not.
Named colors
The palette itself, for illustration, print and the places a role does not fit. Components use roles.
Laser, THE primary. Fills the main button and the New badge; draws path lines, the 8 and the dot in the wordmark, the inner focus ring, the active tab bar, link underlines and italic display emphasis at 24px or larger (18.7px bold). Never small text on dark: 3.22:1 on Void, 3.08:1 on Deck, so lines and large type only, each line with a partner. On light 5.61:1 on Paper. White on it 6.12:1, Frost on it 5.45:1. Use it through accent and accent-fill.
Scanner, the deep red. The quiet (second) button and Live badge fill, the pressed main button, and the soft glow under a Laser line on dark. Only 1.50:1 from Laser, so never place the two as neighbors that must be told apart. White on it 9.18:1, Frost on it 8.17:1.
Pressed state of the quiet button (quiet-press). White on it 11.76:1.
Ember, the outcome. A SHAPE color: the end node of the mark, the lit bulb, the one lit chart series, the sweep head, a highlight behind Ink. Never a word on light (2.92:1 on Paper); on light every Ember shape gets an Ink outline (2px on chart marks, 3px on larger shapes). Ink on it 5.71:1. 6.19:1 on Void.
Lit words on dark: units, lit figures and lit labels (lit-text in the dark theme). 9.64:1 on Void, 7.85:1 on Rail, the lowest.
Lit words on light (lit-text in the light theme). 5.43:1 on Paper, 4.57:1 on Shelf (the lowest), so it passes as text on every light surface. Prints as a deep orange that holds on uncoated stock.
Void: the dark page, the well on light pages, social tiles, the cover band of the Map PDF. surface-0 in the dark theme.
Deck: cards on dark (surface-1).
Plate: raised panels, menus, toasts and tooltips on dark (surface-2, inverse-surface).
Rail: rails, hover rows and disabled fills on dark (surface-3).
Frost: headings and primary text on dark (text-1), the partner of every Laser line on dark, and the core of the sweep head. 17.55:1 on Void.
Mist: body text on dark (text-2). 10.54:1 on Rail, the lowest.
Fog: captions, metadata and disabled text on dark (text-3). 5.56:1 on Rail, the lowest.
Paper: the light page (surface-0 in the light theme), Substack web background, form pages.
Sheet: cards, fields and menus on light (surface-1).
Tray: raised panels and placeholders on light (surface-2).
Shelf: hover rows and disabled fills on light (surface-3).
Ink: headings and primary text on light (text-1), the partner of every Laser line on light, the outline on Ember shapes, the text on an Ember highlight. 16.66:1 on Paper.
Slate: body text on light (text-2). 8.61:1 on Shelf, the lowest.
Ash: captions, metadata and disabled text on light (text-3). 4.83:1 on Shelf, the lowest.
Moss, success text on dark (success-text in the dark theme). Status only. 4.52:1 at the lowest, on its tint and on surface-0 to surface-3.
Moss deep, success text on light (success-text in the light theme). Status only. 4.54:1 at the lowest, on its tint and on surface-0 to surface-3.
Moss night, the success tint on dark (success-tint). Status only: the fill behind a success badge.
Moss mist, the success tint on light (success-tint). Status only: the fill behind a success badge.
Moss rim, the success border on dark (success). Status only. 3.03:1 at the lowest, on its tint and on surface-0 to surface-2.
Moss bright, the success border on light (success). Status only. 3.03:1 at the lowest, on its tint and on surface-0 to surface-2.
Tide, info text on dark (info-text in the dark theme). Status only. 4.53:1 at the lowest, on its tint and on surface-0 to surface-3.
Tide deep, info text on light (info-text in the light theme). Status only. 4.51:1 at the lowest, on its tint and on surface-0 to surface-3.
Tide night, the info tint on dark (info-tint). Status only: the fill behind an info badge.
Tide mist, the info tint on light (info-tint). Status only: the fill behind an info badge.
Tide rim, the info border on dark (info). Status only. 3.03:1 at the lowest, on its tint and on surface-0 to surface-2.
Tide bright, the info border on light (info). Status only. 3.03:1 at the lowest, on its tint and on surface-0 to surface-2.
Brass, warning text on dark (warning-text in the dark theme). Status only. 4.51:1 at the lowest, on its tint and on surface-0 to surface-3.
Brass deep, warning text on light (warning-text in the light theme). Status only. 4.56:1 at the lowest, on its tint and on surface-0 to surface-3.
Brass night, the warning tint on dark (warning-tint). Status only: the fill behind a warning badge.
Brass mist, the warning tint on light (warning-tint). Status only: the fill behind a warning badge.
Brass rim, the warning border on dark (warning). Status only. 3.00:1 at the lowest, on its tint and on surface-0 to surface-2.
Brass bright, the warning border on light (warning). Status only. 3.03:1 at the lowest, on its tint and on surface-0 to surface-2.
Color roles
Each role resolves to a different named color in each theme. The swatches below are pinned to data-theme="light" and data-theme="dark", whatever mode the page is in.
| Role | Light | Dark | Use |
|---|---|---|---|
surface-0 | Paper #F8F4F3 | Void #0D0A0A | Page background: Paper (light), Void (dark). |
surface-1 | Sheet #FFFFFF | Deck #151010 | Cards, fields, tables: Sheet (light), Deck (dark). |
surface-2 | Tray #F1EBEA | Plate #1E1616 | Raised panels and placeholders; on dark also menus and skeleton blocks: Tray (light), Plate (dark). |
surface-3 | Shelf #E8E0DF | Rail #2B1E1E | Rails, hover and selected rows in menus and tables, disabled fills; on light also skeleton blocks: Shelf (light), Rail (dark). |
line | #DED4D3 | #382828 | Hairlines: card borders, table rows, dividers, tab list rule. Decorative only; never the only edge of a control. |
edge | #847978 | #756B6A | Borders that must be seen: field outlines, the ghost button, checkbox and radio rings, switch track, dashed placeholders. At least 3.57:1 on light surfaces 0 to 2 and 3.44:1 on dark surfaces 0 to 2 (3:1 floor for control borders); on Rail it drops to 3.11:1, so controls do not sit on Rail. |
text-1 | Ink #1A1414 | Frost #F4F1F0 | Headings, labels, primary text, icons, button text on quiet and ghost: Ink (light), Frost (dark). Lowest across |
text-2 | Slate #423939 | Mist #D6D0CF | Body copy on |
text-3 | Ash #685E5D | Fog #9F9695 | Captions, metadata, placeholders, Courier labels and disabled text on |
accent | Laser #BC2525 | Laser #BC2525 | Laser as a line or mark: path lines, the 8 and the dot, the inner focus ring, link underlines, the active tab bar, italic display emphasis at 24px or larger. Not small text (rule 1). |
accent-fill | Laser #BC2525 | Laser #BC2525 | The main button and the New badge. One main button per view. |
accent-ink | #FFFFFF | Frost #F4F1F0 | Text and icons on |
accent-press | Scanner #8C1B1B | Scanner #8C1B1B | The main button while pressed, with a dark inset and a light edge. |
accent-quiet | Scanner #8C1B1B | Scanner #8C1B1B | The quiet (second) button and the Live badge. |
quiet-ink | #FFFFFF | Frost #F4F1F0 | Text on |
quiet-press | Scanner-deep #6F1414 | Scanner-deep #6F1414 | The quiet button while pressed. |
lit | Ember #D97706 | Ember #D97706 | The outcome as a shape: the mark's end node, the bulb, the one lit chart series, the sweep head, the first item in a plan. On light, give it an Ink outline. |
lit-ink | #1A0E00 | #1A0E00 | Strokes and glyphs drawn on a |
lit-text | Burnt #A34A05 | Amber #F0A64B | Lit words: units, lit figures, the lit label in a chart. Burnt on light (lowest 4.57:1), Amber on dark (lowest 7.85:1). Never Ember as text. |
glow | Scanner #8C1B1B | Scanner #8C1B1B | The soft glow under a Laser line: Scanner, 16 to 18px wide, blurred 5 to 6px, at 90%. Dark grounds only. In the light theme use it only inside a |
partner | Ink #1A1414 | Frost #F4F1F0 | The partner of every Laser line and the outer focus ring: Ink (light), Frost (dark). Carries the shape for red-blind viewers: Laser on Void falls to 2.33:1 in a protanopia simulation, Frost on Void stays 17.53:1. |
well | Void #0D0A0A | Void #0D0A0A | The dark well that anything giving off light sits in on a light page: the mark at hero size, the trace, the sweep track, hero bands, the Map cover band. |
error | Laser #BC2525 | Laser #BC2525 | Error borders (2px). Always with an icon and the word Error in text-1; the red never carries the message alone. Among status messages only errors are red. |
success | Moss-bright #2D9A55 | Moss-rim #268348 | The success border (status only), always with its icon and word in a badge. 3.03:1 light, 3.03:1 dark at the lowest on its tint and |
success-text | Moss-deep #1B733B | Moss #27A555 | The success word and icon (status only): Moss deep on light, Moss on dark. Lowest 4.54:1 light, 4.52:1 dark, on its tint and |
success-tint | Moss-mist #D9F2E2 | Moss-night #10301C | The success fill (status only), behind |
info | Tide-bright #4085E0 | Tide-rim #216BCB | The info border (status only), always with its icon and word in a badge. 3.03:1 light, 3.03:1 dark at the lowest on its tint and |
info-text | Tide-deep #1862C4 | Tide #428AE8 | The info word and icon (status only): Tide deep on light, Tide on dark. Lowest 4.51:1 light, 4.53:1 dark, on its tint and |
info-tint | Tide-mist #DEE9F7 | Tide-night #0F233E | The info fill (status only), behind |
warning | Brass-bright #A48412 | Brass-rim #8E7310 | The warning border (status only), always with its icon and word in a badge. 3.03:1 light, 3.00:1 dark at the lowest on its tint and |
warning-text | Brass-deep #7A6108 | Brass #B4900C | The warning word and icon (status only): Brass deep on light, Brass on dark. Lowest 4.56:1 light, 4.51:1 dark, on its tint and |
warning-tint | Brass-mist #F6EDCB | Brass-night #362D0A | The warning fill (status only), behind |
inverse-surface | Ink #1A1414 | Plate #1E1616 | Toasts and tooltips: Ink on light pages, Plate on dark pages (with an |
inverse-text | #FFFFFF | Frost #F4F1F0 | Text on |
inverse-text-2 | Mist #D6D0CF | Mist #D6D0CF | Secondary text and the close icon on |
scrim | rgba(13, 10, 10, 0.55) | rgba(13, 10, 10, 0.72) | Backdrop behind a dialog: Void at 55% (light), 72% (dark). |
chart-context | Ash #685E5D | #6E6463 | Context series in charts (everything that is not the one lit series): Ash on light (6.27:1 on Sheet), a deeper Fog on dark (3.29:1 on Deck), so the Ember series is the brightest thing in the chart. |
tile-edge | #5E5B5A | #5E5B5A | 1px edge on dark social tiles, share images, carousels and quote cards: Frost at 35% on Void. It keeps a Void tile visible in a dark feed (2.78:1 against a typical dark feed). |
Type
Email-safe system fonts only: font-display is Georgia, "Times New Roman", serif; font-body is Verdana, Geneva, sans-serif; font-wordmark is Verdana, Geneva, sans-serif; font-mono is "Courier New", Courier, monospace.
Display
t-hero4.5rem / 1.05 / 700 / -0.02emBig stat numerals and quote heroes. Georgia has no 900; bold is the heaviest.
t-display3rem / 1.1 / 700 / -0.02emPage H1 and slide titles. One italic Laser phrase allowed (24px+).
t-h12.25rem / 1.15 / 700 / -0.02emt-h21.75rem / 1.15 / 700 / -0.02emt-h31.375rem / 1.2 / 700 / -0.01emBody
t-lead1.125rem / 1.6 / 400 / 0emt-body1rem / 1.65 / 400 / 0emLong reading: offer pages, Substack, the Map.
t-ui0.875rem / 1.5 / 400 / 0emFields, menus, tables, alerts.
t-small0.8125rem / 1.55 / 400 / 0emSecondary text in cards and alerts.
t-eyebrow0.75rem / 1.5 / 700 / 0.24emUppercase eyebrows in text-3, with a 28px Laser tick before them. Never Laser text.
t-badge0.6875rem / 1.2 / 700 / 0.1emBadge capitals. Nothing smaller than this.
Label
t-label0.75rem / 1.5 / 700 / 0.04emCourier New bold labels: captions, series markers, table headers, timestamps.
t-figure0.8125rem / 1.5 / 700 / 0.04emNumbers in tables and charts.
Spacing
| Token | Value | Sample | Use |
|---|---|---|---|
space-0 | 0 | Zero: reset a margin or gap. | |
space-1 | 0.25rem | 4px, the base step. | |
space-2 | 0.5rem | 8px: icon gaps, chip padding. | |
space-3 | 0.75rem | 12px: control gaps, alert and toast gaps. | |
space-4 | 1rem | 16px: alert padding, menu padding. | |
space-5 | 1.5rem | 24px: card padding, grid gutter. | |
space-6 | 2rem | 32px: section padding inside cards. | |
space-7 | 3rem | 48px: between page sections on phones. | |
space-8 | 4rem | 64px: board and hero padding. | |
space-9 | 6rem | 96px: between page sections on desktop. |
Radius
| Token | Value | Sample | Use |
|---|---|---|---|
radius-xs | 5px | Checkbox corners. | |
radius-sm | 8px | Tooltips, menu items, small chips. | |
radius-md | 12px | Buttons, fields, alerts, toasts, menus, tables, swatches. | |
radius-lg | 16px | Cards, dialogs, panels, the PDF cover art. | |
radius-pill | 999px | Badges, chips, the sweep track, the eyebrow tick. |
Shadow
Neutral shadows; the only colored one is the Scanner glow, and only on dark.
| Token | Value | Sample | Use |
|---|---|---|---|
shadow-sm | light 0 1px 2px rgba(26, 20, 20, 0.08) · dark 0 1px 2px rgba(0, 0, 0, 0.40) | Smallest lift: the switch thumb. | |
shadow-md | light 0 6px 18px rgba(0, 0, 0, 0.06) · dark 0 6px 18px rgba(0, 0, 0, 0.35) | Raised cards. | |
shadow-lg | light 0 16px 40px rgba(0, 0, 0, 0.12) · dark 0 16px 40px rgba(0, 0, 0, 0.50) | Menus and toasts. | |
shadow-xl | light 0 24px 60px rgba(0, 0, 0, 0.50) · dark 0 24px 60px rgba(0, 0, 0, 0.50) | Dialogs, above the scrim. | |
shadow-glow | light 0 0 0 0 rgba(0, 0, 0, 0) · dark 0 0 0 1px rgba(140, 27, 27, 0.60), 0 8px 32px rgba(140, 27, 27, 0.55) | The soft Scanner glow around the one focal element on dark. Empty in the light theme (a zero shadow, so it can be listed beside another): light never glows on paper; put the element in a |
Border
| Token | Value | Use |
|---|---|---|
border-width | 1px | Hairlines, cards, menus, tables, the toast and tooltip edge. |
border-width-bold | 2px | Fields, the ghost button, checkbox and radio rings, the switch track, error borders, each ring of the focus ring. |
border-width-tab | 3px | The active tab bar, the AccentHeadline underline, the eyebrow tick. |
Breakpoints
| Token | Value | Use |
|---|---|---|
bp-sm | 640px | Large phone. Reference value: media queries use the literal. |
bp-md | 768px | Tablet. The grid collapses to 6 columns. |
bp-lg | 1024px | Laptop. |
bp-xl | 1280px | Desktop. |
Layout
| Token | Value | Use |
|---|---|---|
grid-columns | 12 | Columns in |
grid-gutter | 1.5rem | 24px gap in |
measure | 66ch | Ideal reading width for body copy. |
container-max | 1120px | Maximum width of |
Stacking
| Token | Value | Use |
|---|---|---|
z-base | 0 | Stacking base. |
z-raised | 10 | Cards lifted off the page. |
z-sticky | 100 | The sticky site header. |
z-dropdown | 1000 | Menus and selects. |
z-overlay | 2000 | The scrim behind a dialog. |
z-modal | 2100 | Dialogs. |
z-toast | 3000 | Toasts. |
z-tooltip | 4000 | Tooltips, always on top. |
Font weight
Georgia, Verdana and Courier New ship regular and bold only.
| Token | Value | Use |
|---|---|---|
fw-regular | 400 | Body copy; italic display emphasis. |
fw-bold | 700 | Headlines, labels, buttons, the wordmark, Courier labels and numbers. |
Font size
| Token | Value | Use |
|---|---|---|
fs-hero | 4.5rem | 72px: big stat and quote hero. |
fs-display | 3rem | 48px: page H1 and slide titles. |
fs-h1 | 2.25rem | 36px. |
fs-h2 | 1.75rem | 28px. |
fs-h3 | 1.375rem | 22px: dialog titles. |
fs-lg | 1.125rem | 18px: lead. |
fs-base | 1rem | 16px: body. |
fs-sm | 0.875rem | 14px: buttons, fields, secondary text. |
fs-xs | 0.75rem | 12px: eyebrows, Courier labels, captions. |
fs-badge | 0.6875rem | 11px: badges, the smallest text in the system (bold capitals only). |
Line height
| Token | Value | Use |
|---|---|---|
lh-tight | 1.05 | Big numerals and the hero. |
lh-snug | 1.15 | Headlines. |
lh-normal | 1.5 | UI text and labels. |
lh-relaxed | 1.65 | Long-form reading. |
Letter spacing
| Token | Value | Use |
|---|---|---|
ls-tight | -0.02em | Georgia headlines. |
ls-normal | 0em | Default tracking. |
ls-label | 0.04em | Courier New labels and numbers. |
ls-badge | 0.1em | Badge capitals. |
ls-eyebrow | 0.24em | Uppercase Verdana eyebrows. |
ls-wordmark | -0.03em | The G8N•AI wordmark. |
Motion
Motion timings and easing, so code matches the boards. Every moving part has a reduced-motion state.
| Token | Value | Use |
|---|---|---|
dur-press | 80ms | Button press: a 1px drop and the inset appear. |
dur-hover | 120ms | Hover: the edge fades in. |
dur-ui | 200ms | Menus, dialogs and toasts opening and closing; tab and accordion changes. |
dur-sweep | 1.6s | Sweep B and the Frost-only sweep, back and forth (alternate). |
dur-sweep-ambient | 2s | Sweep A, the plain ambient sweep, back and forth. |
dur-signal | 4s | The signal trace loop: red pulses in, one Ember pulse with a Frost core out, the bulb lights. |
ease-out | cubic-bezier(0.22, 1, 0.36, 1) | The one easing for UI: settled, never springy, no bounce. |
ease-sweep | ease-in-out | The sweeps, so the head slows at each end. |
1.x to 2.0 token map
Every 1.x name that 2.0 renames or retires, and what to use now. The 1.x dark-mode class is now data-theme="dark", and the Tailwind layer is gone: read the --* variables through styles.css.
| 1.x | 2.0 |
|---|---|
surface-page, color-surface, g8n-cream / g8n-charcoal | surface-0 |
surface-card, surface-raised, color-surface-raised | surface-1 (raised panels: surface-2) |
surface-rule, border-subtle, color-border, g8n-rule | line |
border-ink, color-border-strong | edge (control borders) or text-1 |
text-strong, color-text, g8n-navy | text-1 |
text-body, color-text-muted | text-2 |
text-muted, text-faint, color-text-faint | text-3 |
text-on-accent | accent-ink |
accent, color-focal, g8n-orange | accent (the path, focus, emphasis) or lit (the outcome, the end node) |
accent-hover, color-focal-hover, g8n-orange-hover | accent-press (hover is now an edge, not a color) |
accent-glow, g8n-orange-glow | glow (dark only) |
accent-wash, color-focal-wash, tint-orange | retired; to make a figure pop on light, Ink on lit |
g8n-orange-soft | amber (lit-text on dark) |
color-surface-inverse / color-text-inverse | inverse-surface / inverse-text |
status-danger, color-danger (and its tint, border, text) | error for the 2px border; the icon and text stay text-1 |
status-success, status-warning, status-info (and tints, borders, texts) | success, warning, info (border) with -text and -tint; the status icon and word stay |
g8n-chalk-100 / -300 / -500 | frost / mist / fog |
ink-*, g8n-ink-* | ink, slate, ash (light) |