Focused Review

Shabana token decisions

A clearer page for the colour alignment discussion: what is already canonical, what needs Shabana's decision, and what is just implementation cleanup.

What Matters

The long audit table was mixing three different things. This page separates them so the team can discuss the right thing at the right level.

34Canonical primitives Shabana wants
36Canonical dark semantic tokens
14Actual design decisions needed
Light mode is intentionally excluded: Shabana's light-mode semantic colours are yet to be worked on, so this page only treats dark mode as canonical.

Decisions Needed From Shabana

These are the only items that need design input before we can make dark mode strict against the 34-token primitive palette. Everything else below is cleanup work once these decisions are clear.

AreaSemantic tokenCurrentClosest approved targetDecision needed
Canvas surfaceui.background.pageneutral975 / #030F1Aslate900 / #092D46Should the app canvas move to Slate-900, or should Neutral-975 be added to the approved palette?
Tint surfaceui.background.successgreen900 / #236C18green800 / #268717Should dark success surfaces keep the deeper Green-900, or move to approved Green-800?
Tint surfaceui.background.errorred900 / #470E00red800 / #7A1800Should dark error surfaces keep the deeper Red-900, or move to approved Red-800?
Tint surfaceui.background.warningyellow900 / #332D00yellow800 / #695C00Should dark warning surfaces keep the deeper Yellow-900, or move to approved Yellow-800?
Secondary contentui.text.secondaryneutral300 / #C9D1D9slate300 / #CEDBE4Can secondary text move from neutral grey to slate-tinted copy?
Inverse contentui.text.inverseneutral900 / #0D1117slate900 / #092D46Should inverse text become slate-tinted instead of neutral black?
Brand contentui.text.brandblue400 / #8CA1EEblue300 / #B9C4EEShould brand text use Blue-300, or the stronger approved Blue-500?
Warning contentui.text.warningyellow300 / #FFEF75yellow400 / #FFE940Can warning text move to approved Yellow-400?
Secondary contentui.icon.secondaryneutral300 / #C9D1D9slate300 / #CEDBE4Can secondary icons move from neutral grey to slate-tinted icons?
Inverse contentui.icon.inverseneutral900 / #0D1117slate900 / #092D46Should inverse icons become slate-tinted instead of neutral black?
Brand contentui.icon.brandblue400 / #8CA1EEblue300 / #B9C4EEShould brand icons use Blue-300, or the stronger approved Blue-500?
Feedbackui.feedback.warningyellow300 / #FFEF75yellow400 / #FFE940Can warning indicators move to approved Yellow-400?
Feedbackui.feedback.pendingyellow200 / #FFF5AByellow400 / #FFE940Should pending share Yellow-400 with warning, or get a distinct approved primitive?
Feedbackui.feedback.infoblue400 / #8CA1EEblue300 / #B9C4EEShould info indicators use Blue-300, or the stronger approved Blue-500?

Implementation Cleanup After Decisions

This is not a list for Shabana to review line by line. These are engineering migration buckets created by the palette consolidation.

Primitive Migration Buckets

BucketSizeWhat it containsMigration direction
Slate / Neutral depth18 primitivesExtra light/dark neutrals and slate steps used by light mode, overlays, inverse text, and dark canvas.Decide whether the approved palette needs a deeper app-canvas primitive, otherwise migrate to Slate-900 / Slate-300 / Neutral-500 / Neutral-700.
Blue / Sky7 primitivesOlder brand/info blues plus Sky aliases.Collapse to Blue-300, Blue-500, Blue-600, Blue-800, or Blue-900.
Green5 primitivesLegacy success and light-mode success stops.Collapse to Green-100, Green-300, Green-500, Green-700, or Green-800.
Red5 primitivesIntermediate and deep error stops.Collapse to Red-100, Red-400, Red-700, or Red-800.
Yellow / Gold10 primitivesLegacy warning, pending, and premium gold stops.Decide whether premium gold remains product-specific; otherwise collapse into Yellow-100, Yellow-400, Yellow-700, Yellow-800.
Extended accents15 primitivesExtra peach, rose, lavender, indigo, azure, salmon, cyan, magenta, and terracotta variants.Keep only Violet, Cyan, Coral, and Terracotta as canonical unless Shabana approves a broader accent set.
Base / overlays / glass21 primitivesWhite/black, alpha overlays, glass gradients, pending overlays, and one track helper.Do not treat these as palette colours; either promote as semantic effects or migrate callers to surface/overlay semantics.

