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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/agent-tools/DESIGN.Codecademy.md +85 -84
  2. package/agent-tools/DESIGN.LXStudio.md +106 -104
  3. package/agent-tools/DESIGN.Percipio.md +104 -104
  4. package/agent-tools/DESIGN.md +1 -7
  5. package/bin/lib/claude.mjs +14 -5
  6. package/bin/lib/cursor.mjs +4 -1
  7. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.d.ts +2 -2
  8. package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.js +1 -1
  9. package/dist/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 +23 -22
  12. package/dist/AccordionButtonDeprecated/styles.module.scss +6 -8
  13. package/dist/Alert/elements.d.ts +2 -2
  14. package/dist/Anchor/index.d.ts +19 -9
  15. package/dist/Anchor/index.js +9 -6
  16. package/dist/BarChart/BarRow/elements.d.ts +47 -45
  17. package/dist/BarChart/utils/hooks.d.ts +2 -2
  18. package/dist/BarChart/utils/hooks.js +3 -1
  19. package/dist/Box/GridBox.d.ts +1 -0
  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 +9 -4
  33. package/dist/ButtonBase/ButtonBase.js +11 -4
  34. package/dist/Card/elements.d.ts +109 -103
  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 +4 -3
  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 +18 -12
  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 +2 -1
  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 +44 -42
  56. package/dist/Menu/MenuItem.js +10 -6
  57. package/dist/Menu/elements.d.ts +2 -2
  58. package/dist/Modals/Dialog.js +6 -2
  59. package/dist/Modals/Modal.js +5 -2
  60. package/dist/Modals/elements.d.ts +1 -1
  61. package/dist/Pagination/AnimatedPaginationButtons.d.ts +31 -29
  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 +31 -29
  65. package/dist/Pagination/utils.js +14 -11
  66. package/dist/Popover/Popover.js +6 -6
  67. package/dist/Popover/types.d.ts +4 -3
  68. package/dist/PopoverContainer/PopoverContainer.js +9 -9
  69. package/dist/PopoverContainer/hooks.d.ts +16 -4
  70. package/dist/PopoverContainer/hooks.js +50 -27
  71. package/dist/PopoverContainer/types.d.ts +2 -1
  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 +14 -8
  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 +12 -6
  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/Video/styles/vds_base_theme.scss +1 -3
  83. package/dist/utils/nullish.d.ts +10 -0
  84. package/dist/utils/nullish.js +11 -0
  85. package/dist/utils/react.js +4 -2
  86. package/package.json +10 -10
  87. package/dist/Typography/styles/_variables.scss +0 -54
@@ -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: 'rgba(34, 35, 37, 0.75)'
8
+ percipioTextSecondary: '#595A5C'
9
9
  percipioTextDisabled: '#AFB6C2'
10
- sapphire: '#1C50BB'
10
+ percipioActionPrimary: '#0073C4'
11
11
  percipioActionPrimaryHover: '#141C36'
12
12
  percipioActionSecondary: '#6A6E75'
13
- percipioActionSecondaryHover: 'rgba(106, 110, 117, 0.86)'
13
+ percipioActionSecondaryHover: '#7F8288'
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: '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)'
23
+ navy-400: '#8F919D'
24
+ navy-300: '#BCBEC5'
25
+ navy-200: '#E2E3E6'
26
+ navy-100: '#F5F6F7'
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.sapphire}'
41
+ primary: '{colors.percipioActionPrimary}'
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: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
59
+ fontFamily: '"Roboto", sans-serif'
60
60
  fontSize: '1rem'
61
61
  fontWeight: '400'
62
62
  lineHeight: '1.5'
63
63
  accent:
64
- fontFamily: '"Skillsoft Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
64
+ fontFamily: '"Roboto", sans-serif'
65
65
  fontSize: '0.875rem'
66
66
  fontWeight: '400'
67
67
  lineHeight: '1.5'
68
68
  title:
69
- fontFamily: '"Skillsoft Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif'
69
+ fontFamily: '"Roboto", sans-serif'
70
70
  fontSize: '2.125rem'
71
71
  fontWeight: '500'
72
72
  lineHeight: '1.2'
