Single source of truth

Shabana Colour Alignment

Where the dark-mode palette stands, the decisions Shabana needs to make, and exactly what a "delete everything not on the list" pass would break. Read against the shabana-test Figma file, 2026-06-01.

Just want the to-do list? The five decisions on one page: What you need to do →

Current State

Shabana's canonical list is 34 primitive stops and 36 dark semantic tokens. The live file holds more: 116 primitives, 97 dark semantics, 98 light semantics. Two things are already settled.

34/34Canonical primitives already at the correct value
6Dark semantic tokens re-aliased to approved primitives (done)
0Variables deleted so far

The six dark tokens Shabana's usage guide moved are done, re-pointed to approved primitives with the alias chain kept (no raw hex):

TokenWasNow
dark/bg/raisedNeutral/925 #09141CSlate-900 #092D46Done
dark/bg/page-subtleNeutral/900 #0D1117Slate-900 #092D46Done
dark/bg/inverseNeutral/100 #E6EDF3Slate-100 #F5F9FBDone
dark/action/selectedraw #FFFFFF33 (20% white)Slate-100 #F5F9FB (solid)Done
dark/border/subtleNeutral/700 #30363DNeutral-800 #1C2128Done
dark/icon/primaryNeutral/White #FFFFFFSlate-100 #F5F9FBDone
One behaviour change to note: dark/action/selected went from translucent 20% white to solid Slate-100, so any selected/active state that relied on see-through will now read as an opaque fill.

Decisions Needed

These five are the only open questions. The six dark-token moves and all 34 primitive values are already settled (see Current State). Each row is a question for Shabana, with the options and our recommendation; the full consequence sits under What Breaks.

#Question to answerOptionsRecommendedStatus
1 Keep the 9 primitives her own dark tokens rely on but that aren't in the 34? (detail)Delete them and 14 of her own canonical dark tokens lose their colour. Add the 9 to the approved palette, or remap each token to one of the 34 Add as approved primitives (they're already in use) Blocker
2 Is light mode in or out of scope? (detail)The list is dark-only, so all 98 light tokens count as "unlisted" and would be deleted. Keep all 98 light tokens until the light pass, or delete now Keep; treat light as out of scope Blocker
3 What happens to the ~50 in-use colours not on the list? (detail)They're referenced in cur8-mob, so deleting the variable orphans live usage. Replace with an approved colour, approve as an internal exception, or keep internal-only Approve as internal exceptions until a code migration is scoped Needs direction
4 Approve deleting the 16 safe orphans? (detail)2 test tokens + 14 unused stops, with no alias and no code reference. Delete now, or keep Delete now (no breakage) Ready
5 Is the 34-stop palette a hard deletion target or an approved working palette?Sets whether legacy primitives get removed, or kept internal and simply unpromoted. Hard deletion target, or working palette with legacy kept internally Approved working palette Needs direction

What Breaks If We Delete Blindly

The evidence behind the decisions above. A literal "delete everything not on the list" pass is not safe to run as-is.

Every token, classified: for the complete per-token breakdown of all 311 tokens (kept / breaks / verify / safe), see the Token Audit page →

1. The core conflict: 9 primitives her own tokens need

Shabana's primitive list (34) and her dark semantic list (36) are not internally consistent. Fourteen of her own canonical dark tokens point at primitives outside the 34. Delete those primitives and her own tokens lose their colour.

Primitive (not in the 34)ValueCanonical token(s) that need it
Neutral/975#030F1Adark/bg/page
Green/Green-900#236C18dark/bg/success
Red/Red-900#470E00dark/bg/error
Yellow/Yellow-900#332D00dark/bg/warning
Neutral/300#C9D1D9dark/text/secondary, dark/icon/secondary
Neutral/900#0D1117dark/text/inverse, dark/icon/inverse
Blue/Blue-400#8CA1EEdark/text/brand, dark/icon/brand, dark/feedback/info
Yellow/Yellow-300#FFEF75dark/text/warning, dark/feedback/warning
Yellow/Yellow-200#FFF5ABdark/feedback/pending

2. Light mode would be wiped

