@codecademy/gamut 68.6.0 → 68.6.1-alpha.edab62.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 (35) hide show
  1. package/agent-tools/.claude-plugin/marketplace.json +16 -0
  2. package/agent-tools/.claude-plugin/plugin.json +7 -0
  3. package/agent-tools/.cursor-plugin/plugin.json +7 -0
  4. package/agent-tools/DESIGN.Codecademy.md +643 -0
  5. package/agent-tools/DESIGN.LXStudio.md +444 -0
  6. package/agent-tools/DESIGN.Percipio.md +435 -0
  7. package/agent-tools/DESIGN.md +1 -0
  8. package/agent-tools/agents/.gitkeep +0 -0
  9. package/agent-tools/commands/gamut-review.md +170 -0
  10. package/agent-tools/guidelines/components/buttons.md +44 -0
  11. package/agent-tools/guidelines/components/overview.md +44 -0
  12. package/agent-tools/guidelines/foundations/color.md +86 -0
  13. package/agent-tools/guidelines/foundations/modes.md +45 -0
  14. package/agent-tools/guidelines/foundations/spacing.md +66 -0
  15. package/agent-tools/guidelines/foundations/typography.md +50 -0
  16. package/agent-tools/guidelines/overview.md +35 -0
  17. package/agent-tools/guidelines/setup.md +42 -0
  18. package/agent-tools/rules/accessibility.mdc +69 -0
  19. package/agent-tools/skills/gamut-accessibility/SKILL.md +239 -0
  20. package/agent-tools/skills/gamut-color-mode/SKILL.md +99 -0
  21. package/agent-tools/skills/gamut-system-props/SKILL.md +173 -0
  22. package/agent-tools/skills/gamut-testing/SKILL.md +181 -0
  23. package/agent-tools/skills/gamut-theming/SKILL.md +113 -0
  24. package/agent-tools/skills/gamut-typography/SKILL.md +123 -0
  25. package/bin/commands/plugin/install.mjs +173 -0
  26. package/bin/commands/plugin/list.mjs +105 -0
  27. package/bin/commands/plugin/remove.mjs +116 -0
  28. package/bin/commands/plugin/update.mjs +49 -0
  29. package/bin/gamut.mjs +92 -0
  30. package/bin/lib/claude.mjs +52 -0
  31. package/bin/lib/cursor.mjs +40 -0
  32. package/bin/lib/figma.mjs +49 -0
  33. package/bin/lib/resolve-plugin-dir.mjs +38 -0
  34. package/bin/lib/run-command.mjs +22 -0
  35. package/package.json +11 -8
