@mirror-physics/fractal-ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,670 @@
1
+ /* =========================================
2
+ Design System Color Tokens
3
+ =========================================
4
+
5
+ IMPORTANT: Never use primitives (Layer 1) directly in component code.
6
+ Always reference semantic tokens (Layer 2). If a semantic token doesn't
7
+ exist for your use case, add one here that maps to a primitive.
8
+ */
9
+
10
+ :root {
11
+ /* ============================================================
12
+ LAYER 1: PRIMITIVES — Color Scales (0–900)
13
+ ============================================================ */
14
+
15
+ /* Grey — true neutral UI scale, very slight cool lean */
16
+ --grey-0: #FEFEFE;
17
+ --grey-50: #FAFAFA;
18
+ --grey-100: #F2F2F3;
19
+ --grey-200: #E6E6E7;
20
+ --grey-300: #D4D4D6;
21
+ --grey-400: #929295;
22
+ --grey-500: #6F6F72;
23
+ --grey-600: #565659;
24
+ --grey-700: #404042;
25
+ --grey-800: #2D2D2F;
26
+ --grey-900: #1C1C1E;
27
+
28
+ /* Blue */
29
+ --blue-0: #FCFFFF;
30
+ --blue-50: #F1FEFF;
31
+ --blue-100: #E0F1F4;
32
+ --blue-200: #BFDFE6;
33
+ --blue-300: #9FCEDB;
34
+ --blue-400: #6BAFC4;
35
+ --blue-500: #047897;
36
+ --blue-600: #025F78;
37
+ --blue-700: #054F6A;
38
+ --blue-800: #044055;
39
+ --blue-900: #03303F;
40
+
41
+ /* Pink */
42
+ --pink-0: #FFFCFE;
43
+ --pink-50: #FFF9FF;
44
+ --pink-100: #F5E8F3;
45
+ --pink-200: #F5B8EE;
46
+ --pink-300: #EFA0E6;
47
+ --pink-400: #D966CC;
48
+ --pink-500: #A81696;
49
+ --pink-600: #8A1079;
50
+ --pink-700: #6C0B5E;
51
+ --pink-800: #55094B;
52
+ --pink-900: #3E0638;
53
+
54
+ /* Orange */
55
+ --orange-0: #FFFCFB;
56
+ --orange-50: #FFF9F5;
57
+ --orange-100: #FAEADE;
58
+ --orange-200: #EED4BF;
59
+ --orange-300: #DBB397;
60
+ --orange-400: #CC8F66;
61
+ --orange-500: #9A5E2A;
62
+ --orange-600: #74431A;
63
+ --orange-700: #563010;
64
+ --orange-800: #3D2009;
65
+ --orange-900: #281204;
66
+
67
+ /* Green */
68
+ --green-0: #F5FEF9;
69
+ --green-50: #F2FEF8;
70
+ --green-100: #E0F4EA;
71
+ --green-200: #C0E5D2;
72
+ --green-300: #98D4B6;
73
+ --green-400: #3EA676;
74
+ --green-500: #0A7B54;
75
+ --green-600: #066141;
76
+ --green-700: #044F34;
77
+ --green-800: #033F29;
78
+ --green-900: #022F1E;
79
+
80
+ /* Red */
81
+ --red-0: #FFFBFB;
82
+ --red-50: #FFF5F5;
83
+ --red-100: #FBE0E0;
84
+ --red-200: #F0C4C4;
85
+ --red-300: #E09C9C;
86
+ --red-400: #CC6464;
87
+ --red-500: #A11B1B;
88
+ --red-600: #811212;
89
+ --red-700: #660D0D;
90
+ --red-800: #500A0A;
91
+ --red-900: #3B0707;
92
+
93
+ /* Yellow (400 is bg-only per warm-hue exception) */
94
+ --yellow-0: #FFFEFB;
95
+ --yellow-50: #FFFDF5;
96
+ --yellow-100: #FBF2DA;
97
+ --yellow-200: #F0E2B8;
98
+ --yellow-300: #DBCA8A;
99
+ --yellow-400: #C0A64E;
100
+ --yellow-500: #866B0E;
101
+ --yellow-600: #6A5308;
102
+ --yellow-700: #534005;
103
+ --yellow-800: #403103;
104
+ --yellow-900: #2E2302;
105
+
106
+ /* Purple */
107
+ --purple-0: #FDFCFF;
108
+ --purple-50: #FAF7FF;
109
+ --purple-100: #F0E8FE;
110
+ --purple-200: #DFD0FC;
111
+ --purple-300: #C9B0F8;
112
+ --purple-400: #A882F2;
113
+ --purple-500: #8B5CF6;
114
+ --purple-600: #7240D9;
115
+ --purple-700: #5B2FB5;
116
+ --purple-800: #462493;
117
+ --purple-900: #331A6E;
118
+
119
+ /* ============================================================
120
+ LAYER 2: SEMANTIC TOKENS — Purpose-driven
121
+ ============================================================ */
122
+
123
+ /* ---- Core ---- */
124
+ --bg-canvas: var(--grey-0);
125
+ --bg-surface-1: var(--grey-50);
126
+ --bg-surface-2: var(--grey-200);
127
+ --bg-surface-3: var(--grey-400);
128
+ --bg-inverse: var(--grey-800);
129
+ --bg-inverse-subtle: var(--grey-700);
130
+ --bg-inverse-surface: var(--grey-600);
131
+ --overlay: rgba(28, 28, 24, 0.5);
132
+ --transparent: rgba(255, 255, 255, 0);
133
+
134
+ /* Hover */
135
+ --hover-surface: var(--grey-100);
136
+ --hover-on-surface: var(--grey-50);
137
+ --hover-canvas: var(--grey-100);
138
+
139
+ /* Navigation */
140
+ --nav-surface: var(--grey-100);
141
+ --nav-border: var(--grey-200);
142
+ --nav-hover: var(--grey-200);
143
+ --nav-selected: var(--grey-300);
144
+
145
+ /* ---- Foreground (text, icons, UI marks) ---- */
146
+ --fg-primary: var(--grey-900);
147
+ --fg-secondary: var(--grey-600);
148
+ --fg-tertiary: var(--grey-500);
149
+ --fg-disabled: var(--grey-300);
150
+ --fg-placeholder: var(--grey-400);
151
+ --fg-inverse: var(--grey-50);
152
+ --fg-inverse-secondary: var(--grey-300);
153
+
154
+ /* ---- Borders ---- */
155
+ --border-subtle: var(--grey-200);
156
+ --border-default: var(--grey-300);
157
+ --border-strong: var(--grey-400);
158
+ --border-focus: var(--blue-500);
159
+ --border-inverse: rgba(255, 255, 255, 0.12);
160
+ --border-inverse-strong: rgba(255, 255, 255, 0.20);
161
+
162
+ /* ---- Accent (Blue) ---- */
163
+ --accent-default: var(--blue-500);
164
+ --accent-hover: var(--blue-400);
165
+ --accent-subtle: var(--blue-200);
166
+ --accent-surface-stroke: var(--blue-100);
167
+ --accent-surface-hover: var(--blue-100);
168
+ --accent-surface: var(--blue-50);
169
+ --accent-text: var(--blue-900);
170
+ --accent-bg: var(--blue-0);
171
+
172
+ /* ---- Success (Green) ---- */
173
+ --success-default: var(--green-500);
174
+ --success-hover: var(--green-400);
175
+ --success-subtle: var(--green-200);
176
+ --success-surface-stroke: var(--green-100);
177
+ --success-surface-hover: var(--green-100);
178
+ --success-surface: var(--green-50);
179
+ --success-text: var(--green-900);
180
+ --success-bg: var(--green-0);
181
+
182
+ /* ---- Error (Red) ---- */
183
+ --error-default: var(--red-500);
184
+ --error-hover: var(--red-400);
185
+ --error-subtle: var(--red-200);
186
+ --error-surface-stroke: var(--red-100);
187
+ --error-surface-hover: var(--red-100);
188
+ --error-surface: var(--red-50);
189
+ --error-text: var(--red-900);
190
+ --error-bg: var(--red-0);
191
+ --danger-button-fg: var(--red-500);
192
+ --danger-button-surface: var(--red-100);
193
+ --danger-button-surface-hover: var(--red-200);
194
+
195
+ /* ---- Warning (Yellow) ---- */
196
+ --warning-default: var(--yellow-500);
197
+ --warning-hover: var(--yellow-400);
198
+ --warning-subtle: var(--yellow-200);
199
+ --warning-surface-stroke: var(--yellow-100);
200
+ --warning-surface-hover: var(--yellow-100);
201
+ --warning-surface: var(--yellow-50);
202
+ --warning-text: var(--yellow-900);
203
+ --warning-bg: var(--yellow-0);
204
+
205
+ /* ---- Pink ---- */
206
+ --pink-default: var(--pink-500);
207
+ --pink-hover: var(--pink-400);
208
+ --pink-subtle: var(--pink-200);
209
+ --pink-surface-stroke: var(--pink-100);
210
+ --pink-surface-hover: var(--pink-100);
211
+ --pink-surface: var(--pink-50);
212
+ --pink-text: var(--pink-900);
213
+ --pink-bg: var(--pink-0);
214
+
215
+ /* ---- Orange ---- */
216
+ --orange-default: var(--orange-500);
217
+ --orange-hover: var(--orange-400);
218
+ --orange-subtle: var(--orange-200);
219
+ --orange-surface-stroke: var(--orange-100);
220
+ --orange-surface-hover: var(--orange-100);
221
+ --orange-surface: var(--orange-50);
222
+ --orange-text: var(--orange-900);
223
+ --orange-bg: var(--orange-0);
224
+ --orange-disabled: var(--orange-300);
225
+
226
+ /* ---- Purple ---- */
227
+ --purple-default: var(--purple-500);
228
+ --purple-hover: var(--purple-400);
229
+ --purple-subtle: var(--purple-200);
230
+ --purple-surface-stroke: var(--purple-100);
231
+ --purple-surface-hover: var(--purple-100);
232
+ --purple-surface: var(--purple-50);
233
+ --purple-text: var(--purple-900);
234
+ --purple-bg: var(--purple-0);
235
+
236
+ /* ---- Border Shorthands ---- */
237
+ --border-dashed-green: 1px dashed var(--green-500);
238
+ --border-dashed-orange: 1px dashed var(--orange-500);
239
+ --border-dashed-subtle: 1px dashed var(--border-subtle);
240
+
241
+ /* ============================================================
242
+ EXPRESSIVE COLOR SCHEMES
243
+ Vivid backgrounds, borders, and surfaces used for themed
244
+ cards, sections, and highlights (from website color system).
245
+ ============================================================ */
246
+
247
+ --scheme-blue-bg: #D6F2F9;
248
+ --scheme-blue-border: #047897;
249
+ --scheme-blue-surface: #ECFBFF;
250
+
251
+ --scheme-pink-bg: #FEE5FB;
252
+ --scheme-pink-border: #C55FB8;
253
+ --scheme-pink-surface: #FFF7FE;
254
+
255
+ --scheme-green-bg: #D4F4E1;
256
+ --scheme-green-border: #1F8A4A;
257
+ --scheme-green-surface: #F3FFF8;
258
+
259
+ --scheme-orange-bg: #FAE0CB;
260
+ --scheme-orange-border: #7F4308;
261
+ --scheme-orange-surface: #FFF8F3;
262
+
263
+ --scheme-yellow-bg: #FFEFCC;
264
+ --scheme-yellow-border: #C9A00C;
265
+ --scheme-yellow-surface: #FFFDF5;
266
+
267
+ /* ============================================================
268
+ PALETTE COLORS — Strong fills for buttons and filled badges.
269
+ pl-[color]-strong = button fill (rest)
270
+ pl-[color]-strong-hover = button fill (hover)
271
+ pl-[color]-md = medium tone (subtle badge bg)
272
+ pl-[color]-light = very light bg
273
+ ============================================================ */
274
+
275
+ --pl-blue-strong: #047897;
276
+ --pl-blue-strong-hover: #036580;
277
+ --pl-blue-md: #BFDFE6;
278
+ --pl-blue-light: #FCFFFF;
279
+
280
+ --pl-pink-strong: #C55FB8;
281
+ --pl-pink-strong-hover: #A84D9D;
282
+ --pl-pink-md: #EECAEA;
283
+ --pl-pink-light: #FFFCFF;
284
+
285
+ --pl-green-strong: #0D843D;
286
+ --pl-green-strong-hover: #0A6B31;
287
+ --pl-green-md: #AFE1C3;
288
+ --pl-green-light: #F8FEFA;
289
+
290
+ --pl-orange-strong: #7F4308;
291
+ --pl-orange-strong-hover: #693706;
292
+ --pl-orange-md: #EED4BF;
293
+ --pl-orange-light: #FFF9F5;
294
+
295
+ --pl-yellow-strong: #816500;
296
+ --pl-yellow-strong-hover: #735A00;
297
+ --pl-yellow-md: #E2E0A7;
298
+ --pl-yellow-light: #FFFDF5;
299
+
300
+ --pl-red-strong: #840D0F;
301
+ --pl-red-strong-hover: #6B0A0C;
302
+ --pl-red-md: #EBC6C7;
303
+ --pl-red-light: #FFF4F4;
304
+ }
305
+
306
+ /* ============================================================
307
+ DARK MODE — Semantic token overrides
308
+ Primitives stay identical. Only the semantic mappings change.
309
+ ============================================================ */
310
+
311
+ @media (prefers-color-scheme: dark) {
312
+ :root {
313
+ /* ---- Core ---- */
314
+ --bg-canvas: var(--grey-900);
315
+ --bg-surface-1: var(--grey-800);
316
+ --bg-surface-2: var(--grey-700);
317
+ --bg-surface-3: var(--grey-600);
318
+ --bg-inverse: var(--grey-50);
319
+ --bg-inverse-subtle: var(--grey-100);
320
+ --bg-inverse-surface: var(--grey-200);
321
+ --overlay: rgba(0, 0, 0, 0.6);
322
+ --transparent: rgba(0, 0, 0, 0);
323
+
324
+ /* Hover */
325
+ --hover-surface: var(--grey-700);
326
+ --hover-on-surface: var(--grey-800);
327
+ --hover-canvas: var(--grey-700);
328
+
329
+ /* Navigation */
330
+ --nav-surface: var(--grey-700);
331
+ --nav-border: var(--grey-600);
332
+ --nav-hover: var(--grey-600);
333
+ --nav-selected: var(--grey-500);
334
+
335
+ /* ---- Foreground (text, icons, UI marks) ---- */
336
+ --fg-primary: var(--grey-50);
337
+ --fg-secondary: var(--grey-200);
338
+ --fg-tertiary: var(--grey-300);
339
+ --fg-disabled: var(--grey-600);
340
+ --fg-placeholder: var(--grey-500);
341
+ --fg-inverse: var(--grey-900);
342
+ --fg-inverse-secondary: var(--grey-600);
343
+
344
+ /* ---- Borders ---- */
345
+ --border-subtle: var(--grey-700);
346
+ --border-default: var(--grey-600);
347
+ --border-strong: var(--grey-500);
348
+ --border-focus: var(--blue-400);
349
+ --border-inverse: rgba(0, 0, 0, 0.12);
350
+ --border-inverse-strong: rgba(0, 0, 0, 0.20);
351
+
352
+ /* ---- Accent (Blue) ---- */
353
+ --accent-default: var(--blue-400);
354
+ --accent-hover: var(--blue-300);
355
+ --accent-subtle: var(--blue-700);
356
+ --accent-surface-stroke: var(--blue-700);
357
+ --accent-surface-hover: var(--blue-700);
358
+ --accent-surface: var(--blue-800);
359
+ --accent-text: var(--blue-100);
360
+ --accent-bg: var(--blue-900);
361
+
362
+ /* ---- Success (Green) ---- */
363
+ --success-default: var(--green-400);
364
+ --success-hover: var(--green-300);
365
+ --success-subtle: var(--green-700);
366
+ --success-surface-stroke: var(--green-700);
367
+ --success-surface-hover: var(--green-700);
368
+ --success-surface: var(--green-800);
369
+ --success-text: var(--green-100);
370
+ --success-bg: var(--green-900);
371
+
372
+ /* ---- Error (Red) ---- */
373
+ --error-default: var(--red-400);
374
+ --error-hover: var(--red-300);
375
+ --error-subtle: var(--red-700);
376
+ --error-surface-stroke: var(--red-700);
377
+ --error-surface-hover: var(--red-700);
378
+ --error-surface: var(--red-800);
379
+ --error-text: var(--red-100);
380
+ --error-bg: var(--red-900);
381
+ --danger-button-fg: var(--red-300);
382
+ --danger-button-surface: var(--red-800);
383
+ --danger-button-surface-hover: var(--red-700);
384
+
385
+ /* ---- Warning (Yellow) ---- */
386
+ --warning-default: var(--yellow-400);
387
+ --warning-hover: var(--yellow-300);
388
+ --warning-subtle: var(--yellow-700);
389
+ --warning-surface-stroke: var(--yellow-700);
390
+ --warning-surface-hover: var(--yellow-700);
391
+ --warning-surface: var(--yellow-800);
392
+ --warning-text: var(--yellow-100);
393
+ --warning-bg: var(--yellow-900);
394
+
395
+ /* ---- Pink ---- */
396
+ --pink-default: var(--pink-400);
397
+ --pink-hover: var(--pink-300);
398
+ --pink-subtle: var(--pink-700);
399
+ --pink-surface-stroke: var(--pink-700);
400
+ --pink-surface-hover: var(--pink-700);
401
+ --pink-surface: var(--pink-800);
402
+ --pink-text: var(--pink-100);
403
+ --pink-bg: var(--pink-900);
404
+
405
+ /* ---- Orange ---- */
406
+ --orange-default: var(--orange-400);
407
+ --orange-hover: var(--orange-300);
408
+ --orange-subtle: var(--orange-700);
409
+ --orange-surface-stroke: var(--orange-700);
410
+ --orange-surface-hover: var(--orange-700);
411
+ --orange-surface: var(--orange-800);
412
+ --orange-text: var(--orange-100);
413
+ --orange-bg: var(--orange-900);
414
+ --orange-disabled: var(--orange-600);
415
+
416
+ /* ---- Purple ---- */
417
+ --purple-default: var(--purple-400);
418
+ --purple-hover: var(--purple-300);
419
+ --purple-subtle: var(--purple-700);
420
+ --purple-surface-stroke: var(--purple-700);
421
+ --purple-surface-hover: var(--purple-700);
422
+ --purple-surface: var(--purple-800);
423
+ --purple-text: var(--purple-100);
424
+ --purple-bg: var(--purple-900);
425
+
426
+ /* ---- Border Shorthands ---- */
427
+ --border-dashed-green: 1px dashed var(--green-400);
428
+ --border-dashed-orange: 1px dashed var(--orange-400);
429
+ --border-dashed-subtle: 1px dashed var(--border-subtle);
430
+ }
431
+ }
432
+
433
+ /* =========================================
434
+ Typography - Font Declarations & Tokens
435
+ ========================================= */
436
+
437
+ /* ---- Custom Font Declarations ---- */
438
+ @font-face {
439
+ font-family: 'Figtree';
440
+ src: url('./assets/typography/Figtree-VariableFont_wght.ttf') format('truetype-variations');
441
+ font-weight: 300 900;
442
+ font-style: normal;
443
+ font-display: swap;
444
+ }
445
+
446
+ @font-face {
447
+ font-family: 'Geist Mono';
448
+ src: url('./assets/typography/GeistMono-VariableFont_wght.ttf') format('truetype');
449
+ font-weight: 100 900;
450
+ font-style: normal;
451
+ font-display: swap;
452
+ }
453
+
454
+ /* Math & Greek fallback. Figtree and Geist Mono have no glyphs for Greek
455
+ letters (α, β, Δ, π, …) or math operators (∑, ∫, ∂, ∇, ≈, √, …), which
456
+ appear constantly in scientific / chemistry reports. Noto Sans Math is
457
+ listed after the primary faces so the browser borrows it per-glyph only
458
+ for the symbols Figtree/Geist Mono lack — normal Latin text still renders
459
+ in Figtree. See typography-guide.md → Math & Greek Fallback. */
460
+ @font-face {
461
+ font-family: 'Noto Sans Math';
462
+ src: url('./assets/typography/NotoSansMath-Regular.ttf') format('truetype');
463
+ font-weight: 400;
464
+ font-style: normal;
465
+ font-display: swap;
466
+ }
467
+
468
+ /* ---- Font Family Variables ---- */
469
+ :root {
470
+ --font-sans: 'Figtree', 'Noto Sans Math', system-ui, sans-serif;
471
+ --font-mono: 'Geist Mono', 'Noto Sans Math', monospace;
472
+ }
473
+
474
+ /* ---- Base Reset ---- */
475
+ body {
476
+ font-family: var(--font-sans);
477
+ }
478
+
479
+ /* =========================================
480
+ Typographic Tokens
481
+ ========================================= */
482
+
483
+ /* ---- Display ---- */
484
+ .display-01 {
485
+ font-family: var(--font-sans);
486
+ font-size: 1.75rem;
487
+ font-weight: 600;
488
+ line-height: 1.2;
489
+ letter-spacing: -0.02em;
490
+ }
491
+
492
+ .display-02 {
493
+ font-family: var(--font-sans);
494
+ font-size: 1.25rem;
495
+ font-weight: 600;
496
+ line-height: 1.3;
497
+ }
498
+
499
+ /* ---- Headers ---- */
500
+ .header-01 {
501
+ font-family: var(--font-sans);
502
+ font-size: 1rem;
503
+ font-weight: 500;
504
+ line-height: 1.4;
505
+ }
506
+
507
+ .header-02 {
508
+ font-family: var(--font-sans);
509
+ font-size: 0.875rem;
510
+ font-weight: 500;
511
+ line-height: 1.4;
512
+ }
513
+
514
+ .header-03 {
515
+ font-family: var(--font-sans);
516
+ font-size: 0.75rem;
517
+ font-weight: 500;
518
+ line-height: 1.4;
519
+ }
520
+
521
+ /* ---- Body ---- */
522
+ .body-01 {
523
+ font-family: var(--font-sans);
524
+ font-size: 1rem;
525
+ font-weight: 400;
526
+ line-height: 1.5;
527
+ }
528
+
529
+ .body-02 {
530
+ font-family: var(--font-sans);
531
+ font-size: 0.875rem;
532
+ font-weight: 400;
533
+ line-height: 1.4;
534
+ }
535
+
536
+ /* ---- Caption ---- */
537
+ .caption-01 {
538
+ font-family: var(--font-sans);
539
+ font-size: 0.75rem;
540
+ font-weight: 400;
541
+ line-height: 1.4;
542
+ }
543
+
544
+ /* ---- Label ---- */
545
+ .label-01 {
546
+ font-family: var(--font-sans);
547
+ font-size: 0.75rem;
548
+ font-weight: 600;
549
+ line-height: 1.4;
550
+ letter-spacing: 0.5px;
551
+ text-transform: uppercase;
552
+ }
553
+
554
+ /* ---- Meta ---- */
555
+ .meta-01 {
556
+ font-family: var(--font-mono);
557
+ font-size: 0.625rem;
558
+ font-weight: 400;
559
+ line-height: 1.4;
560
+ }
561
+
562
+ /* ---- Code ---- */
563
+ .code-01 {
564
+ font-family: var(--font-mono);
565
+ font-size: 1rem;
566
+ font-weight: 400;
567
+ line-height: 1.5;
568
+ }
569
+
570
+ .code-02 {
571
+ font-family: var(--font-mono);
572
+ font-size: 0.875rem;
573
+ font-weight: 400;
574
+ line-height: 1.4;
575
+ }
576
+
577
+ .code-03 {
578
+ font-family: var(--font-mono);
579
+ font-size: 0.75rem;
580
+ font-weight: 400;
581
+ line-height: 1.4;
582
+ }
583
+
584
+ :root {
585
+ /* ---- Border Radius ---- */
586
+ --radius-sm: 4px;
587
+ --radius-md: 6px;
588
+ --radius-lg: 8px;
589
+ --radius-xl: 12px;
590
+ --radius-full: 9999px;
591
+
592
+ /* ---- Spacing (8pt Grid) ---- */
593
+ --space-0: 0px;
594
+ --space-1: 4px; /* fine-tuning inside components */
595
+ --space-2: 8px; /* tight spacing, icon gaps */
596
+ --space-3: 12px; /* label-to-input gap */
597
+ --space-4: 16px; /* default internal padding */
598
+ --space-5: 20px; /* compact section spacing */
599
+ --space-6: 24px; /* card padding, form field gaps */
600
+ --space-7: 32px; /* section spacing */
601
+ --space-8: 40px; /* large section gaps */
602
+ --space-9: 48px; /* section dividers */
603
+ --space-10: 64px; /* page section spacing */
604
+ --space-11: 80px; /* hero spacing */
605
+ --space-12: 96px; /* major page divisions */
606
+ --space-13: 128px; /* page-level whitespace */
607
+
608
+ /* ---- Responsive Breakpoints ---- */
609
+ --bp-sm: 640px; /* mobile landscape */
610
+ --bp-md: 768px; /* tablet portrait */
611
+ --bp-lg: 1024px; /* tablet landscape / small desktop */
612
+ --bp-xl: 1280px; /* desktop */
613
+ --bp-2xl: 1536px; /* large desktop */
614
+
615
+ /* ---- Shadows ---- */
616
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.04);
617
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
618
+ --shadow-md: 0 4px 6px rgba(0,0,0,0.06), 0 2px 4px rgba(0,0,0,0.04);
619
+ --shadow-lg: 0 10px 15px rgba(0,0,0,0.06), 0 4px 6px rgba(0,0,0,0.04);
620
+ --shadow-xl: 0 20px 25px rgba(0,0,0,0.08), 0 8px 10px rgba(0,0,0,0.04);
621
+
622
+ /* ---- Layout Constants ---- */
623
+ --panel-width: 256px;
624
+ }
625
+
626
+ /* =========================================
627
+ Design System Motion Tokens
628
+ =========================================
629
+
630
+ IMPORTANT: Use these tokens for all transitions and animations.
631
+ Never use raw CSS easing keywords (ease, ease-out, etc.) or
632
+ hardcoded cubic-bezier values — reference these variables instead.
633
+ */
634
+
635
+ :root {
636
+ /* ============================================================
637
+ EASING FUNCTIONS
638
+ ============================================================ */
639
+
640
+ /* Entering elements — snappy deceleration */
641
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
642
+
643
+ /* Exiting elements — gentle acceleration */
644
+ --ease-in: cubic-bezier(0.7, 0, 0.84, 0);
645
+
646
+ /* Repositioning / state changes */
647
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
648
+
649
+ /* ============================================================
650
+ DURATION TOKENS
651
+ ============================================================ */
652
+
653
+ /* Interactive — hover, press, toggle */
654
+ --duration-fast: 120ms;
655
+
656
+ /* Tooltips, dropdowns, small reveals */
657
+ --duration-normal: 200ms;
658
+
659
+ /* Modals, panels, page transitions */
660
+ --duration-slow: 300ms;
661
+
662
+ /* Ambient loops — breathing, shimmer */
663
+ --duration-ambient: 1500ms;
664
+
665
+ /* ============================================================
666
+ STAGGER
667
+ ============================================================ */
668
+
669
+ --stagger-step: 60ms;
670
+ }