@trading-game/design-intelligence-layer 0.17.4 → 1.0.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.
Files changed (77) hide show
  1. package/AGENTS.md +104 -231
  2. package/README.md +46 -746
  3. package/dist/index.cjs +2753 -2986
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +247 -261
  6. package/dist/index.d.ts +247 -261
  7. package/dist/index.js +2648 -2856
  8. package/dist/index.js.map +1 -1
  9. package/docs/components/accordion.md +85 -0
  10. package/docs/components/alert-dialog.md +98 -0
  11. package/docs/components/aspect-ratio.md +55 -0
  12. package/docs/components/avatar.md +88 -0
  13. package/docs/components/badge.md +75 -0
  14. package/docs/components/banner.md +84 -0
  15. package/docs/components/bottom-navigation.md +90 -0
  16. package/docs/components/breadcrumb.md +85 -0
  17. package/docs/components/button.md +94 -0
  18. package/docs/components/calendar.md +74 -0
  19. package/docs/components/card.md +79 -0
  20. package/docs/components/carousel.md +82 -0
  21. package/docs/components/checkbox.md +66 -0
  22. package/docs/components/chip.md +72 -0
  23. package/docs/components/command.md +86 -0
  24. package/docs/components/context-menu.md +90 -0
  25. package/docs/components/dialog.md +95 -0
  26. package/docs/components/drawer.md +97 -0
  27. package/docs/components/dropdown-menu.md +92 -0
  28. package/docs/components/empty.md +87 -0
  29. package/docs/components/field.md +117 -0
  30. package/docs/components/hover-card.md +77 -0
  31. package/docs/components/input-group.md +105 -0
  32. package/docs/components/input-otp.md +87 -0
  33. package/docs/components/input.md +71 -0
  34. package/docs/components/item.md +105 -0
  35. package/docs/components/label.md +56 -0
  36. package/docs/components/link.md +66 -0
  37. package/docs/components/menubar.md +102 -0
  38. package/docs/components/native-select.md +71 -0
  39. package/docs/components/navigation-button.md +68 -0
  40. package/docs/components/navigation-menu.md +99 -0
  41. package/docs/components/numpad.md +78 -0
  42. package/docs/components/pagination.md +84 -0
  43. package/docs/components/popover.md +89 -0
  44. package/docs/components/profile-photo.md +81 -0
  45. package/docs/components/progress.md +60 -0
  46. package/docs/components/radio-group.md +82 -0
  47. package/docs/components/resizable.md +79 -0
  48. package/docs/components/scroll-area.md +66 -0
  49. package/docs/components/section-message.md +99 -0
  50. package/docs/components/select.md +105 -0
  51. package/docs/components/separator.md +55 -0
  52. package/docs/components/sheet.md +91 -0
  53. package/docs/components/sidebar.md +125 -0
  54. package/docs/components/skeleton.md +51 -0
  55. package/docs/components/slider.md +61 -0
  56. package/docs/components/spinner.md +52 -0
  57. package/docs/components/stepper.md +68 -0
  58. package/docs/components/switch.md +57 -0
  59. package/docs/components/table.md +86 -0
  60. package/docs/components/tabs.md +95 -0
  61. package/docs/components/textarea.md +58 -0
  62. package/docs/components/toast.md +66 -0
  63. package/docs/components/toggle-group.md +77 -0
  64. package/docs/components/toggle.md +60 -0
  65. package/docs/components/tooltip.md +83 -0
  66. package/docs/foundations/colors.md +109 -0
  67. package/docs/foundations/motion.md +63 -0
  68. package/docs/foundations/shape-layout.md +56 -0
  69. package/docs/foundations/typography.md +83 -0
  70. package/docs/patterns/forms.md +70 -0
  71. package/docs/patterns/menus.md +50 -0
  72. package/docs/patterns/on-brand.md +43 -0
  73. package/guides/audits/design-system-audit-2026-07.md +135 -0
  74. package/guides/rules/design-system-consuming-project.mdc +56 -0
  75. package/package.json +5 -6
  76. package/src/styles.css +1616 -251
  77. package/guides/design-system-guide/trading-game-ds-guide.md +0 -933