The list is dark-only, so none of the 98 light semantic tokens are on it. A literal pass deletes the entire light theme, including bg/page, text/primary, action/primary and the full light product, badge and entity set.

Almost certainly not intended. Keep Semantic Light untouched until the dedicated light-mode pass.

3. ~50 colours are live in cur8-mob

Not on the list, but referenced in the app through semantic mappings or component files. Deleting the variable orphans the usage, so each family needs a replace / approve / keep-internal call plus a code migration.

FamilyMembersWhere used
Extended accentsPeach, Rose, Lavender, Salmon, Cyan-Light/Dark, Magenta, Magenta-Light, Terracotta-light/Darkdeal types, entity accents and backgrounds
Gold / premiumGold-200, Gold-500, Gold-800, Gold-pending setpremium badges, pending states
Info bluesSky-400, Blue-950info text/icons, info badge and background
Neutrals / slate stepsNeutral-200/300/600/900/975, Slate-150/200/400/600/700secondary text, inverse, inset, page tints, muted accents
Overlays / glassNeutral/Black alpha set, Neutral/Glass(+10/80), White-8/10/12/31/50, Glass gradientsmodals, drawers, frosted panels, blur fallbacks
Status depthsGreen-50/600/750/900, Yellow-50/600/750/900/300/200, Red-900tint surfaces, feedback, high-contrast status text

How the numbers break down

SetBucketCountMeaning
Primitives (116)Canonical34On the list, values already correct.
Load-bearing49Not on the list, but a kept semantic token aliases to them (the 9 above plus 40 backing info, product, overlay, glass and light tokens). Cannot delete without breaking a token.
Orphan33No semantic alias, so these are the deletion candidates. But orphan is not the same as safe: 17 are still used in code or purpose-built, only 16 are safe to delete. See the orphan breakdown.
Dark semantics (97)On the list36Shabana's canonical dark set.
Would be deleted61Product/domain (~37), info family (4), disabled/inset variants (~7), overlays/base/on-fill (~9). Most are used in the app today.
Light semantics (98)Would be deleted98All of them, see point 2.
Net: of 116 primitives, only about 16 are safe to delete today without a design decision or a code migration.

Canonical Reference

The approved set to align to, one table per fact. Open as needed.

34 canonical primitives
FamilyTokenValue
SlateSlate-100#F5F9FB
SlateSlate-300#CEDBE4
SlateSlate-500#7992A6
SlateSlate-800#25445B
SlateSlate-900#092D46
BlueBlue-100#EEF0F7
BlueBlue-300#B9C4EE
BlueBlue-500#5D7DF4
BlueBlue-600#1E4FDD
BlueBlue-800#1334AE
BlueBlue-900#142871
GreenGreen-100#ECFBEA
GreenGreen-300#AFFAA3
GreenGreen-400#82FF6F
GreenGreen-500#31F613
GreenGreen-700 (N)#27A414
GreenGreen-800#268717
RedRed-100#FFE7E0
RedRed-400#FF6C47
RedRed-700 (N)#AD2300
RedRed-800#7A1800
YellowYellow-100#FFFBE0
YellowYellow-400#FFE940
YellowYellow-700#9E8C00
YellowYellow-800#695C00
ExtendedViolet#DD97F2
ExtendedCyan#3A9AA8
ExtendedCoral#F1A297
ExtendedTerracotta#A67B4B
NeutralNeutral-100#E6EDF3
NeutralNeutral-400#8B949E
NeutralNeutral-500#57606A
NeutralNeutral-700#30363D
NeutralNeutral-800#1C2128
36 canonical dark semantic tokens
GroupTokenValueRole
Surfacedark/bg/page#030F1AApp canvas
Surfacedark/bg/raised#092D46Card, panel, sheet
Surfacedark/bg/page-subtle#092D46Sidebar, tray
Surfacedark/bg/inverse#F5F9FBLight islands in dark UI
Surfacedark/bg/success#236C18Success tint
Surfacedark/bg/error#470E00Error tint
Surfacedark/bg/warning#332D00Warning tint
Textdark/text/primary#E6EDF3Body, headings
Textdark/text/secondary#C9D1D9Descriptions
Textdark/text/tertiary#8B949EPlaceholder, hint
Textdark/text/disabled#57606ADisabled text
Textdark/text/inverse#0D1117Text on light
Textdark/text/brand#8CA1EELinks, brand
Textdark/text/success#31F613Success inline
Textdark/text/error#FF6C47Error inline
Textdark/text/warning#FFEF75Warning inline
Actiondark/action/primary#1E4FDDHero CTA
Actiondark/action/secondary#30363DSecondary / ghost
Actiondark/action/selected#F5F9FBSelected / active
Actiondark/action/destructive#FF6C47Delete / danger
Actiondark/action/disabled#57606ADisabled CTA
Borderdark/border/subtle#1C2128Divider
Borderdark/border/default#30363DCard / input outline
Borderdark/border/strong#57606AEmphasis / hover
Borderdark/border/focus#F5F9FBFocus ring
Borderdark/border/error#FF6C47Error outline
Borderdark/border/success#31F613Success outline
Icondark/icon/primary#F5F9FBPrimary icon
Icondark/icon/secondary#C9D1D9Secondary icon
Icondark/icon/inverse#0D1117Icon on light
Icondark/icon/brand#8CA1EEBrand icon
Feedbackdark/feedback/success#31F613Success / live
Feedbackdark/feedback/error#FF6C47Error / critical
Feedbackdark/feedback/warning#FFEF75Warning / at-risk
Feedbackdark/feedback/pending#FFF5ABPending / queued
Feedbackdark/feedback/info#8CA1EEInfo notice
Usage notes (accessibility)
ColourUse forA11y note
Blue-600Hero CTA, primary button, active indicatorLarge-text AA only (min 18px)
Blue-800CTA text on light/inverse and any CTA text under 18pxFull AA at 7.2:1
Green-400Positive growth and data-viz highlights (electric lime)High-impact data colour, not a generic semantic
Yellow-400Neutral / average reference line in chartsData-viz primitive
dark/text/brand, dark/icon/brandLinks, brand moments, onboarding iconsLarge-text only

