@jaimevalasek/aioson 1.30.1 → 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 (90) hide show
  1. package/CHANGELOG.md +9 -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 +567 -511
  12. package/template/.aioson/docs/play/README.md +2 -0
  13. package/template/.aioson/docs/play/agent-usage-guide.md +7 -1
  14. package/template/.aioson/docs/play/app-compatibility-guide.md +6 -1
  15. package/template/.aioson/docs/play/auth-services-and-testing.md +16 -1
  16. package/template/.aioson/docs/play/manifest-and-runtime.md +23 -0
  17. package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +266 -243
  18. package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
  19. package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
  20. package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
  21. package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
  22. package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
  23. package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +485 -482
  24. package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +386 -387
  25. package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +228 -205
  26. package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
  27. package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
  28. package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
  29. package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
  30. package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
  31. package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
  32. package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
  33. package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +233 -210
  34. package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
  35. package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
  36. package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
  37. package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
  38. package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
  39. package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
  40. package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
  41. package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +239 -203
  42. package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
  43. package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +417 -407
  44. package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +289 -272
  45. package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +525 -524
  46. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
  47. package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +355 -289
  48. package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +443 -437
  49. package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +245 -222
  50. package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
  51. package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
  52. package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
  53. package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
  54. package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
  55. package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
  56. package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
  57. package/template/.aioson/skills/design/interface-design/SKILL.md +68 -47
  58. package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
  59. package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
  60. package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +92 -71
  61. package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
  62. package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
  63. package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +236 -213
  64. package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
  65. package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
  66. package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
  67. package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
  68. package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
  69. package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
  70. package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
  71. package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +83 -62
  72. package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
  73. package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
  74. package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
  75. package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
  76. package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
  77. package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +94 -66
  78. package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +366 -366
  79. package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
  80. package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
  81. package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
  82. package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +161 -161
  83. package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +232 -209
  84. package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
  85. package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
  86. package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
  87. package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
  88. package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
  89. package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
  90. 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.