Foundations
Tokens
Every value the app is allowed to use. Use the semantic names (bg, surface, text, muted, accent-text…) in CSS as var(--name); never the ramps, never a hex. Swatches show the dark value on the left and the light value on the right when they differ.
Jump to: Color · Type · Space · Radius · Shadow · Sizes · Motion · Layers and opacity
Color
Surfaces and text
Accent (lime by default — the user picks one of 18)
Brand
Status
Billing zones and priority
Palette — accent, project and client colors (ink text on all)
On a pastel fill or an image
Neutral ramp · dark theme
Warm ramp · light theme
Everything else
Type
Bricolage Grotesque for display, Inter for everything else. Nothing goes below 11 px. Kickers are the only uppercase.
Display
font: var(--type-display)font: var(--type-title)font: var(--type-heading)font: var(--type-number)Interface
font: var(--type-body)font: var(--type-button)font: var(--type-label)font: var(--type-note)font: var(--type-small)font: var(--type-kicker)font: var(--type-micro)Space
A 4 px base. Lay out with gap, not margins.
| Token | Value | Use |
|---|---|---|
--space-4 | 4px | Icon-to-label gap, tight inline gaps. |
--space-8 | 8px | Gap inside a control group, chip padding. |
--space-12 | 12px | Gap between form fields in an add row. |
--space-16 | 16px | Card padding (small), list row padding. |
--space-20 | 20px | Panel padding. |
--space-24 | 24px | Card padding, gap between Home cards. |
--space-32 | 32px | Gap between page sections. |
--space-40 | 40px | Large section breaks. |
--space-56 | 56px | Maximum page padding (page-pad-max). |
--page-pad | 56px | Page side padding: clamp(18px, 4vw, 56px) in the app; 56 at desktop. |
Radius
Six steps, picked by role: chip 8 · control 10 · inner 12 · card 16 · floating 24 · round.
radius-chipradius-controlradius-innerradius-cardradius-floatingradius-round| Token | Value | Use |
|---|---|---|
--radius-chip | 8px | Chips, filter pills, checkboxes, calendar chips and bars. |
--radius-control | 10px | Buttons, inputs, icon buttons, menu rows and the nav highlight. |
--radius-inner | 12px | A surface nested in a card or dialog: overview cards, stats, quick-access cards, previews, thumbnails; and tooltips. |
--radius-card | 16px | Panels, tiles, project cards, lists and other top-level cards. |
--radius-floating | 24px | Dialogs, popovers, the toast, the account menu, the floating timer. |
--radius-round | 999px | Avatars and status pills. |
--radius-8 | 8px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--radius-10 | 10px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--radius-12 | 12px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--radius-16 | 16px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--radius-24 | 24px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--radius-full | 999px | Radius scale step. Use the role tokens (radius-chip … radius-round) in UI. |
--r | 16px | 1.19.0 alias of radius-card (was 18). Kept two minor versions. |
Shadow
Flat by default. Only things that float cast a shadow.
Sizes
| Token | Value | Use |
|---|---|---|
--control-height | 44px | Every add-form box: input, select, date, button, color pill. |
--control-height-compact | 36px | Compact buttons in dense rows. |
--icon-button-size | 40px | 40 px icon buttons; reach 44 px touch area under pointer: coarse. |
--topbar-height | 56px | The glass top bar. |
--topbar-line | 1.25px | Bottom divider, drawn as an inset shadow so the fraction survives 125–200% display scale. |
--sidebar-width | 248px | Full sidebar. |
--sidebar-width-rail | 76px | Collapsed icon rail. |
--nav-indicator-width | 4.5px | |
--main-max-width | 1240px | Main content column max width. |
--page-pad-min | 18px | Page padding floor at phone width. |
--page-pad-max | 56px | Page padding ceiling. |
--breakpoint-phone | 860px | Reference only: @media cannot read custom properties. Phone layout at ≤ 860 px. |
--icon-size-sm | 16px | In text and pills. |
--icon-size | 20px | Menu and controls. |
--icon-size-lg | 24px | Phone bar. |
--logo-height-bar | 24px | Logo on the desktop top bar. |
--logo-height-phone | 20px | Logo on the phone bar. |
--logo-height-door | 52px | Logo on the front door (sign-in). |
--favicon-size | 16px | Favicon. |
--avatar-size | 36px | The account card and lists. |
--avatar-size-sm | 32px | The phone bar. |
--avatar-size-xl | 112px | The Account page. |
--border-width | 1px | Every hairline (line). |
--border-width-strong | 1.5px | Task check, help bubble, client pill. |
--glass-blur | 16px | Backdrop blur on the top bar and floating timer. |
--scrim-blur | 2px | Backdrop blur behind dialogs. |
--text-number-min | 28px | The smallest a big number gets in a narrow card. |
Motion
The signature curve is cubic-bezier(0,0,0,1). Every entrance has an exit. Under Reduced, movement stills and fades stay.
Easing
| Token | Value | Use |
|---|---|---|
--ease-out | cubic-bezier(0,0,0,1) | The HeyGoal curve: hovers, entrances, presses. Default for everything. |
--ease-in | cubic-bezier(.4,0,1,1) | Exits only, over duration-fast. |
--ease-soft | cubic-bezier(.2,.7,.2,1) | The Home intro and the front door. |
--ease-fade | ease | Plain fades. |
Durations
| Token | Value | Use |
|---|---|---|
--duration-fast | 0.16s | Color, opacity and press (1.19.0 --t-fast). |
--duration-in | 0.26s | The way in: hover, enter, page-out (1.19.0 --t). |
--duration-out | 0.4s | The way back: hover out, toast (1.19.0 --t-slow). |
--duration-page | 0.36s | Page blocks rising in. |
--duration-wipe | 0.42s | Menu highlight wipe and indicator fade. |
--duration-crossfade-out | 0.12s | Reduced motion: old page fades. |
--duration-crossfade-in | 0.18s | Reduced motion: new page and menu highlight fade. |
--duration-drawer | 0.25s | Phone drawer and scrim. |
--duration-collapse | 0.2s | Sidebar and timer-dock column change. |
--duration-theme | 0.3s | Theme switch color fade; Billing zone flash. |
--duration-page-out | 0.26s | The old page fading out on a page change. |
--duration-intro | 0.55s | The Home intro: each tile rising in. |
--duration-door | 0.9s | The front door: the wordmark scaling and fading in. |
--duration-door-rise | 0.65s | The front door: the wordmark moving up for the sign-in card. |
--duration-door-card | 0.5s | The front door: the sign-in card coming in. |
--duration-pulse | 1.6s | One cycle of the live dot pulse. |
--duration-ring | 2.4s | One cycle of the synced dot ring. |
--duration-sync-pulse | 1.1s | The account card dot while it syncs (1.19.0: ease-in-out, now --ease-fade). |
--duration-flash | 0.3s | A Billing zone flashing when its jump pill is used. |
--delay-door-card | 0.15s | The sign-in card waits this long after the wordmark starts to move. |
Layers and opacity
| Token | Value | Use |
|---|---|---|
--z-raised | 2 | A lifted card over its siblings. |
--z-local | 5 | Local stacking inside a component. |
--z-tip | 20 | The ? help tip. |
--z-shell | 45 | Top bar and sidebar. |
--z-floating | 50 | Floating timer. |
--z-gate | 55 | Front door (sign-in). |
--z-scrim | 55 | Dialog scrim. |
--z-drawer | 60 | Phone drawer. |
--z-toast | 60 | Toast. |
--z-popover | 70 | Popovers and the account menu. |
| Token | Value | Use |
|---|---|---|
--opacity-disabled | 0.5 | A control that cannot be used right now, such as a button while a PDF builds. |
--opacity-hover | 0.8 | The logo on hover. |
--opacity-placeholder | 0.28 | The empty slot a Home card leaves while it is dragged. |
--glass-saturate | 1.4 | Backdrop saturate on the floating timer glass. |
Files: tokens.json (this page's data) · tokens.w3c.json (the W3C Design Tokens source of truth) · heygoal-tokens.css (the generated :root block) · heygoal-tokens.js · contrast-report.md.
design-system\HeyGoal design system · works offline, open any page in a browser.