Token Model

How design.tokens.json becomes shared semantic CSS.

View Markdown

The source of truth is root design.tokens.json. Colors are structured OKLCH token values, and semantic light/dark groups reference primitive leaves. CSS strings are generated output only.

packages/tokens distributes the canonical CSS through @mun.digital/tokens/css and generated static metadata through @mun.digital/tokens/metadata. Apps should import package entries instead of copying generated values.

Authoring Model

  • Primitive color tokens describe raw OKLCH values.
  • Semantic color tokens describe product intent: background, foreground, primary, border, and related surface roles.
  • Layout tokens describe shared structure such as the portfolio rail width and gap.
  • App component authors use semantic Tailwind utilities backed by generated variables, not raw color literals.

Generated Outputs

ExportFilePurpose
@mun.digital/tokens/csspackages/tokens/css/tokens.generated.cssRuntime CSS variables for web, docs, and Storybook styles.
@mun.digital/tokens/metadatapackages/tokens/metadata/tokens.generated.mjsStatic metadata for docs and Storybook references.

The CSS includes storybook-design-token comment annotations so token categories remain compatible with Storybook token browsing. The docs token reference below is rendered from metadata, so reference content does not depend on Storybook addon compatibility.

Semantic Usage

Use semantic tokens for component intent:

<h2 className="text-foreground">Experience</h2>
<span className="text-primary">[02]</span>
<div className="border-border bg-card" />

Avoid raw color values when a semantic token exists. Add new tokens in design.tokens.json, then regenerate outputs.

Verification:

  • Run pnpm design:build after editing design.tokens.json.
  • Run pnpm design:check before committing.
  • Run pnpm tokens:smoke when a consumer changes.
  • Run pnpm pack:smoke when package exports change.

Generated Token Reference

This reference is rendered from @mun.digital/tokens/metadata, the generated metadata companion to the canonical CSS export.

Semantic color tokens
TokenModeValueSource
--background
lightoklch(0.985 0.004 80)color.semantic.light.background
--card
lightoklch(0.97 0.004 80)color.semantic.light.card
--foreground
lightoklch(0.18 0.01 240)color.semantic.light.foreground
--muted-foreground
lightoklch(0.42 0.01 240)color.semantic.light.muted-foreground
--subtle-foreground
lightoklch(0.54 0.008 240)color.semantic.light.subtle-foreground
--border
lightoklch(0.85 0.008 240)color.semantic.light.border
--border-strong
lightoklch(0.3 0.01 240)color.semantic.light.border-strong
--primary
lightoklch(0.5 0.15 220)color.semantic.light.primary
--primary-soft
lightoklch(0.55 0.15 220 / 0.12)color.semantic.light.primary-soft
--grid
lightoklch(0.94 0.004 240)color.semantic.light.grid
--background
darkoklch(0.14 0.01 240)color.semantic.dark.background
--card
darkoklch(0.17 0.012 240)color.semantic.dark.card
--foreground
darkoklch(0.95 0.005 240)color.semantic.dark.foreground
--muted-foreground
darkoklch(0.72 0.01 240)color.semantic.dark.muted-foreground
--subtle-foreground
darkoklch(0.62 0.01 240)color.semantic.dark.subtle-foreground
--border
darkoklch(0.28 0.015 240)color.semantic.dark.border
--border-strong
darkoklch(0.85 0.01 240)color.semantic.dark.border-strong
--primary
darkoklch(0.83 0.15 220)color.semantic.dark.primary
--primary-soft
darkoklch(0.78 0.15 220 / 0.14)color.semantic.dark.primary-soft
--grid
darkoklch(0.3 0.018 240)color.semantic.dark.grid
Layout tokens
TokenModeValueSource
--rail-width
base120pxdimension.layout.rail.width
--rail-gap
base28pxdimension.layout.rail.gap
--rail-offset
basecalc(var(--rail-width) + var(--rail-gap))dimension.layout.rail