@codecademy/gamut 68.7.1-alpha.1ea5a8.0 → 68.7.1-alpha.29afd9.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 (81) hide show
  1. package/agent-tools/DESIGN.Codecademy.md +120 -90
  2. package/agent-tools/DESIGN.LXStudio.md +132 -127
  3. package/agent-tools/DESIGN.Percipio.md +134 -129
  4. package/agent-tools/DESIGN.md +1 -12
  5. package/bin/lib/claude.mjs +14 -5
  6. package/bin/lib/cursor.mjs +4 -1
  7. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.d.ts +2 -2
  8. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.js +1 -1
  9. package/dist/Alert/elements.d.ts +2 -2
  10. package/dist/Anchor/index.d.ts +19 -9
  11. package/dist/Anchor/index.js +9 -6
  12. package/dist/BarChart/BarRow/elements.d.ts +47 -45
  13. package/dist/BarChart/utils/hooks.d.ts +2 -2
  14. package/dist/BarChart/utils/hooks.js +3 -1
  15. package/dist/Box/GridBox.d.ts +1 -0
  16. package/dist/Box/GridBox.js +1 -1
  17. package/dist/Box/props.d.ts +1 -1
  18. package/dist/Breadcrumbs/index.d.ts +5 -5
  19. package/dist/Breadcrumbs/index.js +2 -2
  20. package/dist/Button/CTAButton.d.ts +2 -2
  21. package/dist/Button/FillButton.d.ts +4 -4
  22. package/dist/Button/IconButton.d.ts +4 -4
  23. package/dist/Button/StrokeButton.d.ts +4 -4
  24. package/dist/Button/TextButton.d.ts +4 -4
  25. package/dist/Button/shared/InlineIconButton.d.ts +2 -2
  26. package/dist/Button/shared/styles.d.ts +3 -3
  27. package/dist/Button/shared/types.d.ts +1 -1
  28. package/dist/ButtonBase/ButtonBase.d.ts +9 -4
  29. package/dist/ButtonBase/ButtonBase.js +11 -4
  30. package/dist/Card/elements.d.ts +109 -103
  31. package/dist/Card/styles.d.ts +8 -8
  32. package/dist/Coachmark/index.d.ts +1 -1
  33. package/dist/ConnectedForm/ConnectedForm.d.ts +1 -1
  34. package/dist/ConnectedForm/ConnectedFormGroup.js +4 -3
  35. package/dist/ConnectedForm/utils.d.ts +1 -1
  36. package/dist/ConnectedForm/utils.js +1 -1
  37. package/dist/DatePicker/DatePickerInput/index.d.ts +1 -1
  38. package/dist/Disclosure/elements.d.ts +18 -12
  39. package/dist/FeatureShimmer/index.js +1 -1
  40. package/dist/Form/SelectDropdown/SelectDropdown.js +1 -1
  41. package/dist/Form/SelectDropdown/elements/containers.js +1 -1
  42. package/dist/Form/SelectDropdown/elements/controls.js +2 -2
  43. package/dist/Form/SelectDropdown/elements/multi-value.js +2 -2
  44. package/dist/Form/SelectDropdown/types/internal.d.ts +2 -2
  45. package/dist/Form/SelectDropdown/utils.js +2 -1
  46. package/dist/Form/elements/Form.d.ts +15 -15
  47. package/dist/Form/elements/FormGroup.d.ts +1 -1
  48. package/dist/Form/styles/Checkbox-styles.d.ts +1 -1
  49. package/dist/GridForm/GridFormButtons/index.d.ts +4 -4
  50. package/dist/List/ListProvider.d.ts +1 -1
  51. package/dist/List/elements.d.ts +44 -42
  52. package/dist/Menu/MenuItem.js +10 -6
  53. package/dist/Menu/elements.d.ts +2 -2
  54. package/dist/Modals/Dialog.js +6 -2
  55. package/dist/Modals/Modal.js +5 -2
  56. package/dist/Modals/elements.d.ts +1 -1
  57. package/dist/Pagination/AnimatedPaginationButtons.d.ts +31 -29
  58. package/dist/Pagination/EllipsisButton.d.ts +2 -2
  59. package/dist/Pagination/PaginationButton.d.ts +6 -6
  60. package/dist/Pagination/utils.d.ts +31 -29
  61. package/dist/Pagination/utils.js +14 -11
  62. package/dist/Popover/Popover.js +6 -6
  63. package/dist/Popover/types.d.ts +4 -3
  64. package/dist/PopoverContainer/PopoverContainer.js +9 -9
  65. package/dist/PopoverContainer/hooks.d.ts +16 -4
  66. package/dist/PopoverContainer/hooks.js +50 -27
  67. package/dist/PopoverContainer/types.d.ts +2 -1
  68. package/dist/Tabs/TabButton.d.ts +2 -2
  69. package/dist/Tabs/TabNavLink.d.ts +2 -2
  70. package/dist/Tag/elements.d.ts +14 -8
  71. package/dist/Tag/index.js +1 -1
  72. package/dist/Tip/InfoTip/InfoTipButton.d.ts +4 -4
  73. package/dist/Tip/PreviewTip/elements.d.ts +12 -6
  74. package/dist/Tip/__tests__/helpers.d.ts +1 -1
  75. package/dist/Tip/shared/FloatingTip.js +2 -2
  76. package/dist/Tip/shared/types.d.ts +2 -2
  77. package/dist/Tip/shared/utils.js +1 -1
  78. package/dist/utils/nullish.d.ts +10 -0
  79. package/dist/utils/nullish.js +11 -0
  80. package/dist/utils/react.js +4 -2
  81. package/package.json +10 -10
