@7onic-ui/tokens 0.1.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.
@@ -0,0 +1,879 @@
1
+ /**
2
+ * Design System - Tailwind CSS v4 Theme
3
+ * ⚠️ Auto-generated from figma-tokens.json — DO NOT EDIT
4
+ *
5
+ * This file is a MAPPING layer between variables.css and Tailwind v4 utilities.
6
+ * Actual values live in variables.css (single source of truth).
7
+ *
8
+ * - var() references: auto-sync when variables.css changes
9
+ * - Hardcoded values: same-name variables (overridden by variables.css at runtime)
10
+ * - Dark mode: handled entirely by variables.css .dark block (no duplication here)
11
+ *
12
+ * Usage:
13
+ * ```css
14
+ * @import "tailwindcss";
15
+ * @import "@7onic-ui/react/tokens"; <- variables.css (values)
16
+ * @import "@7onic-ui/react/theme"; <- this file (mapping)
17
+ * ```
18
+ */
19
+
20
+ @theme {
21
+ /* =============================================
22
+ Colors — var() references (different names → auto-sync)
23
+ When variables.css changes, these follow automatically.
24
+ Dark mode: variables.css .dark changes the source → auto-cascade.
25
+ ============================================= */
26
+
27
+ /* Background */
28
+ --color-background: #FFFFFF; /* same name → overridden by variables.css */
29
+ --color-background-paper: #FFFFFF; /* same name → overridden by variables.css */
30
+ --color-background-elevated: #FFFFFF; /* same name → overridden by variables.css */
31
+ --color-background-muted: #F4F4F5; /* same name → overridden by variables.css */
32
+
33
+ /* Foreground */
34
+ --color-foreground: var(--color-text);
35
+
36
+ /* Primary */
37
+ --color-primary: #15A0AC; /* same name → overridden by variables.css */
38
+ --color-primary-hover: #107A84; /* same name → overridden by variables.css */
39
+ --color-primary-active: #107A84; /* same name → overridden by variables.css */
40
+ --color-primary-tint: #DBF8FB; /* same name → overridden by variables.css */
41
+ --color-primary-foreground: var(--color-primary-text);
42
+
43
+ /* Secondary */
44
+ --color-secondary: #4E4E60; /* same name → overridden by variables.css */
45
+ --color-secondary-hover: #3B3B4A; /* same name → overridden by variables.css */
46
+ --color-secondary-active: #3B3B4A; /* same name → overridden by variables.css */
47
+ --color-secondary-tint: #F4F4F5; /* same name → overridden by variables.css */
48
+ --color-secondary-foreground: var(--color-secondary-text);
49
+
50
+ /* Success */
51
+ --color-success: #059669; /* same name → overridden by variables.css */
52
+ --color-success-hover: #047857; /* same name → overridden by variables.css */
53
+ --color-success-active: #047857; /* same name → overridden by variables.css */
54
+ --color-success-tint: #ECFDF5; /* same name → overridden by variables.css */
55
+ --color-success-foreground: var(--color-success-text);
56
+
57
+ /* Warning */
58
+ --color-warning: #F59E0B; /* same name → overridden by variables.css */
59
+ --color-warning-hover: #D97706; /* same name → overridden by variables.css */
60
+ --color-warning-active: #D97706; /* same name → overridden by variables.css */
61
+ --color-warning-tint: #FFFBEB; /* same name → overridden by variables.css */
62
+ --color-warning-foreground: var(--color-warning-text);
63
+
64
+ /* Error */
65
+ --color-error: #DC2626; /* same name → overridden by variables.css */
66
+ --color-error-hover: #B91C1C; /* same name → overridden by variables.css */
67
+ --color-error-active: #B91C1C; /* same name → overridden by variables.css */
68
+ --color-error-tint: #FEF2F2; /* same name → overridden by variables.css */
69
+ --color-error-foreground: var(--color-error-text);
70
+ --color-error-bg: var(--color-error-bg);
71
+
72
+ /* Info */
73
+ --color-info: #2563EB; /* same name → overridden by variables.css */
74
+ --color-info-hover: #1D4ED8; /* same name → overridden by variables.css */
75
+ --color-info-active: #1D4ED8; /* same name → overridden by variables.css */
76
+ --color-info-tint: #EFF6FF; /* same name → overridden by variables.css */
77
+ --color-info-foreground: var(--color-info-text);
78
+
79
+ /* Border */
80
+ --color-border: #E4E4E6; /* same name → overridden by variables.css */
81
+ --color-border-strong: #D4D4D5; /* same name → overridden by variables.css */
82
+ --color-border-subtle: #F4F4F5; /* same name → overridden by variables.css */
83
+
84
+ /* Muted */
85
+ --color-muted: var(--color-background-muted);
86
+ --color-muted-foreground: var(--color-text-muted);
87
+
88
+ /* Ring (focus) */
89
+ --color-ring: var(--color-focus-ring);
90
+ --color-ring-error: var(--color-focus-ring-error);
91
+
92
+ /* Disabled */
93
+ --color-disabled: #D4D4D5; /* same name → overridden by variables.css */
94
+ --color-disabled-foreground: var(--color-disabled-text);
95
+
96
+ /* Chart */
97
+ --color-chart-1: #4570E8; /* same name → overridden by variables.css */
98
+ --color-chart-2: #D94F9A; /* same name → overridden by variables.css */
99
+ --color-chart-3: #A888F0; /* same name → overridden by variables.css */
100
+ --color-chart-4: #68C8F5; /* same name → overridden by variables.css */
101
+ --color-chart-5: #F0A0CC; /* same name → overridden by variables.css */
102
+
103
+ /* Text */
104
+ --color-text: #222225; /* same name → overridden by variables.css */
105
+ --color-text-muted: #6B6B6C; /* same name → overridden by variables.css */
106
+ --color-text-subtle: #9A9A9B; /* same name → overridden by variables.css */
107
+ --color-text-link: #2563EB; /* same name → overridden by variables.css */
108
+ --color-text-primary: #15A0AC; /* same name → overridden by variables.css */
109
+ --color-text-info: #2563EB; /* same name → overridden by variables.css */
110
+ --color-text-success: #059669; /* same name → overridden by variables.css */
111
+ --color-text-error: #DC2626; /* same name → overridden by variables.css */
112
+ --color-text-warning: #D97706; /* same name → overridden by variables.css */
113
+
114
+ /* =============================================
115
+ Primitive Color Palettes
116
+ Same names as variables.css — overridden at runtime.
117
+ ============================================= */
118
+
119
+ --color-white: #FFFFFF;
120
+ --color-black: #000000;
121
+
122
+ /* gray */
123
+ --color-gray-50: #F9F9FA;
124
+ --color-gray-100: #F4F4F5;
125
+ --color-gray-200: #E4E4E6;
126
+ --color-gray-300: #D4D4D5;
127
+ --color-gray-400: #9A9A9B;
128
+ --color-gray-500: #6B6B6C;
129
+ --color-gray-600: #4A4A4B;
130
+ --color-gray-700: #3A3A3E;
131
+ --color-gray-800: #2D2D31;
132
+ --color-gray-900: #222225;
133
+
134
+ /* primary */
135
+ --color-primary-50: #DBF8FB;
136
+ --color-primary-100: #B2F0F5;
137
+ --color-primary-200: #89E8F0;
138
+ --color-primary-300: #60E0EB;
139
+ --color-primary-400: #37D8E6;
140
+ --color-primary-500: #1AC6D5;
141
+ --color-primary-600: #15A0AC;
142
+ --color-primary-700: #107A84;
143
+ --color-primary-800: #0B545B;
144
+ --color-primary-900: #062E32;
145
+
146
+ /* secondary */
147
+ --color-secondary-50: #F5F5FB;
148
+ --color-secondary-100: #EBEBF5;
149
+ --color-secondary-200: #D9D9E9;
150
+ --color-secondary-300: #BCBCD2;
151
+ --color-secondary-400: #8F8FA9;
152
+ --color-secondary-500: #69697F;
153
+ --color-secondary-600: #4E4E60;
154
+ --color-secondary-700: #3B3B4A;
155
+ --color-secondary-800: #2F2F3B;
156
+ --color-secondary-900: #23232D;
157
+
158
+ /* blue */
159
+ --color-blue-50: #EFF6FF;
160
+ --color-blue-100: #DBEAFE;
161
+ --color-blue-200: #BFDBFE;
162
+ --color-blue-300: #93C5FD;
163
+ --color-blue-400: #60A5FA;
164
+ --color-blue-500: #3B82F6;
165
+ --color-blue-600: #2563EB;
166
+ --color-blue-700: #1D4ED8;
167
+ --color-blue-800: #1E40AF;
168
+ --color-blue-900: #1E3A8A;
169
+
170
+ /* green */
171
+ --color-green-50: #ECFDF5;
172
+ --color-green-100: #D1FAE5;
173
+ --color-green-200: #A7F3D0;
174
+ --color-green-300: #6EE7B7;
175
+ --color-green-400: #34D399;
176
+ --color-green-500: #10B981;
177
+ --color-green-600: #059669;
178
+ --color-green-700: #047857;
179
+ --color-green-800: #065F46;
180
+ --color-green-900: #064E3B;
181
+
182
+ /* yellow */
183
+ --color-yellow-50: #FFFBEB;
184
+ --color-yellow-100: #FEF3C7;
185
+ --color-yellow-200: #FDE68A;
186
+ --color-yellow-300: #FCD34D;
187
+ --color-yellow-400: #FBBF24;
188
+ --color-yellow-500: #F59E0B;
189
+ --color-yellow-600: #D97706;
190
+ --color-yellow-700: #B45309;
191
+ --color-yellow-800: #92400E;
192
+ --color-yellow-900: #78350F;
193
+
194
+ /* red */
195
+ --color-red-50: #FEF2F2;
196
+ --color-red-100: #FEE2E2;
197
+ --color-red-200: #FECACA;
198
+ --color-red-300: #FCA5A5;
199
+ --color-red-400: #F87171;
200
+ --color-red-500: #EF4444;
201
+ --color-red-600: #DC2626;
202
+ --color-red-700: #B91C1C;
203
+ --color-red-800: #991B1B;
204
+ --color-red-900: #7F1D1D;
205
+
206
+ /* =============================================
207
+ Typography — var() references (different namespace → auto-sync)
208
+ @theme uses --text-*, variables.css uses --font-size-*
209
+ ============================================= */
210
+ --text-2xs: var(--font-size-2xs);
211
+ --text-2xs--line-height: var(--line-height-2xs);
212
+ --text-xs: var(--font-size-xs);
213
+ --text-xs--line-height: var(--line-height-xs);
214
+ --text-sm: var(--font-size-sm);
215
+ --text-sm--line-height: var(--line-height-sm);
216
+ --text-md: var(--font-size-md);
217
+ --text-md--line-height: var(--line-height-md);
218
+ --text-base: var(--font-size-base);
219
+ --text-base--line-height: var(--line-height-base);
220
+ --text-lg: var(--font-size-lg);
221
+ --text-lg--line-height: var(--line-height-lg);
222
+ --text-xl: var(--font-size-xl);
223
+ --text-xl--line-height: var(--line-height-xl);
224
+ --text-2xl: var(--font-size-2xl);
225
+ --text-2xl--line-height: var(--line-height-2xl);
226
+ --text-3xl: var(--font-size-3xl);
227
+ --text-3xl--line-height: var(--line-height-3xl);
228
+ --text-4xl: var(--font-size-4xl);
229
+ --text-4xl--line-height: var(--line-height-4xl);
230
+ --text-5xl: var(--font-size-5xl);
231
+ --text-5xl--line-height: var(--line-height-5xl);
232
+
233
+ /* =============================================
234
+ Font Family — var() references to variables.css
235
+ ============================================= */
236
+ --font-sans: var(--font-family-sans);
237
+ --font-mono: var(--font-family-mono);
238
+
239
+ /* =============================================
240
+ Border Radius
241
+ Same names as variables.css — values here just register utilities.
242
+ Runtime values come from variables.css (unlayered > theme layer).
243
+ ============================================= */
244
+ --radius-none: 0px;
245
+ --radius-sm: 2px;
246
+ --radius-DEFAULT: 4px;
247
+ --radius-md: 6px;
248
+ --radius-lg: 8px;
249
+ --radius-xl: 12px;
250
+ --radius-2xl: 16px;
251
+ --radius-3xl: 24px;
252
+ --radius-full: 9999px;
253
+
254
+ /* =============================================
255
+ Shadows
256
+ Same names as variables.css — overridden at runtime.
257
+ Dark mode shadows also handled by variables.css .dark block.
258
+ ============================================= */
259
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
260
+ --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
261
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
262
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
263
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
264
+ --shadow-primary-glow: 0 0 0 4px color-mix(in srgb, var(--color-primary) 15%, transparent);
265
+
266
+ /* =============================================
267
+ Component Sizes
268
+ Switch, Slider thumb/track dimensions.
269
+ ============================================= */
270
+ --component-switch-track-sm-width: 24px;
271
+ --component-switch-track-sm-height: 14px;
272
+ --component-switch-track-default-width: 32px;
273
+ --component-switch-track-default-height: 18px;
274
+ --component-switch-track-lg-width: 40px;
275
+ --component-switch-track-lg-height: 22px;
276
+ --component-switch-thumb-sm: 12px;
277
+ --component-switch-thumb-default: 16px;
278
+ --component-switch-thumb-lg: 20px;
279
+ --component-slider-thumb-sm: 14px;
280
+ --component-slider-thumb-default: 18px;
281
+ --component-slider-thumb-lg: 22px;
282
+
283
+ /* =============================================
284
+ Opacity
285
+ Same names as variables.css — overridden at runtime.
286
+ ============================================= */
287
+ --opacity-0: 0%;
288
+ --opacity-5: 5%;
289
+ --opacity-10: 10%;
290
+ --opacity-15: 15%;
291
+ --opacity-20: 20%;
292
+ --opacity-25: 25%;
293
+ --opacity-30: 30%;
294
+ --opacity-35: 35%;
295
+ --opacity-40: 40%;
296
+ --opacity-45: 45%;
297
+ --opacity-50: 50%;
298
+ --opacity-55: 55%;
299
+ --opacity-60: 60%;
300
+ --opacity-65: 65%;
301
+ --opacity-70: 70%;
302
+ --opacity-75: 75%;
303
+ --opacity-80: 80%;
304
+ --opacity-85: 85%;
305
+ --opacity-90: 90%;
306
+ --opacity-95: 95%;
307
+ --opacity-100: 100%;
308
+
309
+ /* =============================================
310
+ Easing — var() references to variables.css
311
+ ============================================= */
312
+ --ease-linear: var(--easing-linear);
313
+ --ease-DEFAULT: var(--easing-ease);
314
+ --ease-in: var(--easing-ease-in);
315
+ --ease-out: var(--easing-ease-out);
316
+ --ease-in-out: var(--easing-ease-in-out);
317
+
318
+ /* =============================================
319
+ Animation
320
+ ============================================= */
321
+ --animate-spin: spin 1s linear infinite;
322
+ }
323
+
324
+ /*
325
+ * NOTE: No .dark block needed here.
326
+ *
327
+ * Dark mode is handled entirely by variables.css .dark { } block.
328
+ * - var() referenced variables: source changes in .dark → auto-cascade
329
+ * - Same-name variables: variables.css (unlayered) overrides @theme (theme layer)
330
+ *
331
+ * CSS cascade: unlayered > @layer theme
332
+ * So variables.css always wins over @theme for same-name variables.
333
+ */
334
+
335
+ /* =============================================
336
+ Custom Utilities
337
+ ============================================= */
338
+
339
+ /* Transition duration — var() references to variables.css */
340
+ @utility duration-instant {
341
+ transition-duration: var(--duration-instant);
342
+ }
343
+ @utility duration-fast {
344
+ transition-duration: var(--duration-fast);
345
+ }
346
+ @utility duration-micro {
347
+ transition-duration: var(--duration-micro);
348
+ }
349
+ @utility duration-normal {
350
+ transition-duration: var(--duration-normal);
351
+ }
352
+ @utility duration-slow {
353
+ transition-duration: var(--duration-slow);
354
+ }
355
+ @utility duration-slower {
356
+ transition-duration: var(--duration-slower);
357
+ }
358
+ @utility duration-slowest {
359
+ transition-duration: var(--duration-slowest);
360
+ }
361
+ @utility duration-spin {
362
+ transition-duration: var(--duration-spin);
363
+ }
364
+
365
+ /* Scale — var() references to variables.css */
366
+ @utility scale-50 {
367
+ scale: var(--scale-50);
368
+ }
369
+ @utility scale-75 {
370
+ scale: var(--scale-75);
371
+ }
372
+ @utility scale-95 {
373
+ scale: var(--scale-95);
374
+ }
375
+ @utility scale-pressed {
376
+ scale: var(--scale-pressed);
377
+ }
378
+
379
+ /* Icon size utilities (5-step system) — var() references */
380
+ @utility icon-2xs {
381
+ width: var(--icon-size-2xs);
382
+ height: var(--icon-size-2xs);
383
+ }
384
+ @utility icon-xs {
385
+ width: var(--icon-size-xs);
386
+ height: var(--icon-size-xs);
387
+ }
388
+ @utility icon-sm {
389
+ width: var(--icon-size-sm);
390
+ height: var(--icon-size-sm);
391
+ }
392
+ @utility icon-md {
393
+ width: var(--icon-size-md);
394
+ height: var(--icon-size-md);
395
+ }
396
+ @utility icon-lg {
397
+ width: var(--icon-size-lg);
398
+ height: var(--icon-size-lg);
399
+ }
400
+ @utility icon-xl {
401
+ width: var(--icon-size-xl);
402
+ height: var(--icon-size-xl);
403
+ }
404
+
405
+ /* Focus ring utility (v3/v4 compatible) */
406
+ @utility focus-ring {
407
+ outline: 2px solid transparent;
408
+ outline-offset: 2px;
409
+ box-shadow: 0 0 0 2px var(--color-focus-ring);
410
+ }
411
+
412
+ /* Z-index utilities (named semantic values) — var() references */
413
+ @utility z-sticky {
414
+ z-index: var(--z-index-sticky);
415
+ }
416
+ @utility z-dropdown {
417
+ z-index: var(--z-index-dropdown);
418
+ }
419
+ @utility z-overlay {
420
+ z-index: var(--z-index-overlay);
421
+ }
422
+ @utility z-modal {
423
+ z-index: var(--z-index-modal);
424
+ }
425
+ @utility z-popover {
426
+ z-index: var(--z-index-popover);
427
+ }
428
+ @utility z-tooltip {
429
+ z-index: var(--z-index-tooltip);
430
+ }
431
+ @utility z-toast {
432
+ z-index: var(--z-index-toast);
433
+ }
434
+
435
+ /* Scale reset for grouped buttons (override active:scale-pressed) */
436
+ @utility scale-none {
437
+ scale: 1 !important;
438
+ transform: none !important;
439
+ }
440
+
441
+ /* =============================================
442
+ Animations
443
+ Generated from semantic.animation in figma-tokens.json
444
+ Token name = keyframe name = class name (1:1)
445
+ ============================================= */
446
+
447
+ @keyframes checkbox-enter {
448
+ from { opacity: 0; transform: scale(0.75); }
449
+ to { opacity: 1; transform: scale(1); }
450
+ }
451
+ @utility animate-checkbox-enter {
452
+ animation: checkbox-enter var(--duration-micro) var(--easing-ease-out);
453
+ }
454
+
455
+ @keyframes radio-enter {
456
+ from { opacity: 0; transform: scale(0.5); }
457
+ to { opacity: 1; transform: scale(1); }
458
+ }
459
+ @utility animate-radio-enter {
460
+ animation: radio-enter var(--duration-micro) var(--easing-ease-out);
461
+ }
462
+
463
+ @keyframes fade-in {
464
+ from { opacity: 0; }
465
+ to { opacity: 1; }
466
+ }
467
+ @utility animate-fade-in {
468
+ animation: fade-in var(--duration-normal) var(--easing-ease-out);
469
+ }
470
+
471
+ @keyframes fade-out {
472
+ from { opacity: 1; }
473
+ to { opacity: 0; }
474
+ }
475
+ @utility animate-fade-out {
476
+ animation: fade-out var(--duration-normal) var(--easing-ease-out);
477
+ }
478
+
479
+ @keyframes modal-overlay-enter {
480
+ from { opacity: 0; }
481
+ to { opacity: 1; }
482
+ }
483
+ @utility animate-modal-overlay-enter {
484
+ animation: modal-overlay-enter var(--duration-normal) var(--easing-ease-out);
485
+ }
486
+
487
+ @keyframes modal-overlay-exit {
488
+ from { opacity: 1; }
489
+ to { opacity: 0; }
490
+ }
491
+ @utility animate-modal-overlay-exit {
492
+ animation: modal-overlay-exit var(--duration-fast) var(--easing-ease-out);
493
+ }
494
+
495
+ @keyframes modal-content-enter {
496
+ from { opacity: 0; transform: scale(0.95) translateY(8px); }
497
+ to { opacity: 1; transform: scale(1) translateY(0); }
498
+ }
499
+ @utility animate-modal-content-enter {
500
+ animation: modal-content-enter var(--duration-normal) var(--easing-ease-out);
501
+ }
502
+
503
+ @keyframes modal-content-exit {
504
+ from { opacity: 1; transform: scale(1) translateY(0); }
505
+ to { opacity: 0; transform: scale(0.95) translateY(8px); }
506
+ }
507
+ @utility animate-modal-content-exit {
508
+ animation: modal-content-exit var(--duration-fast) var(--easing-ease-out);
509
+ }
510
+
511
+ @keyframes nav-viewport-enter {
512
+ from { opacity: 0; transform: scale(0.98) translateY(-2px); }
513
+ to { opacity: 1; transform: scale(1) translateY(0); }
514
+ }
515
+ @utility animate-nav-viewport-enter {
516
+ animation: nav-viewport-enter var(--duration-micro) var(--easing-ease-out);
517
+ }
518
+
519
+ @keyframes nav-viewport-exit {
520
+ from { opacity: 1; transform: scale(1) translateY(0); }
521
+ to { opacity: 0; transform: scale(0.98) translateY(-2px); }
522
+ }
523
+ @utility animate-nav-viewport-exit {
524
+ animation: nav-viewport-exit var(--duration-fast) var(--easing-ease-out);
525
+ }
526
+
527
+ @keyframes accordion-down {
528
+ from { height: 0; }
529
+ to { height: var(--radix-accordion-content-height); }
530
+ }
531
+ @utility animate-accordion-down {
532
+ animation: accordion-down var(--duration-normal) var(--easing-ease-out);
533
+ }
534
+
535
+ @keyframes accordion-up {
536
+ from { height: var(--radix-accordion-content-height); }
537
+ to { height: 0; }
538
+ }
539
+ @utility animate-accordion-up {
540
+ animation: accordion-up var(--duration-normal) var(--easing-ease-out);
541
+ }
542
+
543
+ @keyframes collapsible-down {
544
+ from { height: 0; }
545
+ to { height: var(--radix-collapsible-content-height); }
546
+ }
547
+ @utility animate-collapsible-down {
548
+ animation: collapsible-down var(--duration-normal) var(--easing-ease-out);
549
+ }
550
+
551
+ @keyframes collapsible-up {
552
+ from { height: var(--radix-collapsible-content-height); }
553
+ to { height: 0; }
554
+ }
555
+ @utility animate-collapsible-up {
556
+ animation: collapsible-up var(--duration-normal) var(--easing-ease-out);
557
+ }
558
+
559
+ @keyframes drawer-right-enter {
560
+ from { transform: translateX(100%); }
561
+ to { transform: translateX(0); }
562
+ }
563
+ @utility animate-drawer-right-enter {
564
+ animation: drawer-right-enter var(--duration-slow) var(--easing-ease-out);
565
+ }
566
+
567
+ @keyframes drawer-right-exit {
568
+ from { transform: translateX(0); }
569
+ to { transform: translateX(100%); }
570
+ }
571
+ @utility animate-drawer-right-exit {
572
+ animation: drawer-right-exit var(--duration-normal) var(--easing-ease-out);
573
+ }
574
+
575
+ @keyframes drawer-left-enter {
576
+ from { transform: translateX(-100%); }
577
+ to { transform: translateX(0); }
578
+ }
579
+ @utility animate-drawer-left-enter {
580
+ animation: drawer-left-enter var(--duration-slow) var(--easing-ease-out);
581
+ }
582
+
583
+ @keyframes drawer-left-exit {
584
+ from { transform: translateX(0); }
585
+ to { transform: translateX(-100%); }
586
+ }
587
+ @utility animate-drawer-left-exit {
588
+ animation: drawer-left-exit var(--duration-normal) var(--easing-ease-out);
589
+ }
590
+
591
+ @keyframes drawer-top-enter {
592
+ from { transform: translateY(-100%); }
593
+ to { transform: translateY(0); }
594
+ }
595
+ @utility animate-drawer-top-enter {
596
+ animation: drawer-top-enter var(--duration-slow) var(--easing-ease-out);
597
+ }
598
+
599
+ @keyframes drawer-top-exit {
600
+ from { transform: translateY(0); }
601
+ to { transform: translateY(-100%); }
602
+ }
603
+ @utility animate-drawer-top-exit {
604
+ animation: drawer-top-exit var(--duration-normal) var(--easing-ease-out);
605
+ }
606
+
607
+ @keyframes drawer-bottom-enter {
608
+ from { transform: translateY(100%); }
609
+ to { transform: translateY(0); }
610
+ }
611
+ @utility animate-drawer-bottom-enter {
612
+ animation: drawer-bottom-enter var(--duration-slow) var(--easing-ease-out);
613
+ }
614
+
615
+ @keyframes drawer-bottom-exit {
616
+ from { transform: translateY(0); }
617
+ to { transform: translateY(100%); }
618
+ }
619
+ @utility animate-drawer-bottom-exit {
620
+ animation: drawer-bottom-exit var(--duration-normal) var(--easing-ease-out);
621
+ }
622
+
623
+ @keyframes tooltip-top-enter {
624
+ from { opacity: 0; transform: translateY(4px); }
625
+ to { opacity: 1; transform: translateY(0); }
626
+ }
627
+ @utility animate-tooltip-top-enter {
628
+ animation: tooltip-top-enter var(--duration-micro) var(--easing-ease-out);
629
+ }
630
+
631
+ @keyframes tooltip-top-exit {
632
+ from { opacity: 1; transform: translateY(0); }
633
+ to { opacity: 0; transform: translateY(4px); }
634
+ }
635
+ @utility animate-tooltip-top-exit {
636
+ animation: tooltip-top-exit var(--duration-fast) var(--easing-ease-out);
637
+ }
638
+
639
+ @keyframes tooltip-bottom-enter {
640
+ from { opacity: 0; transform: translateY(-4px); }
641
+ to { opacity: 1; transform: translateY(0); }
642
+ }
643
+ @utility animate-tooltip-bottom-enter {
644
+ animation: tooltip-bottom-enter var(--duration-micro) var(--easing-ease-out);
645
+ }
646
+
647
+ @keyframes tooltip-bottom-exit {
648
+ from { opacity: 1; transform: translateY(0); }
649
+ to { opacity: 0; transform: translateY(-4px); }
650
+ }
651
+ @utility animate-tooltip-bottom-exit {
652
+ animation: tooltip-bottom-exit var(--duration-fast) var(--easing-ease-out);
653
+ }
654
+
655
+ @keyframes tooltip-right-enter {
656
+ from { opacity: 0; transform: translateX(-4px); }
657
+ to { opacity: 1; transform: translateX(0); }
658
+ }
659
+ @utility animate-tooltip-right-enter {
660
+ animation: tooltip-right-enter var(--duration-micro) var(--easing-ease-out);
661
+ }
662
+
663
+ @keyframes tooltip-right-exit {
664
+ from { opacity: 1; transform: translateX(0); }
665
+ to { opacity: 0; transform: translateX(-4px); }
666
+ }
667
+ @utility animate-tooltip-right-exit {
668
+ animation: tooltip-right-exit var(--duration-fast) var(--easing-ease-out);
669
+ }
670
+
671
+ @keyframes tooltip-left-enter {
672
+ from { opacity: 0; transform: translateX(4px); }
673
+ to { opacity: 1; transform: translateX(0); }
674
+ }
675
+ @utility animate-tooltip-left-enter {
676
+ animation: tooltip-left-enter var(--duration-micro) var(--easing-ease-out);
677
+ }
678
+
679
+ @keyframes tooltip-left-exit {
680
+ from { opacity: 1; transform: translateX(0); }
681
+ to { opacity: 0; transform: translateX(4px); }
682
+ }
683
+ @utility animate-tooltip-left-exit {
684
+ animation: tooltip-left-exit var(--duration-fast) var(--easing-ease-out);
685
+ }
686
+
687
+ @keyframes popover-top-enter {
688
+ from { opacity: 0; transform: translateY(4px); }
689
+ to { opacity: 1; transform: translateY(0); }
690
+ }
691
+ @utility animate-popover-top-enter {
692
+ animation: popover-top-enter var(--duration-normal) var(--easing-ease-out);
693
+ }
694
+
695
+ @keyframes popover-top-exit {
696
+ from { opacity: 1; transform: translateY(0); }
697
+ to { opacity: 0; transform: translateY(4px); }
698
+ }
699
+ @utility animate-popover-top-exit {
700
+ animation: popover-top-exit var(--duration-fast) var(--easing-ease-out);
701
+ }
702
+
703
+ @keyframes popover-bottom-enter {
704
+ from { opacity: 0; transform: translateY(-4px); }
705
+ to { opacity: 1; transform: translateY(0); }
706
+ }
707
+ @utility animate-popover-bottom-enter {
708
+ animation: popover-bottom-enter var(--duration-normal) var(--easing-ease-out);
709
+ }
710
+
711
+ @keyframes popover-bottom-exit {
712
+ from { opacity: 1; transform: translateY(0); }
713
+ to { opacity: 0; transform: translateY(-4px); }
714
+ }
715
+ @utility animate-popover-bottom-exit {
716
+ animation: popover-bottom-exit var(--duration-fast) var(--easing-ease-out);
717
+ }
718
+
719
+ @keyframes popover-right-enter {
720
+ from { opacity: 0; transform: translateX(-4px); }
721
+ to { opacity: 1; transform: translateX(0); }
722
+ }
723
+ @utility animate-popover-right-enter {
724
+ animation: popover-right-enter var(--duration-normal) var(--easing-ease-out);
725
+ }
726
+
727
+ @keyframes popover-right-exit {
728
+ from { opacity: 1; transform: translateX(0); }
729
+ to { opacity: 0; transform: translateX(-4px); }
730
+ }
731
+ @utility animate-popover-right-exit {
732
+ animation: popover-right-exit var(--duration-fast) var(--easing-ease-out);
733
+ }
734
+
735
+ @keyframes popover-left-enter {
736
+ from { opacity: 0; transform: translateX(4px); }
737
+ to { opacity: 1; transform: translateX(0); }
738
+ }
739
+ @utility animate-popover-left-enter {
740
+ animation: popover-left-enter var(--duration-normal) var(--easing-ease-out);
741
+ }
742
+
743
+ @keyframes popover-left-exit {
744
+ from { opacity: 1; transform: translateX(0); }
745
+ to { opacity: 0; transform: translateX(4px); }
746
+ }
747
+ @utility animate-popover-left-exit {
748
+ animation: popover-left-exit var(--duration-fast) var(--easing-ease-out);
749
+ }
750
+
751
+ @keyframes toast-slide-in-right {
752
+ from { opacity: 0; transform: translateX(100%); }
753
+ to { opacity: 1; transform: translateX(0); }
754
+ }
755
+ @utility animate-toast-slide-in-right {
756
+ animation: toast-slide-in-right var(--duration-slow) var(--easing-ease-out);
757
+ }
758
+
759
+ @keyframes toast-slide-out-right {
760
+ from { opacity: 1; transform: translateX(0); }
761
+ to { opacity: 0; transform: translateX(100%); }
762
+ }
763
+ @utility animate-toast-slide-out-right {
764
+ animation: toast-slide-out-right var(--duration-normal) var(--easing-ease-out);
765
+ }
766
+
767
+ @keyframes toast-slide-in-left {
768
+ from { opacity: 0; transform: translateX(-100%); }
769
+ to { opacity: 1; transform: translateX(0); }
770
+ }
771
+ @utility animate-toast-slide-in-left {
772
+ animation: toast-slide-in-left var(--duration-slow) var(--easing-ease-out);
773
+ }
774
+
775
+ @keyframes toast-slide-out-left {
776
+ from { opacity: 1; transform: translateX(0); }
777
+ to { opacity: 0; transform: translateX(-100%); }
778
+ }
779
+ @utility animate-toast-slide-out-left {
780
+ animation: toast-slide-out-left var(--duration-normal) var(--easing-ease-out);
781
+ }
782
+
783
+ @keyframes toast-slide-in-top {
784
+ from { opacity: 0; transform: translateY(-100%); }
785
+ to { opacity: 1; transform: translateY(0); }
786
+ }
787
+ @utility animate-toast-slide-in-top {
788
+ animation: toast-slide-in-top var(--duration-slow) var(--easing-ease-out);
789
+ }
790
+
791
+ @keyframes toast-slide-out-top {
792
+ from { opacity: 1; transform: translateY(0); }
793
+ to { opacity: 0; transform: translateY(-100%); }
794
+ }
795
+ @utility animate-toast-slide-out-top {
796
+ animation: toast-slide-out-top var(--duration-normal) var(--easing-ease-out);
797
+ }
798
+
799
+ @keyframes toast-slide-in-bottom {
800
+ from { opacity: 0; transform: translateY(100%); }
801
+ to { opacity: 1; transform: translateY(0); }
802
+ }
803
+ @utility animate-toast-slide-in-bottom {
804
+ animation: toast-slide-in-bottom var(--duration-slow) var(--easing-ease-out);
805
+ }
806
+
807
+ @keyframes toast-slide-out-bottom {
808
+ from { opacity: 1; transform: translateY(0); }
809
+ to { opacity: 0; transform: translateY(100%); }
810
+ }
811
+ @utility animate-toast-slide-out-bottom {
812
+ animation: toast-slide-out-bottom var(--duration-normal) var(--easing-ease-out);
813
+ }
814
+
815
+ @keyframes spin {
816
+ from { transform: rotate(0deg); }
817
+ to { transform: rotate(360deg); }
818
+ }
819
+ @utility animate-spin {
820
+ animation: spin var(--duration-spin) var(--easing-linear) infinite;
821
+ }
822
+
823
+ @keyframes progress-stripe {
824
+ from { background-position: 1rem 0; }
825
+ to { background-position: 0 0; }
826
+ }
827
+ @utility animate-progress-stripe {
828
+ animation: progress-stripe var(--duration-spin) var(--easing-linear) infinite;
829
+ }
830
+
831
+ @keyframes spinner-orbit {
832
+ from { transform: rotateY(0deg); }
833
+ to { transform: rotateY(360deg); }
834
+ }
835
+ @utility animate-spinner-orbit {
836
+ animation: spinner-orbit var(--duration-spin) var(--easing-linear) infinite;
837
+ }
838
+
839
+ @keyframes spinner-dot {
840
+ 0%, 100% { opacity: 0.2; }
841
+ 50% { opacity: 1; }
842
+ }
843
+ @utility animate-spinner-dot {
844
+ animation: spinner-dot var(--duration-spin) var(--easing-ease-in-out) infinite;
845
+ }
846
+
847
+ @keyframes spinner-bar {
848
+ 0%, 100% { transform: scaleY(0.4); }
849
+ 50% { transform: scaleY(1); }
850
+ }
851
+ @utility animate-spinner-bar {
852
+ animation: spinner-bar var(--duration-spin) var(--easing-ease-in-out) infinite;
853
+ }
854
+
855
+ @keyframes spinner-morph {
856
+ 0%, 100% { border-radius: 50%; transform: rotateY(0deg) rotate(0deg); }
857
+ 25% { border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; transform: rotateY(90deg) rotate(90deg); }
858
+ 50% { border-radius: 50%; transform: rotateY(180deg) rotate(180deg); }
859
+ 75% { border-radius: 70% 30% 30% 70% / 70% 70% 30% 30%; transform: rotateY(270deg) rotate(270deg); }
860
+ }
861
+ @utility animate-spinner-morph {
862
+ animation: spinner-morph var(--duration-spin) var(--easing-ease-in-out) infinite;
863
+ }
864
+
865
+ @keyframes skeleton-pulse {
866
+ 0%, 100% { opacity: 1; }
867
+ 50% { opacity: 0.4; }
868
+ }
869
+ @utility animate-skeleton-pulse {
870
+ animation: skeleton-pulse var(--duration-spin) var(--easing-ease-in-out) infinite;
871
+ }
872
+
873
+ @keyframes skeleton-wave {
874
+ 0% { transform: translateX(-100%); }
875
+ 100% { transform: translateX(100%); }
876
+ }
877
+ @utility animate-skeleton-wave {
878
+ animation: skeleton-wave var(--duration-spin) var(--easing-linear) infinite;
879
+ }