Legacy Semantic Alias Buckets

BucketSizeWhat it containsMigration direction
Background aliases12 aliasespageNavy, surfaceSubtle, surface, surfaceSecondary, inverseSecondary, disabled/inset/glass/info aliases.Migrate usage to page, pageSubtle, raised, inverse, or feedback.info.
Text aliases3 aliasesonColor, onFill, info.Migrate usage to primary/inverse or feedback.info depending on context.
Icon aliases8 aliasestertiary, disabled, onColor, onFill, success/error/warning/info.Migrate usage to secondary, primary, or feedback status semantics.
Border aliases3 aliasesdisabled, warning, info.Migrate usage to subtle or feedback status semantics.
Interactive aliases3 aliasesprimaryActive, secondaryBorder, disabledText.Migrate usage to selected, primary, or text.disabled.
Base / overlay aliases6 aliasesbase.black and overlay light/medium/dark/black/transparent.Migrate usage to background.page unless a real overlay semantic is needed.
Why the old table felt too long
It listed every compatibility primitive and every legacy semantic alias as if each one needed a separate design conversation. Most do not. The design conversation is the 14-row decision table above; the rest is engineering migration once those answers are confirmed.

Canonical Tables

These are the approved sets the team should align to for this dark-mode pass.

Canonical Primitive Tokens

FamilyTokenValueRole
Slateslate100#F5F9FBLight inverse surface
Slateslate300#CEDBE4Light border / disabled surface
Slateslate500#7992A6Low-emphasis light content
Slateslate800#25445BStrong slate accent
Slateslate900#092D46Hero surface / brand background
Blueblue100#EEF0F7Info background
Blueblue300#B9C4EESoft brand support
Blueblue500#5D7DF4Brand support
Blueblue600#1E4FDDPrimary CTA
Blueblue800#1334AESmall-text CTA
Blueblue900#142871Dark brand depth
Greengreen100#ECFBEASuccess background
Greengreen300#AFFAA3Positive support
Greengreen400#82FF6FPositive data
Greengreen500#31F613Success/live
Greengreen700#27A414Positive number contrast
Greengreen800#268717Success contrast
Redred100#FFE7E0Error background
Redred400#FF6C47Error/destructive
Redred700#AD2300Negative number contrast
Redred800#7A1800Error contrast
Yellowyellow100#FFFBE0Warning background
Yellowyellow400#FFE940Neutral data reference
Yellowyellow700#9E8C00Warning contrast
Yellowyellow800#695C00Warning depth
ExtendedextendedViolet#DD97F2Third data series
ExtendedextendedCyan#3A9AA8Fourth data series
ExtendedextendedCoral#F1A297Reduced accent
ExtendedextendedTerracotta#A67B4BReduced accent
Neutralneutral100#E6EDF3Primary dark text
Neutralneutral400#8B949ETertiary text
Neutralneutral500#57606ADisabled / strong border
Neutralneutral700#30363DDefault dark border
Neutralneutral800#1C2128Subtle dark divider

Canonical Semantic Dark Groups

GroupCountScope
Surfaces7 tokensPage, raised, page-subtle, inverse, success, error, warning surfaces.
Text9 tokensPrimary, secondary, tertiary, disabled, inverse, brand, success, error, warning text.
Actions5 tokensPrimary, secondary, selected, destructive, disabled action colours.
Borders6 tokensSubtle, default, strong, focus, error, success borders.
Icons4 tokensPrimary, secondary, inverse, brand icons.
Feedback5 tokensSuccess, error, warning, pending, info indicators.