@jaimevalasek/aioson 1.30.0 → 1.30.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 (93) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/docs/design-previews/cognitive-core-ui-auth.html +95 -0
  3. package/docs/design-previews/cognitive-core-ui-kanban.html +231 -0
  4. package/docs/design-previews/cognitive-core-ui-list-detail.html +174 -0
  5. package/docs/design-previews/cognitive-core-ui-preview.css +1315 -0
  6. package/docs/design-previews/cognitive-core-ui-settings.html +142 -0
  7. package/docs/design-previews/cognitive-core-ui-website.html +190 -1009
  8. package/docs/design-previews/cognitive-core-ui.html +281 -463
  9. package/docs/design-previews/index.html +83 -31
  10. package/package.json +1 -1
  11. package/src/constants.js +578 -514
  12. package/template/.aioson/docs/integrations/dashboard-app-form-publish-mapping.md +183 -0
  13. package/template/.aioson/docs/play/README.md +74 -0
  14. package/template/.aioson/docs/play/agent-usage-guide.md +112 -0
  15. package/template/.aioson/docs/play/app-compatibility-guide.md +117 -0
  16. package/template/.aioson/docs/play/auth-services-and-testing.md +235 -0
  17. package/template/.aioson/docs/play/llm-data-and-bindings.md +238 -0
  18. package/template/.aioson/docs/play/manifest-and-runtime.md +267 -0
  19. package/template/.aioson/docs/play/source-map.md +104 -0
  20. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  21. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  22. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  23. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  24. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  25. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  26. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  27. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  28. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  29. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  30. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  31. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  32. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  33. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  34. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  35. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  36. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  37. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  38. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  39. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  40. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  41. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  42. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  43. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  44. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  45. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  46. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  47. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  48. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  49. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  50. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  51. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  52. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  53. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  54. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  55. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  56. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  57. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  58. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  59. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  60. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  61. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  62. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  63. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  64. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  65. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  66. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  67. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  68. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  69. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  70. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  71. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  72. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  73. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  74. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  75. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  76. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  77. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  78. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  79. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  80. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  81. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  82. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  83. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  84. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  85. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  86. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  87. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  88. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  89. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  90. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  91. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  92. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  93. package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
