@codecademy/gamut 68.7.1-alpha.f618c1.0 → 68.7.1

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 (87) hide show
  1. package/agent-tools/DESIGN.Codecademy.md +90 -120
  2. package/agent-tools/DESIGN.LXStudio.md +127 -132
  3. package/agent-tools/DESIGN.Percipio.md +129 -134
  4. package/agent-tools/DESIGN.md +12 -1
  5. package/bin/lib/claude.mjs +5 -14
  6. package/bin/lib/cursor.mjs +1 -4
  7. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.d.ts +2 -2
  8. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.js +1 -1
  9. package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/index.module.scss +5 -5
  10. package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/mixins.scss +5 -5
  11. package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/variables.scss +22 -23
  12. package/dist/AccordionButtonDeprecated/styles.module.scss +8 -6
  13. package/dist/Alert/elements.d.ts +2 -2
  14. package/dist/Anchor/index.d.ts +9 -19
  15. package/dist/Anchor/index.js +6 -9
  16. package/dist/BarChart/BarRow/elements.d.ts +45 -47
  17. package/dist/BarChart/utils/hooks.d.ts +2 -2
  18. package/dist/BarChart/utils/hooks.js +1 -3
  19. package/dist/Box/GridBox.d.ts +0 -1
  20. package/dist/Box/GridBox.js +1 -1
  21. package/dist/Box/props.d.ts +1 -1
  22. package/dist/Breadcrumbs/index.d.ts +5 -5
  23. package/dist/Breadcrumbs/index.js +2 -2
  24. package/dist/Button/CTAButton.d.ts +2 -2
  25. package/dist/Button/FillButton.d.ts +4 -4
  26. package/dist/Button/IconButton.d.ts +4 -4
  27. package/dist/Button/StrokeButton.d.ts +4 -4
  28. package/dist/Button/TextButton.d.ts +4 -4
  29. package/dist/Button/shared/InlineIconButton.d.ts +2 -2
  30. package/dist/Button/shared/styles.d.ts +3 -3
  31. package/dist/Button/shared/types.d.ts +1 -1
  32. package/dist/ButtonBase/ButtonBase.d.ts +4 -9
  33. package/dist/ButtonBase/ButtonBase.js +4 -11
  34. package/dist/Card/elements.d.ts +103 -109
  35. package/dist/Card/styles.d.ts +8 -8
  36. package/dist/Coachmark/index.d.ts +1 -1
  37. package/dist/ConnectedForm/ConnectedForm.d.ts +1 -1
  38. package/dist/ConnectedForm/ConnectedFormGroup.js +3 -4
  39. package/dist/ConnectedForm/utils.d.ts +1 -1
  40. package/dist/ConnectedForm/utils.js +1 -1
  41. package/dist/DatePicker/DatePickerInput/index.d.ts +1 -1
  42. package/dist/Disclosure/elements.d.ts +12 -18
  43. package/dist/FeatureShimmer/index.js +1 -1
  44. package/dist/Form/SelectDropdown/SelectDropdown.js +1 -1
  45. package/dist/Form/SelectDropdown/elements/containers.js +1 -1
  46. package/dist/Form/SelectDropdown/elements/controls.js +2 -2
  47. package/dist/Form/SelectDropdown/elements/multi-value.js +2 -2
  48. package/dist/Form/SelectDropdown/types/internal.d.ts +2 -2
  49. package/dist/Form/SelectDropdown/utils.js +1 -2
  50. package/dist/Form/elements/Form.d.ts +15 -15
  51. package/dist/Form/elements/FormGroup.d.ts +1 -1
  52. package/dist/Form/styles/Checkbox-styles.d.ts +1 -1
  53. package/dist/GridForm/GridFormButtons/index.d.ts +4 -4
  54. package/dist/List/ListProvider.d.ts +1 -1
  55. package/dist/List/elements.d.ts +42 -44
  56. package/dist/Menu/MenuItem.js +6 -10
  57. package/dist/Menu/elements.d.ts +2 -2
  58. package/dist/Modals/Dialog.js +2 -6
  59. package/dist/Modals/Modal.js +2 -5
  60. package/dist/Modals/elements.d.ts +1 -1
  61. package/dist/Pagination/AnimatedPaginationButtons.d.ts +29 -31
  62. package/dist/Pagination/EllipsisButton.d.ts +2 -2
  63. package/dist/Pagination/PaginationButton.d.ts +6 -6
  64. package/dist/Pagination/utils.d.ts +29 -31
  65. package/dist/Pagination/utils.js +11 -14
  66. package/dist/Popover/Popover.js +6 -6
  67. package/dist/Popover/types.d.ts +3 -4
  68. package/dist/PopoverContainer/PopoverContainer.js +9 -9
  69. package/dist/PopoverContainer/hooks.d.ts +4 -16
  70. package/dist/PopoverContainer/hooks.js +27 -50
  71. package/dist/PopoverContainer/types.d.ts +1 -2
  72. package/dist/Tabs/TabButton.d.ts +2 -2
  73. package/dist/Tabs/TabNavLink.d.ts +2 -2
  74. package/dist/Tag/elements.d.ts +8 -14
  75. package/dist/Tag/index.js +1 -1
  76. package/dist/Tip/InfoTip/InfoTipButton.d.ts +4 -4
  77. package/dist/Tip/PreviewTip/elements.d.ts +6 -12
  78. package/dist/Tip/__tests__/helpers.d.ts +1 -1
  79. package/dist/Tip/shared/FloatingTip.js +2 -2
  80. package/dist/Tip/shared/types.d.ts +2 -2
  81. package/dist/Tip/shared/utils.js +1 -1
  82. package/dist/Typography/styles/_variables.scss +54 -0
  83. package/dist/Video/styles/vds_base_theme.scss +3 -1
  84. package/dist/utils/react.js +2 -4
  85. package/package.json +10 -10
  86. package/dist/utils/nullish.d.ts +0 -10
  87. package/dist/utils/nullish.js +0 -11