@@ -129,7 +129,7 @@ Percipio communicates **professional clarity** — clean, trustworthy, and enter
129
129
  **Design philosophy**:
130
130
 
131
131
  - Light mode only — no dark mode support
132
- - Brand blue (`sapphire` / `primary`) replaces Codecademy's `hyper-500` for buttons, links, and focus rings
132
+ - Primary blue (`percipioActionPrimary`) replaces Codecademy's `hyper-500` for all interactive elements
133
133
  - Text is near-black dark gray rather than navy
134
134
  - Shadows are soft and minimal (navy at low opacity) rather than hard borders
135
135
  - Title font weight is 500 (medium) rather than 700 (bold) — Percipio headlines are less heavy
@@ -140,9 +140,9 @@ Percipio communicates **professional clarity** — clean, trustworthy, and enter
140
140
 
141
141
  Percipio uses a single Gamut theme — light mode only.
142
142
 
143
- | Theme | Use case | Base font | Dark mode |
144
- | ------------ | --------------------------- | --------------------- | ---------- |
145
- | **Percipio** | Skillsoft Percipio platform | Skillsoft Text / Sans | light only |
143
+ | Theme | Use case | Base font | Dark mode |
144
+ | ------------ | --------------------------- | --------- | ---------- |
145
+ | **Percipio** | Skillsoft Percipio platform | Roboto | light only |
146
146
 
147
147
  The active theme is set at the app root via `<GamutProvider theme={percipioTheme}>`.
148
148
 
@@ -154,63 +154,63 @@ Use these token names when specifying colors. Percipio is light mode only — th
154
154
 
155
155
  ### Text
156
156
 
157
- | Token | Resolves to | Use for |
158
- | ---------------- | ----------------------- | ------------------------------------------------ |
159
- | `text` | `percipioTextPrimary` | Default body and UI text |
160
- | `text-accent` | `percipioTextPrimary` | Emphasis text (same value as `text` in Percipio) |
161
- | `text-secondary` | `percipioTextSecondary` | Supporting / secondary copy |
162
- | `text-disabled` | `percipioTextDisabled` | Disabled state labels |
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 |
163
163
 
164
164
  ### Background
165
165
 
166
- | Token | Resolves to | Use for |
167
- | --------------------- | ------------------- | --------------------------------- |
168
- | `background` | `white` | Default page/component background |
169
- | `background-primary` | `percipioBgPrimary` | Slightly elevated surfaces |
170
- | `background-selected` | `navy-100` | Selected row / item |
171
- | `background-hover` | `navy-200` | Hover state overlay |
172
- | `background-disabled` | `navy-200` | Disabled surface |
173
- | `background-success` | `percipioBgSuccess` | Success state container |
174
- | `background-warning` | `percipioBgWarning` | Warning state container |
175
- | `background-error` | `percipioBgError` | Error state container |
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 |
176
176
 
177
177
  ### Interactive
178
178
 
179
- | Token | Resolves to | Use for |
180
- | ----------------- | ------------------------------ | ------------------------------------ |
181
- | `primary` | `sapphire` | Primary CTA, links, focus rings |
182
- | `primary-hover` | `percipioActionPrimaryHover` | Hover state of primary interactive |
183
- | `primary-inverse` | `white` | Primary on a colored background |
184
- | `secondary` | `percipioActionSecondary` | Secondary CTA, ghost buttons |
185
- | `secondary-hover` | `percipioActionSecondaryHover` | Hover state of secondary interactive |
186
- | `danger` | `percipioDanger` | Destructive actions, error states |
187
- | `danger-hover` | `percipioActionDangerHover` | Hover on danger interactive |
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 |
188
188
 
189
189
  ### Border
190
190
 
191
191
  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
192
 
193
- | Token | Resolves to | Use for |
194
- | ------------------ | ----------- | ----------------------------------- |
195
- | `border-primary` | `navy-400` | Standard input and card borders |
196
- | `border-secondary` | `navy-200` | Subtle dividers, section separators |
197
- | `border-tertiary` | `navy-800` | Strong structural borders |
198
- | `border-disabled` | `navy-300` | Disabled input borders |
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 |
199
199
 
