@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.
- package/agent-tools/DESIGN.Codecademy.md +85 -84
- package/agent-tools/DESIGN.LXStudio.md +106 -104
- package/agent-tools/DESIGN.Percipio.md +104 -104
- package/agent-tools/DESIGN.md +1 -7
- package/bin/lib/claude.mjs +14 -5
- package/bin/lib/cursor.mjs +4 -1
- package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.d.ts +2 -2
- package/dist/AccordionButtonDeprecated/ButtonDeprecated/index.js +1 -1
- package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/index.module.scss +5 -5
- package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/mixins.scss +5 -5
- package/dist/AccordionButtonDeprecated/ButtonDeprecated/styles/variables.scss +23 -22
- package/dist/AccordionButtonDeprecated/styles.module.scss +6 -8
- package/dist/Alert/elements.d.ts +2 -2
- package/dist/Anchor/index.d.ts +19 -9
- package/dist/Anchor/index.js +9 -6
- package/dist/BarChart/BarRow/elements.d.ts +47 -45
- package/dist/BarChart/utils/hooks.d.ts +2 -2
- package/dist/BarChart/utils/hooks.js +3 -1
- package/dist/Box/GridBox.d.ts +1 -0
- package/dist/Box/GridBox.js +1 -1
- package/dist/Box/props.d.ts +1 -1
- package/dist/Breadcrumbs/index.d.ts +5 -5
- package/dist/Breadcrumbs/index.js +2 -2
- package/dist/Button/CTAButton.d.ts +2 -2
- package/dist/Button/FillButton.d.ts +4 -4
- package/dist/Button/IconButton.d.ts +4 -4
- package/dist/Button/StrokeButton.d.ts +4 -4
- package/dist/Button/TextButton.d.ts +4 -4
- package/dist/Button/shared/InlineIconButton.d.ts +2 -2
- package/dist/Button/shared/styles.d.ts +3 -3
- package/dist/Button/shared/types.d.ts +1 -1
- package/dist/ButtonBase/ButtonBase.d.ts +9 -4
- package/dist/ButtonBase/ButtonBase.js +11 -4
- package/dist/Card/elements.d.ts +109 -103
- package/dist/Card/styles.d.ts +8 -8
- package/dist/Coachmark/index.d.ts +1 -1
- package/dist/ConnectedForm/ConnectedForm.d.ts +1 -1
- package/dist/ConnectedForm/ConnectedFormGroup.js +4 -3
- package/dist/ConnectedForm/utils.d.ts +1 -1
- package/dist/ConnectedForm/utils.js +1 -1
- package/dist/DatePicker/DatePickerInput/index.d.ts +1 -1
- package/dist/Disclosure/elements.d.ts +18 -12
- package/dist/FeatureShimmer/index.js +1 -1
- package/dist/Form/SelectDropdown/SelectDropdown.js +1 -1
- package/dist/Form/SelectDropdown/elements/containers.js +1 -1
- package/dist/Form/SelectDropdown/elements/controls.js +2 -2
- package/dist/Form/SelectDropdown/elements/multi-value.js +2 -2
- package/dist/Form/SelectDropdown/types/internal.d.ts +2 -2
- package/dist/Form/SelectDropdown/utils.js +2 -1
- package/dist/Form/elements/Form.d.ts +15 -15
- package/dist/Form/elements/FormGroup.d.ts +1 -1
- package/dist/Form/styles/Checkbox-styles.d.ts +1 -1
- package/dist/GridForm/GridFormButtons/index.d.ts +4 -4
- package/dist/List/ListProvider.d.ts +1 -1
- package/dist/List/elements.d.ts +44 -42
- package/dist/Menu/MenuItem.js +10 -6
- package/dist/Menu/elements.d.ts +2 -2
- package/dist/Modals/Dialog.js +6 -2
- package/dist/Modals/Modal.js +5 -2
- package/dist/Modals/elements.d.ts +1 -1
- package/dist/Pagination/AnimatedPaginationButtons.d.ts +31 -29
- package/dist/Pagination/EllipsisButton.d.ts +2 -2
- package/dist/Pagination/PaginationButton.d.ts +6 -6
- package/dist/Pagination/utils.d.ts +31 -29
- package/dist/Pagination/utils.js +14 -11
- package/dist/Popover/Popover.js +6 -6
- package/dist/Popover/types.d.ts +4 -3
- package/dist/PopoverContainer/PopoverContainer.js +9 -9
- package/dist/PopoverContainer/hooks.d.ts +16 -4
- package/dist/PopoverContainer/hooks.js +50 -27
- package/dist/PopoverContainer/types.d.ts +2 -1
- package/dist/Tabs/TabButton.d.ts +2 -2
- package/dist/Tabs/TabNavLink.d.ts +2 -2
- package/dist/Tag/elements.d.ts +14 -8
- package/dist/Tag/index.js +1 -1
- package/dist/Tip/InfoTip/InfoTipButton.d.ts +4 -4
- package/dist/Tip/PreviewTip/elements.d.ts +12 -6
- package/dist/Tip/__tests__/helpers.d.ts +1 -1
- package/dist/Tip/shared/FloatingTip.js +2 -2
- package/dist/Tip/shared/types.d.ts +2 -2
- package/dist/Tip/shared/utils.js +1 -1
- package/dist/Video/styles/vds_base_theme.scss +1 -3
- package/dist/utils/nullish.d.ts +10 -0
- package/dist/utils/nullish.js +11 -0
- package/dist/utils/react.js +4 -2
- package/package.json +10 -10
- 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: '
|
|
8
|
+
percipioTextSecondary: '#595A5C'
|
|
9
9
|
percipioTextDisabled: '#AFB6C2'
|
|
10
|
-
|
|
10
|
+
percipioActionPrimary: '#0073C4'
|
|
11
11
|
percipioActionPrimaryHover: '#141C36'
|
|
12
12
|
percipioActionSecondary: '#6A6E75'
|
|
13
|
-
percipioActionSecondaryHover: '
|
|
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: '
|
|
24
|
-
navy-300: '
|
|
25
|
-
navy-200: '
|
|
26
|
-
navy-100: '
|
|
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.
|
|
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: '"
|
|
59
|
+
fontFamily: '"Roboto", sans-serif'
|
|
60
60
|
fontSize: '1rem'
|
|
61
61
|
fontWeight: '400'
|
|
62
62
|
lineHeight: '1.5'
|
|
63
63
|
accent:
|
|
64
|
-
fontFamily: '"
|
|
64
|
+
fontFamily: '"Roboto", sans-serif'
|
|
65
65
|
fontSize: '0.875rem'
|
|
66
66
|
fontWeight: '400'
|
|
67
67
|
lineHeight: '1.5'
|
|
68
68
|
title:
|
|
69
|
-
fontFamily: '"
|
|
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
|
-
-
|
|
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
|
|
144
|
-
| ------------ | --------------------------- |
|
|
145
|
-
| **Percipio** | Skillsoft Percipio platform |
|
|
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 |
|
|
158
|
-
| ---------------- |
|
|
159
|
-
| `text` | `
|
|
160
|
-
| `text-accent` | `
|
|
161
|
-
| `text-secondary` | `
|
|
162
|
-
| `text-disabled` | `
|
|
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 |
|
|
167
|
-
| --------------------- |
|
|
168
|
-
| `background` | `
|
|
169
|
-
| `background-primary` | `
|
|
170
|
-
| `background-selected` | `navy-100
|
|
171
|
-
| `background-hover` | `navy-200
|
|
172
|
-
| `background-disabled` | `navy-200
|
|
173
|
-
| `background-success` | `
|
|
174
|
-
| `background-warning` | `
|
|
175
|
-
| `background-error` | `
|
|
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 |
|
|
180
|
-
| ----------------- |
|
|
181
|
-
| `primary` | `
|
|
182
|
-
| `primary-hover` | `
|
|
183
|
-
| `primary-inverse` | `
|
|
184
|
-
| `secondary` | `
|
|
185
|
-
| `secondary-hover` | `
|
|
186
|
-
| `danger` | `
|
|
187
|
-
| `danger-hover` | `
|
|
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 |
|
|
194
|
-
| ------------------ |
|
|
195
|
-
| `border-primary` | `navy-400
|
|
196
|
-
| `border-secondary` | `navy-200
|
|
197
|
-
| `border-tertiary` | `navy-800
|
|
198
|
-
| `border-disabled` | `navy-300
|
|
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 |
|
|
203
|
-
| ------------------ |
|
|
204
|
-
| `feedback-error` | `
|
|
205
|
-
| `feedback-success` | `
|
|
206
|
-
| `feedback-warning` | `
|
|
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 |
|
|
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
|
-
|
|
|
224
|
-
| ------------------------------ | -------------------------- |
|
|
225
|
-
| `percipioTextPrimary` | `text`, `text-accent` |
|
|
226
|
-
| `percipioTextSecondary` | `text-secondary` |
|
|
227
|
-
| `percipioTextDisabled` | `text-disabled` |
|
|
228
|
-
| `
|
|
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
|
-
|
|
249
|
+
All font families in Percipio use **Roboto**. There is no separate accent or display typeface.
|
|
250
250
|
|
|
251
|
-
| Token | Font
|
|
252
|
-
| ----------- |
|
|
253
|
-
| `base` | `"
|
|
254
|
-
| `accent` | `"
|
|
255
|
-
| `monospace` | `"Roboto Mono", monospace`
|
|
256
|
-
| `system` | `"Roboto", sans-serif`
|
|
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
|
-
- **
|
|
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
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 `
|
|
373
|
-
- `FillButton` hover
|
|
374
|
-
- `Checkbox` / `Toggle` use
|
|
375
|
-
- `Card` has softer
|
|
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 `
|
|
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
|
|
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:
|
|
412
|
-
| Body text | `color: text`, `font:
|
|
413
|
-
| Headline | `color: text`, `font:
|
|
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`, `
|
|
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`, `
|
|
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,
|
|
427
|
-
StrokeButton → bg: transparent,
|
|
428
|
-
Checkbox/Toggle →
|
|
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
|
package/agent-tools/DESIGN.md
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
|
|
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.
|
package/bin/lib/claude.mjs
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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)
|
|
56
|
+
if (!name)
|
|
57
|
+
throw new Error(
|
|
58
|
+
`Could not parse marketplace name from plugin spec: ${spec}`
|
|
59
|
+
);
|
|
51
60
|
return name;
|
|
52
61
|
}
|
package/bin/lib/cursor.mjs
CHANGED
|
@@ -4,7 +4,10 @@ import { join } from 'node:path';
|
|
|
4
4
|
|
|
5
5
|
/** @returns {string} */
|
|
6
6
|
export function cursorPluginsRoot() {
|
|
7
|
-
return
|
|
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
|
|
11
|
-
export type ButtonDeprecatedThemes = keyof typeof buttonPresetThemes | (typeof
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
38
|
+
@include mixins.button-variants($name, variables.$color-black, $color);
|
|
39
39
|
} @else {
|
|
40
|
-
@include mixins.button-variants($name,
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
12
|
-
$btn-font-size-lg:
|
|
13
|
-
$btn-font-size-sm:
|
|
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:
|
|
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:
|
|
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:
|
|
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":
|
|
39
|
-
"red":
|
|
40
|
-
"navy":
|
|
41
|
-
"white":
|
|
42
|
-
"grey":
|
|
36
|
+
"hyper": #3a10e5,
|
|
37
|
+
"red": #e91c11,
|
|
38
|
+
"navy": #10162f,
|
|
39
|
+
"white": #ffffff,
|
|
40
|
+
"grey": #c4c3c7,
|
|
43
41
|
// Gamut Classic
|
|
44
|
-
"brand-blue":
|
|
45
|
-
"brand-red":
|
|
46
|
-
"brand-yellow":
|
|
47
|
-
"brand-purple":
|
|
48
|
-
"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":
|
|
51
|
-
"darkmint":
|
|
52
|
-
"greyblue":
|
|
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:
|
|
9
|
+
color: #a5befa;
|
|
12
10
|
}
|
|
13
11
|
|
|
14
12
|
&.yellow {
|
|
15
|
-
background-color:
|
|
16
|
-
border: solid
|
|
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:
|
|
20
|
+
border-color: #b37620;
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
&:focus,
|
|
26
24
|
&:hover {
|
|
27
|
-
background-color:
|
|
25
|
+
background-color: #ffec8c;
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
28
|
|
|
@@ -40,7 +38,7 @@
|
|
|
40
38
|
margin-left: 1rem;
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
@
|
|
41
|
+
@media only screen and (min-width: 64rem) {
|
|
44
42
|
font-size: 1.75rem;
|
|
45
43
|
}
|
|
46
44
|
}
|