Skip to content

Design Atlas design system ​

The identity of the Design Atlas website, a VitePress theme in site/.vitepress/. Tokens live in site/.vitepress/theme/style.css.

Overview ​

  • Surface: reading, with product density on the lists.
  • Audience and job: designers, developers and coding agents picking a reviewed reference and checking its licence and agent channels first, on desktop or phone, in either theme.
  • Subject world: the back of a printed atlas: gazetteer, legend, survey date, contour brown and water blue.
  • Signature element: the gazetteer row. Name and description, then four slots in a fixed order: verdict, licence class, agent channels, reviewed date. A header labels the columns when they fit; a legend explains the licence badges.
  • Share identity: the original gazetteer mark is a light/dark SVG favicon; the 1200 × 630 PNG social card uses the same ink, paper, sienna, rule and Montagu Slab without images from reviewed sites.
  • Will not: screenshot card grids, a gradient hero, a purple accent, colour-only licence signals, animated lists.

Colors ​

Neutrals lean to hue 165 at chroma 0.004 to 0.018 (C3); the accent is sienna at hue 55; water blue is the focus ring only. Dark surfaces step lighter per level (C6). The dark column is :root.dark.

TokenLightDarkOKLCH (light)JobPairs (measured)
bg#F6FAF8#1218150.982 0.006 165Page
surface#ECF3EF#191F1C0.957 0.009 165Sidebar, legend, facts panel, table header, code
surface-raised#FAFEFC#2027240.993 0.004 165Topic cards, search field, buttons
border#D7DFDB#3139350.895 0.010 165Row rules and card edges; decorative, below 3:1 on purpose
border-control#79837E#6D77720.600 0.014 165Edges of the search field and buttonsui on bg 3.72:1 / 3.88:1; ui on surface 3.48:1 / 3.61:1; ui on surface-raised 3.85:1 / 3.29:1
text#18231E#E5EDE90.245 0.018 165Body, titles, row namestext on bg 15.37:1 / 15.10:1; text on surface 14.36:1 / 14.05:1; text on surface-raised 15.91:1 / 12.80:1; text on accent-soft 13.29:1 / 11.64:1; text on success-soft 13.91:1 / 11.83:1; text on warning-soft 13.76:1 / 11.69:1; text on danger-soft 13.67:1 / 11.89:1
text-muted#525E58#A5AFAA0.470 0.018 165Descriptions, metadata, look-only badgetext on bg 6.43:1 / 7.98:1; text on surface 6.01:1 / 7.43:1; text on surface-raised 6.66:1 / 6.76:1
accent#974E0C#E6A3750.505 0.120 55Links, current-page mark, sidebar indicatortext on bg 5.85:1 / 8.45:1; text on surface 5.46:1 / 7.86:1; text on surface-raised 6.05:1 / 7.16:1
accent-strong#723D12#EFC4A80.420 0.092 55Link hover, search-match texttext on bg 8.34:1 / 11.25:1; text on accent-soft 7.21:1 / 8.67:1
accent-soft#FAE5D7#3F27170.935 0.030 55Button hover, search-match highlight
focus#1762B6#81B4F60.500 0.150 255Focus ring onlyui on bg 5.77:1 / 8.39:1; ui on surface 5.39:1 / 7.81:1; ui on surface-raised 5.97:1 / 7.11:1
success#2D693D#85CF950.470 0.095 150Ship licence badgetext on bg 6.23:1 / 9.73:1; text on success-soft 5.64:1 / 7.63:1
success-soft#DFF3E2#1B301F0.945 0.030 150Ship badge fill
warning#7C6009#DDBD6E0.505 0.100 88Conditional licence, stale statustext on bg 5.64:1 / 9.92:1; text on warning-soft 5.05:1 / 7.68:1
warning-soft#F7ECCF#352B140.945 0.040 90Conditional and stale badge fill, warning callout
danger#AD3138#F18B880.505 0.160 22Broken statustext on bg 6.09:1 / 7.53:1; text on danger-soft 5.42:1 / 5.93:1
danger-soft#FDE7E6#4222210.945 0.024 22Broken badge fill, danger callout