200
200
  ### Feedback
201
201
 
202
- | Token | Resolves to | Use for |
203
- | ------------------ | ------------------------- | -------------------------------- |
204
- | `feedback-error` | `percipioDanger` | Error messages, validation |
205
- | `feedback-success` | `percipioFeedbackSuccess` | Success messages, confirmations |
206
- | `feedback-warning` | `percipioFeedbackWarning` | Warning messages, caution states |
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 |
207
207
 
208
208
  ### Shadow
209
209
 
210
- | Token | Resolves to |
211
- | ------------------ | ----------- |
212
- | `shadow-primary` | `navy-200` |
213
- | `shadow-secondary` | `navy-400` |
210
+ | Token | Value |
211
+ | ------------------ | -------------------- |
212
+ | `shadow-primary` | `#E2E3E6` (navy-200) |
213
+ | `shadow-secondary` | `#8F919D` (navy-400) |
214
214
 
215
215
  Percipio shadows are softer than Codecademy's — use `shadow-primary` for standard elevated surfaces.
216
216
 
@@ -220,23 +220,23 @@ Percipio shadows are softer than Codecademy's — use `shadow-primary` for stand
220
220
 
221
221
  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
222
 
223
- | Palette token | Semantic alias(es) |
224
- | ------------------------------ | -------------------------- |
225
- | `percipioTextPrimary` | `text`, `text-accent` |
226
- | `percipioTextSecondary` | `text-secondary` |
227
- | `percipioTextDisabled` | `text-disabled` |
228
- | `sapphire` | `primary` |
229
- | `percipioActionPrimaryHover` | `primary-hover` |
230
- | `percipioActionSecondary` | `secondary` |
231
- | `percipioActionSecondaryHover` | `secondary-hover` |
232
- | `percipioActionDangerHover` | `danger-hover` |
233
- | `percipioDanger` | `danger`, `feedback-error` |
234
- | `percipioFeedbackSuccess` | `feedback-success` |
235
- | `percipioFeedbackWarning` | `feedback-warning` |
236
- | `percipioBgPrimary` | `background-primary` |
237
- | `percipioBgSuccess` | `background-success` |
238
- | `percipioBgWarning` | `background-warning` |
239
- | `percipioBgError` | `background-error` |
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` |
240
240
 
241
241
  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
242
 
@@ -246,19 +246,19 @@ The full core swatch palette (navy, blue, green, yellow, red, etc.) is also avai
246
246
 
247
247
  ### Typefaces
248
248
 
249
- 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.
249
+ All font families in Percipio use **Roboto**. There is no separate accent or display typeface.
250
250
 
251
- | Token | Font | Use for |
252
- | ----------- | ------------------------------ | ----------------------------------------- |
253
- | `base` | `"Skillsoft Text", sans-serif` | All default UI text, headlines, body copy |
254
- | `accent` | `"Skillsoft Sans", sans-serif` | Labels, captions, accent UI |
255
- | `monospace` | `"Roboto Mono", monospace` | Code editor contexts |
256
- | `system` | `"Roboto", sans-serif` | Performance-critical surfaces |
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 |
257
257
 
258
258
  ### Rules
259
259
 
260
- - **Skillsoft Text Medium (500)** for headlines, sub-headlines, CTAs, and buttons — use `fontWeight="title"`, not literal `700`.
261
- - **Skillsoft Text Regular (400)** for body text, UI labels, and menu items.
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
262
  - Text is **left-aligned** by default. Center-align only for short marketing headlines. Never right-align.
263
263
  - Do not adjust letter-spacing.
264
264
 
@@ -369,10 +369,10 @@ Same component library as Codecademy — all atoms, molecules, and organisms app
369
369
 
370
370
  Key Percipio-specific visual differences:
371
371
 
372
- - `FillButton` uses `primary` (`sapphire`) instead of Core `hyper-500`
373
- - `FillButton` hover uses `primary-hover` (`percipioActionPrimaryHover`) rather than a lighter blue
374
- - `Checkbox` / `Toggle` use `primary` (`sapphire`)
375
- - `Card` has softer `shadow-primary` (`navy-200` vs `navy-800` in Codecademy light mode)
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
376
  - Card shadow patterns (`patternLeft`, `patternRight`) are available but rarely used in Percipio UIs
377
377
 
378
378
  ---
@@ -382,7 +382,7 @@ Key Percipio-specific visual differences:
382
382
  ### Colors
383
383
 
384
384
  - **Do** use semantic color aliases (`primary`, `text`, `background`, etc.) — never hardcode hex values.
385
- - **Do** use `primary` (resolves to palette `sapphire`) as the brand interactive color.
385
+ - **Do** use `#0073C4` blue as the only primary interactive color.
386
386
  - **Don't** use Codecademy's hyper-purple or yellow in Percipio contexts.
