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