@neuravision/construct 2.0.3 → 2.1.2
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/CHANGELOG.md +318 -0
- package/README.md +158 -149
- package/behaviors/combobox.js +486 -0
- package/behaviors/drawer.js +18 -0
- package/behaviors/dropdown.js +310 -0
- package/behaviors/index.d.ts +335 -0
- package/behaviors/index.js +9 -0
- package/behaviors/internal/dialog-controller.js +421 -0
- package/behaviors/internal/dom.js +408 -0
- package/behaviors/internal/overlay.js +241 -0
- package/behaviors/internal/popup-layer.js +190 -0
- package/behaviors/modal.js +17 -0
- package/behaviors/popover.js +278 -0
- package/behaviors/select-menu.js +344 -0
- package/behaviors/tabs.js +241 -0
- package/behaviors/toggle-group.js +266 -0
- package/behaviors/tooltip.js +257 -0
- package/components/README.md +319 -83
- package/components/_shared.css +22 -10
- package/components/_shell-shared.css +20 -4
- package/components/accordion.css +8 -0
- package/components/app-shell-v2.css +28 -14
- package/components/app-shell.css +30 -14
- package/components/badge.css +15 -0
- package/components/banner.css +32 -1
- package/components/button.css +103 -15
- package/components/card.css +67 -8
- package/components/chart.css +26 -0
- package/components/checkbox.css +35 -2
- package/components/chip.css +30 -2
- package/components/combobox.css +21 -0
- package/components/datepicker.css +58 -9
- package/components/datum.css +277 -0
- package/components/dropdown.css +23 -3
- package/components/field.css +6 -4
- package/components/file-upload.css +1 -1
- package/components/index.css +5 -0
- package/components/list.css +28 -2
- package/components/meter.css +182 -0
- package/components/navbar.css +102 -4
- package/components/pagination.css +18 -0
- package/components/progress-bar.css +22 -1
- package/components/select-menu.css +8 -0
- package/components/select.css +8 -0
- package/components/sidebar.css +15 -2
- package/components/skip-link.css +6 -2
- package/components/slider.css +7 -1
- package/components/status.css +107 -0
- package/components/switch.css +66 -5
- package/components/table.css +53 -4
- package/components/tabs.css +55 -3
- package/components/toast.css +10 -1
- package/components/toggle-group.css +16 -5
- package/components/toolbar.css +17 -1
- package/components/tooltip.css +4 -0
- package/components/tree.css +30 -0
- package/docs/architecture.md +79 -0
- package/docs/behaviors.md +122 -0
- package/docs/fonts.md +70 -0
- package/docs/governance.md +85 -0
- package/docs/guidelines.md +72 -25
- package/examples/react/README.md +20 -0
- package/examples/react/SettingsModal.jsx +66 -0
- package/examples/react/construct.css +5 -0
- package/fonts.css +10 -0
- package/foundations.css +14 -1
- package/package.json +76 -21
- package/schemas/components.schema.json +122 -0
- package/schemas/examples/theme.example.json +27 -0
- package/schemas/primitives.schema.json +135 -0
- package/schemas/semantic.schema.json +224 -0
- package/schemas/theme.schema.json +63 -0
- package/scripts/build-tokens.mjs +1499 -0
- package/scripts/construct-theme.mjs +43 -0
- package/scripts/validate-tokens.mjs +25 -0
- package/standalone/accordion.css +3 -0
- package/standalone/alert.css +3 -0
- package/standalone/app-shell-v2.css +4 -0
- package/standalone/app-shell.css +4 -0
- package/standalone/avatar.css +3 -0
- package/standalone/badge.css +3 -0
- package/standalone/banner.css +3 -0
- package/standalone/breadcrumbs.css +3 -0
- package/standalone/button.css +3 -0
- package/standalone/card.css +3 -0
- package/standalone/chart.css +3 -0
- package/standalone/checkbox.css +3 -0
- package/standalone/chip.css +3 -0
- package/standalone/combobox.css +3 -0
- package/standalone/core.css +4 -0
- package/standalone/data-table.css +3 -0
- package/standalone/datepicker.css +3 -0
- package/standalone/datum.css +3 -0
- package/standalone/divider.css +3 -0
- package/standalone/drawer.css +3 -0
- package/standalone/dropdown.css +3 -0
- package/standalone/empty-state.css +3 -0
- package/standalone/field.css +3 -0
- package/standalone/file-upload.css +3 -0
- package/standalone/icon.css +3 -0
- package/standalone/input.css +3 -0
- package/standalone/list.css +3 -0
- package/standalone/meter.css +3 -0
- package/standalone/modal.css +3 -0
- package/standalone/navbar.css +3 -0
- package/standalone/pagination.css +3 -0
- package/standalone/popover.css +3 -0
- package/standalone/progress-bar.css +3 -0
- package/standalone/select-menu.css +3 -0
- package/standalone/select.css +3 -0
- package/standalone/sidebar.css +3 -0
- package/standalone/skeleton.css +3 -0
- package/standalone/skip-link.css +3 -0
- package/standalone/slider.css +3 -0
- package/standalone/spinner.css +3 -0
- package/standalone/status.css +3 -0
- package/standalone/switch.css +3 -0
- package/standalone/table.css +3 -0
- package/standalone/tabs.css +3 -0
- package/standalone/textarea.css +3 -0
- package/standalone/toast.css +3 -0
- package/standalone/toggle-group.css +3 -0
- package/standalone/toolbar.css +3 -0
- package/standalone/tooltip.css +3 -0
- package/standalone/tree.css +3 -0
- package/themes/README.md +37 -0
- package/themes/walnut.theme.json +106 -0
- package/tokens/README.md +135 -123
- package/tokens/components.json +64 -0
- package/tokens/primitives.json +268 -0
- package/tokens/semantic.dark.json +94 -0
- package/tokens/semantic.high-contrast-dark.json +94 -0
- package/tokens/semantic.high-contrast.json +94 -0
- package/tokens/semantic.light.json +179 -0
- package/tokens/tokens.css +960 -58
- package/tokens/tokens.js +729 -120
- package/tokens/tokens.json +1158 -116
- package/tokens/tokens.ts +729 -120
package/tokens/README.md
CHANGED
|
@@ -1,179 +1,191 @@
|
|
|
1
1
|
# Construct Design Tokens
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Construct tokens are the source of truth for reusable visual decisions. The pipeline validates and resolves three layers into CSS custom properties plus JSON, JavaScript, and TypeScript exports.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Three-layer architecture
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
| Layer | Source | Responsibility | Example |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Primitive | `primitives.json` | Raw, context-free scales | `space.4`, `color.orange.500` |
|
|
10
|
+
| Semantic | `semantic.*.json` | Theme-aware purpose | `color.background.canvas`, `color.focus.ring` |
|
|
11
|
+
| Component | `components.json` | Stable component decisions | `button.height`, `control.borderFocus` |
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- **`primitives.json`**: Raw values (color palettes, typography scale, spacing, radius, shadows, layout)
|
|
15
|
-
- **`semantic.light.json`**: Semantic mappings for light theme (brand, text, background, state colors)
|
|
16
|
-
- **`semantic.dark.json`**: Dark theme overrides (color + theme metadata)
|
|
17
|
-
- **`semantic.high-contrast.json`**: High-contrast theme overrides (color + theme metadata)
|
|
18
|
-
- **`tokens.css`**: Generated CSS Custom Properties (ready for import)
|
|
19
|
-
- **`tokens.json`**: Generated, resolved token values with units (for tooling)
|
|
20
|
-
- **`tokens.js`**: Generated JavaScript module for runtime imports
|
|
21
|
-
- **`tokens.ts`**: Generated TypeScript definitions and typed exports
|
|
13
|
+
References flow down the architecture: semantic tokens can reference primitives; component tokens can reference semantic tokens or primitives. A lower layer must never reference a higher layer.
|
|
22
14
|
|
|
23
|
-
|
|
15
|
+
```jsonc
|
|
16
|
+
// Primitive
|
|
17
|
+
{ "space": { "4": 8 } }
|
|
24
18
|
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
// Semantic
|
|
20
|
+
{ "color": { "background": { "canvas": "{color.stone.50}" } } }
|
|
27
21
|
|
|
28
|
-
|
|
29
|
-
{
|
|
30
|
-
"color": {
|
|
31
|
-
"ocean": {
|
|
32
|
-
"700": "#174C5D"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
"space": {
|
|
36
|
-
"4": 8
|
|
37
|
-
}
|
|
38
|
-
}
|
|
22
|
+
// Component
|
|
23
|
+
{ "button": { "height": "{size.controlHeight.md}" } }
|
|
39
24
|
```
|
|
40
25
|
|
|
41
|
-
|
|
42
|
-
Contextual tokens that reference primitives:
|
|
26
|
+
The generated CSS names follow the same distinction:
|
|
43
27
|
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"primary": "{color.ocean.700}"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
28
|
+
```css
|
|
29
|
+
--space-4: 8px;
|
|
30
|
+
--color-bg-canvas: var(--color-stone-50);
|
|
31
|
+
--component-button-height: var(--control-height-md);
|
|
52
32
|
```
|
|
53
33
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
34
|
+
## Files
|
|
35
|
+
|
|
36
|
+
### Authored sources
|
|
37
|
+
|
|
38
|
+
- `primitives.json`
|
|
39
|
+
- `semantic.light.json`
|
|
40
|
+
- `semantic.dark.json`
|
|
41
|
+
- `semantic.high-contrast.json`
|
|
42
|
+
- `components.json`
|
|
43
|
+
|
|
44
|
+
### Generated outputs
|
|
45
|
+
|
|
46
|
+
- `tokens.css` — primitive, semantic, component, built-in theme, and system-preference custom properties
|
|
47
|
+
- `tokens.json` — resolved values and metadata for tooling
|
|
48
|
+
- `tokens.js` — runtime ESM exports
|
|
49
|
+
- `tokens.ts` — typed, literal-preserving TypeScript exports
|
|
58
50
|
|
|
59
|
-
|
|
51
|
+
Never hand-edit generated outputs. Change source JSON and run `npm run build`.
|
|
60
52
|
|
|
61
|
-
###
|
|
53
|
+
### Schemas
|
|
62
54
|
|
|
63
|
-
|
|
55
|
+
The published `schemas/` directory contains JSON Schema contracts for primitives, semantics, components, and product themes. `schemas/examples/theme.example.json` is a neutral custom-theme input suitable for editor validation and CI examples.
|
|
56
|
+
|
|
57
|
+
## CSS usage
|
|
64
58
|
|
|
65
59
|
```css
|
|
66
|
-
@import
|
|
60
|
+
@import '@neuravision/construct/tokens/tokens.css';
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
font-family: var(--font-family-body);
|
|
62
|
+
.product-panel {
|
|
70
63
|
color: var(--color-text-primary);
|
|
71
|
-
background: var(--color-bg-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.button {
|
|
75
|
-
background: var(--color-brand-primary);
|
|
76
|
-
padding: var(--space-4) var(--space-6);
|
|
77
|
-
border-radius: var(--radius-control);
|
|
64
|
+
background: var(--color-bg-surface);
|
|
65
|
+
padding: var(--space-6);
|
|
66
|
+
border-radius: var(--radius-card);
|
|
78
67
|
}
|
|
79
68
|
```
|
|
80
69
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
70
|
+
Use semantic tokens in product CSS. Use component tokens when adapting the documented contract of that component. Primitive tokens are appropriate for scale-based values without product meaning, not as a shortcut around semantic intent.
|
|
71
|
+
|
|
72
|
+
## JavaScript and TypeScript
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import {
|
|
76
|
+
componentThemes,
|
|
77
|
+
components,
|
|
78
|
+
cssVars,
|
|
79
|
+
semantic,
|
|
80
|
+
semanticThemes,
|
|
81
|
+
tokenMetadata,
|
|
82
|
+
tokens,
|
|
83
|
+
} from '@neuravision/construct/tokens';
|
|
84
|
+
|
|
85
|
+
console.log(tokenMetadata.layers); // ['primitives', 'semantic', 'components']
|
|
86
|
+
console.log(semantic.color.brand.primary); // resolved light-theme value
|
|
87
|
+
console.log(components.button.height); // resolved component value
|
|
88
|
+
console.log(cssVars.components.button.height); // var(--component-button-height)
|
|
89
|
+
console.log(semanticThemes.dark.color.background.canvas);
|
|
90
|
+
console.log(componentThemes.highContrast.metric.background);
|
|
91
|
+
console.log(tokens.metadata.themes);
|
|
89
92
|
```
|
|
90
93
|
|
|
91
|
-
|
|
92
|
-
- `light` (default)
|
|
93
|
-
- `dark`
|
|
94
|
-
- `high-contrast`
|
|
94
|
+
`tokens` contains `metadata`, `primitives`, `semantic`, `components`, `semanticThemes`, `componentThemes`, and `cssVars`. Named exports provide the same maps for tree-shakeable tooling.
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
- `prefers-color-scheme: dark` → dark theme
|
|
98
|
-
- `prefers-contrast: more` → high-contrast theme
|
|
96
|
+
## Built-in themes
|
|
99
97
|
|
|
100
|
-
|
|
98
|
+
Construct ships `light`, `dark`, `high-contrast`, and `high-contrast-dark` scopes:
|
|
101
99
|
|
|
102
|
-
|
|
100
|
+
```html
|
|
101
|
+
<html data-theme="dark">…</html>
|
|
102
|
+
```
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
import { tokens, cssVars } from '@neuravision/construct/tokens/tokens';
|
|
104
|
+
Themes can also be nested on containers. Every explicit theme scope declares the complete semantic and component contract, so light inside dark, high-contrast inside light, and custom themes inside any parent do not leak inherited values.
|
|
106
105
|
|
|
107
|
-
|
|
108
|
-
console.log(tokens.semantic.color.brand.primary); // "#174C5D"
|
|
106
|
+
With no explicit `data-theme`, root-level `prefers-color-scheme: dark` and `prefers-contrast: more` preferences apply automatically — including the combination: dark-scheme users who request more contrast get `high-contrast-dark`, not a light UI. Note that pinning any `data-theme` on the root opts the page out of these automatic preference hookups; products that pin a theme should offer their own contrast/scheme switch (for example by pinning `high-contrast`/`high-contrast-dark` when the user asks for it).
|
|
109
107
|
|
|
110
|
-
|
|
111
|
-
console.log(cssVars.semantic.color.brand.primary); // "var(--color-brand-primary)"
|
|
108
|
+
### Type scale units
|
|
112
109
|
|
|
113
|
-
|
|
114
|
-
console.log(tokens.semanticThemes.dark.color.background.canvas);
|
|
115
|
-
```
|
|
110
|
+
Font-size and line-height tokens are emitted in `rem` (authored in px, divided by 16) so user browser font-size preferences scale the entire system. Control heights, spacing, and the 44px coarse-pointer targets intentionally stay in px.
|
|
116
111
|
|
|
117
|
-
|
|
112
|
+
### Accent roles
|
|
118
113
|
|
|
119
|
-
|
|
114
|
+
`--color-brand-accent` is the decorative datum orange for edges and rules on canvas/surface. `--color-brand-accent-strong` is the validated fill orange — gated at ≥3:1 against `bg.canvas`, `bg.surface`, and `bg.muted` in every theme — for progress fills, meters, and any indicator drawn against the muted track color. Orange is never a text color; text uses the neutral `--color-text-*` roles.
|
|
120
115
|
|
|
121
|
-
|
|
116
|
+
## Custom product themes
|
|
122
117
|
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
node design/scripts/build-tokens.mjs
|
|
126
|
-
```
|
|
118
|
+
A custom theme extends one built-in theme and overrides only known semantic and/or component paths.
|
|
127
119
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"$schema": "./node_modules/@neuravision/construct/schemas/theme.schema.json",
|
|
123
|
+
"name": "acme",
|
|
124
|
+
"extends": "light",
|
|
125
|
+
"semantic": {
|
|
126
|
+
"color": {
|
|
127
|
+
"brand": {
|
|
128
|
+
"primary": "{color.ocean.700}",
|
|
129
|
+
"primaryHover": "{color.ocean.800}",
|
|
130
|
+
"primaryActive": "{color.ocean.900}"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"components": {
|
|
135
|
+
"button": {
|
|
136
|
+
"radius": "{radius.pill}"
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"contrast": [
|
|
140
|
+
{
|
|
141
|
+
"name": "button label",
|
|
142
|
+
"foreground": "components.button.color",
|
|
143
|
+
"background": "components.button.background",
|
|
144
|
+
"minRatio": 4.5
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
}
|
|
131
148
|
```
|
|
132
149
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
Verify outputs match sources without rebuilding:
|
|
150
|
+
Compile it from the consuming project:
|
|
136
151
|
|
|
137
152
|
```bash
|
|
138
|
-
|
|
153
|
+
npx construct-theme \
|
|
154
|
+
--theme ./acme.theme.json \
|
|
155
|
+
--out-dir ./src/generated/construct-theme
|
|
139
156
|
```
|
|
140
157
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
## Token Naming Conventions
|
|
158
|
+
Import the generated token sheet after every Construct style entry. Foundations, the full component bundle, and standalone component entries each pull in the built-in tokens; loading the generated file last prevents those imports from overriding a custom root scope:
|
|
144
159
|
|
|
145
|
-
|
|
160
|
+
```css
|
|
161
|
+
@import '@neuravision/construct/foundations.css';
|
|
162
|
+
@import '@neuravision/construct/components/button.css';
|
|
163
|
+
@import './generated/construct-theme/tokens.css';
|
|
164
|
+
```
|
|
146
165
|
|
|
147
|
-
|
|
166
|
+
Product CSS that intentionally overrides Construct tokens belongs after the generated sheet.
|
|
148
167
|
|
|
149
|
-
|
|
150
|
-
- Semantic: `--color-brand-primary`, `--color-text-primary`, `--color-bg-canvas`
|
|
168
|
+
Repeat `--theme` to include multiple product themes. Without `--out-dir`, the public CLI writes to `./construct-theme`. Use `--validate-only` in fast checks, `--check` to compare an existing output directory, and `--report-contrast` for a ratio report.
|
|
151
169
|
|
|
152
|
-
|
|
170
|
+
The compiler rejects invalid schemas, unknown or missing paths, circular/missing references, duplicate names/selectors, unsafe or invalid scope selectors, structurally unsafe CSS literals, invalid typed color/length/weight/shadow values, and failing built-in or declared contrast pairs before it writes output. Custom selectors intentionally support one simple scope (`:root`, a class/id, or a `data-*` attribute selector) rather than arbitrary selector programs.
|
|
153
171
|
|
|
154
|
-
|
|
172
|
+
## Repository commands
|
|
155
173
|
|
|
156
|
-
```
|
|
157
|
-
tokens
|
|
158
|
-
tokens
|
|
159
|
-
|
|
174
|
+
```bash
|
|
175
|
+
npm run build # generate tokens and standalone component entries
|
|
176
|
+
npm run tokens:validate # schema, references, theme shape, contrast
|
|
177
|
+
npm run tokens:test # positive and negative pipeline contracts
|
|
178
|
+
npm run check # all non-mutating package contracts
|
|
160
179
|
```
|
|
161
180
|
|
|
162
|
-
##
|
|
181
|
+
## Font families
|
|
163
182
|
|
|
164
|
-
|
|
165
|
-
- **Accent**: Use sparingly for highlights, special emphasis, and interactive elements
|
|
166
|
-
- **Backgrounds**: Prefer `surface` and `muted` for large content areas
|
|
167
|
-
- **Text**: Use `primary` for body text, `secondary` for less important text, `muted` for hints
|
|
183
|
+
Token output includes resilient local/system fallback stacks. Foundations make no network request. See [Font loading and self-hosting](../docs/fonts.md) for the optional hosted preset and self-hosting pattern.
|
|
168
184
|
|
|
169
185
|
## Versioning
|
|
170
186
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
- **
|
|
174
|
-
- **MINOR**: Adding new tokens, scales, or semantic aliases
|
|
175
|
-
- **PATCH**: Documentation, build scripts, internal changes (no token value changes)
|
|
176
|
-
|
|
177
|
-
---
|
|
187
|
+
- **Major:** remove/rename a token or change a public token's meaning.
|
|
188
|
+
- **Minor:** add a token, layer capability, or backward-compatible theme feature.
|
|
189
|
+
- **Patch:** fix generation or validation without changing the documented output contract.
|
|
178
190
|
|
|
179
|
-
|
|
191
|
+
Value changes are evaluated by consumer impact. A contrast correction may require a minor release even when names remain stable because it changes rendered product color.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"button": {
|
|
3
|
+
"background": "{color.brand.primary}",
|
|
4
|
+
"backgroundHover": "{color.brand.primaryHover}",
|
|
5
|
+
"backgroundActive": "{color.brand.primaryActive}",
|
|
6
|
+
"border": "{color.brand.primary}",
|
|
7
|
+
"color": "{color.text.onPrimary}",
|
|
8
|
+
"height": "{size.controlHeight.md}",
|
|
9
|
+
"paddingX": "{space.6}",
|
|
10
|
+
"fontSize": "{font.size.sm}",
|
|
11
|
+
"lineHeight": "{font.lineHeight.sm}",
|
|
12
|
+
"fontWeight": "{font.weight.semibold}",
|
|
13
|
+
"radius": "{radius.control}",
|
|
14
|
+
"gap": "{space.3}",
|
|
15
|
+
"loadingSpinnerSize": "{size.icon.md}"
|
|
16
|
+
},
|
|
17
|
+
"control": {
|
|
18
|
+
"background": "{color.background.elevated}",
|
|
19
|
+
"backgroundHover": "{color.background.surface}",
|
|
20
|
+
"backgroundDisabled": "{color.background.muted}",
|
|
21
|
+
"border": "{color.border.default}",
|
|
22
|
+
"borderHover": "{color.border.strong}",
|
|
23
|
+
"borderFocus": "{color.focus.ring}",
|
|
24
|
+
"text": "{color.text.primary}",
|
|
25
|
+
"placeholder": "{color.text.muted}",
|
|
26
|
+
"radius": "{radius.control}"
|
|
27
|
+
},
|
|
28
|
+
"card": {
|
|
29
|
+
"background": "{color.background.elevated}",
|
|
30
|
+
"border": "{color.border.subtle}",
|
|
31
|
+
"radius": "{radius.card}",
|
|
32
|
+
"padding": "{space.6}",
|
|
33
|
+
"shadow": "{shadow.card}",
|
|
34
|
+
"shadowHover": "{shadow.dropdown}"
|
|
35
|
+
},
|
|
36
|
+
"status": {
|
|
37
|
+
"gap": "{space.2}",
|
|
38
|
+
"fontSize": "{font.size.sm}",
|
|
39
|
+
"iconSize": "{size.icon.sm}"
|
|
40
|
+
},
|
|
41
|
+
"metric": {
|
|
42
|
+
"background": "{color.background.elevated}",
|
|
43
|
+
"border": "{color.border.subtle}",
|
|
44
|
+
"radius": "{radius.card}",
|
|
45
|
+
"padding": "{space.6}",
|
|
46
|
+
"valueFontSize": "{font.size.2xl}",
|
|
47
|
+
"labelFontSize": "{font.size.sm}"
|
|
48
|
+
},
|
|
49
|
+
"meter": {
|
|
50
|
+
"height": "{space.3}",
|
|
51
|
+
"radius": "{radius.pill}",
|
|
52
|
+
"track": "{color.background.muted}"
|
|
53
|
+
},
|
|
54
|
+
"datum": {
|
|
55
|
+
"edgeWidth": "{border.width.thick}",
|
|
56
|
+
"tickWidth": "24px",
|
|
57
|
+
"tickHeight": "3px",
|
|
58
|
+
"originLength": "48px",
|
|
59
|
+
"markSize": "18px",
|
|
60
|
+
"scaleHeight": "9px",
|
|
61
|
+
"scaleMinorStep": "12px",
|
|
62
|
+
"scaleMajorStep": "60px"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
{
|
|
2
|
+
"color": {
|
|
3
|
+
"stone": {
|
|
4
|
+
"0": "#FFFFFF",
|
|
5
|
+
"50": "#FAFAF8",
|
|
6
|
+
"100": "#F1F0EB",
|
|
7
|
+
"200": "#E4E2DB",
|
|
8
|
+
"300": "#D3D0C7",
|
|
9
|
+
"400": "#B4AFA1",
|
|
10
|
+
"500": "#8E887A",
|
|
11
|
+
"600": "#66604E",
|
|
12
|
+
"700": "#4B473E",
|
|
13
|
+
"800": "#353128",
|
|
14
|
+
"900": "#211E18",
|
|
15
|
+
"950": "#16130F"
|
|
16
|
+
},
|
|
17
|
+
"orange": {
|
|
18
|
+
"50": "#FFF1EA",
|
|
19
|
+
"100": "#FFDFCE",
|
|
20
|
+
"200": "#FFBE9C",
|
|
21
|
+
"300": "#FF9462",
|
|
22
|
+
"400": "#FB6E2E",
|
|
23
|
+
"500": "#F4581C",
|
|
24
|
+
"600": "#DD4A0F",
|
|
25
|
+
"700": "#B23C0C",
|
|
26
|
+
"800": "#882D09",
|
|
27
|
+
"900": "#5C1E06"
|
|
28
|
+
},
|
|
29
|
+
"ocean": {
|
|
30
|
+
"50": "#EAF1FB",
|
|
31
|
+
"100": "#CFE0F4",
|
|
32
|
+
"200": "#A6C6EA",
|
|
33
|
+
"300": "#76A6DC",
|
|
34
|
+
"400": "#4584CC",
|
|
35
|
+
"500": "#2A68B5",
|
|
36
|
+
"600": "#1F5BA6",
|
|
37
|
+
"700": "#184780",
|
|
38
|
+
"800": "#123356",
|
|
39
|
+
"900": "#0C2238"
|
|
40
|
+
},
|
|
41
|
+
"teal": {
|
|
42
|
+
"50": "#E7F7F6",
|
|
43
|
+
"100": "#C5ECEA",
|
|
44
|
+
"200": "#93DAD6",
|
|
45
|
+
"300": "#63C7C1",
|
|
46
|
+
"400": "#35B2AA",
|
|
47
|
+
"500": "#1C9891",
|
|
48
|
+
"600": "#167B76",
|
|
49
|
+
"700": "#115F5C",
|
|
50
|
+
"800": "#0D4744",
|
|
51
|
+
"900": "#0A3533"
|
|
52
|
+
},
|
|
53
|
+
"amber": {
|
|
54
|
+
"50": "#FBF3D6",
|
|
55
|
+
"100": "#F6E3A6",
|
|
56
|
+
"200": "#EDC85F",
|
|
57
|
+
"300": "#DFAB1F",
|
|
58
|
+
"400": "#C8930A",
|
|
59
|
+
"500": "#A87A00",
|
|
60
|
+
"600": "#876200",
|
|
61
|
+
"700": "#694B00",
|
|
62
|
+
"800": "#4B3500",
|
|
63
|
+
"900": "#2F2100"
|
|
64
|
+
},
|
|
65
|
+
"red": {
|
|
66
|
+
"50": "#FCE9ED",
|
|
67
|
+
"100": "#F7C6CF",
|
|
68
|
+
"200": "#EF98A8",
|
|
69
|
+
"300": "#E4647C",
|
|
70
|
+
"400": "#D43B57",
|
|
71
|
+
"500": "#BE1F3D",
|
|
72
|
+
"600": "#9C1631",
|
|
73
|
+
"700": "#771025",
|
|
74
|
+
"800": "#530B19",
|
|
75
|
+
"900": "#330610"
|
|
76
|
+
},
|
|
77
|
+
"green": {
|
|
78
|
+
"50": "#E8F6EF",
|
|
79
|
+
"100": "#C7EAD9",
|
|
80
|
+
"200": "#9EDCC0",
|
|
81
|
+
"300": "#70CBA3",
|
|
82
|
+
"400": "#48B988",
|
|
83
|
+
"500": "#2EA070",
|
|
84
|
+
"600": "#237F59",
|
|
85
|
+
"700": "#1B6145",
|
|
86
|
+
"800": "#134533",
|
|
87
|
+
"900": "#0C2E22"
|
|
88
|
+
},
|
|
89
|
+
"purple": {
|
|
90
|
+
"50": "#F4EFFA",
|
|
91
|
+
"100": "#E5D7F4",
|
|
92
|
+
"200": "#C9B0E6",
|
|
93
|
+
"300": "#A988D6",
|
|
94
|
+
"400": "#8961C2",
|
|
95
|
+
"500": "#6F45A8",
|
|
96
|
+
"600": "#5A3789",
|
|
97
|
+
"700": "#432868",
|
|
98
|
+
"800": "#2D1A48",
|
|
99
|
+
"900": "#1A0F2C"
|
|
100
|
+
},
|
|
101
|
+
"pink": {
|
|
102
|
+
"50": "#FBEEF3",
|
|
103
|
+
"100": "#F5CDDC",
|
|
104
|
+
"200": "#EA9CB7",
|
|
105
|
+
"300": "#DD6F92",
|
|
106
|
+
"400": "#CD4671",
|
|
107
|
+
"500": "#B22F58",
|
|
108
|
+
"600": "#8E2244",
|
|
109
|
+
"700": "#6A1932",
|
|
110
|
+
"800": "#461020",
|
|
111
|
+
"900": "#29080F"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"font": {
|
|
115
|
+
"family": {
|
|
116
|
+
"brand": "Lato",
|
|
117
|
+
"text": "Lato",
|
|
118
|
+
"mono": "JetBrains Mono"
|
|
119
|
+
},
|
|
120
|
+
"weight": {
|
|
121
|
+
"regular": 400,
|
|
122
|
+
"medium": 500,
|
|
123
|
+
"semibold": 600,
|
|
124
|
+
"bold": 700,
|
|
125
|
+
"extrabold": 800
|
|
126
|
+
},
|
|
127
|
+
"size": {
|
|
128
|
+
"2xs": 10,
|
|
129
|
+
"xs": 12,
|
|
130
|
+
"sm": 14,
|
|
131
|
+
"md": 16,
|
|
132
|
+
"lg": 18,
|
|
133
|
+
"xl": 20,
|
|
134
|
+
"2xl": 24,
|
|
135
|
+
"3xl": 28,
|
|
136
|
+
"4xl": 32,
|
|
137
|
+
"5xl": 40,
|
|
138
|
+
"6xl": 48
|
|
139
|
+
},
|
|
140
|
+
"lineHeight": {
|
|
141
|
+
"2xs": 14,
|
|
142
|
+
"xs": 16,
|
|
143
|
+
"sm": 20,
|
|
144
|
+
"md": 24,
|
|
145
|
+
"lg": 28,
|
|
146
|
+
"xl": 32,
|
|
147
|
+
"2xl": 36,
|
|
148
|
+
"3xl": 40,
|
|
149
|
+
"4xl": 44,
|
|
150
|
+
"5xl": 52,
|
|
151
|
+
"6xl": 60
|
|
152
|
+
},
|
|
153
|
+
"letterSpacing": {
|
|
154
|
+
"tight": -0.3,
|
|
155
|
+
"normal": 0,
|
|
156
|
+
"wide": 0.3
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"space": {
|
|
160
|
+
"0": 0,
|
|
161
|
+
"1": 2,
|
|
162
|
+
"2": 4,
|
|
163
|
+
"3": 6,
|
|
164
|
+
"4": 8,
|
|
165
|
+
"5": 12,
|
|
166
|
+
"6": 16,
|
|
167
|
+
"7": 20,
|
|
168
|
+
"8": 24,
|
|
169
|
+
"9": 32,
|
|
170
|
+
"10": 40,
|
|
171
|
+
"11": 48,
|
|
172
|
+
"12": 64,
|
|
173
|
+
"13": 80
|
|
174
|
+
},
|
|
175
|
+
"radius": {
|
|
176
|
+
"xs": 2,
|
|
177
|
+
"sm": 4,
|
|
178
|
+
"md": 8,
|
|
179
|
+
"lg": 12,
|
|
180
|
+
"xl": 16,
|
|
181
|
+
"2xl": 24,
|
|
182
|
+
"round": 999
|
|
183
|
+
},
|
|
184
|
+
"border": {
|
|
185
|
+
"width": {
|
|
186
|
+
"thin": 1,
|
|
187
|
+
"medium": 2,
|
|
188
|
+
"thick": 3
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"opacity": {
|
|
192
|
+
"muted": 0.7,
|
|
193
|
+
"disabled": 0.5,
|
|
194
|
+
"overlay": 0.6
|
|
195
|
+
},
|
|
196
|
+
"size": {
|
|
197
|
+
"controlHeight": {
|
|
198
|
+
"xs": 28,
|
|
199
|
+
"sm": 32,
|
|
200
|
+
"md": 40,
|
|
201
|
+
"lg": 48,
|
|
202
|
+
"calendarDay": 36
|
|
203
|
+
},
|
|
204
|
+
"icon": {
|
|
205
|
+
"sm": 16,
|
|
206
|
+
"md": 20,
|
|
207
|
+
"lg": 24,
|
|
208
|
+
"xl": 32
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"layout": {
|
|
212
|
+
"container": {
|
|
213
|
+
"sm": 640,
|
|
214
|
+
"md": 960,
|
|
215
|
+
"lg": 1200,
|
|
216
|
+
"xl": 1440
|
|
217
|
+
},
|
|
218
|
+
"gutter": {
|
|
219
|
+
"sm": 16,
|
|
220
|
+
"md": 24,
|
|
221
|
+
"lg": 32
|
|
222
|
+
},
|
|
223
|
+
"gridGap": {
|
|
224
|
+
"sm": 16,
|
|
225
|
+
"md": 24,
|
|
226
|
+
"lg": 32
|
|
227
|
+
},
|
|
228
|
+
"navbar": {
|
|
229
|
+
"height": 56
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"shadow": {
|
|
233
|
+
"xs": "0 1px 2px rgba(28, 20, 10, 0.07)",
|
|
234
|
+
"sm": "0 2px 6px rgba(28, 20, 10, 0.09)",
|
|
235
|
+
"md": "0 8px 20px rgba(28, 20, 10, 0.11)",
|
|
236
|
+
"lg": "0 16px 36px rgba(28, 20, 10, 0.13)",
|
|
237
|
+
"xl": "0 24px 56px rgba(28, 20, 10, 0.17)"
|
|
238
|
+
},
|
|
239
|
+
"motion": {
|
|
240
|
+
"duration": {
|
|
241
|
+
"fast": 120,
|
|
242
|
+
"normal": 200,
|
|
243
|
+
"slow": 280,
|
|
244
|
+
"xslow": 400
|
|
245
|
+
},
|
|
246
|
+
"easing": {
|
|
247
|
+
"standard": "cubic-bezier(0.2, 0, 0, 1)",
|
|
248
|
+
"decelerate": "cubic-bezier(0, 0, 0, 1)",
|
|
249
|
+
"accelerate": "cubic-bezier(0.3, 0, 1, 1)"
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"zIndex": {
|
|
253
|
+
"base": 0,
|
|
254
|
+
"dropdown": 1000,
|
|
255
|
+
"sticky": 1100,
|
|
256
|
+
"overlay": 1200,
|
|
257
|
+
"modal": 1300,
|
|
258
|
+
"toast": 1400,
|
|
259
|
+
"tooltip": 1500
|
|
260
|
+
},
|
|
261
|
+
"breakpoint": {
|
|
262
|
+
"xs": 360,
|
|
263
|
+
"sm": 600,
|
|
264
|
+
"md": 900,
|
|
265
|
+
"lg": 1200,
|
|
266
|
+
"xl": 1536
|
|
267
|
+
}
|
|
268
|
+
}
|