387
387
  - **Don't** attempt dark mode — Percipio is light only.
388
388
 
@@ -390,7 +390,7 @@ Key Percipio-specific visual differences:
390
390
 
391
391
  - **Do** use title weight (500) for headlines, CTAs, and buttons — not 700.
392
392
  - **Do** keep body text at 150–175% line height for readability.
393
- - **Don't** use Apercu or SuissePercipio uses Skillsoft Text and Skillsoft Sans.
393
+ - **Don't** use a separate accent typeface Roboto is used uniformly for base and accent.
394
394
  - **Don't** right-align or center-align body paragraphs.
395
395
  - **Don't** adjust letter-spacing.
396
396
 
@@ -406,27 +406,27 @@ Key Percipio-specific visual differences:
406
406
 
407
407
  Quick color/token reference for generating or specifying Percipio UI:
408
408
 
409
- | Scenario | Tokens |
410
- | ---------------- | -------------------------------------------------------------------------------------------------- |
411
- | Primary button | `bg: primary`, `color: primary-inverse`, `hover: primary-hover` |
412
- | Body text | `color: text`, `font: base`, `size: 16`, `weight: 400`, `lineHeight: base` |
413
- | Headline | `color: text`, `font: base`, `size: 34–64`, `weight: title`, `lineHeight: title` |
414
- | Secondary text | `color: text-secondary` |
415
- | Disabled text | `color: text-disabled` |
416
- | Elevated surface | `bg: background-primary` |
417
- | Card default | `bg: background`, `borderRadius: none` — add `isInteractive` for hover shadow + `borderRadius: md` |
418
- | Error state | `color: feedback-error`, `bg: background-error`, `borderColor: danger` |
419
- | Success state | `color: feedback-success`, `bg: background-success` |
420
- | Warning state | `color: feedback-warning`, `bg: background-warning` |
421
- | Disabled state | `color: text-disabled`, `bg: background-disabled`, `borderColor: border-disabled` |
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` |
422
422
 
423
423
  ### Component token cheatsheet
424
424
 
425
425
  ```
426
- FillButton → bg: primary, color: primary-inverse, hover: primary-hover
427
- StrokeButton → bg: transparent, borderColor: secondary, hover: secondary-hover
428
- Checkbox/Toggle → bg: primary, hover: primary-hover
429
- Card → bg: background, shadow: shadow-primary (navy-200, soft)
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)
430
430
  Alert (error) → uses feedback-error + background-error
431
431
  Alert (success) → uses feedback-success + background-success
432
432
  Alert (warning) → uses feedback-warning + background-warning
@@ -1,7 +1 @@
1
- Product-specific design context lives in this directory:
2
-
3
- - `DESIGN.Codecademy.md` — Core, Admin, and Platform themes
4
- - `DESIGN.Percipio.md` — Percipio theme
5
- - `DESIGN.LXStudio.md` — LX Studio theme
6
-
7
- Install into your app repo with `gamut plugin install cursor --theme <core|percipio|lxstudio|admin|platform>` (or `claude`) to copy the matching file to the repo root as `DESIGN.md`.
1
+ DEPRECATED. Use the appropriate DESIGN.\*.md from https://github.com/Codecademy/gamut/pull/3329 instead.
@@ -15,7 +15,7 @@ export async function claudePluginSpec(sourceRoot) {
15
15
  } catch {
16
16
  throw new Error(
17
17
  `Missing ${mp}.\n` +
18
- `A .claude-plugin/marketplace.json is required for Claude Code installation.`,
18
+ `A .claude-plugin/marketplace.json is required for Claude Code installation.`
19
19
  );
20
20
  }
