@almadar/ui 4.57.4 → 5.0.0

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 (41) hide show
  1. package/dist/avl/index.cjs +270 -69
  2. package/dist/avl/index.js +270 -69
  3. package/dist/components/index.cjs +101 -68
  4. package/dist/components/index.js +101 -68
  5. package/dist/context/index.cjs +199 -0
  6. package/dist/context/index.js +199 -0
  7. package/dist/context/themeTokens.d.ts +1 -1
  8. package/dist/docs/index.cjs +21 -21
  9. package/dist/docs/index.js +21 -21
  10. package/dist/marketing/index.cjs +18 -18
  11. package/dist/marketing/index.js +18 -18
  12. package/dist/providers/index.cjs +101 -68
  13. package/dist/providers/index.js +101 -68
  14. package/dist/runtime/index.cjs +270 -69
  15. package/dist/runtime/index.js +270 -69
  16. package/package.json +2 -2
  17. package/tailwind-preset.cjs +118 -3
  18. package/themes/_contract.md +198 -0
  19. package/themes/almadar-website.css +212 -0
  20. package/themes/almadar.css +210 -0
  21. package/themes/arctic.css +210 -0
  22. package/themes/atelier.css +427 -0
  23. package/themes/copper.css +210 -0
  24. package/themes/ember.css +210 -0
  25. package/themes/forest.css +210 -0
  26. package/themes/gazette.css +411 -0
  27. package/themes/index.css +7 -0
  28. package/themes/kiosk.css +412 -0
  29. package/themes/lavender.css +210 -0
  30. package/themes/midnight.css +210 -0
  31. package/themes/minimalist.css +210 -0
  32. package/themes/neon.css +210 -0
  33. package/themes/ocean.css +210 -0
  34. package/themes/prism.css +406 -0
  35. package/themes/rose.css +210 -0
  36. package/themes/sand.css +210 -0
  37. package/themes/slate.css +210 -0
  38. package/themes/sunset.css +210 -0
  39. package/themes/terminal.css +422 -0
  40. package/themes/trait-wars.css +210 -0
  41. package/themes/wireframe.css +216 -0