@@ -4,7 +4,8 @@ name: LX Studio Design System
4
4
  description: Design tokens for the Skillsoft LX Studio authoring platform.
5
5
  colors:
6
6
  # LX Studio additions — custom brand tokens
7
- sapphire: '#1C50BB'
7
+ lxStudioPurple: '#5628FE'
8
+ lxStudioPurpleHover: '#7955FC'
8
9
  lxStudioSuccess: '#06844F'
9
10
  lxStudioBgPrimary: '#FAFBFC'
10
11
  # core palette — referenced by semantic aliases below
@@ -12,13 +13,13 @@ colors:
12
13
  hyper-400: '#5533FF'
13
14
  navy-900: '#0A0D1C'
14
15
  navy-800: '#10162F'
15
- navy-700: 'rgba(16, 22, 47, 0.86)'
16
- navy-600: 'rgba(16, 22, 47, 0.75)'
17
- navy-500: 'rgba(16, 22, 47, 0.63)'
18
- navy-400: 'rgba(16, 22, 47, 0.47)'
19
- navy-300: 'rgba(16, 22, 47, 0.28)'
20
- navy-200: 'rgba(16, 22, 47, 0.12)'
21
- navy-100: 'rgba(16, 22, 47, 0.04)'
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'
22
23
  yellow-500: '#FFD300'
23
24
  yellow-0: '#FFFAE5'
24
25
  green-700: '#008A27'
@@ -41,8 +42,8 @@ colors:
41
42
  background-success: '{colors.green-0}'
42
43
  background-warning: '{colors.yellow-0}'
43
44
  background-error: '{colors.red-0}'
44
- primary: '{colors.sapphire}'
45
- primary-hover: '{colors.navy-800}'
45
+ primary: '{colors.lxStudioPurple}'
46
+ primary-hover: '{colors.lxStudioPurpleHover}'
46
47
  primary-inverse: '{colors.yellow-500}'
47
48
  secondary: '{colors.navy-800}'
48
49
  secondary-hover: '{colors.navy-700}'
@@ -59,19 +60,19 @@ colors:
59
60
  shadow-secondary: '{colors.navy-600}'