package/AGENTS.md CHANGED
@@ -1,231 +1,104 @@
1
- # AI Agent Instructions — @trading-game/design-intelligence-layer
2
-
3
- This file is read automatically by AI coding agents (Cursor, Windsurf, Claude Code, Copilot, and others) to understand how to build with this design system correctly.
4
-
5
- ---
6
-
7
- ## Step 1 — Read all design intelligence files first
8
-
9
- Before building any landing page, product screen, game view, or feature UI, you MUST read all four files:
10
-
11
- **Design principles** — the decision framework for every layout, hierarchy, motion, copy, and component choice:
12
- ```
13
- node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md
14
- ```
15
-
16
- **Accessibility standards** — the inclusion standard every screen must meet (WCAG 2.1 AA):
17
- ```
18
- node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md
19
- ```
20
-
21
- **Personas** — the three player modes (Edge Seeker, System Runner, Public Predictor) that shape all copy and UX decisions:
22
- ```
23
- node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md
24
- ```
25
-
26
- **Brand voice** — channel-specific voice application, banned phrases, vocabulary reference, and formatting rules for all player-facing copy:
27
- ```
28
- node_modules/@trading-game/design-intelligence-layer/guides/brand-voice/trading-game-brand-voice.md
29
- ```
30
-
31
- All four files apply to all projects built with this package — landing pages, product screens, and games.
32
-
33
- Run the checklists at the end of the design principles and accessibility standards files before considering any screen complete. Use the personas and brand voice to guide all player-facing copy.
34
-
35
- ---
36
-
37
- ## Step 2 — Read the component and token rules
38
-
39
- You MUST also follow the full agent rules file:
40
-
41
- ```
42
- node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc
43
- ```
44
-
45
- **Cursor users:** Copy this file into `.cursor/rules/` after every package upgrade:
46
-
47
- ```bash
48
- cp node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc .cursor/rules/
49
- ```
50
-
51
- ---
52
-
53
- ## Step 3 — Core rules summary
54
-
55
- 1. **Check before building** — if a component exists in `@trading-game/design-intelligence-layer`, import it. Never re-implement it.
56
- 2. **Tokens only** — use semantic token classes (`bg-prominent`, `text-on-prominent`, `border-border`, etc.). Never hardcode hex values, raw Tailwind palette colors, or CSS variables.
57
- 3. **Design principles and accessibility first** — every screen must reflect the 8 design principles and meet the accessibility standards (WCAG 2.1 AA). Run both checklists before shipping.
58
- 4. **No separate installs** — do not install `lucide-react`, `tailwindcss`, or other bundled dependencies separately.
59
- 5. **After a version bump** — re-copy the rules file into `.cursor/rules/`, check for stale local component copies, and align them with the package.
60
- 6. **Blocks are first-class exports** — Blocks (Hero, Auth, FAQ, NavBar, HeaderNavigation, OpenPositions, Result) are exported from the package the same as primitives. Import them by name and pass data via props. See the `## Blocks` section below for the full catalog.
61
-
62
- ---
63
-
64
- ## Step 4 — New-component release checklist (MANDATORY)
65
-
66
- Every time you add a new component (UI primitive or Block) to this package, **all** of the following must land in the same PR. Skipping any one of these has shipped broken releases before — npm consumers got a version where the component existed in the demo but couldn't be imported. Do not skip a step.
67
-
68
- 1. **Source file** — `components/ui/<name>.tsx` (or `components/blocks/<name>-block.tsx`)
69
- 2. **Public export** — add the matching `export * from "../components/<…>/<name>"` line to `src/index.ts`. **This is what gates whether npm consumers receive the component at all.** The demo at `app/page.tsx` imports via the `@/components/...` alias and will work without this — but the published package will not ship the component until this line exists.
70
- 3. **Auto-generated registry** — run `npm run generate:registry` so `app/component-registry.generated.ts` picks the new file up.
71
- 4. **Demo entry** — add a sidebar entry in the `componentNames` list in `app/page.tsx`, and a `case "<Name>":` block in the `SectionContent` switch that renders representative variants.
72
- 5. **README** — add a row in the "Available components" table and a per-component section explaining variants / slots / behaviour.
73
- 6. **Design system guide** (`guides/design-system-guide/trading-game-ds-guide.md`) — add a row in the §8 component list table and a styling-notes entry covering tokens used, edge cases, and `aria` posture.
74
- 7. **Build verification** — run `npm run build` and confirm the component name appears in `dist/index.js` and `dist/index.d.ts` before tagging a release:
75
- ```bash
76
- npm run build
77
- grep -c "<ComponentName>" dist/index.js dist/index.d.ts # both > 0
78
- ```
79
- 8. **Version + publish** — only after every step above is checked in, bump `package.json`, commit, push, tag `v<version>`, and let the workflow publish.
80
-
81
- If any of these are missing at the time of release, the published package is broken — fix and re-release before moving on.
82
-
83
- ---
84
-
85
- ## Reference
86
-
87
- - Full token + component reference: `node_modules/@trading-game/design-intelligence-layer/README.md`
88
- - Design principles: `node_modules/@trading-game/design-intelligence-layer/guides/design-principles/trading-game-design-principles.md`
89
- - Accessibility standards: `node_modules/@trading-game/design-intelligence-layer/guides/accessibility-standards/trading-game-accessibility-standards.md`
90
- - Personas: `node_modules/@trading-game/design-intelligence-layer/guides/personas/trading-game-player-field-guide.md`
91
- - Brand voice: `node_modules/@trading-game/design-intelligence-layer/guides/brand-voice/trading-game-brand-voice.md`
92
- - Full agent rules: `node_modules/@trading-game/design-intelligence-layer/guides/rules/design-system-consuming-project.mdc`
93
-
94
- ---
95
-
96
- ## Blocks
97
-
98
- The package ships eight opinionated, composed blocks alongside the UI primitives. Each block is a single `import` away and accepts data via props. Variants are modeled as a `variant` / `layout` / `mode` prop on one block, not as separate components.
99
-
100
- ### `HeroBlock`
101
-
102
- Marketing hero section with centred or split-column layout.
103
-
104
- ```tsx
105
- import { HeroBlock } from "@trading-game/design-intelligence-layer"
106
-
107
- <HeroBlock
108
- layout="centered" // "centered" | "split"
109
- tagline={{ label: "What's new", suffix: "v2.0" }}
110
- heading="Solve your customer's main problem"
111
- body="One or two sentences expanding on the value prop."
112
- primaryCta={{ label: "Get started", onClick: ... }}
113
- secondaryCta={{ label: "Learn more", onClick: ... }} // split layout only
114
- />
115
- ```
116
-
117
- ### `AuthBlock`
118
-
119
- Sign-in / sign-up form with OAuth providers, divider, email input, terms, and cross-link.
120
-
121
- ```tsx
122
- import { AuthBlock } from "@trading-game/design-intelligence-layer"
123
-
124
- <AuthBlock
125
- mode="sign-in" // "sign-in" | "sign-up"
126
- logoSrc="/path/to/brand-icon.svg"
127
- providers={["google", "telegram", "x"]} // default: all three
128
- onSubmit={({ email }) => { ... }}
129
- crossLinkHref="/auth/signup"
130
- />
131
- ```
132
-
133
- ### `FAQBlock`
134
-
135
- Eyebrow + heading + intro + accordion + optional "Need more help" card.
136
-
137
- ```tsx
138
- import { FAQBlock } from "@trading-game/design-intelligence-layer"
139
-
140
- <FAQBlock
141
- layout="desktop" // "desktop" | "mobile"
142
- items={[{ value: "q1", question: "...", answer: "..." }, ...]}
143
- intro={<>Optional intro paragraph with a <Link>link</Link>.</>}
144
- helpCard={{ title: "Need more help?", body: "...", ctaLabel: "Contact us" }}
145
- />
146
- ```
147
-
148
- ### `NavBarBlock`
149
-
150
- Responsive marketing nav with brand mark, link buttons, sign-in/up CTAs, and an internal mobile drawer.
151
-
152
- ```tsx
153
- import { NavBarBlock } from "@trading-game/design-intelligence-layer"
154
-
155
- <NavBarBlock
156
- brand={{ fullLogoSrc: "...", iconLogoSrc: "...", alt: "Brand" }}
157
- links={[{ label: "Products" }, { label: "Docs" }, ...]}
158
- signIn={{ onClick: ... }}
159
- signUp={{ onClick: ... }}
160
- />
161
- ```
162
-
163
- ### `HeaderNavigationBlock`
164
-
165
- In-app trading header (back · badge · balance · history · action slot). History icon supports an overlaid count badge in `bg-primary`.
166
-
167
- ```tsx
168
- import { HeaderNavigationBlock } from "@trading-game/design-intelligence-layer"
169
-
170
- <HeaderNavigationBlock
171
- onBack={() => router.back()}
172
- badge={{ label: "Demo", variant: "fill-warning" }}
173
- balance={{ amount: "1000.00", currency: "USDT" }}
174
- history={{ count: 5, onClick: openHistorySheet }} // count 0 hides badge; >99 shows "99+"
175
- actions={<SoundToggleButton />}
176
- />
177
- ```
178
-
179
- ### `OpenPositionsBlock`
180
-
181
- Responsive Sheet (desktop) / Drawer (mobile) containing a list of game positions. Positions are a discriminated union by `kind`: `"rise-fall" | "swipe" | "box-o" | "digits"`.
182
-
183
- ```tsx
184
- import { OpenPositionsBlock, Position } from "@trading-game/design-intelligence-layer"
185
-
186
- const positions: Position[] = [
187
- { kind: "rise-fall", direction: "Rise", market: "Vol 100", duration: "30 minutes",
188
- stake: "1.00 USDT", pnl: "+0.96 USDT", win: true },
189
- ...
190
- ]
191
-
192
- <OpenPositionsBlock
193
- trigger={<Button variant="secondary">Active trades</Button>}
194
- positions={positions}
195
- sheetTitle="Positions"
196
- onViewHistory={openHistoryPage}
197
- />
198
- ```
199
-
200
- ### `ResultBlock`
201
-
202
- Universal win/loss result card with animated halo + thumb illustration + contract badge + duration badge + CTA. Thumb icons are bundled inside the package.
203
-
204
- ```tsx
205
- import { ResultBlock } from "@trading-game/design-intelligence-layer"
206
-
207
- <ResultBlock
208
- status="win" // "win" | "loss"
209
- amount="10,000.00"
210
- currency="USDT"
211
- contractLabel="Rise"
212
- duration="2 hours"
213
- pickedDigit={7} // optional, for Digits contracts
214
- ctaMode="next-round" // "next-round" | "go-again" | "conversion"
215
- />
216
- ```
217
-
218
- ### `ResultDialog`
219
-
220
- Fixed-width system dialog (title + body + two CTAs). Used for messages like "out of balance".
221
-
222
- ```tsx
223
- import { ResultDialog } from "@trading-game/design-intelligence-layer"
224
-
225
- <ResultDialog
226
- title="You're out of balance."
227
- body="Deposit to keep playing or stay in demo mode."
228
- primaryLabel="Deposit now"
229
- secondaryLabel="Stay in demo"
230
- />
231
- ```
1
+ # AGENTS.md — Champion Trade Design System
2
+
3
+ Rules of engagement for AI agents building with `@trading-game/design-intelligence-layer` (the package renames to Champion Trade at v1.0). Read this first; deep detail lives in [docs/](./docs/).
4
+
5
+ ## Hard rules — never break these
6
+
7
+ 1. **Semantic colour tokens only.** Classes like `bg-background-brand-default`, `text-text-subtle-default`, `border-border-default-default`. Never hex, never `bg-blue-500`, never primitives — except alpha primitives for glazes/glass (`bg-(--primitive-white-alpha-24)`).
8
+ 2. **Never use deprecated aliases** (`bg-prominent`, `text-on-subtle`, `border-subtle`, `bg-primary`, `text-primary`, `ring-ring`, `bg-subtle`, `secondary-hover`, `destructive`, mono-alpha). They exist only for un-migrated external consumers and die at v1.0.
9
+ 3. **No bold.** Semibold (600) is the maximum weight in any component or component-adjacent UI. 700/800 belong to the foundation heading scale only.
10
+ 4. **No shadows** on inline components — elevation = hairline borders + surface steps. One sanctioned exception: **floating mobile chrome** (Bottom Navigation) carries the soft ambient `shadow-chrome-default` lift, per the Refined Mobile spec. Never add any other shadow.
11
+ 5. **Surfaces are solid.** Alpha is only for state layers on top of a solid base: hover/pressed glazes, glass, scrims, selection washes (light theme only).
12
+ 6. **Selection states use the selected family**: `bg-background-brand-selected` + `text-text-brand-selected` + `border-border-brand-selected`. Never `brand-default/10` washes, never `text-brand-default` as selected ink — those fail in dark.
13
+ 7. **Dark is not a mirror.** Never build a light-theme construction and assume it inverts. If a token pair doesn't exist for what you need, stop and ask — don't improvise per-theme values in a component.
14
+ 8. **Typography via type classes.** Component text uses its `.type-<component>-*` class (backed by private `--<component>-*` tokens). No `text-sm`, no `text-[13px]`, no `font-bold`.
15
+ 9. **`.type-*` classes are plain CSS, not utilities**: variants can't gate them (`data-[x]:type-foo` does nothing — pick the class in JSX or write a CSS data-attribute rule), and they beat layered `font-*` utilities.
16
+ 10. **Radius encodes element class** — buttons/chips `rounded-full`, icon buttons circles, cards/dialogs `rounded-2xl`, menus `rounded-lg`, menu rows `rounded-md`, inputs `rounded-xs` (deliberate, don't "fix" it).
17
+ 11. **Sizes sit on the 32/40/48 rail**, default `md` (40px). Button padding-x = height/2 − 4, gap 8, and padding never changes when icons are hidden.
18
+ 12. **Focus** = `focus-visible:ring-[3px] focus-visible:ring-ring-focus-strong` (controls) or `ring-ring-focus-soft` (text fields). Error ring = `ring-ring-error-soft`. Every colour must be a plain named token — no alpha-modified constructions, no colour primitives outside the sanctioned glass-ladder set; `npm run check:tokens` enforces both and diffs the Colors page against styles.css.
19
+
20
+ ## Composition patterns
21
+
22
+ - **Forms**: wrap controls in `Field` — `<Field size="sm">` cascades its size into Input / Select / Native Select / Input Group automatically (explicit size on the control wins). Field's `data-invalid` paints label + error red through inheritance. Helper text is 12/16 at every size. See [docs/patterns/forms.md](./docs/patterns/forms.md).
23
+ - **Menus**: Command, Context Menu, Dropdown Menu, Menubar, and Select rows share one look (`--menu-*` family): `rounded-lg` surface panel + hairline, `type-menu-item` rows with the hover glaze, `type-menu-heading` group labels. See [docs/patterns/menus.md](./docs/patterns/menus.md).
24
+ - **On brand/art surfaces**: use the `on-brand` variants (Button `primary/secondary/tertiary-on-brand`, Input/InputGroup `variant="on-brand"`, Link `tone="on-brand"`) and the frost recipe (`variant="frosted-on-brand"` on Button, NavigationButton, and Card); on page surfaces the tinted counterpart is Button `variant="frosted"`. See [docs/patterns/on-brand.md](./docs/patterns/on-brand.md).
25
+ - **State layers**: hover = `bg-background-hover-default` glaze; pressed = `bg-background-pressed-default`; brand fills derive hover/press via the built-in `brand-hover`/`brand-pressed` recipes.
26
+
27
+ ## Anti-patterns (seen in the wild — don't repeat)
28
+
29
+ - `data-[state=active]:font-semibold` next to a `.type-*` class → silently loses; use the CSS data-attribute weight rule pattern.
30
+ - `bg-white/5` or any translucent resting surface → use the solid surface tokens.
31
+ - A new component colour token (`--mycomponent-bg`) → forbidden; colour stops at the semantic layer.
32
+ - `position="item-aligned"` on Select → the default is `popper` (list drops below the trigger); don't switch back without a reason.
33
+ - Re-adding `xs` button sizes, Kbd, Collapsible, Ticket Card, Chart, Combobox, Form, or the Badge `glass` variant — all removed by design decisions.
34
+
35
+ ## Component index — when to use what
36
+
37
+ Docs: `docs/components/<kebab-name>.md` for every entry.
38
+
39
+ | Component | Use it for |
40
+ |---|---|
41
+ | Accordion | Collapsible FAQ-style content sections |
42
+ | Alert Dialog | Blocking confirm/cancel decisions (destructive actions) |
43
+ | Aspect Ratio | Fixed-ratio media containers |
44
+ | Avatar | User images with fallback initials, groups, count overflow |
45
+ | Badge | Small status/category markers (solid, tint, outline; status = 600 fills) |
46
+ | Banner | Editorial gradient promo panel with art, copy, white pill CTA |
47
+ | Bottom Navigation | Mobile bottom nav, max 4 destinations (3 is the norm) — chrome frost bar, liquid selection bubble; the phone counterpart of Sidebar |
48
+ | Breadcrumb | Hierarchical location trail |
49
+ | Button | All actions; variants primary / secondary / tertiary / on-brand family / frosted + frosted-on-brand; `shimmer` modifier for headline CTAs |
50
+ | Calendar | Date and range picking with themed dropdown month/year navigation |
51
+ | Card | Content shells (`default`, `frosted-on-brand`, `interactive` hover-lift); blank by design, slots supply content |
52
+ | Carousel | Horizontally scrolling content (mobile catalogue) |
53
+ | Chip | Compact choice pills: quick amounts, single-select filters, outline error-recovery |
54
+ | Checkbox | Boolean form input |
55
+ | Command | Searchable command palette (menu family) |
56
+ | Context Menu | Right-click menus (menu family) |
57
+ | Dialog | Centred modal panels for tasks/forms |
58
+ | Drawer | Bottom/top/side sheets on mobile (vaul); grab handle on bottom |
59
+ | Dropdown Menu | Click-triggered action menus (menu family) |
60
+ | Empty | Zero-state placeholder with icon tile, title, action |
61
+ | Field | Form field wrapper: label + control + helper/error, size cascade |
62
+ | Hover Card | Rich hover preview panel (a floating card) |
63
+ | Input | Single-line text field; sizes sm/md/lg; `on-brand` variant |
64
+ | Input Group | Things inside a field: prefix/suffix text, icons, pill buttons |
65
+ | Input OTP | Segmented one-time-code entry |
66
+ | Item | List rows with media/title/description/actions (default, outline, muted) |
67
+ | Label | Form label (14/medium); colour inherits so Field error ink flows through |
68
+ | Link | Inline/standalone links — quiet at rest, underline + darker ink on hover; `tone="on-brand"` |
69
+ | Menubar | Horizontal app menu bar (menu family) |
70
+ | Native Select | Styled native `<select>` for OS-native picking; same rail as Input |
71
+ | Navigation Button | Circular icon-only nav control; `frosted-on-brand` variant for art surfaces |
72
+ | Navigation Menu | Marketing-style nav with dropdown panels (menu family type) |
73
+ | Numpad | Mobile amount-entry tray: bare 3×4 grid, emits keys, long-press backspace clears |
74
+ | Pagination | Page navigation; circular cells, brand-selected active page |
75
+ | Popover | Click-triggered floating card for small forms/details |
76
+ | Profile Photo | Avatar with verification ring, camera slot, status badge |
77
+ | Progress | Determinate progress bar (brand fill on 20% wash track) |
78
+ | Radio Group | Single choice among few options |
79
+ | Resizable | Split-pane layouts with drag handles |
80
+ | Scroll Area | Custom scrollbars on constrained regions |
81
+ | Section Message | Inline status messaging (info/success/warning/danger; sm/md; row/stack) |
82
+ | Select | Custom dropdown picking (menu family rows; opens below trigger) |
83
+ | Separator | Hairline dividers |
84
+ | Sheet | Side/top/bottom panels (Radix Dialog based, desktop-oriented) |
85
+ | Sidebar | Desktop app navigation rail; selected rows use the selected family |
86
+ | Skeleton | Loading placeholders (solid secondary surface, pulse) |
87
+ | Slider | Value selection on a track; circular brand thumb |
88
+ | Spinner | Loading indicator (currentColor, 8-blade fade) |
89
+ | Stepper | Numeric +/− input built on Input Group |
90
+ | Switch | On/off toggle; brand track when checked, static white thumb |
91
+ | Table | Data tables; 14px cells, medium heads, hover glaze rows |
92
+ | Tabs | Segmented control (`default` pill-on-track) or underline (`line`) |
93
+ | Textarea | Multi-line text (mirrors Input md) |
94
+ | Toast | Transient notifications (sonner, inverse surface) |
95
+ | Toggle / Toggle Group | Pressed-state buttons and grouped segmented toggles |
96
+ | Tooltip | Hover hints; inverse surface default, bordered-white `inverse` variant; renders as a Drawer on mobile |
97
+
98
+ **Blocks** (`components/blocks/`: NavBar, Hero, Auth, FAQ, Header Navigation, Open Positions, Result, Game Loading) are pre-composed sections — currently awaiting their token-migration pass; prefer components until then.
99
+
100
+ ## Demo & source of truth
101
+
102
+ - `npm run dev` → localhost:4000 — every component in light/dark.
103
+ - Token definitions: `src/styles.css` (mirrored in `app/globals.css` — **edit both**).
104
+ - Turbopack gotcha: token/class changes need a full `.next/` wipe + restart, not just HMR.