Skip to content
AuthMantra
Start free trial

Design system

Restrained, rigorous, readable.

Tokens, rules and every component, live. Phase two builds Blueprints and Praxis from these.

Colour

Navy and turquoise stay. Semantic tokens say what a colour is for; the terminal has its own palette.

Brand (fixed)

  • --navy#1A2332 · Brand navy
  • --turquoise#0ABFBC · Brand turquoise

Text and surface

  • --ink#1A2332 · Primary text
  • --ink-2#4A586B · Secondary text
  • --ink-3#5B6B80 · Captions
  • --surface#FFFFFF
  • --surface-2#F6F9FB · Tinted sections
  • --surface-3#E7F8F8 · Accent wash
  • --line#E4EBF2 · Hairlines
  • --line-strong#8795A8 · Control borders

Accent and status

  • --accent#0ABFBC · Fills, large graphics
  • --accent-ink#066E6B · Accent as text
  • --accent-soft#E7F8F8
  • --success#0B6E43
  • --warning#8A5200
  • --danger#A31F1F

Terminal

  • --t-bg#0B0F14 · Screen
  • --t-bar#141B24 · Window bar
  • --t-text#E6EDF3 · Commands
  • --t-green#39FF9B · Output (phosphor)
  • --t-dim#5FB48D · Dim green
  • --t-amber#FFB547 · Warnings
  • --t-cyan#5CE1E6 · Keys

Contrast, every text pair

PairSampleColoursRatioNeedsResult
Body textAaink #1A2332
surface #FFFFFF
15.78:14.5:1AA pass
Body text on tinted surfaceAaink #1A2332
surface-2 #F6F9FB
14.93:14.5:1AA pass
Secondary textAaink-2 #4A586B
surface #FFFFFF
7.24:14.5:1AA pass
Secondary text on tinted surfaceAaink-2 #4A586B
surface-2 #F6F9FB
6.85:14.5:1AA pass
Tertiary text (captions)Aaink-3 #5B6B80
surface #FFFFFF
5.44:14.5:1AA pass
Link / accent textAaaccent-ink #066E6B
surface #FFFFFF
6.09:14.5:1AA pass
Accent text on tinted surfaceAaaccent-ink #066E6B
surface-2 #F6F9FB
5.76:14.5:1AA pass
Accent text on accent-softAaaccent-ink #066E6B
accent-soft #E7F8F8
5.56:14.5:1AA pass
Button label (navy on turquoise)Aanavy #1A2332
accent #0ABFBC
6.91:14.5:1AA pass
Light text on navyAasurface #FFFFFF
navy #1A2332
15.78:14.5:1AA pass
Turquoise on navy (footer links, dark bands)Aaaccent #0ABFBC
navy #1A2332
6.91:14.5:1AA pass
Success textAasuccess #0B6E43
success-soft #E5F6EC
5.63:14.5:1AA pass
Warning textAawarning #8A5200
warning-soft #FFF3DC
5.81:14.5:1AA pass
Danger textAadanger #A31F1F
danger-soft #FDECEC
6.63:14.5:1AA pass
Danger text on whiteAadanger #A31F1F
surface #FFFFFF
7.57:14.5:1AA pass
Body text on teal washAaink #1A2332
wash-teal #DDF6F5
13.96:14.5:1AA pass
Secondary text on teal washAaink-2 #4A586B
wash-teal #DDF6F5
6.41:14.5:1AA pass
Body text on sky washAaink #1A2332
wash-sky #E4EEFA
13.46:14.5:1AA pass
Secondary text on sky washAaink-2 #4A586B
wash-sky #E4EEFA
6.18:14.5:1AA pass
Accent text on teal washAaaccent-ink #066E6B
wash-teal #DDF6F5
5.38:14.5:1AA pass
White on hero gradient (darkest stop)Aasurface #FFFFFF
navy-deep #0E1622
18.16:14.5:1AA pass
Quiet button text (white) on hero gradient lightest stopAasurface #FFFFFF
teal-deep #0B5F63
7.42:14.5:1AA pass
White on hero gradient (teal end)Aasurface #FFFFFF
teal-deep #0B5F63
7.42:14.5:1AA pass
Secondary text on dark band (navy-mid)Aaon-dark #D3DEEA
navy-mid #14263A
11.26:14.5:1AA pass
Secondary text on dark band (band end)Aaon-dark #D3DEEA
grad-end #0F3F52
8.31:14.5:1AA pass
Secondary text on teal-deepAaon-dark #D3DEEA
teal-deep #0B5F63
5.44:14.5:1AA pass
Turquoise on navy-mid (eyebrows on bands)Aaaccent #0ABFBC
navy-mid #14263A
6.72:14.5:1AA pass
Turquoise on band endAaaccent #0ABFBC
grad-end #0F3F52
4.96:14.5:1AA pass
White on CTA gradient (middle)Aasurface #FFFFFF
cta-mid #0A7F82
4.80:14.5:1AA pass
White on CTA gradient (azure end)Aasurface #FFFFFF
azure #1F5FBF
6.09:14.5:1AA pass
Secondary text on hero quick-path card (glass over teal end)Aaon-dark #D3DEEA
glass #0E4B52
7.18:14.5:1AA pass
White heading on hero quick-path cardAasurface #FFFFFF
glass #0E4B52
9.78:14.5:1AA pass
Turquoise arrow on hero quick-path cardAaaccent #0ABFBC
glass #0E4B52
4.28:13.0:1AA pass
White glyph on icon chip (teal-mid)Aasurface #FFFFFF
teal-mid #0B8F8D
3.94:13.0:1AA pass
White glyph on icon chip (azure)Aasurface #FFFFFF
azure #1F5FBF
6.09:13.0:1AA pass
Strong border (inputs, controls)Aaline-strong #8795A8
surface #FFFFFF
3.05:13.0:1AA pass
Focus ring (accent-ink) on whiteAaaccent-ink #066E6B
surface #FFFFFF
6.09:13.0:1AA pass
Capability map: white on live node (accent-ink)Aasurface #FFFFFF
accent-ink #066E6B
6.09:14.5:1AA pass
Capability map: ink on coming-soon nodeAaink #1A2332
warning-soft #FFF3DC
14.36:14.5:1AA pass
Capability map: coming-soon dashed outlineAawarning #8A5200
surface #FFFFFF
6.39:13.0:1AA pass
Selected filter chip: white on accent-inkAasurface #FFFFFF
accent-ink #066E6B
6.09:14.5:1AA pass
Mega-menu: accent link on sky wash (feature card)Aaaccent-ink #066E6B
wash-sky #E4EEFA
5.19:14.5:1AA pass
Mega-menu: Coming soon chip (ink-3 on surface-2)Aaink-3 #5B6B80
surface-2 #F6F9FB
5.15:14.5:1AA pass
Mega-menu: Live status dot (success on white)Aasuccess #0B6E43
surface #FFFFFF
6.31:13.0:1AA pass
Terminal: command textAat-text #E6EDF3
t-bg #0B0F14
16.27:14.5:1AA pass
Terminal: output (phosphor green)Aat-green #39FF9B
t-bg #0B0F14
14.60:14.5:1AA pass
Terminal: dim outputAat-dim #5FB48D
t-bg #0B0F14
7.69:14.5:1AA pass
Terminal: warning (amber)Aat-amber #FFB547
t-bg #0B0F14
10.94:14.5:1AA pass
Terminal: keys (cyan)Aat-cyan #5CE1E6
t-bg #0B0F14
12.23:14.5:1AA pass
Terminal: window label on barAat-dim #5FB48D
t-bar #141B24
6.93:14.5:1AA pass