@@ -4,8 +4,7 @@ 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
- lxStudioPurple: '#5628FE'
8
- lxStudioPurpleHover: '#7955FC'
7
+ sapphire: '#1C50BB'
9
8
  lxStudioSuccess: '#06844F'
10
9
  lxStudioBgPrimary: '#FAFBFC'
11
10
  # core palette — referenced by semantic aliases below
@@ -13,13 +12,13 @@ colors:
13
12
  hyper-400: '#5533FF'
14
13
  navy-900: '#0A0D1C'
15
14
  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'
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)'
23
22
  yellow-500: '#FFD300'
24
23
  yellow-0: '#FFFAE5'
25
24
  green-700: '#008A27'
@@ -42,8 +41,8 @@ colors:
42
41
  background-success: '{colors.green-0}'
43
42
  background-warning: '{colors.yellow-0}'
44
43
  background-error: '{colors.red-0}'
45
- primary: '{colors.lxStudioPurple}'
46
- primary-hover: '{colors.lxStudioPurpleHover}'
44
+ primary: '{colors.sapphire}'
45
+ primary-hover: '{colors.navy-800}'
47
46
  primary-inverse: '{colors.yellow-500}'
48
47
  secondary: '{colors.navy-800}'
49
48
  secondary-hover: '{colors.navy-700}'
@@ -60,19 +59,19 @@ colors:
60
59
  shadow-secondary: '{colors.navy-600}'
61
60
  typography:
62
61
  base:
63
- fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
62
+ fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
64
63
  fontSize: '1rem'
65
64
  fontWeight: '400'
66
65
  lineHeight: '1.5'
67
66
  accent:
68
- fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
67
+ fontFamily: '"Skillsoft Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
69
68
  fontSize: '0.875rem'
70
69
  fontWeight: '400'
71
70
  lineHeight: '1.5'
72
71
  title:
73
- fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
72
+ fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
74
73
  fontSize: '2.125rem'
75
- fontWeight: '700'
74
+ fontWeight: '500'
76
75
  lineHeight: '1.2'
77
76
  monospace:
78
77
  fontFamily: 'Monaco, Menlo, "Ubuntu Mono", "Droid Sans Mono", Consolas, monospace'
@@ -125,10 +124,12 @@ components:
125
124
 