60
61
  typography:
61
62
  base:
62
- fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
63
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
63
64
  fontSize: '1rem'
64
65
  fontWeight: '400'
65
66
  lineHeight: '1.5'
66
67
  accent:
67
- fontFamily: '"Skillsoft Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
68
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
68
69
  fontSize: '0.875rem'
69
70
  fontWeight: '400'
70
71
  lineHeight: '1.5'
71
72
  title:
72
- fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
73
+ fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
73
74
  fontSize: '2.125rem'
74
- fontWeight: '500'
75
+ fontWeight: '700'
75
76
  lineHeight: '1.2'
76
77
  monospace:
77
78
  fontFamily: 'Monaco, Menlo, "Ubuntu Mono", "Droid Sans Mono", Consolas, monospace'
@@ -124,12 +125,10 @@ components:
124
125
 
125
126
  # LX Studio
126
127
 
127
- 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 with its own brand colors, typography, and border radii — all Gamut components work without modification.
128
+ 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.
128
129
 
129
130
  **Storybook**: https://gamut.codecademy.com
130
131
 
131
- > **Other Gamut themes:** This document covers **LX Studio** only. For Codecademy (Core/Admin/Platform) or Percipio, install that product's `DESIGN.md` instead: `gamut plugin install cursor --theme core` or `--theme percipio`.
132
-
133
132
  ---
134
133
 
135
134
  ## Visual Theme & Atmosphere
@@ -140,10 +139,11 @@ LX Studio communicates **modern professional craft** — clean, precise, and too
140
139
 
141
140
  **Design philosophy**:
142
141
 
143
- - Larger border radii (`sm`–`lg`) for a softer, more modern feel
144
- - Brand blue (`sapphire` / `primary`) drives CTAs, buttons, and links
145
- - Soft shadows (`shadow-primary` `navy-200`)
146
- - Skillsoft Text (`base`) and Skillsoft Sans (`accent`) for all UI typography
142
+ - Light mode only no dark mode support
143
+ - Larger border radii than Core give the UI a softer, more modern feel
144
+ - Brand purple (`lxStudioPurple`) via `primary` drives CTAs, buttons, links, checkboxes, and toggles
145
+ - Shadows are soft (navy-200) rather than hard (navy-800 in Core light mode)
146
+ - Hanken Grotesk replaces Apercu and Suisse across all font roles
147
147
 
148
148
  ---
149
149
 
@@ -151,9 +151,9 @@ LX Studio communicates **modern professional craft** — clean, precise, and too
151
151
 
152
152
  LX Studio uses a single Gamut theme — light mode only.
153
153
 
154
- | Theme | Use case | Base font | Dark mode |
155
- | ------------- | -------------------------------------- | --------------------- | ---------- |
156
- | **LX Studio** | Skillsoft LX Studio authoring platform | Skillsoft Text / Sans | light only |
154
+ | Theme | Use case | Base font | Dark mode |
155
+ | ------------- | -------------------------------------- | -------------- | ---------- |
156
+ | **LX Studio** | Skillsoft LX Studio authoring platform | Hanken Grotesk | light only |
157
157
 
158
158
  The active theme is set at the app root via `<GamutProvider theme={lxStudioTheme}>`.
159
159
 
@@ -165,78 +165,79 @@ Use these token names when specifying colors. LX Studio is light mode only — t
165
165
 
166
166
  ### Text
167
167
 
168
- | Token | Resolves to | Use for |
169
- | ---------------- | ----------- | --------------------------- |
170
- | `text` | `navy-800` | Default body and UI text |
171
- | `text-accent` | `navy-900` | Stronger emphasis text |
172
- | `text-secondary` | `navy-600` | Supporting / secondary copy |
173
- | `text-disabled` | `navy-500` | Disabled state labels |
168
+ | Token | Value | Use for |
169
+ | ---------------- | -------------------- | --------------------------- |
170
+ | `text` | `#10162F` (navy-800) | Default body and UI text |
171
+ | `text-accent` | `#0A0D1C` (navy-900) | Stronger emphasis text |
172
+ | `text-secondary` | `#4C5063` (navy-600) | Supporting / secondary copy |
173
+ | `text-disabled` | `#686C7C` (navy-500) | Disabled state labels |
174
174
 