@@ -0,0 +1,412 @@
1
+ /**
2
+ * Kiosk Theme
3
+ *
4
+ * Touch-first, chunky, mobile/kiosk-influenced. Big tap targets,
5
+ * pill buttons, friendly saturated colors, and generous spacing.
6
+ */
7
+
8
+ /* ==========================================================================
9
+ * LIGHT MODE
10
+ * ========================================================================== */
11
+ [data-theme="kiosk-light"] {
12
+ /* Shadows - Lifted, prominent for touch feedback */
13
+ --shadow-main:
14
+ 0 6px 20px rgba(255, 90, 79, 0.14), 0 2px 6px rgba(0, 0, 0, 0.08);
15
+ --shadow-sm: 0 3px 8px rgba(0, 0, 0, 0.08);
16
+ --shadow-lg:
17
+ 0 16px 40px rgba(255, 90, 79, 0.22), 0 6px 16px rgba(0, 0, 0, 0.1);
18
+ --shadow-inner: inset 0 2px 4px rgba(0, 0, 0, 0.08);
19
+ --shadow-none: none;
20
+ --shadow-hover:
21
+ 0 20px 50px rgba(255, 90, 79, 0.28), 0 8px 20px rgba(0, 0, 0, 0.12);
22
+ --shadow-active: 0 3px 10px rgba(255, 90, 79, 0.2);
23
+
24
+ /* Border radius - Chunky containers, pill interactive */
25
+ --radius-none: 0px;
26
+ --radius-sm: 10px;
27
+ --radius-md: 14px;
28
+ --radius-lg: 20px;
29
+ --radius-xl: 28px;
30
+ --radius-full: 9999px;
31
+
32
+ /* Border width - Tactile, visible */
33
+ --border-width: 2px;
34
+ --border-width-thin: 1px;
35
+ --border-width-thick: 3px;
36
+
37
+ /* Colors - Warm white background, saturated coral primary */
38
+ --color-primary: #ff5a4f;
39
+ --color-primary-hover: #e8483e;
40
+ --color-primary-foreground: #ffffff;
41
+
42
+ --color-secondary: #fff1ef;
43
+ --color-secondary-hover: #ffe1dd;
44
+ --color-secondary-foreground: #1a1a1a;
45
+
46
+ --color-accent: #22c8be;
47
+ --color-accent-foreground: #ffffff;
48
+
49
+ --color-muted: #f5f5f4;
50
+ --color-muted-foreground: #595959;
51
+
52
+ --color-background: #fefefe;
53
+ --color-foreground: #1a1a1a;
54
+ --color-card: #ffffff;
55
+ --color-card-foreground: #1a1a1a;
56
+ --color-surface: #fff8f6;
57
+ --color-border: #e6e6e6;
58
+ --color-input: #d4d4d4;
59
+ --color-ring: #ff5a4f;
60
+
61
+ /* Semantic colors - Saturated, cheerful */
62
+ --color-error: #ef4444;
63
+ --color-error-foreground: #ffffff;
64
+ --color-success: #16a34a;
65
+ --color-success-foreground: #ffffff;
66
+ --color-warning: #f59e0b;
67
+ --color-warning-foreground: #1a1a1a;
68
+ --color-info: #0ea5e9;
69
+ --color-info-foreground: #ffffff;
70
+
71
+ /* Typography - Chunky, rounded geometric */
72
+ --font-family:
73
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
74
+ --font-weight-normal: 500;
75
+ --font-weight-medium: 600;
76
+ --font-weight-bold: 800;
77
+ --letter-spacing: -0.01em;
78
+ --line-height: 1.55;
79
+
80
+ /* Icon styling - Filled, large, visible */
81
+ --icon-stroke-width: 0;
82
+ --icon-color: #1a1a1a;
83
+
84
+ /* Transitions - Organic, friendly */
85
+ --transition-fast: 300ms;
86
+ --transition-normal: 500ms;
87
+ --transition-slow: 750ms;
88
+ --transition-timing: cubic-bezier(0.16, 1, 0.3, 1);
89
+
90
+ /* Hover/Active transforms - Bigger lift for touch */
91
+ --hover-scale: 1.03;
92
+ --hover-translate-y: -3px;
93
+ --hover-translate-x: 0;
94
+ --active-scale: 0.96;
95
+ --active-translate-y: 1px;
96
+
97
+ /* Focus ring - Thick coral */
98
+ --focus-ring-width: 3px;
99
+ --focus-ring-offset: 3px;
100
+ --focus-ring-color: #ff5a4f;
101
+
102
+ /* Density axis — spacing scale (extra-spacious, 12pt rhythm) */
103
+ --space-0: 0px;
104
+ --space-1: 4px;
105
+ --space-2: 8px;
106
+ --space-3: 12px;
107
+ --space-4: 18px;
108
+ --space-5: 24px;
109
+ --space-6: 32px;
110
+ --space-7: 40px;
111
+ --space-8: 48px;
112
+ --space-9: 56px;
113
+ --space-10: 64px;
114
+ --space-11: 72px;
115
+ --space-12: 80px;
116
+ /* Density axis — per-element heights (large tap targets) */
117
+ --button-height-sm: 44px;
118
+ --button-height-md: 52px;
119
+ --button-height-lg: 64px;
120
+ --input-height-sm: 44px;
121
+ --input-height-md: 52px;
122
+ --input-height-lg: 64px;
123
+ --row-height-compact: 56px;
124
+ --row-height-normal: 72px;
125
+ --row-height-spacious: 88px;
126
+ /* Density axis — per-element padding (generous) */
127
+ --card-padding-sm: 16px;
128
+ --card-padding-md: 24px;
129
+ --card-padding-lg: 32px;
130
+ --dialog-padding: 32px;
131
+ --section-gap: 48px;
132
+ /* Type axis — family triplet */
133
+ --font-family-display:
134
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
135
+ --font-family-body:
136
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
137
+ --font-family-mono:
138
+ "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
139
+ /* Type axis — size scale (chunky, readable at arm's length) */
140
+ --text-xs: 14px;
141
+ --leading-xs: 20px;
142
+ --text-sm: 16px;
143
+ --leading-sm: 24px;
144
+ --text-base: 18px;
145
+ --leading-base: 28px;
146
+ --text-lg: 22px;
147
+ --leading-lg: 32px;
148
+ --text-xl: 26px;
149
+ --leading-xl: 34px;
150
+ --text-2xl: 32px;
151
+ --leading-2xl: 40px;
152
+ --text-3xl: 40px;
153
+ --leading-3xl: 48px;
154
+ --text-4xl: 48px;
155
+ --leading-4xl: 56px;
156
+ --text-display-1: 64px;
157
+ --leading-display-1: 72px;
158
+ --text-display-2: 80px;
159
+ --leading-display-2: 88px;
160
+ /* Type axis — intent mapping */
161
+ --intent-heading-major-size: 28px;
162
+ --intent-heading-major-weight: var(--font-weight-bold);
163
+ --intent-heading-major-leading: 36px;
164
+ --intent-heading-minor-size: var(--text-lg);
165
+ --intent-heading-minor-weight: var(--font-weight-bold);
166
+ --intent-heading-minor-leading: var(--leading-lg);
167
+ --intent-body-emphasis-size: var(--text-base);
168
+ --intent-body-emphasis-weight: var(--font-weight-medium);
169
+ --intent-body-emphasis-leading: var(--leading-base);
170
+ --intent-body-default-size: var(--text-base);
171
+ --intent-body-default-weight: var(--font-weight-normal);
172
+ --intent-body-default-leading: var(--leading-base);
173
+ --intent-body-quiet-size: var(--text-sm);
174
+ --intent-body-quiet-weight: var(--font-weight-normal);
175
+ --intent-body-quiet-leading: var(--leading-sm);
176
+ --intent-caption-size: var(--text-sm);
177
+ --intent-caption-weight: var(--font-weight-medium);
178
+ --intent-caption-leading: var(--leading-sm);
179
+ --intent-numeric-size: var(--text-base);
180
+ --intent-numeric-weight: var(--font-weight-bold);
181
+ --intent-numeric-leading: var(--leading-base);
182
+ /* Motion axis — duration palette (organic, slower) */
183
+ --duration-instant: 0ms;
184
+ --duration-fast: 300ms;
185
+ --duration-normal: 500ms;
186
+ --duration-slow: 750ms;
187
+ --duration-dramatic: 1000ms;
188
+ /* Motion axis — easing palette (ease-out, friendly) */
189
+ --easing-linear: linear;
190
+ --easing-standard: cubic-bezier(0.16, 1, 0.3, 1);
191
+ --easing-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
192
+ --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
193
+ /* Iconography axis - filled phosphor, large */
194
+ --icon-family: phosphor-fill;
195
+ --icon-default-size: 26px;
196
+ /* Elevation axis - lifted, prominent */
197
+ --elevation-card: var(--shadow-lg);
198
+ --elevation-popover: var(--shadow-lg);
199
+ --elevation-dialog: var(--shadow-lg);
200
+ --elevation-toast: var(--shadow-main);
201
+ /* Geometry axis - pill interactive, chunky containers */
202
+ --radius-container: 16px;
203
+ --radius-interactive: 9999px;
204
+ --radius-pill: 9999px;
205
+ /* Geometry axis - tactile borders */
206
+ --border-hairline: 1px;
207
+ --border-standard: 2px;
208
+ --border-heavy: 3px;
209
+ }
210
+
211
+ /* ==========================================================================
212
+ * DARK MODE
213
+ * ========================================================================== */
214
+ [data-theme="kiosk-dark"] {
215
+ /* Shadows - Deep, lifted with coral glow */
216
+ --shadow-main:
217
+ 0 6px 20px rgba(255, 90, 79, 0.2), 0 2px 6px rgba(0, 0, 0, 0.4);
218
+ --shadow-sm: 0 3px 8px rgba(0, 0, 0, 0.4);
219
+ --shadow-lg:
220
+ 0 16px 40px rgba(255, 90, 79, 0.3), 0 6px 16px rgba(0, 0, 0, 0.5);
221
+ --shadow-inner: inset 0 2px 4px rgba(0, 0, 0, 0.3);
222
+ --shadow-none: none;
223
+ --shadow-hover:
224
+ 0 20px 50px rgba(255, 90, 79, 0.4), 0 8px 20px rgba(34, 200, 190, 0.2);
225
+ --shadow-active: 0 3px 10px rgba(255, 90, 79, 0.3);
226
+
227
+ /* Border radius - Chunky containers, pill interactive */
228
+ --radius-none: 0px;
229
+ --radius-sm: 10px;
230
+ --radius-md: 14px;
231
+ --radius-lg: 20px;
232
+ --radius-xl: 28px;
233
+ --radius-full: 9999px;
234
+
235
+ /* Border width - Tactile, visible */
236
+ --border-width: 2px;
237
+ --border-width-thin: 1px;
238
+ --border-width-thick: 3px;
239
+
240
+ /* Colors - Deep navy background, coral primary, turquoise pop */
241
+ --color-primary: #ff6b5e;
242
+ --color-primary-hover: #ff8478;
243
+ --color-primary-foreground: #ffffff;
244
+
245
+ --color-secondary: #1c2a44;
246
+ --color-secondary-hover: #2a3a5c;
247
+ --color-secondary-foreground: #ffffff;
248
+
249
+ --color-accent: #2ee0d4;
250
+ --color-accent-foreground: #06231f;
251
+
252
+ --color-muted: #16243c;
253
+ --color-muted-foreground: #b8c4d8;
254
+
255
+ --color-background: #0a1428;
256
+ --color-foreground: #ffffff;
257
+ --color-card: #122038;
258
+ --color-card-foreground: #ffffff;
259
+ --color-surface: #16243c;
260
+ --color-border: rgba(255, 255, 255, 0.12);
261
+ --color-input: rgba(255, 255, 255, 0.16);
262
+ --color-ring: #ff6b5e;
263
+
264
+ /* Semantic colors - Saturated, bright for dark */
265
+ --color-error: #ff7a7a;
266
+ --color-error-foreground: #1a0606;
267
+ --color-success: #4ade80;
268
+ --color-success-foreground: #052e14;
269
+ --color-warning: #fbbf24;
270
+ --color-warning-foreground: #1a1106;
271
+ --color-info: #38bdf8;
272
+ --color-info-foreground: #062235;
273
+
274
+ /* Typography - Chunky, rounded geometric */
275
+ --font-family:
276
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
277
+ --font-weight-normal: 500;
278
+ --font-weight-medium: 600;
279
+ --font-weight-bold: 800;
280
+ --letter-spacing: -0.01em;
281
+ --line-height: 1.55;
282
+
283
+ /* Icon styling - Filled, large, visible */
284
+ --icon-stroke-width: 0;
285
+ --icon-color: #ffffff;
286
+
287
+ /* Transitions - Organic, friendly */
288
+ --transition-fast: 300ms;
289
+ --transition-normal: 500ms;
290
+ --transition-slow: 750ms;
291
+ --transition-timing: cubic-bezier(0.16, 1, 0.3, 1);
292
+
293
+ /* Hover/Active transforms - Bigger lift for touch */
294
+ --hover-scale: 1.03;
295
+ --hover-translate-y: -3px;
296
+ --hover-translate-x: 0;
297
+ --active-scale: 0.96;
298
+ --active-translate-y: 1px;
299
+
300
+ /* Focus ring - Thick coral */
301
+ --focus-ring-width: 3px;
302
+ --focus-ring-offset: 3px;
303
+ --focus-ring-color: #ff6b5e;
304
+
305
+ /* Density axis — spacing scale (extra-spacious, 12pt rhythm) */
306
+ --space-0: 0px;
307
+ --space-1: 4px;
308
+ --space-2: 8px;
309
+ --space-3: 12px;
310
+ --space-4: 18px;
311
+ --space-5: 24px;
312
+ --space-6: 32px;
313
+ --space-7: 40px;
314
+ --space-8: 48px;
315
+ --space-9: 56px;
316
+ --space-10: 64px;
317
+ --space-11: 72px;
318
+ --space-12: 80px;
319
+ /* Density axis — per-element heights (large tap targets) */
320
+ --button-height-sm: 44px;
321
+ --button-height-md: 52px;
322
+ --button-height-lg: 64px;
323
+ --input-height-sm: 44px;
324
+ --input-height-md: 52px;
325
+ --input-height-lg: 64px;
326
+ --row-height-compact: 56px;
327
+ --row-height-normal: 72px;
328
+ --row-height-spacious: 88px;
329
+ /* Density axis — per-element padding (generous) */
330
+ --card-padding-sm: 16px;
331
+ --card-padding-md: 24px;
332
+ --card-padding-lg: 32px;
333
+ --dialog-padding: 32px;
334
+ --section-gap: 48px;
335
+ /* Type axis — family triplet */
336
+ --font-family-display:
337
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
338
+ --font-family-body:
339
+ "Manrope", "Inter", -apple-system, BlinkMacSystemFont, sans-serif;
340
+ --font-family-mono:
341
+ "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
342
+ /* Type axis — size scale (chunky, readable at arm's length) */
343
+ --text-xs: 14px;
344
+ --leading-xs: 20px;
345
+ --text-sm: 16px;
346
+ --leading-sm: 24px;
347
+ --text-base: 18px;
348
+ --leading-base: 28px;
349
+ --text-lg: 22px;
350
+ --leading-lg: 32px;
351
+ --text-xl: 26px;
352
+ --leading-xl: 34px;
353
+ --text-2xl: 32px;
354
+ --leading-2xl: 40px;
355
+ --text-3xl: 40px;
356
+ --leading-3xl: 48px;
357
+ --text-4xl: 48px;
358
+ --leading-4xl: 56px;
359
+ --text-display-1: 64px;
360
+ --leading-display-1: 72px;
361
+ --text-display-2: 80px;
362
+ --leading-display-2: 88px;
363
+ /* Type axis — intent mapping */
364
+ --intent-heading-major-size: 28px;
365
+ --intent-heading-major-weight: var(--font-weight-bold);
366
+ --intent-heading-major-leading: 36px;
367
+ --intent-heading-minor-size: var(--text-lg);
368
+ --intent-heading-minor-weight: var(--font-weight-bold);
369
+ --intent-heading-minor-leading: var(--leading-lg);
370
+ --intent-body-emphasis-size: var(--text-base);
371
+ --intent-body-emphasis-weight: var(--font-weight-medium);
372
+ --intent-body-emphasis-leading: var(--leading-base);
373
+ --intent-body-default-size: var(--text-base);
374
+ --intent-body-default-weight: var(--font-weight-normal);
375
+ --intent-body-default-leading: var(--leading-base);
376
+ --intent-body-quiet-size: var(--text-sm);
377
+ --intent-body-quiet-weight: var(--font-weight-normal);
378
+ --intent-body-quiet-leading: var(--leading-sm);
379
+ --intent-caption-size: var(--text-sm);
380
+ --intent-caption-weight: var(--font-weight-medium);
381
+ --intent-caption-leading: var(--leading-sm);
382
+ --intent-numeric-size: var(--text-base);
383
+ --intent-numeric-weight: var(--font-weight-bold);
384
+ --intent-numeric-leading: var(--leading-base);
385
+ /* Motion axis — duration palette (organic, slower) */
386
+ --duration-instant: 0ms;
387
+ --duration-fast: 300ms;
388
+ --duration-normal: 500ms;
389
+ --duration-slow: 750ms;
390
+ --duration-dramatic: 1000ms;
391
+ /* Motion axis — easing palette (ease-out, friendly) */
392
+ --easing-linear: linear;
393
+ --easing-standard: cubic-bezier(0.16, 1, 0.3, 1);
394
+ --easing-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
395
+ --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
396
+ /* Iconography axis - filled phosphor, large */
397
+ --icon-family: phosphor-fill;
398
+ --icon-default-size: 26px;
399
+ /* Elevation axis - lifted, prominent */
400
+ --elevation-card: var(--shadow-lg);
401
+ --elevation-popover: var(--shadow-lg);
402
+ --elevation-dialog: var(--shadow-lg);
403
+ --elevation-toast: var(--shadow-main);
404
+ /* Geometry axis - pill interactive, chunky containers */
405
+ --radius-container: 16px;
406
+ --radius-interactive: 9999px;
407
+ --radius-pill: 9999px;
408
+ /* Geometry axis - tactile borders */
409
+ --border-hairline: 1px;
410
+ --border-standard: 2px;
411
+ --border-heavy: 3px;
412
+ }
@@ -98,6 +98,111 @@
98
98
  --focus-ring-offset: 2px;
