@codecademy/gamut 68.6.3-alpha.d1603c.0 β†’ 68.7.1-alpha.1ea5a8.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.
@@ -8,12 +8,13 @@ colors:
8
8
  hyper-400: '#5533FF'
9
9
  navy-900: '#0A0D1C'
10
10
  navy-800: '#10162F'
11
- navy-700: '#31374C'
12
- navy-600: '#4C5063'
13
- navy-500: '#686C7C'
14
- navy-300: '#BCBEC5'
15
- navy-200: '#E2E3E6'
16
- navy-100: '#F5F6F7'
11
+ navy-700: 'rgba(16, 22, 47, 0.86)'
12
+ navy-600: 'rgba(16, 22, 47, 0.75)'
13
+ navy-500: 'rgba(16, 22, 47, 0.63)'
14
+ navy-400: 'rgba(16, 22, 47, 0.47)'
15
+ navy-300: 'rgba(16, 22, 47, 0.28)'
16
+ navy-200: 'rgba(16, 22, 47, 0.12)'
17
+ navy-100: 'rgba(16, 22, 47, 0.04)'
17
18
  yellow-500: '#FFD300'
18
19
  yellow-400: '#CCA900'
19
20
  yellow-0: '#FFFAE5'
@@ -77,8 +78,6 @@ typography:
77
78
  fontSize: '2.125rem'
78
79
  fontWeight: '700'
79
80
  lineHeight: '1.2'
80
- hankenGrotesk:
81
- fontFamily: '"Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
82
81
  monospace:
83
82
  fontFamily: 'Monaco, Menlo, "Ubuntu Mono", "Droid Sans Mono", Consolas, monospace'
84
83
  rounded:
@@ -181,6 +180,8 @@ This file defines the visual design tokens for codecademy.com, implemented using
181
180
  **Figma file**: https://www.figma.com/design/ReGfRNillGABAj5SlITalN/πŸ“-Gamut
182
181
  **Storybook**: https://gamut.codecademy.com
183
182
 
183
+ > **Other Gamut themes:** This document covers **Codecademy** (Core, Admin, Platform) only. For Percipio or LX Studio, install that product's `DESIGN.md` instead: `gamut plugin install cursor --theme percipio` or `--theme lxstudio` (see `DESIGN.Percipio.md` / `DESIGN.LXStudio.md` in agent-tools).
184
+
184
185
  ---
185
186
 
186
187
  ## Visual Theme & Atmosphere
@@ -192,7 +193,7 @@ Codecademy communicates **logic with personality** β€” structured and trustworth
192
193
  **Design philosophy**:
193
194
 
194
195
  - Components are color mode–aware by default β€” never hardcode hex values for adaptive UI
195
- - Every component works across all themes without modification
196
+ - Every component works across Core, Admin, and Platform without modification
196
197
  - Mobile-first responsive design built on a 12-column grid
197
198
  - Accessibility is guaranteed by design: semantic color tokens meet contrast requirements per mode automatically
198
199
 
@@ -200,46 +201,17 @@ Codecademy communicates **logic with personality** β€” structured and trustworth
200
201
 
201
202
  ## Themes
202
203
 
203
- Codecademy products use one of four Gamut themes, all sharing the same core visual identity. Token aliases resolve to the right values per theme automatically β€” components require no modification.
204
-
205
- | Theme | Use case | Base font | Dark mode |
206
- | ------------- | ------------------------------- | -------------- | -------------- |
207
- | **Core** | Codecademy (default) | Apercu | βœ“ light + dark |
208
- | **Admin** | Codecademy admin tools | Apercu | βœ“ light + dark |
209
- | **Platform** | Codecademy learning environment | Apercu | βœ“ light + dark |
210
- | **LX Studio** | LX Studio application | Hanken Grotesk | light only |
211
-
212
- The active theme is set at the app root via `<GamutProvider>`. When designing, know which theme your screen targets β€” it affects primary colors, font families, and available color weights.
213
-
214
- **Font licensing**: Apercu is licensed for codecademy.com only. LX Studio uses Hanken Grotesk.
215
-
216
- For Percipio projects, use `DESIGN.Percipio.md` from the same package instead.
217
-
218
- ### LX Studio theme overrides
219
-
220
- LX Studio extends Core with these differences:
204
+ Codecademy products use **Core**, **Admin**, or **Platform** β€” the same visual identity with theme-specific palette additions on Platform. Token aliases resolve per theme automatically; components require no modification.
221
205
 
222
- **Font**: All families β†’ `"Hanken Grotesk"` (no Apercu, no Suisse).
206
+ | Theme | Use case | Base font | Dark mode |
207
+ | ------------ | ------------------------------- | --------- | -------------- |
208
+ | **Core** | Codecademy (default) | Apercu | βœ“ light + dark |
209
+ | **Admin** | Codecademy admin tools | Apercu | βœ“ light + dark |
210
+ | **Platform** | Codecademy learning environment | Apercu | βœ“ light + dark |
223
211
 
224
- **Border radii** (all values shift up one step):
212
+ Set the active theme at the app root via `<GamutProvider theme={coreTheme | adminTheme | platformTheme}>`.
225
213
 
226
- | Token | Core | LX Studio |
227
- | ----- | ---- | --------- |
228
- | `sm` | 2px | 4px |
229
- | `md` | 4px | 8px |
230
- | `lg` | 8px | 12px |
231
-
232
- **Semantic color overrides (light mode)**:
233
-
234
- | Token | Core value | LX Studio value |
235
- | -------------------- | ------------------- | ------------------------------- |
236
- | `primary` | hyper-500 `#3A10E5` | `#5628FE` (lxStudioPurple) |
237
- | `primary-hover` | hyper-400 `#5533FF` | `#7955FC` (lxStudioPurpleHover) |
238
- | `feedback-success` | green-700 `#008A27` | `#06844F` (lxStudioSuccess) |
239
- | `background-primary` | beige `#FFF0E5` | `#FAFBFC` (lxStudioBgPrimary) |
240
- | `shadow-primary` | navy-800 | navy-200 |
241
- | `border-primary` | navy-800 | navy-400 |
242
- | `border-disabled` | navy-500 | navy-300 |
214
+ **Font licensing:** Apercu is licensed for codecademy.com only.
243
215
 
244
216
  ---
245
217
 
