Skip to content

Styleguide

Every base component in both modes. Colour means permission: green is what is open, ochre is what is blocked, and nothing else in the interface is allowed to be coloured at all.

light

Colour

Two colours: dark olive green and cream. In light they are accent and ground; in dark they swap, cream becoming the ink and the olive rising in luminance to stay legible. Ochre is the one exception, so a held-back move is told apart from a permitted one by hue and not only by luminance.

--paperPage ground — cream in light, near-black in dark
--surfaceCards. The #FFFDD0 swatch, at full strength
--surface-raisedA card on a card
--inkPrimary text. Cream on dark, olive-black on cream
--ink-softSecondary text
--ink-faintCaptions, metadata, control edges
--ruleHairline dividers
--accent#556B2F. Brand, primary action, and permitted
--accent-inkWhat sits on top of a filled accent
--accent-bgAccent tint
--blockedNot yet — a judgment, not an error
--blocked-bgBlocked tint

Type

Instrument Serif for page headlines and the escalation brief only. Geist Sans for body. Geist Mono for anything a CRM would hold.

display / 48

The not-yet list

title / 32

Three positioning routes

heading / 22

What opens up if this lands

body / 16

Don't reference the funding round yet — the champion wasn't in the room for it.

small / 14

Secondary copy and helper text.

micro / 13

Captions and dense metadata.

mono / data

ACME-4471 · Stage 3 · $148,000 · hiring signal · 4d ago

Rule

One hairline. 1px, --rule. No shadows anywhere; the landing hero is the only place a gradient appears, and only as background.

plain


labelled

Not yet

Button

Primary is solid ink, secondary is a hairline. Buttons never take colour — an action is an affordance, not an answer.

primary

secondary

Logo

The wordmark is masked, not drawn: it paints in currentColor, so it takes the ink of whatever it sits in and inverts with the mode. It never carries the source file's olive — that would be a third hue.

md

sm

in an eyebrow

Pill

The only place colour appears. Every pill states its meaning in words as well as hue.

OpenNot yetStage 3With a human

Card

Surface, 1px hairline, 8px radius. Depth is a border, never a shadow.

Default

Hairline on surface, 24px padding.

Interactive

Border lifts to ink-faint on hover.

SuggestField

Every bar in the product carries built-in options and still takes anything typed. What the rep types that is not on the list comes back as an explicit 'Use' row, so adding their own is a choice rather than a side effect of clicking away.

Click the bar. Type to filter, or write your own.

Field

Control edges use --ink-faint, not --rule: a boundary you must find has to clear 3:1. Errors are ink, not colour.

Anything a CRM would hold is mono.

No account matches that name.

Spinner

The one permitted loop — it reports live state. Slows under reduced motion rather than freezing.

LoadingLoadingFinding accounts…

StepHeader

Page-level masthead for a layer of the spine. Display face, mono step marker, hairline close.

04Win

Deal plan — Northwind

Open

The next move, what not to do yet, and what opens up if this lands.


In context

The signature composition: a not-yet carries ochre and always carries its reason.

Live signals

  • NORTHWIND-2211New VP Eng — 6d ago
  • ACME-4471Pricing page, 4 visits — 2d ago
  • HELIOS-0093Competitor renewal Q3 — 9d ago
  • VANTAGE-7752Series C closed — 11d ago

Don’t send the ROI deck

Not yet

Finance hasn’t been introduced. Sending it now hands your champion a document they can’t defend in a room they weren’t in.

Changes when — champion confirms finance is in the next call.

dark

Colour

Two colours: dark olive green and cream. In light they are accent and ground; in dark they swap, cream becoming the ink and the olive rising in luminance to stay legible. Ochre is the one exception, so a held-back move is told apart from a permitted one by hue and not only by luminance.

--paperPage ground — cream in light, near-black in dark
--surfaceCards. The #FFFDD0 swatch, at full strength
--surface-raisedA card on a card
--inkPrimary text. Cream on dark, olive-black on cream
--ink-softSecondary text
--ink-faintCaptions, metadata, control edges
--ruleHairline dividers
--accent#556B2F. Brand, primary action, and permitted
--accent-inkWhat sits on top of a filled accent
--accent-bgAccent tint
--blockedNot yet — a judgment, not an error
--blocked-bgBlocked tint

Type

Instrument Serif for page headlines and the escalation brief only. Geist Sans for body. Geist Mono for anything a CRM would hold.

display / 48

The not-yet list

title / 32

Three positioning routes

heading / 22

What opens up if this lands

body / 16

Don't reference the funding round yet — the champion wasn't in the room for it.

small / 14

Secondary copy and helper text.

micro / 13

Captions and dense metadata.

mono / data

ACME-4471 · Stage 3 · $148,000 · hiring signal · 4d ago

Rule

One hairline. 1px, --rule. No shadows anywhere; the landing hero is the only place a gradient appears, and only as background.

plain


labelled

Not yet

Button

Primary is solid ink, secondary is a hairline. Buttons never take colour — an action is an affordance, not an answer.

primary

secondary

Logo

The wordmark is masked, not drawn: it paints in currentColor, so it takes the ink of whatever it sits in and inverts with the mode. It never carries the source file's olive — that would be a third hue.

md

sm

in an eyebrow

Pill

The only place colour appears. Every pill states its meaning in words as well as hue.

OpenNot yetStage 3With a human

Card

Surface, 1px hairline, 8px radius. Depth is a border, never a shadow.

Default

Hairline on surface, 24px padding.

Interactive

Border lifts to ink-faint on hover.

SuggestField

Every bar in the product carries built-in options and still takes anything typed. What the rep types that is not on the list comes back as an explicit 'Use' row, so adding their own is a choice rather than a side effect of clicking away.

Click the bar. Type to filter, or write your own.

Field

Control edges use --ink-faint, not --rule: a boundary you must find has to clear 3:1. Errors are ink, not colour.

Anything a CRM would hold is mono.

No account matches that name.

Spinner

The one permitted loop — it reports live state. Slows under reduced motion rather than freezing.

LoadingLoadingFinding accounts…

StepHeader

Page-level masthead for a layer of the spine. Display face, mono step marker, hairline close.

04Win

Deal plan — Northwind

Open

The next move, what not to do yet, and what opens up if this lands.


In context

The signature composition: a not-yet carries ochre and always carries its reason.

Live signals

  • NORTHWIND-2211New VP Eng — 6d ago
  • ACME-4471Pricing page, 4 visits — 2d ago
  • HELIOS-0093Competitor renewal Q3 — 9d ago
  • VANTAGE-7752Series C closed — 11d ago

Don’t send the ROI deck

Not yet

Finance hasn’t been introduced. Sending it now hands your champion a document they can’t defend in a room they weren’t in.

Changes when — champion confirms finance is in the next call.