@neuravision/construct 2.0.2 → 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.
Files changed (115) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +148 -152
  3. package/behaviors/combobox.js +447 -0
  4. package/behaviors/drawer.js +18 -0
  5. package/behaviors/dropdown.js +296 -0
  6. package/behaviors/index.d.ts +333 -0
  7. package/behaviors/index.js +9 -0
  8. package/behaviors/internal/dialog-controller.js +351 -0
  9. package/behaviors/internal/dom.js +377 -0
  10. package/behaviors/internal/overlay.js +241 -0
  11. package/behaviors/internal/popup-layer.js +188 -0
  12. package/behaviors/modal.js +17 -0
  13. package/behaviors/popover.js +269 -0
  14. package/behaviors/select-menu.js +326 -0
  15. package/behaviors/tabs.js +230 -0
  16. package/behaviors/toggle-group.js +234 -0
  17. package/behaviors/tooltip.js +233 -0
  18. package/components/README.md +279 -83
  19. package/components/_shared.css +11 -10
  20. package/components/_shell-shared.css +20 -4
  21. package/components/app-shell-v2.css +21 -14
  22. package/components/app-shell.css +23 -14
  23. package/components/badge.css +15 -0
  24. package/components/button.css +103 -15
  25. package/components/card.css +53 -8
  26. package/components/checkbox.css +3 -2
  27. package/components/chip.css +1 -1
  28. package/components/datepicker.css +3 -1
  29. package/components/datum.css +204 -0
  30. package/components/index.css +5 -0
  31. package/components/meter.css +182 -0
  32. package/components/navbar.css +88 -3
  33. package/components/slider.css +2 -1
  34. package/components/status.css +107 -0
  35. package/components/switch.css +4 -3
  36. package/components/tooltip.css +4 -0
  37. package/docs/architecture.md +79 -0
  38. package/docs/behaviors.md +101 -0
  39. package/docs/fonts.md +70 -0
  40. package/docs/governance.md +85 -0
  41. package/docs/guidelines.md +42 -23
  42. package/examples/react/README.md +20 -0
  43. package/examples/react/SettingsModal.jsx +66 -0
  44. package/examples/react/construct.css +5 -0
  45. package/fonts.css +10 -0
  46. package/foundations.css +8 -1
  47. package/package.json +72 -21
  48. package/schemas/components.schema.json +107 -0
  49. package/schemas/examples/theme.example.json +27 -0
  50. package/schemas/primitives.schema.json +135 -0
  51. package/schemas/semantic.schema.json +223 -0
  52. package/schemas/theme.schema.json +63 -0
  53. package/scripts/build-tokens.mjs +1417 -0
  54. package/scripts/construct-theme.mjs +43 -0
  55. package/scripts/validate-tokens.mjs +25 -0
  56. package/standalone/accordion.css +3 -0
  57. package/standalone/alert.css +3 -0
  58. package/standalone/app-shell-v2.css +4 -0
  59. package/standalone/app-shell.css +4 -0
  60. package/standalone/avatar.css +3 -0
  61. package/standalone/badge.css +3 -0
  62. package/standalone/banner.css +3 -0
  63. package/standalone/breadcrumbs.css +3 -0
  64. package/standalone/button.css +3 -0
  65. package/standalone/card.css +3 -0
  66. package/standalone/chart.css +3 -0
  67. package/standalone/checkbox.css +3 -0
  68. package/standalone/chip.css +3 -0
  69. package/standalone/combobox.css +3 -0
  70. package/standalone/core.css +4 -0
  71. package/standalone/data-table.css +3 -0
  72. package/standalone/datepicker.css +3 -0
  73. package/standalone/datum.css +3 -0
  74. package/standalone/divider.css +3 -0
  75. package/standalone/drawer.css +3 -0
  76. package/standalone/dropdown.css +3 -0
  77. package/standalone/empty-state.css +3 -0
  78. package/standalone/field.css +3 -0
  79. package/standalone/file-upload.css +3 -0
  80. package/standalone/icon.css +3 -0
  81. package/standalone/input.css +3 -0
  82. package/standalone/list.css +3 -0
  83. package/standalone/meter.css +3 -0
  84. package/standalone/modal.css +3 -0
  85. package/standalone/navbar.css +3 -0
  86. package/standalone/pagination.css +3 -0
  87. package/standalone/popover.css +3 -0
  88. package/standalone/progress-bar.css +3 -0
  89. package/standalone/select-menu.css +3 -0
  90. package/standalone/select.css +3 -0
  91. package/standalone/sidebar.css +3 -0
  92. package/standalone/skeleton.css +3 -0
  93. package/standalone/skip-link.css +3 -0
  94. package/standalone/slider.css +3 -0
  95. package/standalone/spinner.css +3 -0
  96. package/standalone/status.css +3 -0
  97. package/standalone/switch.css +3 -0
  98. package/standalone/table.css +3 -0
  99. package/standalone/tabs.css +3 -0
  100. package/standalone/textarea.css +3 -0
  101. package/standalone/toast.css +3 -0
  102. package/standalone/toggle-group.css +3 -0
  103. package/standalone/toolbar.css +3 -0
  104. package/standalone/tooltip.css +3 -0
  105. package/standalone/tree.css +3 -0
  106. package/tokens/README.md +130 -126
  107. package/tokens/components.json +54 -0
  108. package/tokens/primitives.json +268 -0
  109. package/tokens/semantic.dark.json +93 -0
  110. package/tokens/semantic.high-contrast.json +93 -0
  111. package/tokens/semantic.light.json +178 -0
  112. package/tokens/tokens.css +532 -28
  113. package/tokens/tokens.js +335 -25
  114. package/tokens/tokens.json +764 -21
  115. package/tokens/tokens.ts +335 -25
