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