126
125
  # LX Studio
127
126
 
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.
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.
129
128
 
130
129
  **Storybook**: https://gamut.codecademy.com
131
130
 
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
+
132
133
  ---
133
134
 
134
135
  ## Visual Theme & Atmosphere
@@ -139,11 +140,10 @@ LX Studio communicates **modern professional craft** — clean, precise, and too
139
140
 
140
141
  **Design philosophy**:
141
142
 
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
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
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 | Hanken Grotesk | light only |
154
+ | Theme | Use case | Base font | Dark mode |
155
+ | ------------- | -------------------------------------- | --------------------- | ---------- |
156
+ | **LX Studio** | Skillsoft LX Studio authoring platform | Skillsoft Text / Sans | light only |
157
157
 
158
158
  The active theme is set at the app root via `<GamutProvider theme={lxStudioTheme}>`.
159
159
 
@@ -165,79 +165,78 @@ Use these token names when specifying colors. LX Studio is light mode only — t
165
165
 
166
166
  ### Text
167
167
 
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 |
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 |
174
174
 
175
175
  ### Background
176
176
 
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 |
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 |
188
188
 
189
189
  ### Interactive
190
190
 
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 |
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 |
200
200
 
201
201
  ### Border
202
202
 
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 |
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 |
209
209
 
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.
210
+ `border-primary` resolves to `navy-400` mid-weight borders for inputs and cards.
211
211
 
212
212
  ### Feedback
213
213
 
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 |
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 |
219
219
 
220
220
  ### Shadow
221
221
 
222
- | Token | Value |
223
- | ------------------ | -------------------- |
224
- | `shadow-primary` | `#E2E3E6` (navy-200) |
225
- | `shadow-secondary` | `#4C5063` (navy-600) |
222
+ | Token | Resolves to |
223
+ | ------------------ | ----------- |
224
+ | `shadow-primary` | `navy-200` |
225
+ | `shadow-secondary` | `navy-600` |
226
226
 
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.
227
+ Use `shadow-primary` for standard elevated surfaces.
228
228
 
229
229
  ---
230
230
 
231
231
  ## LX Studio Color Palette
232
232
 
233
- LX Studio adds four named colors to the core palette. Use semantic aliases in code, not these raw names.
233
+ LX Studio adds named colors to the core palette. Use semantic aliases in code, not these raw names.
234
234
 
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` |
235
+ | Palette token | Semantic alias(es) |
236
+ | ------------------- | -------------------- |
237
+ | `sapphire` | `primary` |
238
+ | `lxStudioSuccess` | `feedback-success` |
239
+ | `lxStudioBgPrimary` | `background-primary` |
241
240
 
242
241
  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.).
243
242
 
@@ -247,35 +246,35 @@ The full core swatch palette (navy, hyper, blue, green, yellow, red, etc.) is al
247
246
 
248
247
  ### Typefaces
249
248
 
250
- LX Studio uses **Hanken Grotesk** for all font roles. There is no Apercu and no Suisse.
249
+ LX Studio uses **Skillsoft Text** for body and headlines and **Skillsoft Sans** for accent UI.
251
250
 
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 |
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 |
258
257
 
259
- Hanken Grotesk is served from `https://www.codecademy.com/gamut/` in four variants: regular, italic, bold, bold-italic.
258
+ Skillsoft fonts are loaded via Gamut's asset provider.
260
259
 
261
260
  ### Rules
262
261
 
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.
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.
265
264
  - Text is **left-aligned** by default. Center-align only for short marketing headlines. Never right-align.
266
265
  - Do not adjust letter-spacing.
267
- - No separate accent typeface Hanken Grotesk is used uniformly for `base` and `accent`.
266
+ - Skillsoft Sans is the accent face; Skillsoft Text is used for `base` and title styles.
268
267
 
269
268
  ### Font weight scale
270
269
 
271
- | Token | Value | Use |
272
- | ------- | ----- | ------------------------ |
273
- | `base` | 400 | Body text, UI labels |
274
- | `title` | 700 | Headlines, CTAs, buttons |
270
+ | Token | Value | Use |
271
+ | ------- | ------- | ------------------------ |
272
+ | `base` | 400 | Body text, UI labels |
273
+ | `title` | **500** | Headlines, CTAs, buttons |
275
274
 