175
175
  ### Background
176
176
 
177
- | Token | Resolves to | Use for |
178
- | --------------------- | ------------------- | --------------------------------- |
179
- | `background` | `white` | Default page/component background |
180
- | `background-primary` | `lxStudioBgPrimary` | Slightly elevated surfaces |
181
- | `background-contrast` | `white` | Maximum contrast surface |
182
- | `background-selected` | `navy-100` | Selected row / item |
183
- | `background-hover` | `navy-200` | Hover state overlay |
184
- | `background-disabled` | `navy-200` | Disabled surface |
185
- | `background-success` | `green-0` | Success state container |
186
- | `background-warning` | `yellow-0` | Warning state container |
187
- | `background-error` | `red-0` | Error state container |
177
+ | Token | Value | Use for |
178
+ | --------------------- | ----------------------------- | --------------------------------- |
179
+ | `background` | `#ffffff` | Default page/component background |
180
+ | `background-primary` | `#FAFBFC` (lxStudioBgPrimary) | Slightly elevated surfaces |
181
+ | `background-contrast` | `#ffffff` | Maximum contrast surface |
182
+ | `background-selected` | `#F5F6F7` (navy-100) | Selected row / item |
183
+ | `background-hover` | `#E2E3E6` (navy-200) | Hover state overlay |
184
+ | `background-disabled` | `#E2E3E6` (navy-200) | Disabled surface |
185
+ | `background-success` | `#F5FFE3` (green-0) | Success state container |
186
+ | `background-warning` | `#FFFAE5` (yellow-0) | Warning state container |
187
+ | `background-error` | `#FBF1F0` (red-0) | Error state container |
188
188
 
189
189
  ### Interactive
190
190
 
191
- | Token | Resolves to | Use for |
192
- | ----------------- | ------------ | ------------------------------------ |
193
- | `primary` | `sapphire` | Primary CTA, links, focus rings |
194
- | `primary-hover` | `navy-800` | Hover state of primary interactive |
195
- | `primary-inverse` | `yellow-500` | Primary on a colored background |
196
- | `secondary` | `navy-800` | Secondary CTA, ghost buttons |
197
- | `secondary-hover` | `navy-700` | Hover state of secondary interactive |
198
- | `danger` | `red-500` | Destructive actions, error states |
199
- | `danger-hover` | `red-600` | Hover on danger interactive |
191
+ | Token | Value | Use for |
192
+ | ----------------- | ------------------------------- | ------------------------------------ |
193
+ | `primary` | `#5628FE` (lxStudioPurple) | Primary CTA, links, focus rings |
194
+ | `primary-hover` | `#7955FC` (lxStudioPurpleHover) | Hover state of primary interactive |
195
+ | `primary-inverse` | `#FFD300` (yellow-500) | Primary on a colored background |
196
+ | `secondary` | `#10162F` (navy-800) | Secondary CTA, ghost buttons |
197
+ | `secondary-hover` | `#31374C` (navy-700) | Hover state of secondary interactive |
198
+ | `danger` | `#E91C11` (red-500) | Destructive actions, error states |
199
+ | `danger-hover` | `#BE1809` (red-600) | Hover on danger interactive |
200
200
 
201
201
  ### Border
202
202
 