21
21
 
@@ -26,14 +26,20 @@ export async function claudePluginSpec(sourceRoot) {
26
26
  const { name: marketplaceName, plugins } = json;
27
27
 
28
28
  if (!marketplaceName || !Array.isArray(plugins) || plugins.length === 0) {
29
- throw new Error(`Invalid marketplace.json — needs "name" and "plugins[]": ${mp}`);
29
+ throw new Error(
30
+ `Invalid marketplace.json — needs "name" and "plugins[]": ${mp}`
31
+ );
30
32
  }
31
33
 
32
34
  const entry =
33
- plugins.find((p) => p.source === './' || p.source === '.' || p.source == null) ?? plugins[0];
35
+ plugins.find(
36
+ (p) => p.source === './' || p.source === '.' || p.source == null
37
+ ) ?? plugins[0];
34
38
 
35
39
  if (!entry?.name) {
36
- throw new Error(`No plugin name found in marketplace.json plugins[]: ${mp}`);
40
+ throw new Error(
41
+ `No plugin name found in marketplace.json plugins[]: ${mp}`
42
+ );
37
43
  }
38
44
 
39
45
  return `${entry.name}@${marketplaceName}`;
@@ -47,6 +53,9 @@ export async function claudePluginSpec(sourceRoot) {
47
53
  */
48
54
  export function marketplaceName(spec) {
49
55
  const name = spec.split('@')[1];
50
- if (!name) throw new Error(`Could not parse marketplace name from plugin spec: ${spec}`);
56
+ if (!name)
57
+ throw new Error(
58
+ `Could not parse marketplace name from plugin spec: ${spec}`
59
+ );
51
60
  return name;
52
61
  }
@@ -4,7 +4,10 @@ import { join } from 'node:path';
4
4
 
5
5
  /** @returns {string} */
6
6
  export function cursorPluginsRoot() {
7
- return process.env.CURSOR_PLUGINS_LOCAL ?? join(homedir(), '.cursor', 'plugins', 'local');
7
+ return (
8
+ process.env.CURSOR_PLUGINS_LOCAL ??
9
+ join(homedir(), '.cursor', 'plugins', 'local')
10
+ );
8
11
  }
9
12
 
10
13
  /**
@@ -7,8 +7,8 @@ export declare const buttonPresetThemes: {
7
7
  readonly lantern: "darkmint";
8
8
  readonly royalblue: "brand-purple";
9
9
  };
10
- declare const themes: readonly ["hyper", "navy", "red", "white", "brand-red", "brand-yellow", "brand-purple", "brand-dark-blue", "brand-blue", "mint", "darkmint", "grey", "greyblue"];
11
- export type ButtonDeprecatedThemes = keyof typeof buttonPresetThemes | (typeof themes)[number];
10
+ declare const _themes: readonly ["hyper", "navy", "red", "white", "brand-red", "brand-yellow", "brand-purple", "brand-dark-blue", "brand-blue", "mint", "darkmint", "grey", "greyblue"];
11
+ export type ButtonDeprecatedThemes = keyof typeof buttonPresetThemes | (typeof _themes)[number];
12
12
  export type ButtonDeprecatedProps = ButtonDeprecatedBaseProps & {
13
13
  /**
14
14
  * Whether button should behave like a block element or inline.
@@ -16,7 +16,7 @@ export const buttonPresetThemes = {
16
16
  lantern: 'darkmint',
17
17
  royalblue: 'brand-purple'
18
18
  };
19
- const themes = ['hyper', 'navy', 'red', 'white', 'brand-red', 'brand-yellow', 'brand-purple', 'brand-dark-blue', 'brand-blue', 'mint', 'darkmint', 'grey', 'greyblue'];
19
+ const _themes = ['hyper', 'navy', 'red', 'white', 'brand-red', 'brand-yellow', 'brand-purple', 'brand-dark-blue', 'brand-blue', 'mint', 'darkmint', 'grey', 'greyblue'];
20
20
  const propKeys = ['theme', 'size', 'outline', 'underline', 'link', 'caps', 'go', 'children', 'block', 'className', 'round', 'square', 'flat', 'fitText', 'onClick'];
21
21
  const isPreset = theme => {
22
22
  return hasIn(buttonPresetThemes, theme);
@@ -1,7 +1,6 @@
1
1
  @use "sass:color";
2
2
  @use "variables";
3
3
  @use "mixins";
4
- @use "~@codecademy/gamut-styles/utils" as *;
5
4
  //
6
5
  // Base styles
7
6
  //
@@ -11,7 +10,8 @@
11
10
  display: inline-flex;
12
11
  justify-content: center;
13
12
  font-weight: variables.$btn-font-weight;
14
- @include font-smoothing;
13
+ -webkit-font-smoothing: antialiased;
14
+ -moz-osx-font-smoothing: grayscale;
15
15
  border: 1px solid transparent;
16
16
  border-radius: variables.$btn-border-radius;
17
17
  user-select: none;
@@ -33,11 +33,11 @@ fieldset[disabled] a.btn {
33
33
 
34
34
  @each $name, $color in variables.$btn-swatches {
35
35
  @if $name == "brand-yellow" {
36
- @include mixins.button-variants($name, $color-black, $color);
36
+ @include mixins.button-variants($name, variables.$color-black, $color);
37
37
  } @else if color.channel(color.to-space($color, hsl), "lightness") > 68 {
38
- @include mixins.button-variants($name, $color-black, $color);
38
+ @include mixins.button-variants($name, variables.$color-black, $color);
39
39
  } @else {
40
- @include mixins.button-variants($name, $color-white, $color);
40
+ @include mixins.button-variants($name, variables.$color-white, $color);
41
41
  }
42
42
  }
43
43
 
@@ -1,5 +1,4 @@
1
1
  @use "sass:color";
2
- @use "~@codecademy/gamut-styles/utils" as *;
3
2
  @use "variables";
4
3
 
5
4
  // Button variants
@@ -8,7 +7,7 @@
8
7
  // and disabled options for all buttons
9
8
 
10
9
  @mixin button-variant($color, $background, $border: transparent) {
11
- $active-background: color.mix($color-black, $background);
10
+ $active-background: color.mix(variables.$color-black, $background);
12
11
 
13
12
  @if $border == transparent {
14
13
  $active-border: transparent;
@@ -24,7 +23,7 @@
24
23
  }
25
24
 
26
25
  &:focus-visible {
27
- box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $background;
26
+ box-shadow: 0 0 0 2px variables.$color-white, 0 0 0 4px $background;
28
27
  }
29
28
 
30
29
  &:focus-visible,
@@ -60,7 +59,7 @@
60
59
  }
61
60
 
62
61
  &:focus-visible {
63
- box-shadow: 0 0 0 2px $color-white, 0 0 0 4px $color;
62
+ box-shadow: 0 0 0 2px variables.$color-white, 0 0 0 4px $color;
64
63
  }
65
64
 
66
65
  &:disabled {
@@ -98,7 +97,8 @@
98
97
  }
99
98
  .link-#{$name} {
100
99
  font-weight: bold;
101
- @include font-smoothing;
100
+ -webkit-font-smoothing: antialiased;
101
+ -moz-osx-font-smoothing: grayscale;
102
102
  color: $background;
103
103
  text-decoration: underline;
104
104
 
@@ -1,6 +1,4 @@
1
- @use "~@codecademy/gamut-styles/utils" as *;
2
-
3
- $btn-padding-x: px-rem(16) !default;
1
+ $btn-padding-x: 1rem !default;
4
2
  $btn-padding-y: 0.375rem !default;
5
3
  $btn-font-weight: bold !default;
6
4
 
@@ -8,18 +6,18 @@ $btn-line-height: 1.5 !default;
8
6
  $btn-line-height-lg: calc(4 / 3) !default;
9
7
  $btn-line-height-sm: 1.5 !default;
10
8
 
11
- $btn-font-size-base: px-rem(16) !default;
12
- $btn-font-size-lg: px-rem(20) !default;
13
- $btn-font-size-sm: px-rem(16) !default;
9
+ $btn-font-size-base: 1rem !default;
10
+ $btn-font-size-lg: 1.25rem !default;
11
+ $btn-font-size-sm: 1rem !default;
14
12
  $btn-font-size-xs: 0.75rem !default;
15
13
 
16
14
  $btn-padding-x-sm: 0.75rem !default;
17
15
  $btn-padding-y-sm: 0.25rem !default;
18
- $btn-min-width-sm: px-rem(128) !default;
16
+ $btn-min-width-sm: 8rem !default;
19
17
 
20
18
  $btn-padding-x-lg: 1.25rem !default;
21
19
  $btn-padding-y-lg: 0.75rem !default;
22
- $btn-min-width-lg: px-rem(160) !default;
20
+ $btn-min-width-lg: 10rem !default;
23
21
 
24
22
  $btn-border-radius: 2px !default;
25
23
  $btn-round-border-radius: 50px !default;
@@ -30,24 +28,27 @@ $btn-outline-hover-state-modifier: 0.9 !default;
30
28
  $btn-outline-active-state-modifier: 0.6 !default;
31
29
  $btn-box-shadow-focus-modifier: 0.5 !default;
32
30
 
33
- $btn-disabled-color: $color-gray-600;
31
+ $btn-disabled-color: #646466;
34
32
  $btn-box-shadow-color: rgba(0, 0, 0, 0.3);
35
33
 
36
34
  $btn-swatches: (
37
35
  // Gamut Next
38
- "hyper": $color-hyper,
39
- "red": $color-red,
40
- "navy": $color-navy,
41
- "white": $color-white,
42
- "grey": $color-gray-300,
36
+ "hyper": #3a10e5,
37
+ "red": #e91c11,
38
+ "navy": #10162f,
39
+ "white": #ffffff,
40
+ "grey": #c4c3c7,
43
41
  // Gamut Classic
44
- "brand-blue": $color-blue-500,
45
- "brand-red": $brand-red,
46
- "brand-yellow": $brand-yellow,
47
- "brand-purple": $brand-purple,
48
- "brand-dark-blue": $brand-dark-blue,
42
+ "brand-blue": #3069f0,
43
+ "brand-red": #fd4d3f,
44
+ "brand-yellow": #ffd500,
45
+ "brand-purple": #6400e4,
46
+ "brand-dark-blue": #141c3a,
49
47
  // Editor
50
- "mint": $deprecated-swatches-mint-700,
51
- "darkmint": $deprecated-swatches-mint-800,
52
- "greyblue": $deprecated-swatches-grey-blue-600
48
+ "mint": #34b3a0,
49
+ "darkmint": #1a7b72,
50
+ "greyblue": #354551
53
51
  );
52
+
53
+ $color-black: #000000;
54
+ $color-white: #ffffff;
@@ -1,5 +1,3 @@
1
- @use "~@codecademy/gamut-styles/utils" as *;
2
-
3
1
  .accordionButton {
4
2
  align-items: center;
5
3
  display: flex;
@@ -8,23 +6,23 @@
8
6
  width: 100%;
9
7
 
10
8
  &.blue {
11
- color: $color-blue-200;
9
+ color: #a5befa;
12
10
  }
13
11
 
14
12
  &.yellow {
15
- background-color: $color-yellow-200;
16
- border: solid $color-yellow-400;
13
+ background-color: #fff2b3;
14
+ border: solid #ffe359;
17
15
  border-width: 1px 0;
18
16
  font-weight: normal;
19
17
  transition: background-color 0.15s ease-in-out;
20
18
 
21
19
  &:focus-visible {
22
- border-color: $color-yellow-800;
20
+ border-color: #b37620;
23
21
  }
24
22
 
25
23
  &:focus,
26
24
  &:hover {
27
- background-color: $color-yellow-300;
25
+ background-color: #ffec8c;
28
26
  }
29
27
  }
30
28
 
@@ -40,7 +38,7 @@
40
38
  margin-left: 1rem;
41
39
  }
42
40
 
43
- @include md-viewport {
41
+ @media only screen and (min-width: 64rem) {
44
42
  font-size: 1.75rem;
45
43
  }
46
44
  }