@@ -1,374 +1,374 @@
1
- # Design Tokens — Warm Craft UI
2
-
3
- All components and patterns depend on these tokens. Load this file first before any other reference.
4
-
5
- ---
6
-
7
- ## Typography strategy
8
-
9
- Default to **system fonts** first. Add Google Fonts only when the agent decides the stack, product context, and delivery constraints justify them.
10
-
11
- **System font stack (default — works everywhere, no CDN needed):**
12
- ```css
13
- --font-display: Georgia, "Times New Roman", "Noto Serif", serif;
14
- --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;
15
- --font-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
16
- ```
17
-
18
- **Google Fonts (optional — use when building the full Warm Craft aesthetic explicitly):**
19
- ```css
20
- @import url('https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,wght@0,400;0,600;0,700;1,400;1,600&family=Inter:wght@400;500;600;700&display=swap');
21
-
22
- --font-display: 'Source Serif 4', Georgia, serif;
23
- --font-body: 'Inter', system-ui, sans-serif;
24
- --font-mono: ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace;
25
- ```
26
-
27
- ---
28
-
29
- ## Complete CSS Variables
30
-
31
- Include this full block in every project.
32
-
33
- ```css
34
- /* ═══════════════════════════════════════════
35
- SHARED TOKENS — in :root (see Token Scope Guardrails)
36
- ═══════════════════════════════════════════ */
37
- :root {
38
- /* Typography */
39
- --font-display: Georgia, "Times New Roman", "Noto Serif", serif;
40
- --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;
41
- --font-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
42
-
43
- /* Font Sizes */
44
- --text-xs: 0.75rem; /* 12px — small labels, metadata */
45
- --text-sm: 0.875rem; /* 14px */
46
- --text-base: 1rem; /* 16px — default body */
47
- --text-lg: 1.125rem; /* 18px */
48
- --text-xl: 1.25rem; /* 20px */
49
- --text-2xl: 1.5rem; /* 24px */
50
- --text-3xl: 2rem; /* 32px */
51
- --text-4xl: 2.5rem; /* 40px — stat numbers */
52
- --text-5xl: 3.5rem; /* 56px — hero headings */
53
-
54
- /* Font Weights */
55
- --weight-normal: 400;
56
- --weight-medium: 500;
57
- --weight-semibold: 600;
58
- --weight-bold: 700;
59
-
60
- /* Letter Spacing */
61
- --tracking-tight: -0.02em;
62
- --tracking-normal: 0;
63
- --tracking-wide: 0.02em;
64
- --tracking-wider: 0.05em;
65
-
66
- /* Line Height */
67
- --leading-none: 1;
68
- --leading-tight: 1.2;
69
- --leading-snug: 1.35;
70
- --leading-normal: 1.6;
71
- --leading-relaxed: 1.75;
72
-
73
- /* Spacing — 4px base rhythm */
74
- --space-0: 0;
75
- --space-1: 0.25rem; /* 4px */
76
- --space-2: 0.5rem; /* 8px */
77
- --space-3: 0.75rem; /* 12px */
78
- --space-4: 1rem; /* 16px */
79
- --space-5: 1.25rem; /* 20px */
80
- --space-6: 1.5rem; /* 24px */
81
- --space-8: 2rem; /* 32px */
82
- --space-10: 2.5rem; /* 40px */
83
- --space-12: 3rem; /* 48px */
84
- --space-16: 4rem; /* 64px */
85
- --space-20: 5rem; /* 80px */
86
- --space-24: 6rem; /* 96px */
87
- --space-32: 8rem; /* 128px — hero sections */
88
-
89
- /* Border Radius — generously rounded */
90
- --radius-sm: 0.375rem; /* 6px — badges, small chips */
91
- --radius-md: 0.5rem; /* 8px — inputs, small buttons */
92
- --radius-lg: 0.75rem; /* 12px — buttons, medium cards */
93
- --radius-xl: 1rem; /* 16px — cards, panels */
94
- --radius-2xl: 1.5rem; /* 24px — large cards, modals */
95
- --radius-3xl: 2rem; /* 32px — hero sections, feature cards */
96
- --radius-full: 9999px; /* pills, avatars */
97
-
98
- /* Interactive element heights */
99
- --control-sm: 2rem; /* 32px — compact buttons */
100
- --control-md: 2.5rem; /* 40px — default buttons and inputs */
101
- --control-lg: 3rem; /* 48px — large buttons, prominent inputs */
102
- --control-xl: 3.5rem; /* 56px — hero CTAs */
103
-
104
- /* Transitions */
105
- --transition-fast: 120ms ease;
106
- --transition-base: 200ms ease;
107
- --transition-slow: 320ms ease;
108
- --transition-theme: background 200ms ease, color 200ms ease, border-color 200ms ease, box-shadow 200ms ease;
109
-
110
- /* Focus */
111
- --focus-ring-width: 2px;
112
- --focus-ring-offset: 2px;
113
-
114
- /* Z-index */
115
- --z-base: 0;
116
- --z-elevated: 10;
117
- --z-dropdown: 20;
118
- --z-sticky: 30;
119
- --z-modal: 50;
120
- --z-toast: 60;
121
-
122
- /* Content widths */
123
- --content-sm: 640px; /* narrow reading column */
124
- --content-md: 768px; /* medium content */
125
- --content-lg: 1024px; /* standard content */
126
- --content-xl: 1280px; /* wide content */
127
- --content-full: 1440px; /* max container */
128
- }
129
-
130
- /* ═══════════════════════════════════════════
131
- LIGHT THEME (default)
132
- ═══════════════════════════════════════════ */
133
- [data-theme="light"] {
134
- /* Backgrounds — layered warm whites */
135
- --bg-void: #F8F6F3;
136
- --bg-base: #FDFCFA;
137
- --bg-surface: #FFFFFF;
138
- --bg-elevated: #F3F1ED;
139
- --bg-overlay: #EAE7E2;
140
-
141
- /* Borders */
142
- --border-subtle: rgba(45, 52, 54, 0.06);
143
- --border-medium: rgba(45, 52, 54, 0.12);
144
- --border-strong: rgba(45, 52, 54, 0.20);
145
- --border-accent: rgba(224, 122, 95, 0.24);
146
- --border-accent-strong: rgba(224, 122, 95, 0.48);
147
-
148
- /* Text */
149
- --text-heading: #2D3436;
150
- --text-primary: #4A5568;
151
- --text-secondary: #8896A6;
152
- --text-muted: #B0BCC7;
153
- --text-accent: #C4563A;
154
- --text-inverse: #FDFCFA;
155
-
156
- /* Accent — terracotta/warm coral */
157
- --accent: #E07A5F;
158
- --accent-strong: #C4563A;
159
- --accent-dim: rgba(224, 122, 95, 0.12);
160
- --accent-glow: rgba(224, 122, 95, 0.08);
161
- --accent-subtle: rgba(224, 122, 95, 0.05);
162
- --accent-hover: #D4694E;
163
- --accent-contrast: #FFFFFF;
164
-
165
- /* Secondary accent — sage green (for success, secondary actions) */
166
- --accent-secondary: #7C9A82;
167
- --accent-secondary-dim: rgba(124, 154, 130, 0.12);
168
-
169
- /* Tertiary — warm amber (for warnings, highlights) */
170
- --accent-tertiary: #D4A76A;
171
- --accent-tertiary-dim: rgba(212, 167, 106, 0.12);
172
-
173
- /* Semantic */
174
- --semantic-green: #5A9E6F;
175
- --semantic-green-dim: rgba(90, 158, 111, 0.12);
176
- --semantic-amber: #D4A76A;
177
- --semantic-amber-dim: rgba(212, 167, 106, 0.12);
178
- --semantic-red: #D35D6E;
179
- --semantic-red-dim: rgba(211, 93, 110, 0.12);
180
- --semantic-blue: #5B8DB8;
181
- --semantic-blue-dim: rgba(91, 141, 184, 0.12);
182
- --semantic-purple: #9B8EC4;
183
- --semantic-purple-dim: rgba(155, 142, 196, 0.12);
184
-
185
- /* Shadows — warm-tinted, soft */
186
- --shadow-xs: 0 1px 2px rgba(45, 40, 35, 0.04);
187
- --shadow-sm: 0 1px 3px rgba(45, 40, 35, 0.06), 0 1px 2px rgba(45, 40, 35, 0.04);
188
- --shadow-md: 0 4px 12px rgba(45, 40, 35, 0.08), 0 2px 4px rgba(45, 40, 35, 0.04);
189
- --shadow-lg: 0 12px 32px rgba(45, 40, 35, 0.10), 0 4px 8px rgba(45, 40, 35, 0.04);
190
- --shadow-xl: 0 20px 48px rgba(45, 40, 35, 0.12), 0 8px 16px rgba(45, 40, 35, 0.04);
191
- --shadow-glow: 0 0 0 1px rgba(224, 122, 95, 0.06), 0 8px 24px rgba(45, 40, 35, 0.08);
192
-
193
- /* Scrollbar */
194
- --scrollbar-track: #F3F1ED;
195
- --scrollbar-thumb: #D4CFC8;
196
-
197
- /* Focus ring */
198
- --focus-ring-color: rgba(224, 122, 95, 0.40);
199
- }
200
-
201
- /* ═══════════════════════════════════════════
202
- DARK THEME
203
- ═══════════════════════════════════════════ */
204
- [data-theme="dark"] {
205
- /* Backgrounds — layered warm darks */
206
- --bg-void: #1A1814;
207
- --bg-base: #211F1B;
208
- --bg-surface: #2A2824;
209
- --bg-elevated: #353330;
210
- --bg-overlay: #403E3A;
211
-
212
- /* Borders */
213
- --border-subtle: rgba(245, 240, 235, 0.06);
214
- --border-medium: rgba(245, 240, 235, 0.10);
215
- --border-strong: rgba(245, 240, 235, 0.16);
216
- --border-accent: rgba(240, 150, 125, 0.22);
217
- --border-accent-strong: rgba(240, 150, 125, 0.44);
218
-
219
- /* Text */
220
- --text-heading: #F5F0EB;
221
- --text-primary: #D4CBC2;
222
- --text-secondary: #9A9088;
223
- --text-muted: #6B6460;
224
- --text-accent: #F0967D;
225
- --text-inverse: #1A1814;
226
-
227
- /* Accent — lighter terracotta for dark backgrounds */
228
- --accent: #F0967D;
229
- --accent-strong: #E07A5F;
230
- --accent-dim: rgba(240, 150, 125, 0.14);
231
- --accent-glow: rgba(240, 150, 125, 0.10);
232
- --accent-subtle: rgba(240, 150, 125, 0.06);
233
- --accent-hover: #F4A68E;
234
- --accent-contrast: #1A1814;
235
-
236
- /* Secondary accent — sage green */
237
- --accent-secondary: #8DB896;
238
- --accent-secondary-dim: rgba(141, 184, 150, 0.14);
239
-
240
- /* Tertiary — warm amber */
241
- --accent-tertiary: #E0BD82;
242
- --accent-tertiary-dim: rgba(224, 189, 130, 0.14);
243
-
244
- /* Semantic */
245
- --semantic-green: #6BB87A;
246
- --semantic-green-dim: rgba(107, 184, 122, 0.14);
247
- --semantic-amber: #E0BD82;
248
- --semantic-amber-dim: rgba(224, 189, 130, 0.14);
249
- --semantic-red: #E07080;
250
- --semantic-red-dim: rgba(224, 112, 128, 0.14);
251
- --semantic-blue: #7CAED4;
252
- --semantic-blue-dim: rgba(124, 174, 212, 0.14);
253
- --semantic-purple: #B0A2D8;
254
- --semantic-purple-dim: rgba(176, 162, 216, 0.14);
255
-
256
- /* Shadows */
257
- --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.16);
258
- --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.20), 0 1px 2px rgba(0, 0, 0, 0.12);
259
- --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.24), 0 2px 4px rgba(0, 0, 0, 0.12);
260
- --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.32), 0 4px 8px rgba(0, 0, 0, 0.16);
261
- --shadow-xl: 0 20px 48px rgba(0, 0, 0, 0.40), 0 8px 16px rgba(0, 0, 0, 0.20);
262
- --shadow-glow: 0 0 0 1px rgba(240, 150, 125, 0.06), 0 8px 24px rgba(0, 0, 0, 0.28);
263
-
264
- /* Scrollbar */
265
- --scrollbar-track: #211F1B;
266
- --scrollbar-thumb: #403E3A;
267
-
268
- /* Focus ring */
269
- --focus-ring-color: rgba(240, 150, 125, 0.40);
270
- }
271
-
272
- /* ═══════════════════════════════════════════
273
- BASE STYLES
274
- ═══════════════════════════════════════════ */
275
- body {
276
- font-family: var(--font-body);
277
- font-size: var(--text-base);
278
- line-height: var(--leading-normal);
279
- margin: 0;
280
- -webkit-font-smoothing: antialiased;
281
- }
282
-
283
- [data-theme] {
284
- color: var(--text-primary);
285
- background: var(--bg-base);
286
- transition: var(--transition-theme);
287
- }
288
-
289
- *, *::before, *::after { box-sizing: border-box; }
290
-
291
- /* Custom scrollbar */
292
- ::-webkit-scrollbar { width: 6px; height: 6px; }
293
- ::-webkit-scrollbar-track { background: var(--scrollbar-track); border-radius: var(--radius-full); }
294
- ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: var(--radius-full); }
295
- ::-webkit-scrollbar-thumb:hover { background: var(--border-medium); }
296
-
297
- /* Focus rings */
298
- :focus-visible {
299
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
300
- outline-offset: var(--focus-ring-offset);
301
- border-radius: var(--radius-md);
302
- }
303
- ```
304
-
305
- ---
306
-
307
- ## Token Scope Guardrails
308
-
309
- **This is the most critical implementation rule.** Font and typography bugs almost always come from scope violations.
310
-
311
- **Rule 1:** Put typography, spacing, radius, and transition tokens in `:root` — not in `[data-theme]`.
312
-
313
- **Rule 2:** Put theme-specific colors and surface values on the theme owner (`[data-theme]`).
314
-
315
- **Rule 3:** If `body` consumes `var(--font-body)`, that variable must exist in `:root` or in a scope `body` inherits.
316
-
317
- **Rule 4:** If the theme lives on a shell container instead of `body`, either keep typography in `:root`, or apply `font-family` directly on that shell.
318
-
319
- **Safe — typography in :root:**
320
- ```css
321
- :root { --font-body: system-ui, sans-serif; --font-display: Georgia, serif; }
322
- body { font-family: var(--font-body); }
323
- .shell[data-theme="light"] { --bg-base: #FDFCFA; }
324
- ```
325
-
326
- **Safe — theme on shell, font applied there:**
327
- ```css
328
- :root { --font-body: system-ui, sans-serif; }
329
- .shell[data-theme="light"] { --bg-base: #FDFCFA; font-family: var(--font-body); }
330
- ```
331
-
332
- ---
333
-
334
- ## Interaction Guardrails
335
-
336
- These rules exist to stop the most common quality failures: invisible hover states, washed-out accents, and contrast issues on warm backgrounds.
337
-
338
- 1. Primary actions on accent backgrounds must use `var(--accent-contrast)`, not `var(--bg-base)`.
339
- 2. Hover state on accent buttons: darken with `var(--accent-hover)`, never lighten.
340
- 3. Card hover: lift with shadow (`var(--shadow-md)`) + subtle translate, never change background.
341
- 4. Destructive actions: `var(--semantic-red)` as background or text. Never use the warm accent for destructive actions.
342
- 5. Disabled state: `opacity: 0.5` + `pointer-events: none`. Never gray out with cold gray — the disabled state should still feel warm.
343
- 6. Focus ring: `var(--focus-ring-color)` (warm-tinted), never browser default blue.
344
- 7. Link color: `var(--accent-strong)` (darker terracotta for AA compliance on light backgrounds). Never blue unless explicitly part of the domain.
345
- 8. Input focus: `border-color: var(--accent)` + `box-shadow: 0 0 0 3px var(--accent-dim)`. Warm, visible, not aggressive.
346
- 9. Active nav item: `background: var(--bg-elevated)` + `color: var(--text-heading)` + `border-radius: var(--radius-lg)`. Soft highlight, never hard borders.
347
- 10. Toast/notification: `var(--bg-surface)` + `var(--shadow-lg)` + warm border. Never flat-colored blocks.
348
-
349
- ---
350
-
351
- ## Typography Rules
352
-
353
- 1. Headings use `var(--font-display)` (serif). This is non-negotiable — it is the primary visual differentiator.
354
- 2. Body text uses `var(--font-body)` (sans-serif). Clean and readable for long sessions.
355
- 3. Labels and metadata use `var(--font-body)` at `var(--weight-medium)` with `var(--tracking-wide)`.
356
- 4. Stat numbers use `var(--font-display)` at large sizes — serif numbers feel premium.
357
- 5. Never use all-uppercase for headings. Warm Craft is sentence-case by default.
358
- 6. Mono font (`var(--font-mono)`) is for code blocks only, never for labels or metadata.
359
- 7. Line-height for body: `var(--leading-normal)` (1.6) minimum. Generous is correct.
360
- 8. Line-height for headings: `var(--leading-tight)` (1.2). Tight but not cramped.
361
- 9. Max reading width: `var(--content-sm)` (640px) for long-form text. Never wider.
362
- 10. Serif italic (`font-style: italic`) is available for pull quotes, emphasis, and editorial moments — use intentionally.
363
-
364
- ---
365
-
366
- ## Warm Palette Rules
367
-
368
- 1. Never use pure `#FFFFFF` as the app background. Use `var(--bg-base)` which has warm undertones.
369
- 2. Never use pure `#000000` for text. Use `var(--text-heading)` which is warm charcoal.
370
- 3. All shadows use warm-tinted RGBA (`rgba(45, 40, 35, ...)`) in light theme, never cold black.
371
- 4. Accent colors in charts and data visualization must come from the warm family: terracotta, sage, amber, slate-blue, muted purple. Never neon, never saturated primary colors.
372
- 5. Semantic colors are desaturated compared to typical UI kits — they feel warm even when communicating error or warning.
373
- 6. Background transitions between sections should use warm gradient: `var(--bg-base)` to `var(--bg-void)` or vice versa.
374
- 7. Hover and active states should feel like the element is getting closer to a warm light source, not colder.
1
+ # Design Tokens — Warm Craft UI
2
+
3
+ All components and patterns depend on these tokens. Load this file first before any other reference.
4
+
5
+ ---
6
+
7
+ ## Typography strategy
8
+
9
+ Default to **system fonts** first. Add Google Fonts only when the agent decides the stack, product context, and delivery constraints justify them.
10
+
11
+ **System font stack (default — works everywhere, no CDN needed):**
12
+ ```css
13
+ --font-display: Georgia, "Times New Roman", "Noto Serif", serif;
14
+ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;
15
+ --font-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
16
+ ```
17
+
18
+ **Google Fonts (optional — use when building the full Warm Craft aesthetic explicitly):**
19
+ ```css
20
+ @import url('https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,wght@0,400;0,600;0,700;1,400;1,600&family=Inter:wght@400;500;600;700&display=swap');
21
+
22
+ --font-display: 'Source Serif 4', Georgia, serif;
23
+ --font-body: 'Inter', system-ui, sans-serif;
24
+ --font-mono: ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace;
25
+ ```
26
+
27
+ ---
28
+
29
+ ## Complete CSS Variables
30
+
31
+ Include this full block in every project.
32
+
33
+ ```css
34
+ /* ═══════════════════════════════════════════
35
+ SHARED TOKENS — in :root (see Token Scope Guardrails)
36
+ ═══════════════════════════════════════════ */
37
+ :root {
38
+ /* Typography */
39
+ --font-display: Georgia, "Times New Roman", "Noto Serif", serif;
40
+ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", system-ui, sans-serif;
41
+ --font-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
42
+
43
+ /* Font Sizes */
44
+ --text-xs: 0.75rem; /* 12px — small labels, metadata */
45
+ --text-sm: 0.875rem; /* 14px */
46
+ --text-base: 1rem; /* 16px — default body */
47
+ --text-lg: 1.125rem; /* 18px */
48
+ --text-xl: 1.25rem; /* 20px */
49
+ --text-2xl: 1.5rem; /* 24px */
50
+ --text-3xl: 2rem; /* 32px */
51
+ --text-4xl: 2.5rem; /* 40px — stat numbers */
52
+ --text-5xl: 3.5rem; /* 56px — hero headings */
53
+
54
+ /* Font Weights */
55
+ --weight-normal: 400;
56
+ --weight-medium: 500;
57
+ --weight-semibold: 600;
58
+ --weight-bold: 700;
59
+
60
+ /* Letter Spacing */
61
+ --tracking-tight: 0;
62
+ --tracking-normal: 0;
63
+ --tracking-wide: 0.02em;
64
+ --tracking-wider: 0.05em;
65
+
66
+ /* Line Height */
67
+ --leading-none: 1;
68
+ --leading-tight: 1.2;
69
+ --leading-snug: 1.35;
70
+ --leading-normal: 1.6;
71
+ --leading-relaxed: 1.75;
72
+
73
+ /* Spacing — 4px base rhythm */
74
+ --space-0: 0;
75
+ --space-1: 0.25rem; /* 4px */
76
+ --space-2: 0.5rem; /* 8px */
77
+ --space-3: 0.75rem; /* 12px */
78
+ --space-4: 1rem; /* 16px */
79
+ --space-5: 1.25rem; /* 20px */
80
+ --space-6: 1.5rem; /* 24px */
81
+ --space-8: 2rem; /* 32px */
82
+ --space-10: 2.5rem; /* 40px */
83
+ --space-12: 3rem; /* 48px */
84
+ --space-16: 4rem; /* 64px */
85
+ --space-20: 5rem; /* 80px */
86
+ --space-24: 6rem; /* 96px */
87
+ --space-32: 8rem; /* 128px — hero sections */
88
+
89
+ /* Border Radius — generously rounded */
90
+ --radius-sm: 0.375rem; /* 6px — badges, small chips */
91
+ --radius-md: 0.5rem; /* 8px — inputs, small buttons */
92
+ --radius-lg: 0.75rem; /* 12px — buttons, medium cards */
93
+ --radius-xl: 1rem; /* 16px — cards, panels */
94
+ --radius-2xl: 1.5rem; /* 24px — large cards, modals */
95
+ --radius-3xl: 2rem; /* 32px — hero sections, feature cards */
96
+ --radius-full: 9999px; /* pills, avatars */
97
+
98
+ /* Interactive element heights */
99
+ --control-sm: 2rem; /* 32px — compact buttons */
100
+ --control-md: 2.5rem; /* 40px — default buttons and inputs */
101
+ --control-lg: 3rem; /* 48px — large buttons, prominent inputs */
102
+ --control-xl: 3.5rem; /* 56px — hero CTAs */
103
+
104
+ /* Transitions */
105
+ --transition-fast: 120ms ease;
106
+ --transition-base: 200ms ease;
107
+ --transition-slow: 320ms ease;
108
+ --transition-theme: background 200ms ease, color 200ms ease, border-color 200ms ease, box-shadow 200ms ease;
109
+
110
+ /* Focus */
111
+ --focus-ring-width: 2px;
112
+ --focus-ring-offset: 2px;
113
+
114
+ /* Z-index */
115
+ --z-base: 0;
116
+ --z-elevated: 10;
117
+ --z-dropdown: 20;
118
+ --z-sticky: 30;
119
+ --z-modal: 50;
120
+ --z-toast: 60;
121
+
122
+ /* Content widths */
123
+ --content-sm: 640px; /* narrow reading column */
124
+ --content-md: 768px; /* medium content */
125
+ --content-lg: 1024px; /* standard content */
126
+ --content-xl: 1280px; /* wide content */
127
+ --content-full: 1440px; /* max container */
128
+ }
129
+
130
+ /* ═══════════════════════════════════════════
131
+ LIGHT THEME (default)
132
+ ═══════════════════════════════════════════ */
133
+ [data-theme="light"] {
134
+ /* Backgrounds — layered warm whites */
135
+ --bg-void: #F8F6F3;
136
+ --bg-base: #FDFCFA;
137
+ --bg-surface: #FFFFFF;
138
+ --bg-elevated: #F3F1ED;
139
+ --bg-overlay: #EAE7E2;
140
+
141
+ /* Borders */
142
+ --border-subtle: rgba(45, 52, 54, 0.06);
143
+ --border-medium: rgba(45, 52, 54, 0.12);
144
+ --border-strong: rgba(45, 52, 54, 0.20);
145
+ --border-accent: rgba(224, 122, 95, 0.24);
146
+ --border-accent-strong: rgba(224, 122, 95, 0.48);
147
+
148
+ /* Text */
149
+ --text-heading: #2D3436;
150
+ --text-primary: #4A5568;
151
+ --text-secondary: #8896A6;
152
+ --text-muted: #B0BCC7;
153
+ --text-accent: #C4563A;
154
+ --text-inverse: #FDFCFA;
155
+
156
+ /* Accent — terracotta/warm coral */
157
+ --accent: #E07A5F;
158
+ --accent-strong: #C4563A;
159
+ --accent-dim: rgba(224, 122, 95, 0.12);
160
+ --accent-glow: rgba(224, 122, 95, 0.08);
161
+ --accent-subtle: rgba(224, 122, 95, 0.05);
162
+ --accent-hover: #D4694E;
163
+ --accent-contrast: #FFFFFF;
164
+
165
+ /* Secondary accent — sage green (for success, secondary actions) */
166
+ --accent-secondary: #7C9A82;
167
+ --accent-secondary-dim: rgba(124, 154, 130, 0.12);
168
+
169
+ /* Tertiary — warm amber (for warnings, highlights) */
170
+ --accent-tertiary: #D4A76A;
171
+ --accent-tertiary-dim: rgba(212, 167, 106, 0.12);
172
+
173
+ /* Semantic */
174
+ --semantic-green: #5A9E6F;
175
+ --semantic-green-dim: rgba(90, 158, 111, 0.12);
176
+ --semantic-amber: #D4A76A;
177
+ --semantic-amber-dim: rgba(212, 167, 106, 0.12);
178
+ --semantic-red: #D35D6E;
179
+ --semantic-red-dim: rgba(211, 93, 110, 0.12);
180
+ --semantic-blue: #5B8DB8;
181
+ --semantic-blue-dim: rgba(91, 141, 184, 0.12);
182
+ --semantic-purple: #9B8EC4;
183
+ --semantic-purple-dim: rgba(155, 142, 196, 0.12);
184
+
185
+ /* Shadows — warm-tinted, soft */
186
+ --shadow-xs: 0 1px 2px rgba(45, 40, 35, 0.04);
187
+ --shadow-sm: 0 1px 3px rgba(45, 40, 35, 0.06), 0 1px 2px rgba(45, 40, 35, 0.04);
188
+ --shadow-md: 0 4px 12px rgba(45, 40, 35, 0.08), 0 2px 4px rgba(45, 40, 35, 0.04);
189
+ --shadow-lg: 0 12px 32px rgba(45, 40, 35, 0.10), 0 4px 8px rgba(45, 40, 35, 0.04);
190
+ --shadow-xl: 0 20px 48px rgba(45, 40, 35, 0.12), 0 8px 16px rgba(45, 40, 35, 0.04);
191
+ --shadow-glow: 0 0 0 1px rgba(224, 122, 95, 0.06), 0 8px 24px rgba(45, 40, 35, 0.08);
192
+
193
+ /* Scrollbar */
194
+ --scrollbar-track: #F3F1ED;
195
+ --scrollbar-thumb: #D4CFC8;
196
+
197
+ /* Focus ring */
198
+ --focus-ring-color: rgba(224, 122, 95, 0.40);
199
+ }
200
+
201
+ /* ═══════════════════════════════════════════
202
+ DARK THEME
203
+ ═══════════════════════════════════════════ */
204
+ [data-theme="dark"] {
205
+ /* Backgrounds — layered warm darks */
206
+ --bg-void: #1A1814;
207
+ --bg-base: #211F1B;
208
+ --bg-surface: #2A2824;
209
+ --bg-elevated: #353330;
210
+ --bg-overlay: #403E3A;
211
+
212
+ /* Borders */
213
+ --border-subtle: rgba(245, 240, 235, 0.06);
214
+ --border-medium: rgba(245, 240, 235, 0.10);
215
+ --border-strong: rgba(245, 240, 235, 0.16);
216
+ --border-accent: rgba(240, 150, 125, 0.22);
217
+ --border-accent-strong: rgba(240, 150, 125, 0.44);
218
+
219
+ /* Text */
220
+ --text-heading: #F5F0EB;
221
+ --text-primary: #D4CBC2;
222
+ --text-secondary: #9A9088;
223
+ --text-muted: #6B6460;
224
+ --text-accent: #F0967D;
225
+ --text-inverse: #1A1814;
226
+
227
+ /* Accent — lighter terracotta for dark backgrounds */
228
+ --accent: #F0967D;
229
+ --accent-strong: #E07A5F;
230
+ --accent-dim: rgba(240, 150, 125, 0.14);
231
+ --accent-glow: rgba(240, 150, 125, 0.10);
232
+ --accent-subtle: rgba(240, 150, 125, 0.06);
233
+ --accent-hover: #F4A68E;
234
+ --accent-contrast: #1A1814;
235
+
236
+ /* Secondary accent — sage green */
237
+ --accent-secondary: #8DB896;
238
+ --accent-secondary-dim: rgba(141, 184, 150, 0.14);
239
+
240
+ /* Tertiary — warm amber */
241
+ --accent-tertiary: #E0BD82;
242
+ --accent-tertiary-dim: rgba(224, 189, 130, 0.14);
243
+
244
+ /* Semantic */
245
+ --semantic-green: #6BB87A;
246
+ --semantic-green-dim: rgba(107, 184, 122, 0.14);
247
+ --semantic-amber: #E0BD82;
248
+ --semantic-amber-dim: rgba(224, 189, 130, 0.14);
249
+ --semantic-red: #E07080;
250
+ --semantic-red-dim: rgba(224, 112, 128, 0.14);
251
+ --semantic-blue: #7CAED4;
252
+ --semantic-blue-dim: rgba(124, 174, 212, 0.14);
253
+ --semantic-purple: #B0A2D8;
254
+ --semantic-purple-dim: rgba(176, 162, 216, 0.14);
255
+
256
+ /* Shadows */
257
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.16);
258
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.20), 0 1px 2px rgba(0, 0, 0, 0.12);
259
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.24), 0 2px 4px rgba(0, 0, 0, 0.12);
260
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.32), 0 4px 8px rgba(0, 0, 0, 0.16);
261
+ --shadow-xl: 0 20px 48px rgba(0, 0, 0, 0.40), 0 8px 16px rgba(0, 0, 0, 0.20);
262
+ --shadow-glow: 0 0 0 1px rgba(240, 150, 125, 0.06), 0 8px 24px rgba(0, 0, 0, 0.28);
263
+
264
+ /* Scrollbar */
265
+ --scrollbar-track: #211F1B;
266
+ --scrollbar-thumb: #403E3A;
267
+
268
+ /* Focus ring */
269
+ --focus-ring-color: rgba(240, 150, 125, 0.40);
270
+ }
271
+
272
+ /* ═══════════════════════════════════════════
273
+ BASE STYLES
274
+ ═══════════════════════════════════════════ */
275
+ body {
276
+ font-family: var(--font-body);
277
+ font-size: var(--text-base);
278
+ line-height: var(--leading-normal);
279
+ margin: 0;
280
+ -webkit-font-smoothing: antialiased;
281
+ }
282
+
283
+ [data-theme] {
284
+ color: var(--text-primary);
285
+ background: var(--bg-base);
286
+ transition: var(--transition-theme);
287
+ }
288
+
289
+ *, *::before, *::after { box-sizing: border-box; }
290
+
291
+ /* Custom scrollbar */
292
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
293
+ ::-webkit-scrollbar-track { background: var(--scrollbar-track); border-radius: var(--radius-full); }
294
+ ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: var(--radius-full); }
295
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-medium); }
296
+
297
+ /* Focus rings */
298
+ :focus-visible {
299
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
300
+ outline-offset: var(--focus-ring-offset);
301
+ border-radius: var(--radius-md);
302
+ }
303
+ ```
304
+
305
+ ---
306
+
307
+ ## Token Scope Guardrails
308
+
309
+ **This is the most critical implementation rule.** Font and typography bugs almost always come from scope violations.
310
+
311
+ **Rule 1:** Put typography, spacing, radius, and transition tokens in `:root` — not in `[data-theme]`.
312
+
313
+ **Rule 2:** Put theme-specific colors and surface values on the theme owner (`[data-theme]`).
314
+
315
+ **Rule 3:** If `body` consumes `var(--font-body)`, that variable must exist in `:root` or in a scope `body` inherits.
316
+
317
+ **Rule 4:** If the theme lives on a shell container instead of `body`, either keep typography in `:root`, or apply `font-family` directly on that shell.
318
+
319
+ **Safe — typography in :root:**
320
+ ```css
321
+ :root { --font-body: system-ui, sans-serif; --font-display: Georgia, serif; }
322
+ body { font-family: var(--font-body); }
323
+ .shell[data-theme="light"] { --bg-base: #FDFCFA; }
324
+ ```
325
+
326
+ **Safe — theme on shell, font applied there:**
327
+ ```css
328
+ :root { --font-body: system-ui, sans-serif; }
329
+ .shell[data-theme="light"] { --bg-base: #FDFCFA; font-family: var(--font-body); }
330
+ ```
331
+
332
+ ---
333
+
334
+ ## Interaction Guardrails
335
+
336
+ These rules exist to stop the most common quality failures: invisible hover states, washed-out accents, and contrast issues on warm backgrounds.
337
+
338
+ 1. Primary actions on accent backgrounds must use `var(--accent-contrast)`, not `var(--bg-base)`.
339
+ 2. Hover state on accent buttons: darken with `var(--accent-hover)`, never lighten.
340
+ 3. Card hover: lift with shadow (`var(--shadow-md)`) + subtle translate, never change background.
341
+ 4. Destructive actions: `var(--semantic-red)` as background or text. Never use the warm accent for destructive actions.
342
+ 5. Disabled state: `opacity: 0.5` + `pointer-events: none`. Never gray out with cold gray — the disabled state should still feel warm.
343
+ 6. Focus ring: `var(--focus-ring-color)` (warm-tinted), never browser default blue.
344
+ 7. Link color: `var(--accent-strong)` (darker terracotta for AA compliance on light backgrounds). Never blue unless explicitly part of the domain.
345
+ 8. Input focus: `border-color: var(--accent)` + `box-shadow: 0 0 0 3px var(--accent-dim)`. Warm, visible, not aggressive.
346
+ 9. Active nav item: `background: var(--bg-elevated)` + `color: var(--text-heading)` + `border-radius: var(--radius-lg)`. Soft highlight, never hard borders.
347
+ 10. Toast/notification: `var(--bg-surface)` + `var(--shadow-lg)` + warm border. Never flat-colored blocks.
348
+
349
+ ---
350
+
351
+ ## Typography Rules
352
+
353
+ 1. Headings use `var(--font-display)` (serif). This is non-negotiable — it is the primary visual differentiator.
354
+ 2. Body text uses `var(--font-body)` (sans-serif). Clean and readable for long sessions.
355
+ 3. Labels and metadata use `var(--font-body)` at `var(--weight-medium)` with `var(--tracking-wide)`.
356
+ 4. Stat numbers use `var(--font-display)` at large sizes — serif numbers feel premium.
357
+ 5. Never use all-uppercase for headings. Warm Craft is sentence-case by default.
358
+ 6. Mono font (`var(--font-mono)`) is for code blocks only, never for labels or metadata.
359
+ 7. Line-height for body: `var(--leading-normal)` (1.6) minimum. Generous is correct.
360
+ 8. Line-height for headings: `var(--leading-tight)` (1.2). Tight but not cramped.
361
+ 9. Max reading width: `var(--content-sm)` (640px) for long-form text. Never wider.
362
+ 10. Serif italic (`font-style: italic`) is available for pull quotes, emphasis, and editorial moments — use intentionally.
363
+
364
+ ---
365
+
366
+ ## Warm Palette Rules
367
+
368
+ 1. Never use pure `#FFFFFF` as the app background. Use `var(--bg-base)` which has warm undertones.
369
+ 2. Never use pure `#000000` for text. Use `var(--text-heading)` which is warm charcoal.
370
+ 3. All shadows use warm-tinted RGBA (`rgba(45, 40, 35, ...)`) in light theme, never cold black.
371
+ 4. Accent colors in charts and data visualization must come from the warm family: terracotta, sage, amber, slate-blue, muted purple. Never neon, never saturated primary colors.
372
+ 5. Semantic colors are desaturated compared to typical UI kits — they feel warm even when communicating error or warning.
373
+ 6. Background transitions between sections should use warm gradient: `var(--bg-base)` to `var(--bg-void)` or vice versa.
374
+ 7. Hover and active states should feel like the element is getting closer to a warm light source, not colder.