@trading-game/design-intelligence-layer 0.12.3 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -131,29 +131,43 @@ import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
131
131
  | CSS Variable | Tailwind Class | Usage |
132
132
  | --------------------- | ------------------- | ------------------------- |
133
133
  | `--primary` | `bg-primary` / `text-primary` | Primary CTA, brand color, interactive elements |
134
+ | `--on-primary` | `text-on-primary` | Text/icon color paired with `bg-primary` (always white) |
134
135
  | `--primary-hover` | `bg-primary-hover` | Hover & pressed states on primary elements |
136
+ | `--primary-inverse` | `bg-primary-inverse` | Inverted primary surface — white bg for use on dark/coloured areas |
137
+ | `--on-primary-inverse`| `text-on-primary-inverse` | Text/icon color paired with `bg-primary-inverse` (always blue) |
135
138
 
136
139
  ### 2.3 — Semantic (Trading Status)
137
140
 
141
+ > **Naming convention:** every surface token has a paired `--on-<name>` foreground (text/icon) token. Use the pair together (`bg-semantic-X` + `text-on-semantic-X`) for guaranteed legibility on the saturated surface.
142
+
138
143
  | CSS Variable | Tailwind Class | Usage |
139
144
  | -------------------------- | ------------------------------------------- | --------------------------------------------- |
140
- | `--semantic-win` | `text-semantic-win` / `bg-semantic-win` | Win / Profit / Positive outcomes |
141
- | `--semantic-loss` | `text-semantic-loss` / `bg-semantic-loss` | Loss / Negative outcomes |
142
- | `--semantic-warning` | `text-semantic-warning` / `bg-semantic-warning` | Warning / Caution / Non-destructive alerts |
143
- | `--semantic-info` | `text-semantic-info` / `bg-semantic-info` | Informational alerts |
144
- | `--semantic-credit` | `bg-semantic-credit` | Credit / bonus badge background (`#F9840F` amber-orange) |
145
- | `--semantic-credit-text` | `text-semantic-credit-text` | Credit / bonus badge foreground (`#713813` dark amber) |
145
+ | `--semantic-win` | `bg-semantic-win` / `text-semantic-win` | Win / Profit / Positive outcomes |
146
+ | `--on-semantic-win` | `text-on-semantic-win` | Text/icon on `bg-semantic-win` surfaces (white) |
147
+ | `--semantic-loss` | `bg-semantic-loss` / `text-semantic-loss` | Loss / Negative outcomes |
148
+ | `--on-semantic-loss` | `text-on-semantic-loss` | Text/icon on `bg-semantic-loss` surfaces (white) |
149
+ | `--semantic-warning` | `bg-semantic-warning` / `text-semantic-warning` | Warning / Caution / Non-destructive alerts |
150
+ | `--on-semantic-warning` | `text-on-semantic-warning` | Text/icon on `bg-semantic-warning` surfaces (white) |
151
+ | `--semantic-info` | `bg-semantic-info` / `text-semantic-info` | Informational alerts |
152
+ | `--semantic-boost` | `bg-semantic-boost` | Boost / bonus badge background (`#F9840F` amber-orange) |
153
+ | `--on-semantic-boost` | `text-on-semantic-boost` | Boost / bonus badge foreground (`#713813` dark amber) |
146
154
 
147
155
  > All semantic tokens support opacity variants (e.g. `bg-semantic-warning/10` for tinted backgrounds). For structured alpha surfaces, use the primitive alpha scales — see Section 2.10.
148
156
 
149
157
  ### 2.4 — Text & Icon Colors
150
158
 