203
- | Token | Resolves to | Use for |
204
- | ------------------ | ----------- | ------------------------------- |
205
- | `border-primary` | `navy-400` | Standard input and card borders |
206
- | `border-secondary` | `navy-600` | Medium-weight borders |
207
- | `border-tertiary` | `navy-800` | Strong structural borders |
208
- | `border-disabled` | `navy-300` | Disabled input borders |
203
+ | Token | Value | Use for |
204
+ | ------------------ | -------------------- | ------------------------------- |
205
+ | `border-primary` | `#8F919D` (navy-400) | Standard input and card borders |
206
+ | `border-secondary` | `#4C5063` (navy-600) | Medium-weight borders |
207
+ | `border-tertiary` | `#10162F` (navy-800) | Strong structural borders |
208
+ | `border-disabled` | `#BCBEC5` (navy-300) | Disabled input borders |
209
209
 
210
- `border-primary` resolves to `navy-400` mid-weight borders for inputs and cards.
210
+ LX Studio's `border-primary` is mid-gray (navy-400) rather than Core's near-black navy-800 — borders are softer and less prominent.
211
211
 
212
212
  ### Feedback
213
213
 
214
- | Token | Resolves to | Use for |
215
- | ------------------ | ----------------- | -------------------------------- |
216
- | `feedback-error` | `red-600` | Error messages, validation |
217
- | `feedback-success` | `lxStudioSuccess` | Success messages, confirmations |
218
- | `feedback-warning` | `yellow-500` | Warning messages, caution states |
214
+ | Token | Value | Use for |
215
+ | ------------------ | --------------------------- | -------------------------------- |
216
+ | `feedback-error` | `#BE1809` (red-600) | Error messages, validation |
217
+ | `feedback-success` | `#06844F` (lxStudioSuccess) | Success messages, confirmations |
218
+ | `feedback-warning` | `#FFD300` (yellow-500) | Warning messages, caution states |
219
219
 
220
220
  ### Shadow
221
221
 
222
- | Token | Resolves to |
223
- | ------------------ | ----------- |
224
- | `shadow-primary` | `navy-200` |
225
- | `shadow-secondary` | `navy-600` |
222
+ | Token | Value |
223
+ | ------------------ | -------------------- |
224
+ | `shadow-primary` | `#E2E3E6` (navy-200) |
225
+ | `shadow-secondary` | `#4C5063` (navy-600) |
226
226
 
227
- Use `shadow-primary` for standard elevated surfaces.
227
+ 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.
228
228
 
229
229
  ---
230
230
 
231
231
  ## LX Studio Color Palette
232
232
 
233
- LX Studio adds named colors to the core palette. Use semantic aliases in code, not these raw names.
233
+ LX Studio adds four named colors to the core palette. Use semantic aliases in code, not these raw names.
234
234
 
235
- | Palette token | Semantic alias(es) |
236
- | ------------------- | -------------------- |
237
- | `sapphire` | `primary` |
238
- | `lxStudioSuccess` | `feedback-success` |
239
- | `lxStudioBgPrimary` | `background-primary` |
235
+ | Named color | Value | Mapped to |
236
+ | --------------------- | --------- | -------------------- |
237
+ | `lxStudioPurple` | `#5628FE` | `primary` |
238
+ | `lxStudioPurpleHover` | `#7955FC` | `primary-hover` |
239
+ | `lxStudioSuccess` | `#06844F` | `feedback-success` |
240
+ | `lxStudioBgPrimary` | `#FAFBFC` | `background-primary` |
240
241
 
241
242
  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.).
242
243
 
@@ -246,35 +247,35 @@ The full core swatch palette (navy, hyper, blue, green, yellow, red, etc.) is al
246
247
 
247
248
  ### Typefaces
248
249
 
249
- LX Studio uses **Skillsoft Text** for body and headlines and **Skillsoft Sans** for accent UI.
250
+ LX Studio uses **Hanken Grotesk** for all font roles. There is no Apercu and no Suisse.
250
251
 
251
- | Token | Font | Use for |
252
- | ----------- | ----------------------------------------------------- | ----------------------------------------- |
253
- | `base` | `"Skillsoft Text"`, sans-serif fallback | All default UI text, headlines, body copy |
254
- | `accent` | `"Skillsoft Sans"`, sans-serif fallback | Labels, captions, accent UI |
255
- | `monospace` | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Code editor contexts |
256
- | `system` | System UI fonts | Performance-critical surfaces |
252
+ | Token | Font | Use for |
253
+ | ----------- | ----------------------------------------------------- | --------------------------------------------------------------- |
254
+ | `base` | `"Hanken Grotesk"`, sans-serif fallback | All default UI text, headlines, body copy |
255
+ | `accent` | `"Hanken Grotesk"`, sans-serif fallback | Labels, captions, technical context (same as base in LX Studio) |
256
+ | `monospace` | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Code editor contexts |
257
+ | `system` | System UI fonts | Performance-critical surfaces |
257
258
 
258
- Skillsoft fonts are loaded via Gamut's asset provider.
259
+ Hanken Grotesk is served from `https://www.codecademy.com/gamut/` in four variants: regular, italic, bold, bold-italic.
259
260
 
260
261
  ### Rules
261
262
 
262
- - **Skillsoft Text Medium (500)** for headlines, sub-headlines, CTAs, and buttons — use `fontWeight="title"`, not literal `700`.
263
- - **Skillsoft Text Regular (400)** for body text, UI labels, and menu items.
263
+ - **Hanken Grotesk Bold (700)** for headlines, sub-headlines, CTAs, and buttons.
264
+ - **Hanken Grotesk Regular (400)** for body text, UI labels, and menu items.
264
265
  - Text is **left-aligned** by default. Center-align only for short marketing headlines. Never right-align.
265
266
  - Do not adjust letter-spacing.
266
- - Skillsoft Sans is the accent face; Skillsoft Text is used for `base` and title styles.
267
+ - No separate accent typeface Hanken Grotesk is used uniformly for `base` and `accent`.
267
268
 
268
269
  ### Font weight scale
269
270
 
270
- | Token | Value | Use |
271
- | ------- | ------- | ------------------------ |
272
- | `base` | 400 | Body text, UI labels |
273
- | `title` | **500** | Headlines, CTAs, buttons |
271
+ | Token | Value | Use |
272
+ | ------- | ----- | ------------------------ |
273
+ | `base` | 400 | Body text, UI labels |
274
+ | `title` | 700 | Headlines, CTAs, buttons |
274
275
 
275
276
  ### Font size scale
276
277
 
277
- Standard Gamut font size scale:
278
+ Shared with Core all sizes are identical.
278
279
 
279
280
  | Token key | Size | Common use |
280
281
  | --------- | ---- | ---------------------------- |
@@ -290,7 +291,7 @@ Standard Gamut font size scale:
290
291
 
291
292
  ### Line height scale
292
293
 
293
- Standard Gamut line height scale:
294
+ Shared with Core.
294
295
 
295
296
  | Token | Value | Use |
296
297
  | ------------- | ----- | ------------------------------- |
@@ -306,7 +307,7 @@ Target 45–85 characters per line; 66 characters is ideal. Max 50 for multi-col
306
307
 
307
308
  ## Spacing Scale
308
309
 
309
- All spacing is multiples of 4px on an 8px grid.
310
+ Identical to Core. All spacing is multiples of 4px on an 8px grid.
310
311
 
311
312
  | Token | Value |
312
313
  | ----- | ----- |
@@ -326,20 +327,22 @@ All spacing is multiples of 4px on an 8px grid.
326
327
 
327
328
  ## Border Radius Scale
328
329
 
