Four variants: primary for the page's main action; secondary for the alternative; ghost for low-stakes / inline actions; destructive for irreversible operations. All buttons share the same min-height (44px) for touch targets.

Variants

Primary · States

Default
Hover
Focus
Active
Disabled

Secondary · States

Default
Hover
Focus
Active
Disabled

Ghost · States

Default
Hover
Focus
Active
Disabled

Destructive · States

Default
Hover
Focus
Active
Disabled

Sizes

PropertyToken
Background — primary--btn-primary-bg--surface-brand-action
Background — primary hover--btn-primary-bg-hover--c-steady-blue
Ink — primary--btn-primary-ink--ink-inverse
Border — secondary--btn-secondary-border--border-strong
Radius--btn-radius--radius-sm (2px)
Padding--btn-padding-y · --btn-padding-x
Type--btn-font → Inconsolata 700, uppercase, +0.18em tracking
Min-height44px (accessibility floor)
Focus ring--state-focus-ring · 2px · 2px offset
Transition--motion-state (200ms standard easing)

Inputs read from --input-* component tokens. Required fields signal with the warning ink (Honest Ochre) on the label asterisk. Helper and error text both use 13px Lora; error text is italic and warning-colored.

Text input · States

We'll only use this for project updates.
We'll only use this for project updates.
We'll only use this for project updates.
We'll only use this for project updates.
Please enter a valid email address.
Locked while your team admin reviews.

Required, with optional

Textarea · Select

Checkbox · Radio

PropertyToken
Background--input-bg--surface-default
Border (default / hover / focus)--input-border · --input-border-hover · --input-border-focus
Ink--input-ink--ink-default
Placeholder--input-ink-placeholder--ink-subtle
Padding12px 14px (44px effective height)
Type--type-body · 15px Lora 400
Error border--ink-warning (Honest Ochre)
Label type--type-label · 12px League Spartan 500, +0.06em tracking
Helper / error type13px Lora · error is italic

A neutral container. Default reads as a passive panel. Selectable is interactive (use when the whole card links somewhere). Selected is the chosen-state of a selectable.

Default

Brand Strategy

A 6-week engagement to clarify positioning, audience, and message before identity work begins.

Hover

Brand Identity

Logo, type, color, and the rules for how they live together — built from the strategy outward.

Selected

Website Design

From sitemap to launch, with a focus on the editorial shape of the brand on the web.

PropertyToken
Background--card-bg--surface-default
Border--card-border--border-subtle
Hover background--card-bg-hover--surface-muted
Selected border--c-intentional-blue
Selected background--c-intentional-blue-10 (10% tint)
Padding--card-padding → 32px
Radius--card-radius--radius-none (the brand favors sharp edges)

Tags categorize. Badges count. Status pills signal state.

Tag — neutral by default; status variants for affirm/warn/info/critical

Brand strategy Discovery Approved Needs review Blocked Internal

Badge — counts and dots

3 12 99+ Inbox 7
PropertyToken
Tag bg / ink--tag-bg · --tag-ink (slate-light + Clean Slate)
Tag radius--tag-radius → 2px
Tag type--tag-font · 10px League Spartan 500, +0.1em tracking, uppercase
Status variants--status-{success|warning|info|critical}-{surface,ink}
Badge bg--c-honest-ochre (default; signals "attention")

The annotation pattern from the type page, generalized. Eyebrow tag stacked over italic body, left-bordered with the variant color.

Info

Background usage rules. Use full-bleed as presentation slide backgrounds. The –1 variant suits white or gold text; the –2 variant works best when overlaying dark text.

Do

Use Lora roman for body. Reserve italic for actual quotes, paraphrasing, special callouts, and annotations.

Don't

Don't use Inconsolata for eyebrows or labels. It's reserved for attributions and CTAs only.

Critical

Honest Ochre body text on Calm Blue or Radiant Gold backgrounds fails contrast at every size. Don't pair these.

PropertyToken
Background--status-{variant}-surface
Border-left (3px)--status-{variant}-ink
Body typeLora italic 14px / 1.55
Tag typeLeague Spartan 500 · 10px · +0.18em
Padding18px 22px
Max-width720px (prose container)

For confirmations and focused tasks. Backdrop is Grounded Black at 60%. Modal sits on white surface with deliberate elevation. Always include a clear primary action and a way to cancel.

PropertyToken
Backdrop--modal-backdrop → rgba(31,30,30,0.6)
Background--modal-bg--surface-default
Padding--modal-padding → 32px
Radius--modal-radius → 4px
Shadow--elevation-modal
Entrance motion--motion-overlay-in · 320ms entrance easing · fade + 8px translate-up

Brief context on hover or focus. Always supplemental — never the only place a piece of information lives.

Press ⌘K to open
Saved 2 minutes ago
PropertyToken
Background--tooltip-bg--c-grounded-black
Ink--tooltip-ink--c-clear-white
Padding6px 10px
TypeLeague Spartan 500 · 11px
Radius--tooltip-radius → 2px
Triggerhover OR keyboard focus (always reachable)
Delay200ms in · 0ms out

Transient feedback for system events. Stacks bottom-right. Auto-dismiss after 5s for info/success; persist for warning/critical until acknowledged.

Saved
Your changes are synced. We'll keep working on this in the background.
Brief approved
Sara approved the Pivotal Ventures brief. Kicking off discovery.
Needs your attention
Two reviews are still pending. Nudge them?
Couldn't save
We lost connection mid-save. Try again — your work is held locally.
PropertyToken
Surface--surface-default
Border-left--ink-brand (info default), --status-{variant}-ink for variants
Shadow--elevation-overlay
Title typeLeague Spartan 700 · 14px
Body typeLora 400 · 13px
Auto-dismiss5s for info / success · persist for warning / critical
Entrance motionstandard easing, 200ms, slide-up + fade

Top-level site navigation. Active link uses Radiant Gold. Hover lifts a subtle Clear White overlay (12% alpha).

PropertyToken
Background--nav-bg--c-grounded-black
Ink--nav-ink--c-clear-white
Active ink--nav-ink-active--c-radiant-gold
Hover overlayrgba(249,248,242,0.12)
TypeLeague Spartan 500 · 11px · +0.12em · uppercase

Section switcher. Active tab signals with a 2px underline in --ink-default. Inactive tabs sit in --ink-muted; hover lifts to default ink.

Overview Strategy Identity Web
Do — buttons

Pair every primary button with a clear secondary or cancel path. Never show three primaries in the same scope.

Don't — buttons

Don't use destructive styling for "Cancel" or "Close". Reserve Honest Ochre for actions that genuinely can't be undone.

Do — focus

Always show the focus ring on keyboard focus. If you're styling a custom element, replicate the 2px Intentional Blue ring with 2px offset.

Don't — focus

Don't outline:none without a replacement focus indicator. This breaks accessibility for keyboard-only users.

Do — color signaling

Pair color with an icon, label, or position. A red border alone is not enough — add an error message, an icon, or both.

Don't — color signaling

Don't rely on color alone to convey state. ~8% of users have color vision differences.

Components below exist in the brand expression but haven't been formalized as DS components. Add when first needed: