@neuravision/construct 2.0.3 → 2.1.1
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 +272 -0
- package/README.md +148 -152
- package/behaviors/combobox.js +447 -0
- package/behaviors/drawer.js +18 -0
- package/behaviors/dropdown.js +296 -0
- package/behaviors/index.d.ts +333 -0
- package/behaviors/index.js +9 -0
- package/behaviors/internal/dialog-controller.js +351 -0
- package/behaviors/internal/dom.js +377 -0
- package/behaviors/internal/overlay.js +241 -0
- package/behaviors/internal/popup-layer.js +188 -0
- package/behaviors/modal.js +17 -0
- package/behaviors/popover.js +269 -0
- package/behaviors/select-menu.js +326 -0
- package/behaviors/tabs.js +230 -0
- package/behaviors/toggle-group.js +234 -0
- package/behaviors/tooltip.js +233 -0
- package/components/README.md +279 -83
- package/components/_shared.css +11 -10
- package/components/_shell-shared.css +20 -4
- package/components/app-shell-v2.css +21 -14
- package/components/app-shell.css +23 -14
- package/components/badge.css +15 -0
- package/components/button.css +103 -15
- package/components/card.css +53 -8
- package/components/checkbox.css +3 -2
- package/components/chip.css +1 -1
- package/components/datepicker.css +3 -1
- package/components/datum.css +204 -0
- package/components/index.css +5 -0
- package/components/meter.css +182 -0
- package/components/navbar.css +88 -3
- package/components/slider.css +2 -1
- package/components/status.css +107 -0
- package/components/switch.css +4 -3
- package/components/tooltip.css +4 -0
- package/docs/architecture.md +79 -0
- package/docs/behaviors.md +101 -0
- package/docs/fonts.md +70 -0
- package/docs/governance.md +85 -0
- package/docs/guidelines.md +42 -23
- 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 +8 -1
- package/package.json +72 -21
- package/schemas/components.schema.json +107 -0
- package/schemas/examples/theme.example.json +27 -0
- package/schemas/primitives.schema.json +135 -0
- package/schemas/semantic.schema.json +223 -0
- package/schemas/theme.schema.json +63 -0
- package/scripts/build-tokens.mjs +1417 -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/tokens/README.md +130 -126
- package/tokens/components.json +54 -0
- package/tokens/primitives.json +268 -0
- package/tokens/semantic.dark.json +93 -0
- package/tokens/semantic.high-contrast.json +93 -0
- package/tokens/semantic.light.json +178 -0
- package/tokens/tokens.css +532 -28
- package/tokens/tokens.js +335 -25
- package/tokens/tokens.json +764 -21
- package/tokens/tokens.ts +335 -25
package/tokens/README.md
CHANGED
|
@@ -1,179 +1,183 @@
|
|
|
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
|
-
- **Primitives** rarely change (your color palette)
|
|
56
|
-
- **Semantic** tokens can be remapped for themes without touching primitives
|
|
57
|
-
- Consistency is enforced automatically
|
|
34
|
+
## Files
|
|
58
35
|
|
|
59
|
-
|
|
36
|
+
### Authored sources
|
|
60
37
|
|
|
61
|
-
|
|
38
|
+
- `primitives.json`
|
|
39
|
+
- `semantic.light.json`
|
|
40
|
+
- `semantic.dark.json`
|
|
41
|
+
- `semantic.high-contrast.json`
|
|
42
|
+
- `components.json`
|
|
62
43
|
|
|
63
|
-
|
|
44
|
+
### Generated outputs
|
|
64
45
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
67
50
|
|
|
68
|
-
|
|
69
|
-
font-family: var(--font-family-body);
|
|
70
|
-
color: var(--color-text-primary);
|
|
71
|
-
background: var(--color-bg-canvas);
|
|
72
|
-
}
|
|
51
|
+
Never hand-edit generated outputs. Change source JSON and run `npm run build`.
|
|
73
52
|
|
|
74
|
-
|
|
75
|
-
background: var(--color-brand-primary);
|
|
76
|
-
padding: var(--space-4) var(--space-6);
|
|
77
|
-
border-radius: var(--radius-control);
|
|
78
|
-
}
|
|
79
|
-
```
|
|
53
|
+
### Schemas
|
|
80
54
|
|
|
81
|
-
|
|
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.
|
|
82
56
|
|
|
83
|
-
|
|
57
|
+
## CSS usage
|
|
84
58
|
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
...
|
|
88
|
-
</html>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Available values:
|
|
92
|
-
- `light` (default)
|
|
93
|
-
- `dark`
|
|
94
|
-
- `high-contrast`
|
|
95
|
-
|
|
96
|
-
If no `data-theme` is set, the system preferences are respected:
|
|
97
|
-
- `prefers-color-scheme: dark` → dark theme
|
|
98
|
-
- `prefers-contrast: more` → high-contrast theme
|
|
59
|
+
```css
|
|
60
|
+
@import '@neuravision/construct/tokens/tokens.css';
|
|
99
61
|
|
|
100
|
-
|
|
62
|
+
.product-panel {
|
|
63
|
+
color: var(--color-text-primary);
|
|
64
|
+
background: var(--color-bg-surface);
|
|
65
|
+
padding: var(--space-6);
|
|
66
|
+
border-radius: var(--radius-card);
|
|
67
|
+
}
|
|
68
|
+
```
|
|
101
69
|
|
|
102
|
-
|
|
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);
|
|
92
|
+
```
|
|
103
93
|
|
|
104
|
-
|
|
105
|
-
import { tokens, cssVars } from '@neuravision/construct/tokens/tokens';
|
|
94
|
+
`tokens` contains `metadata`, `primitives`, `semantic`, `components`, `semanticThemes`, `componentThemes`, and `cssVars`. Named exports provide the same maps for tree-shakeable tooling.
|
|
106
95
|
|
|
107
|
-
|
|
108
|
-
console.log(tokens.semantic.color.brand.primary); // "#174C5D"
|
|
96
|
+
## Built-in themes
|
|
109
97
|
|
|
110
|
-
|
|
111
|
-
console.log(cssVars.semantic.color.brand.primary); // "var(--color-brand-primary)"
|
|
98
|
+
Construct ships `light`, `dark`, and `high-contrast` scopes:
|
|
112
99
|
|
|
113
|
-
|
|
114
|
-
|
|
100
|
+
```html
|
|
101
|
+
<html data-theme="dark">…</html>
|
|
115
102
|
```
|
|
116
103
|
|
|
117
|
-
|
|
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.
|
|
118
105
|
|
|
119
|
-
|
|
106
|
+
With no explicit `data-theme`, root-level `prefers-color-scheme: dark` and `prefers-contrast: more` preferences apply automatically.
|
|
120
107
|
|
|
121
|
-
|
|
108
|
+
## Custom product themes
|
|
122
109
|
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
node design/scripts/build-tokens.mjs
|
|
126
|
-
```
|
|
110
|
+
A custom theme extends one built-in theme and overrides only known semantic and/or component paths.
|
|
127
111
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"$schema": "./node_modules/@neuravision/construct/schemas/theme.schema.json",
|
|
115
|
+
"name": "acme",
|
|
116
|
+
"extends": "light",
|
|
117
|
+
"semantic": {
|
|
118
|
+
"color": {
|
|
119
|
+
"brand": {
|
|
120
|
+
"primary": "{color.ocean.700}",
|
|
121
|
+
"primaryHover": "{color.ocean.800}",
|
|
122
|
+
"primaryActive": "{color.ocean.900}"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"components": {
|
|
127
|
+
"button": {
|
|
128
|
+
"radius": "{radius.pill}"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"contrast": [
|
|
132
|
+
{
|
|
133
|
+
"name": "button label",
|
|
134
|
+
"foreground": "components.button.color",
|
|
135
|
+
"background": "components.button.background",
|
|
136
|
+
"minRatio": 4.5
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
131
140
|
```
|
|
132
141
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
Verify outputs match sources without rebuilding:
|
|
142
|
+
Compile it from the consuming project:
|
|
136
143
|
|
|
137
144
|
```bash
|
|
138
|
-
|
|
145
|
+
npx construct-theme \
|
|
146
|
+
--theme ./acme.theme.json \
|
|
147
|
+
--out-dir ./src/generated/construct-theme
|
|
139
148
|
```
|
|
140
149
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
## Token Naming Conventions
|
|
150
|
+
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
151
|
|
|
145
|
-
|
|
152
|
+
```css
|
|
153
|
+
@import '@neuravision/construct/foundations.css';
|
|
154
|
+
@import '@neuravision/construct/components/button.css';
|
|
155
|
+
@import './generated/construct-theme/tokens.css';
|
|
156
|
+
```
|
|
146
157
|
|
|
147
|
-
|
|
158
|
+
Product CSS that intentionally overrides Construct tokens belongs after the generated sheet.
|
|
148
159
|
|
|
149
|
-
|
|
150
|
-
- Semantic: `--color-brand-primary`, `--color-text-primary`, `--color-bg-canvas`
|
|
160
|
+
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
161
|
|
|
152
|
-
|
|
162
|
+
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
163
|
|
|
154
|
-
|
|
164
|
+
## Repository commands
|
|
155
165
|
|
|
156
|
-
```
|
|
157
|
-
tokens
|
|
158
|
-
tokens
|
|
159
|
-
|
|
166
|
+
```bash
|
|
167
|
+
npm run build # generate tokens and standalone component entries
|
|
168
|
+
npm run tokens:validate # schema, references, theme shape, contrast
|
|
169
|
+
npm run tokens:test # positive and negative pipeline contracts
|
|
170
|
+
npm run check # all non-mutating package contracts
|
|
160
171
|
```
|
|
161
172
|
|
|
162
|
-
##
|
|
173
|
+
## Font families
|
|
163
174
|
|
|
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
|
|
175
|
+
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
176
|
|
|
169
177
|
## Versioning
|
|
170
178
|
|
|
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
|
-
---
|
|
179
|
+
- **Major:** remove/rename a token or change a public token's meaning.
|
|
180
|
+
- **Minor:** add a token, layer capability, or backward-compatible theme feature.
|
|
181
|
+
- **Patch:** fix generation or validation without changing the documented output contract.
|
|
178
182
|
|
|
179
|
-
|
|
183
|
+
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,54 @@
|
|
|
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
|
+
}
|
|
@@ -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
|
+
}
|