Text needs 4.5:1 (3:1 for large text). Control borders and focus rings need 3:1. Ratios are computed by build/contrast.py at build time.

Type

Figtree (self-hosted, OFL) for headings and text, the system monospace for code. Weights 300, 400 and 600. Tabular numerals for prices.

fs--1 · 13.3pxCaptions, meta: Every sign-in, once.
fs-0 · 16pxBody: Every sign-in, once.
fs-1 · 19.2pxLede, card titles: Every sign-in, once.
fs-2 · 23pxH3: Every sign-in, once.
fs-3 · 27.6pxStatements: Every sign-in, once.
fs-4 · 34.4pxSection title: Every sign-in, once.
fs-5 · 44pxH2, display: Every sign-in, once.
fs-6 · 54.4pxPage title: Every sign-in, once.
fs-7 · 72pxHome title: Every sign-in, once.

Figtree 400: body text, long reading and H2.

Figtree 600: labels, buttons, H3, emphasis.

Figtree 300: large display headings.

System monospace: ui-monospace, SFMono-Regular, Menlo, Consolas.

Reading text sits between 62 and 72 characters per line. This paragraph is capped at 68ch, the width token --measure. Shorter lines tire the eye less and help you keep your place.

Space and grid

An 8px scale (with a 4px half step). A 12-column container, 1200px at most, 24px gutters (16px on phones).

--sp-half 4px
--sp-1 8px
--sp-2 16px
--sp-3 24px
--sp-4 32px
--sp-6 48px
--sp-8 64px
--sp-12 96px

Breakpoints

TokenWidthWhat changes
sm480pxSingle column, 16px gutters
md768pxTwo columns, explorer nav moves to a bottom bar below 720px
lg1100pxHeader switches between full-screen drawer and slim bar
xl1280pxSearch label shortens to icon and shortcut; container maxes at 1200px

Shape and elevation

Three radii, three elevations, two borders.

r-1 8px
controls, chips
r-2 12px
cards, panels
r-3 20px
windows, bands
e-1
resting
e-2
hover, menus
e-3
dialogs, product window
--bd
1px line
--bd-strong
1px line-strong, controls

Motion

Three durations, one curve, purposeful only.

fast 120ms
base 200ms
slow 320ms

One easing curve: cubic-bezier(0.2, 0.7, 0.2, 1). Motion is only used to show cause and effect (a hover, a panel change, a packet travelling). With prefers-reduced-motion every transition collapses to nothing and every animation has a static equivalent.

Content rules

Reading is Praxis's job. Marketing pages show, then say.

25words in a hero lede, at most
40words in any marketing paragraph
1sta visual or interaction leads each section, not a paragraph
Praxisreading belongs there: lessons, runbooks, lexicon, field notes

Enforced by python3 build/lint_text.py, which fails the build on the home page, company pages and index pages.

Components

Each one is a function in build/components.py, styled in css/components.css, and works without JavaScript.