package/tokens/README.md CHANGED
@@ -1,179 +1,183 @@
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
58
35
 
59
- ## Usage
36
+ ### Authored sources
60
37
 
61
- ### CSS
38
+ - `primitives.json`
39
+ - `semantic.light.json`
40
+ - `semantic.dark.json`
41
+ - `semantic.high-contrast.json`
42
+ - `components.json`
62
43
 
63
- Import the generated CSS file:
44
+ ### Generated outputs
64
45
 
65
- ```css
66
- @import "@neuravision/construct/tokens/tokens.css";
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
- body {
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
- .button {
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
- ### Themes
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
- Construct ships with light (default), dark, and high-contrast themes. The generated CSS includes theme overrides and system preference fallbacks.
57
+ ## CSS usage
84
58
 
85
- ```html
86
- <html data-theme="dark">
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
- ### TypeScript/JavaScript
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
- Import the generated token module:
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
- ```typescript
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
- // Use resolved values
108
- console.log(tokens.semantic.color.brand.primary); // "#174C5D"
96
+ ## Built-in themes
109
97
 
110
- // Or use CSS variable references
111
- console.log(cssVars.semantic.color.brand.primary); // "var(--color-brand-primary)"
98
+ Construct ships `light`, `dark`, and `high-contrast` scopes:
112
99
 
113
- // Access full theme maps
114
- console.log(tokens.semanticThemes.dark.color.background.canvas);
100
+ ```html
101
+ <html data-theme="dark">…</html>
115
102
  ```
116
103
 
117
- ## Building 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.
118
105
 
119
- The build script generates CSS, JSON, JavaScript, and TypeScript outputs from the source token files.
106
+ With no explicit `data-theme`, root-level `prefers-color-scheme: dark` and `prefers-contrast: more` preferences apply automatically.
120
107
 
121
- ### Run Build
108
+ ## Custom product themes
122
109
 
123
- From repository root:
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
- From `design/` directory:
129
- ```bash
130
- npm run build
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
- ### Check if Up-to-Date (CI)
134
-
135
- Verify outputs match sources without rebuilding:
142
+ Compile it from the consuming project:
136
143
 
137
144
  ```bash
138
- npm run check
145
+ npx construct-theme \
146
+ --theme ./acme.theme.json \
147
+ --out-dir ./src/generated/construct-theme
139
148
  ```
140
149
 
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
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
- ### CSS Variables
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
- Tokens are converted to kebab-case CSS variables:
158
+ Product CSS that intentionally overrides Construct tokens belongs after the generated sheet.
148
159
 
149
- - Primitives: `--color-ocean-700`, `--space-4`, `--radius-md`
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
- ### TypeScript
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
- Tokens are available as nested objects with camelCase properties:
164
+ ## Repository commands
155
165
 
156
- ```typescript
157
- tokens.primitives.color.ocean[700]
158
- tokens.semantic.color.brand.primary
159
- cssVars.semantic.color.brand.primary
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
- ## Brand Guidance
173
+ ## Font families
163
174
 
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
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
- 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
- ---
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
- **Construct** - Build accessible design constructs
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
+ }