@@ -0,0 +1,444 @@
1
+ ---
2
+ version: alpha
3
+ name: LX Studio Design System
4
+ description: Design tokens for the Skillsoft LX Studio authoring platform.
5
+ colors:
6
+ # LX Studio additions — custom brand tokens
7
+ lxStudioPurple: "#5628FE"
8
+ lxStudioPurpleHover: "#7955FC"
9
+ lxStudioSuccess: "#06844F"
10
+ lxStudioBgPrimary: "#FAFBFC"
11
+ # core palette — referenced by semantic aliases below
12
+ hyper-500: "#3A10E5"
13
+ hyper-400: "#5533FF"
14
+ navy-900: "#0A0D1C"
15
+ navy-800: "#10162F"
16
+ navy-700: "#31374C"
17
+ navy-600: "#4C5063"
18
+ navy-500: "#686C7C"
19
+ navy-400: "#8F919D"
20
+ navy-300: "#BCBEC5"
21
+ navy-200: "#E2E3E6"
22
+ navy-100: "#F5F6F7"
23
+ yellow-500: "#FFD300"
24
+ yellow-0: "#FFFAE5"
25
+ green-700: "#008A27"
26
+ green-0: "#F5FFE3"
27
+ red-600: "#BE1809"
28
+ red-500: "#E91C11"
29
+ red-0: "#FBF1F0"
30
+ white: "#ffffff"
31
+ # semantic aliases — use these in code, not palette swatches or hex values
32
+ text: "{colors.navy-800}"
33
+ text-accent: "{colors.navy-900}"
34
+ text-secondary: "{colors.navy-600}"
35
+ text-disabled: "{colors.navy-500}"
36
+ background: "{colors.white}"
37
+ background-primary: "{colors.lxStudioBgPrimary}"
38
+ background-contrast: "{colors.white}"
39
+ background-selected: "{colors.navy-100}"
40
+ background-hover: "{colors.navy-200}"
41
+ background-disabled: "{colors.navy-200}"
42
+ background-success: "{colors.green-0}"
43
+ background-warning: "{colors.yellow-0}"
44
+ background-error: "{colors.red-0}"
45
+ primary: "{colors.lxStudioPurple}"
46
+ primary-hover: "{colors.lxStudioPurpleHover}"
47
+ primary-inverse: "{colors.yellow-500}"
48
+ secondary: "{colors.navy-800}"
49
+ secondary-hover: "{colors.navy-700}"
50
+ interface: "{colors.hyper-500}"
51
+ interface-hover: "{colors.hyper-400}"
52
+ danger: "{colors.red-500}"
53
+ danger-hover: "{colors.red-600}"
54
+ feedback-error: "{colors.red-600}"
55
+ feedback-success: "{colors.lxStudioSuccess}"
56
+ feedback-warning: "{colors.yellow-500}"
57
+ border-primary: "{colors.navy-400}"
58
+ border-secondary: "{colors.navy-600}"
59
+ border-tertiary: "{colors.navy-800}"
60
+ border-disabled: "{colors.navy-300}"
61
+ shadow-primary: "{colors.navy-200}"
62
+ shadow-secondary: "{colors.navy-600}"
63
+ typography:
64
+ base:
65
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
66
+ fontSize: "1rem"
67
+ fontWeight: "400"
68
+ lineHeight: "1.5"
69
+ accent:
70
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
71
+ fontSize: "0.875rem"
72
+ fontWeight: "400"
73
+ lineHeight: "1.5"
74
+ title:
75
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
76
+ fontSize: "2.125rem"
77
+ fontWeight: "700"
78
+ lineHeight: "1.2"
79
+ monospace:
80
+ fontFamily: 'Monaco, Menlo, "Ubuntu Mono", "Droid Sans Mono", Consolas, monospace'
81
+ rounded:
82
+ none: "0px"
83
+ sm: "4px"
84
+ md: "8px"
85
+ lg: "12px"
86
+ xl: "16px"
87
+ full: "999px"
88
+ components:
89
+ FillButton:
90
+ backgroundColor: "{colors.primary}"
91
+ textColor: "{colors.white}"
92
+ rounded: "{rounded.md}"
93
+ FillButton-hover:
94
+ backgroundColor: "{colors.primary-hover}"
95
+ textColor: "{colors.white}"
96
+ FillButton-danger:
97
+ backgroundColor: "{colors.danger}"
98
+ textColor: "{colors.white}"
99
+ rounded: "{rounded.md}"
100
+ FillButton-danger-hover:
101
+ backgroundColor: "{colors.danger-hover}"
102
+ textColor: "{colors.white}"
103
+ StrokeButton:
104
+ backgroundColor: "transparent"
105
+ textColor: "{colors.secondary}"
106
+ rounded: "{rounded.md}"
107
+ Input:
108
+ backgroundColor: "{colors.background}"
109
+ textColor: "{colors.text}"
110
+ rounded: "{rounded.md}"
111
+ borderColor: "{colors.border-primary}"
112
+ Checkbox:
113
+ backgroundColor: "{colors.interface}"
114
+ rounded: "{rounded.sm}"
115
+ Checkbox-hover:
116
+ backgroundColor: "{colors.interface-hover}"
117
+ Alert-error:
118
+ backgroundColor: "{colors.background-error}"
119
+ textColor: "{colors.feedback-error}"
120
+ Alert-success:
121
+ backgroundColor: "{colors.background-success}"
122
+ textColor: "{colors.text}"
123
+ Alert-warning:
124
+ backgroundColor: "{colors.background-warning}"
125
+ textColor: "{colors.text}"
126
+ ---
127
+
128
+ # LX Studio
129
+
130
+ This file defines the visual design tokens for the Skillsoft LX Studio authoring platform, implemented using the Gamut design system (`@codecademy/gamut`, `@codecademy/gamut-styles`). LX Studio uses a dedicated Gamut theme that extends Core with its own brand colors, typography, and border radii — all Gamut components work without modification.
131
+
132
+ **Storybook**: https://gamut.codecademy.com
133
+
134
+ ---
135
+
136
+ ## Visual Theme & Atmosphere
137
+
138
+ LX Studio communicates **modern professional craft** — clean, precise, and tool-like. As an authoring environment for learning content creators, the interface must feel capable and unobtrusive. The design voice prioritizes clarity and control over personality.
139
+
140
+ **Density**: Medium. Layouts are information-dense but well-spaced; generous border radii and soft shadows reduce visual weight.
141
+
142
+ **Design philosophy**:
143
+ - Light mode only — no dark mode support
144
+ - Larger border radii than Core give the UI a softer, more modern feel
145
+ - Brand purple (`lxStudioPurple`) drives primary CTAs; `hyper-500` drives interface affordances (checkboxes, toggles)
146
+ - Shadows are soft (navy-200) rather than hard (navy-800 in Core light mode)
147
+ - Hanken Grotesk replaces Apercu and Suisse across all font roles
148
+
149
+ ---
150
+
151
+ ## Themes
152
+
153
+ LX Studio uses a single Gamut theme — light mode only.
154
+
155
+ | Theme | Use case | Base font | Dark mode |
156
+ |---|---|---|---|
157
+ | **LX Studio** | Skillsoft LX Studio authoring platform | Hanken Grotesk | light only |
158
+
159
+ The active theme is set at the app root via `<GamutProvider theme={lxStudioTheme}>`.
160
+
161
+ ---
162
+
163
+ ## Semantic Color Aliases
164
+
165
+ Use these token names when specifying colors. LX Studio is light mode only — there are no dark mode counterparts.
166
+
167
+ ### Text
168
+
169
+ | Token | Value | Use for |
170
+ |---|---|---|
171
+ | `text` | `#10162F` (navy-800) | Default body and UI text |
172
+ | `text-accent` | `#0A0D1C` (navy-900) | Stronger emphasis text |
173
+ | `text-secondary` | `#4C5063` (navy-600) | Supporting / secondary copy |
174
+ | `text-disabled` | `#686C7C` (navy-500) | Disabled state labels |
175
+
176
+ ### Background
177
+
178
+ | Token | Value | Use for |
179
+ |---|---|---|
180
+ | `background` | `#ffffff` | Default page/component background |
181
+ | `background-primary` | `#FAFBFC` (lxStudioBgPrimary) | Slightly elevated surfaces |
182
+ | `background-contrast` | `#ffffff` | Maximum contrast surface |
183
+ | `background-selected` | `#F5F6F7` (navy-100) | Selected row / item |
184
+ | `background-hover` | `#E2E3E6` (navy-200) | Hover state overlay |
185
+ | `background-disabled` | `#E2E3E6` (navy-200) | Disabled surface |
186
+ | `background-success` | `#F5FFE3` (green-0) | Success state container |
187
+ | `background-warning` | `#FFFAE5` (yellow-0) | Warning state container |
188
+ | `background-error` | `#FBF1F0` (red-0) | Error state container |
189
+
190
+ ### Interactive
191
+
192
+ | Token | Value | Use for |
193
+ |---|---|---|
194
+ | `primary` | `#5628FE` (lxStudioPurple) | Primary CTA, links, focus rings |
195
+ | `primary-hover` | `#7955FC` (lxStudioPurpleHover) | Hover state of primary interactive |
196
+ | `primary-inverse` | `#FFD300` (yellow-500) | Primary on a colored background |
197
+ | `secondary` | `#10162F` (navy-800) | Secondary CTA, ghost buttons |
198
+ | `secondary-hover` | `#31374C` (navy-700) | Hover state of secondary interactive |
199
+ | `interface` | `#3A10E5` (hyper-500) | UI affordances (checkboxes, toggles, sliders) |
200
+ | `interface-hover` | `#5533FF` (hyper-400) | Hover on interface elements |
201
+ | `danger` | `#E91C11` (red-500) | Destructive actions, error states |
202
+ | `danger-hover` | `#BE1809` (red-600) | Hover on danger interactive |
203
+
204
+ **Key distinction**: `primary` (lxStudioPurple `#5628FE`) differs from `interface` (hyper-500 `#3A10E5`). Buttons and links use the lighter LX Studio purple; checkboxes, toggles, and sliders use the deeper hyper purple.
205
+
206
+ ### Border
207
+
208
+ | Token | Value | Use for |
209
+ |---|---|---|
210
+ | `border-primary` | `#8F919D` (navy-400) | Standard input and card borders |
211
+ | `border-secondary` | `#4C5063` (navy-600) | Medium-weight borders |
212
+ | `border-tertiary` | `#10162F` (navy-800) | Strong structural borders |
213
+ | `border-disabled` | `#BCBEC5` (navy-300) | Disabled input borders |
214
+
215
+ LX Studio's `border-primary` is mid-gray (navy-400) rather than Core's near-black navy-800 — borders are softer and less prominent.
216
+
217
+ ### Feedback
218
+
219
+ | Token | Value | Use for |
220
+ |---|---|---|
221
+ | `feedback-error` | `#BE1809` (red-600) | Error messages, validation |
222
+ | `feedback-success` | `#06844F` (lxStudioSuccess) | Success messages, confirmations |
223
+ | `feedback-warning` | `#FFD300` (yellow-500) | Warning messages, caution states |
224
+
225
+ ### Shadow
226
+
227
+ | Token | Value |
228
+ |---|---|
229
+ | `shadow-primary` | `#E2E3E6` (navy-200) |
230
+ | `shadow-secondary` | `#4C5063` (navy-600) |
231
+
232
+ LX Studio shadows are soft — use `shadow-primary` for standard elevated surfaces. This matches Percipio's shadow weight, not Core's hard navy-800 shadow.
233
+
234
+ ---
235
+
236
+ ## LX Studio Color Palette
237
+
238
+ LX Studio adds four named colors to the core palette. Use semantic aliases in code, not these raw names.
239
+
240
+ | Named color | Value | Mapped to |
241
+ |---|---|---|
242
+ | `lxStudioPurple` | `#5628FE` | `primary` |
243
+ | `lxStudioPurpleHover` | `#7955FC` | `primary-hover` |
244
+ | `lxStudioSuccess` | `#06844F` | `feedback-success` |
245
+ | `lxStudioBgPrimary` | `#FAFBFC` | `background-primary` |
246
+
247
+ The full core swatch palette (navy, hyper, blue, green, yellow, red, etc.) is also available. Raw swatches should only be used for fixed colors that must not adapt (illustrations, data viz, etc.).
248
+
249
+ ---
250
+
251
+ ## Typography
252
+
253
+ ### Typefaces
254
+
255
+ LX Studio uses **Hanken Grotesk** for all font roles. There is no Apercu and no Suisse.
256
+
257
+ | Token | Font | Use for |
258
+ |---|---|---|
259
+ | `base` | `"Hanken Grotesk"`, sans-serif fallback | All default UI text, headlines, body copy |
260
+ | `accent` | `"Hanken Grotesk"`, sans-serif fallback | Labels, captions, technical context (same as base in LX Studio) |
261
+ | `monospace` | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Code editor contexts |
262
+ | `system` | System UI fonts | Performance-critical surfaces |
263
+
264
+ Hanken Grotesk is served from `https://www.codecademy.com/gamut/` in four variants: regular, italic, bold, bold-italic.
265
+
266
+ ### Rules
267
+
268
+ - **Hanken Grotesk Bold (700)** for headlines, sub-headlines, CTAs, and buttons.
269
+ - **Hanken Grotesk Regular (400)** for body text, UI labels, and menu items.
270
+ - Text is **left-aligned** by default. Center-align only for short marketing headlines. Never right-align.
271
+ - Do not adjust letter-spacing.
272
+ - No separate accent typeface — Hanken Grotesk is used uniformly for `base` and `accent`.
273
+
274
+ ### Font weight scale
275
+
276
+ | Token | Value | Use |
277
+ |---|---|---|
278
+ | `base` | 400 | Body text, UI labels |
279
+ | `title` | 700 | Headlines, CTAs, buttons |
280
+
281
+ ### Font size scale
282
+
283
+ Shared with Core — all sizes are identical.
284
+
285
+ | Token key | Size | Common use |
286
+ |---|---|---|
287
+ | `64` | 64px | Hero / display |
288
+ | `44` | 44px | Page titles |
289
+ | `34` | 34px | Section titles |
290
+ | `26` | 26px | Sub-section titles |
291
+ | `22` | 22px | Card titles, large UI labels |
292
+ | `20` | 20px | Secondary titles |
293
+ | `18` | 18px | Large body, intro text |
294
+ | `16` | 16px | Default body text |
295
+ | `14` | 14px | Small body, captions, labels |
296
+
297
+ ### Line height scale
298
+
299
+ Shared with Core.
300
+
301
+ | Token | Value | Use |
302
+ |---|---|---|
303
+ | `base` | 1.5 | Body text |
304
+ | `spacedTitle` | 1.3 | Sub-headlines and medium titles |
305
+ | `title` | 1.2 | Large headlines |
306
+
307
+ ### Line length
308
+
309
+ Target 45–85 characters per line; 66 characters is ideal. Max 50 for multi-column layouts.
310
+
311
+ ---
312
+
313
+ ## Spacing Scale
314
+
315
+ Identical to Core. All spacing is multiples of 4px on an 8px grid.
316
+
317
+ | Token | Value |
318
+ |---|---|
319
+ | `0` | 0 |
320
+ | `4` | 4px |
321
+ | `8` | 8px |
322
+ | `12` | 12px |
323
+ | `16` | 16px |
324
+ | `24` | 24px |
325
+ | `32` | 32px |
326
+ | `40` | 40px |
327
+ | `48` | 48px |
328
+ | `64` | 64px |
329
+ | `96` | 96px |
330
+
331
+ ---
332
+
333
+ ## Border Radius Scale
334
+
335
+ LX Studio uses larger border radii than Core — everything is one step softer.
336
+
337
+ | Token | LX Studio | Core | Use |
338
+ |---|---|---|---|
339
+ | `none` | 0px | 0px | Square / non-interactive elements |
340
+ | `sm` | **4px** | 2px | Subtle rounding, tags, checkboxes |
341
+ | `md` | **8px** | 4px | Default buttons, inputs, interactive cards |
342
+ | `lg` | **12px** | 8px | Cards, panels |
343
+ | `xl` | 16px | 16px | Large cards, modals |
344
+ | `full` | 999px | 999px | Pills, avatars, circular elements |
345
+
346
+ ---
347
+
348
+ ## Responsive Behavior
349
+
350
+ Identical to Core. Mobile-first, apply styles from the named breakpoint up.
351
+
352
+ | Token | Min-width | Max content |
353
+ |---|---|---|
354
+ | _(base)_ | 0 | 288px |
355
+ | `xs` | 480px | 448px |
356
+ | `sm` | 768px | 704px |
357
+ | `md` | 1024px | 896px |
358
+ | `lg` | 1200px | 1072px |
359
+ | `xl` | 1440px | 1248px |
360
+
361
+ 12-column grid at all breakpoints.
362
+
363
+ | Usage | Recommended values |
364
+ |---|---|
365
+ | Horizontal margins | 64px (lg+), 48px (md), 32px (sm/xs), 16px (base) |
366
+ | Column gaps (gutters) | 32px (lg+), 24px (md), 16px (sm/xs), 8px (base) |
367
+ | Row gaps | 32px (lg+), 24px (md), 16px (sm/xs), 8px (base) |
368
+
369
+ Minimum interactive touch target: **44×44px** on mobile breakpoints.
370
+
371
+ ---
372
+
373
+ ## Component Library
374
+
375
+ Same component library as Codecademy — all atoms, molecules, and organisms apply. Token values resolve differently per theme automatically.
376
+
377
+ Key LX Studio-specific visual differences:
378
+ - `FillButton` uses `#5628FE` (lxStudioPurple) instead of hyper-500
379
+ - `FillButton` hover shifts to `#7955FC` (lxStudioPurpleHover) — lighter, not darker, on hover
380
+ - `Checkbox` / `Toggle` use `hyper-500` (`#3A10E5`) — not the brand purple
381
+ - All interactive elements have `borderRadius: md` (8px) instead of Core's 4px
382
+ - `Card` shadows use navy-200 (soft) rather than navy-800 (hard)
383
+ - No `Card-beige` variant — LX Studio `background-primary` is off-white, not beige
384
+
385
+ ---
386
+
387
+ ## Do's and Don'ts
388
+
389
+ ### Colors
390
+
391
+ - **Do** use semantic color aliases (`primary`, `text`, `background`, etc.) — never hardcode hex values.
392
+ - **Do** use `lxStudioPurple` (`#5628FE`) via `primary` for buttons and links.
393
+ - **Do** use `hyper-500` (`#3A10E5`) via `interface` for checkboxes, toggles, and sliders.
394
+ - **Don't** use `primary` and `interface` interchangeably — they are intentionally different purples.
395
+ - **Don't** attempt dark mode — LX Studio is light only.
396
+ - **Don't** use the Percipio or Codecademy primary blue/hyper colors directly; go through semantic aliases.
397
+
398
+ ### Typography
399
+
400
+ - **Do** use Hanken Grotesk Bold (700) for headlines, CTAs, and buttons.
401
+ - **Do** keep body text at 150–175% line height for readability.
402
+ - **Don't** use Apercu or Suisse — those fonts are not available in LX Studio.
403
+ - **Don't** right-align or center-align body paragraphs.
404
+ - **Don't** adjust letter-spacing.
405
+
406
+ ### Layout & Spacing
407
+
408
+ - **Do** use multiples of 8px for block-element spacing (4px only for inline / typographic relationships).
409
+ - **Do** begin design work at 1440px (XL), then adapt down.
410
+ - **Do** align elements to the 12-column grid.
411
+ - **Do** apply the larger `md` border radius (8px) to buttons and inputs — it defines the LX Studio feel.
412
+
413
+ ---
414
+
415
+ ## Agent Prompt Guide
416
+
417
+ Quick color/token reference for generating or specifying LX Studio UI:
418
+
419
+ | Scenario | Tokens |
420
+ |---|---|
421
+ | Primary button | `bg: primary (#5628FE)`, `color: white`, `hover: primary-hover (#7955FC)`, `borderRadius: md (8px)` |
422
+ | Body text | `color: text (#10162F)`, `font: Hanken Grotesk`, `size: 16px`, `weight: 400`, `lineHeight: base (1.5)` |
423
+ | Headline | `color: text-accent (#0A0D1C)`, `font: Hanken Grotesk`, `size: 34–64px`, `weight: 700`, `lineHeight: title (1.2)` |
424
+ | Secondary text | `color: text-secondary (#4C5063)` |
425
+ | Disabled text | `color: text-disabled (#686C7C)` |
426
+ | Elevated surface | `bg: background-primary (#FAFBFC)` |
427
+ | Card default | `bg: background (#ffffff)`, `borderRadius: none` — add `isInteractive` for hover shadow + `borderRadius: md (8px)` |
428
+ | Checkbox / toggle | `interface (#3A10E5)`, `hover: interface-hover (#5533FF)` |
429
+ | Error state | `color: feedback-error (#BE1809)`, `bg: background-error (#FBF1F0)`, `border: danger` |
430
+ | Success state | `color: feedback-success (#06844F)`, `bg: background-success (#F5FFE3)` |
431
+ | Warning state | `color: feedback-warning (#FFD300)`, `bg: background-warning (#FFFAE5)` |
432
+ | Disabled state | `color: text-disabled (#686C7C)`, `bg: background-disabled (#E2E3E6, navy-200)`, `border: border-disabled` |
433
+
434
+ ### Component token cheatsheet
435
+
436
+ ```
437
+ FillButton → bg: primary (#5628FE), color: white, hover: primary-hover (#7955FC), radius: 8px
438
+ StrokeButton → bg: transparent, border: secondary (#10162F)
439
+ Checkbox/Toggle → interface (#3A10E5), hover: interface-hover (#5533FF), radius: 4px
440
+ Card → bg: background, shadow: shadow-primary (#E2E3E6, navy-200, soft), radius: none
441
+ Alert (error) → uses feedback-error + background-error
442
+ Alert (success) → uses feedback-success + background-success
443
+ Alert (warning) → uses feedback-warning + background-warning
444
+ ```