276
275
  ### Font size scale
277
276
 
278
- Shared with Core all sizes are identical.
277
+ Standard Gamut font size scale:
279
278
 
280
279
  | Token key | Size | Common use |
281
280
  | --------- | ---- | ---------------------------- |
@@ -291,7 +290,7 @@ Shared with Core — all sizes are identical.
291
290
 
292
291
  ### Line height scale
293
292
 
294
- Shared with Core.
293
+ Standard Gamut line height scale:
295
294
 
296
295
  | Token | Value | Use |
297
296
  | ------------- | ----- | ------------------------------- |
@@ -307,7 +306,7 @@ Target 45–85 characters per line; 66 characters is ideal. Max 50 for multi-col
307
306
 
308
307
  ## Spacing Scale
309
308
 
310
- Identical to Core. All spacing is multiples of 4px on an 8px grid.
309
+ All spacing is multiples of 4px on an 8px grid.
311
310
 
312
311
  | Token | Value |
313
312
  | ----- | ----- |
@@ -327,22 +326,20 @@ Identical to Core. All spacing is multiples of 4px on an 8px grid.
327
326
 
328
327
  ## Border Radius Scale
329
328
 
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 |
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 |
340
337
 
341
338
  ---
342
339
 
343
340
  ## Responsive Behavior
344
341
 
345
- Identical to Core. Mobile-first, apply styles from the named breakpoint up.
342
+ Mobile-first; apply styles from the named breakpoint up.
346
343
 
347
344
  | Token | Min-width | Max content |
348
345
  | -------- | --------- | ----------- |
@@ -367,16 +364,14 @@ Minimum interactive touch target: **44×44px** on mobile breakpoints.
367
364
 
368
365
  ## Component Library
369
366
 
370
- Same component library as Codecademy — all atoms, molecules, and organisms apply. Token values resolve differently per theme automatically.
367
+ Gamut atoms, molecules, and organisms all apply. Use semantic tokens below for LX Studio styling.
371
368
 
372
- Key LX Studio-specific visual differences:
369
+ Key patterns:
373
370
 
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
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
380
375
 
381
376
  ---
382
377
 
@@ -385,15 +380,15 @@ Key LX Studio-specific visual differences:
385
380
  ### Colors
386
381
 
387
382
  - **Do** use semantic color aliases (`primary`, `text`, `background`, etc.) — never hardcode hex values.
388
- - **Do** use `lxStudioPurple` (`#5628FE`) via `primary` for buttons and links.
383
+ - **Do** use `primary` (resolves to palette `sapphire`) for buttons and links.
389
384
  - **Don't** attempt dark mode — LX Studio is light only.
390
- - **Don't** use the Percipio or Codecademy primary blue/hyper colors directly; go through semantic aliases.
385
+ - **Don't** use raw palette swatches for adaptive UI use semantic aliases.
391
386
 
392
387
  ### Typography
393
388
 
394
- - **Do** use Hanken Grotesk Bold (700) for headlines, CTAs, and buttons.
389
+ - **Do** use `fontWeight="title"` (500) for headlines, CTAs, and buttons.
395
390
  - **Do** keep body text at 150–175% line height for readability.
396
- - **Don't** use Apercu or Suisse those fonts are not available in LX Studio.
391
+ - **Don't** use fonts outside the LX Studio theme stack (Skillsoft Text, Skillsoft Sans).
397
392
  - **Don't** right-align or center-align body paragraphs.
398
393
  - **Don't** adjust letter-spacing.
399
394
 
@@ -410,27 +405,27 @@ Key LX Studio-specific visual differences:
410
405
 
411
406
  Quick color/token reference for generating or specifying LX Studio UI:
412
407
 
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` |
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` |
426
421
 
427
422
  ### Component token cheatsheet
428
423
 
429
424
  ```
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
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
434
429
  Alert (error) → uses feedback-error + background-error
435
430
  Alert (success) → uses feedback-success + background-success
436
431
  Alert (warning) → uses feedback-warning + background-warning