Full Inventory

The detail behind the buckets, for the engineering migration once the decisions land.

Orphan primitives (33)

An orphan is a primitive no semantic token aliases to, so orphans are the deletion candidates. But orphan does not mean safe: 17 of the 33 are still referenced in cur8-mob code or are purpose-built, leaving only 16 safe to remove now. Code references are from the 2026-06-01 audit, so re-check before deleting.

Orphans to keep or verify (17) — used in code or purpose-built
GroupPrimitivesWhy keep
White overlaysWhite-8, White-10, White-12, White-31, White-50whiteOverlay* in modal and fund-notice styled files
Glass gradientsGlass/Gradient-start, Glass/Gradient-end, Glass/Icon-start, Glass/Icon-endIconBadge, if-isa status card, summary/review screens
Dark glassNeutral/Glass-10, Neutral/Glass-80pv2 card and surface backgrounds
Gold pendingGold/Gold-pending, Gold/Gold-pending-bg, Gold/Gold-pending-border, Gold/Gold-pending-subtlepurpose-built for pending badges; confirm usage before removing
OtherBlue-200, Neutral/925SecondaryDarkExplorer.stories.tsx (Neutral/925 only freed up after the recent dark/bg/raised re-alias)
Orphans safe to delete now (16)

No semantic alias and no known code reference. Lowest-risk trim.

TypeTokens
Test / junk (2)TEST 02, red-icon
Unused stops (14)Blue-700, Green-200, Green-track-subtle, Red-200, Red-300, Red-500, Red-600, Yellow-500, Neutral-50, Neutral-950, Extended/Indigo, Extended/Azure, Extended/Magenta-Dark, Sky-700
Dark semantics that would be deleted (61)
GroupExamplesRisk
Product / domain (~37)dark/product/deal/*, /entity/*, /badge/*, /premium/*, /number/*High
Info family (4)dark/bg/info, dark/text/info, dark/icon/info, dark/border/infoHigh
Disabled / inset (~7)dark/bg/disabled, dark/bg/inset, dark/action/disabled-text, dark/action/secondary-borderMedium
Overlays / base / on-fill (~9)dark/overlay/*, dark/base/black, dark/text/on-fill, dark/icon/tertiaryMedium