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

text-h1 · Satoshi Bold 700 · 96px · LH 110% · LS -1%

Heading H2

text-h2 · Satoshi Bold 700 · 72px · LH 110% · LS -1%

Heading H3

text-h3 · Satoshi Bold 700 · 56px · LH 110% · LS -1%

Heading H4

text-h4 · Satoshi Bold 700 · 40px · LH 110% · LS -1%

Heading H5

text-h5 · Satoshi Bold 700 · 32px · LH 110% · LS -1%

Heading H6

text-h6 · Satoshi Bold 700 · 24px · LH 110% · LS -1%

Body

Each size is available in all three weights. Sizes below show Regular; the columns after show the same size in Medium and Bold.

text-super · 40px · LH 120% · LS -1%

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-xxlarge · 32px · LH 130% · LS -1%

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-xlarge · 24px · LH 130% · LS 0

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-large · 18px · LH 130% · LS 0

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-normal · 16px · LH 130% · LS 0

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-small · 14px · LH 130% · LS 0

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700
text-tiny · 12px · LH 130% · LS 0

The quick brown fox

Regular 400

The quick brown fox

Medium 500

The quick brown fox

Bold 700

Label

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-1

Deskless teams, sorted

heading-2

Deskless teams, sorted

heading-3

Colour

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

#FFF0F2

Pink 200

#FFCCD4

Pink 300

#FF93A3button hover

Pink 400

#FF697FJem Pink / primary

Pink 500

#E1506Bbutton pressed

Pink 600

#C43759

Brand — Blue & Navy

Blue 100

#F0F5FF

Blue 200

#D3DFF8

Blue 300

#95AFE8

Navy 100

#265373

Navy 200

#0F3957

Navy 300

#051D2E

Interface — 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

#F7F7F7

Grey 200

#E2E2E2all borders

Grey 300

#C7C7C7added

Grey 400

#A5A5A5added

Grey 500

#838383

Status

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

#D8FFD6

Green 400

#39CC2E

Green 800

#227A1B

Red 100

#FEE9E7added

Red 400

#E5484Dadded

Red 800

#A31212added

Amber 100

#FFF6E5added

Amber 400

#F79009added

Amber 800

#93370Dadded

Focus 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.

And this link

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-2

16px

p-4 / gap-4

24px

p-6 / gap-6

32px

p-8 / gap-8

40px

p-10 / gap-10

56px

p-14 / gap-14

80px

p-20 / gap-20

128px

p-32 / gap-32

Layout

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 sizeContainerVertical paddingHorizontal padding
large1680px128px80px
medium1280px80px80px
small960px40px80px

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.

Section size="large" · 128px vertical · container 1680px
container 1680px
Section size="medium" · 80px vertical · container 1280px
container 1280px
Section size="small" · 40px vertical · container 960px
container 960px

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-lg

16px

rounded-card-md

8px

rounded-card-sm

full

rounded-full

Buttons

24px/16px padding, 48px radius, Satoshi Bold 16px. One size in Figma; the small variant below is an addition.

Check: Primary hover goes lighter (Pink 300) and pressed goes darker (Pink 500). That is what Figma specifies, kept as designed. Separately, white text on Pink 400 measures 2.77:1 against a 4.5:1 requirement — see the accessibility note at the foot of this page.

variant="primary" — Primary
default
:hover
:active
:disabled
variant="secondary" — Secondary
default
:hover
:active
:disabled
variant="secondaryOnDark" — Secondary on dark
default
:hover
:active
:disabled
size="sm" — addition, not in Figma

Badges & 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

Actively hiringBetaComing soonWarningErrorNeutral
12px/6px padding · 48px radius · Medium 12px · +10% tracking · uppercase. First three are from Figma; the last three are additions.

Chip — taxonomy

CategoryProduct

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.

InfoOutline (added)Neutral (added)
16px/8px padding · 48px radius · Regular 14px

Icons

Phosphor Icons at Regular weight. Import from @phosphor-icons/react/dist/ssr in server components.

size="large" · 48px · black
size="normal" · 32px · black
size="small" · 20px · black
BoxedIcon tone="pink" size="large" · 36px box · 8px padding · 20px glyph
BoxedIcon tone="pink" size="small" · 28px box · 6px padding · 16px glyph
BoxedIcon tone="social" · white fill, Grey 200 border, Navy 100 glyph — used in the footer
Numeral · 97px circle · Grey 200 border · Bold 32px

Cards

32px padding, overflow hidden. Three radii, chosen by role rather than taste. The 192px height in Figma is specimen-only.

variant="flat" · Blue 100 fill
Flat card · radius lg
Flat card · radius md
Flat card · radius sm
variant="outline" · white, Grey 200 border
Outline card · radius lg
Outline card · radius md
Outline card · radius sm

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.

pink (added)
grey (added)
navy (added)

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+.

PairRatioVerdict
White on Pink 400 - primary button, 16px bold2.77:1Below AA
White on Pink 300 - primary hover2.11:1Below AA
White on Pink 500 - primary pressed3.78:1Below AA
Pink 500 on Pink 100 - Beta badge, 12px3.42:1Below AA
Grey 500 on white - footer legal, 14px3.79:1Below AA
Green 800 on Green 100 - success badge4.96:1Pass
Pink 600 on Pink 100 - Info chip4.70:1Pass
Navy 200 on Blue 100 - Coming soon badge11.02:1Pass
Blue 200 on Navy 200 - Product chip9.00:1Pass
Navy 100 on white - social icons8.18:1Pass
Black on white - body copy21.00:1Pass

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.