329
- | Token | Value | Use |
330
- | ------ | ----- | ------------------------ |
331
- | `none` | 0px | Non-interactive elements |
332
- | `sm` | 4px | Overlays |
333
- | `md` | 8px | Interactive elements |
334
- | `lg` | 12px | Non-interactive elements |
335
- | `xl` | 16px | Non-interactive elements |
336
- | `full` | 999px | Toggles, badges |
330
+ LX Studio uses larger border radii than Core — everything is one step softer.
331
+
332
+ | Token | LX Studio | Core | Use |
333
+ | ------ | --------- | ----- | ------------------------------------------ |
334
+ | `none` | 0px | 0px | Square / non-interactive elements |
335
+ | `sm` | **4px** | 2px | Subtle rounding, tags, checkboxes |
336
+ | `md` | **8px** | 4px | Default buttons, inputs, interactive cards |
337
+ | `lg` | **12px** | 8px | Cards, panels |
338
+ | `xl` | 16px | 16px | Large cards, modals |
339
+ | `full` | 999px | 999px | Pills, avatars, circular elements |
337
340
 
338
341
  ---
339
342
 
340
343
  ## Responsive Behavior
341
344
 
342
- Mobile-first; apply styles from the named breakpoint up.
345
+ Identical to Core. Mobile-first, apply styles from the named breakpoint up.
343
346
 
344
347
  | Token | Min-width | Max content |
345
348
  | -------- | --------- | ----------- |
@@ -364,14 +367,16 @@ Minimum interactive touch target: **44×44px** on mobile breakpoints.
364
367
 
365
368
  ## Component Library
366
369
 
367
- Gamut atoms, molecules, and organisms all apply. Use semantic tokens below for LX Studio styling.
370
+ Same component library as Codecademy — all atoms, molecules, and organisms apply. Token values resolve differently per theme automatically.
368
371
 
369
- Key patterns:
372
+ Key LX Studio-specific visual differences:
370
373
 
371
- - `FillButton` `bg: primary` (`sapphire`), `hover: primary-hover` (`navy-800`)
372
- - `Checkbox` / `Toggle``primary`, `hover: primary-hover` (same as `FillButton`)
373
- - Buttons and inputs `borderRadius: md` (8px)
374
- - `Card` `shadow-primary` (`navy-200`); elevated surfaces use `background-primary` (`lxStudioBgPrimary`), not beige
374
+ - `FillButton` uses `#5628FE` (lxStudioPurple) instead of hyper-500
375
+ - `FillButton` hover shifts to `#7955FC` (lxStudioPurpleHover) lighter, not darker, on hover
376
+ - `Checkbox` / `Toggle` use `hyper-500` (`#3A10E5`) — not the brand purple
377
+ - All interactive elements have `borderRadius: md` (8px) instead of Core's 4px
378
+ - `Card` shadows use navy-200 (soft) rather than navy-800 (hard)
379
+ - No `Card-beige` variant — LX Studio `background-primary` is off-white, not beige
375
380
 
376
381
  ---
377
382
 
@@ -380,15 +385,15 @@ Key patterns:
380
385
  ### Colors
381
386
 
382
387
  - **Do** use semantic color aliases (`primary`, `text`, `background`, etc.) — never hardcode hex values.
383
- - **Do** use `primary` (resolves to palette `sapphire`) for buttons and links.
388
+ - **Do** use `lxStudioPurple` (`#5628FE`) via `primary` for buttons and links.
384
389
  - **Don't** attempt dark mode — LX Studio is light only.
385
- - **Don't** use raw palette swatches for adaptive UI use semantic aliases.
390
+ - **Don't** use the Percipio or Codecademy primary blue/hyper colors directly; go through semantic aliases.
386
391
 
387
392
  ### Typography
388
393
 
389
- - **Do** use `fontWeight="title"` (500) for headlines, CTAs, and buttons.
394
+ - **Do** use Hanken Grotesk Bold (700) for headlines, CTAs, and buttons.
390
395
  - **Do** keep body text at 150–175% line height for readability.
391
- - **Don't** use fonts outside the LX Studio theme stack (Skillsoft Text, Skillsoft Sans).
396
+ - **Don't** use Apercu or Suisse those fonts are not available in LX Studio.
392
397
  - **Don't** right-align or center-align body paragraphs.
393
398
  - **Don't** adjust letter-spacing.