99
99
  --focus-ring-color: #7c3aed;
100
100
 
101
+ /* Layer 1 — backfill (preserves current visual output, see themes/_contract.md) */
102
+ /* Density axis — spacing scale */
103
+ --space-0: 0px;
104
+ --space-1: 4px;
105
+ --space-2: 8px;
106
+ --space-3: 12px;
107
+ --space-4: 16px;
108
+ --space-5: 20px;
109
+ --space-6: 24px;
110
+ --space-7: 28px;
111
+ --space-8: 32px;
112
+ --space-9: 36px;
113
+ --space-10: 40px;
114
+ --space-11: 44px;
115
+ --space-12: 48px;
116
+ /* Density axis — per-element heights */
117
+ --button-height-sm: 28px;
118
+ --button-height-md: 36px;
119
+ --button-height-lg: 44px;
120
+ --input-height-sm: 28px;
121
+ --input-height-md: 36px;
122
+ --input-height-lg: 44px;
123
+ --row-height-compact: 32px;
124
+ --row-height-normal: 40px;
125
+ --row-height-spacious: 48px;
126
+ /* Density axis — per-element padding */
127
+ --card-padding-sm: 12px;
128
+ --card-padding-md: 16px;
129
+ --card-padding-lg: 24px;
130
+ --dialog-padding: 24px;
131
+ --section-gap: 32px;
132
+ /* Type axis — family triplet (aliases existing --font-family for backward compat) */
133
+ --font-family-display: var(--font-family);
134
+ --font-family-body: var(--font-family);
135
+ --font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
136
+ /* Type axis — size scale */
137
+ --text-xs: 12px;
138
+ --leading-xs: 16px;
139
+ --text-sm: 14px;
140
+ --leading-sm: 20px;
141
+ --text-base: 16px;
142
+ --leading-base: 24px;
143
+ --text-lg: 18px;
144
+ --leading-lg: 28px;
145
+ --text-xl: 20px;
146
+ --leading-xl: 28px;
147
+ --text-2xl: 24px;
148
+ --leading-2xl: 32px;
149
+ --text-3xl: 30px;
150
+ --leading-3xl: 36px;
151
+ --text-4xl: 36px;
152
+ --leading-4xl: 40px;
153
+ --text-display-1: 48px;
154
+ --leading-display-1: 52px;
155
+ --text-display-2: 60px;
156
+ --leading-display-2: 64px;
157
+ /* Type axis — intent mapping */
158
+ --intent-heading-major-size: var(--text-2xl);
159
+ --intent-heading-major-weight: var(--font-weight-bold);
160
+ --intent-heading-major-leading: var(--leading-2xl);
161
+ --intent-heading-minor-size: var(--text-lg);
162
+ --intent-heading-minor-weight: var(--font-weight-bold);
163
+ --intent-heading-minor-leading: var(--leading-lg);
164
+ --intent-body-emphasis-size: var(--text-base);
165
+ --intent-body-emphasis-weight: var(--font-weight-medium);
166
+ --intent-body-emphasis-leading: var(--leading-base);
167
+ --intent-body-default-size: var(--text-sm);
168
+ --intent-body-default-weight: var(--font-weight-normal);
169
+ --intent-body-default-leading: var(--leading-sm);
170
+ --intent-body-quiet-size: var(--text-sm);
171
+ --intent-body-quiet-weight: var(--font-weight-normal);
172
+ --intent-body-quiet-leading: var(--leading-sm);
173
+ --intent-caption-size: var(--text-xs);
174
+ --intent-caption-weight: var(--font-weight-normal);
175
+ --intent-caption-leading: var(--leading-xs);
176
+ --intent-numeric-size: var(--text-sm);
177
+ --intent-numeric-weight: var(--font-weight-medium);
178
+ --intent-numeric-leading: var(--leading-sm);
179
+ /* Motion axis — duration palette */
180
+ --duration-instant: 0ms;
181
+ --duration-fast: var(--transition-fast);
182
+ --duration-normal: var(--transition-normal);
183
+ --duration-slow: var(--transition-slow);
184
+ --duration-dramatic: 600ms;
185
+ /* Motion axis — easing palette */
186
+ --easing-linear: linear;
187
+ --easing-standard: var(--transition-timing);
188
+ --easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
189
+ --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
190
+ /* Iconography axis */
191
+ --icon-family: lucide;
192
+ --icon-default-size: 16px;
193
+ /* Elevation axis — per-layer mapping */
194
+ --elevation-card: var(--shadow-sm);
195
+ --elevation-popover: var(--shadow-main);
196
+ --elevation-dialog: var(--shadow-lg);
197
+ --elevation-toast: var(--shadow-main);
198
+ /* Geometry axis — radius rhythm with intent */
199
+ --radius-container: var(--radius-md);
200
+ --radius-interactive: var(--radius-md);
201
+ --radius-pill: var(--radius-full);
202
+ /* Geometry axis — border-width rhythm */
203
+ --border-hairline: 1px;
204
+ --border-standard: var(--border-width);
205
+ --border-heavy: var(--border-width-thick);
101
206
  }