@@ -249,55 +221,55 @@ Use these token names when specifying colors in designs. They resolve to the cor
249
221
 
250
222
  ### Text
251
223
 
252
- | Token | Light | Dark | Use for |
253
- | ---------------- | -------------------------- | --------------- | --------------------------- |
254
- | `text` | navy-800 `#10162F` at 100% | white `#ffffff` | Default body and UI text |
255
- | `text-accent` | navy-900 `#0A0D1C` | beige `#FFF0E5` | Stronger emphasis text |
256
- | `text-secondary` | navy-800 at 75% | white at 65% | Supporting / secondary copy |
257
- | `text-disabled` | navy-800 at 63% | white at 50% | Disabled state labels |
224
+ | Token | Light | Dark | Use for |
225
+ | ---------------- | --------------- | ------------ | --------------------------- |
226
+ | `text` | `navy-800` | `white` | Default body and UI text |
227
+ | `text-accent` | `navy-900` | `beige` | Stronger emphasis text |
228
+ | `text-secondary` | navy-800 at 75% | white at 65% | Supporting / secondary copy |
229
+ | `text-disabled` | navy-800 at 63% | white at 50% | Disabled state labels |
258
230
 
259
231
  ### Background
260
232
 
261
- | Token | Light | Dark | Use for |
262
- | --------------------- | ------------------ | -------------------- | --------------------------------- |
263
- | `background` | white `#ffffff` | navy-800 `#10162F` | Default page/component background |
264
- | `background-primary` | beige `#FFF0E5` | navy-900 `#0A0D1C` | Slightly elevated surfaces |
265
- | `background-contrast` | white | black `#000000` | Maximum contrast surface |
266
- | `background-selected` | navy-800 at 4% | white at 4% | Selected row / item |
267
- | `background-hover` | navy-800 at 12% | white at 9% | Hover state overlay |
268
- | `background-disabled` | navy-800 at 12% | white at 9% | Disabled surface |
269
- | `background-success` | green-0 `#F5FFE3` | green-900 `#151C07` | Success state container |
270
- | `background-warning` | yellow-0 `#FFFAE5` | yellow-900 `#211B00` | Warning state container |
271
- | `background-error` | red-0 `#FBF1F0` | red-900 `#280503` | Error state container |
233
+ | Token | Light | Dark | Use for |
234
+ | --------------------- | --------------- | ------------ | --------------------------------- |
235
+ | `background` | `white` | `navy-800` | Default page/component background |
236
+ | `background-primary` | `beige` | `navy-900` | Slightly elevated surfaces |
237
+ | `background-contrast` | `white` | `black` | Maximum contrast surface |
238
+ | `background-selected` | navy-800 at 4% | white at 4% | Selected row / item |
239
+ | `background-hover` | navy-800 at 12% | white at 9% | Hover state overlay |
240
+ | `background-disabled` | navy-800 at 12% | white at 9% | Disabled surface |
241
+ | `background-success` | `green-0` | `green-900` | Success state container |
242
+ | `background-warning` | `yellow-0` | `yellow-900` | Warning state container |
243
+ | `background-error` | `red-0` | `red-900` | Error state container |
272
244
 
273
245
  ### Interactive
274
246
 
275
- | Token | Light | Dark | Use for |
276
- | ----------------- | -------------------- | -------------------- | ------------------------------------ |
277
- | `primary` | hyper-500 `#3A10E5` | yellow-500 `#FFD300` | Primary CTA, links, focus rings |
278
- | `primary-hover` | hyper-400 `#5533FF` | yellow-400 `#CCA900` | Hover state of primary interactive |
279
- | `primary-inverse` | yellow-500 `#FFD300` | hyper-500 `#3A10E5` | Primary on a colored background |
280
- | `secondary` | navy-800 `#10162F` | white `#ffffff` | Secondary CTA, ghost buttons |
281
- | `secondary-hover` | navy-800 at 86% | white at 80% | Hover state of secondary interactive |
282
- | `danger` | red-500 `#E91C11` | red-300 `#E85D7F` | Destructive actions, error states |
283
- | `danger-hover` | red-600 `#BE1809` | red-400 `#DC5879` | Hover on danger interactive |
247
+ | Token | Light | Dark | Use for |
248
+ | ----------------- | --------------- | ------------ | ------------------------------------ |
249
+ | `primary` | `hyper-500` | `yellow-500` | Primary CTA, links, focus rings |
250
+ | `primary-hover` | `hyper-400` | `yellow-400` | Hover state of primary interactive |
251
+ | `primary-inverse` | `yellow-500` | `hyper-500` | Primary on a colored background |
252
+ | `secondary` | `navy-800` | `white` | Secondary CTA, ghost buttons |
253
+ | `secondary-hover` | navy-800 at 86% | white at 80% | Hover state of secondary interactive |
254
+ | `danger` | `red-500` | `red-300` | Destructive actions, error states |
255
+ | `danger-hover` | `red-600` | `red-400` | Hover on danger interactive |
284
256
 
285
257
  ### Border
286
258
 
287
- | Token | Light | Dark | Use for |
288
- | ------------------ | ------------------ | --------------- | -------------------------- |
289
- | `border-primary` | navy-800 `#10162F` | white `#ffffff` | Strong borders, dividers |
290
- | `border-secondary` | navy-800 at 75% | white at 65% | Medium-weight borders |
291
- | `border-tertiary` | navy-800 at 28% | white at 20% | Subtle borders, separators |
292
- | `border-disabled` | navy-800 at 63% | white at 50% | Disabled input borders |
259
+ | Token | Light | Dark | Use for |
260
+ | ------------------ | --------------- | ------------ | -------------------------- |
261
+ | `border-primary` | `navy-800` | `white` | Strong borders, dividers |
262
+ | `border-secondary` | navy-800 at 75% | white at 65% | Medium-weight borders |
263
+ | `border-tertiary` | navy-800 at 28% | white at 20% | Subtle borders, separators |
264
+ | `border-disabled` | navy-800 at 63% | white at 50% | Disabled input borders |
293
265
 
294
266
  ### Feedback
295
267
 