Typography ​

  • Families: Montagu Slab for headings (OFL 1.1, bundled from @fontsource-variable/montagu-slab with optical sizing; its licence ships as fonts/montagu-slab-OFL.txt). System sans handles body text consistently across machines; code uses the system monospace stack.
  • Scale: 1.25 from a 16px body (T6), 14px for dense rows (T4), weights 400 and 600 only. Montagu Slab stays at 20px or more and never sets figures; dates and counts use tabular-nums.
RoleSizeWeightLine heightTrackingUse
display31 to 49px, clamp(1.9375rem, 1.2rem + 2.6vw, 3.0625rem)6001.08-0.02emHome title
heading-131px6001.150emPage titles
heading-225px6001.20emSections
heading-320px6001.250emNav title and card titles
body16px4001.550emProse, search input
body-sm14px4001.450emDescriptions, slots, legend, facts, tables
label14px6001.30emRow names, badges, buttons, nav, table headers
code14px4001.50emCode, licence class in the facts panel

Layout and spacing ​

  • Scale: 4 to 48px (L1); gaps between groups at least twice the gaps inside one.
  • Frame: VitePress nav, sidebar and content. Prose at max-width: 68ch (T5); rows and legends span the content width.
  • Home: a short introduction, two paths separated by rules, task-based topic links, and installation commands for compatible agents and Claude Code; the README has its own /readme route. Topics index: cards in repeat(auto-fill, minmax(16rem, 1fr)). Site index: labelled search field, live count, legend and rows, with 50 initially shown and more revealed on demand. Hubs: "All sources" as rows, no table of contents. Site pages: the seven sections beside a 280px facts rail.
  • Density: rows at least 48px with 12px padding; buttons 32px, 44px on coarse pointers (L2); search field 40px.

Elevation and depth ​

  • Strategy: borders (C8), no shadows; the VitePress shadow variables are none. Panels use surface; cards, the search field and buttons use surface-raised with a 1px edge.

Shapes ​

  • sm 4px on badges and inline code; md 6px on the search field, buttons, code blocks, legend and facts panel; lg 10px on topic cards; pill unused. Rows are square.

Components ​

ComponentTokensStates
Linklink, underline offset 0.15emlink-hover; focus ring; external links open in the same tab, no icon
Navnav; title in heading-3; Topics, Sites, DESIGN.md; GitHub icon; local searchCurrent: 2px {colors.accent} bar under the label; hover underline
Sidebar{colors.surface}Current: accent indicator
Search fieldsearch-field, border-control edge, magnifier, visible labelFilters live; Clear with a value; query in ?q=; empty state names the query and offers to clear
Result countbody-sm, role="status", under the field"Showing N of M sites" or "Showing N of M matches"
Buttonbutton, border-control edgebutton-hover; press --scale-press
Home pathsbg, border, accent, text-muted; two columns above 36remWhole links; hover uses surface; one column below 36rem
Home guideborder, accent, text-muted; rule-separated rowsTask links lead to topic hubs
Gazetteer header{colors.surface}, {colors.text-muted}, bottom border, label typeVisible with fixed columns from 52rem; hidden below
Gazetteer rowgazetteer-row, bottom border, name in label, muted description, four slotsgazetteer-row-hover (M9); stale and broken rows add a badge
Legendlegend, above each listExplains the three licence glyphs
Badgebadge-ship, badge-conditional, badge-look-only, badge-broken, glyph plus wordStatic; the licence class is screen-reader text
Topic cardcard, 1px border; title, description, site countOne link; hover edge border-control
Site facts{colors.surface}, {rounded.md}; site, type, verdict, licence, agent channels, pricing, reviewed, noteRail from 1280px, inline under the H1 below; compact label/value rows below 36rem
Codecode-block, code-inline; syntax colours flattened to {colors.text}VitePress copy button
Prose tabletable-headerStatic
CalloutVitePress blocks: warning on {colors.warning-soft}, danger on {colors.danger-soft}, others on {colors.surface}Static; unused so far
  • Icons: Phosphor Regular from @phosphor-icons/core, 16px, in an inline sprite: check, warning, eye, link-break, magnifying-glass.
  • Out of scope: filter chips, a filter rail, sortable columns, a sticky table header, topic tags, tooltips.

