@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.
Files changed (138) hide show
  1. package/CHANGELOG.md +318 -0
  2. package/README.md +158 -149
  3. package/behaviors/combobox.js +486 -0
  4. package/behaviors/drawer.js +18 -0
  5. package/behaviors/dropdown.js +310 -0
  6. package/behaviors/index.d.ts +335 -0
  7. package/behaviors/index.js +9 -0
  8. package/behaviors/internal/dialog-controller.js +421 -0
  9. package/behaviors/internal/dom.js +408 -0
  10. package/behaviors/internal/overlay.js +241 -0
  11. package/behaviors/internal/popup-layer.js +190 -0
  12. package/behaviors/modal.js +17 -0
  13. package/behaviors/popover.js +278 -0
  14. package/behaviors/select-menu.js +344 -0
  15. package/behaviors/tabs.js +241 -0
  16. package/behaviors/toggle-group.js +266 -0
  17. package/behaviors/tooltip.js +257 -0
  18. package/components/README.md +319 -83
  19. package/components/_shared.css +22 -10
  20. package/components/_shell-shared.css +20 -4
  21. package/components/accordion.css +8 -0
  22. package/components/app-shell-v2.css +28 -14
  23. package/components/app-shell.css +30 -14
  24. package/components/badge.css +15 -0
  25. package/components/banner.css +32 -1
  26. package/components/button.css +103 -15
  27. package/components/card.css +67 -8
  28. package/components/chart.css +26 -0
  29. package/components/checkbox.css +35 -2
  30. package/components/chip.css +30 -2
  31. package/components/combobox.css +21 -0
  32. package/components/datepicker.css +58 -9
  33. package/components/datum.css +277 -0
  34. package/components/dropdown.css +23 -3
  35. package/components/field.css +6 -4
  36. package/components/file-upload.css +1 -1
  37. package/components/index.css +5 -0
  38. package/components/list.css +28 -2
  39. package/components/meter.css +182 -0
  40. package/components/navbar.css +102 -4
  41. package/components/pagination.css +18 -0
  42. package/components/progress-bar.css +22 -1
  43. package/components/select-menu.css +8 -0
  44. package/components/select.css +8 -0
  45. package/components/sidebar.css +15 -2
  46. package/components/skip-link.css +6 -2
  47. package/components/slider.css +7 -1
  48. package/components/status.css +107 -0
  49. package/components/switch.css +66 -5
  50. package/components/table.css +53 -4
  51. package/components/tabs.css +55 -3
  52. package/components/toast.css +10 -1
  53. package/components/toggle-group.css +16 -5
  54. package/components/toolbar.css +17 -1
  55. package/components/tooltip.css +4 -0
  56. package/components/tree.css +30 -0
  57. package/docs/architecture.md +79 -0
  58. package/docs/behaviors.md +122 -0
  59. package/docs/fonts.md +70 -0
  60. package/docs/governance.md +85 -0
  61. package/docs/guidelines.md +72 -25
  62. package/examples/react/README.md +20 -0
  63. package/examples/react/SettingsModal.jsx +66 -0
  64. package/examples/react/construct.css +5 -0
  65. package/fonts.css +10 -0
  66. package/foundations.css +14 -1
  67. package/package.json +76 -21
  68. package/schemas/components.schema.json +122 -0
  69. package/schemas/examples/theme.example.json +27 -0
  70. package/schemas/primitives.schema.json +135 -0
  71. package/schemas/semantic.schema.json +224 -0
  72. package/schemas/theme.schema.json +63 -0
  73. package/scripts/build-tokens.mjs +1499 -0
  74. package/scripts/construct-theme.mjs +43 -0
  75. package/scripts/validate-tokens.mjs +25 -0
  76. package/standalone/accordion.css +3 -0
  77. package/standalone/alert.css +3 -0
  78. package/standalone/app-shell-v2.css +4 -0
  79. package/standalone/app-shell.css +4 -0
  80. package/standalone/avatar.css +3 -0
  81. package/standalone/badge.css +3 -0
  82. package/standalone/banner.css +3 -0
  83. package/standalone/breadcrumbs.css +3 -0
  84. package/standalone/button.css +3 -0
  85. package/standalone/card.css +3 -0
  86. package/standalone/chart.css +3 -0
  87. package/standalone/checkbox.css +3 -0
  88. package/standalone/chip.css +3 -0
  89. package/standalone/combobox.css +3 -0
  90. package/standalone/core.css +4 -0
  91. package/standalone/data-table.css +3 -0
  92. package/standalone/datepicker.css +3 -0
  93. package/standalone/datum.css +3 -0
  94. package/standalone/divider.css +3 -0
  95. package/standalone/drawer.css +3 -0
  96. package/standalone/dropdown.css +3 -0
  97. package/standalone/empty-state.css +3 -0
  98. package/standalone/field.css +3 -0
  99. package/standalone/file-upload.css +3 -0
  100. package/standalone/icon.css +3 -0
  101. package/standalone/input.css +3 -0
  102. package/standalone/list.css +3 -0
  103. package/standalone/meter.css +3 -0
  104. package/standalone/modal.css +3 -0
  105. package/standalone/navbar.css +3 -0
  106. package/standalone/pagination.css +3 -0
  107. package/standalone/popover.css +3 -0
  108. package/standalone/progress-bar.css +3 -0
  109. package/standalone/select-menu.css +3 -0
  110. package/standalone/select.css +3 -0
  111. package/standalone/sidebar.css +3 -0
  112. package/standalone/skeleton.css +3 -0
  113. package/standalone/skip-link.css +3 -0
  114. package/standalone/slider.css +3 -0
  115. package/standalone/spinner.css +3 -0
  116. package/standalone/status.css +3 -0
  117. package/standalone/switch.css +3 -0
  118. package/standalone/table.css +3 -0
  119. package/standalone/tabs.css +3 -0
  120. package/standalone/textarea.css +3 -0
  121. package/standalone/toast.css +3 -0
  122. package/standalone/toggle-group.css +3 -0
  123. package/standalone/toolbar.css +3 -0
  124. package/standalone/tooltip.css +3 -0
  125. package/standalone/tree.css +3 -0
  126. package/themes/README.md +37 -0
  127. package/themes/walnut.theme.json +106 -0
  128. package/tokens/README.md +135 -123
  129. package/tokens/components.json +64 -0
  130. package/tokens/primitives.json +268 -0
  131. package/tokens/semantic.dark.json +94 -0
  132. package/tokens/semantic.high-contrast-dark.json +94 -0
  133. package/tokens/semantic.high-contrast.json +94 -0
  134. package/tokens/semantic.light.json +179 -0
  135. package/tokens/tokens.css +960 -58
  136. package/tokens/tokens.js +729 -120
  137. package/tokens/tokens.json +1158 -116
  138. package/tokens/tokens.ts +729 -120