296
- | Token | Light | Dark | Use for |
297
- | ------------------ | ------------------- | ------------------- | -------------------------------- |
298
- | `feedback-error` | red-600 `#BE1809` | red-300 `#E85D7F` | Error messages, validation |
299
- | `feedback-success` | green-700 `#008A27` | green-400 `#AEE938` | Success messages, confirmations |
300
- | `feedback-warning` | yellow `#FFD300` | yellow-0 `#FFFAE5` | Warning messages, caution states |
268
+ | Token | Light | Dark | Use for |
269
+ | ------------------ | ----------- | ----------- | -------------------------------- |
270
+ | `feedback-error` | `red-600` | `red-300` | Error messages, validation |
271
+ | `feedback-success` | `green-700` | `green-400` | Success messages, confirmations |
272
+ | `feedback-warning` | `yellow` | `yellow-0` | Warning messages, caution states |
301
273
 
302
274
  ### Shadow
303
275
 
@@ -314,32 +286,28 @@ All colors available as static tokens regardless of color mode. Use these only w
314
286
 
315
287
  ### Core Palette
316
288
 
317
- | Name | Weights available | Notes |
318
- | --------------- | ---------------------------- | --------------------------------------------------------------------------------- |
319
- | `navy` | 100–900 | 100–700 are rgba transparencies of `#10162F`; 800 = `#10162F`; 900 = `#0A0D1C` |
320
- | `white` | 100–700 | rgba transparencies of `#ffffff` (no solid white weight β€” use `white` for `#fff`) |
321
- | `blue` | 0, 100, 300, 400, 500, 800 | 500 = `#1557FF` |
322
- | `hyper` | 400, 500 | 500 = `#3A10E5` (purple-blue), 400 = `#5533FF` |
323
- | `green` | 0, 100, 400, 700, 900 | 700 = `#008A27` |
324
- | `yellow` | 0, 400, 500, 900 | 500 = `#FFD300` |
325
- | `red` | 0, 300, 400, 500, 600, 900 | 500 = `#E91C11` |
326
- | `gray` | 100, 200, 300, 600, 800, 900 | |
327
- | `pink` | 0, 400 | 400 = `#F966FF` |
328
- | `orange` | 100, 500 | 500 = `#FF8C00` |
329
- | `beige` | 100 (alias: `beige`) | `#FFF0E5` |
330
- | `black` | β€” | `#000000` |
331
- | `white` (solid) | β€” | `#ffffff` |
289
+ | Name | Weights available | Notes |
290
+ | --------------- | ---------------------------- | -------------------------------------------------------------------------- |
291
+ | `navy` | 100–900 | 100–700 are rgba transparencies of `navy-800`; 800 and 900 are solid |
292
+ | `white` | 100–700 | rgba transparencies of `white` (no solid white weight β€” use `white` token) |
293
+ | `blue` | 0, 100, 300, 400, 500, 800 | named alias `blue` maps to `blue-500` |
294
+ | `hyper` | 400, 500 | named alias `hyper` maps to `hyper-500` |
295
+ | `green` | 0, 100, 400, 700, 900 | named alias `green` maps to `green-700` |
296
+ | `yellow` | 0, 400, 500, 900 | named alias `yellow` maps to `yellow-500` |
297
+ | `red` | 0, 300, 400, 500, 600, 900 | named alias `red` maps to `red-500` |
298
+ | `gray` | 100, 200, 300, 600, 800, 900 | |
299
+ | `pink` | 0, 400 | named alias `pink` maps to `pink-400` |
300
+ | `orange` | 100, 500 | named alias `orange` maps to `orange-500` |
301
+ | `beige` | 100 (alias: `beige`) | solid `beige` token |
302
+ | `black` | β€” | `black` token |
303
+ | `white` (solid) | β€” | `white` token |
332
304
 
333
305
  **Named aliases** (shorthand for common weights):
334
306
  `beige`, `blue`, `green`, `hyper`, `lightBlue`, `lightGreen`, `navy`, `orange`, `paleBlue`, `paleGreen`, `palePink`, `paleRed`, `paleYellow`, `pink`, `red`, `yellow`, `black`, `white`
335
307
 
336
308
  ### Platform-only additions
337
309
 
338
- `lightBeige` (`#FFFBF8`), `gold` (`#8A7300`), `teal` (`#006D82`), `purple` (`#B3CCFF`)
339
-
340
- ### LX Studio additions
341
-
342
- `lxStudioPurple` (`#5628FE`), `lxStudioPurpleHover` (`#7955FC`), `lxStudioSuccess` (`#06844F`)
310
+ `lightBeige`, `gold`, `teal`, `purple` (Platform theme palette)
343
311
 
344
312
  ---
345
313
 
@@ -347,14 +315,14 @@ All colors available as static tokens regardless of color mode. Use these only w
347
315
 
348
316
  ### Typefaces
349
317
 
350
- | Token | Core / Admin / Platform | LX Studio | Use for |
351
- | ----------- | -------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------ |
352
- | `base` | Apercu Pro (CSS: `Apercu`) | Hanken Grotesk | All default UI text, headlines, body copy |
353
- | `accent` | Suisse Intl Mono (CSS: `Suisse`); falls back to `Apercu` | Hanken Grotesk | Code, captions, labels, lists, technical context |
354
- | `monospace` | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Code editor contexts |
355
- | `system` | System UI fonts | System UI fonts | Performance-critical surfaces |
318
+ | Token | Font stack | Use for |
319
+ | ----------- | -------------------------------------------------------- | ------------------------------------------------ |
320
+ | `base` | Apercu Pro (CSS: `Apercu`) | All default UI text, headlines, body copy |
321
+ | `accent` | Suisse Intl Mono (CSS: `Suisse`); falls back to `Apercu` | Code, captions, labels, lists, technical context |
322
+ | `monospace` | Monaco, Menlo, Ubuntu Mono, Droid Sans Mono, Consolas | Code editor contexts |
323
+ | `system` | System UI fonts | Performance-critical surfaces |
356
324
 
357
- **Apercu is licensed for codecademy.com only.** LX Studio uses Hanken Grotesk for both `base` and `accent`.
325
+ **Apercu is licensed for codecademy.com only.**
358
326
 
359
327
  ### Rules
360
328
 