151
- | CSS Variable | Tailwind Class | Usage |
152
- | ------------------------------- | --------------------------------------- | ------------------------- |
153
- | `--on-prominent` | `text-on-prominent` | Primary text (headings, body) |
154
- | `--on-prominent-static-inverse` | `text-on-prominent-static-inverse` | Always-white text (e.g. on primary blue buttons) |
155
- | `--on-subtle` | `text-on-subtle` | Secondary text (descriptions, labels) |
156
- | `--on-disabled` | `text-on-disabled` | Disabled text (inactive controls, placeholders) |
159
+ The system follows a Material-style `<surface>` / `on-<surface>` pair convention: no prefix = surface/background, `on-` prefix = the foreground (text/icon) color paired with that surface.
160
+
161
+ | CSS Variable | Tailwind Class | Usage |
162
+ | ------------------------- | ----------------------------- | ------------------------- |
163
+ | `--prominent` | `bg-prominent` | Light surface (page chrome, cards) |
164
+ | `--on-prominent` | `text-on-prominent` | Text/icon on `bg-prominent` (black) |
165
+ | `--prominent-inverse` | `bg-prominent-inverse` | Dark surface for use on light pages (e.g. toasts) |
166
+ | `--on-prominent-inverse` | `text-on-prominent-inverse` | Text/icon on `bg-prominent-inverse` (white) |
167
+ | `--on-subtle` | `text-on-subtle` | Secondary text (descriptions, labels) — paired with `bg-subtle` |
168
+ | `--on-disabled` | `text-on-disabled` | Disabled text (inactive controls, placeholders) |
169
+
170
+ > **Deprecated aliases:** `--on-prominent-static-inverse` and `--surface-inverse-static` remain defined in CSS for backwards-compat with external consumers using raw `var()` references, but internal components no longer use them — prefer the explicit `on-<surface>` / `<surface>-inverse` pairs above.
157
171
 
158
172
  ### 2.5 — Borders & Inputs
159
173
 
@@ -275,7 +289,7 @@ import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
275
289
  | Show WIN / profit / positive | `text-semantic-win` | Primary blue for profit |
276
290
  | Show LOSS / negative | `text-semantic-loss` | Any non-token red |
277
291
  | Show WARNING / caution | `text-semantic-warning` | Raw orange hex or primary tint |
278
- | Show a credit / bonus badge | `<Badge variant="fill-credit">` (uses `bg-semantic-credit` + `text-semantic-credit-text`) | Hardcoded amber hex values |
292
+ | Show a boost / bonus badge | `<Badge variant="fill-boost">` (uses `bg-semantic-boost/16` + `text-on-semantic-boost`) | Hardcoded amber hex values |
279
293
  | Color a tab container background | `bg-tabs` | `bg-subtle` for tabs |
280
294
  | Color an active/selected tab | `bg-tabs-active` | `bg-prominent` for active tab |
281
295
  | Color a page background | `bg-prominent` | `bg-white` directly |
@@ -293,7 +307,9 @@ import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
293
307
  | Pick a heading font | `font-display` | System fonts, raw font-family names |
294
308
  | Pick a body font | `font-body` | Raw font-family names |
295
309
  | Style button text | `font-display font-bold`, sentence case | `uppercase` on buttons |
296
- | Write white text on a dark surface | `text-on-prominent-static-inverse`| `text-white` or raw white hex |
310
+ | Write text on a primary blue surface | `text-on-primary` | `text-white` or `text-on-prominent-static-inverse` |
311
+ | Write text on a dark inverse surface | `text-on-prominent-inverse` | `text-white` or raw white hex |
312
+ | Write text on a semantic surface | `text-on-semantic-win` / `-loss` / `-warning` / `-boost` | `text-white` (the surface may not always be dark) |
297
313
 
298
314
  ---
299
315
 
@@ -393,13 +409,13 @@ The design system uses a custom radius scale (base = 10px). Use these named toke
393
409
 
394
410
  ### 6.1 — Variants
395
411
 
396
- | Variant | Background | Text Color | Border | Hover | Use on |
397
- | -------------------- | --------------------------------- | ---------------------------------- | ---------------------------------------- | ---------------------------------------- | -------------- |
398
- | `primary` | `bg-primary` | `text-on-prominent-static-inverse` | none | `bg-primary-hover` | Light surfaces |
399
- | `primary-inverse` | `bg-on-prominent-static-inverse` | `text-primary` | none | `bg-on-prominent-static-inverse/80` | Dark/coloured surfaces |
400
- | `secondary` | transparent | `text-on-prominent` | `border-[1.5px] border-border-prominent` | `bg-secondary-hover` | Light surfaces |
401
- | `secondary-inverse` | transparent | `text-on-prominent-static-inverse` | `border-[1.5px] border-on-prominent-static-inverse` | `bg-on-prominent-static-inverse/10` | Dark/coloured surfaces |
402
- | `tertiary` | transparent | `text-primary` | none | `bg-primary/[0.08]` | Light surfaces |
412
+ | Variant | Background | Text Color | Border | Hover | Use on |
413
+ | -------------------- | -------------------- | --------------------------- | ---------------------------------------- | --------------------------- | ---------------------- |
414
+ | `primary` | `bg-primary` | `text-on-primary` | none | `bg-primary-hover` | Light surfaces |
415
+ | `primary-inverse` | `bg-primary-inverse` | `text-on-primary-inverse` | none | `bg-primary-inverse/80` | Dark/coloured surfaces |
416
+ | `secondary` | transparent | `text-on-prominent` | `border-[1.5px] border-border-prominent` | `bg-secondary-hover` | Light surfaces |
417
+ | `secondary-inverse` | transparent | `text-on-prominent-inverse` | `border-[1.5px] border-primary-inverse` | `bg-primary-inverse/10` | Dark/coloured surfaces |
418
+ | `tertiary` | transparent | `text-primary` | none | `bg-primary/[0.08]` | Light surfaces |
403
419
 
