Planchet

Foundations

Color

Design 1.0.0, Built 1.0.0. Figma: not linked yet

Spec

Two layers: primitive scales, and semantic roles that map to one primitive in each theme. Contrast: every text role passes 4.5:1 on its surfaces; border-control passes 3:1.

Primitives

Green
100
#E3FCF0
200
#C0F2DB
300
#8BE3BF
400
#5ED0A5
500
#44B68D
600
#269973
700
#1A7E5D
800
#0C5E45
900
#06402E
Slate
100
#F4F7F5
200
#E4E9E7
300
#C7D0CC
400
#A9B8B1
500
#778880
600
#4A5A53
700
#33413B
800
#232E29
900
#16211D
Amber
100
#FFF2DC
200
#FFDDB2
300
#FCC17C
400
#F0A646
500
#D98B09
600
#B97000
700
#9A5B00
800
#754200
900
#502B00
Red
100
#FFEFED
200
#FFD6D1
300
#FFB1A9
400
#FF8E86
500
#FA6863
600
#DE4544
700
#BD2E31
800
#901E21
900
#621516

Plus white (surface-raised in light) and black (the dark shadow). Components never use these directly.

Semantic roles

RoleLightDarkUse
surfaceslate-100slate-900Page background
surface-raisedwhiteslate-800Panels, inputs, header, dialogs
surface-actiongreen-800green-200Primary button fill
surface-action-hovergreen-700green-400Primary button, hover
surface-action-pressedgreen-900green-100Primary button, pressed
surface-disabledslate-200slate-700Disabled primary button fill
surface-selectedslate-900slate-100Selected chip ("All"), chosen date
surface-accentgreen-700green-400Filled cleared circle, selected calendar day, checkbox
surface-accent-subtlegreen-100green-900Selected row, highlighted option, deposit sign, slim entry row
surface-accent-brightgreen-400green-400Decoration and the payday marker only; never behind text on light
surface-badgegreen-100green-900"Trial" and "Paid" badges
surface-warningamber-100amber-900Behind warning notes
surface-negativered-100red-900Behind below-zero notes
surface-errorred-100red-900Behind error messages
surface-scrimslate-900 at 45%#0000008cThe dimmed page behind a dialog (the one role with transparency)
text-primaryslate-900slate-100Body text, payees, figures
text-secondaryslate-600slate-400Descriptions, "Not cleared", placeholders, dates
text-inverseslate-100slate-900Text and check marks on surface-action, surface-selected and surface-accent (4.65:1 on green-700)
text-disabledslate-500slate-500Text on surface-disabled
text-accentgreen-700green-400Links, secondary button text, deposits, labels, today and payday
text-badgegreen-800green-200Text on surface-badge (7.2:1 light, 9.5:1 dark)
shadow-colorslate-900 at 16%black at 45%The color of shadow-float (the one role named for a shadow)
surface-row-hoverslate-200slate-700A register row under the pointer (wide screens)
surface-secondary-hovergreen-300green-700A secondary button under the pointer
surface-secondary-pressedgreen-500green-800A secondary button while pressed
surface-tertiary-hoverslate-200slate-700A tertiary button under the pointer
surface-tertiary-pressedslate-300slate-600A tertiary button while pressed
text-on-accent-brightslate-900slate-900The "$" on the runway's payday marker, on surface-accent-bright (green-400 in both themes; 8.6:1)
text-warningamber-700amber-400Short once everything clears; a bill that would overdraw
text-negativered-700red-400A balance below zero now
text-errorred-700red-400Form validation and error messages
borderslate-300slate-700Panel and chip borders
border-subtleslate-200slate-700Row dividers inside panels
border-controlslate-500slate-500Input borders and the empty not-cleared circle (3:1 on every row surface)
border-accentgreen-700green-400Current-page underline, selected-row bar, highlighted option outline
border-focusgreen-700slate-400Keyboard focus outline (2px, 2px away)
border-errorred-700red-400Invalid field borders

Rules

  • Every role starts with what it colors: surface-, text- or border-, then its meaning.
  • Amber means overdraft, nothing else: only a bill that would take Immediate below zero before payday, and the runway after it.
  • Red means something is wrong: a balance already below zero, or an error.
  • Color is never the only signal: warnings and negatives carry a ▲ or minus sign and words.
  • Mint stays an accent, never a large fill. Primary buttons use surface-action, not surface-accent.

Where it comes from

  • Figma variables are the only source. npm run tokens writes tokens.generated.css.
  • One role is code-only until Figma has it: text-on-accent-bright.
  • Light surface-scrim and shadow-color are aliases with opacity in Figma; the export writes them empty and the pipeline fills them in. That fallback is permanent.

Changes

  1. 1.0.0, Oct 2 2026: Primitives (green, slate, amber, red, 100 to 900) and 37 semantic roles per theme, from Figma variables.