Tokens
Every value lives once, as a CSS custom property in @zitdevs/tokens/tokens.css. theme.css
teaches Tailwind the names, so a utility compiles to the variable itself — bg-primary to
var(--ui-primary), text-label to var(--text-label) — and changing a token changes every
component that uses it.
Quick path
Section titled “Quick path”| I want… | Write |
|---|---|
| An interactive or brand colour | bg-primary, text-primary, border-accent |
| Heading, body, secondary text | text-ink, text-body, text-muted |
| A field | bg-surface, bg-surface-raised, bg-surface-inverse |
| A line | border-default, border-subtle, border-control |
| A status | border-danger, bg-success-soft, text-danger-strong |
| A font size | text-sm, text-label, text-display-section |
| Spacing | p-4 (16px), gap-2.5 (10px): every step is 4px |
| A radius or a shadow | rounded-sm, shadow-md, shadow-focus |
| The control transition | transition-control |
| A token with no utility | duration-(--duration-base), bg-(--ui-border-strong) |
| A brand colour that never re-themes | fill-zd-blue — only for brand artwork, such as the logo |
Colour
Section titled “Colour”Semantic roles
Section titled “Semantic roles”The roles components are written in, and their ZitDevs values, are listed in Theming.
Palette
Section titled “Palette”The ZitDevs brand values: the identity manual’s five colours, their ramps, navy-tinted neutrals and
the status colours. Utilities write them as bg-zd-blue, text-zd-orange-600. Components never
do — they use the roles — except the logo, whose colours the manual fixes.
--zd-blue--zd-blue-light--zd-orange--zd-navy--zd-cream--zd-white--zd-blue-50--zd-blue-100--zd-blue-200--zd-blue-300--zd-blue-400--zd-blue-500--zd-blue-600--zd-blue-700--zd-blue-800--zd-blue-900--zd-orange-50--zd-orange-100--zd-orange-200--zd-orange-300--zd-orange-400--zd-orange-500--zd-orange-600--zd-neutral-0--zd-neutral-25--zd-neutral-50--zd-neutral-100--zd-neutral-200--zd-neutral-300--zd-neutral-400--zd-neutral-500--zd-neutral-600--zd-neutral-700--zd-neutral-800--zd-neutral-900--zd-success--zd-success-surface--zd-warning--zd-warning-surface--zd-danger--zd-danger-surface--zd-info--zd-info-surfaceOne family, Proxima Nova, with JetBrains Mono for numbers and references. Weights: font-thin
(200), font-light (300), font-regular (400), font-medium (500), font-semibold (600),
font-bold (700), font-extrabold (800), font-black (900). Tailwind’s font-normal is reset:
write font-regular.
The size scale, then the sizes named by role. Size utilities set the size alone; leading and
tracking are separate (leading-control, tracking-eyebrow).
text-2xs11pxManaged technologytext-xs12pxManaged technologytext-sm14pxManaged technologytext-md16pxManaged technologytext-lg18pxManaged technologytext-xl20pxManaged technologytext-2xl24pxManaged technologytext-3xl30pxManaged technologytext-4xl38pxManaged technologytext-5xl48pxManaged technologytext-6xl60pxManaged technologytext-7xl76pxManaged technologytext-meta11.5pxManaged technologytext-hint12.5pxManaged technologytext-caption13pxManaged technologytext-label13.5pxManaged technologytext-ui14.5pxManaged technologytext-small15pxManaged technologytext-card15.5pxManaged technologytext-copy16.5pxManaged technologytext-emphasis17pxManaged technologytext-card-title22pxManaged technologytext-tag10.5pxManaged technologytext-panel-title26pxManaged technologytext-noteclamp(19px, 2vw, 26px)Managed technologytext-statclamp(34px, 3.6vw, 48px)Managed technologytext-display-heroclamp(40px, 5.2vw, 72px)Managed technologytext-display-pageclamp(32px, 3.8vw, 52px)Managed technologytext-display-sectionclamp(30px, 3.4vw, 48px)Managed technologytext-display-ctaclamp(32px, 4vw, 56px)Managed technologytext-lead-heroclamp(18px, 1.5vw, 21px)Managed technologytext-lead-pageclamp(16.5px, 1.3vw, 19px)Managed technologytext-lead-sectionclamp(17px, 1.3vw, 19px)Managed technologytext-lead-ctaclamp(18px, 1.4vw, 20px)Managed technologySpacing, radius and motion
Section titled “Spacing, radius and motion”| Group | Tokens | Utilities |
|---|---|---|
| Spacing | --space-1 = 4px; Tailwind multiplies it |
p-4, gap-2.5, mt-5.5 |
| Widths | --container-narrow 720px, -default 1120px, -wide 1360px; --measure-* |
max-w-default, max-w-measure-lead |
| Radius | --radius-xs 2px, -sm 4px, -md 6px, -lg 10px, -xl 16px, -pill |
rounded-sm, rounded-pill |
| Shadow | --shadow-xs … -lg, -brand, -sheet; the focus rings |
shadow-md, shadow-focus |
| Duration | --duration-instant 80ms, -fast 140ms, -base 200ms, -slow, -slower |
duration-(--duration-base) |
| Easing | --ease-standard, --ease-out, --ease-in |
ease-standard |
| Animation | the spinner, the fade-in, the rise, the skeleton pulse, the indeterminate sweep | animate-spin, animate-pulse |
| Breakpoints | Tailwind’s own, plus the page designs’ page-sm 560px, page-md 820px, page-lg 1140px |
page-lg:grid-cols-(--split-hero) |
| Containers | a service visual’s own widths, visual-split 384px and visual-row 576px |
@visual-split:grid-cols-2 |
The triangle of the mark is a utility in four directions (clip-triangle-down, -up, -right,
-left), and the chevron motif bleeds off a band’s edge with mask-chevron. The pattern tiles are
--pattern-lines-blue, --pattern-marks-blue and --pattern-marks-cream:
bg-(image:--pattern-marks-blue) bg-size-(--pattern-size-md), with tiles of --pattern-size-sm
160px, -md 260px and -lg 420px. --toaster-offset (0px) lifts the toaster above a page’s own
bottom banner.
Breakpoints and container widths are values in theme.css, not variables in tokens.css: a media
or container query cannot read a custom property. The page grids that use them are built by
gridColumns, gridClass and cellClass from @zitdevs/ui, which leave no row short whatever the
count. A select still showing its prompt matches the prompt-shown: variant.
In JavaScript
Section titled “In JavaScript”For React Native, canvas, charts or email, where a CSS variable cannot reach, the same values are exported as numbers and strings. Keys are the CSS names without their prefix; lengths are px, durations ms, letter spacing em.
import { fontFamily, fontSize, palette, radius, semantic, space } from '@zitdevs/tokens';
const styles = { button: { backgroundColor: semantic.primary, // '#2264dc' borderRadius: radius.sm, // 4 paddingHorizontal: space[5], // 20 }, label: { color: semantic['on-primary'], fontFamily: fontFamily.sans, fontSize: fontSize.card }, rule: { backgroundColor: palette['orange-600'] },};semantic is the ZitDevs mapping resolved to hex, and semanticMapping names the palette colour
behind each role. The fluid clamp() sizes exist only in CSS.