404
420
  ### 6.2 — Sizes
405
421
 
@@ -551,7 +567,7 @@ import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, Dialog
551
567
  | Sidebar | [complex] | SidebarProvider, SidebarTrigger, SidebarInset, SidebarHeader, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarRail, useSidebar |
552
568
  | Skeleton | [simple] | — |
553
569
  | Slider | [simple] | — |
554
- | Sonner (Toaster) | [simple] | — (also import `toast` from `sonner`) |
570
+ | Toast | [simple] | `Toaster`, `toast` import both from `@trading-game/design-intelligence-layer` (the toaster wraps `sonner` internally; `toast` is re-exported so consumers don't need to import the underlying library) |
555
571
  | Spinner | [simple] | — |
556
572
  | Stepper | [simple] | — |
557
573
  | Switch | [simple] | — |
@@ -559,7 +575,7 @@ import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, Dialog
559
575
  | Tabs | [composed] | TabsList (`variant`: default/line, `size`: sm/md/lg), TabsTrigger (`iconPosition`: inline/top), TabsContent. Root accepts `orientation`: horizontal/vertical. |
560
576
  | Textarea | [simple] | — |
561
577
  | TicketCard | [composed] | — (`icon`, `label`, `value`, `currency`, `stubLabel`, `onStubClick`, `stubDisabled`, `compact`) |
562
- | CreditTicketCard | [composed] | — (`icon`, `label`, `value`, `currency`, `stubLabel`, `onStubClick`, `stubDisabled`, `creditAmount`, `creditCurrency`, `compact`) — use when a credit badge must appear below the value |
578
+ | BoostTicketCard | [composed] | — (`icon`, `label`, `value`, `currency`, `stubLabel`, `onStubClick`, `stubDisabled`, `boostAmount`, `boostCurrency`, `compact`) — use when a boost badge must appear below the value |
563
579
  | Toggle | [simple] | — |
564
580
  | ToggleGroup | [composed] | ToggleGroupItem |
565
581
  | Tooltip | [composed] | TooltipTrigger, TooltipContent, TooltipProvider |
@@ -576,7 +592,7 @@ These are styling behaviors you can't discover from TypeScript types alone:
576
592
  | InputGroup | Wraps `Input` with inline addons (icons, buttons, text). **Sizes:** `sm` (h-8) / `md` (h-10, default) / `lg` (h-12) — pass `size` to `InputGroup`, it flows to `InputGroupInput` via context. **Padding:** when any `inline-start` or `inline-end` addon is present, input text gets equal `pl-2 pr-2` (8px) on both sides for visual symmetry. Without addons, Input's default `px-3`/`px-4` applies. |
577
593
  | InputOTP | **Variants:** OTP 4 digits (single group, 4 slots), OTP 6 digits (single group, 6 slots), OTP 6 split (two groups of 3 with `InputOTPSeparator`), OTP 8 digits (single group, 8 slots), OTP 6 separated (each slot in its own `InputOTPGroup` for individually spaced boxes). Slot: `h-9 w-9`, `border-border-subtle`, `rounded-sm` on first/last. Focus: `border-primary` + `ring-primary/[0.08]`. |
578
594
  | NavigationButton | Icon-only tertiary button for navigation. `text-on-prominent` (black icons), `hover:bg-secondary-hover`. **Sizes (8-point grid):** `lg` 48px / 24px icon, `md` 40px / 20px icon, `sm` 32px / 20px icon, `xs` 24px / 16px icon. States: focus `ring-ring/50`, active `opacity-60`, disabled `opacity-24`. Supports `asChild`. |
579
- | Tooltip | Bubble: `bg-primary` + `text-on-prominent-static-inverse` (not `bg-popover`). Always wrap in `<TooltipProvider>` |
595
+ | Tooltip | Bubble: `bg-primary` + `text-on-primary` (not `bg-popover`). Always wrap in `<TooltipProvider>` |
580
596
  | Sidebar | Menu buttons use `rounded-sm`. Selection: `bg-secondary-hover` + `text-primary` + `font-semibold` |
581
597
  | Breadcrumb | Active page: `text-primary font-medium`. Links: `text-on-subtle` |
582
598
  | Tabs | **Variants:** `default` (pill, `bg-tabs`) and `line` (underline, transparent bg). **Sizes:** `sm` (h-8, text-xs), `md` (h-10, text-sm, default), `lg` (h-12, text-base). **Icon position:** `inline` (default) or `top` (stacks icon above label). **Orientation:** `horizontal` (default) or `vertical` (line variant renders left-edge indicator). Hover: `bg-secondary-hover` (default) / `text-primary` (line). Selected: `bg-tabs-active` + `text-primary font-semibold`. Line variant underline: `bg-primary`. |
@@ -588,9 +604,9 @@ These are styling behaviors you can't discover from TypeScript types alone:
588
604
  | Slider | Thumb: square `rounded-[4px]`, `bg-primary`. Track range: `bg-slider-range` |
589
605
  | Dialog/Sheet | Footer buttons should use `size="md"`. Overlay: `bg-overlay` |
590
606
  | Menubar | Hover: `bg-primary/[0.08]`. Open state: `bg-primary/10` |
591
- | Badge | Variants: `default` (solid blue), `default-success`, `default-fail`; `fill` (blue tint), `fill-success`, `fill-fail`, `fill-warning`; `fill-credit` (amber-orange tint — `bg-semantic-credit/16` bg + `text-semantic-credit-text` foreground — use for credit/bonus labels, always pair with a `TicketPlus` icon); `outline`; `ghost`, `ghost-success`, `ghost-fail`. Base class no longer applies `tracking-wide` — letter spacing is default. |
592
- | TicketCard | **Icon:** pass any `ReactNode` via `icon`. Icon container: `size-10` rounded-full, `border-2 border-primary`, `text-primary`. **Labels:** `label` (above value) and `stubLabel` (stub button) render in sentence case — do NOT apply `uppercase` or `tracking-widest`. Stub: `w-[100px]` `bg-primary` button, `text-on-prominent-static-inverse`, shimmer sweep animation. Disabled stub: `opacity-50`, `cursor-not-allowed`. Perforation notches sit outside the card box — do NOT put `overflow-hidden` on the card wrapper. **`compact`** (default `false`): `true` = mobile layout — reduces left-content horizontal padding from `px-4 gap-4` to `px-2 gap-2`. **For credit use cases:** use `CreditTicketCard` instead — it renders a `<Badge variant="fill-credit">` inline below the value. |
593
- | CreditTicketCard | Same visual shell as `TicketCard` (perforation notches, tear-line, shimmer stub). The card height is **variable** (grows with content via `py-4`) rather than fixed at `h-20`. Credit is displayed as an inline `<Badge variant="fill-credit" size="sm">` with a `TicketPlus` icon: *"Credit: {creditAmount} {creditCurrency}"*. Tokens used: `bg-subtle`, `bg-primary`, `bg-primary-hover`, `text-on-prominent-static-inverse`, `bg-semantic-credit/16`, `text-semantic-credit-text`. Supports `compact` prop for mobile layout (same padding reduction as `TicketCard`). |
607
+ | Badge | Variants: `default` (solid blue), `default-success`, `default-fail`, `default-warning` (all use `bg-semantic-*` + matching `text-on-semantic-*` foreground); `fill` (blue tint), `fill-success`, `fill-fail`, `fill-warning`; `fill-boost` (amber-orange tint — `bg-semantic-boost/16` bg + `text-on-semantic-boost` foreground — use for boost/bonus labels, always pair with a `Rocket` icon); `outline`; `ghost`, `ghost-success`, `ghost-fail`. Base class no longer applies `tracking-wide` — letter spacing is default. |
608
+ | TicketCard | **Icon:** pass any `ReactNode` via `icon`. Icon container: `size-10` rounded-full, `border-2 border-primary`, `text-primary`. **Labels:** `label` (above value) and `stubLabel` (stub button) render in sentence case — do NOT apply `uppercase` or `tracking-widest`. Stub: `w-[100px]` `bg-primary` button, `text-on-primary`, shimmer sweep animation. Disabled stub: `opacity-50`, `cursor-not-allowed`. Perforation notches sit outside the card box — do NOT put `overflow-hidden` on the card wrapper. **`compact`** (default `false`): `true` = mobile layout — reduces left-content horizontal padding from `px-4 gap-4` to `px-2 gap-2`. **For boost use cases:** use `BoostTicketCard` instead — it renders a `<Badge variant="fill-boost">` inline below the value. |
609
+ | BoostTicketCard | Same visual shell as `TicketCard` (perforation notches, tear-line, shimmer stub). The card height is **variable** (grows with content via `py-4`) rather than fixed at `h-20`. The boost is displayed as an inline `<Badge variant="fill-boost" size="sm">` with a leading `Rocket` icon and a trailing `Info` icon: *"Boost: {boostAmount} {boostCurrency}"*. Tokens used: `bg-subtle`, `bg-primary`, `bg-primary-hover`, `text-on-primary`, `bg-semantic-boost/16`, `text-on-semantic-boost`. Supports `compact` prop for mobile layout (same padding reduction as `TicketCard`). |
594
610
  | Toggle | Pressed: `bg-primary/10` + `border-primary` + `text-primary` |
595
611
  | Calendar | Selected: `bg-secondary-hover` + `text-primary font-bold`. Today: primary dot below date |
596
612
 
@@ -674,7 +690,8 @@ A product app top header bar. Not a landing page component — used inside the t
674
690
  | Using `bg-white` or `bg-black` | Use `bg-prominent` or `bg-overlay` |
675
691
  | Using `border-border` | Use `border-border-subtle` or `border-border-prominent` |
676
692
  | Using `bg-hover` | Use `bg-primary/[0.08]` or `bg-secondary-hover` |
677
- | Using `text-primary-foreground` | Use `text-on-prominent-static-inverse` |
693
+ | Using `text-primary-foreground` | Use `text-on-primary` (the paired foreground for `bg-primary`) |
694
+ | Using `text-on-prominent-static-inverse` for new code | Pick the paired `text-on-<surface>` for whatever surface sits behind: `text-on-primary` for `bg-primary`, `text-on-prominent-inverse` for dark inverse surfaces, `text-on-semantic-win` / `-loss` / `-warning` / `-boost` for semantic colored surfaces. The static-inverse token is kept as a deprecated alias only. |
678
695
  | Using `text-on-decorative` | Use `text-on-subtle` |
679
696
  | Using `font-mono` expecting Plus Jakarta Sans | Use `font-display` or `font-body` |
680
697
  | Using `font-bold` for headings | Use `font-semibold` (600) for headings |
@@ -60,23 +60,38 @@ import { Button, Card, Badge } from "@trading-game/design-intelligence-layer"
60
60
  ✅ bg-overlay — modal/dialog backdrop (black 50%) — ONLY for overlays
61
61
  ✅ bg-primary — brand blue #2323FF — CTAs and primary actions
62
62
  ✅ bg-primary-hover — darker blue #0B0BD2 — primary button hover
63
+ ✅ bg-primary-inverse — white surface for use on dark/coloured areas
64
+ ✅ bg-prominent-inverse — dark surface for use on light pages (toasts, etc.)
63
65
  ✅ bg-secondary-hover — light grey #EEEEEE — outline/secondary button hover
64
66
  ✅ bg-semantic-win — green — profit/positive
65
67
  ✅ bg-semantic-loss — red — loss/negative
68
+ ✅ bg-semantic-warning — orange — warning/caution
69
+ ✅ bg-semantic-boost — amber-orange #F9840F — boost/bonus badge (tinted: bg-semantic-boost/16)
66
70
  ```
67
71
 
68
- #### Text tokens
72
+ #### Text tokens — paired with a surface
73
+
74
+ > Convention: `bg-<surface>` always has a paired `text-on-<surface>` foreground. Use them together for guaranteed legibility.
75
+
69
76
  ```
70
- ✅ text-on-prominent primary text (black #000000)
71
- ✅ text-on-prominent-static-inverse always white — for text on dark/primary bg
72
- ✅ text-on-subtle secondary text (mid grey)
73
- ✅ text-on-disabled disabled / inactive text (light grey ~#BBBBBB)
77
+ ✅ text-on-prominent paired with bg-prominent (black #000000) — default body text
78
+ ✅ text-on-prominent-inverse paired with bg-prominent-inverse (white)toast text, etc.
79
+ ✅ text-on-primary paired with bg-primary (white) — primary button label, tooltip text
80
+ ✅ text-on-primary-inverse paired with bg-primary-inverse (blue) primary-inverse button label
81
+ ✅ text-on-semantic-win — paired with bg-semantic-win (white)
82
+ ✅ text-on-semantic-loss — paired with bg-semantic-loss (white)
83
+ ✅ text-on-semantic-warning — paired with bg-semantic-warning (white)
84
+ ✅ text-on-semantic-boost — paired with bg-semantic-boost (dark amber #713813)
85
+ ✅ text-on-subtle — secondary text (mid grey)
86
+ ✅ text-on-disabled — disabled / inactive text (light grey ~#BBBBBB)
74
87
 
75
- ✅ text-primary — brand blue #2323FF
76
- ✅ text-semantic-win — green — profit/positive
77
- ✅ text-semantic-loss — red — loss/negative
88
+ ✅ text-primary — brand blue #2323FF — inline brand text over neutral surfaces
89
+ ✅ text-semantic-win — green — profit/positive inline text
90
+ ✅ text-semantic-loss — red — loss/negative inline text
78
91
  ```
79
92
 
93
+ > ⚠️ **Deprecated:** `text-on-prominent-static-inverse` still works (aliased to `--on-prominent-inverse`) but new code should pick the explicit `text-on-<surface>` for whatever background sits behind the text.
94
+
80
95
  #### Border tokens
81
96
  ```
82
97
  ✅ border-border-subtle — light grey #EEEEEE — default UI borders, dividers, cards
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trading-game/design-intelligence-layer",
3
- "version": "0.12.3",
3
+ "version": "0.13.0",
4
4
  "description": "Trading Game Design System — shadcn/ui components with Tailwind CSS v4",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
package/src/styles.css CHANGED
@@ -18,6 +18,15 @@
18
18
  --color-prominent: var(--prominent);
19
19
  --color-on-prominent: var(--on-prominent);
20
20
  --color-on-prominent-static-inverse: var(--on-prominent-static-inverse);
21
+ --color-prominent-inverse: var(--prominent-inverse);
22
+ --color-on-prominent-inverse: var(--on-prominent-inverse);
23
+ --color-on-primary: var(--on-primary);
24
+ --color-primary-inverse: var(--primary-inverse);
25
+ --color-on-primary-inverse: var(--on-primary-inverse);
26
+ --color-on-semantic-win: var(--on-semantic-win);
27
+ --color-on-semantic-loss: var(--on-semantic-loss);
28
+ --color-on-semantic-warning: var(--on-semantic-warning);
29
+ --color-on-semantic-boost: var(--on-semantic-boost);
21
30
  --font-sans: var(--font-plus-jakarta-sans);
22
31
  --font-body: var(--font-plus-jakarta-sans);
23
32
  --font-display: var(--font-plus-jakarta-sans);
@@ -48,8 +57,7 @@
48
57
  --color-semantic-win: var(--semantic-win);
49
58
  --color-semantic-loss: var(--semantic-loss);
50
59
  --color-semantic-warning: var(--semantic-warning);
51
- --color-semantic-credit: var(--semantic-credit);
52
- --color-semantic-credit-text: var(--semantic-credit-text);
60
+ --color-semantic-boost: var(--semantic-boost);
53
61
  --color-alert-info-text: var(--alert-info-text);
54
62
  --color-alert-info-border: var(--alert-info-border);
55
63
  --color-alert-error-text: var(--alert-error-text);
@@ -168,11 +176,11 @@
168
176
 
169
177
  /* ── Amber ── */
170
178
  --primitive-amber-500: oklch(0.74 0.18 72);
171
- /* #ef9f00 — golden amber; ticket credit progress fill */
179
+ /* #ef9f00 — golden amber; ticket boost progress fill */
172
180
  --primitive-amber-600: #F9840F;
173
- /* #F9840F — warm orange-amber; credit badge background base */
181
+ /* #F9840F — warm orange-amber; boost badge background base */
174
182
  --primitive-amber-800: oklch(0.40 0.10 52);
175
- /* #713813 — dark amber/brown; ticket credit label text */
183
+ /* #713813 — dark amber/brown; ticket boost label text */
176
184
 
177
185
  /* ── Violet ── */
178
186
  --primitive-violet-500: oklch(0.601 0.263 301.6);
@@ -246,11 +254,25 @@
246
254
  ══════════════════════════════════════════════════════════════ */
247
255
  :root {
248
256
  --prominent: var(--primitive-mono-50);
257
+ /* #FFFFFF — light surface (page chrome, cards) */
249
258
  --on-prominent: var(--primitive-mono-1000);
250
- --on-prominent-static-inverse: var(--primitive-mono-50);
251
- /* #FFFFFF — always white, never changes between themes */
259
+ /* #000000 — text/icon color for use on prominent surfaces */
260
+ --prominent-inverse: var(--primitive-mono-1000);
261
+ /* #000000 — dark surface for use on light pages (e.g. toasts) */
262
+ --on-prominent-inverse: var(--primitive-mono-50);
263
+ /* #FFFFFF — text/icon color for use on prominent-inverse surfaces */
252
264
  --primary: var(--primitive-blue-500);
265
+ /* #2323FF — brand primary surface */
266
+ --on-primary: var(--primitive-mono-50);
267
+ /* #FFFFFF — text/icon color for use on primary surfaces */
268
+ --primary-inverse: var(--primitive-mono-50);
269
+ /* #FFFFFF — inverted primary surface for use on dark/coloured areas */
270
+ --on-primary-inverse: var(--primitive-blue-500);
271
+ /* #2323FF — text/icon color for use on primary-inverse surfaces */
253
272
  --primary-hover: oklch(0.403 0.251 267.5);
273
+ /* @deprecated — use the on-X / X-inverse / on-X-inverse pairs above. Kept for backwards compat with external consumers referencing these via var(). */
274
+ --on-prominent-static-inverse: var(--on-prominent-inverse);
275
+ --surface-inverse-static: var(--primary-inverse);
254
276
  --subtle: oklch(0.96 0 0);
255
277
  --on-subtle: oklch(0.52 0 0);
256
278
  --on-disabled: var(--primitive-mono-400);
@@ -265,14 +287,20 @@
265
287
  --ring: var(--primitive-blue-500);
266
288
  --overlay: var(--primitive-black-50);
267
289
  --semantic-win: var(--primitive-green-400);
290
+ --on-semantic-win: var(--primitive-mono-50);
291
+ /* #FFFFFF — text/icon color for use on semantic-win surfaces */
268
292
  --semantic-loss: var(--primitive-red-500);
293
+ --on-semantic-loss: var(--primitive-mono-50);
294
+ /* #FFFFFF — text/icon color for use on semantic-loss surfaces */
269
295
  --semantic-info: var(--primitive-sky-600);
270
296
  --semantic-error: var(--primitive-red-600);
271
297
  --semantic-warning: var(--primitive-orange-500);
272
- --semantic-credit: var(--primitive-amber-600);
273
- /* #F9840Fcredit badge background */
274
- --semantic-credit-text: var(--primitive-amber-800);
275
- /* #713813credit badge foreground */
298
+ --on-semantic-warning: var(--primitive-mono-50);
299
+ /* #FFFFFFtext/icon color for use on semantic-warning surfaces */
300
+ --semantic-boost: var(--primitive-amber-600);
301
+ /* #F9840Fboost badge surface */
302
+ --on-semantic-boost: var(--primitive-amber-800);
303
+ /* #713813 — text/icon color for use on semantic-boost surfaces */
276
304
  --tabs: var(--primitive-mono-alpha-4);
277
305
  --tabs-active: var(--primitive-mono-50);
278
306