102
207
 
103
208
  /* ==========================================================================
@@ -192,4 +297,109 @@
192
297
  --focus-ring-offset: 2px;
193
298
  --focus-ring-color: #a78bfa;
194
299
 
300
+ /* Layer 1 — backfill (preserves current visual output, see themes/_contract.md) */
301
+ /* Density axis — spacing scale */
302
+ --space-0: 0px;
303
+ --space-1: 4px;
304
+ --space-2: 8px;
305
+ --space-3: 12px;
306
+ --space-4: 16px;
307
+ --space-5: 20px;
308
+ --space-6: 24px;
309
+ --space-7: 28px;
310
+ --space-8: 32px;
311
+ --space-9: 36px;
312
+ --space-10: 40px;
313
+ --space-11: 44px;
314
+ --space-12: 48px;
315
+ /* Density axis — per-element heights */
316
+ --button-height-sm: 28px;
317
+ --button-height-md: 36px;
318
+ --button-height-lg: 44px;
319
+ --input-height-sm: 28px;
320
+ --input-height-md: 36px;
321
+ --input-height-lg: 44px;
322
+ --row-height-compact: 32px;
323
+ --row-height-normal: 40px;
324
+ --row-height-spacious: 48px;
325
+ /* Density axis — per-element padding */
326
+ --card-padding-sm: 12px;
327
+ --card-padding-md: 16px;
328
+ --card-padding-lg: 24px;
329
+ --dialog-padding: 24px;
330
+ --section-gap: 32px;
331
+ /* Type axis — family triplet (aliases existing --font-family for backward compat) */
332
+ --font-family-display: var(--font-family);
333
+ --font-family-body: var(--font-family);
334
+ --font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
335
+ /* Type axis — size scale */
336
+ --text-xs: 12px;
337
+ --leading-xs: 16px;
338
+ --text-sm: 14px;
339
+ --leading-sm: 20px;
340
+ --text-base: 16px;
341
+ --leading-base: 24px;
342
+ --text-lg: 18px;
343
+ --leading-lg: 28px;
344
+ --text-xl: 20px;
345
+ --leading-xl: 28px;
346
+ --text-2xl: 24px;
347
+ --leading-2xl: 32px;
348
+ --text-3xl: 30px;
349
+ --leading-3xl: 36px;
350
+ --text-4xl: 36px;
351
+ --leading-4xl: 40px;
352
+ --text-display-1: 48px;
353
+ --leading-display-1: 52px;
354
+ --text-display-2: 60px;
355
+ --leading-display-2: 64px;
356
+ /* Type axis — intent mapping */
357
+ --intent-heading-major-size: var(--text-2xl);
358
+ --intent-heading-major-weight: var(--font-weight-bold);
359
+ --intent-heading-major-leading: var(--leading-2xl);
360
+ --intent-heading-minor-size: var(--text-lg);
361
+ --intent-heading-minor-weight: var(--font-weight-bold);
362
+ --intent-heading-minor-leading: var(--leading-lg);
363
+ --intent-body-emphasis-size: var(--text-base);
364
+ --intent-body-emphasis-weight: var(--font-weight-medium);
365
+ --intent-body-emphasis-leading: var(--leading-base);
366
+ --intent-body-default-size: var(--text-sm);
367
+ --intent-body-default-weight: var(--font-weight-normal);
368
+ --intent-body-default-leading: var(--leading-sm);
369
+ --intent-body-quiet-size: var(--text-sm);
370
+ --intent-body-quiet-weight: var(--font-weight-normal);
371
+ --intent-body-quiet-leading: var(--leading-sm);
372
+ --intent-caption-size: var(--text-xs);
373
+ --intent-caption-weight: var(--font-weight-normal);
374
+ --intent-caption-leading: var(--leading-xs);
375
+ --intent-numeric-size: var(--text-sm);
376
+ --intent-numeric-weight: var(--font-weight-medium);
377
+ --intent-numeric-leading: var(--leading-sm);
378
+ /* Motion axis — duration palette */
379
+ --duration-instant: 0ms;
380
+ --duration-fast: var(--transition-fast);
381
+ --duration-normal: var(--transition-normal);
382
+ --duration-slow: var(--transition-slow);
383
+ --duration-dramatic: 600ms;
384
+ /* Motion axis — easing palette */
385
+ --easing-linear: linear;
386
+ --easing-standard: var(--transition-timing);
387
+ --easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
388
+ --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
389
+ /* Iconography axis */
390
+ --icon-family: lucide;
391
+ --icon-default-size: 16px;
392
+ /* Elevation axis — per-layer mapping */
393
+ --elevation-card: var(--shadow-sm);
394
+ --elevation-popover: var(--shadow-main);
395
+ --elevation-dialog: var(--shadow-lg);
396
+ --elevation-toast: var(--shadow-main);
397
+ /* Geometry axis — radius rhythm with intent */
398
+ --radius-container: var(--radius-md);
399
+ --radius-interactive: var(--radius-md);
400
+ --radius-pill: var(--radius-full);
401
+ /* Geometry axis — border-width rhythm */
402
+ --border-hairline: 1px;
403
+ --border-standard: var(--border-width);
404
+ --border-heavy: var(--border-width-thick);
195
405
  }