package/tokens/README.md CHANGED
@@ -1,179 +1,191 @@
1
1
  # Construct Design Tokens
2
2
 
3
- Design tokens are the single source of truth for all design decisions in the Construct Design System. They provide consistent values for colors, typography, spacing, and more across all applications.
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
- ## Design Direction
5
+ ## Three-layer architecture
6
6
 
7
- - **Enterprise-grade**: Clean, professional, high-trust aesthetic
8
- - **Ocean primary**: Deep, authoritative blue for key actions
9
- - **Teal accent**: Modern, clear accent for highlights
10
- - **Slate neutrals**: Versatile grays for typography and surfaces
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
- ## Files
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
- ## Two-Tier Token System
15
+ ```jsonc
16
+ // Primitive
17
+ { "space": { "4": 8 } }
24
18
 
25
- ### Primitives
26
- Raw design values that form the foundation:
19
+ // Semantic
20
+ { "color": { "background": { "canvas": "{color.stone.50}" } } }
27
21
 
28
- ```json
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
- ### Semantic
42
- Contextual tokens that reference primitives:
26
+ The generated CSS names follow the same distinction:
43
27
 
44
- ```json
45
- {
46
- "color": {
47
- "brand": {
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
- This approach means:
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
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
- ## Usage
51
+ Never hand-edit generated outputs. Change source JSON and run `npm run build`.
60
52
 
61
- ### CSS
53
+ ### Schemas
62
54
 
63
- Import the generated CSS file:
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 "@neuravision/construct/tokens/tokens.css";
60
+ @import '@neuravision/construct/tokens/tokens.css';
67
61
 
68
- body {
69
- font-family: var(--font-family-body);
62
+ .product-panel {
70
63
  color: var(--color-text-primary);
71
- background: var(--color-bg-canvas);
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
- ### Themes
82
-
83
- Construct ships with light (default), dark, and high-contrast themes. The generated CSS includes theme overrides and system preference fallbacks.
84
-
85
- ```html
86
- <html data-theme="dark">
87
- ...
88
- </html>
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
- Available values:
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
- 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
96
+ ## Built-in themes
99
97
 
100
- ### TypeScript/JavaScript
98
+ Construct ships `light`, `dark`, `high-contrast`, and `high-contrast-dark` scopes:
101
99
 
102
- Import the generated token module:
100
+ ```html
101
+ <html data-theme="dark">…</html>
102
+ ```
103
103
 
104
- ```typescript
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
- // Use resolved values
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
- // Or use CSS variable references
111
- console.log(cssVars.semantic.color.brand.primary); // "var(--color-brand-primary)"
108
+ ### Type scale units
112
109
 
113
- // Access full theme maps
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
- ## Building Tokens
112
+ ### Accent roles
118
113
 
119
- The build script generates CSS, JSON, JavaScript, and TypeScript outputs from the source token files.
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
- ### Run Build
116
+ ## Custom product themes
122
117
 
123
- From repository root:
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
- From `design/` directory:
129
- ```bash
130
- npm run build
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
- ### Check if Up-to-Date (CI)
134
-
135
- Verify outputs match sources without rebuilding:
150
+ Compile it from the consuming project:
136
151
 
137
152
  ```bash
138
- npm run check
153
+ npx construct-theme \
154
+ --theme ./acme.theme.json \
155
+ --out-dir ./src/generated/construct-theme
139
156
  ```
140
157
 
141
- This command exits with a non-zero code if outputs are outdated, making it perfect for CI/CD pipelines.
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
- ### CSS Variables
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
- Tokens are converted to kebab-case CSS variables:
166
+ Product CSS that intentionally overrides Construct tokens belongs after the generated sheet.
148
167
 
149
- - Primitives: `--color-ocean-700`, `--space-4`, `--radius-md`
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
- ### TypeScript
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
- Tokens are available as nested objects with camelCase properties:
172
+ ## Repository commands
155
173
 
156
- ```typescript
157
- tokens.primitives.color.ocean[700]
158
- tokens.semantic.color.brand.primary
159
- cssVars.semantic.color.brand.primary
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
- ## Brand Guidance
181
+ ## Font families
163
182
 
164
- - **Primary**: Use for key actions, primary buttons, and main navigation
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
- Tokens follow Semantic Versioning:
172
-
173
- - **MAJOR**: Removing/renaming tokens or changing existing token values
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
- **Construct** - Build accessible design constructs
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
+ }