Motion ​

TokenValueUsed for
--ease-outcubic-bezier(0.23, 1, 0.32, 1)Button press
--dur-press120msButton press
--scale-press0.97Button press
--dur-hover150msLink, nav, button and card colour
--dur-row-out100msRow highlight fade-out; it appears at 0ms
  • No orchestrated moment (M5); filtering and search results are instant (M8, M14).
  • Reduced motion: the press scale runs only under no-preference; colour changes stay (M11).

Accessibility ​

  • Contrast: WCAG 2.2 AA in both themes, every declared pair recomputed by the repository check.
  • Targets: 24px floor, row name and facts links included; buttons per L2.
  • Focus ring: 2px solid focus, 2px offset; Highlight under forced colours.
  • Structure: VitePress skip link, lang="en", one h1, site sections as h2 in fixed order. Badges pair a glyph with a word.
  • Exceptions: none.

Responsive behaviour ​

BreakpointWhat changes
Row container under 36remSlots wrap under the description, keys shown
Viewport under 36remHome paths stack; site facts use compact label/value rows
Row container 36remSlots stack in a right-hand column
Row container 52remHeader appears; slots take fixed columns (7, 8.5, 9, 6.5rem); keys become screen-reader text
Viewport under 768pxNav links move behind the menu button
Viewport 960pxSidebar stays open
Viewport 1280pxFacts rail appears; below it the facts sit under the H1

Test at 320, 390, 768 and 1280px plus 200% zoom (L3), with no horizontal page scroll at 320px.

Do's and Don'ts ​

  • Do: keep the four slots in order on every list, with a legend above.
  • Do: show a live count under the search field and keep the query in the URL.
  • Do: search the full catalog, including visible licence badge labels, verdict, status and reviewed date, while revealing index rows in groups of 50.
  • Do: write dates as YYYY-MM-DD and "at review" next to counts.
  • Don't: show screenshots, logos or favicons of reviewed sites, or put site lists in cards.
  • Don't: use accent beyond links, the current-page mark and the sidebar indicator.
  • Don't: add shadows, gradients or blur, or animate lists and rows.
  • Don't: use weights other than 400 and 600, or em dashes in UI copy (T11).

Overrides ​

RowProject valueReason
C1Water blue for the focus ring onlyA sienna ring would read as another link state
C5Light and dark from prefers-color-scheme, no toggleLong sessions beside light and dark tools

References ​

Atlas page (sites/<slug>.md)Live example and visual evidenceWhat we adaptedLicence classReviewed
sites/uswds.mdhttps://designsystem.digital.gov/components/overview/, desktop and 375px, 2026-09-27Live count under the filter, underlined titlesmixed; ideas only2026-09-26
sites/nacelle.mdhttps://dotcolon.net/fonts/nacelle/, desktop, 2026-09-27Narrow facts railopen-source-permissive2026-09-27
sites/montagu-slab.mdhttps://fonts.floriankarsten.com/montagu-slab, desktop, 2026-09-27Headings with optical sizing, no figuresopen-source-permissive2026-09-27
sites/ramps.mdnone, toolA ratio beside every colour, recomputedopen-source-permissive2026-09-25
sites/phosphor.mdnone, icon libraryOne set, one weightopen-source-permissive2026-09-25

Agent guide ​

  • New colour: add it to the front matter, both themes in style.css and the Colors table with OKLCH and pairs, then run the check.
  • New state: a suffixed component such as button-hover. New motion value: an Overrides row naming the token.
  • Example requests: "Add a 'New this month' badge." "Review the site index at 320px and 1280px in both themes."
  • Known gaps: prose tables and code blocks keep VitePress padding; no chart palette, syntax colours, print styles or right-to-left test.

Provenance ​

  • Date: 2026-09-27.
  • Read: site/.vitepress/, the design-atlas-ui references and the five atlas pages above.
  • Measured: contrast ratios and OKLCH values, computed from the hex values by the check.
  • Inferred: none; layout values are read from style.css and VitePress, not measured in a browser.
  • Unverified: Montagu Slab's optical sizing on Windows; the Ramps and Phosphor sites.