@@ -454,14 +422,16 @@ Interactive cards (`isInteractive` prop) gain a shadow on hover and `borderRadiu
454
422
 
455
423
  ## Border Radius Scale
456
424
 
457
- | Token | Value | Use |
458
- | ------ | ----- | ------------------------------------------ |
459
- | `none` | 0px | Square / non-interactive elements |
460
- | `sm` | 2px | Subtle rounding, tags |
461
- | `md` | 4px | Default buttons, inputs, interactive cards |
462
- | `lg` | 8px | Cards, panels |
463
- | `xl` | 16px | Large cards, modals |
464
- | `full` | 999px | Pills, avatars, circular elements |
425
+ | Token | Value | Use |
426
+ | ------ | ----- | ------------------------ |
427
+ | `none` | 0px | Non-interactive elements |
428
+ | `sm` | 2px | Overlays |
429
+ | `md` | 4px | Interactive elements |
430
+ | `lg` | 8px | Non-interactive elements |
431
+ | `xl` | 16px | Non-interactive elements |
432
+ | `full` | 999px | Toggles, badges |
433
+
434
+ ---
465
435
 
466
436
  ---
467
437
 
@@ -603,8 +573,8 @@ Quick color/token reference for generating or specifying UI:
603
573
 
604
574
  | Scenario | Tokens |
605
575
  | ---------------------- | ----------------------------------------------------------------------------------------------------- |
606
- | Primary button (light) | `bg: primary (#3A10E5)`, `color: white`, `hover: primary-hover (#5533FF)` |
607
- | Primary button (dark) | `bg: primary (#FFD300)`, `color: navy-800`, `hover: primary-hover (#CCA900)` |
576
+ | Primary button (light) | `bg: primary`, `color: white`, `hover: primary-hover` |
577
+ | Primary button (dark) | `bg: primary`, `color: text`, `hover: primary-hover` |
608
578
  | Body text | `color: text`, `font: base (Apercu Pro)`, `size: 16px`, `weight: 400`, `lineHeight: base (1.5)` |
609
579
  | Headline | `color: text-accent`, `font: base`, `size: 34–64px`, `weight: title (700)`, `lineHeight: title (1.2)` |
610
580
  | Caption / label | `color: text-secondary`, `font: accent (Suisse Int'l Mono)`, `size: 14px` |
@@ -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
@@ -5,12 +5,12 @@ description: Design tokens for the Skillsoft Percipio platform.
5
5
  colors:
6
6
  # palette β€” raw swatches; set once on :root and then always reference by token name, never use hex values directly in code
7
7
  percipioTextPrimary: '#222325'
8
- percipioTextSecondary: '#595A5C'
8
+ percipioTextSecondary: 'rgba(34, 35, 37, 0.75)'
9
9
  percipioTextDisabled: '#AFB6C2'
10
- percipioActionPrimary: '#0073C4'
10
+ sapphire: '#1C50BB'
11
11
  percipioActionPrimaryHover: '#141C36'
12
12
  percipioActionSecondary: '#6A6E75'
13
- percipioActionSecondaryHover: '#7F8288'
13
+ percipioActionSecondaryHover: 'rgba(106, 110, 117, 0.86)'
14
14
  percipioActionDangerHover: '#A52020'
15
15
  percipioDanger: '#B83C3C'
16
16
  percipioFeedbackSuccess: '#1B8057'
@@ -20,10 +20,10 @@ colors:
20
20
  percipioBgWarning: '#FFF7E0'
21
21
  percipioBgError: '#FFF1F5'
22
22
  navy-800: '#10162F'
23
- navy-400: '#8F919D'
24
- navy-300: '#BCBEC5'
25
- navy-200: '#E2E3E6'
26
- navy-100: '#F5F6F7'
23
+ navy-400: 'rgba(16, 22, 47, 0.47)'
24
+ navy-300: 'rgba(16, 22, 47, 0.28)'
25
+ navy-200: 'rgba(16, 22, 47, 0.12)'
26
+ navy-100: 'rgba(16, 22, 47, 0.04)'
27
27
  white: '#ffffff'
28
28
  # semantic aliases β€” use these in code, not palette swatches or hex values
29
29
  text: '{colors.percipioTextPrimary}'
@@ -38,7 +38,7 @@ colors:
38
38
  background-success: '{colors.percipioBgSuccess}'
39
39
  background-warning: '{colors.percipioBgWarning}'
40
40
  background-error: '{colors.percipioBgError}'
41
- primary: '{colors.percipioActionPrimary}'
41
+ primary: '{colors.sapphire}'
42
42
  primary-hover: '{colors.percipioActionPrimaryHover}'
43
43
  primary-inverse: '{colors.white}'
44
44
  secondary: '{colors.percipioActionSecondary}'
@@ -56,17 +56,17 @@ colors:
56
56
  shadow-secondary: '{colors.navy-400}'
57
57
  typography:
58
58
  base:
59
- fontFamily: '"Roboto", sans-serif'
59
+ fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
60
60
  fontSize: '1rem'
61
61
  fontWeight: '400'
62
62
  lineHeight: '1.5'
63
63
  accent:
64
- fontFamily: '"Roboto", sans-serif'
64
+ fontFamily: '"Skillsoft Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
65
65
  fontSize: '0.875rem'
66
66
  fontWeight: '400'
67
67
  lineHeight: '1.5'
68
68
  title:
69
- fontFamily: '"Roboto", sans-serif'
69
+ fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
70
70
  fontSize: '2.125rem'
71
71
  fontWeight: '500'
72
72
  lineHeight: '1.2'
@@ -118,21 +118,23 @@ This file defines the visual design tokens for the Skillsoft Percipio platform,
118
118
 
119
119
  **Storybook**: https://gamut.codecademy.com
120
120
 
121
+ > **Other Gamut themes:** This document covers **Percipio** only. For Codecademy (Core/Admin/Platform) or LX Studio, install that product's `DESIGN.md` instead: `gamut plugin install cursor --theme core` or `--theme lxstudio`.
122
+
121
123
  ---
122
124
 
123
125
  ## Visual Theme & Atmosphere
124
126
 
125
- Percipio communicates **professional clarity** β€” clean, trustworthy, and enterprise-ready. The design voice is more neutral and corporate than Codecademy: less playful, more functional. Primary blue drives interactive affordances; neutral grays define text and structure.
127
+ Percipio communicates **professional clarity** β€” clean, trustworthy, and enterprise-ready. The design voice is neutral and corporate: functional, with clear hierarchy. Brand blue drives interactive affordances; neutral grays define text and structure.
126
128
 
127
- **Density**: Medium. Consistent with Codecademy layouts but with softer shadows and a lighter overall feel due to the muted neutral palette.
129
+ **Density**: Medium. Information-dense layouts with softer shadows and a muted neutral palette.
128
130
 
129
131
  **Design philosophy**:
130
132
 
131
133
  - Light mode only β€” no dark mode support
132
- - Primary blue (`percipioActionPrimary`) replaces Codecademy's `hyper-500` for all interactive elements
133
- - Text is near-black dark gray rather than navy
134
- - Shadows are soft and minimal (navy at low opacity) rather than hard borders
135
- - Title font weight is 500 (medium) rather than 700 (bold) β€” Percipio headlines are less heavy
134
+ - Brand blue (`sapphire` / `primary`) for buttons, links, and focus rings
135
+ - Text uses dedicated Percipio palette tokens (`percipioTextPrimary`, etc.)
136
+ - Shadows are soft and minimal (`shadow-primary` β†’ `navy-200`)
137
+ - Title font weight is **500** via `fontWeight="title"` β€” use semantic weight, not literal `700`
136
138
 
137
139
  ---
138
140
 
@@ -140,9 +142,9 @@ Percipio communicates **professional clarity** β€” clean, trustworthy, and enter
140
142
 
141
143
  Percipio uses a single Gamut theme β€” light mode only.
142
144
 
143
- | Theme | Use case | Base font | Dark mode |
144
- | ------------ | --------------------------- | --------- | ---------- |
145
- | **Percipio** | Skillsoft Percipio platform | Roboto | light only |
145
+ | Theme | Use case | Base font | Dark mode |
146
+ | ------------ | --------------------------- | --------------------- | ---------- |
147
+ | **Percipio** | Skillsoft Percipio platform | Skillsoft Text / Sans | light only |
146
148
 
147
149
  The active theme is set at the app root via `<GamutProvider theme={percipioTheme}>`.
148
150
 
@@ -154,65 +156,65 @@ Use these token names when specifying colors. Percipio is light mode only β€” th
154
156
 
155
157
  ### Text
156
158
 
157
- | Token | Value | Use for |
158
- | ---------------- | --------- | ------------------------------------------------ |
159
- | `text` | `#222325` | Default body and UI text |
160
- | `text-accent` | `#222325` | Emphasis text (same value as `text` in Percipio) |
161
- | `text-secondary` | `#595A5C` | Supporting / secondary copy |
162
- | `text-disabled` | `#AFB6C2` | Disabled state labels |
159
+ | Token | Resolves to | Use for |
160
+ | ---------------- | ----------------------- | ------------------------------------------------ |
161
+ | `text` | `percipioTextPrimary` | Default body and UI text |
162
+ | `text-accent` | `percipioTextPrimary` | Emphasis text (same value as `text` in Percipio) |
163
+ | `text-secondary` | `percipioTextSecondary` | Supporting / secondary copy |
164
+ | `text-disabled` | `percipioTextDisabled` | Disabled state labels |
163
165
 
164
166
  ### Background
165
167
 
166
- | Token | Value | Use for |
167
- | --------------------- | -------------------- | --------------------------------- |
168
- | `background` | `#ffffff` | Default page/component background |
169
- | `background-primary` | `#FAFBFC` | Slightly elevated surfaces |
170
- | `background-selected` | `#F5F6F7` (navy-100) | Selected row / item |
171
- | `background-hover` | `#E2E3E6` (navy-200) | Hover state overlay |
172
- | `background-disabled` | `#E2E3E6` (navy-200) | Disabled surface |
173
- | `background-success` | `#EEF7F3` | Success state container |
174
- | `background-warning` | `#FFF7E0` | Warning state container |
175
- | `background-error` | `#FFF1F5` | Error state container |
168
+ | Token | Resolves to | Use for |
169
+ | --------------------- | ------------------- | --------------------------------- |
170
+ | `background` | `white` | Default page/component background |
171
+ | `background-primary` | `percipioBgPrimary` | Slightly elevated surfaces |
172
+ | `background-selected` | `navy-100` | Selected row / item |
173
+ | `background-hover` | `navy-200` | Hover state overlay |
174
+ | `background-disabled` | `navy-200` | Disabled surface |
175
+ | `background-success` | `percipioBgSuccess` | Success state container |
176
+ | `background-warning` | `percipioBgWarning` | Warning state container |
177
+ | `background-error` | `percipioBgError` | Error state container |
176
178
 
177
179
  ### Interactive
178
180
 
179
- | Token | Value | Use for |
180
- | ----------------- | --------- | ------------------------------------ |
181
- | `primary` | `#0073C4` | Primary CTA, links, focus rings |
182
- | `primary-hover` | `#141C36` | Hover state of primary interactive |
183
- | `primary-inverse` | `#ffffff` | Primary on a colored background |
184
- | `secondary` | `#6A6E75` | Secondary CTA, ghost buttons |
185
- | `secondary-hover` | `#7F8288` | Hover state of secondary interactive |
186
- | `danger` | `#B83C3C` | Destructive actions, error states |
187
- | `danger-hover` | `#A52020` | Hover on danger interactive |
181
+ | Token | Resolves to | Use for |
182
+ | ----------------- | ------------------------------ | ------------------------------------ |
183
+ | `primary` | `sapphire` | Primary CTA, links, focus rings |
184
+ | `primary-hover` | `percipioActionPrimaryHover` | Hover state of primary interactive |
185
+ | `primary-inverse` | `white` | Primary on a colored background |
186
+ | `secondary` | `percipioActionSecondary` | Secondary CTA, ghost buttons |
187
+ | `secondary-hover` | `percipioActionSecondaryHover` | Hover state of secondary interactive |
188
+ | `danger` | `percipioDanger` | Destructive actions, error states |
189
+ | `danger-hover` | `percipioActionDangerHover` | Hover on danger interactive |
188
190
 
189
191
  ### Border
190
192
 
191
193
  Percipio's border weights use a non-standard order: `primary` is mid-weight, `secondary` is very light, `tertiary` is the strongest (solid navy). Use them for their semantic intent, not their numeric rank.
192
194
 
193
- | Token | Value | Use for |
194
- | ------------------ | -------------------- | ----------------------------------- |
195
- | `border-primary` | `#8F919D` (navy-400) | Standard input and card borders |
196
- | `border-secondary` | `#E2E3E6` (navy-200) | Subtle dividers, section separators |
197
- | `border-tertiary` | `#10162F` (navy-800) | Strong structural borders |
198
- | `border-disabled` | `#BCBEC5` (navy-300) | Disabled input borders |
195
+ | Token | Resolves to | Use for |
196
+ | ------------------ | ----------- | ----------------------------------- |
197
+ | `border-primary` | `navy-400` | Standard input and card borders |
198
+ | `border-secondary` | `navy-200` | Subtle dividers, section separators |
199
+ | `border-tertiary` | `navy-800` | Strong structural borders |
200
+ | `border-disabled` | `navy-300` | Disabled input borders |
199
201
 
200
202
  ### Feedback
201
203
 
202
- | Token | Value | Use for |
203
- | ------------------ | --------- | -------------------------------- |
204
- | `feedback-error` | `#B83C3C` | Error messages, validation |
205
- | `feedback-success` | `#1B8057` | Success messages, confirmations |
206
- | `feedback-warning` | `#EF5B0D` | Warning messages, caution states |
204
+ | Token | Resolves to | Use for |
205
+ | ------------------ | ------------------------- | -------------------------------- |
206
+ | `feedback-error` | `percipioDanger` | Error messages, validation |
207
+ | `feedback-success` | `percipioFeedbackSuccess` | Success messages, confirmations |
208
+ | `feedback-warning` | `percipioFeedbackWarning` | Warning messages, caution states |
207
209
 
208
210
  ### Shadow
209
211
 
210
- | Token | Value |
211
- | ------------------ | -------------------- |
212
- | `shadow-primary` | `#E2E3E6` (navy-200) |
213
- | `shadow-secondary` | `#8F919D` (navy-400) |
212
+ | Token | Resolves to |
213
+ | ------------------ | ----------- |
214
+ | `shadow-primary` | `navy-200` |
215
+ | `shadow-secondary` | `navy-400` |
214
216
 
215
- Percipio shadows are softer than Codecademy's β€” use `shadow-primary` for standard elevated surfaces.
217
+ Use `shadow-primary` for standard elevated surfaces.
216
218
 
217
219
  ---
218
220
 
@@ -220,23 +222,23 @@ Percipio shadows are softer than Codecademy's β€” use `shadow-primary` for stand
220
222
 
221
223
  Percipio introduces its own named semantic colors. These are the source values behind the aliases above. Use the semantic aliases in designs, not the raw named colors.
222
224
 
223
- | Named color | Value | Mapped to |
224
- | ------------------------------ | --------- | -------------------------- |
225
- | `percipioTextPrimary` | `#222325` | `text`, `text-accent` |
226
- | `percipioTextSecondary` | `#595A5C` | `text-secondary` |
227
- | `percipioTextDisabled` | `#AFB6C2` | `text-disabled` |
228
- | `percipioActionPrimary` | `#0073C4` | `primary` |
229
- | `percipioActionPrimaryHover` | `#141C36` | `primary-hover` |
230
- | `percipioActionSecondary` | `#6A6E75` | `secondary` |
231
- | `percipioActionSecondaryHover` | `#7F8288` | `secondary-hover` |
232
- | `percipioActionDangerHover` | `#A52020` | `danger-hover` |
233
- | `percipioDanger` | `#B83C3C` | `danger`, `feedback-error` |
234
- | `percipioFeedbackSuccess` | `#1B8057` | `feedback-success` |
235
- | `percipioFeedbackWarning` | `#EF5B0D` | `feedback-warning` |
236
- | `percipioBgPrimary` | `#FAFBFC` | `background-primary` |
237
- | `percipioBgSuccess` | `#EEF7F3` | `background-success` |
238
- | `percipioBgWarning` | `#FFF7E0` | `background-warning` |
239
- | `percipioBgError` | `#FFF1F5` | `background-error` |
225
+ | Palette token | Semantic alias(es) |
226
+ | ------------------------------ | -------------------------- |
227
+ | `percipioTextPrimary` | `text`, `text-accent` |
228
+ | `percipioTextSecondary` | `text-secondary` |
229
+ | `percipioTextDisabled` | `text-disabled` |
230
+ | `sapphire` | `primary` |
231
+ | `percipioActionPrimaryHover` | `primary-hover` |
232
+ | `percipioActionSecondary` | `secondary` |
233
+ | `percipioActionSecondaryHover` | `secondary-hover` |
234
+ | `percipioActionDangerHover` | `danger-hover` |
235
+ | `percipioDanger` | `danger`, `feedback-error` |
236
+ | `percipioFeedbackSuccess` | `feedback-success` |
237
+ | `percipioFeedbackWarning` | `feedback-warning` |
238
+ | `percipioBgPrimary` | `background-primary` |
239
+ | `percipioBgSuccess` | `background-success` |
240
+ | `percipioBgWarning` | `background-warning` |
241
+ | `percipioBgError` | `background-error` |
240
242
 
241
243
  The full core swatch palette (navy, blue, green, yellow, red, etc.) is also available, but the semantic aliases above are how Percipio maps them. Raw swatches should only be used for fixed colors that must not adapt (illustrations, data viz, etc.).
242
244
 
@@ -246,34 +248,32 @@ The full core swatch palette (navy, blue, green, yellow, red, etc.) is also avai
246
248
 
247
249
  ### Typefaces
248
250
 
249
- All font families in Percipio use **Roboto**. There is no separate accent or display typeface.
251
+ Percipio uses **Skillsoft Text** for body and headlines and **Skillsoft Sans** for accent UI. Roboto Mono is used for code; the `system` slot still uses Roboto.
250
252
 
251
- | Token | Font | Use for |
252
- | ----------- | -------------------------- | ------------------------------------------- |
253
- | `base` | `"Roboto", sans-serif` | All default UI text, headlines, body copy |
254
- | `accent` | `"Roboto", sans-serif` | Labels, captions (same as base in Percipio) |
255
- | `monospace` | `"Roboto Mono", monospace` | Code editor contexts |
256
- | `system` | `"Roboto", sans-serif` | Performance-critical surfaces |
253
+ | Token | Font | Use for |
254
+ | ----------- | ------------------------------ | ----------------------------------------- |
255
+ | `base` | `"Skillsoft Text", sans-serif` | All default UI text, headlines, body copy |
256
+ | `accent` | `"Skillsoft Sans", sans-serif` | Labels, captions, accent UI |
257
+ | `monospace` | `"Roboto Mono", monospace` | Code editor contexts |
258
+ | `system` | `"Roboto", sans-serif` | Performance-critical surfaces |
257
259
 
258
260
  ### Rules
259
261
 
260
- - **Roboto Medium (500)** for headlines, sub-headlines, CTAs, and buttons β€” not Bold (700).
261
- - **Roboto 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.
262
264
  - Text is **left-aligned** by default. Center-align only for short marketing headlines. Never right-align.
263
265
  - Do not adjust letter-spacing.
264
266
 
265
267
  ### Font weight scale
266
268
 
267
- Percipio overrides the title weight from Core's 700 to 500 (medium). This gives Percipio a lighter, less heavy headline style.
268
-
269
- | Token | Value | Use |
270
- | ------- | ------- | ---------------------------------------------------------- |
271
- | `base` | 400 | Body text, UI labels |
272
- | `title` | **500** | Headlines, CTAs, buttons _(differs from Codecademy's 700)_ |
269
+ | Token | Value | Use |
270
+ | ------- | ------- | ------------------------ |
271
+ | `base` | 400 | Body text, UI labels |
272
+ | `title` | **500** | Headlines, CTAs, buttons |
273
273
 
274
274
  ### Font size scale
275
275
 
276
- Shared with Core β€” all sizes are identical.
276
+ Standard Gamut font size scale:
277
277
 
278
278
  | Token key | Size | Common use |
279
279
  | --------- | ---- | ---------------------------- |
@@ -289,7 +289,7 @@ Shared with Core β€” all sizes are identical.
289
289
 
290
290
  ### Line height scale
291
291
 
292
- Shared with Core.
292
+ Standard Gamut line height scale:
293
293
 
294
294
  | Token | Value | Use |
295
295
  | ------------- | ----- | ------------------------------- |
@@ -305,7 +305,7 @@ Target 45–85 characters per line; 66 characters is ideal. Max 50 for multi-col
305
305
 
306
306
  ## Spacing Scale
307
307
 
308
- Identical to Core. All spacing is multiples of 4px on an 8px grid.
308
+ All spacing is multiples of 4px on an 8px grid.
309
309
 
310
310
  | Token | Value |
311
311
  | ----- | ----- |
@@ -325,22 +325,20 @@ Identical to Core. All spacing is multiples of 4px on an 8px grid.
325
325
 
326
326
  ## Border Radius Scale
327
327
 
328
- Identical to Core.
329
-
330
- | Token | Value | Use |
331
- | ------ | ----- | ------------------------------------------ |
332
- | `none` | 0px | Square / non-interactive elements |
333
- | `sm` | 2px | Subtle rounding, tags |
334
- | `md` | 4px | Default buttons, inputs, interactive cards |
335
- | `lg` | 8px | Cards, panels |
336
- | `xl` | 16px | Large cards, modals |
337
- | `full` | 999px | Pills, avatars, circular elements |
328
+ | Token | Value | Use |
329
+ | ------ | ----- | ------------------------ |
330
+ | `none` | 0px | Non-interactive elements |
331
+ | `sm` | 2px | Overlays |
332
+ | `md` | 4px | Interactive elements |
333
+ | `lg` | 8px | Non-interactive elements |
334
+ | `xl` | 16px | Non-interactive elements |
335
+ | `full` | 999px | Toggles, badges |
338
336
 
339
337
  ---
340
338
 
341
339
  ## Responsive Behavior
342
340
 
343
- Identical to Core. Mobile-first, apply styles from the named breakpoint up.
341
+ Mobile-first; apply styles from the named breakpoint up.
344
342
 
345
343
  | Token | Min-width | Max content |
346
344
  | -------- | --------- | ----------- |
@@ -365,15 +363,13 @@ Minimum interactive touch target: **44Γ—44px** on mobile breakpoints.
365
363
 
366
364
  ## Component Library
367
365
 
368
- Same component library as Codecademy β€” all atoms, molecules, and organisms apply. Token values resolve differently per theme automatically.
366
+ Gamut atoms, molecules, and organisms all apply. Use semantic tokens below for Percipio-specific styling.
369
367
 
370
- Key Percipio-specific visual differences:
368
+ Key patterns:
371
369
 
372
- - `FillButton` uses `#0073C4` (blue) instead of hyper-purple
373
- - `FillButton` hover shifts to near-black `#141C36` rather than a lighter purple
374
- - `Checkbox` / `Toggle` use the same blue `#0073C4`
375
- - `Card` has softer shadows (navy-200 vs navy-800 in Codecademy light mode)
376
- - Card shadow patterns (`patternLeft`, `patternRight`) are available but rarely used in Percipio UIs
370
+ - `FillButton` β€” `bg: primary`, `hover: primary-hover`
371
+ - `Checkbox` / `Toggle` β€” `primary`, `hover: primary-hover`
372
+ - `Card` β€” `shadow-primary` (`navy-200`); `patternLeft` / `patternRight` are available but rarely used
377
373
 
378
374
  ---
379
375
 
@@ -382,15 +378,14 @@ Key Percipio-specific visual differences:
382
378
  ### Colors
383
379
 
384
380
  - **Do** use semantic color aliases (`primary`, `text`, `background`, etc.) β€” never hardcode hex values.
385
- - **Do** use `#0073C4` blue as the only primary interactive color.
386
- - **Don't** use Codecademy's hyper-purple or yellow in Percipio contexts.
381
+ - **Do** use `primary` (resolves to palette `sapphire`) as the brand interactive color.
387
382
  - **Don't** attempt dark mode β€” Percipio is light only.
388
383
 
389
384
  ### Typography
390
385
 
391
386
  - **Do** use title weight (500) for headlines, CTAs, and buttons β€” not 700.
392
387
  - **Do** keep body text at 150–175% line height for readability.
393
- - **Don't** use a separate accent typeface β€” Roboto is used uniformly for base and accent.
388
+ - **Don't** use fonts outside the Percipio theme stack (Skillsoft Text, Skillsoft Sans, Roboto Mono for code).
394
389
  - **Don't** right-align or center-align body paragraphs.
395
390
  - **Don't** adjust letter-spacing.
396
391
 
@@ -406,27 +401,27 @@ Key Percipio-specific visual differences:
406
401
 
407
402
  Quick color/token reference for generating or specifying Percipio UI:
408
403
 
409
- | Scenario | Tokens |
410
- | ---------------- | ------------------------------------------------------------------------------------------------------------ |
411
- | Primary button | `bg: primary (#0073C4)`, `color: white`, `hover: primary-hover (#141C36)` |
412
- | Body text | `color: text (#222325)`, `font: Roboto`, `size: 16px`, `weight: 400`, `lineHeight: base (1.5)` |
413
- | Headline | `color: text (#222325)`, `font: Roboto`, `size: 34–64px`, `weight: title (500)`, `lineHeight: title (1.2)` |
414
- | Secondary text | `color: text-secondary (#595A5C)` |
415
- | Disabled text | `color: text-disabled (#AFB6C2)` |
416
- | Elevated surface | `bg: background-primary (#FAFBFC)` |
417
- | Card default | `bg: background (#ffffff)`, `borderRadius: none` β€” add `isInteractive` for hover shadow + `borderRadius: md` |
418
- | Error state | `color: feedback-error (#B83C3C)`, `bg: background-error (#FFF1F5)`, `border: danger` |
419
- | Success state | `color: feedback-success (#1B8057)`, `bg: background-success (#EEF7F3)` |
420
- | Warning state | `color: feedback-warning (#EF5B0D)`, `bg: background-warning (#FFF7E0)` |
421
- | Disabled state | `color: text-disabled (#AFB6C2)`, `bg: background-disabled (#E2E3E6, navy-200)`, `border: border-disabled` |
404
+ | Scenario | Tokens |
405
+ | ---------------- | -------------------------------------------------------------------------------------------------- |
406
+ | Primary button | `bg: primary`, `color: primary-inverse`, `hover: primary-hover` |
407
+ | Body text | `color: text`, `font: base`, `size: 16`, `weight: 400`, `lineHeight: base` |
408
+ | Headline | `color: text`, `font: base`, `size: 34–64`, `weight: title`, `lineHeight: title` |
409
+ | Secondary text | `color: text-secondary` |
410
+ | Disabled text | `color: text-disabled` |
411
+ | Elevated surface | `bg: background-primary` |
412
+ | Card default | `bg: background`, `borderRadius: none` β€” add `isInteractive` for hover shadow + `borderRadius: md` |
413
+ | Error state | `color: feedback-error`, `bg: background-error`, `borderColor: danger` |
414
+ | Success state | `color: feedback-success`, `bg: background-success` |
415
+ | Warning state | `color: feedback-warning`, `bg: background-warning` |
416
+ | Disabled state | `color: text-disabled`, `bg: background-disabled`, `borderColor: border-disabled` |
422
417
 
423
418
  ### Component token cheatsheet
424
419
 
425
420
  ```
426
- FillButton β†’ bg: primary (#0073C4), color: white, hover: primary-hover (#141C36)
427
- StrokeButton β†’ bg: transparent, border: secondary (#6A6E75)
428
- Checkbox/Toggle β†’ primary (#0073C4), hover: primary-hover (#141C36)
429
- Card β†’ bg: background, shadow: shadow-primary (#E2E3E6, navy-200, soft)
421
+ FillButton β†’ bg: primary, color: primary-inverse, hover: primary-hover
422
+ StrokeButton β†’ bg: transparent, borderColor: secondary, hover: secondary-hover
423
+ Checkbox/Toggle β†’ bg: primary, hover: primary-hover
424
+ Card β†’ bg: background, shadow: shadow-primary (navy-200, soft)
430
425
  Alert (error) β†’ uses feedback-error + background-error
431
426
  Alert (success) β†’ uses feedback-success + background-success
432
427
  Alert (warning) β†’ uses feedback-warning + background-warning
@@ -1 +1,12 @@
1
- DEPRECATED. Use the appropriate DESIGN.*.md from https://github.com/Codecademy/gamut/pull/3329 instead.
1
+ Product-specific design context lives in this directory. **Use one `DESIGN.md` per app β€” matched to the Gamut theme that app uses.**
2
+
3
+ | Source file | Install with `--theme` |
4
+ | ---------------------- | --------------------------------------------------------- |
5
+ | `DESIGN.Codecademy.md` | `core`, `admin`, `platform` (aliases: `codecademy`, `cc`) |
6
+ | `DESIGN.Percipio.md` | `percipio` |
7
+ | `DESIGN.LXStudio.md` | `lxstudio` (alias: `lx-studio`) |
8
+
9
+ ```sh
10
+ gamut plugin install cursor --theme <name>
11
+ # refresh: gamut plugin update cursor --theme <name> --force
12
+ ```
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@codecademy/gamut",
3
3
  "description": "Styleguide & Component library for Codecademy",
4
- "version": "68.6.3-alpha.d1603c.0",
4
+ "version": "68.7.1-alpha.1ea5a8.0",
5
5
  "author": "Codecademy Engineering <dev@codecademy.com>",
6
6
  "bin": "./bin/gamut.mjs",
7
7
  "dependencies": {
8
- "@codecademy/gamut-icons": "9.57.6-alpha.d1603c.0",
9
- "@codecademy/gamut-illustrations": "0.58.12-alpha.d1603c.0",
10
- "@codecademy/gamut-patterns": "0.10.31-alpha.d1603c.0",
11
- "@codecademy/gamut-styles": "18.0.1-alpha.d1603c.0",
12
- "@codecademy/variance": "0.26.2-alpha.d1603c.0",
8
+ "@codecademy/gamut-icons": "9.57.6-alpha.1ea5a8.0",
9
+ "@codecademy/gamut-illustrations": "0.58.12-alpha.1ea5a8.0",
10
+ "@codecademy/gamut-patterns": "0.10.31-alpha.1ea5a8.0",
11
+ "@codecademy/gamut-styles": "18.0.1-alpha.1ea5a8.0",
12
+ "@codecademy/variance": "0.26.2-alpha.1ea5a8.0",
13
13
  "@formatjs/intl-locale": "5.3.1",
14
14
  "@react-aria/interactions": "3.25.0",
15
15
  "@types/marked": "^4.0.8",