Theming

Tokens, and how to make Lilt yours

Every component reads semantic --lilt-* variables — never raw hex values. The tables below render live from tokens/lilt.tokens.json, the canonical W3C-format token source.

Rebranding: mint is a guest

The pine accent and its mint wash are swappable defaults. To rebrand, replace five semantic values per mode and keep the contrast rules: a deep primary that can fill controls in light mode, a pale one in dark. Every button, badge, focus ring, and selection follows automatically:

:root {
  --lilt-primary: #5b46b8;      /* your accent, deep enough to fill controls */
  --lilt-primary-tint: #c7b9ff; /* its pale wash: selection, soft hovers */
  --lilt-primary-soft: #efeaff; /* its soft tint */
  --lilt-primary-text: #3a2d73; /* AAA text on the tint */
  --lilt-focus: #5b46b8;        /* focus ring, AA on canvas */
}
.dark {
  --lilt-primary: #b6a6f5;
  --lilt-primary-tint: #b6a6f5;
  --lilt-primary-soft: #2c2352;
  --lilt-primary-text: #cfc3ff;
  --lilt-focus: #b6a6f5;
}

Color tokens

Token (light)Value
--lilt-canvas#F8F7F3
--lilt-surface#FDFCF8
--lilt-surface-secondary#EFEDE7
--lilt-field#FBFAF6
--lilt-text#121713
--lilt-text-muted#475249
--lilt-text-subtle#69746C
--lilt-border#C4CCC5
--lilt-border-strong#7C887F
--lilt-button#121713
--lilt-button-hover#283029
--lilt-button-text#F7F8F3
--lilt-button-border#121713
--lilt-primary#167F55
--lilt-primary-tint#AEEACF
--lilt-primary-soft#E3F7ED
--lilt-primary-text#164C35
--lilt-focus#167F55
--lilt-warning#FFD0B5
--lilt-highlight#F8E8A6
--lilt-danger#A62B3B
--lilt-danger-soft#FDE8EB
--lilt-danger-soft-hover#F9D7DC
--lilt-danger-text#7B1B2A
--lilt-selection-text#102117
--lilt-chart1#167F55
--lilt-chart2#D97A4E
--lilt-chart3#B3902C
--lilt-chart4#A62B3B
--lilt-chart5#5C7263
Token (dark)Value
--lilt-canvas#101411
--lilt-surface#171C18
--lilt-surface-secondary#222923
--lilt-field#141915
--lilt-text#F1F4EE
--lilt-text-muted#C3CCC4
--lilt-text-subtle#9CA79F
--lilt-border#465149
--lilt-border-strong#88948B
--lilt-button#EEF2EC
--lilt-button-hover#DCE3DD
--lilt-button-text#111612
--lilt-button-border#EEF2EC
--lilt-primary#A5E5C6
--lilt-primary-tint#A5E5C6
--lilt-primary-soft#1D3B2D
--lilt-primary-text#B9F0D3
--lilt-focus#A5E5C6
--lilt-warning#7A4935
--lilt-highlight#5D532C
--lilt-danger#FF94A2
--lilt-danger-soft#4B2028
--lilt-danger-soft-hover#5D2630
--lilt-danger-text#FFB3BD
--lilt-selection-text#102117
--lilt-chart1#A5E5C6
--lilt-chart2#FFB98C
--lilt-chart3#F0D778
--lilt-chart4#FF94A2
--lilt-chart5#9CB3A4

Radius, motion, and type

  • Radius roles: 12px compact controls, 16px controls and cards, 20px dialogs, pills for md/lg buttons.
  • Motion: 140ms fast / 220ms base / 320ms expressive, one shared ease-out curve, hover lift capped at 2px — all removed under reduced motion.
  • Type: Space Grotesk (display, tight tracking) and DM Sans (body, 1.65 line height).
  • Elevation: none. Borders and surface shifts only.