DESIGN.mdVersion beta
Answerable
A presentation and product design system for a professional development and accountability platform for the built environment. Output must never include a logo, wordmark or brand name. The system has two layers: a quiet Interface layer of utilitarian, modernist components that get out of the way, and a bold Statement layer for headline moments, oversized numbers and quotes. Pure white (#FFFFFF) is the default background and pure black (#000000) the default text colour. A cool neutral scale supports surfaces, secondary text and separators. Four equal accent colours — Coral (#E9895E), Sky Blue (#A8DCE8), Yellow (#F3DD8F) and Green (#98AF48) — are used only for highlights and semantic states, always with black text and square corners, and are rotated so no single accent (especially Coral) dominates. Only three weights of Public Sans are used: Regular (400) for body text, Bold (700) for subheadings and labels, and Black (900) for main headings and big statements. Everything must be readable and clear in all situations. Components are defined by fill, space, typography and elevation — never by outlines or borders.
- Answerable profile
- 0 errors · 0 warnings · 20 info
- Official linter
- 20 errors · 99 warnings · 1 info
01
Output rules
These rules apply every time this system is used to produce a presentation, page or screen.
- No logos. Never draw, insert or imitate a logo, wordmark, monogram, corner marks or any other brand device.
- No brand name. Never write the brand or company name in titles, headers, footers, slide masters, captions or alt text. The only exception is when it appears in the user's own supplied content.
- No brand furniture. No branded title slides, closing slides, taglines, copyright lines or "Presented by" credits.
- Just the presentation. Spend the space on the content. The design language itself (type, colour, shape) is the only identity needed.
02
Overview
Read the rule
Most of what people see is the content: data, arguments, steps and evidence. That content should feel calm and precise. It should be easy to scan and should never compete with the message.
The system also has something to say. Its voice comes through in a small number of deliberate statement moments: a huge number, a confident headline or a black quote panel. These moments are bold because everything around them is quiet.
The system is built from two layers that share one typeface, one colour logic and one shape language.
| Layer | Character | Weights | Colour | Share of a typical screen |
|---|---|---|---|---|
| Interface | Utilitarian, modernist, recessive | Regular 400 for text, Bold 700 for subheadings and labels | White, black, cool neutrals | ~90% |
| Statement | Editorial, confident, oversized | Black 900, with Regular 400 supporting copy | Black, white, one accent highlight | ~10% |
Rule of thumb: use at most one statement moment per screen or slide. If everything shouts, nothing is heard.
Key characteristics
- Pure white (#FFFFFF) is the default background and pure black (#000000) the default text colour.
- A cool neutral scale (#FAFAFA–#18181B) supports fills, secondary text, hover states and separators. It never uses warm greys, beige or cream.
- Four equal accent colours — Coral, Sky Blue, Yellow and Green — are used only for highlights and semantic states. They are rotated so no single accent dominates. They are always paired with black text and always square-cornered.
- Public Sans is used in three weights only:
- Regular (400) for all body text. This is the default.
- Bold (700) for subheadings, labels and buttons.
- Black (900) for main headings and big statements.
- Everything must be readable and clear in all situations: projectors, small screens, bright rooms and print.
- All components are square-cornered. The only exceptions are radio buttons and avatars, which are circular by function.
- Components are defined by fill, space, typography and soft elevation. They never have outlines or perimeter borders.
- Interface separators are 1px neutral lines between rows or groups. Statement dividers are 2–4px black.
- Every interactive element shows a black focus ring on keyboard focus.
For everything you put your name to.
The people who change a practice aren’t always the first to try something new. They’re the ones who make it worthwhile for everyone else.
03
Readability
Every output must be readable and clear in all situations, including projected slides, small laptop screens, bright rooms, screenshots and print. When in doubt, choose the larger size and the stronger contrast.
- Contrast: all text reaches at least 4.5:1 against its background. Pure black on white is the default. Black text on all four accents passes.
- Minimum sizes:
- Regular text is never smaller than 14px.
- Bold labels (badges, eyebrows, table headers) are never smaller than 12px.
- Slides: body text is never smaller than body-lg (18px on a 1280×720 canvas). Scale all sizes proportionally for larger canvases, for example ×1.5 at 1920×1080.
- Muted text: grey text uses neutral-600 only, on white, neutral-50 or neutral-100 surfaces. Never put grey text on black or on an accent. Never use neutral-500 for anything a reader needs.
- Line length: keep paragraphs to around 680px (roughly 60–75 characters) so lines are easy to follow.
- Density on slides: prefer fewer, larger words. If text doesn't fit at the minimum size, split the slide rather than shrinking the type.
- Don't rely on colour alone. Accent highlights and semantic states always come with a label, marker or text that carries the meaning.
04
Colour
Read the rule
Core
- Background (#FFFFFF): the default page, slide and component surface.
- Foreground (#000000): primary text, icons and the default button fill.
- Surface Dark (#000000): tooltips, toasts and statement panels, always with white text.
Neutrals
The neutral scale lets the interface recede. It is cool and slightly blue-grey, never warm.
| Token | Hex | Use |
|---|---|---|
| neutral-50 | #FAFAFA | App shell and sidebar background, table row hover |
| neutral-100 | #F4F4F5 | Input fills, muted cards, tab lists, secondary buttons, skeletons |
| neutral-200 | #E4E4E7 | Interface separators, hover fills, unchecked controls, active nav item |
| neutral-300 | #D4D4D8 | Pressed fills, disabled control fills |
| neutral-500 | #71717A | Disabled states only. Never meaningful text |
| neutral-600 | #52525B | Muted foreground: helper text, metadata, descriptions, placeholders (about 7:1 on white) |
| neutral-800 | #27272A | Hover state on black buttons |
| neutral-900 | #18181B | Pressed state on black buttons |
Muted grey text is for secondary information only. Primary content, headings and anything essential stay pure black.
Accent colours
The four accents have equal status. None is the primary or default.
| Accent | Hex | Highlight use | Semantic role (interface only) |
|---|---|---|---|
| Coral | #E9895E | Highlights, data points, stat blocks, accent button | Destructive / error |
| Sky Blue | #A8DCE8 | Highlights, data points, stat blocks, accent button | Info |
| Yellow | #F3DD8F | Highlights, data points, stat blocks, accent button | Warning |
| Green | #98AF48 | Highlights, data points, stat blocks, accent button | Success |
Accent rotation
- Do not default to Coral. Coral should appear no more often than any other accent.
- Vary by section. Across a presentation or multi-section page, give each section or slide its own accent and cycle through all four. A sensible default order is Sky Blue → Yellow → Green → Coral.
- One accent per slide or local area. Within a single slide or section, use one accent for highlights so the area stays coherent.
- Charts are the exception. All four may be used together as a series palette.
- Choose by meaning when it exists. If the content is positive, cautionary or informational, Green, Yellow or Sky Blue may be chosen to match. Otherwise follow the rotation.
- Never use a run of the same accent. Three or more consecutive slides or sections with the same accent is a mistake.
Accent rules
- Black text only. All four accents pass WCAG AA with black text. Never set text in an accent colour.
- Square corners always. No rounding on any accent-filled element.
- Small areas only. Use accents for badges, markers, chart data, a highlighted word, a single CTA or a stat highlight. Never use them as page, section, slide or card backgrounds.
- Semantic use inside app interfaces: in functional app screens, Coral means destructive or error, so the primary app action stays black. In presentations and statement contexts, Coral is just one of the four rotating highlights.
Core
- background#ffffffoklch(1 0 0)
- foreground#000000oklch(0 0 0)
- on-dark#ffffffoklch(1 0 0)
- on-accent#000000oklch(0 0 0)
- surface-card#ffffffoklch(1 0 0)
- surface-dark#000000oklch(0 0 0)
- overlay#00000080oklch(0 0 0 / 0.502)
- ring#000000oklch(0 0 0)
- rule-statement#000000oklch(0 0 0)
Neutral
- neutral-50#fafafaoklch(0.9851 0 0)
- neutral-100#f4f4f5oklch(0.9674 0.0013 286.37)
- neutral-200#e4e4e7oklch(0.9197 0.004 286.32)
- neutral-300#d4d4d8oklch(0.8711 0.0055 286.29)
- neutral-500#71717aoklch(0.5517 0.0138 285.94)
- neutral-600#52525boklch(0.4419 0.0146 285.79)
- neutral-800#27272aoklch(0.2739 0.0055 286.03)
- neutral-900#18181boklch(0.2103 0.0059 285.89)
Accent
- accent-sky#a8dce8oklch(0.8624 0.056 213.44)
- accent-yellow#f3dd8foklch(0.8984 0.1005 94.2)
- accent-green#98af48oklch(0.7151 0.1318 120.42)
- accent-coral#e9895eoklch(0.7238 0.131 44.33)
Semantic
- primary#000000oklch(0 0 0)= foreground
- muted#f4f4f5oklch(0.9674 0.0013 286.37)= neutral-100
- muted-foreground#52525boklch(0.4419 0.0146 285.79)= neutral-600
- separator#e4e4e7oklch(0.9197 0.004 286.32)= neutral-200
- success#98af48oklch(0.7151 0.1318 120.42)= accent-green
- warning#f3dd8foklch(0.8984 0.1005 94.2)= accent-yellow
- info#a8dce8oklch(0.8624 0.056 213.44)= accent-sky
- destructive#e9895eoklch(0.7238 0.131 44.33)= accent-coral
Contrast
Every text-on-fill pair of the roles, against WCAG 2: AA needs 4.5:1 for normal text, 3:1 for large.
| Text on fill | Sample | Contrast | Normal text | Large text |
|---|---|---|---|---|
| foreground on background | Aa | 21.00:1 | AAA | AAA |
| muted-foreground on background | Aa | 7.73:1 | AAA | AAA |
| muted-foreground on muted | Aa | 7.03:1 | AAA | AAA |
| card-foreground on card | Aa | 21.00:1 | AAA | AAA |
| popover-foreground on popover | Aa | 21.00:1 | AAA | AAA |
| primary-foreground on primary | Aa | 21.00:1 | AAA | AAA |
| secondary-foreground on secondary | Aa | 19.11:1 | AAA | AAA |
| accent-foreground on accent | Aa | 19.11:1 | AAA | AAA |
| foreground on input | Aa | 19.11:1 | AAA | AAA |
| destructive-foreground on destructive | Aa | 8.20:1 | AAA | AAA |
| sidebar-foreground on sidebar | Aa | 20.12:1 | AAA | AAA |
| sidebar-primary-foreground on sidebar-primary | Aa | 21.00:1 | AAA | AAA |
| sidebar-accent-foreground on sidebar-accent | Aa | 19.11:1 | AAA | AAA |
| on-dark on surface-dark | Aa | 21.00:1 | AAA | AAA |
| on-accent on highlight-1 | Aa | 14.07:1 | AAA | AAA |
| on-accent on highlight-2 | Aa | 15.55:1 | AAA | AAA |
| on-accent on highlight-3 | Aa | 8.56:1 | AAA | AAA |
| on-accent on highlight-4 | Aa | 8.20:1 | AAA | AAA |
Accent rotation
Sky Blue, Yellow, Green, Coral: one per section, never the same three times in a row.
- 1. accent-sky
- 2. accent-yellow
- 3. accent-green
- 4. accent-coral
05
Typography
Read the rule
Public Sans is the only typeface, and only three weights are used. Weight does the heavy lifting in the hierarchy. Body text is Regular and calm, so the Black moments really land.
- Regular text is never smaller than 14px. Bold labels are never smaller than 12px.
- All text must reach at least 4.5:1 contrast with its background. Prefer pure black.
- On slides, body text is never smaller than body-lg (18px at a 1280×720 canvas); scale proportionally for larger canvases.
Weight roles
| Weight | Role |
|---|---|
| Regular (400) | All body text: paragraphs, lead copy, bullet text, captions, table cells, inputs, inactive nav. This is the default. |
| Bold (700) | Subheadings (H2–H4), form labels, buttons, badges, eyebrows, table headers, active nav. |
| Black (900) | Main headings (H1), statement headlines, big numbers, list markers and statement quotes. Use it whenever you want to make a big statement on screen. |
No other weights. Never use Thin (100), Extra Light (200), Light (300), Medium (500), Semibold (600) or Extra Bold (800).
Heading hierarchy
| Element | Token | Weight | Size | Use |
|---|---|---|---|---|
| H1 | heading-h1 | Black 900 | 36px | Main heading, page or slide title (one per page/slide) |
| H2 | heading-h2 | Bold 700 | 24px | Subheading for major sections, dialog titles |
| H3 | heading-h3 | Bold 700 | 18px | Subsections, card titles |
| H4 | heading-h4 | Bold 700 | 16px | Minor groups, form section titles |
Use headings in semantic order. If a page or slide needs a giant headline, apply a statement style (such as statement-xl) to the H1 element. Do not skip levels.
Full scale
| Token | Size | Weight | Line height | Tracking | Use |
|---|---|---|---|---|---|
| statement-xl | 72px | 900 | 1.0 | -2px | Hero statement |
| statement-lg | 56px | 900 | 1.02 | -1.5px | Section statement |
| statement-md | 40px | 900 | 1.05 | -1px | Highlight panel heading |
| statement-quote | 28px | 900 | 1.2 | -0.4px | Statement quotes |
| number-display | 96px | 900 | 0.9 | -3px | Hero numerals |
| number-stat | 48px | 900 | 1.0 | -1.5px | Headline metrics |
| list-marker | 32px | 900 | 1.0 | -1px | Step markers |
| heading-h1 | 36px | 900 | 1.1 | -0.8px | Main heading |
| heading-h2 | 24px | 700 | 1.25 | -0.3px | Subheading |
| heading-h3 | 18px | 700 | 1.35 | -0.1px | Card / subsection title |
| heading-h4 | 16px | 700 | 1.4 | 0 | Minor heading |
| lead-lg | 28px | 400 | 1.35 | -0.3px | Hero supporting copy |
| lead | 22px | 400 | 1.45 | -0.2px | Intro paragraphs |
| body-lg | 18px | 400 | 1.6 | 0 | Presentation body, long-form reading |
| body-md | 16px | 400 | 1.6 | 0 | Default running text |
| body-sm | 14px | 400 | 1.5 | 0 | Supporting text, descriptions |
| caption | 14px | 400 | 1.4 | 0 | Metadata, helper text, chart labels |
| ui-text | 14px | 400 | 1.43 | 0 | Dense interface text |
| label | 14px | 700 | 1.2 | 0 | Form labels |
| button | 14px | 700 | 1.0 | 0 | Button labels |
| badge | 12px | 700 | 1.0 | 0.1px | Badges |
| table-head | 12px | 700 | 1.3 | 0.2px | Table headers |
| nav-link | 14px | 400 | 1.4 | 0 | Nav items (700 when active) |
| eyebrow | 12px | 700 | 1.2 | 1.2px | Uppercase category labels |
Pairing the extremes
The signature typographic move is a Black headline over Regular body text. The contrast in weight does the work, so no colour, box or decoration is needed. Bold sits between them, only for subheadings and functional labels.
Numbers
Use tabular-nums in tables, metrics and anything that updates or aligns in columns. Right-align numeric table columns.
| Level | Specimen | Size | Weight | Leading | Tracking |
|---|---|---|---|---|---|
| statement-xl | For everything you put your name to. | 72px | 900 | 1 | -2px |
| statement-lg | AI needs that kind of leadership. | 56px | 900 | 1.02 | -1.5px |
| statement-md | Join the founding cohort | 40px | 900 | 1.05 | -1px |
| statement-quote | We hold ourselves answerable for our work. | 28px | 900 | 1.2 | -0.4px |
| number-display | 100+ | 96px | 900 | 0.9 | -3px |
| number-stat | 6 | 48px | 900 | 1 | -1.5px |
| list-marker | 1 2 3 4 | 32px | 900 | 1 | -1px |
| heading-h1 | The AI Lead role | 36px | 900 | 1.1 | -0.8px |
| heading-h2 | Built upon six core values | 24px | 700 | 1.25 | -0.3px |
| heading-h3 | The people behind the programme | 18px | 700 | 1.35 | -0.1px |
| heading-h4 | Join the founding cohort | 16px | 700 | 1.4 | 0 |
| lead-lg | When a client asks how your practice uses AI, the answer should give them another reason to choose you. | 28px | 400 | 1.35 | -0.3px |
| lead | The people who change a practice aren’t always the first to try something new. They’re the ones who make it worthwhile for everyone else. | 22px | 400 | 1.45 | -0.2px |
| body-lg | AI needs that kind of leadership: grounded in the work, generous with colleagues, and clear about what good looks like. | 18px | 400 | 1.6 | 0 |
| body-md | An AI Lead helps build the substance behind that answer: better ways of working, colleagues who know how to use the tools well, and standards the practice can explain and uphold. | 16px | 400 | 1.6 | 0 |
| body-sm | We’re limiting the founding cohort to give participants the support and assessment the programme requires. | 14px | 400 | 1.5 | 0 |
| caption | Registering interest does not reserve a place or commit you to enrol. | 14px | 400 | 1.4 | 0 |
| ui-text | Leave your email and we’ll send you programme details and let you know when enrolment opens. | 14px | 400 | 1.43 | 0 |
| label | 14px | 700 | 1.2 | 0 | |
| button | Register your interest | 14px | 700 | 1 | 0 |
| nav-link | Core values | 14px | 400 | 1.4 | 0 |
| nav-link-active | The AI Lead role | 14px | 700 | 1.4 | 0 |
| badge | Founding cohort | 12px | 700 | 1 | 0.1px |
| eyebrow | Accreditation | 12px | 700 | 1.2 | 1.2px |
| table-head | Contrast | 12px | 700 | 1.3 | 0.2px |
| numeric | 0123456789 | none | none | none | none |
Weights
- Regular 400Body text: paragraphs, captions, table cells, inputs
- Bold 700Subheadings, labels, buttons, badges
- Black 900Main headings, statements, big numbers
Reading width
Paragraphs stop at prose-max.
When a client asks how your practice uses AI, the answer should give them another reason to choose you.
An AI Lead helps build the substance behind that answer: better ways of working, colleagues who know how to use the tools well, and standards the practice can explain and uphold.
06
Shape
Read the rule
Everything is square. A single radius of 0 applies to every button, input, card, menu, dialog, tab, badge, toast and tooltip. This keeps the family coherent: a square button never sits awkwardly inside a rounded card.
The only exceptions are radio buttons and avatars. They use rounded.full because the circle is part of their meaning. Neither may be accent-filled.
Square
Every button, input, card, badge and accent element: radius: 0px
Round by function
Radio buttons and avatars only, never accent-filled: radius-full: 9999px
07
Lines, separators and focus
Read the rule
Never use outlines or perimeter borders. No component is drawn by a stroke around its edge. Shape comes from fill, elevation and space.
There are two kinds of line, and both are standalone separators that never enclose anything.
| Line | Spec | Use |
|---|---|---|
| Interface separator | 1px, neutral-200 | Table rows, menu groups, beneath the top nav, between settings rows |
| Statement divider | 2px / 3px / 4px, black | Major editorial section breaks on statement pages and slides |
Do not use black statement dividers inside dense interface areas, and do not use faint 1px lines on statement pages.
Focus ring: every interactive element shows 0 0 0 2px #FFFFFF, 0 0 0 4px #000000 on :focus-visible. This is a temporary state indicator required for accessibility, not a border. Never remove it.
Interface separator
Between rows and groups, never around them: line-separator-width: 1px
1We hold ourselves answerable for our work.
2We use AI only where we are competent to do so.
3We are honest about how we use AI.
4We respect the intellectual and creative work of others.
Statement divider
Major editorial breaks on statement pages and slides, in black.
standard, 2px
emphasis, 3px
heavy, 4px
Focus ring
On :focus-visible for every interactive element; press Tab to move it: focus-ring: 0 0 0 2px #FFFFFF, 0 0 0 4px #000000
08
Layout
Read the rule
- Spacing: 4px base unit. Use the spacing scale only.
- Controls: 32px (sm), 36px (default) and 40px (lg) heights. 48px is reserved for statement-layer CTAs.
- App shell:
- 56px top nav with a 1px separator beneath and a page title at left. No logo.
- Optional 256px neutral-50 sidebar.
- Content area on white or neutral-50.
- Cards on surfaces:
- On a white page, use
card-muted, which has a neutral-100 fill and no shadow. - On a neutral-50 shell, use
card, which has a white fill and xs shadow. - Never place a white card with no shadow on a white page.
- On a white page, use
- Content width:
- 1200px maximum for app layouts.
- 680px maximum for long-form reading.
- Density: interface screens are compact (16–24px gaps). Statement sections and slides are generous (64–96px vertical padding).
- Grid: 12 columns for app layouts. Editorial square-tile grids (3 / 2 / 1 columns) for presentations and statement pages.
Join the founding cohort
card-muted, on white
nav-height: 56pxsidebar-width: 256pxcontent-max: 1200pxprose-max: 680px
09
Elevation
Read the rule
Elevation separates floating layers from the page without outlines. Shadows are soft, neutral and always blurred.
| Token | Use |
|---|---|
| xs | Cards on neutral-50 shells, active tab, switch thumb |
| sm | Sticky headers, raised cards on hover |
| md | Dropdowns, popovers, comboboxes |
| lg | Dialogs, toasts, sheets |
Never use a zero-blur or spread-only shadow. That is an outline in disguise.
Statement components (quote panels, highlight panels, hero) are flat. Their contrast comes from solid black and white, not shadow.
Statement panels take their contrast from solid black and white, not shadow.
Shadows must always have blur. Never use zero-blur or spread-only shadows that imitate an outline.
10
Components — Interface layer
Read the rule
These components should feel familiar to anyone who has used a modern app. They are neutral, predictable and quiet.
Buttons
| Variant | Appearance | Use |
|---|---|---|
| Default | Black fill, white Bold label | The primary action in a view |
| Secondary | neutral-100 fill, black label | Alternative actions |
| Ghost | Transparent, neutral-100 on hover | Toolbars, tertiary actions, icon buttons |
| Link | Text only, 2px underline on hover | Inline navigation |
| Destructive | Coral fill, black label | Delete, remove, irreversible actions |
All buttons are square, 36px tall by default and have no outline. Use one Default button per view region. Icons are 16px with an 8px gap from the label.
Form controls
- Input, textarea, select:
- neutral-100 fill, square, no border, Regular text.
- Hover deepens the fill to neutral-200.
- Focus switches to a white fill with the black focus ring.
- Label: 14px Bold, 8px above the field.
- Helper text: 14px Regular in muted-foreground, 6px below the field.
- Errors:
- Place a small square Coral marker beside the label.
- Show the error message as black helper text.
- Never use red or Coral text.
- Checkbox: 16px square. Unchecked is neutral-200. Checked is a black fill with a white check.
- Radio: 16px circle. Unchecked is neutral-200. Checked is a black fill with a white dot.
- Switch: square 36×20 track (neutral-200 off, black on) with a white square thumb.
Surfaces
- Card: white, xs elevation, 24px padding. Bold H3 title with a Regular body-sm description beneath in muted-foreground.
- Card (muted): neutral-100 fill, no shadow. Use on white pages.
- Dialog:
- White, lg elevation, 50% black overlay, 24px padding, 480px max width.
- Bold H2 title.
- Actions right-aligned: Secondary, then Default.
- Dropdown menu / popover:
- White, md elevation, 4px inner padding.
- Menu items are 32px tall with a neutral-100 hover.
- Groups are divided by interface separators.
Navigation
- Top nav: white, 56px, 1px separator beneath. Page title at left (no logo), nav links in Regular (Bold when active), actions at right.
- Sidebar:
- neutral-50 background.
- Items are 36px tall, with a neutral-100 hover.
- The active item has a neutral-200 fill and Bold text.
- Group labels use the eyebrow style in muted-foreground.
- Tabs:
- The tab list sits on a neutral-100 fill.
- The active trigger is white with xs elevation and Bold text.
- Inactive triggers use Regular muted-foreground text.
Feedback
- Badge: neutral-100 fill or an accent fill, black 12px Bold, square, 4px × 8px padding.
- Alert:
- neutral-100 fill.
- An 8px square accent marker sits beside a Bold title, indicating the semantic type.
- Regular body text.
- Toast: black surface, white Regular text, lg elevation.
- Tooltip: black, white 14px Regular text.
- Skeleton: neutral-100 with a gentle pulse.
- Progress: neutral-100 track with a black indicator.
Data
- Table:
- Header row in 12px Bold muted-foreground.
- Cells in 14px Regular black.
- 1px neutral-200 row separators.
- neutral-50 row hover and neutral-100 selected rows.
- Tabular, right-aligned numbers.
- No outer border or frame.
- Charts:
- Black for the primary series. All four accents for comparisons and highlights; do not lead with Coral.
- neutral-200 for gridlines.
- Square bar ends.
- Labels in caption style. Label series directly where possible so meaning doesn't depend on colour alone.
Buttons
Default, secondary, ghost, link and destructive at sm, default, lg and xl, then the icon sizes. The accent button belongs to the statement layer: one per screen.
Forms
Filled, square, no border. An invalid field takes a square marker beside its label; its message stays black.
Leave your email and we’ll send you programme details and let you know when enrolment opens.
Surfaces
Card, dialog, dropdown menu, popover and tooltip.
Navigation
Tabs on the muted fill, and the sidebar on neutral-50.
Feedback
Badges, alerts with their square marker, the toast, the skeleton and progress.
Data
A table with tabular, right-aligned figures and a selected row, and a chart in the five chart colours.
| Token | Hex | oklch | Contrast |
|---|---|---|---|
| neutral-50 | #fafafa | oklch(0.9851 0 0) | 1.04:1 |
| neutral-100 | #f4f4f5 | oklch(0.9674 0.0013 286.37) | 1.10:1 |
| neutral-200 | #e4e4e7 | oklch(0.9197 0.004 286.32) | 1.27:1 |
| neutral-300 | #d4d4d8 | oklch(0.8711 0.0055 286.29) | 1.48:1 |
| neutral-500 | #71717a | oklch(0.5517 0.0138 285.94) | 4.83:1 |
| neutral-600 | #52525b | oklch(0.4419 0.0146 285.79) | 7.73:1 |
| neutral-800 | #27272a | oklch(0.2739 0.0055 286.03) | 14.89:1 |
| neutral-900 | #18181b | oklch(0.2103 0.0059 285.89) | 17.72:1 |
11
Components — Statement layer
Read the rule
Use these components to make a point. Limit them to one per screen or slide inside an app. They may appear more freely in presentations, onboarding and report pages.
- Hero statement:
- statement-xl headline in Black, with a lead-lg paragraph in Regular beneath it.
- Optionally followed by a single accent button, with the accent chosen by rotation.
- White background with generous space.
- Stat:
- number-stat (48px Black) with a Regular body-sm label beneath in muted-foreground.
- May use a square accent block as a highlight. When showing several stats in a row, either use one shared accent or none. Never default to Coral.
- Use for headline metrics, ideally 1–4 in a row.
- Stat display: number-display (96px Black) with a Regular lead label, for reports and milestone moments.
- Quote panel:
- Either a black fill with white statement-quote text, or white with black.
- Attribution in Regular body-sm.
- Never accent-coloured and never bordered.
- Highlight panel:
- Black fill with a white statement-md heading and white Regular body text.
- For a key message, milestone or call to commitment.
- Numbered steps:
- 32px Black numerals with a Bold H3 title and Regular body text.
- One marker per item, all the same size.
- Accent button:
- Any one accent fill (by rotation), black Bold label, square, 48px tall.
- One per screen or slide, for the most important action.
- Statement divider: 3px black rule for major editorial breaks.
- Photo tile: full-bleed collage imagery, square, unframed.
Bringing the layers together
A typical dashboard combines both layers:
- Statement: one row of stats in 48px Black numerals.
- Interface: filters, a table, a sidebar and buttons, all quiet and neutral.
A typical presentation inverts the ratio:
- Statement: Black headlines, big numbers, quote panels and numbered steps, with the accent rotating from slide to slide.
- Body: Regular supporting text at body-lg or larger, with Bold subheadings, calm and readable.
- No branding: no logo, no brand name, no branded title or closing slides.
Stat row
One to four metrics; one shared accent or none.
Stat display
For reports and milestone moments.
Quote panels
Black with white, or white with black; never accent-coloured, never bordered.
We hold ourselves answerable for our work.
We use AI to strengthen our professions, not to diminish them.
Highlight panel
For a key message, milestone or call to commitment.
Join the founding cohort
Numbered steps
32px Black numerals, one marker per item, all the same size.
The skills to lead your practice’s approach to AI.
Practical training grounded in six core values, equipping you to guide decisions and help colleagues use AI well.A policy suite your practice can put to work.
Develop your AI policy and handbook with guided resources and templates, shaped around your practice rather than written from scratch.An accreditation others can verify.
Demonstrate your competence through formal examination, and take your place on the public register of Accredited Professionals.A community to keep learning with.
Exchange experience, explore difficult questions, and continue developing alongside fellow AI Leads beyond the programme.
Statement divider
3px black, for major editorial breaks.
12
Lists
- Use numbers for primary list levels and letters (a, b, c) for nested subsections.
- Show exactly one visible marker per item. When using a custom marker, set
list-style: noneon the native list. - Keep all markers in one list at the same size, weight and alignment.
- Interface lists (settings, menus, simple bullets) use body-sized Regular text and markers.
- Statement lists use list-marker (32px Black) numerals.
- Use semantic
<ol>and<ul>markup with nested lists for subsections.
13
Imagery
Imagery follows a heterogeneous architectural collage methodology.
- Visual registers: combine illustrated or painted figures, flat single-colour background buildings, architecturally sourced material textures and clean digital cut-outs.
- Figures: gouache-adjacent, with flat tonal modelling and clean masked silhouettes. Figures in one image should feel like one family.
- Background buildings: flat graphic masses, one colour per building, with simplified flat windows.
- Principal architecture: keeps selective material character, restrained tonal modelling and lightly painted texture.
- Depth: created through overlap, scale, vertical position and tonal hierarchy. Never use blur or haze.
- Overall feel: the result should read as an authored architectural competition board.
- Negative space: pure white. No paper, beige or cream effects.
- Accents: restrained highlights only, following the same rotation as the page.
- Text in imagery: always black or white, and never placed over busy areas of an image. No logos, brand names or signage branding.
- No frames: no outlines or frames around tiles, figures or collage elements.
- In the app: keep imagery to empty states, onboarding and presentation surfaces. Never place it behind data or forms.
14
Do's and don'ts
Do
- Use only three weights: Regular for body, Bold for subheadings and labels, Black for main headings and statements.
- Default to Regular for all running and UI text.
- Use Black whenever you want to make a big statement on screen.
- Make everything readable in all situations: at least 4.5:1 contrast, Regular text at 14px or larger, slide body text at body-lg or larger.
- Split a crowded slide rather than shrinking the text.
- Rotate accents across sections and slides so all four appear.
- Let the interface recede. Neutral fills, soft elevation and space should define components.
- Limit app screens to one statement moment.
- Use black as the primary button colour inside the app.
- Keep all components square, except radios and avatars.
- Use 1px neutral separators between rows and groups in the interface.
- Use 2–4px black dividers only on statement pages and slides.
- Show the black focus ring on every interactive element.
- Pair every accent fill with black text.
- Use tabular numerals in tables and metrics.
- Use muted grey text only for genuinely secondary information.
Don't
- Don't include a logo, wordmark, corner marks or any brand device.
- Don't write the brand name anywhere in the output.
- Don't add branded title slides, closing slides, footers or taglines.
- Don't use Thin, Light, Medium, Semibold or Extra Bold weights.
- Don't set Regular text below 14px or Bold labels below 12px.
- Don't put grey text on black or accent surfaces, or use neutral-500 for meaningful text.
- Don't rely on colour alone to carry meaning.
- Don't default to Coral, and don't use the same accent on three or more consecutive sections or slides.
- Don't use more than one accent in a single slide or local area (charts excepted).
- Don't draw outlines, borders or perimeter strokes around any component.
- Don't use more than one statement moment per app screen.
- Don't use accent colours for text, quotes, page backgrounds or card backgrounds.
- Don't use Coral for non-destructive actions inside functional app interfaces.
- Don't round buttons, badges, inputs, cards or accent elements.
- Don't use pill-shaped tags or buttons.
- Don't use warm greys, beige, cream or ivory anywhere.
- Don't use zero-blur shadows that imitate an outline.
- Don't combine browser list markers with custom markers.
- Don't skip heading levels for visual effect.
- Don't remove focus indicators.
15
Lint
Google’s official linter reads the base groups; the Answerable profile reads the rest and resolves the references the official linter reports as broken.
Answerable profile0 errors · 0 warnings · 20 infoShow
| Severity | Rule | Path | Message |
|---|---|---|---|
| info | profile-resolved-reference | components.button-default | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.button-secondary | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.button-ghost | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.button-destructive | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.button-icon | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.input | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.card | Reference {elevation.xs} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.card-muted | Reference {elevation.none} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.table | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.dropdown-menu | Reference {elevation.md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.dropdown-menu | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.popover | Reference {elevation.md} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.dialog | Reference {elevation.lg} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.toast | Reference {elevation.lg} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.sidebar | Reference {sizes.sidebar-width} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.top-nav | Reference {sizes.nav-height} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.top-nav | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.separator | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.button-accent | Reference {sizes.control-xl} resolves through the profile; the official linter reports it as broken-ref. |
| info | profile-resolved-reference | components.statement-divider | Reference {lines.statement-emphasis} resolves through the profile; the official linter reports it as broken-ref. |
Official linter20 errors · 99 warnings · 1 infoShow
| Severity | Rule | Path | Message |
|---|---|---|---|
| error | broken-ref | components.button-default | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.button-secondary | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.button-ghost | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.button-destructive | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.button-icon | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.input | Reference {sizes.control-md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.card | Reference {elevation.xs} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.card-muted | Reference {elevation.none} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.table | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.dropdown-menu | Reference {elevation.md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.dropdown-menu | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.popover | Reference {elevation.md} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.dialog | Reference {elevation.lg} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.toast | Reference {elevation.lg} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.sidebar | Reference {sizes.sidebar-width} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.top-nav | Reference {sizes.nav-height} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.top-nav | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.separator | Reference {lines.interface-separator} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.button-accent | Reference {sizes.control-xl} resolves through the profile; the official linter reports it as broken-ref. |
| error | broken-ref | components.statement-divider | Reference {lines.statement-emphasis} resolves through the profile; the official linter reports it as broken-ref. |
| warning | none | typography.eyebrow.textTransform | 'textTransform' is not a recognized typography property. Valid properties: fontFamily, fontSize, fontWeight, lineHeight, letterSpacing, fontFeature, fontVariation. |
| warning | none | typography.numeric.fontVariantNumeric | 'fontVariantNumeric' is not a recognized typography property. Valid properties: fontFamily, fontSize, fontWeight, lineHeight, letterSpacing, fontFeature, fontVariation. |
| warning | broken-ref | components.button-default.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-default.pressed | 'pressed' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-secondary.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-secondary.pressed | 'pressed' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-ghost.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-link.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-destructive.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-icon.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-icon.iconSize | 'iconSize' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.input.placeholderColor | 'placeholderColor' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.input.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.input.focus | 'focus' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.input.invalid | 'invalid' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.textarea.inherits | 'inherits' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.textarea.minHeight | 'minHeight' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.select.inherits | 'inherits' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.select.chevron | 'chevron' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.label.gap | 'gap' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.checkbox.unchecked | 'unchecked' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.checkbox.checked | 'checked' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.radio.unchecked | 'unchecked' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.radio.checked | 'checked' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.switch.track | 'track' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.switch.off | 'off' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.switch.on | 'on' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.switch.thumb | 'thumb' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.card.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.card.titleTypography | 'titleTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.card.descriptionTypography | 'descriptionTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.card.descriptionColor | 'descriptionColor' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.card-muted.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.badge-accent.variants | 'variants' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.alert.marker | 'marker' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.tabs.list | 'list' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.tabs.trigger | 'trigger' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.tabs.triggerActive | 'triggerActive' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.headTypography | 'headTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.headColor | 'headColor' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.cellTypography | 'cellTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.rowSeparator | 'rowSeparator' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.rowHover | 'rowHover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.rowSelected | 'rowSelected' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.numbers | 'numbers' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.table.cellPadding | 'cellPadding' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dropdown-menu.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dropdown-menu.item | 'item' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dropdown-menu.itemHover | 'itemHover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dropdown-menu.groupSeparator | 'groupSeparator' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.popover.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dialog.overlay | 'overlay' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dialog.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dialog.titleTypography | 'titleTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.dialog.maxWidth | 'maxWidth' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.toast.elevation | 'elevation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.sidebar.item | 'item' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.sidebar.itemHover | 'itemHover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.sidebar.itemActive | 'itemActive' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.sidebar.groupLabel | 'groupLabel' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.top-nav.left | 'left' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.top-nav.bottomSeparator | 'bottomSeparator' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.avatar.initials | 'initials' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.skeleton.animation | 'animation' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.progress.track | 'track' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.progress.indicator | 'indicator' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.separator.line | 'line' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-accent.hover | 'hover' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.button-accent.usage | 'usage' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.hero-statement.headline | 'headline' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.hero-statement.lead | 'lead' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat.number | 'number' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat.label | 'label' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat.labelColor | 'labelColor' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat.highlight | 'highlight' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat-display.number | 'number' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.stat-display.label | 'label' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.quote-panel-black.attribution | 'attribution' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.highlight-panel-black.headingTypography | 'headingTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.highlight-panel-black.bodyTypography | 'bodyTypography' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.numbered-steps.marker | 'marker' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.numbered-steps.title | 'title' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.numbered-steps.body | 'body' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.numbered-steps.gap | 'gap' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | broken-ref | components.statement-divider.line | 'line' is not a recognized component sub-token. Valid sub-tokens: backgroundColor, textColor, typography, rounded, padding, size, height, width. |
| warning | contrast-ratio | components.button-ghost | textColor (#000000) on backgroundColor (#00000000) has contrast ratio 1.00:1, below WCAG AA minimum of 4.5:1. |
| warning | contrast-ratio | components.button-link | textColor (#000000) on backgroundColor (#00000000) has contrast ratio 1.00:1, below WCAG AA minimum of 4.5:1. |
| warning | orphaned-tokens | colors.accent-sky | 'accent-sky' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.accent-yellow | 'accent-yellow' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.accent-green | 'accent-green' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.neutral-500 | 'neutral-500' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.ring | 'ring' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.rule-statement | 'rule-statement' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.success | 'success' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.warning | 'warning' is defined but never referenced by any component. |
| warning | orphaned-tokens | colors.info | 'info' is defined but never referenced by any component. |
| info | token-summary | none | Design system defines 29 colors, 26 typography scales, 3 rounding levels, 13 spacing tokens, 42 components. |
| warning | token-like-ignored | sizes | "sizes" looks like a design-token map but is not a recognized schema key (colors, typography, spacing, rounded, components). It will be silently ignored by export commands. Rename it to a supported key or move its values under a recognized section. |
| warning | token-like-ignored | lines | "lines" looks like a design-token map but is not a recognized schema key (colors, typography, spacing, rounded, components). It will be silently ignored by export commands. Rename it to a supported key or move its values under a recognized section. |
| warning | token-like-ignored | motion | "motion" looks like a design-token map but is not a recognized schema key (colors, typography, spacing, rounded, components). It will be silently ignored by export commands. Rename it to a supported key or move its values under a recognized section. |