Design system
Every token and primitive, traced to Figma. Values in grey under each specimen are the Figma spec.
Typography
Satoshi, self-hosted as one 42KB variable woff2 covering all three weights. Headings are always Bold with 110% line-height and -1% tracking.
Headings
These are the raw fixed tokens, shown at their true size. A 96px H1 is wider than a phone, so each specimen scrolls horizontally on a narrow screen rather than stretching the page. For real page copy use the responsive heading-* utilities below.
Heading H1
Heading H2
Heading H3
Heading H4
Heading H5
Heading H6
Body
Each size is available in all three weights. Sizes below show Regular; the columns after show the same size in Medium and Bold.
The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700The quick brown fox
Regular 400The quick brown fox
Medium 500The quick brown fox
Bold 700Label
Label small
text-label + uppercase · Satoshi Medium 500 · 12px · LH 130% · LS +10%Responsive headingsProvisional
Provisional: Figma only specifies 1440px and up. These utilities step down through the existing heading scale at smaller breakpoints and land on the exact Figma value at 1280px+. No new sizes are invented. Resize this window to see them move. When the mobile frames land, only the @utility heading-* block in globals.css needs changing.
Deskless teams, sorted
heading-1Deskless teams, sorted
heading-2Deskless teams, sorted
heading-3Colour
Tailwind's default palette is cleared, so only these tokens exist. bg-slate-500 will not compile - that is deliberate, it stops off-brand colour creeping in.
Brand — Pink. Pink 400 is Jem Pink.
Pink 100
#FFF0F2Pink 200
#FFCCD4Pink 300
#FF93A3button hoverPink 400
#FF697FJem Pink / primaryPink 500
#E1506Bbutton pressedPink 600
#C43759Brand — Blue & Navy
Blue 100
#F0F5FFBlue 200
#D3DFF8Blue 300
#95AFE8Navy 100
#265373Navy 200
#0F3957Navy 300
#051D2EInterface — Grey
Added: Grey 300 and Grey 400 are additions. Figma jumps straight from #E2E2E2 to #838383, leaving nothing for placeholder text or secondary borders. These two fill the ramp. Use for borders and disabled states only, never for body text on white — neither passes contrast.
Grey 100
#F7F7F7Grey 200
#E2E2E2all bordersGrey 300
#C7C7C7addedGrey 400
#A5A5A5addedGrey 500
#838383Status
Added: Only green exists in Figma. Red and amber are additions, needed the moment there is a form to validate. Both mirror green’s 100/400/800 structure and are contrast-checked against their own 100 tint.
Green 100
#D8FFD6Green 400
#39CC2EGreen 800
#227A1BRed 100
#FEE9E7addedRed 400
#E5484DaddedRed 800
#A31212addedAmber 100
#FFF6E5addedAmber 400
#F79009addedAmber 800
#93370DaddedFocus ring
Added: Nothing in Figma defines a focus style. Navy 200 is used, at 2px with a 2px offset: 12.05:1 against white and 4.35:1 against Jem Pink, so it stays visible on every surface in the system. Tab through this page to see it.
Spacing
Eight steps. All eight map exactly onto Tailwind's default scale, so no custom spacing tokens are needed - just use the class shown.
8px
p-2 / gap-216px
p-4 / gap-424px
p-6 / gap-632px
p-8 / gap-840px
p-10 / gap-1056px
p-14 / gap-1480px
p-20 / gap-20128px
p-32 / gap-32Layout
Sections are full-bleed bands with a centred container inside. Size sets both the vertical rhythm and the container cap, as paired in Figma.
| Section size | Container | Vertical padding | Horizontal padding |
|---|---|---|---|
| large | 1680px | 128px | 80px |
| medium | 1280px | 80px | 80px |
| small | 960px | 40px | 80px |
Provisional: Those are the 1440px+ values. Below that, vertical padding and horizontal inset step down through the spacing scale. Header and footer sit at 24px instead of 80px, as confirmed.
Radius
Radius carries meaning. 48 for hero and feature surfaces, 16 for standard content, 8 for dense or nested things. Every pill - button, badge, chip - is also 48.
48px
rounded-card-lg16px
rounded-card-md8px
rounded-card-smfull
rounded-fullBadges & chips
Two separate components, because Figma treats them separately. Badges announce state in uppercase at 12px. Chips label taxonomy in sentence case at 14px.
Badge — status
Chip — taxonomy
Check: The Category chip in Figma has Blue 200 text on a transparent fill, so it only works on a dark surface — shown on navy above. There is no light-background outline chip in the design, so tone="outline" below is an addition to fill that gap.
Icons
Phosphor Icons at Regular weight. Import from @phosphor-icons/react/dist/ssr in server components.
Cards
32px padding, overflow hidden. Three radii, chosen by role rather than taste. The 192px height in Figma is specimen-only.
Added: Figma’s outline border is #E8E8E8, which is not a token. Collapsed to Grey 200 (#E2E2E2) so all borders in the system match. The other three surfaces below are additions using existing palette colours.
Header & footer
Both are built and in use. The header is a transparent overlay, so it only reads correctly over hero media - see it in place on the home page.
View the home page to see the header overlaid on a hero and the footer in position.
Check: Figma shows two identical “Book a demo” buttons in the header, one bordered and one not. The borderless on-dark variant is shipping, because a grey border reads as a seam against the dark scrim. Confirm which you want.
Accessibility findings
Measured contrast ratios for colour pairs the design specifies. Everything is built as designed; these are reported, not silently changed. WCAG AA needs 4.5:1 for normal text and 3:1 for text at 24px+ or bold 18.66px+.
| Pair | Ratio | Verdict |
|---|---|---|
| White on Pink 400 - primary button, 16px bold | 2.77:1 | Below AA |
| White on Pink 300 - primary hover | 2.11:1 | Below AA |
| White on Pink 500 - primary pressed | 3.78:1 | Below AA |
| Pink 500 on Pink 100 - Beta badge, 12px | 3.42:1 | Below AA |
| Grey 500 on white - footer legal, 14px | 3.79:1 | Below AA |
| Green 800 on Green 100 - success badge | 4.96:1 | Pass |
| Pink 600 on Pink 100 - Info chip | 4.70:1 | Pass |
| Navy 200 on Blue 100 - Coming soon badge | 11.02:1 | Pass |
| Blue 200 on Navy 200 - Product chip | 9.00:1 | Pass |
| Navy 100 on white - social icons | 8.18:1 | Pass |
| Black on white - body copy | 21.00:1 | Pass |
Disabled controls are exempt from the requirement, so the disabled button is fine. The others are real. The primary button is the one that matters most, since it is the main call to action on every page.