394
399
 
@@ -405,27 +410,27 @@ Key patterns:
405
410
 
406
411
  Quick color/token reference for generating or specifying LX Studio UI:
407
412
 
408
- | Scenario | Tokens |
409
- | ---------------- | -------------------------------------------------------------------------------------------------- |
410
- | Primary button | `bg: primary`, `color: white`, `hover: primary-hover`, `borderRadius: md` |
411
- | Body text | `color: text`, `font: base`, `size: 16`, `weight: 400`, `lineHeight: base` |
412
- | Headline | `color: text-accent`, `font: base`, `size: 34–64`, `weight: title`, `lineHeight: title` |
413
- | Secondary text | `color: text-secondary` |
414
- | Disabled text | `color: text-disabled` |
415
- | Elevated surface | `bg: background-primary` |
416
- | Card default | `bg: background`, `borderRadius: none` — add `isInteractive` for hover shadow + `borderRadius: md` |
417
- | Error state | `color: feedback-error`, `bg: background-error`, `borderColor: danger` |
418
- | Success state | `color: feedback-success`, `bg: background-success` |
419
- | Warning state | `color: feedback-warning`, `bg: background-warning` |
420
- | Disabled state | `color: text-disabled`, `bg: background-disabled`, `borderColor: border-disabled` |
413
+ | Scenario | Tokens |
414
+ | ---------------- | ------------------------------------------------------------------------------------------------------------------ |
415
+ | Primary button | `bg: primary (#5628FE)`, `color: white`, `hover: primary-hover (#7955FC)`, `borderRadius: md (8px)` |
416
+ | Body text | `color: text (#10162F)`, `font: Hanken Grotesk`, `size: 16px`, `weight: 400`, `lineHeight: base (1.5)` |
417
+ | Headline | `color: text-accent (#0A0D1C)`, `font: Hanken Grotesk`, `size: 34–64px`, `weight: 700`, `lineHeight: title (1.2)` |
418
+ | Secondary text | `color: text-secondary (#4C5063)` |
419
+ | Disabled text | `color: text-disabled (#686C7C)` |
420
+ | Elevated surface | `bg: background-primary (#FAFBFC)` |
421
+ | Card default | `bg: background (#ffffff)`, `borderRadius: none` — add `isInteractive` for hover shadow + `borderRadius: md (8px)` |
422
+ | Error state | `color: feedback-error (#BE1809)`, `bg: background-error (#FBF1F0)`, `border: danger` |
423
+ | Success state | `color: feedback-success (#06844F)`, `bg: background-success (#F5FFE3)` |
424
+ | Warning state | `color: feedback-warning (#FFD300)`, `bg: background-warning (#FFFAE5)` |
425
+ | Disabled state | `color: text-disabled (#686C7C)`, `bg: background-disabled (#E2E3E6, navy-200)`, `border: border-disabled` |
421
426
 
422
427
  ### Component token cheatsheet
423
428
 
424
429
  ```
425
- FillButton → bg: primary, color: white, hover: primary-hover, borderRadius: md
426
- StrokeButton → bg: transparent, borderColor: secondary
427
- Checkbox/Toggle → bg: primary, hover: primary-hover, borderRadius: sm
428
- Card → bg: background, shadow: shadow-primary (navy-200, soft), radius: none
430
+ FillButton → bg: primary (#5628FE), color: white, hover: primary-hover (#7955FC), radius: 8px
431
+ StrokeButton → bg: transparent, border: secondary (#10162F)
432
+ Checkbox/Toggle → primary (#5628FE), hover: primary-hover (#7955FC), radius: 4px
433
+ Card → bg: background, shadow: shadow-primary (#E2E3E6, navy-200, soft), radius: none
429
434
  Alert (error) → uses feedback-error + background-error
430
435
  Alert (success) → uses feedback-success + background-success
431
436
  Alert (warning) → uses feedback-warning + background-warning