@rokkit/themes 1.0.0-next.130 → 1.0.0-next.132

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.
package/dist/base.css ADDED
@@ -0,0 +1,4868 @@
1
+ @layer base {
2
+ :root {
3
+ --scroll-width: 0.5rem;
4
+ --tab-size: 2;
5
+ --color-surface:148,163,184;--color-surface-50:248,250,252;--color-surface-100:241,245,249;--color-surface-200:226,232,240;--color-surface-300:203,213,225;--color-surface-400:148,163,184;--color-surface-500:100,116,139;--color-surface-600:71,85,105;--color-surface-700:51,65,85;--color-surface-800:30,41,59;--color-surface-900:15,23,42;--color-surface-950:2,6,23;--color-primary:251,146,60;--color-primary-50:255,247,237;--color-primary-100:255,237,213;--color-primary-200:254,215,170;--color-primary-300:253,186,116;--color-primary-400:251,146,60;--color-primary-500:249,115,22;--color-primary-600:234,88,12;--color-primary-700:194,65,12;--color-primary-800:154,52,18;--color-primary-900:124,45,18;--color-primary-950:67,20,7;--color-secondary:244,114,182;--color-secondary-50:253,242,248;--color-secondary-100:252,231,243;--color-secondary-200:251,207,232;--color-secondary-300:249,168,212;--color-secondary-400:244,114,182;--color-secondary-500:236,72,153;--color-secondary-600:219,39,119;--color-secondary-700:190,24,93;--color-secondary-800:157,23,77;--color-secondary-900:131,24,67;--color-secondary-950:80,7,36;--color-accent:56,189,248;--color-accent-50:240,249,255;--color-accent-100:224,242,254;--color-accent-200:186,230,253;--color-accent-300:125,211,252;--color-accent-400:56,189,248;--color-accent-500:14,165,233;--color-accent-600:2,132,199;--color-accent-700:3,105,161;--color-accent-800:7,89,133;--color-accent-900:12,74,110;--color-accent-950:8,47,73;--color-success:74,222,128;--color-success-50:240,253,244;--color-success-100:220,252,231;--color-success-200:187,247,208;--color-success-300:134,239,172;--color-success-400:74,222,128;--color-success-500:34,197,94;--color-success-600:22,163,74;--color-success-700:21,128,61;--color-success-800:22,101,52;--color-success-900:20,83,45;--color-success-950:5,46,22;--color-warning:250,204,21;--color-warning-50:254,252,232;--color-warning-100:254,249,195;--color-warning-200:254,240,138;--color-warning-300:253,224,71;--color-warning-400:250,204,21;--color-warning-500:234,179,8;--color-warning-600:202,138,4;--color-warning-700:161,98,7;--color-warning-800:133,77,14;--color-warning-900:113,63,18;--color-warning-950:66,32,6;--color-danger:248,113,113;--color-danger-50:254,242,242;--color-danger-100:254,226,226;--color-danger-200:254,202,202;--color-danger-300:252,165,165;--color-danger-400:248,113,113;--color-danger-500:239,68,68;--color-danger-600:220,38,38;--color-danger-700:185,28,28;--color-danger-800:153,27,27;--color-danger-900:127,29,29;--color-danger-950:69,10,10;--color-error:248,113,113;--color-error-50:254,242,242;--color-error-100:254,226,226;--color-error-200:254,202,202;--color-error-300:252,165,165;--color-error-400:248,113,113;--color-error-500:239,68,68;--color-error-600:220,38,38;--color-error-700:185,28,28;--color-error-800:153,27,27;--color-error-900:127,29,29;--color-error-950:69,10,10;--color-info:34,211,238;--color-info-50:236,254,255;--color-info-100:207,250,254;--color-info-200:165,243,252;--color-info-300:103,232,249;--color-info-400:34,211,238;--color-info-500:6,182,212;--color-info-600:8,145,178;--color-info-700:14,116,144;--color-info-800:21,94,117;--color-info-900:22,78,99;--color-info-950:8,51,68;
6
+ }
7
+ }
8
+
9
+ /**
10
+ * @rokkit/themes - Base Styles
11
+ *
12
+ * Structural styles for all components.
13
+ * Import individual files for tree-shaking, or this file for all base styles.
14
+ */
15
+
16
+ /**
17
+ * Button - Base Structural Styles
18
+ *
19
+ * These styles provide layout, positioning, and basic structure.
20
+ * No colors, shadows, or visual theming - those belong in theme styles.
21
+ */
22
+
23
+ /* =============================================================================
24
+ Button
25
+ ============================================================================= */
26
+
27
+ [data-button] {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ gap: 0.5rem;
32
+ border-radius: 0.5rem;
33
+ font-weight: 500;
34
+ cursor: pointer;
35
+ border: 1px solid transparent;
36
+ white-space: nowrap;
37
+ user-select: none;
38
+ text-decoration: none;
39
+ transition: all 150ms ease;
40
+ background: transparent;
41
+ color: inherit;
42
+ font-family: inherit;
43
+ line-height: 1;
44
+ }
45
+
46
+ [data-button]:focus {
47
+ outline: none;
48
+ }
49
+
50
+ [data-button]:focus-visible {
51
+ outline: 2px solid currentColor;
52
+ outline-offset: 2px;
53
+ }
54
+
55
+ /* Disabled */
56
+ [data-button][data-disabled],
57
+ [data-button]:disabled {
58
+ pointer-events: none;
59
+ opacity: 0.5;
60
+ cursor: not-allowed;
61
+ }
62
+
63
+ /* Loading */
64
+ [data-button][data-loading] {
65
+ pointer-events: none;
66
+ position: relative;
67
+ }
68
+
69
+ /* Icon-only */
70
+ [data-button][data-icon-only] {
71
+ aspect-ratio: 1;
72
+ padding: 0;
73
+ }
74
+
75
+ [data-button][data-icon-only] [data-item-text] {
76
+ display: none;
77
+ }
78
+
79
+ /* =============================================================================
80
+ Size Variants
81
+ ============================================================================= */
82
+
83
+ /* Small */
84
+ [data-button][data-size='sm'] {
85
+ height: 1.75rem;
86
+ padding-inline: 0.625rem;
87
+ font-size: 0.75rem;
88
+ gap: 0.375rem;
89
+ }
90
+
91
+ [data-button][data-size='sm'][data-icon-only] {
92
+ width: 1.75rem;
93
+ }
94
+
95
+ [data-button][data-size='sm'] [data-item-icon],
96
+ [data-button][data-size='sm'] [data-button-icon-right] {
97
+ font-size: 1.25rem;
98
+ }
99
+
100
+ /* Medium (default) */
101
+ [data-button][data-size='md'],
102
+ [data-button]:not([data-size]) {
103
+ height: 2.25rem;
104
+ padding-inline: 1rem;
105
+ font-size: 0.875rem;
106
+ gap: 0.5rem;
107
+ }
108
+
109
+ [data-button][data-size='md'][data-icon-only],
110
+ [data-button]:not([data-size])[data-icon-only] {
111
+ width: 2.25rem;
112
+ }
113
+
114
+ [data-button][data-size='md'] [data-item-icon],
115
+ [data-button][data-size='md'] [data-button-icon-right],
116
+ [data-button]:not([data-size]) [data-item-icon],
117
+ [data-button]:not([data-size]) [data-button-icon-right] {
118
+ font-size: 1.5rem;
119
+ }
120
+
121
+ /* Large */
122
+ [data-button][data-size='lg'] {
123
+ height: 2.75rem;
124
+ padding-inline: 1.5rem;
125
+ font-size: 1rem;
126
+ gap: 0.625rem;
127
+ }
128
+
129
+ [data-button][data-size='lg'][data-icon-only] {
130
+ width: 2.75rem;
131
+ }
132
+
133
+ [data-button][data-size='lg'] [data-item-icon],
134
+ [data-button][data-size='lg'] [data-button-icon-right] {
135
+ font-size: 1.875rem;
136
+ }
137
+
138
+ /* =============================================================================
139
+ Button Elements
140
+ ============================================================================= */
141
+
142
+ [data-button] [data-item-icon],
143
+ [data-button] [data-button-icon-right] {
144
+ flex-shrink: 0;
145
+ }
146
+
147
+ [data-button] [data-item-text] {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ }
151
+
152
+ /* Hide description and badge inside buttons (ItemContent renders them but we don't need them) */
153
+ [data-button] [data-item-description],
154
+ [data-button] [data-item-badge] {
155
+ display: none;
156
+ }
157
+
158
+ /* =============================================================================
159
+ Gradient Style — Structural
160
+ ============================================================================= */
161
+
162
+ [data-button][data-style='gradient'] {
163
+ border: none;
164
+ }
165
+
166
+ /* =============================================================================
167
+ Link Style — Structural
168
+ ============================================================================= */
169
+
170
+ [data-button][data-style='link'] {
171
+ background: transparent;
172
+ border: none;
173
+ height: auto;
174
+ padding-inline: 0.25rem;
175
+ border-radius: 0;
176
+ font-weight: inherit;
177
+ }
178
+
179
+ [data-button][data-style='link']:hover:not(:disabled):not([data-disabled]) {
180
+ text-decoration: underline;
181
+ text-underline-offset: 2px;
182
+ }
183
+
184
+ /* =============================================================================
185
+ Micro-Animations
186
+ ============================================================================= */
187
+
188
+ /* Hover lift — subtle elevation on hover (not on link or ghost style) */
189
+ [data-button]:not([data-style='link']):not([data-style='ghost']):hover:not(:disabled):not([data-disabled]) {
190
+ transform: translateY(-1px);
191
+ }
192
+
193
+ /* Press feedback — scale down on active */
194
+ [data-button]:active:not(:disabled):not([data-disabled]) {
195
+ transform: scale(0.97) translateY(0);
196
+ }
197
+
198
+ /* Icon shift — trailing icon moves right on hover */
199
+ [data-button]:hover:not(:disabled):not([data-disabled]) [data-button-icon-right] {
200
+ translate: 0.125rem 0;
201
+ }
202
+
203
+ [data-button] [data-button-icon-right] {
204
+ transition: translate 150ms ease;
205
+ }
206
+
207
+ /* Loading pulse */
208
+ [data-button][data-loading] {
209
+ animation: button-loading-pulse 1.5s ease-in-out infinite;
210
+ }
211
+
212
+ @keyframes button-loading-pulse {
213
+ 0%, 100% { opacity: 1; }
214
+ 50% { opacity: 0.7; }
215
+ }
216
+
217
+ /* =============================================================================
218
+ Loading Spinner
219
+ ============================================================================= */
220
+
221
+ [data-button-spinner] {
222
+ width: 1em;
223
+ height: 1em;
224
+ border: 2px solid currentColor;
225
+ border-right-color: transparent;
226
+ border-radius: 50%;
227
+ animation: button-spin 0.6s linear infinite;
228
+ flex-shrink: 0;
229
+ }
230
+
231
+ @keyframes button-spin {
232
+ to {
233
+ transform: rotate(360deg);
234
+ }
235
+ }
236
+
237
+ /* =============================================================================
238
+ Button Group
239
+ ============================================================================= */
240
+
241
+ [data-button-group] {
242
+ display: inline-flex;
243
+ align-items: center;
244
+ }
245
+
246
+ [data-button-group] [data-button] {
247
+ border-radius: 0;
248
+ }
249
+
250
+ [data-button-group] [data-button]:first-child {
251
+ border-top-left-radius: 0.5rem;
252
+ border-bottom-left-radius: 0.5rem;
253
+ }
254
+
255
+ [data-button-group] [data-button]:last-child {
256
+ border-top-right-radius: 0.5rem;
257
+ border-bottom-right-radius: 0.5rem;
258
+ }
259
+
260
+ [data-button-group] [data-button]:not(:first-child) {
261
+ margin-left: -1px;
262
+ }
263
+
264
+ /**
265
+ * Item Content - Base Structural Styles
266
+ *
267
+ * Shared styles for icon, text, description, and badge elements
268
+ * used by List, Tree, and other components.
269
+ */
270
+
271
+ /* =============================================================================
272
+ Item Icon
273
+ ============================================================================= */
274
+
275
+ [data-item-icon] {
276
+ flex-shrink: 0;
277
+ }
278
+
279
+ /* =============================================================================
280
+ Item Avatar
281
+ ============================================================================= */
282
+
283
+ [data-item-avatar] {
284
+ flex-shrink: 0;
285
+ width: 1.5em;
286
+ height: 1.5em;
287
+ border-radius: 9999px;
288
+ object-fit: cover;
289
+ }
290
+
291
+ /* =============================================================================
292
+ Item Text Container
293
+ ============================================================================= */
294
+
295
+ [data-item-text] {
296
+ display: flex;
297
+ flex-direction: column;
298
+ flex: 1;
299
+ min-width: 0;
300
+ }
301
+
302
+ [data-item-label] {
303
+ font-weight: 500;
304
+ white-space: nowrap;
305
+ overflow: hidden;
306
+ text-overflow: ellipsis;
307
+ }
308
+
309
+ [data-item-description] {
310
+ font-size: 0.75em;
311
+ white-space: nowrap;
312
+ overflow: hidden;
313
+ text-overflow: ellipsis;
314
+ }
315
+
316
+ /* =============================================================================
317
+ Item Badge
318
+ ============================================================================= */
319
+
320
+ [data-item-badge] {
321
+ flex-shrink: 0;
322
+ margin-left: auto;
323
+ padding: 0.125rem 0.375rem;
324
+ font-size: 0.75em;
325
+ font-weight: 500;
326
+ border-radius: 9999px;
327
+ }
328
+
329
+ /* =============================================================================
330
+ Item Shortcut
331
+ ============================================================================= */
332
+
333
+ [data-item-shortcut] {
334
+ flex-shrink: 0;
335
+ margin-left: auto;
336
+ padding: 0.125rem 0.375rem;
337
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
338
+ font-size: 0.75em;
339
+ font-weight: 500;
340
+ border-radius: 0.25rem;
341
+ }
342
+
343
+ /**
344
+ * Menu - Base Structural Styles
345
+ *
346
+ * These styles provide layout, positioning, and basic structure.
347
+ * No colors, shadows, or visual theming - those belong in theme styles.
348
+ */
349
+
350
+ /* =============================================================================
351
+ Menu Container
352
+ ============================================================================= */
353
+
354
+ [data-menu] {
355
+ position: relative;
356
+ display: inline-block;
357
+ }
358
+
359
+ [data-menu][data-disabled='true'] {
360
+ pointer-events: none;
361
+ opacity: 0.5;
362
+ }
363
+
364
+ /* =============================================================================
365
+ Trigger Button
366
+ ============================================================================= */
367
+
368
+ [data-menu-trigger] {
369
+ display: inline-flex;
370
+ align-items: center;
371
+ justify-content: center;
372
+ gap: 0.375rem;
373
+ white-space: nowrap;
374
+ cursor: pointer;
375
+ user-select: none;
376
+ border: 1px solid transparent;
377
+ border-radius: 0.375rem;
378
+ font-weight: 500;
379
+ transition: all 150ms ease;
380
+ }
381
+
382
+ [data-menu-trigger]:disabled {
383
+ cursor: not-allowed;
384
+ }
385
+
386
+ [data-menu-trigger]:focus-visible {
387
+ outline: 2px solid currentColor;
388
+ outline-offset: 2px;
389
+ }
390
+
391
+ /* Size variants */
392
+ [data-menu][data-size='sm'] [data-menu-trigger] {
393
+ height: 1.5rem;
394
+ padding-inline: 0.5rem;
395
+ font-size: 0.75rem;
396
+ }
397
+
398
+ [data-menu][data-size='md'] [data-menu-trigger],
399
+ [data-menu]:not([data-size]) [data-menu-trigger] {
400
+ height: 2rem;
401
+ padding-inline: 0.625rem;
402
+ font-size: 0.875rem;
403
+ }
404
+
405
+ [data-menu][data-size='lg'] [data-menu-trigger] {
406
+ height: 2.5rem;
407
+ padding-inline: 0.75rem;
408
+ font-size: 1rem;
409
+ }
410
+
411
+ /* =============================================================================
412
+ Trigger Elements (icon, label, arrow)
413
+ ============================================================================= */
414
+
415
+ [data-menu-trigger] > [data-menu-icon] {
416
+ flex-shrink: 0;
417
+ }
418
+
419
+ [data-menu-trigger] > [data-menu-label] {
420
+ overflow: hidden;
421
+ text-overflow: ellipsis;
422
+ }
423
+
424
+ [data-menu-trigger] > [data-menu-arrow] {
425
+ flex-shrink: 0;
426
+ transition: transform 150ms ease;
427
+ }
428
+
429
+ [data-menu][data-open='true'] [data-menu-arrow] {
430
+ transform: rotate(180deg);
431
+ }
432
+
433
+ /* Arrow sizes */
434
+ [data-menu][data-size='sm'] [data-menu-arrow] {
435
+ font-size: 0.75rem;
436
+ }
437
+ [data-menu][data-size='md'] [data-menu-arrow],
438
+ [data-menu]:not([data-size]) [data-menu-arrow] {
439
+ font-size: 0.875rem;
440
+ }
441
+ [data-menu][data-size='lg'] [data-menu-arrow] {
442
+ font-size: 1rem;
443
+ }
444
+
445
+ /* =============================================================================
446
+ Dropdown Panel
447
+ ============================================================================= */
448
+
449
+ [data-menu-dropdown] {
450
+ position: absolute;
451
+ z-index: 50;
452
+ min-width: 200px;
453
+ max-height: 400px;
454
+ overflow-y: auto;
455
+ border-radius: 0.5rem;
456
+ }
457
+
458
+ /* Menu dropdown — no focus ring on container, focus managed on individual items */
459
+ [data-menu-dropdown]:focus-within {
460
+ outline: none;
461
+ }
462
+
463
+ /* Direction: down (default) */
464
+ [data-menu][data-direction='down'] [data-menu-dropdown],
465
+ [data-menu]:not([data-direction]) [data-menu-dropdown] {
466
+ top: calc(100% + 4px);
467
+ animation: menu-dropdown-down 150ms ease;
468
+ }
469
+
470
+ /* Direction: up */
471
+ [data-menu][data-direction='up'] [data-menu-dropdown] {
472
+ bottom: calc(100% + 4px);
473
+ animation: menu-dropdown-up 150ms ease;
474
+ }
475
+
476
+ /* Alignment */
477
+ [data-menu][data-align='left'] [data-menu-dropdown],
478
+ [data-menu]:not([data-align]) [data-menu-dropdown] {
479
+ left: 0;
480
+ }
481
+
482
+ [data-menu][data-align='right'] [data-menu-dropdown] {
483
+ right: 0;
484
+ }
485
+
486
+ @keyframes menu-dropdown-down {
487
+ from {
488
+ opacity: 0;
489
+ transform: translateY(-4px);
490
+ }
491
+ to {
492
+ opacity: 1;
493
+ transform: translateY(0);
494
+ }
495
+ }
496
+
497
+ @keyframes menu-dropdown-up {
498
+ from {
499
+ opacity: 0;
500
+ transform: translateY(4px);
501
+ }
502
+ to {
503
+ opacity: 1;
504
+ transform: translateY(0);
505
+ }
506
+ }
507
+
508
+ /* =============================================================================
509
+ Menu Items
510
+ ============================================================================= */
511
+
512
+ [data-menu-item] {
513
+ display: flex;
514
+ align-items: center;
515
+ width: 100%;
516
+ text-align: left;
517
+ cursor: pointer;
518
+ border: none;
519
+ background: transparent;
520
+ transition: background-color 150ms ease;
521
+ }
522
+
523
+ [data-menu-item][data-disabled='true'],
524
+ [data-menu-item]:disabled {
525
+ pointer-events: none;
526
+ opacity: 0.5;
527
+ cursor: not-allowed;
528
+ }
529
+
530
+ [data-menu-item]:focus,
531
+ [data-menu-item]:focus-visible {
532
+ outline: none;
533
+ }
534
+
535
+ /* Size variants for items */
536
+ [data-menu][data-size='sm'] [data-menu-item] {
537
+ gap: 0.5rem;
538
+ padding: 0.375rem 0.5rem;
539
+ font-size: 0.75rem;
540
+ }
541
+
542
+ [data-menu][data-size='md'] [data-menu-item],
543
+ [data-menu]:not([data-size]) [data-menu-item] {
544
+ gap: 0.625rem;
545
+ padding: 0.5rem 0.75rem;
546
+ font-size: 0.875rem;
547
+ }
548
+
549
+ [data-menu][data-size='lg'] [data-menu-item] {
550
+ gap: 0.75rem;
551
+ padding: 0.625rem 1rem;
552
+ font-size: 1rem;
553
+ }
554
+
555
+ /* =============================================================================
556
+ Item Elements - uses shared [data-item-*] from item.css
557
+ ============================================================================= */
558
+
559
+ /* =============================================================================
560
+ Groups
561
+ ============================================================================= */
562
+
563
+ [data-menu-group] {
564
+ display: flex;
565
+ align-items: center;
566
+ width: 100%;
567
+ gap: 0.5rem;
568
+ font-size: 0.75rem;
569
+ font-weight: 600;
570
+ text-transform: uppercase;
571
+ letter-spacing: 0.05em;
572
+ cursor: pointer;
573
+ transition: color 150ms ease;
574
+ }
575
+
576
+ /* Group sizes */
577
+ [data-menu][data-size='sm'] [data-menu-group] {
578
+ padding: 0.25rem 0.5rem;
579
+ }
580
+ [data-menu][data-size='md'] [data-menu-group],
581
+ [data-menu]:not([data-size]) [data-menu-group] {
582
+ padding: 0.375rem 0.75rem;
583
+ }
584
+ [data-menu][data-size='lg'] [data-menu-group] {
585
+ padding: 0.5rem 1rem;
586
+ }
587
+
588
+ [data-menu-group]:focus {
589
+ outline: none;
590
+ }
591
+
592
+ [data-menu-group] > [data-menu-group-icon] {
593
+ flex-shrink: 0;
594
+ opacity: 0.7;
595
+ }
596
+
597
+ [data-menu-group] > [data-menu-group-text] {
598
+ flex: 1;
599
+ text-align: left;
600
+ }
601
+
602
+ [data-menu-expand-icon] {
603
+ flex-shrink: 0;
604
+ margin-left: auto;
605
+ transition: transform 150ms ease;
606
+ }
607
+
608
+ /* =============================================================================
609
+ Separator
610
+ ============================================================================= */
611
+
612
+ [data-menu-separator] {
613
+ height: 1px;
614
+ margin-block: 0.25rem;
615
+ border: none;
616
+ }
617
+
618
+ /**
619
+ * Select - Base Structural Styles
620
+ *
621
+ * These styles provide layout, positioning, and basic structure.
622
+ * No colors, shadows, or visual theming - those belong in theme styles.
623
+ */
624
+
625
+ /* =============================================================================
626
+ Select Container
627
+ ============================================================================= */
628
+
629
+ [data-select] {
630
+ position: relative;
631
+ display: inline-block;
632
+ }
633
+
634
+ [data-select][data-disabled='true'] {
635
+ pointer-events: none;
636
+ opacity: 0.5;
637
+ }
638
+
639
+ /* =============================================================================
640
+ Trigger Button
641
+ ============================================================================= */
642
+
643
+ [data-select-trigger] {
644
+ display: inline-flex;
645
+ align-items: center;
646
+ justify-content: space-between;
647
+ gap: 0.5rem;
648
+ width: 100%;
649
+ min-width: 180px;
650
+ cursor: pointer;
651
+ user-select: none;
652
+ border: 1px solid transparent;
653
+ border-radius: 0.375rem;
654
+ font-weight: 500;
655
+ transition: all 150ms ease;
656
+ }
657
+
658
+ [data-select-trigger]:disabled {
659
+ cursor: not-allowed;
660
+ }
661
+
662
+ [data-select-trigger]:focus-visible {
663
+ outline: 2px solid currentColor;
664
+ outline-offset: 2px;
665
+ }
666
+
667
+ /* Size variants */
668
+ [data-select][data-size='sm'] [data-select-trigger] {
669
+ height: 1.75rem;
670
+ padding-inline: 0.5rem;
671
+ font-size: 0.75rem;
672
+ }
673
+
674
+ [data-select][data-size='md'] [data-select-trigger],
675
+ [data-select]:not([data-size]) [data-select-trigger] {
676
+ height: 2.25rem;
677
+ padding-inline: 0.75rem;
678
+ font-size: 0.875rem;
679
+ }
680
+
681
+ [data-select][data-size='lg'] [data-select-trigger] {
682
+ height: 2.75rem;
683
+ padding-inline: 1rem;
684
+ font-size: 1rem;
685
+ }
686
+
687
+ /* =============================================================================
688
+ Trigger Value Display
689
+ ============================================================================= */
690
+
691
+ [data-select-value] {
692
+ display: flex;
693
+ align-items: center;
694
+ gap: 0.5rem;
695
+ flex: 1;
696
+ min-width: 0;
697
+ overflow: hidden;
698
+ }
699
+
700
+ [data-select-value-icon] {
701
+ flex-shrink: 0;
702
+ }
703
+
704
+ [data-select-value-text] {
705
+ overflow: hidden;
706
+ text-overflow: ellipsis;
707
+ white-space: nowrap;
708
+ }
709
+
710
+ [data-select-value-custom] {
711
+ display: contents;
712
+ }
713
+
714
+ [data-select-value-custom] > button,
715
+ [data-select-value-custom] > a {
716
+ display: contents;
717
+ }
718
+
719
+ [data-select-placeholder] {
720
+ opacity: 0.6;
721
+ }
722
+
723
+ [data-select-arrow] {
724
+ flex-shrink: 0;
725
+ transition: transform 150ms ease;
726
+ }
727
+
728
+ [data-select][data-open='true'] [data-select-arrow] {
729
+ transform: rotate(180deg);
730
+ }
731
+
732
+ /* Arrow sizes */
733
+ [data-select][data-size='sm'] [data-select-arrow] {
734
+ font-size: 0.875rem;
735
+ }
736
+ [data-select][data-size='md'] [data-select-arrow],
737
+ [data-select]:not([data-size]) [data-select-arrow] {
738
+ font-size: 1rem;
739
+ }
740
+ [data-select][data-size='lg'] [data-select-arrow] {
741
+ font-size: 1.125rem;
742
+ }
743
+
744
+ /* =============================================================================
745
+ MultiSelect Tags
746
+ ============================================================================= */
747
+
748
+ [data-select-tags] {
749
+ display: flex;
750
+ flex-wrap: wrap;
751
+ gap: 0.25rem;
752
+ align-items: center;
753
+ }
754
+
755
+ [data-select-tag] {
756
+ display: inline-flex;
757
+ align-items: center;
758
+ gap: 0.25rem;
759
+ padding: 0.125rem 0.375rem;
760
+ border-radius: 0.25rem;
761
+ font-size: 0.75em;
762
+ line-height: 1.25;
763
+ }
764
+
765
+ [data-select-tag-text] {
766
+ white-space: nowrap;
767
+ }
768
+
769
+ [data-select-tag-remove] {
770
+ display: flex;
771
+ align-items: center;
772
+ justify-content: center;
773
+ padding: 0;
774
+ border: none;
775
+ background: transparent;
776
+ cursor: pointer;
777
+ border-radius: 0.125rem;
778
+ font-size: 0.75em;
779
+ opacity: 0.7;
780
+ transition: opacity 150ms ease;
781
+ }
782
+
783
+ [data-select-tag-remove]:hover {
784
+ opacity: 1;
785
+ }
786
+
787
+ [data-select-count] {
788
+ font-weight: 500;
789
+ }
790
+
791
+ /* =============================================================================
792
+ Dropdown Panel
793
+ ============================================================================= */
794
+
795
+ [data-select-dropdown] {
796
+ position: absolute;
797
+ z-index: 50;
798
+ min-width: 100%;
799
+ overflow-y: auto;
800
+ border-radius: 0.5rem;
801
+ }
802
+
803
+ /* Direction: down (default) */
804
+ [data-select][data-direction='down'] [data-select-dropdown],
805
+ [data-select]:not([data-direction]) [data-select-dropdown] {
806
+ top: calc(100% + 4px);
807
+ animation: select-dropdown-down 150ms ease;
808
+ }
809
+
810
+ /* Direction: up */
811
+ [data-select][data-direction='up'] [data-select-dropdown] {
812
+ bottom: calc(100% + 4px);
813
+ animation: select-dropdown-up 150ms ease;
814
+ }
815
+
816
+ /* Alignment */
817
+ [data-select][data-align='left'] [data-select-dropdown],
818
+ [data-select]:not([data-align]) [data-select-dropdown] {
819
+ left: 0;
820
+ }
821
+
822
+ [data-select][data-align='right'] [data-select-dropdown] {
823
+ right: 0;
824
+ }
825
+
826
+ @keyframes select-dropdown-down {
827
+ from {
828
+ opacity: 0;
829
+ transform: translateY(-4px);
830
+ }
831
+ to {
832
+ opacity: 1;
833
+ transform: translateY(0);
834
+ }
835
+ }
836
+
837
+ @keyframes select-dropdown-up {
838
+ from {
839
+ opacity: 0;
840
+ transform: translateY(4px);
841
+ }
842
+ to {
843
+ opacity: 1;
844
+ transform: translateY(0);
845
+ }
846
+ }
847
+
848
+ /* =============================================================================
849
+ Select Options
850
+ ============================================================================= */
851
+
852
+ [data-select-option] {
853
+ display: flex;
854
+ align-items: center;
855
+ width: 100%;
856
+ text-align: left;
857
+ cursor: pointer;
858
+ border: none;
859
+ background: transparent;
860
+ transition: background-color 150ms ease;
861
+ }
862
+
863
+ [data-select-option][data-disabled='true'],
864
+ [data-select-option]:disabled {
865
+ pointer-events: none;
866
+ opacity: 0.5;
867
+ cursor: not-allowed;
868
+ }
869
+
870
+ [data-select-option]:focus,
871
+ [data-select-option]:focus-visible {
872
+ outline: none;
873
+ }
874
+
875
+ /* Size variants for options */
876
+ [data-select][data-size='sm'] [data-select-option] {
877
+ gap: 0.5rem;
878
+ padding: 0.375rem 0.5rem;
879
+ font-size: 0.75rem;
880
+ }
881
+
882
+ [data-select][data-size='md'] [data-select-option],
883
+ [data-select]:not([data-size]) [data-select-option] {
884
+ gap: 0.625rem;
885
+ padding: 0.5rem 0.75rem;
886
+ font-size: 0.875rem;
887
+ }
888
+
889
+ [data-select][data-size='lg'] [data-select-option] {
890
+ gap: 0.75rem;
891
+ padding: 0.625rem 1rem;
892
+ font-size: 1rem;
893
+ }
894
+
895
+ /* Check mark for single select */
896
+ [data-select-check] {
897
+ flex-shrink: 0;
898
+ margin-left: auto;
899
+ }
900
+
901
+ /* Checkbox for multi select */
902
+ [data-select-checkbox] {
903
+ display: flex;
904
+ align-items: center;
905
+ justify-content: center;
906
+ flex-shrink: 0;
907
+ width: 1rem;
908
+ height: 1rem;
909
+ border-radius: 0.25rem;
910
+ border: 1px solid currentColor;
911
+ font-size: 0.75rem;
912
+ }
913
+
914
+ /* =============================================================================
915
+ Custom Snippet Wrapper
916
+ ============================================================================= */
917
+
918
+ [data-select-option-custom] {
919
+ display: contents;
920
+ }
921
+
922
+ [data-select-option-custom] > button {
923
+ display: flex;
924
+ align-items: center;
925
+ width: 100%;
926
+ text-align: left;
927
+ background: transparent;
928
+ border: none;
929
+ cursor: pointer;
930
+ transition: background-color 150ms ease;
931
+ }
932
+
933
+ /* Size variants for custom snippet buttons */
934
+ [data-select][data-size='sm'] [data-select-option-custom] > button {
935
+ gap: 0.5rem;
936
+ padding: 0.375rem 0.5rem;
937
+ font-size: 0.75rem;
938
+ }
939
+
940
+ [data-select][data-size='md'] [data-select-option-custom] > button,
941
+ [data-select]:not([data-size]) [data-select-option-custom] > button {
942
+ gap: 0.625rem;
943
+ padding: 0.5rem 0.75rem;
944
+ font-size: 0.875rem;
945
+ }
946
+
947
+ [data-select][data-size='lg'] [data-select-option-custom] > button {
948
+ gap: 0.75rem;
949
+ padding: 0.625rem 1rem;
950
+ font-size: 1rem;
951
+ }
952
+
953
+ /* =============================================================================
954
+ Groups
955
+ ============================================================================= */
956
+
957
+ [data-select-group] {
958
+ padding-block: 0.25rem;
959
+ }
960
+
961
+ [data-select-group-label] {
962
+ display: flex;
963
+ align-items: center;
964
+ gap: 0.5rem;
965
+ font-size: 0.75rem;
966
+ font-weight: 600;
967
+ text-transform: uppercase;
968
+ letter-spacing: 0.05em;
969
+ }
970
+
971
+ /* Group label sizes */
972
+ [data-select][data-size='sm'] [data-select-group-label] {
973
+ padding: 0.25rem 0.5rem;
974
+ }
975
+ [data-select][data-size='md'] [data-select-group-label],
976
+ [data-select]:not([data-size]) [data-select-group-label] {
977
+ padding: 0.375rem 0.75rem;
978
+ }
979
+ [data-select][data-size='lg'] [data-select-group-label] {
980
+ padding: 0.5rem 1rem;
981
+ }
982
+
983
+ [data-select-group-label] > [data-select-group-icon] {
984
+ flex-shrink: 0;
985
+ opacity: 0.7;
986
+ }
987
+
988
+ /* =============================================================================
989
+ Divider
990
+ ============================================================================= */
991
+
992
+ [data-select-divider] {
993
+ height: 1px;
994
+ margin-block: 0.25rem;
995
+ }
996
+
997
+ /* =============================================================================
998
+ Filter Input (filterable mode)
999
+ ============================================================================= */
1000
+
1001
+ [data-select-filter] {
1002
+ padding: 0.375rem;
1003
+ position: sticky;
1004
+ top: 0;
1005
+ z-index: 1;
1006
+ }
1007
+
1008
+ [data-select-filter-input] {
1009
+ width: 100%;
1010
+ box-sizing: border-box;
1011
+ border: 1px solid transparent;
1012
+ border-radius: 0.25rem;
1013
+ padding: 0.375rem 0.5rem;
1014
+ font-size: inherit;
1015
+ outline: none;
1016
+ background: transparent;
1017
+ }
1018
+
1019
+ /* =============================================================================
1020
+ Empty State (no filter results)
1021
+ ============================================================================= */
1022
+
1023
+ [data-select-empty] {
1024
+ padding: 0.5rem 0.75rem;
1025
+ font-size: 0.875rem;
1026
+ text-align: center;
1027
+ opacity: 0.6;
1028
+ }
1029
+
1030
+ /**
1031
+ * Toolbar - Base Structural Styles
1032
+ *
1033
+ * These styles provide layout, positioning, and basic structure.
1034
+ * No colors, shadows, or visual theming - those belong in theme styles.
1035
+ */
1036
+
1037
+ /* =============================================================================
1038
+ Toolbar Container
1039
+ ============================================================================= */
1040
+
1041
+ [data-toolbar] {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ gap: 0.25rem;
1045
+ }
1046
+
1047
+ [data-toolbar][data-toolbar-disabled='true'] {
1048
+ pointer-events: none;
1049
+ opacity: 0.5;
1050
+ }
1051
+
1052
+ /* Position variants - horizontal */
1053
+ [data-toolbar][data-toolbar-position='top'],
1054
+ [data-toolbar][data-toolbar-position='bottom'],
1055
+ [data-toolbar]:not([data-toolbar-position]) {
1056
+ flex-direction: row;
1057
+ }
1058
+
1059
+ /* Position variants - vertical */
1060
+ [data-toolbar][data-toolbar-position='left'],
1061
+ [data-toolbar][data-toolbar-position='right'] {
1062
+ flex-direction: column;
1063
+ height: 100%;
1064
+ width: auto;
1065
+ }
1066
+
1067
+ /* Sticky positioning */
1068
+ [data-toolbar][data-toolbar-sticky='true'] {
1069
+ position: sticky;
1070
+ z-index: 10;
1071
+ }
1072
+
1073
+ [data-toolbar][data-toolbar-sticky='true'][data-toolbar-position='top'],
1074
+ [data-toolbar][data-toolbar-sticky='true']:not([data-toolbar-position]) {
1075
+ top: 0;
1076
+ }
1077
+
1078
+ [data-toolbar][data-toolbar-sticky='true'][data-toolbar-position='bottom'] {
1079
+ bottom: 0;
1080
+ }
1081
+
1082
+ [data-toolbar][data-toolbar-sticky='true'][data-toolbar-position='left'] {
1083
+ left: 0;
1084
+ }
1085
+
1086
+ [data-toolbar][data-toolbar-sticky='true'][data-toolbar-position='right'] {
1087
+ right: 0;
1088
+ }
1089
+
1090
+ /* Size variants - horizontal */
1091
+ [data-toolbar][data-toolbar-size='sm'],
1092
+ [data-toolbar][data-size='sm'] {
1093
+ height: 2rem;
1094
+ padding-inline: 0.5rem;
1095
+ gap: 0.25rem;
1096
+ }
1097
+
1098
+ [data-toolbar][data-toolbar-size='md'],
1099
+ [data-toolbar][data-size='md'],
1100
+ [data-toolbar]:not([data-toolbar-size]):not([data-size]) {
1101
+ height: 2.5rem;
1102
+ padding-inline: 0.75rem;
1103
+ gap: 0.5rem;
1104
+ }
1105
+
1106
+ [data-toolbar][data-toolbar-size='lg'],
1107
+ [data-toolbar][data-size='lg'] {
1108
+ height: 3rem;
1109
+ padding-inline: 1rem;
1110
+ gap: 0.75rem;
1111
+ }
1112
+
1113
+ /* Compact mode */
1114
+ [data-toolbar][data-toolbar-compact='true'] {
1115
+ padding-block: 0;
1116
+ }
1117
+
1118
+ [data-toolbar]:not([data-toolbar-compact='true']) {
1119
+ padding-block: 0.25rem;
1120
+ }
1121
+
1122
+ /* Vertical toolbar size adjustments */
1123
+ [data-toolbar][data-toolbar-position='left'],
1124
+ [data-toolbar][data-toolbar-position='right'] {
1125
+ height: auto;
1126
+ padding-block: 0.5rem;
1127
+ padding-inline: 0.25rem;
1128
+ }
1129
+
1130
+ /* =============================================================================
1131
+ Toolbar Items (buttons, toggles)
1132
+ ============================================================================= */
1133
+
1134
+ [data-toolbar-item] {
1135
+ display: inline-flex;
1136
+ align-items: center;
1137
+ justify-content: center;
1138
+ border: none;
1139
+ background: transparent;
1140
+ cursor: pointer;
1141
+ border-radius: 0.25rem;
1142
+ transition: all 150ms ease;
1143
+ }
1144
+
1145
+ [data-toolbar-item]:focus {
1146
+ outline: none;
1147
+ }
1148
+
1149
+ [data-toolbar-item][data-disabled='true'],
1150
+ [data-toolbar-item]:disabled {
1151
+ pointer-events: none;
1152
+ opacity: 0.5;
1153
+ cursor: not-allowed;
1154
+ }
1155
+
1156
+ /* Size variants for items */
1157
+ [data-toolbar][data-toolbar-size='sm'] [data-toolbar-item],
1158
+ [data-toolbar][data-size='sm'] [data-toolbar-item] {
1159
+ min-width: 1.5rem;
1160
+ height: 1.5rem;
1161
+ padding: 0.25rem;
1162
+ }
1163
+
1164
+ [data-toolbar][data-toolbar-size='md'] [data-toolbar-item],
1165
+ [data-toolbar][data-size='md'] [data-toolbar-item],
1166
+ [data-toolbar]:not([data-toolbar-size]):not([data-size]) [data-toolbar-item] {
1167
+ min-width: 2rem;
1168
+ height: 2rem;
1169
+ padding: 0.375rem;
1170
+ }
1171
+
1172
+ [data-toolbar][data-toolbar-size='lg'] [data-toolbar-item],
1173
+ [data-toolbar][data-size='lg'] [data-toolbar-item] {
1174
+ min-width: 2.5rem;
1175
+ height: 2.5rem;
1176
+ padding: 0.5rem;
1177
+ }
1178
+
1179
+ /* =============================================================================
1180
+ Toolbar Item Elements (icon, label)
1181
+ ============================================================================= */
1182
+
1183
+ [data-toolbar-icon] {
1184
+ flex-shrink: 0;
1185
+ }
1186
+
1187
+ [data-toolbar-label] {
1188
+ white-space: nowrap;
1189
+ font-weight: 500;
1190
+ }
1191
+
1192
+ /* Icon sizes */
1193
+ [data-toolbar][data-toolbar-size='sm'] [data-toolbar-icon],
1194
+ [data-toolbar][data-size='sm'] [data-toolbar-icon] {
1195
+ font-size: 0.875rem;
1196
+ }
1197
+
1198
+ [data-toolbar][data-toolbar-size='md'] [data-toolbar-icon],
1199
+ [data-toolbar][data-size='md'] [data-toolbar-icon],
1200
+ [data-toolbar]:not([data-toolbar-size]):not([data-size]) [data-toolbar-icon] {
1201
+ font-size: 1rem;
1202
+ }
1203
+
1204
+ [data-toolbar][data-toolbar-size='lg'] [data-toolbar-icon],
1205
+ [data-toolbar][data-size='lg'] [data-toolbar-icon] {
1206
+ font-size: 1.25rem;
1207
+ }
1208
+
1209
+ /* Label sizes */
1210
+ [data-toolbar][data-toolbar-size='sm'] [data-toolbar-label],
1211
+ [data-toolbar][data-size='sm'] [data-toolbar-label] {
1212
+ font-size: 0.75rem;
1213
+ padding-inline: 0.25rem;
1214
+ }
1215
+
1216
+ [data-toolbar][data-toolbar-size='md'] [data-toolbar-label],
1217
+ [data-toolbar][data-size='md'] [data-toolbar-label],
1218
+ [data-toolbar]:not([data-toolbar-size]):not([data-size]) [data-toolbar-label] {
1219
+ font-size: 0.875rem;
1220
+ padding-inline: 0.375rem;
1221
+ }
1222
+
1223
+ [data-toolbar][data-toolbar-size='lg'] [data-toolbar-label],
1224
+ [data-toolbar][data-size='lg'] [data-toolbar-label] {
1225
+ font-size: 1rem;
1226
+ padding-inline: 0.5rem;
1227
+ }
1228
+
1229
+ /* =============================================================================
1230
+ Separator
1231
+ ============================================================================= */
1232
+
1233
+ [data-toolbar-separator] {
1234
+ flex-shrink: 0;
1235
+ }
1236
+
1237
+ /* Horizontal toolbar separator (vertical line) */
1238
+ [data-toolbar][data-toolbar-position='top'] [data-toolbar-separator],
1239
+ [data-toolbar][data-toolbar-position='bottom'] [data-toolbar-separator],
1240
+ [data-toolbar]:not([data-toolbar-position]) [data-toolbar-separator] {
1241
+ width: 1px;
1242
+ margin-inline: 0.5rem;
1243
+ }
1244
+
1245
+ [data-toolbar][data-toolbar-size='sm'] [data-toolbar-separator],
1246
+ [data-toolbar][data-size='sm'] [data-toolbar-separator] {
1247
+ height: 1rem;
1248
+ }
1249
+
1250
+ [data-toolbar][data-toolbar-size='md'] [data-toolbar-separator],
1251
+ [data-toolbar][data-size='md'] [data-toolbar-separator],
1252
+ [data-toolbar]:not([data-toolbar-size]):not([data-size]) [data-toolbar-separator] {
1253
+ height: 1.25rem;
1254
+ }
1255
+
1256
+ [data-toolbar][data-toolbar-size='lg'] [data-toolbar-separator],
1257
+ [data-toolbar][data-size='lg'] [data-toolbar-separator] {
1258
+ height: 1.5rem;
1259
+ }
1260
+
1261
+ /* Vertical toolbar separator (horizontal line) */
1262
+ [data-toolbar][data-toolbar-position='left'] [data-toolbar-separator],
1263
+ [data-toolbar][data-toolbar-position='right'] [data-toolbar-separator] {
1264
+ height: 1px;
1265
+ width: 1.5rem;
1266
+ margin-block: 0.5rem;
1267
+ }
1268
+
1269
+ /* =============================================================================
1270
+ Divider (between sections)
1271
+ ============================================================================= */
1272
+
1273
+ [data-toolbar-divider] {
1274
+ flex-shrink: 0;
1275
+ }
1276
+
1277
+ /* Horizontal toolbar divider (vertical line) */
1278
+ [data-toolbar][data-toolbar-position='top'] [data-toolbar-divider],
1279
+ [data-toolbar][data-toolbar-position='bottom'] [data-toolbar-divider],
1280
+ [data-toolbar]:not([data-toolbar-position]) [data-toolbar-divider] {
1281
+ width: 1px;
1282
+ height: 1.5rem;
1283
+ margin-inline: 0.5rem;
1284
+ }
1285
+
1286
+ /* Vertical toolbar divider (horizontal line) */
1287
+ [data-toolbar][data-toolbar-position='left'] [data-toolbar-divider],
1288
+ [data-toolbar][data-toolbar-position='right'] [data-toolbar-divider] {
1289
+ height: 1px;
1290
+ width: 1.5rem;
1291
+ margin-block: 0.5rem;
1292
+ }
1293
+
1294
+ /* =============================================================================
1295
+ Spacer
1296
+ ============================================================================= */
1297
+
1298
+ [data-toolbar-spacer] {
1299
+ flex: 1;
1300
+ }
1301
+
1302
+ /* =============================================================================
1303
+ Sections
1304
+ ============================================================================= */
1305
+
1306
+ [data-toolbar-section] {
1307
+ display: flex;
1308
+ align-items: center;
1309
+ gap: 0.5rem;
1310
+ }
1311
+
1312
+ [data-toolbar-section='center'] {
1313
+ flex: 1;
1314
+ justify-content: center;
1315
+ }
1316
+
1317
+ [data-toolbar-section='content'] {
1318
+ flex: 1;
1319
+ }
1320
+
1321
+ /* Vertical toolbar sections */
1322
+ [data-toolbar][data-toolbar-position='left'] [data-toolbar-section],
1323
+ [data-toolbar][data-toolbar-position='right'] [data-toolbar-section] {
1324
+ flex-direction: column;
1325
+ }
1326
+
1327
+ /* =============================================================================
1328
+ Toolbar Group
1329
+ ============================================================================= */
1330
+
1331
+ [data-toolbar-group] {
1332
+ display: flex;
1333
+ align-items: center;
1334
+ min-width: 0;
1335
+ }
1336
+
1337
+ [data-toolbar-group][data-toolbar-group-gap='none'] {
1338
+ gap: 0;
1339
+ }
1340
+
1341
+ [data-toolbar-group][data-toolbar-group-gap='sm'],
1342
+ [data-toolbar-group]:not([data-toolbar-group-gap]) {
1343
+ gap: 0.25rem;
1344
+ }
1345
+
1346
+ [data-toolbar-group][data-toolbar-group-gap='md'] {
1347
+ gap: 0.5rem;
1348
+ }
1349
+
1350
+ [data-toolbar-group][data-toolbar-group-gap='lg'] {
1351
+ gap: 0.75rem;
1352
+ }
1353
+
1354
+ /* Vertical toolbar groups */
1355
+ [data-toolbar][data-toolbar-position='left'] [data-toolbar-group],
1356
+ [data-toolbar][data-toolbar-position='right'] [data-toolbar-group] {
1357
+ flex-direction: column;
1358
+ }
1359
+
1360
+ /* =============================================================================
1361
+ Custom Item Wrapper
1362
+ ============================================================================= */
1363
+
1364
+ [data-toolbar-item-custom] {
1365
+ display: contents;
1366
+ }
1367
+
1368
+ /**
1369
+ * Tabs - Base Structural Styles
1370
+ *
1371
+ * These styles provide layout, positioning, and basic structure.
1372
+ * No colors, shadows, or visual theming - those belong in theme styles.
1373
+ */
1374
+
1375
+ /* =============================================================================
1376
+ Tabs Container
1377
+ ============================================================================= */
1378
+
1379
+ [data-tabs] {
1380
+ display: flex;
1381
+ flex-direction: column;
1382
+ user-select: none;
1383
+ }
1384
+
1385
+ /* Position: after → tab list below panels */
1386
+ [data-tabs][data-position='after'] {
1387
+ flex-direction: column-reverse;
1388
+ }
1389
+
1390
+ /* Vertical orientation → row layout */
1391
+ [data-tabs][data-orientation='vertical'] {
1392
+ flex-direction: row;
1393
+ }
1394
+
1395
+ [data-tabs][data-orientation='vertical'][data-position='after'] {
1396
+ flex-direction: row-reverse;
1397
+ }
1398
+
1399
+ [data-tabs][data-disabled] {
1400
+ pointer-events: none;
1401
+ opacity: 0.5;
1402
+ }
1403
+
1404
+ /* =============================================================================
1405
+ Tab List
1406
+ ============================================================================= */
1407
+
1408
+ [data-tabs-list] {
1409
+ display: flex;
1410
+ flex-shrink: 0;
1411
+ }
1412
+
1413
+ [data-tabs][data-orientation='vertical'] [data-tabs-list] {
1414
+ flex-direction: column;
1415
+ }
1416
+
1417
+ /* Alignment */
1418
+ [data-tabs][data-align='center'] [data-tabs-list] {
1419
+ justify-content: center;
1420
+ }
1421
+
1422
+ [data-tabs][data-align='end'] [data-tabs-list] {
1423
+ justify-content: flex-end;
1424
+ }
1425
+
1426
+ /* =============================================================================
1427
+ Tab Triggers
1428
+ ============================================================================= */
1429
+
1430
+ [data-tabs-trigger] {
1431
+ display: inline-flex;
1432
+ align-items: center;
1433
+ gap: 0.375rem;
1434
+ padding: 0.5rem 0.75rem;
1435
+ cursor: pointer;
1436
+ border: none;
1437
+ background: transparent;
1438
+ font-weight: 500;
1439
+ font-size: 0.875rem;
1440
+ line-height: 1.25rem;
1441
+ white-space: nowrap;
1442
+ transition: all 150ms ease;
1443
+ position: relative;
1444
+ }
1445
+
1446
+ [data-tabs-trigger]:focus {
1447
+ outline: none;
1448
+ }
1449
+
1450
+ [data-tabs-trigger]:focus-visible {
1451
+ outline: none;
1452
+ }
1453
+
1454
+ [data-tabs-trigger][data-disabled],
1455
+ [data-tabs-trigger]:disabled {
1456
+ pointer-events: none;
1457
+ opacity: 0.5;
1458
+ cursor: not-allowed;
1459
+ }
1460
+
1461
+ /* =============================================================================
1462
+ Tab Elements
1463
+ ============================================================================= */
1464
+
1465
+ [data-tabs-icon] {
1466
+ flex-shrink: 0;
1467
+ font-size: 1rem;
1468
+ }
1469
+
1470
+ [data-tabs-label] {
1471
+ overflow: hidden;
1472
+ text-overflow: ellipsis;
1473
+ }
1474
+
1475
+ /* =============================================================================
1476
+ Tab Panels
1477
+ ============================================================================= */
1478
+
1479
+ [data-tabs-panel] {
1480
+ display: none;
1481
+ }
1482
+
1483
+ [data-tabs-panel][data-panel-active] {
1484
+ display: block;
1485
+ }
1486
+
1487
+ [data-tabs-content] {
1488
+ padding: 0.75rem;
1489
+ flex-grow: 1;
1490
+ }
1491
+
1492
+ /* =============================================================================
1493
+ Empty / Placeholder
1494
+ ============================================================================= */
1495
+
1496
+ [data-tabs-empty],
1497
+ [data-tabs-placeholder] {
1498
+ padding: 1rem;
1499
+ text-align: center;
1500
+ font-size: 0.875rem;
1501
+ opacity: 0.6;
1502
+ }
1503
+
1504
+ /* =============================================================================
1505
+ Editable Mode
1506
+ ============================================================================= */
1507
+
1508
+ [data-tabs-remove] {
1509
+ display: inline-flex;
1510
+ align-items: center;
1511
+ justify-content: center;
1512
+ cursor: pointer;
1513
+ font-size: 0.75rem;
1514
+ opacity: 0.5;
1515
+ transition: opacity 150ms ease;
1516
+ margin-left: 0.25rem;
1517
+ }
1518
+
1519
+ [data-tabs-remove]:hover {
1520
+ opacity: 1;
1521
+ }
1522
+
1523
+ [data-tabs-add] {
1524
+ display: inline-flex;
1525
+ align-items: center;
1526
+ justify-content: center;
1527
+ padding: 0.5rem;
1528
+ cursor: pointer;
1529
+ border: none;
1530
+ background: transparent;
1531
+ font-size: 1rem;
1532
+ opacity: 0.5;
1533
+ transition: opacity 150ms ease;
1534
+ }
1535
+
1536
+ [data-tabs-add]:hover {
1537
+ opacity: 1;
1538
+ }
1539
+
1540
+ /**
1541
+ * Toggle - Base Structural Styles
1542
+ *
1543
+ * These styles provide layout, positioning, and basic structure.
1544
+ * No colors, shadows, or visual theming - those belong in theme styles.
1545
+ */
1546
+
1547
+ /* =============================================================================
1548
+ Toggle Container
1549
+ ============================================================================= */
1550
+
1551
+ [data-toggle] {
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ border-radius: 0.5rem;
1555
+ padding: 0.25rem;
1556
+ gap: 0.125rem;
1557
+ }
1558
+
1559
+ [data-toggle][data-toggle-disabled='true'] {
1560
+ pointer-events: none;
1561
+ opacity: 0.5;
1562
+ }
1563
+
1564
+ [dir='rtl'] [data-toggle] {
1565
+ flex-direction: row-reverse;
1566
+ }
1567
+
1568
+ /* =============================================================================
1569
+ Toggle Options
1570
+ ============================================================================= */
1571
+
1572
+ [data-toggle-option] {
1573
+ display: inline-flex;
1574
+ align-items: center;
1575
+ justify-content: center;
1576
+ border-radius: 0.375rem;
1577
+ font-weight: 500;
1578
+ transition: all 150ms ease;
1579
+ cursor: pointer;
1580
+ border: 1px solid transparent;
1581
+ white-space: nowrap;
1582
+ user-select: none;
1583
+ background: transparent;
1584
+ }
1585
+
1586
+ [data-toggle-option]:focus {
1587
+ outline: none;
1588
+ }
1589
+
1590
+ [data-toggle-option]:focus-visible {
1591
+ outline: none;
1592
+ }
1593
+
1594
+ [data-toggle-option][data-disabled='true'],
1595
+ [data-toggle-option]:disabled {
1596
+ pointer-events: none;
1597
+ opacity: 0.5;
1598
+ cursor: not-allowed;
1599
+ }
1600
+
1601
+ /* =============================================================================
1602
+ Size Variants
1603
+ ============================================================================= */
1604
+
1605
+ /* Small */
1606
+ [data-toggle][data-toggle-size='sm'] [data-toggle-option] {
1607
+ height: 1.5rem;
1608
+ font-size: 0.75rem;
1609
+ gap: 0.25rem;
1610
+ }
1611
+
1612
+ [data-toggle][data-toggle-size='sm'][data-toggle-labels='true'] [data-toggle-option] {
1613
+ padding-inline: 0.375rem;
1614
+ }
1615
+
1616
+ [data-toggle][data-toggle-size='sm']:not([data-toggle-labels='true']) [data-toggle-option] {
1617
+ padding-inline: 0.25rem;
1618
+ }
1619
+
1620
+ [data-toggle][data-toggle-size='sm'] [data-toggle-icon] {
1621
+ font-size: 0.875rem;
1622
+ }
1623
+
1624
+ /* Medium (default) */
1625
+ [data-toggle][data-toggle-size='md'] [data-toggle-option],
1626
+ [data-toggle]:not([data-toggle-size]) [data-toggle-option] {
1627
+ height: 2rem;
1628
+ font-size: 0.875rem;
1629
+ gap: 0.375rem;
1630
+ }
1631
+
1632
+ [data-toggle][data-toggle-size='md'][data-toggle-labels='true'] [data-toggle-option],
1633
+ [data-toggle]:not([data-toggle-size])[data-toggle-labels='true'] [data-toggle-option] {
1634
+ padding-inline: 0.5rem;
1635
+ }
1636
+
1637
+ [data-toggle][data-toggle-size='md']:not([data-toggle-labels='true']) [data-toggle-option],
1638
+ [data-toggle]:not([data-toggle-size]):not([data-toggle-labels='true']) [data-toggle-option] {
1639
+ padding-inline: 0.375rem;
1640
+ }
1641
+
1642
+ [data-toggle][data-toggle-size='md'] [data-toggle-icon],
1643
+ [data-toggle]:not([data-toggle-size]) [data-toggle-icon] {
1644
+ font-size: 1rem;
1645
+ }
1646
+
1647
+ /* Large */
1648
+ [data-toggle][data-toggle-size='lg'] [data-toggle-option] {
1649
+ height: 2.5rem;
1650
+ font-size: 1rem;
1651
+ gap: 0.5rem;
1652
+ }
1653
+
1654
+ [data-toggle][data-toggle-size='lg'][data-toggle-labels='true'] [data-toggle-option] {
1655
+ padding-inline: 0.75rem;
1656
+ }
1657
+
1658
+ [data-toggle][data-toggle-size='lg']:not([data-toggle-labels='true']) [data-toggle-option] {
1659
+ padding-inline: 0.5rem;
1660
+ }
1661
+
1662
+ [data-toggle][data-toggle-size='lg'] [data-toggle-icon] {
1663
+ font-size: 1.25rem;
1664
+ }
1665
+
1666
+ /* =============================================================================
1667
+ Toggle Elements
1668
+ ============================================================================= */
1669
+
1670
+ [data-toggle-icon] {
1671
+ flex-shrink: 0;
1672
+ }
1673
+
1674
+ [data-toggle-label] {
1675
+ overflow: hidden;
1676
+ text-overflow: ellipsis;
1677
+ }
1678
+
1679
+ /**
1680
+ * List - Base Structural Styles
1681
+ *
1682
+ * These styles provide layout, positioning, and basic structure.
1683
+ * No colors, shadows, or visual theming - those belong in theme styles.
1684
+ */
1685
+
1686
+ /* =============================================================================
1687
+ List Container
1688
+ ============================================================================= */
1689
+
1690
+ [data-list] {
1691
+ display: flex;
1692
+ flex-direction: column;
1693
+ }
1694
+
1695
+ [data-list][data-disabled='true'] {
1696
+ pointer-events: none;
1697
+ opacity: 0.5;
1698
+ }
1699
+
1700
+ [dir='rtl'] [data-list] [data-list-item] {
1701
+ flex-direction: row-reverse;
1702
+ text-align: right;
1703
+ }
1704
+
1705
+ /* =============================================================================
1706
+ List Items (shared for links and buttons)
1707
+ ============================================================================= */
1708
+
1709
+ [data-list-item] {
1710
+ display: flex;
1711
+ align-items: center;
1712
+ width: 100%;
1713
+ text-align: left;
1714
+ text-decoration: none;
1715
+ cursor: pointer;
1716
+ transition:
1717
+ background-color 150ms ease,
1718
+ color 150ms ease;
1719
+ }
1720
+
1721
+ a[data-list-item],
1722
+ button[data-list-item] {
1723
+ display: flex;
1724
+ align-items: center;
1725
+ gap: 0.75rem;
1726
+ padding: 0.375rem 0.75rem;
1727
+ font-size: 0.875rem;
1728
+ text-decoration: none;
1729
+ cursor: pointer;
1730
+ transition:
1731
+ background-color 150ms ease,
1732
+ color 150ms ease;
1733
+ }
1734
+
1735
+ [data-list-item][data-disabled='true'],
1736
+ [data-list-item]:disabled {
1737
+ pointer-events: none;
1738
+ opacity: 0.5;
1739
+ cursor: not-allowed;
1740
+ }
1741
+
1742
+ [data-list-item]:focus {
1743
+ outline: none;
1744
+ }
1745
+
1746
+ /* Size variants for items */
1747
+ [data-list][data-size='sm'] [data-list-item],
1748
+ [data-list][data-size='sm'] a[data-list-item],
1749
+ [data-list][data-size='sm'] button[data-list-item] {
1750
+ gap: 0.5rem;
1751
+ padding: 0.25rem 0.5rem;
1752
+ font-size: 0.75rem;
1753
+ }
1754
+
1755
+ [data-list][data-size='md'] [data-list-item],
1756
+ [data-list]:not([data-size]) [data-list-item],
1757
+ [data-list][data-size='md'] a[data-list-item],
1758
+ [data-list]:not([data-size]) a[data-list-item],
1759
+ [data-list][data-size='md'] button[data-list-item],
1760
+ [data-list]:not([data-size]) button[data-list-item] {
1761
+ gap: 0.625rem;
1762
+ padding: 0.375rem 0.75rem;
1763
+ font-size: 0.875rem;
1764
+ }
1765
+
1766
+ [data-list][data-size='lg'] [data-list-item],
1767
+ [data-list][data-size='lg'] a[data-list-item],
1768
+ [data-list][data-size='lg'] button[data-list-item] {
1769
+ gap: 0.75rem;
1770
+ padding: 0.5rem 1rem;
1771
+ font-size: 1rem;
1772
+ }
1773
+
1774
+ /* =============================================================================
1775
+ Item Elements - uses shared [data-item-*] from item.css
1776
+ ============================================================================= */
1777
+
1778
+ /* =============================================================================
1779
+ Groups
1780
+ ============================================================================= */
1781
+
1782
+ [data-list-group] {
1783
+ display: flex;
1784
+ align-items: center;
1785
+ width: 100%;
1786
+ gap: 0.5rem;
1787
+ padding-block: 0.25rem;
1788
+ font-size: 0.75rem;
1789
+ font-weight: 600;
1790
+ text-transform: uppercase;
1791
+ letter-spacing: 0.05em;
1792
+ cursor: pointer;
1793
+ transition: color 150ms ease;
1794
+ }
1795
+
1796
+ /* Non-collapsible group labels are not interactive */
1797
+ [data-list]:not([data-collapsible='true']) [data-list-group] {
1798
+ cursor: default;
1799
+ }
1800
+
1801
+ [data-list-group]:focus {
1802
+ outline: none;
1803
+ }
1804
+
1805
+ /* Group label sizes */
1806
+ [data-list][data-size='sm'] [data-list-group] {
1807
+ padding: 0.25rem 0.5rem;
1808
+ }
1809
+ [data-list][data-size='md'] [data-list-group],
1810
+ [data-list]:not([data-size]) [data-list-group] {
1811
+ padding: 0.375rem 0.75rem;
1812
+ }
1813
+ [data-list][data-size='lg'] [data-list-group] {
1814
+ padding: 0.5rem 1rem;
1815
+ }
1816
+
1817
+ /* Group item content — inherits font from [data-list-group], label stays inline */
1818
+ [data-list-group] > [data-item-icon] {
1819
+ opacity: 0.7;
1820
+ }
1821
+
1822
+ [data-list-group] > [data-item-text] {
1823
+ display: contents;
1824
+ }
1825
+
1826
+ [data-list-group] [data-item-label] {
1827
+ font-weight: inherit;
1828
+ }
1829
+
1830
+ /* Expand/collapse chevron — pushed to the right edge */
1831
+ [data-list-expand-icon] {
1832
+ flex-shrink: 0;
1833
+ margin-left: auto;
1834
+ transition: transform 150ms ease;
1835
+ }
1836
+
1837
+ /* =============================================================================
1838
+ Multi-selection
1839
+ ============================================================================= */
1840
+
1841
+ [data-list][data-multiselect='true'] [data-list-item] {
1842
+ user-select: none;
1843
+ }
1844
+
1845
+ /* =============================================================================
1846
+ Separator / Spacer
1847
+ ============================================================================= */
1848
+
1849
+ [data-list-separator] {
1850
+ height: 1px;
1851
+ margin-block: 0.25rem;
1852
+ border: none;
1853
+ }
1854
+
1855
+ [data-list-spacer] {
1856
+ height: 0.5rem;
1857
+ }
1858
+
1859
+ /**
1860
+ * Connector - Base Structural Styles
1861
+ *
1862
+ * Tree line connector component based on @rokkit/ui Connector.
1863
+ * Supports LTR and RTL layouts.
1864
+ */
1865
+
1866
+ /* =============================================================================
1867
+ Connector Container
1868
+ ============================================================================= */
1869
+
1870
+ [data-connector] {
1871
+ display: grid;
1872
+ grid-template-columns: 1fr 1fr;
1873
+ grid-template-rows: 1fr 1fr;
1874
+ flex-shrink: 0;
1875
+ align-self: stretch;
1876
+ width: 1rem;
1877
+ min-height: 1.5rem;
1878
+ }
1879
+
1880
+ /* Size variants (inherited from parent tree) */
1881
+ [data-tree][data-size='sm'] [data-connector] {
1882
+ width: 1rem;
1883
+ min-height: 1.5rem;
1884
+ }
1885
+
1886
+ [data-tree][data-size='md'] [data-connector],
1887
+ [data-tree]:not([data-size]) [data-connector] {
1888
+ width: 1.25rem;
1889
+ min-height: 1.75rem;
1890
+ }
1891
+
1892
+ [data-tree][data-size='lg'] [data-connector] {
1893
+ width: 1.5rem;
1894
+ min-height: 2rem;
1895
+ }
1896
+
1897
+ /* =============================================================================
1898
+ Line Elements
1899
+ ============================================================================= */
1900
+
1901
+ [data-connector] > i {
1902
+ display: block;
1903
+ }
1904
+
1905
+ /* Vertical line - half height (for 'last' connector) */
1906
+ [data-connector-v] {
1907
+ grid-column: 1;
1908
+ grid-row: 1;
1909
+ }
1910
+
1911
+ /* Vertical line - full height (for 'child' and 'sibling' connectors) */
1912
+ [data-connector-v][data-connector-full] {
1913
+ grid-row: 1 / -1;
1914
+ }
1915
+
1916
+ /* Horizontal line (connects to node content) - positioned in row 1 with border-bottom */
1917
+ [data-connector-h] {
1918
+ grid-column: 2;
1919
+ grid-row: 1;
1920
+ }
1921
+
1922
+ /* Corner connector for RTL - combines vertical and horizontal */
1923
+ [data-connector-corner] {
1924
+ grid-column: 1;
1925
+ grid-row: 1;
1926
+ }
1927
+
1928
+ /* =============================================================================
1929
+ RTL Support
1930
+ ============================================================================= */
1931
+
1932
+ [data-connector][data-connector-rtl] [data-connector-v] {
1933
+ grid-column: 2;
1934
+ }
1935
+
1936
+ [data-connector][data-connector-rtl] [data-connector-h] {
1937
+ grid-column: 1;
1938
+ }
1939
+
1940
+ [data-connector][data-connector-rtl] [data-connector-corner] {
1941
+ grid-column: 2;
1942
+ }
1943
+
1944
+ /* =============================================================================
1945
+ Empty Connector (spacer)
1946
+ ============================================================================= */
1947
+
1948
+ [data-connector][data-connector-type='empty'] {
1949
+ /* Just takes up space, no visible lines */
1950
+ }
1951
+
1952
+ /**
1953
+ * Tree - Base Structural Styles
1954
+ *
1955
+ * These styles provide layout, positioning, and basic structure.
1956
+ * No colors, shadows, or visual theming - those belong in theme styles.
1957
+ *
1958
+ * Note: Connector styles are in connector.css
1959
+ */
1960
+
1961
+ /* =============================================================================
1962
+ Tree Container
1963
+ ============================================================================= */
1964
+
1965
+ [data-tree] {
1966
+ display: flex;
1967
+ flex-direction: column;
1968
+ }
1969
+
1970
+ /* =============================================================================
1971
+ Tree Node
1972
+ ============================================================================= */
1973
+
1974
+ [data-tree-node] {
1975
+ display: flex;
1976
+ flex-direction: column;
1977
+ }
1978
+
1979
+ [data-tree-node]:focus {
1980
+ outline: none;
1981
+ }
1982
+
1983
+ [data-tree-node-row] {
1984
+ display: flex;
1985
+ align-items: stretch;
1986
+ }
1987
+
1988
+ /* =============================================================================
1989
+ Tree Toggle Button (Expand/Collapse)
1990
+ ============================================================================= */
1991
+
1992
+ [data-tree-toggle-btn] {
1993
+ display: flex;
1994
+ align-items: center;
1995
+ justify-content: center;
1996
+ flex-shrink: 0;
1997
+ align-self: center;
1998
+ padding: 0;
1999
+ border: none;
2000
+ background: transparent;
2001
+ cursor: pointer;
2002
+ border-radius: 0.25rem;
2003
+ transition: background-color 150ms ease;
2004
+ }
2005
+
2006
+ /* Size variants for toggle */
2007
+ [data-tree][data-size='sm'] [data-tree-toggle-btn] {
2008
+ width: 1rem;
2009
+ height: 1rem;
2010
+ }
2011
+
2012
+ [data-tree][data-size='md'] [data-tree-toggle-btn],
2013
+ [data-tree]:not([data-size]) [data-tree-toggle-btn] {
2014
+ width: 1.25rem;
2015
+ height: 1.25rem;
2016
+ }
2017
+
2018
+ [data-tree][data-size='lg'] [data-tree-toggle-btn] {
2019
+ width: 1.5rem;
2020
+ height: 1.5rem;
2021
+ }
2022
+
2023
+ /* Toggle icon container */
2024
+ [data-tree-toggle] {
2025
+ display: flex;
2026
+ align-items: center;
2027
+ justify-content: center;
2028
+ width: 100%;
2029
+ height: 100%;
2030
+ }
2031
+
2032
+ [data-tree-toggle]:not([data-tree-has-children]) {
2033
+ /* Leaf node - no toggle needed */
2034
+ visibility: hidden;
2035
+ }
2036
+
2037
+ /* =============================================================================
2038
+ Line Style Variants
2039
+ Connectors have no borders by default. data-line-style activates them.
2040
+ 'none' keeps connectors in DOM for spacing but lines stay invisible.
2041
+ ============================================================================= */
2042
+
2043
+ /* Shared: activate 1px border for all visible line styles (solid/dashed/dotted).
2044
+ Uses longhand width+style so theme border-color is not overridden. */
2045
+ [data-tree]:not([data-line-style='none']) [data-connector-v] {
2046
+ border-right-width: 1px;
2047
+ }
2048
+ [data-tree]:not([data-line-style='none']) [data-connector-h] {
2049
+ border-bottom-width: 1px;
2050
+ }
2051
+ [data-tree]:not([data-line-style='none']) [data-connector-corner] {
2052
+ border-bottom-width: 1px;
2053
+ border-right-width: 1px;
2054
+ }
2055
+ [data-tree]:not([data-line-style='none']) [data-connector-rtl] [data-connector-v] {
2056
+ border-right-width: 0;
2057
+ border-left-width: 1px;
2058
+ }
2059
+ [data-tree]:not([data-line-style='none']) [data-connector-rtl] [data-connector-corner] {
2060
+ border-right-width: 0;
2061
+ border-left-width: 1px;
2062
+ }
2063
+
2064
+ /* Solid (default visible style) */
2065
+ [data-tree][data-line-style='solid'] [data-connector-v] { border-right-style: solid; }
2066
+ [data-tree][data-line-style='solid'] [data-connector-h] { border-bottom-style: solid; }
2067
+ [data-tree][data-line-style='solid'] [data-connector-corner] { border-bottom-style: solid; border-right-style: solid; }
2068
+ [data-tree][data-line-style='solid'] [data-connector-rtl] [data-connector-v] { border-left-style: solid; }
2069
+ [data-tree][data-line-style='solid'] [data-connector-rtl] [data-connector-corner] { border-left-style: solid; }
2070
+
2071
+ /* Dashed */
2072
+ [data-tree][data-line-style='dashed'] [data-connector-v] { border-right-style: dashed; }
2073
+ [data-tree][data-line-style='dashed'] [data-connector-h] { border-bottom-style: dashed; }
2074
+ [data-tree][data-line-style='dashed'] [data-connector-corner] { border-bottom-style: dashed; border-right-style: dashed; }
2075
+ [data-tree][data-line-style='dashed'] [data-connector-rtl] [data-connector-v] { border-left-style: dashed; }
2076
+ [data-tree][data-line-style='dashed'] [data-connector-rtl] [data-connector-corner] { border-left-style: dashed; }
2077
+
2078
+ /* Dotted */
2079
+ [data-tree][data-line-style='dotted'] [data-connector-v] { border-right-style: dotted; }
2080
+ [data-tree][data-line-style='dotted'] [data-connector-h] { border-bottom-style: dotted; }
2081
+ [data-tree][data-line-style='dotted'] [data-connector-corner] { border-bottom-style: dotted; border-right-style: dotted; }
2082
+ [data-tree][data-line-style='dotted'] [data-connector-rtl] [data-connector-v] { border-left-style: dotted; }
2083
+ [data-tree][data-line-style='dotted'] [data-connector-rtl] [data-connector-corner] { border-left-style: dotted; }
2084
+
2085
+ /* =============================================================================
2086
+ Tree Item Content
2087
+ ============================================================================= */
2088
+
2089
+ [data-tree-item-content] {
2090
+ display: flex;
2091
+ align-items: center;
2092
+ align-self: center;
2093
+ flex: 1;
2094
+ min-width: 0;
2095
+ padding: 0.25rem 0.375rem;
2096
+ border: none;
2097
+ background: transparent;
2098
+ text-align: left;
2099
+ cursor: pointer;
2100
+ border-radius: 0.25rem;
2101
+ font: inherit;
2102
+ color: inherit;
2103
+ transition:
2104
+ background-color 150ms ease,
2105
+ color 150ms ease;
2106
+ }
2107
+
2108
+ /* Size variants for item content */
2109
+ [data-tree][data-size='sm'] [data-tree-item-content] {
2110
+ gap: 0.375rem;
2111
+ font-size: 0.75rem;
2112
+ }
2113
+
2114
+ [data-tree][data-size='md'] [data-tree-item-content],
2115
+ [data-tree]:not([data-size]) [data-tree-item-content] {
2116
+ gap: 0.5rem;
2117
+ font-size: 0.875rem;
2118
+ }
2119
+
2120
+ [data-tree][data-size='lg'] [data-tree-item-content] {
2121
+ gap: 0.625rem;
2122
+ font-size: 1rem;
2123
+ }
2124
+
2125
+ /* Item elements use shared [data-item-*] from item.css */
2126
+
2127
+ /* =============================================================================
2128
+ Loading Spinner
2129
+ ============================================================================= */
2130
+
2131
+ [data-tree-spinner] {
2132
+ width: 1em;
2133
+ height: 1em;
2134
+ border: 2px solid currentColor;
2135
+ border-right-color: transparent;
2136
+ border-radius: 50%;
2137
+ animation: tree-spin 0.6s linear infinite;
2138
+ flex-shrink: 0;
2139
+ }
2140
+
2141
+ @keyframes tree-spin {
2142
+ to {
2143
+ transform: rotate(360deg);
2144
+ }
2145
+ }
2146
+
2147
+ /* =============================================================================
2148
+ Multi-selection
2149
+ ============================================================================= */
2150
+
2151
+ [data-tree][data-multiselect='true'] [data-tree-item-content] {
2152
+ user-select: none;
2153
+ }
2154
+
2155
+ /**
2156
+ * FloatingAction - Base Structural Styles
2157
+ *
2158
+ * These styles provide layout, positioning, and basic structure.
2159
+ * No colors, shadows, or visual theming - those belong in theme styles.
2160
+ */
2161
+
2162
+ /* =============================================================================
2163
+ FAB Container
2164
+ ============================================================================= */
2165
+
2166
+ [data-fab] {
2167
+ position: fixed;
2168
+ z-index: 50;
2169
+ display: flex;
2170
+ flex-direction: column;
2171
+ align-items: center;
2172
+ background: transparent;
2173
+ /* Ensure the container only sizes to the trigger button */
2174
+ width: fit-content;
2175
+ height: fit-content;
2176
+ }
2177
+
2178
+ /* Contained mode - position relative to parent instead of viewport */
2179
+ [data-fab][data-contained] {
2180
+ position: absolute;
2181
+ }
2182
+
2183
+ [data-fab][data-contained] [data-fab-backdrop] {
2184
+ position: absolute;
2185
+ }
2186
+
2187
+ /* Position variants */
2188
+ [data-fab][data-position='bottom-right'] {
2189
+ bottom: 1.5rem;
2190
+ right: 1.5rem;
2191
+ }
2192
+
2193
+ [data-fab][data-position='bottom-left'] {
2194
+ bottom: 1.5rem;
2195
+ left: 1.5rem;
2196
+ }
2197
+
2198
+ [data-fab][data-position='top-right'] {
2199
+ top: 1.5rem;
2200
+ right: 1.5rem;
2201
+ }
2202
+
2203
+ [data-fab][data-position='top-left'] {
2204
+ top: 1.5rem;
2205
+ left: 1.5rem;
2206
+ }
2207
+
2208
+ [data-fab][data-disabled='true'] {
2209
+ pointer-events: none;
2210
+ opacity: 0.5;
2211
+ }
2212
+
2213
+ /* =============================================================================
2214
+ FAB Trigger Button
2215
+ ============================================================================= */
2216
+
2217
+ [data-fab-trigger] {
2218
+ position: relative;
2219
+ z-index: 1;
2220
+ display: flex;
2221
+ align-items: center;
2222
+ justify-content: center;
2223
+ border-radius: 9999px;
2224
+ border: none;
2225
+ cursor: pointer;
2226
+ transition:
2227
+ transform 150ms ease,
2228
+ background-color 150ms ease,
2229
+ box-shadow 150ms ease;
2230
+ }
2231
+
2232
+ [data-fab-trigger]:disabled {
2233
+ cursor: not-allowed;
2234
+ }
2235
+
2236
+ [data-fab-trigger]:focus-visible {
2237
+ outline: 2px solid currentColor;
2238
+ outline-offset: 2px;
2239
+ }
2240
+
2241
+ /* Size variants for trigger */
2242
+ [data-fab][data-size='sm'] [data-fab-trigger] {
2243
+ width: 3rem;
2244
+ height: 3rem;
2245
+ font-size: 1.25rem;
2246
+ }
2247
+
2248
+ [data-fab][data-size='md'] [data-fab-trigger],
2249
+ [data-fab]:not([data-size]) [data-fab-trigger] {
2250
+ width: 3.5rem;
2251
+ height: 3.5rem;
2252
+ font-size: 1.5rem;
2253
+ }
2254
+
2255
+ [data-fab][data-size='lg'] [data-fab-trigger] {
2256
+ width: 4rem;
2257
+ height: 4rem;
2258
+ font-size: 1.75rem;
2259
+ }
2260
+
2261
+ /* Trigger rotation when open */
2262
+ [data-fab][data-open='true'] [data-fab-trigger] {
2263
+ transform: rotate(45deg);
2264
+ }
2265
+
2266
+ /* Icon inside trigger */
2267
+ [data-fab-icon] {
2268
+ display: flex;
2269
+ align-items: center;
2270
+ justify-content: center;
2271
+ transition: transform 150ms ease;
2272
+ }
2273
+
2274
+ /* Counter-rotate icon when trigger rotates (if using plus icon) */
2275
+ [data-fab][data-open='true'] [data-fab-icon] {
2276
+ transform: rotate(-45deg);
2277
+ }
2278
+
2279
+ /* =============================================================================
2280
+ FAB Menu (Action Items Container)
2281
+ ============================================================================= */
2282
+
2283
+ [data-fab-menu] {
2284
+ position: absolute;
2285
+ display: flex;
2286
+ gap: 0.75rem;
2287
+ pointer-events: none;
2288
+ }
2289
+
2290
+ [data-fab][data-open='true'] [data-fab-menu] {
2291
+ pointer-events: auto;
2292
+ }
2293
+
2294
+ /* Vertical expansion (default) */
2295
+ [data-fab][data-expand='vertical'] [data-fab-menu],
2296
+ [data-fab]:not([data-expand]) [data-fab-menu] {
2297
+ flex-direction: column-reverse;
2298
+ align-items: center;
2299
+ }
2300
+
2301
+ /* Item alignment for vertical expansion - align relative to trigger button */
2302
+ [data-fab][data-expand='vertical'][data-item-align='start'] [data-fab-menu],
2303
+ [data-fab]:not([data-expand])[data-item-align='start'] [data-fab-menu] {
2304
+ align-items: flex-start;
2305
+ left: 0;
2306
+ }
2307
+
2308
+ [data-fab][data-expand='vertical'][data-item-align='center'] [data-fab-menu],
2309
+ [data-fab]:not([data-expand])[data-item-align='center'] [data-fab-menu],
2310
+ [data-fab][data-expand='vertical']:not([data-item-align]) [data-fab-menu],
2311
+ [data-fab]:not([data-expand]):not([data-item-align]) [data-fab-menu] {
2312
+ left: 50%;
2313
+ transform: translateX(-50%);
2314
+ }
2315
+
2316
+ [data-fab][data-expand='vertical'][data-item-align='end'] [data-fab-menu],
2317
+ [data-fab]:not([data-expand])[data-item-align='end'] [data-fab-menu] {
2318
+ align-items: flex-end;
2319
+ right: 0;
2320
+ }
2321
+
2322
+ /* Position menu based on FAB position */
2323
+ [data-fab][data-position='bottom-right'][data-expand='vertical'] [data-fab-menu],
2324
+ [data-fab][data-position='bottom-right']:not([data-expand]) [data-fab-menu],
2325
+ [data-fab][data-position='bottom-left'][data-expand='vertical'] [data-fab-menu],
2326
+ [data-fab][data-position='bottom-left']:not([data-expand]) [data-fab-menu] {
2327
+ bottom: calc(100% + 0.75rem);
2328
+ }
2329
+
2330
+ [data-fab][data-position='top-right'][data-expand='vertical'] [data-fab-menu],
2331
+ [data-fab][data-position='top-right']:not([data-expand]) [data-fab-menu],
2332
+ [data-fab][data-position='top-left'][data-expand='vertical'] [data-fab-menu],
2333
+ [data-fab][data-position='top-left']:not([data-expand]) [data-fab-menu] {
2334
+ top: calc(100% + 0.75rem);
2335
+ flex-direction: column;
2336
+ }
2337
+
2338
+ /* Horizontal expansion */
2339
+ [data-fab][data-expand='horizontal'] [data-fab-menu] {
2340
+ flex-direction: row;
2341
+ align-items: center;
2342
+ }
2343
+
2344
+ /* Item alignment for horizontal expansion */
2345
+ [data-fab][data-expand='horizontal'][data-item-align='start'] [data-fab-menu] {
2346
+ align-items: flex-start;
2347
+ }
2348
+
2349
+ [data-fab][data-expand='horizontal'][data-item-align='end'] [data-fab-menu] {
2350
+ align-items: flex-end;
2351
+ }
2352
+
2353
+ [data-fab][data-position='bottom-right'][data-expand='horizontal'] [data-fab-menu],
2354
+ [data-fab][data-position='top-right'][data-expand='horizontal'] [data-fab-menu] {
2355
+ right: calc(100% + 0.75rem);
2356
+ flex-direction: row-reverse;
2357
+ }
2358
+
2359
+ [data-fab][data-position='bottom-left'][data-expand='horizontal'] [data-fab-menu],
2360
+ [data-fab][data-position='top-left'][data-expand='horizontal'] [data-fab-menu] {
2361
+ left: calc(100% + 0.75rem);
2362
+ }
2363
+
2364
+ /* Radial expansion */
2365
+ [data-fab][data-expand='radial'] [data-fab-menu] {
2366
+ position: absolute;
2367
+ top: 50%;
2368
+ left: 50%;
2369
+ transform: translate(-50%, -50%);
2370
+ width: 0;
2371
+ height: 0;
2372
+ }
2373
+
2374
+ /* =============================================================================
2375
+ FAB Items
2376
+ ============================================================================= */
2377
+
2378
+ [data-fab-item] {
2379
+ display: flex;
2380
+ align-items: center;
2381
+ gap: 0.5rem;
2382
+ border-radius: 9999px;
2383
+ border: none;
2384
+ cursor: pointer;
2385
+ white-space: nowrap;
2386
+ transition:
2387
+ transform 200ms ease,
2388
+ opacity 200ms ease,
2389
+ background-color 150ms ease;
2390
+ transition-delay: var(--fab-delay, 0ms);
2391
+ }
2392
+
2393
+ /* Hidden state (before animation) */
2394
+ [data-fab]:not([data-open='true']) [data-fab-item] {
2395
+ opacity: 0;
2396
+ transform: scale(0.5);
2397
+ pointer-events: none;
2398
+ }
2399
+
2400
+ /* Visible state (after animation) */
2401
+ [data-fab][data-open='true'] [data-fab-item] {
2402
+ opacity: 1;
2403
+ transform: scale(1);
2404
+ }
2405
+
2406
+ [data-fab-item][data-disabled='true'],
2407
+ [data-fab-item]:disabled {
2408
+ pointer-events: none;
2409
+ opacity: 0.5;
2410
+ cursor: not-allowed;
2411
+ }
2412
+
2413
+ [data-fab-item]:focus-visible {
2414
+ outline: 2px solid currentColor;
2415
+ outline-offset: 2px;
2416
+ }
2417
+
2418
+ /* Size variants for items */
2419
+ [data-fab][data-size='sm'] [data-fab-item] {
2420
+ min-width: 2.5rem;
2421
+ height: 2.5rem;
2422
+ padding: 0 0.75rem;
2423
+ font-size: 0.875rem;
2424
+ }
2425
+
2426
+ [data-fab][data-size='md'] [data-fab-item],
2427
+ [data-fab]:not([data-size]) [data-fab-item] {
2428
+ min-width: 3rem;
2429
+ height: 3rem;
2430
+ padding: 0 1rem;
2431
+ font-size: 0.875rem;
2432
+ }
2433
+
2434
+ [data-fab][data-size='lg'] [data-fab-item] {
2435
+ min-width: 3.5rem;
2436
+ height: 3.5rem;
2437
+ padding: 0 1.25rem;
2438
+ font-size: 1rem;
2439
+ }
2440
+
2441
+ /* Icon-only items (no label) */
2442
+ [data-fab-item]:not(:has([data-fab-item-label])) {
2443
+ padding: 0;
2444
+ aspect-ratio: 1;
2445
+ justify-content: center;
2446
+ }
2447
+
2448
+ [data-fab-item-icon] {
2449
+ display: flex;
2450
+ align-items: center;
2451
+ justify-content: center;
2452
+ flex-shrink: 0;
2453
+ }
2454
+
2455
+ [data-fab-item-label] {
2456
+ flex: 1;
2457
+ }
2458
+
2459
+ /* =============================================================================
2460
+ Radial Expansion Positioning
2461
+ ============================================================================= */
2462
+
2463
+ [data-fab][data-expand='radial'][data-open='true'] [data-fab-item] {
2464
+ position: absolute;
2465
+ }
2466
+
2467
+ /* Radial positions for bottom-right (expanding up-left arc) */
2468
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
2469
+ [data-fab-item]:nth-child(1) {
2470
+ transform: translate(-120%, -20%);
2471
+ }
2472
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
2473
+ [data-fab-item]:nth-child(2) {
2474
+ transform: translate(-85%, -85%);
2475
+ }
2476
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
2477
+ [data-fab-item]:nth-child(3) {
2478
+ transform: translate(-20%, -120%);
2479
+ }
2480
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
2481
+ [data-fab-item]:nth-child(4) {
2482
+ transform: translate(45%, -120%);
2483
+ }
2484
+ [data-fab][data-expand='radial'][data-position='bottom-right'][data-open='true']
2485
+ [data-fab-item]:nth-child(5) {
2486
+ transform: translate(-120%, 45%);
2487
+ }
2488
+
2489
+ /* Radial positions for bottom-left (expanding up-right arc) */
2490
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
2491
+ [data-fab-item]:nth-child(1) {
2492
+ transform: translate(20%, -120%);
2493
+ }
2494
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
2495
+ [data-fab-item]:nth-child(2) {
2496
+ transform: translate(85%, -85%);
2497
+ }
2498
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
2499
+ [data-fab-item]:nth-child(3) {
2500
+ transform: translate(120%, -20%);
2501
+ }
2502
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
2503
+ [data-fab-item]:nth-child(4) {
2504
+ transform: translate(-45%, -120%);
2505
+ }
2506
+ [data-fab][data-expand='radial'][data-position='bottom-left'][data-open='true']
2507
+ [data-fab-item]:nth-child(5) {
2508
+ transform: translate(120%, 45%);
2509
+ }
2510
+
2511
+ /* =============================================================================
2512
+ Backdrop
2513
+ ============================================================================= */
2514
+
2515
+ [data-fab-backdrop] {
2516
+ position: fixed;
2517
+ inset: 0;
2518
+ z-index: -1;
2519
+ background: transparent;
2520
+ }
2521
+
2522
+ /* =============================================================================
2523
+ Custom Snippet Wrapper
2524
+ ============================================================================= */
2525
+
2526
+ [data-fab-item-custom] {
2527
+ display: contents;
2528
+ }
2529
+
2530
+ [data-fab-item-custom] > button {
2531
+ display: flex;
2532
+ align-items: center;
2533
+ gap: 0.5rem;
2534
+ border-radius: 9999px;
2535
+ border: none;
2536
+ cursor: pointer;
2537
+ white-space: nowrap;
2538
+ transition:
2539
+ transform 200ms ease,
2540
+ opacity 200ms ease,
2541
+ background-color 150ms ease;
2542
+ }
2543
+
2544
+ /* Base structural styles for form fields and inputs */
2545
+
2546
+ /* Form root: vertical stack */
2547
+ [data-form-root] {
2548
+ display:flex;flex-direction:column;gap:0.75rem;
2549
+ }
2550
+
2551
+ /* Form field container */
2552
+ [data-form-field] {
2553
+ display:flex;flex-direction:column;
2554
+ }
2555
+
2556
+ /* Separator between form fields */
2557
+ [data-form-separator] {
2558
+ margin-top:0.25rem;margin-bottom:0.25rem;border-top-width:1px;--un-border-opacity:1;border-color:rgba(var(--color-surface-200),var(--un-border-opacity));
2559
+ }[data-mode="dark"] [data-form-separator]{--un-border-opacity:1;border-color:rgba(var(--color-surface-800),var(--un-border-opacity));}
2560
+
2561
+ /* Form group (fieldset for nested objects) */
2562
+ [data-form-group] {
2563
+ margin:0;display:flex;flex-direction:column;gap:0.75rem;border-left-width:1px;--un-border-opacity:1;border-color:rgba(var(--color-surface-200),var(--un-border-opacity));border-style:none;padding:0;padding-left:0.75rem;
2564
+ }[data-mode="dark"] [data-form-group]{--un-border-opacity:1;border-color:rgba(var(--color-surface-800),var(--un-border-opacity));}
2565
+
2566
+ [data-form-group-label] {
2567
+ padding-bottom:0.25rem;font-size:0.75rem;line-height:1rem;font-weight:600;
2568
+ }
2569
+
2570
+ /* Validation report */
2571
+ [data-validation-report] {
2572
+ display:flex;flex-direction:column;gap:0.5rem;
2573
+ }
2574
+
2575
+ [data-validation-group] {
2576
+ display:flex;flex-direction:column;gap:0.125rem;
2577
+ }
2578
+
2579
+ [data-validation-group-header] {
2580
+ display:flex;align-items:center;gap:0.375rem;padding-top:0.25rem;padding-bottom:0.25rem;font-size:0.75rem;line-height:1rem;font-weight:600;
2581
+ }
2582
+
2583
+ [data-validation-count] {
2584
+ height:18px;min-width:18px;display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;padding-left:0.25rem;padding-right:0.25rem;font-size:10px;font-weight:700;
2585
+ }
2586
+
2587
+ [data-severity='error'] > [data-validation-group-header] {
2588
+ --un-text-opacity:1;color:rgba(var(--color-error),var(--un-text-opacity));
2589
+ }
2590
+
2591
+ [data-severity='error'] [data-validation-count] {
2592
+ --un-bg-opacity:1;background-color:rgba(var(--color-error-100),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-error-700),var(--un-text-opacity));
2593
+ }[data-mode="dark"] [data-severity="error"] [data-validation-count]{--un-bg-opacity:1;background-color:rgba(var(--color-error-900),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-error-300),var(--un-text-opacity));}
2594
+
2595
+ [data-severity='warning'] > [data-validation-group-header] {
2596
+ --un-text-opacity:1;color:rgba(var(--color-warning),var(--un-text-opacity));
2597
+ }
2598
+
2599
+ [data-severity='warning'] [data-validation-count] {
2600
+ --un-bg-opacity:1;background-color:rgba(var(--color-warning-100),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-warning-700),var(--un-text-opacity));
2601
+ }[data-mode="dark"] [data-severity="warning"] [data-validation-count]{--un-bg-opacity:1;background-color:rgba(var(--color-warning-900),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-warning-300),var(--un-text-opacity));}
2602
+
2603
+ [data-severity='info'] > [data-validation-group-header] {
2604
+ --un-text-opacity:1;color:rgba(var(--color-info),var(--un-text-opacity));
2605
+ }
2606
+
2607
+ [data-severity='info'] [data-validation-count] {
2608
+ --un-bg-opacity:1;background-color:rgba(var(--color-info-100),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-info-700),var(--un-text-opacity));
2609
+ }[data-mode="dark"] [data-severity="info"] [data-validation-count]{--un-bg-opacity:1;background-color:rgba(var(--color-info-900),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-info-300),var(--un-text-opacity));}
2610
+
2611
+ [data-severity='success'] > [data-validation-group-header] {
2612
+ --un-text-opacity:1;color:rgba(var(--color-success),var(--un-text-opacity));
2613
+ }
2614
+
2615
+ [data-severity='success'] [data-validation-count] {
2616
+ --un-bg-opacity:1;background-color:rgba(var(--color-success-100),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-success-700),var(--un-text-opacity));
2617
+ }[data-mode="dark"] [data-severity="success"] [data-validation-count]{--un-bg-opacity:1;background-color:rgba(var(--color-success-900),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-success-300),var(--un-text-opacity));}
2618
+
2619
+ [data-validation-item] {
2620
+ border-radius:0.25rem;padding-left:0.5rem;padding-right:0.5rem;padding-top:0.125rem;padding-bottom:0.125rem;text-align:left;font-size:0.75rem;line-height:1rem;
2621
+ }
2622
+
2623
+ button[data-validation-item] {
2624
+ cursor:pointer;border-style:none;background-color:transparent;
2625
+ }button[data-validation-item]:hover{--un-bg-opacity:1;background-color:rgba(var(--color-surface-100),var(--un-bg-opacity));}[data-mode="dark"] button[data-validation-item]:hover{--un-bg-opacity:1;background-color:rgba(var(--color-surface-900),var(--un-bg-opacity));}
2626
+
2627
+ /* Form actions (submit/reset buttons) */
2628
+ [data-form-actions] {
2629
+ display:flex;flex-direction:row;justify-content:flex-end;gap:0.5rem;padding-top:0.5rem;
2630
+ }
2631
+
2632
+ button[data-form-submit],
2633
+ button[data-form-reset] {
2634
+ cursor:pointer;border-width:1px;--un-border-opacity:1;border-color:rgba(var(--color-surface-300),var(--un-border-opacity));border-radius:0.25rem;--un-bg-opacity:1;background-color:rgba(var(--color-surface-100),var(--un-bg-opacity));padding-left:1rem;padding-right:1rem;padding-top:0.375rem;padding-bottom:0.375rem;font-size:0.875rem;line-height:1.25rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;
2635
+ }[data-mode="dark"] button[data-form-submit],[data-mode="dark"] button[data-form-reset]{--un-border-opacity:1;border-color:rgba(var(--color-surface-700),var(--un-border-opacity));--un-bg-opacity:1;background-color:rgba(var(--color-surface-900),var(--un-bg-opacity));}button[data-form-submit]:hover,button[data-form-reset]:hover{--un-bg-opacity:1;background-color:rgba(var(--color-surface-200),var(--un-bg-opacity));}[data-mode="dark"] button[data-form-submit]:hover,[data-mode="dark"] button[data-form-reset]:hover{--un-bg-opacity:1;background-color:rgba(var(--color-surface-800),var(--un-bg-opacity));}
2636
+
2637
+ button[data-form-submit] {
2638
+ --un-border-opacity:1;border-color:rgba(var(--color-primary),var(--un-border-opacity));--un-bg-opacity:1;background-color:rgba(var(--color-primary),var(--un-bg-opacity));--un-text-opacity:1;color:rgba(var(--color-surface-50),var(--un-text-opacity));
2639
+ }button[data-form-submit]:hover{opacity:0.9;}
2640
+
2641
+ button[data-form-submit]:disabled,
2642
+ button[data-form-reset]:disabled {
2643
+ cursor:not-allowed;opacity:0.5;
2644
+ }
2645
+
2646
+ /* Submitting state: reduce interactivity */
2647
+ [data-form-submitting] > :not([data-form-actions]) {
2648
+ pointer-events:none;opacity:0.6;
2649
+ }
2650
+
2651
+ /* Field root container */
2652
+ [data-field-root] {
2653
+ box-sizing:border-box;display:flex;flex-direction:column;
2654
+ }
2655
+
2656
+ /* Field wrapper: vertical by default */
2657
+ [data-field-root] > [data-field] {
2658
+ display:flex;flex-direction:column;gap:0.25rem;
2659
+ }
2660
+
2661
+ /* Checkbox and switch: inline layout */
2662
+ [data-field-type='switch'] > [data-field],
2663
+ [data-field-type='checkbox'] > [data-field] {
2664
+ flex-direction:row;align-items:center;gap:0.5rem;
2665
+ }
2666
+
2667
+ /* Select: stretch to fill input wrapper — display:flex eliminates inline-block gap */
2668
+ [data-input-root] [data-select] {
2669
+ flex:1 1 0%;align-self:stretch;
2670
+ display: flex;
2671
+ }
2672
+
2673
+ [data-input-root] [data-select] [data-select-trigger] {
2674
+ flex:1 1 0%;align-self:stretch;
2675
+ min-width: 0;
2676
+ }
2677
+
2678
+ /* Checkbox icon */
2679
+ [data-checkbox-root] {
2680
+ display:flex;align-items:center;
2681
+ }
2682
+
2683
+ /* Label: fills available space */
2684
+ [data-field] > label {
2685
+ flex:1 1 0%;font-size:0.75rem;line-height:1rem;
2686
+ }
2687
+
2688
+ /* Info field: horizontal layout */
2689
+ [data-field-type='info'] > [data-field] {
2690
+ flex-direction:row;align-items:center;justify-content:space-between;
2691
+ }
2692
+
2693
+ [data-field-info] {
2694
+ font-size:0.75rem;line-height:1rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
2695
+ }
2696
+
2697
+ /* Numeric/date input alignment */
2698
+ [data-field-type='number'] input,
2699
+ [data-field-type='integer'] input,
2700
+ [data-field-type='date'] input,
2701
+ [data-field-type='time'] input {
2702
+ text-align:right;
2703
+ }
2704
+
2705
+ /* Input wrapper: horizontal for input + icon */
2706
+ [data-input-root] {
2707
+ display:flex;flex-direction:row;align-items:center;
2708
+ }
2709
+
2710
+ /* Input elements fill available width */
2711
+ [data-input-root] input,
2712
+ [data-input-root] textarea,
2713
+ [data-input-root] select {
2714
+ margin:0;min-width:0;flex:1 1 0%;line-height:2;transition-property:all;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;
2715
+ }
2716
+
2717
+ /* Icons inside inputs */
2718
+ [data-input-root] [data-icon] {
2719
+ aspect-ratio:1/1;min-height:100%;flex-shrink:0;
2720
+ }
2721
+
2722
+ /* Description below input */
2723
+ [data-description] {
2724
+ font-size:0.75rem;line-height:1rem;line-height:1.375;
2725
+ }
2726
+
2727
+ /* Validation message */
2728
+ [data-message] {
2729
+ font-size:0.75rem;line-height:1rem;line-height:1.375;
2730
+ }
2731
+
2732
+ /* Checkbox icon: focus handling */
2733
+ [data-checkbox-icon] {
2734
+
2735
+ }[data-checkbox-icon]:focus{outline:2px solid transparent;outline-offset:2px;}
2736
+
2737
+ /* Range slider thumb */
2738
+ input[type='range']::-webkit-slider-thumb {
2739
+ appearance: none;
2740
+ height: 16px;
2741
+ width: 16px;
2742
+ border-radius: 50%;
2743
+ background: rgba(var(--color-primary-500));
2744
+ cursor: pointer;
2745
+ }
2746
+
2747
+ input[type='range']::-moz-range-thumb {
2748
+ height: 16px;
2749
+ width: 16px;
2750
+ border-radius: 50%;
2751
+ background: rgba(var(--color-primary-500));
2752
+ cursor: pointer;
2753
+ border: none;
2754
+ }
2755
+
2756
+ /* Color input */
2757
+ input[type='color'] {
2758
+ appearance: none;
2759
+ -webkit-appearance: none;
2760
+ -moz-appearance: none;
2761
+ background: none;
2762
+ padding:0;
2763
+ }
2764
+
2765
+ [data-input-root] [data-input-icon] {
2766
+ margin-left:0.5rem;margin-right:0.5rem;aspect-ratio:1/1;min-height:100%;flex-shrink:0;
2767
+ }
2768
+
2769
+ /* Responsive adjustments */
2770
+ @media (max-width: 640px) {
2771
+ [data-field-root] {
2772
+ padding:0.25rem;
2773
+ }
2774
+ [data-field] {
2775
+ min-height:1.75rem;gap:0.25rem;
2776
+ }
2777
+ [data-description],
2778
+ [data-message] {
2779
+ font-size:0.875rem;line-height:1.25rem;
2780
+ }
2781
+ }
2782
+
2783
+ /* Base structural styles for display components */
2784
+
2785
+ /* Display section: key-value pairs */
2786
+ [data-display-section] {
2787
+ display:flex;flex-direction:column;gap:0.5rem;
2788
+ }
2789
+
2790
+ [data-display-title] {
2791
+ font-size:0.875rem;line-height:1.25rem;--un-text-opacity:1;color:rgba(var(--color-surface-50),var(--un-text-opacity));font-weight:600;
2792
+ }
2793
+
2794
+ [data-display-field] {
2795
+ display:flex;align-items:baseline;justify-content:space-between;gap:1rem;
2796
+ }
2797
+
2798
+ [data-display-label] {
2799
+ flex-shrink:0;font-size:0.875rem;line-height:1.25rem;
2800
+ }
2801
+
2802
+ [data-display-value] {
2803
+ text-align:right;font-size:0.875rem;line-height:1.25rem;--un-text-opacity:1;color:rgba(var(--color-surface-50),var(--un-text-opacity));
2804
+ }
2805
+
2806
+ /* Badge format: pill style */
2807
+ [data-display-value][data-format='badge'] {
2808
+ border-radius:9999px;--un-bg-opacity:1;background-color:rgba(var(--color-surface-200),var(--un-bg-opacity));padding-left:0.5rem;padding-right:0.5rem;padding-top:0.125rem;padding-bottom:0.125rem;font-size:0.75rem;line-height:1rem;font-weight:500;
2809
+ }[data-mode="dark"] [data-display-value][data-format="badge"]{--un-bg-opacity:1;background-color:rgba(var(--color-surface-800),var(--un-bg-opacity));}
2810
+
2811
+ /* Boolean format */
2812
+ [data-display-value][data-format='boolean'] {
2813
+ font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
2814
+ }
2815
+
2816
+ /* Display table wrapper */
2817
+ [data-display-table] {
2818
+ display:flex;flex-direction:column;gap:0.5rem;
2819
+ }
2820
+
2821
+ /* Display card grid */
2822
+ [data-display-cards] {
2823
+ display:flex;flex-direction:column;gap:0.5rem;
2824
+ }
2825
+
2826
+ [data-display-grid] {
2827
+ display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:0.75rem;
2828
+ }
2829
+
2830
+ @media (min-width: 640px) {
2831
+ [data-display-grid] {
2832
+ grid-template-columns:repeat(2,minmax(0,1fr));
2833
+ }
2834
+ }
2835
+
2836
+ @media (min-width: 1024px) {
2837
+ [data-display-grid] {
2838
+ grid-template-columns:repeat(3,minmax(0,1fr));
2839
+ }
2840
+ }
2841
+
2842
+ [data-display-card] {
2843
+ display:flex;flex-direction:column;gap:0.25rem;border-width:1px;--un-border-opacity:1;border-color:rgba(var(--color-surface-200),var(--un-border-opacity));border-radius:0.25rem;--un-bg-opacity:1;background-color:rgba(var(--color-surface),var(--un-bg-opacity));padding:0.75rem;
2844
+ }[data-mode="dark"] [data-display-card]{--un-border-opacity:1;border-color:rgba(var(--color-surface-800),var(--un-border-opacity));}
2845
+
2846
+ [data-display-card][data-selected] {
2847
+ --un-border-opacity:1;border-color:rgba(var(--color-primary),var(--un-border-opacity));--un-ring-width:1px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);--un-ring-opacity:1;--un-ring-color:rgba(var(--color-primary),var(--un-ring-opacity));
2848
+ }
2849
+
2850
+ [data-selectable] [data-display-card] {
2851
+ cursor:pointer;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;
2852
+ }
2853
+
2854
+ [data-selectable] [data-display-card]:hover {
2855
+ --un-bg-opacity:1;background-color:rgba(var(--color-surface-100),var(--un-bg-opacity));
2856
+ }[data-mode="dark"] [data-selectable] [data-display-card]:hover{--un-bg-opacity:1;background-color:rgba(var(--color-surface-900),var(--un-bg-opacity));}
2857
+
2858
+ /* Display list */
2859
+ [data-display-list] {
2860
+ display:flex;flex-direction:column;gap:0.5rem;
2861
+ }
2862
+
2863
+ [data-display-list] ul {
2864
+ display:flex;flex-direction:column;gap:0.25rem;
2865
+ }
2866
+
2867
+ [data-display-list-item] {
2868
+ display:flex;align-items:baseline;gap:1rem;border-bottom-width:1px;--un-border-opacity:1;border-color:rgba(var(--color-surface-200),var(--un-border-opacity));padding-top:0.25rem;padding-bottom:0.25rem;
2869
+ }[data-display-list-item]:last-child{border-width:0px;}[data-mode="dark"] [data-display-list-item]{--un-border-opacity:1;border-color:rgba(var(--color-surface-800),var(--un-border-opacity));}
2870
+
2871
+ [data-display-list-item] [data-display-field] {
2872
+ display:flex;gap:0.25rem;
2873
+ }
2874
+
2875
+ /* Tilt — base structural styles */
2876
+
2877
+ [data-tilt] {
2878
+ perspective: var(--tilt-perspective, 600px);
2879
+ }
2880
+
2881
+ [data-tilt] > * {
2882
+ transform: rotateX(var(--tilt-rotate-x, 0deg)) rotateY(var(--tilt-rotate-y, 0deg));
2883
+ transition: transform 0.1s ease-out;
2884
+ }
2885
+
2886
+ [data-tilt][data-tilt-brightness] > * {
2887
+ filter: brightness(var(--tilt-brightness, 1));
2888
+ }
2889
+
2890
+ /* Shine — base structural styles */
2891
+
2892
+ [data-shine-filter] {
2893
+ pointer-events: none;
2894
+ position: fixed;
2895
+ inset: 0;
2896
+ width: 0;
2897
+ height: 0;
2898
+ overflow: visible;
2899
+ }
2900
+
2901
+ [data-shine] {
2902
+ display: inline-block;
2903
+ }
2904
+
2905
+ /* BreadCrumbs — base structural styles */
2906
+
2907
+ [data-breadcrumbs] {
2908
+ display: block;
2909
+ }
2910
+
2911
+ [data-breadcrumb-list] {
2912
+ display: flex;
2913
+ align-items: center;
2914
+ list-style: none;
2915
+ padding: 0;
2916
+ margin: 0;
2917
+ gap: 0.25rem;
2918
+ }
2919
+
2920
+ [data-breadcrumb-item] {
2921
+ display: flex;
2922
+ align-items: center;
2923
+ }
2924
+
2925
+ [data-breadcrumb-separator] {
2926
+ display: flex;
2927
+ align-items: center;
2928
+ opacity: 0.5;
2929
+ }
2930
+
2931
+ [data-breadcrumb-link] {
2932
+ display: flex;
2933
+ align-items: center;
2934
+ gap: 0.25rem;
2935
+ background: none;
2936
+ border: none;
2937
+ cursor: pointer;
2938
+ padding: 0.25rem 0.5rem;
2939
+ border-radius: 0.25rem;
2940
+ font: inherit;
2941
+ color: inherit;
2942
+ text-decoration: none;
2943
+ }
2944
+
2945
+ [data-breadcrumb-current] {
2946
+ display: flex;
2947
+ align-items: center;
2948
+ gap: 0.25rem;
2949
+ padding: 0.25rem 0.5rem;
2950
+ font-weight: 600;
2951
+ }
2952
+
2953
+ /* Card — base structural styles */
2954
+
2955
+ [data-card] {
2956
+ display: flex;
2957
+ flex-direction: column;
2958
+ border-radius: 0.5rem;
2959
+ overflow: hidden;
2960
+ text-decoration: none;
2961
+ color: inherit;
2962
+ }
2963
+
2964
+ button[data-card] {
2965
+ background: none;
2966
+ border: none;
2967
+ cursor: pointer;
2968
+ text-align: inherit;
2969
+ font: inherit;
2970
+ padding: 0;
2971
+ }
2972
+
2973
+ a[data-card] {
2974
+ cursor: pointer;
2975
+ }
2976
+
2977
+ [data-card-header] {
2978
+ padding: 1rem 1rem 0.5rem;
2979
+ }
2980
+
2981
+ [data-card-body] {
2982
+ padding: 0.5rem 1rem;
2983
+ flex: 1;
2984
+ }
2985
+
2986
+ [data-card-footer] {
2987
+ padding: 0.5rem 1rem 1rem;
2988
+ }
2989
+
2990
+ /* ProgressBar — base structural styles */
2991
+
2992
+ [data-progress] {
2993
+ position: relative;
2994
+ width: 100%;
2995
+ height: 0.5rem;
2996
+ border-radius: 9999px;
2997
+ overflow: hidden;
2998
+ }
2999
+
3000
+ [data-progress-bar] {
3001
+ height: 100%;
3002
+ border-radius: 9999px;
3003
+ transition: width 0.3s ease;
3004
+ }
3005
+
3006
+ [data-progress][data-indeterminate] [data-progress-bar] {
3007
+ animation: progress-indeterminate 1.5s ease-in-out infinite;
3008
+ }
3009
+
3010
+ @keyframes progress-indeterminate {
3011
+ 0% {
3012
+ transform: translateX(-100%);
3013
+ width: 50%;
3014
+ }
3015
+ 50% {
3016
+ transform: translateX(50%);
3017
+ width: 50%;
3018
+ }
3019
+ 100% {
3020
+ transform: translateX(200%);
3021
+ width: 50%;
3022
+ }
3023
+ }
3024
+
3025
+ /* Carousel — base structural styles */
3026
+
3027
+ [data-carousel] {
3028
+ position: relative;
3029
+ overflow: hidden;
3030
+ outline: none;
3031
+ }
3032
+
3033
+ [data-carousel-viewport] {
3034
+ overflow: hidden;
3035
+ width: 100%;
3036
+ }
3037
+
3038
+ /* ─── Slide transition ─── */
3039
+
3040
+ [data-carousel-transition="slide"] [data-carousel-track] {
3041
+ display: flex;
3042
+ transition: transform 0.4s ease;
3043
+ transform: translateX(calc(-100% * var(--carousel-current, 0)));
3044
+ }
3045
+
3046
+ [data-carousel-transition="slide"] [data-carousel-slide] {
3047
+ flex: 0 0 100%;
3048
+ min-width: 0;
3049
+ }
3050
+
3051
+ /* ─── Fade transition ─── */
3052
+
3053
+ [data-carousel-transition="fade"] [data-carousel-track] {
3054
+ position: relative;
3055
+ }
3056
+
3057
+ [data-carousel-transition="fade"] [data-carousel-slide] {
3058
+ position: absolute;
3059
+ inset: 0;
3060
+ opacity: 0;
3061
+ transition: opacity 0.4s ease;
3062
+ pointer-events: none;
3063
+ }
3064
+
3065
+ [data-carousel-transition="fade"] [data-carousel-slide][data-active] {
3066
+ position: relative;
3067
+ opacity: 1;
3068
+ pointer-events: auto;
3069
+ }
3070
+
3071
+ /* ─── No transition ─── */
3072
+
3073
+ [data-carousel-transition="none"] [data-carousel-track] {
3074
+ display: flex;
3075
+ transform: translateX(calc(-100% * var(--carousel-current, 0)));
3076
+ }
3077
+
3078
+ [data-carousel-transition="none"] [data-carousel-slide] {
3079
+ flex: 0 0 100%;
3080
+ min-width: 0;
3081
+ }
3082
+
3083
+ /* ─── Arrow buttons ─── */
3084
+
3085
+ [data-carousel-prev],
3086
+ [data-carousel-next] {
3087
+ position: absolute;
3088
+ top: 50%;
3089
+ transform: translateY(-50%);
3090
+ display: flex;
3091
+ align-items: center;
3092
+ justify-content: center;
3093
+ width: 2.5rem;
3094
+ height: 2.5rem;
3095
+ border: none;
3096
+ border-radius: 9999px;
3097
+ cursor: pointer;
3098
+ background: rgba(0, 0, 0, 0.3);
3099
+ color: white;
3100
+ font-size: 1.25rem;
3101
+ z-index: 1;
3102
+ opacity: 0.7;
3103
+ transition: opacity 0.2s ease;
3104
+ }
3105
+
3106
+ [data-carousel-prev]:hover,
3107
+ [data-carousel-next]:hover {
3108
+ opacity: 1;
3109
+ }
3110
+
3111
+ [data-carousel-prev]:disabled,
3112
+ [data-carousel-next]:disabled {
3113
+ opacity: 0.3;
3114
+ cursor: default;
3115
+ }
3116
+
3117
+ [data-carousel-prev] {
3118
+ left: 0.5rem;
3119
+ }
3120
+
3121
+ [data-carousel-next] {
3122
+ right: 0.5rem;
3123
+ }
3124
+
3125
+ /* ─── Dots ─── */
3126
+
3127
+ [data-carousel-dots] {
3128
+ display: flex;
3129
+ justify-content: center;
3130
+ gap: 0.5rem;
3131
+ padding: 0.75rem 0;
3132
+ }
3133
+
3134
+ [data-carousel-dot] {
3135
+ width: 0.625rem;
3136
+ height: 0.625rem;
3137
+ border-radius: 9999px;
3138
+ border: none;
3139
+ cursor: pointer;
3140
+ background: currentColor;
3141
+ opacity: 0.3;
3142
+ transition: opacity 0.2s ease;
3143
+ padding: 0;
3144
+ }
3145
+
3146
+ [data-carousel-dot][data-active] {
3147
+ opacity: 1;
3148
+ }
3149
+
3150
+ [data-carousel-dot]:hover {
3151
+ opacity: 0.7;
3152
+ }
3153
+
3154
+ /* Pill — base structural styles */
3155
+
3156
+ [data-pill] {
3157
+ display: inline-flex;
3158
+ align-items: center;
3159
+ gap: 0.375rem;
3160
+ padding: 0.125rem 0.625rem;
3161
+ border-radius: 9999px;
3162
+ font-size: 0.875rem;
3163
+ line-height: 1.25rem;
3164
+ white-space: nowrap;
3165
+ outline: none;
3166
+ vertical-align: middle;
3167
+ }
3168
+
3169
+ [data-pill-icon] {
3170
+ font-size: 0.875rem;
3171
+ flex-shrink: 0;
3172
+ }
3173
+
3174
+ [data-pill-text] {
3175
+ overflow: hidden;
3176
+ text-overflow: ellipsis;
3177
+ }
3178
+
3179
+ [data-pill-remove] {
3180
+ display: inline-flex;
3181
+ align-items: center;
3182
+ justify-content: center;
3183
+ width: 1rem;
3184
+ height: 1rem;
3185
+ padding: 0;
3186
+ margin-left: 0.125rem;
3187
+ border: none;
3188
+ border-radius: 9999px;
3189
+ cursor: pointer;
3190
+ background: transparent;
3191
+ color: inherit;
3192
+ opacity: 0.6;
3193
+ transition: opacity 0.15s ease;
3194
+ font-size: 0.75rem;
3195
+ flex-shrink: 0;
3196
+ }
3197
+
3198
+ [data-pill-remove]:hover {
3199
+ opacity: 1;
3200
+ }
3201
+
3202
+ [data-pill-remove]:disabled {
3203
+ opacity: 0.3;
3204
+ cursor: default;
3205
+ }
3206
+
3207
+ [data-pill-disabled] {
3208
+ opacity: 0.5;
3209
+ cursor: default;
3210
+ }
3211
+
3212
+ /* Rating — base structural styles */
3213
+
3214
+ [data-rating] {
3215
+ display: inline-flex;
3216
+ align-items: center;
3217
+ gap: 0.25rem;
3218
+ outline: none;
3219
+ cursor: pointer;
3220
+ }
3221
+
3222
+ [data-rating-disabled] {
3223
+ cursor: default;
3224
+ opacity: 0.5;
3225
+ }
3226
+
3227
+ [data-rating-item] {
3228
+ display: inline-flex;
3229
+ align-items: center;
3230
+ justify-content: center;
3231
+ cursor: pointer;
3232
+ font-size: 1.5rem;
3233
+ transition: transform 0.15s ease, opacity 0.15s ease;
3234
+ user-select: none;
3235
+ }
3236
+
3237
+ [data-rating-disabled] [data-rating-item] {
3238
+ cursor: default;
3239
+ }
3240
+
3241
+ [data-rating-item]:not([data-filled]) {
3242
+ opacity: 0.3;
3243
+ }
3244
+
3245
+ [data-rating-item][data-hovering] {
3246
+ transform: scale(1.15);
3247
+ }
3248
+
3249
+ [data-rating-item][data-filled] {
3250
+ opacity: 1;
3251
+ }
3252
+
3253
+ /* Stepper — base structural styles */
3254
+
3255
+ [data-stepper] {
3256
+ display: flex;
3257
+ align-items: flex-start;
3258
+ width: 100%;
3259
+ }
3260
+
3261
+ [data-stepper][data-orientation='vertical'] {
3262
+ flex-direction: column;
3263
+ }
3264
+
3265
+ /* ─── Step container ─── */
3266
+
3267
+ [data-stepper-step] {
3268
+ display: flex;
3269
+ flex-direction: column;
3270
+ align-items: center;
3271
+ flex: 0 0 auto;
3272
+ }
3273
+
3274
+ /* ─── Step circle ─── */
3275
+
3276
+ [data-stepper-circle] {
3277
+ width: 2.5rem;
3278
+ height: 2.5rem;
3279
+ border-radius: 9999px;
3280
+ border: 2px solid currentColor;
3281
+ display: flex;
3282
+ align-items: center;
3283
+ justify-content: center;
3284
+ cursor: pointer;
3285
+ font-weight: 600;
3286
+ font-size: 0.875rem;
3287
+ background: transparent;
3288
+ color: inherit;
3289
+ padding: 0;
3290
+ transition:
3291
+ background-color 0.2s ease,
3292
+ border-color 0.2s ease,
3293
+ color 0.2s ease;
3294
+ }
3295
+
3296
+ [data-stepper-circle]:disabled {
3297
+ cursor: default;
3298
+ opacity: 0.4;
3299
+ }
3300
+
3301
+ [data-stepper-step][data-completed] [data-stepper-circle] {
3302
+ background-color: var(--color-primary-500, #3b82f6);
3303
+ border-color: var(--color-primary-500, #3b82f6);
3304
+ color: white;
3305
+ }
3306
+
3307
+ [data-stepper-step][data-active] [data-stepper-circle] {
3308
+ border-color: var(--color-primary-500, #3b82f6);
3309
+ color: var(--color-primary-500, #3b82f6);
3310
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary-500, #3b82f6) 20%, transparent);
3311
+ }
3312
+
3313
+ /* ─── Connector line ─── */
3314
+
3315
+ [data-stepper-connector] {
3316
+ flex: 1;
3317
+ height: 2px;
3318
+ min-width: 2rem;
3319
+ align-self: center;
3320
+ /* Vertically center with the circle (half of 2.5rem) */
3321
+ margin-top: 1.25rem;
3322
+ background-color: var(--color-surface-300, #d1d5db);
3323
+ transition: background-color 0.2s ease;
3324
+ }
3325
+
3326
+ [data-stepper-connector][data-completed] {
3327
+ background-color: var(--color-primary-500, #3b82f6);
3328
+ }
3329
+
3330
+ /* Vertical orientation connectors */
3331
+ [data-stepper][data-orientation='vertical'] [data-stepper-connector] {
3332
+ width: 2px;
3333
+ height: 2rem;
3334
+ min-width: auto;
3335
+ margin-top: 0;
3336
+ margin-left: 1.25rem;
3337
+ align-self: flex-start;
3338
+ }
3339
+
3340
+ /* ─── Label ─── */
3341
+
3342
+ [data-stepper-label] {
3343
+ margin-top: 0.5rem;
3344
+ font-size: 0.8125rem;
3345
+ text-align: center;
3346
+ max-width: 6rem;
3347
+ line-height: 1.3;
3348
+ }
3349
+
3350
+ /* ─── Sub-stage dots ─── */
3351
+
3352
+ [data-stepper-dots] {
3353
+ display: flex;
3354
+ gap: 0.25rem;
3355
+ margin-top: 0.375rem;
3356
+ }
3357
+
3358
+ [data-stepper-dot] {
3359
+ width: 0.5rem;
3360
+ height: 0.5rem;
3361
+ border-radius: 9999px;
3362
+ border: 1px solid var(--color-surface-400, #9ca3af);
3363
+ background: transparent;
3364
+ cursor: pointer;
3365
+ padding: 0;
3366
+ transition:
3367
+ background-color 0.2s ease,
3368
+ border-color 0.2s ease;
3369
+ }
3370
+
3371
+ [data-stepper-dot]:disabled {
3372
+ cursor: default;
3373
+ opacity: 0.4;
3374
+ }
3375
+
3376
+ [data-stepper-dot][data-completed] {
3377
+ background-color: var(--color-primary-500, #3b82f6);
3378
+ border-color: var(--color-primary-500, #3b82f6);
3379
+ }
3380
+
3381
+ [data-stepper-dot][data-active] {
3382
+ border-color: var(--color-primary-500, #3b82f6);
3383
+ background-color: var(--color-primary-500, #3b82f6);
3384
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--color-primary-500, #3b82f6) 25%, transparent);
3385
+ }
3386
+
3387
+ /* ─── Content area ─── */
3388
+
3389
+ [data-stepper-content] {
3390
+ width: 100%;
3391
+ margin-top: 1.5rem;
3392
+ }
3393
+
3394
+ /**
3395
+ * Switch - Base Structural Styles
3396
+ *
3397
+ * These styles provide layout, positioning, size variants, and transitions.
3398
+ * No colors, shadows, or visual theming — those belong in theme styles.
3399
+ */
3400
+
3401
+ /* =============================================================================
3402
+ Switch Root (button)
3403
+ ============================================================================= */
3404
+
3405
+ [data-switch] {
3406
+ display: inline-flex;
3407
+ align-items: center;
3408
+ gap: 0.5rem;
3409
+ cursor: pointer;
3410
+ border: none;
3411
+ background: transparent;
3412
+ padding: 0;
3413
+ user-select: none;
3414
+ }
3415
+
3416
+ [data-switch]:focus {
3417
+ outline: none;
3418
+ }
3419
+
3420
+ [data-switch][data-switch-disabled] {
3421
+ pointer-events: none;
3422
+ opacity: 0.5;
3423
+ cursor: not-allowed;
3424
+ }
3425
+
3426
+ /* =============================================================================
3427
+ Track
3428
+ ============================================================================= */
3429
+
3430
+ [data-switch-track] {
3431
+ position: relative;
3432
+ display: inline-block;
3433
+ border-radius: 9999px;
3434
+ transition: background-color 200ms ease;
3435
+ flex-shrink: 0;
3436
+ }
3437
+
3438
+ /* =============================================================================
3439
+ Thumb
3440
+ ============================================================================= */
3441
+
3442
+ [data-switch-thumb] {
3443
+ position: absolute;
3444
+ top: 50%;
3445
+ transform: translateY(-50%) translateX(0);
3446
+ border-radius: 9999px;
3447
+ display: flex;
3448
+ align-items: center;
3449
+ justify-content: center;
3450
+ transition:
3451
+ transform 200ms ease,
3452
+ background-color 200ms ease;
3453
+ }
3454
+
3455
+ [data-switch][aria-checked='true'] [data-switch-thumb] {
3456
+ transform: translateY(-50%) translateX(var(--switch-thumb-travel));
3457
+ }
3458
+
3459
+ /* =============================================================================
3460
+ Size Variants
3461
+ ============================================================================= */
3462
+
3463
+ /* Small: track 28×16, thumb 12px */
3464
+ [data-switch][data-switch-size='sm'] [data-switch-track] {
3465
+ width: 1.75rem;
3466
+ height: 1rem;
3467
+ }
3468
+
3469
+ [data-switch][data-switch-size='sm'] [data-switch-thumb] {
3470
+ width: 0.75rem;
3471
+ height: 0.75rem;
3472
+ left: 0.125rem;
3473
+ --switch-thumb-travel: 0.75rem;
3474
+ }
3475
+
3476
+ [data-switch][data-switch-size='sm'] [data-switch-icon] {
3477
+ font-size: 0.5rem;
3478
+ }
3479
+
3480
+ [data-switch][data-switch-size='sm'] [data-switch-label] {
3481
+ font-size: 0.75rem;
3482
+ }
3483
+
3484
+ /* Medium (default): track 44×24, thumb 18px */
3485
+ [data-switch][data-switch-size='md'] [data-switch-track],
3486
+ [data-switch]:not([data-switch-size]) [data-switch-track] {
3487
+ width: 2.75rem;
3488
+ height: 1.5rem;
3489
+ }
3490
+
3491
+ [data-switch][data-switch-size='md'] [data-switch-thumb],
3492
+ [data-switch]:not([data-switch-size]) [data-switch-thumb] {
3493
+ width: 1.125rem;
3494
+ height: 1.125rem;
3495
+ left: 0.1875rem;
3496
+ --switch-thumb-travel: 1.25rem;
3497
+ }
3498
+
3499
+ [data-switch][data-switch-size='md'] [data-switch-icon],
3500
+ [data-switch]:not([data-switch-size]) [data-switch-icon] {
3501
+ font-size: 0.625rem;
3502
+ }
3503
+
3504
+ [data-switch][data-switch-size='md'] [data-switch-label],
3505
+ [data-switch]:not([data-switch-size]) [data-switch-label] {
3506
+ font-size: 0.875rem;
3507
+ }
3508
+
3509
+ /* Large: track 56×32, thumb 24px */
3510
+ [data-switch][data-switch-size='lg'] [data-switch-track] {
3511
+ width: 3.5rem;
3512
+ height: 2rem;
3513
+ }
3514
+
3515
+ [data-switch][data-switch-size='lg'] [data-switch-thumb] {
3516
+ width: 1.5rem;
3517
+ height: 1.5rem;
3518
+ left: 0.25rem;
3519
+ --switch-thumb-travel: 1.5rem;
3520
+ }
3521
+
3522
+ [data-switch][data-switch-size='lg'] [data-switch-icon] {
3523
+ font-size: 0.75rem;
3524
+ }
3525
+
3526
+ [data-switch][data-switch-size='lg'] [data-switch-label] {
3527
+ font-size: 1rem;
3528
+ }
3529
+
3530
+ /* =============================================================================
3531
+ Label
3532
+ ============================================================================= */
3533
+
3534
+ [data-switch-label] {
3535
+ font-weight: 500;
3536
+ user-select: none;
3537
+ }
3538
+
3539
+ /* =============================================================================
3540
+ Icon (inside thumb)
3541
+ ============================================================================= */
3542
+
3543
+ [data-switch-icon] {
3544
+ flex-shrink: 0;
3545
+ }
3546
+
3547
+ /**
3548
+ * Table - Base Structural Styles
3549
+ *
3550
+ * These styles provide layout, positioning, and basic structure.
3551
+ * No colors, shadows, or visual theming - those belong in theme styles.
3552
+ */
3553
+
3554
+ /* =============================================================================
3555
+ Table Container
3556
+ ============================================================================= */
3557
+
3558
+ [data-table] {
3559
+ overflow-x: auto;
3560
+ }
3561
+
3562
+ [data-table][data-disabled='true'] {
3563
+ pointer-events: none;
3564
+ opacity: 0.5;
3565
+ }
3566
+
3567
+ [data-table] table {
3568
+ width: 100%;
3569
+ border-collapse: collapse;
3570
+ table-layout: auto;
3571
+ }
3572
+
3573
+ /* =============================================================================
3574
+ Caption
3575
+ ============================================================================= */
3576
+
3577
+ [data-table-caption] {
3578
+ text-align: left;
3579
+ font-weight: 600;
3580
+ padding: 0.5rem 0.75rem;
3581
+ caption-side: top;
3582
+ }
3583
+
3584
+ /* =============================================================================
3585
+ Header
3586
+ ============================================================================= */
3587
+
3588
+ [data-table-header] th {
3589
+ text-align: left;
3590
+ font-weight: 600;
3591
+ white-space: nowrap;
3592
+ user-select: none;
3593
+ }
3594
+
3595
+ [data-table-header-cell] {
3596
+ display: table-cell;
3597
+ cursor: default;
3598
+ }
3599
+
3600
+ [data-table-header-cell][data-sortable='true'] {
3601
+ cursor: pointer;
3602
+ }
3603
+
3604
+ [data-table-header-text] {
3605
+ vertical-align: middle;
3606
+ }
3607
+
3608
+ [data-table-sort-icon] {
3609
+ display: inline-block;
3610
+ vertical-align: middle;
3611
+ margin-left: 0.25rem;
3612
+ opacity: 0.4;
3613
+ transition: opacity 150ms ease;
3614
+ }
3615
+
3616
+ [data-table-header-cell][data-sort-order='ascending'] [data-table-sort-icon],
3617
+ [data-table-header-cell][data-sort-order='descending'] [data-table-sort-icon] {
3618
+ opacity: 1;
3619
+ }
3620
+
3621
+ /* =============================================================================
3622
+ Body & Rows
3623
+ ============================================================================= */
3624
+
3625
+ [data-table-row] {
3626
+ cursor: pointer;
3627
+ transition: background-color 150ms ease;
3628
+ }
3629
+
3630
+ [data-table-row]:focus {
3631
+ outline: none;
3632
+ }
3633
+
3634
+ /* =============================================================================
3635
+ Cells
3636
+ ============================================================================= */
3637
+
3638
+ [data-table-cell] {
3639
+ vertical-align: middle;
3640
+ }
3641
+
3642
+ [data-cell-icon] {
3643
+ display: inline-block;
3644
+ vertical-align: middle;
3645
+ margin-right: 0.375rem;
3646
+ flex-shrink: 0;
3647
+ }
3648
+
3649
+ [data-cell-value] {
3650
+ vertical-align: middle;
3651
+ }
3652
+
3653
+ /* =============================================================================
3654
+ Empty State
3655
+ ============================================================================= */
3656
+
3657
+ [data-table-empty] {
3658
+ text-align: center;
3659
+ font-style: italic;
3660
+ opacity: 0.6;
3661
+ }
3662
+
3663
+ /* =============================================================================
3664
+ Size Variants
3665
+ ============================================================================= */
3666
+
3667
+ [data-table][data-size='sm'] [data-table-header-cell],
3668
+ [data-table][data-size='sm'] [data-table-cell] {
3669
+ padding: 0.25rem 0.5rem;
3670
+ font-size: 0.75rem;
3671
+ }
3672
+
3673
+ [data-table][data-size='sm'] [data-table-caption] {
3674
+ padding: 0.25rem 0.5rem;
3675
+ font-size: 0.75rem;
3676
+ }
3677
+
3678
+ [data-table][data-size='md'] [data-table-header-cell],
3679
+ [data-table]:not([data-size]) [data-table-header-cell],
3680
+ [data-table][data-size='md'] [data-table-cell],
3681
+ [data-table]:not([data-size]) [data-table-cell] {
3682
+ padding: 0.5rem 0.75rem;
3683
+ font-size: 0.875rem;
3684
+ }
3685
+
3686
+ [data-table][data-size='md'] [data-table-caption],
3687
+ [data-table]:not([data-size]) [data-table-caption] {
3688
+ padding: 0.5rem 0.75rem;
3689
+ font-size: 0.875rem;
3690
+ }
3691
+
3692
+ [data-table][data-size='lg'] [data-table-header-cell],
3693
+ [data-table][data-size='lg'] [data-table-cell] {
3694
+ padding: 0.625rem 1rem;
3695
+ font-size: 1rem;
3696
+ }
3697
+
3698
+ [data-table][data-size='lg'] [data-table-caption] {
3699
+ padding: 0.625rem 1rem;
3700
+ font-size: 1rem;
3701
+ }
3702
+
3703
+ [data-table-empty] {
3704
+ padding: 1.5rem 0.75rem;
3705
+ }
3706
+
3707
+ /**
3708
+ * SearchFilter - Base Structural Styles
3709
+ *
3710
+ * These styles provide layout, positioning, and basic structure.
3711
+ * No colors, shadows, or visual theming - those belong in theme styles.
3712
+ */
3713
+
3714
+ /* =============================================================================
3715
+ Container
3716
+ ============================================================================= */
3717
+
3718
+ [data-search-filter] {
3719
+ display: flex;
3720
+ flex-direction: column;
3721
+ gap: 0.375rem;
3722
+ }
3723
+
3724
+ /* =============================================================================
3725
+ Input Wrapper
3726
+ ============================================================================= */
3727
+
3728
+ [data-search-input-wrapper] {
3729
+ display: flex;
3730
+ align-items: center;
3731
+ position: relative;
3732
+ }
3733
+
3734
+ [data-search-input] {
3735
+ width: 100%;
3736
+ box-sizing: border-box;
3737
+ border: 1px solid transparent;
3738
+ border-radius: 0.375rem;
3739
+ outline: none;
3740
+ font-size: inherit;
3741
+ background: transparent;
3742
+ }
3743
+
3744
+ /* Remove native search decoration */
3745
+ [data-search-input]::-webkit-search-decoration,
3746
+ [data-search-input]::-webkit-search-cancel-button {
3747
+ -webkit-appearance: none;
3748
+ appearance: none;
3749
+ }
3750
+
3751
+ [data-search-clear] {
3752
+ position: absolute;
3753
+ right: 0.375rem;
3754
+ display: flex;
3755
+ align-items: center;
3756
+ justify-content: center;
3757
+ border: none;
3758
+ background: none;
3759
+ cursor: pointer;
3760
+ font-size: 1.125rem;
3761
+ line-height: 1;
3762
+ padding: 0.125rem 0.25rem;
3763
+ border-radius: 0.25rem;
3764
+ }
3765
+
3766
+ /* =============================================================================
3767
+ Tags
3768
+ ============================================================================= */
3769
+
3770
+ [data-search-tags] {
3771
+ display: flex;
3772
+ flex-wrap: wrap;
3773
+ gap: 0.25rem;
3774
+ }
3775
+
3776
+ [data-search-tag] {
3777
+ display: inline-flex;
3778
+ align-items: center;
3779
+ gap: 0.25rem;
3780
+ border-radius: 0.25rem;
3781
+ font-size: 0.75rem;
3782
+ white-space: nowrap;
3783
+ }
3784
+
3785
+ [data-search-tag-text] {
3786
+ max-width: 200px;
3787
+ overflow: hidden;
3788
+ text-overflow: ellipsis;
3789
+ }
3790
+
3791
+ [data-search-tag-remove] {
3792
+ display: flex;
3793
+ align-items: center;
3794
+ justify-content: center;
3795
+ border: none;
3796
+ background: none;
3797
+ cursor: pointer;
3798
+ font-size: 0.875rem;
3799
+ line-height: 1;
3800
+ padding: 0;
3801
+ border-radius: 0.125rem;
3802
+ }
3803
+
3804
+ /* =============================================================================
3805
+ Size Variants
3806
+ ============================================================================= */
3807
+
3808
+ [data-search-filter][data-size='sm'] [data-search-input] {
3809
+ padding: 0.25rem 0.5rem;
3810
+ font-size: 0.75rem;
3811
+ }
3812
+
3813
+ [data-search-filter][data-size='md'] [data-search-input],
3814
+ [data-search-filter]:not([data-size]) [data-search-input] {
3815
+ padding: 0.375rem 0.625rem;
3816
+ font-size: 0.875rem;
3817
+ }
3818
+
3819
+ [data-search-filter][data-size='lg'] [data-search-input] {
3820
+ padding: 0.5rem 0.75rem;
3821
+ font-size: 1rem;
3822
+ }
3823
+
3824
+ [data-search-filter][data-size='sm'] [data-search-tag] {
3825
+ padding: 0.125rem 0.375rem;
3826
+ font-size: 0.625rem;
3827
+ }
3828
+
3829
+ [data-search-filter][data-size='md'] [data-search-tag],
3830
+ [data-search-filter]:not([data-size]) [data-search-tag] {
3831
+ padding: 0.125rem 0.5rem;
3832
+ font-size: 0.75rem;
3833
+ }
3834
+
3835
+ [data-search-filter][data-size='lg'] [data-search-tag] {
3836
+ padding: 0.25rem 0.5rem;
3837
+ font-size: 0.875rem;
3838
+ }
3839
+
3840
+ /**
3841
+ * Range - Base Structural Styles
3842
+ *
3843
+ * Layout, positioning, and sizing for the range slider.
3844
+ * No colors, shadows, or visual theming - those belong in theme styles.
3845
+ */
3846
+
3847
+ /* =============================================================================
3848
+ Range Container
3849
+ ============================================================================= */
3850
+
3851
+ [data-range] {
3852
+ position: relative;
3853
+ display: grid;
3854
+ grid-template-rows: auto auto;
3855
+ height: 2.5rem;
3856
+ user-select: none;
3857
+ }
3858
+
3859
+ [data-range][data-disabled] {
3860
+ pointer-events: none;
3861
+ opacity: 0.5;
3862
+ }
3863
+
3864
+ /* =============================================================================
3865
+ Track
3866
+ ============================================================================= */
3867
+
3868
+ [data-range-track] {
3869
+ position: relative;
3870
+ display: flex;
3871
+ align-items: center;
3872
+ height: 2rem;
3873
+ cursor: pointer;
3874
+ }
3875
+
3876
+ [data-range-bar] {
3877
+ position: relative;
3878
+ width: 100%;
3879
+ height: 4px;
3880
+ border-radius: 9999px;
3881
+ }
3882
+
3883
+ [data-range-selected] {
3884
+ position: absolute;
3885
+ top: 50%;
3886
+ height: 4px;
3887
+ transform: translateY(-50%);
3888
+ border-radius: 9999px;
3889
+ pointer-events: none;
3890
+ }
3891
+
3892
+ /* =============================================================================
3893
+ Thumb
3894
+ ============================================================================= */
3895
+
3896
+ [data-range-thumb] {
3897
+ position: absolute;
3898
+ top: 50%;
3899
+ width: 1rem;
3900
+ height: 1rem;
3901
+ border-radius: 9999px;
3902
+ transform: translate(-50%, -50%);
3903
+ cursor: pointer;
3904
+ z-index: 1;
3905
+ border: 2px solid transparent;
3906
+ box-sizing: border-box;
3907
+ transition: box-shadow 150ms ease;
3908
+ }
3909
+
3910
+ [data-range-thumb]:focus {
3911
+ outline: none;
3912
+ }
3913
+
3914
+ [data-range-thumb]:focus-visible {
3915
+ outline: none;
3916
+ }
3917
+
3918
+ [data-range-thumb][data-disabled] {
3919
+ pointer-events: none;
3920
+ cursor: not-allowed;
3921
+ }
3922
+
3923
+ /* =============================================================================
3924
+ Ticks
3925
+ ============================================================================= */
3926
+
3927
+ [data-range-ticks] {
3928
+ display: grid;
3929
+ grid-gap: calc((100% - 1rem * (var(--count) + 1)) / var(--count));
3930
+ grid-template-columns: repeat(var(--count), 1rem) 1rem;
3931
+ grid-template-rows: 7px auto;
3932
+ }
3933
+
3934
+ [data-range-tick] {
3935
+ display: grid;
3936
+ grid-template-columns: repeat(2, 1fr);
3937
+ cursor: pointer;
3938
+ user-select: none;
3939
+ }
3940
+
3941
+ [data-range-tick][data-disabled] {
3942
+ pointer-events: none;
3943
+ cursor: not-allowed;
3944
+ opacity: 0.5;
3945
+ }
3946
+
3947
+ [data-tick-bar] {
3948
+ grid-column-start: 2;
3949
+ height: 5px;
3950
+ border-left-width: 1px;
3951
+ border-left-style: solid;
3952
+ }
3953
+
3954
+ [data-tick-label] {
3955
+ grid-column: span 2;
3956
+ display: flex;
3957
+ justify-content: center;
3958
+ font-size: 0.625rem;
3959
+ line-height: 1.2;
3960
+ }
3961
+
3962
+ /**
3963
+ * Timeline - Base Structural Styles
3964
+ *
3965
+ * Layout for vertical numbered steps with content beside them.
3966
+ * No colors or visual theming - those belong in theme styles.
3967
+ */
3968
+
3969
+ /* =============================================================================
3970
+ Timeline Container
3971
+ ============================================================================= */
3972
+
3973
+ [data-timeline] {
3974
+ display: flex;
3975
+ flex-direction: column;
3976
+ }
3977
+
3978
+ /* =============================================================================
3979
+ Timeline Item
3980
+ ============================================================================= */
3981
+
3982
+ [data-timeline-item] {
3983
+ display: grid;
3984
+ grid-template-columns: 2.5rem 1fr;
3985
+ gap: 0.75rem;
3986
+ }
3987
+
3988
+ /* =============================================================================
3989
+ Marker (circle + connector)
3990
+ ============================================================================= */
3991
+
3992
+ [data-timeline-marker] {
3993
+ display: flex;
3994
+ flex-direction: column;
3995
+ align-items: center;
3996
+ }
3997
+
3998
+ [data-timeline-circle] {
3999
+ width: 2rem;
4000
+ height: 2rem;
4001
+ min-height: 2rem;
4002
+ border-radius: 9999px;
4003
+ border: 2px solid currentColor;
4004
+ display: flex;
4005
+ align-items: center;
4006
+ justify-content: center;
4007
+ font-weight: 600;
4008
+ font-size: 0.75rem;
4009
+ transition:
4010
+ background-color 0.2s ease,
4011
+ border-color 0.2s ease,
4012
+ color 0.2s ease;
4013
+ }
4014
+
4015
+ [data-timeline-connector] {
4016
+ width: 2px;
4017
+ flex: 1;
4018
+ min-height: 1.5rem;
4019
+ transition: background-color 0.2s ease;
4020
+ }
4021
+
4022
+ /* =============================================================================
4023
+ Body (title + description + content)
4024
+ ============================================================================= */
4025
+
4026
+ [data-timeline-body] {
4027
+ padding-bottom: 1.5rem;
4028
+ min-height: 2rem;
4029
+ display: flex;
4030
+ flex-direction: column;
4031
+ justify-content: flex-start;
4032
+ padding-top: 0.25rem;
4033
+ }
4034
+
4035
+ [data-timeline-title] {
4036
+ font-weight: 600;
4037
+ font-size: 0.9375rem;
4038
+ line-height: 1.4;
4039
+ }
4040
+
4041
+ [data-timeline-description] {
4042
+ margin-top: 0.25rem;
4043
+ font-size: 0.8125rem;
4044
+ line-height: 1.5;
4045
+ }
4046
+
4047
+ /* Reveal — scroll-triggered entry animations */
4048
+
4049
+ [data-reveal] {
4050
+ opacity: 0;
4051
+ transition:
4052
+ opacity var(--reveal-duration, 600ms) var(--reveal-easing, cubic-bezier(0.4, 0, 0.2, 1)),
4053
+ translate var(--reveal-duration, 600ms) var(--reveal-easing, cubic-bezier(0.4, 0, 0.2, 1));
4054
+ }
4055
+
4056
+ [data-reveal='up'] {
4057
+ translate: 0 var(--reveal-distance, 1.5rem);
4058
+ }
4059
+ [data-reveal='down'] {
4060
+ translate: 0 calc(-1 * var(--reveal-distance, 1.5rem));
4061
+ }
4062
+ [data-reveal='left'] {
4063
+ translate: var(--reveal-distance, 1.5rem) 0;
4064
+ }
4065
+ [data-reveal='right'] {
4066
+ translate: calc(-1 * var(--reveal-distance, 1.5rem)) 0;
4067
+ }
4068
+ [data-reveal='none'] {
4069
+ translate: 0 0;
4070
+ }
4071
+
4072
+ [data-reveal][data-reveal-visible] {
4073
+ opacity: 1;
4074
+ translate: 0 0;
4075
+ }
4076
+
4077
+ @media (prefers-reduced-motion: reduce) {
4078
+ [data-reveal] {
4079
+ transition-duration: 0ms !important;
4080
+ opacity: 1 !important;
4081
+ translate: 0 !important;
4082
+ }
4083
+ }
4084
+
4085
+ /* Graph paper — minor + major grid background utility
4086
+ *
4087
+ * Override any variable on the element or a parent to customise:
4088
+ * --unit minor cell size (default 0.5rem)
4089
+ * --size major cell size (default calc(5 * --unit))
4090
+ * --minor-grid minor line thickness (default 0.5px)
4091
+ * --major-grid major line thickness (default 0.5px)
4092
+ * --graph-paper-color line color (default currentColor)
4093
+ */
4094
+
4095
+ /* Grid paper — simple H+V grid (no major/minor distinction)
4096
+ *
4097
+ * Override any variable on the element or a parent to customise:
4098
+ * --unit cell size (default 0.5rem)
4099
+ * --grid-line line thickness (default 0.5px)
4100
+ * --grid-paper-color line color (default currentColor)
4101
+ */
4102
+
4103
+ /* Ruled paper — horizontal lines only
4104
+ *
4105
+ * Override any variable on the element or a parent to customise:
4106
+ * --unit line spacing (default 1.5rem)
4107
+ * --rule-size line thickness (default 0.5px)
4108
+ * --ruled-paper-color line color (default currentColor)
4109
+ */
4110
+
4111
+ [data-graph-paper] {
4112
+ background-image:
4113
+ linear-gradient(
4114
+ var(--graph-paper-color, currentColor) var(--major-grid, 0.5px),
4115
+ transparent var(--major-grid, 0.5px)
4116
+ ),
4117
+ linear-gradient(
4118
+ 90deg,
4119
+ var(--graph-paper-color, currentColor) var(--major-grid, 0.5px),
4120
+ transparent var(--major-grid, 0.5px)
4121
+ ),
4122
+ linear-gradient(
4123
+ var(--graph-paper-color, currentColor) var(--minor-grid, 0.5px),
4124
+ transparent var(--minor-grid, 0.5px)
4125
+ ),
4126
+ linear-gradient(
4127
+ 90deg,
4128
+ var(--graph-paper-color, currentColor) var(--minor-grid, 0.5px),
4129
+ transparent var(--minor-grid, 0.5px)
4130
+ );
4131
+ background-size:
4132
+ var(--size, calc(5 * var(--unit, 0.5rem))) var(--size, calc(5 * var(--unit, 0.5rem))),
4133
+ var(--size, calc(5 * var(--unit, 0.5rem))) var(--size, calc(5 * var(--unit, 0.5rem))),
4134
+ var(--unit, 0.5rem) var(--unit, 0.5rem),
4135
+ var(--unit, 0.5rem) var(--unit, 0.5rem);
4136
+ background-position:
4137
+ calc(-1 * var(--minor-grid, 0.5px)) calc(-1 * var(--minor-grid, 0.5px)),
4138
+ calc(-1 * var(--minor-grid, 0.5px)) calc(-1 * var(--minor-grid, 0.5px)),
4139
+ calc(-1 * var(--minor-grid, 0.5px)) calc(-1 * var(--minor-grid, 0.5px)),
4140
+ calc(-1 * var(--minor-grid, 0.5px)) calc(-1 * var(--minor-grid, 0.5px));
4141
+ }
4142
+
4143
+ [data-grid-paper] {
4144
+ background-image:
4145
+ linear-gradient(
4146
+ var(--grid-paper-color, currentColor) var(--grid-line, 0.5px),
4147
+ transparent var(--grid-line, 0.5px)
4148
+ ),
4149
+ linear-gradient(
4150
+ 90deg,
4151
+ var(--grid-paper-color, currentColor) var(--grid-line, 0.5px),
4152
+ transparent var(--grid-line, 0.5px)
4153
+ );
4154
+ background-size: var(--unit, 0.5rem) var(--unit, 0.5rem);
4155
+ background-position:
4156
+ calc(-1 * var(--grid-line, 0.5px)) calc(-1 * var(--grid-line, 0.5px)),
4157
+ calc(-1 * var(--grid-line, 0.5px)) calc(-1 * var(--grid-line, 0.5px));
4158
+ }
4159
+
4160
+ [data-ruled-paper] {
4161
+ background-image: linear-gradient(
4162
+ var(--ruled-paper-color, currentColor) var(--rule-size, 0.5px),
4163
+ transparent var(--rule-size, 0.5px)
4164
+ );
4165
+ background-size: 100% var(--unit, 1.5rem);
4166
+ background-position: 0 calc(-1 * var(--rule-size, 0.5px));
4167
+ }
4168
+
4169
+ /**
4170
+ * FloatingNavigation - Base Structural Styles
4171
+ *
4172
+ * Layout, positioning, transitions, and animations.
4173
+ * No colors, shadows, or visual theming - those belong in theme styles.
4174
+ */
4175
+
4176
+ /* =============================================================================
4177
+ Container
4178
+ ============================================================================= */
4179
+
4180
+ [data-floating-nav] {
4181
+ position: fixed;
4182
+ z-index: 40;
4183
+ display: flex;
4184
+ flex-direction: column;
4185
+ width: fit-content;
4186
+ overflow: hidden;
4187
+ transition:
4188
+ width var(--fn-expand-duration, 300ms) var(--fn-expand-easing, cubic-bezier(0.4, 0, 0.2, 1)),
4189
+ height var(--fn-expand-duration, 300ms) var(--fn-expand-easing, cubic-bezier(0.4, 0, 0.2, 1));
4190
+ }
4191
+
4192
+ /* Reduced motion */
4193
+ @media (prefers-reduced-motion: reduce) {
4194
+ [data-floating-nav] {
4195
+ animation: none !important;
4196
+ transition-duration: 0ms !important;
4197
+ }
4198
+ [data-floating-nav] * {
4199
+ animation: none !important;
4200
+ transition-duration: 0ms !important;
4201
+ }
4202
+ }
4203
+
4204
+ /* =============================================================================
4205
+ Position Variants
4206
+ ============================================================================= */
4207
+
4208
+ /* Right edge — vertically centered */
4209
+ [data-floating-nav][data-position='right'] {
4210
+ right: 1rem;
4211
+ top: 50%;
4212
+ translate: 0 -50%;
4213
+ border-radius: 0.75rem;
4214
+ animation: fn-slide-in-right 0.5s ease-out 0.5s both;
4215
+ }
4216
+
4217
+ /* Left edge — vertically centered */
4218
+ [data-floating-nav][data-position='left'] {
4219
+ left: 1rem;
4220
+ top: 50%;
4221
+ translate: 0 -50%;
4222
+ border-radius: 0.75rem;
4223
+ animation: fn-slide-in-left 0.5s ease-out 0.5s both;
4224
+ }
4225
+
4226
+ /* Top edge — horizontally centered */
4227
+ [data-floating-nav][data-position='top'] {
4228
+ top: 1rem;
4229
+ left: 50%;
4230
+ translate: -50% 0;
4231
+ flex-direction: row;
4232
+ border-radius: 0.75rem;
4233
+ animation: fn-slide-in-top 0.5s ease-out 0.5s both;
4234
+ }
4235
+
4236
+ /* Bottom edge — horizontally centered */
4237
+ [data-floating-nav][data-position='bottom'] {
4238
+ bottom: 1rem;
4239
+ left: 50%;
4240
+ translate: -50% 0;
4241
+ flex-direction: row;
4242
+ border-radius: 0.75rem;
4243
+ animation: fn-slide-in-bottom 0.5s ease-out 0.5s both;
4244
+ }
4245
+
4246
+ /* =============================================================================
4247
+ Entrance Animations
4248
+ ============================================================================= */
4249
+
4250
+ @keyframes fn-slide-in-right {
4251
+ from { opacity: 0; transform: translateX(4rem); }
4252
+ to { opacity: 1; transform: translateX(0); }
4253
+ }
4254
+
4255
+ @keyframes fn-slide-in-left {
4256
+ from { opacity: 0; transform: translateX(-4rem); }
4257
+ to { opacity: 1; transform: translateX(0); }
4258
+ }
4259
+
4260
+ @keyframes fn-slide-in-top {
4261
+ from { opacity: 0; transform: translateY(-4rem); }
4262
+ to { opacity: 1; transform: translateY(0); }
4263
+ }
4264
+
4265
+ @keyframes fn-slide-in-bottom {
4266
+ from { opacity: 0; transform: translateY(4rem); }
4267
+ to { opacity: 1; transform: translateY(0); }
4268
+ }
4269
+
4270
+ /* =============================================================================
4271
+ Header (Title + Pin)
4272
+ ============================================================================= */
4273
+
4274
+ [data-floating-nav-header] {
4275
+ display: flex;
4276
+ align-items: center;
4277
+ gap: 0.5rem;
4278
+ padding: 0.5rem;
4279
+ min-height: 2rem;
4280
+ }
4281
+
4282
+ /* Vertical positions: header above items */
4283
+ [data-floating-nav][data-position='left'] [data-floating-nav-header],
4284
+ [data-floating-nav][data-position='right'] [data-floating-nav-header] {
4285
+ flex-direction: row;
4286
+ justify-content: center;
4287
+ }
4288
+
4289
+ /* When expanded, push pin to end */
4290
+ [data-floating-nav][data-expanded] [data-floating-nav-header] {
4291
+ justify-content: space-between;
4292
+ }
4293
+
4294
+ /* Horizontal positions: header before items */
4295
+ [data-floating-nav][data-position='top'] [data-floating-nav-header],
4296
+ [data-floating-nav][data-position='bottom'] [data-floating-nav-header] {
4297
+ flex-direction: column;
4298
+ justify-content: center;
4299
+ }
4300
+
4301
+ [data-floating-nav-title] {
4302
+ font-size: 0.75rem;
4303
+ font-weight: 600;
4304
+ text-transform: uppercase;
4305
+ letter-spacing: 0.05em;
4306
+ white-space: nowrap;
4307
+ opacity: 0;
4308
+ transition: opacity var(--fn-label-duration, 200ms) ease;
4309
+ }
4310
+
4311
+ [data-floating-nav][data-expanded] [data-floating-nav-title] {
4312
+ opacity: 1;
4313
+ }
4314
+
4315
+ [data-floating-nav-pin] {
4316
+ display: flex;
4317
+ align-items: center;
4318
+ justify-content: center;
4319
+ width: 1.5rem;
4320
+ height: 1.5rem;
4321
+ padding: 0;
4322
+ border: none;
4323
+ border-radius: 0.375rem;
4324
+ cursor: pointer;
4325
+ background: transparent;
4326
+ font-size: 0.875rem;
4327
+ flex-shrink: 0;
4328
+ transition: transform 150ms ease;
4329
+ }
4330
+
4331
+ [data-floating-nav-pin]:hover {
4332
+ transform: scale(1.1);
4333
+ }
4334
+
4335
+ [data-floating-nav-pin]:focus-visible {
4336
+ outline: 2px solid currentColor;
4337
+ outline-offset: 2px;
4338
+ }
4339
+
4340
+ /* =============================================================================
4341
+ Items Container
4342
+ ============================================================================= */
4343
+
4344
+ [data-floating-nav-items] {
4345
+ position: relative;
4346
+ display: flex;
4347
+ padding: 0.25rem;
4348
+ gap: 0.125rem;
4349
+ }
4350
+
4351
+ /* Vertical layout (left/right positions) */
4352
+ [data-floating-nav][data-position='left'] [data-floating-nav-items],
4353
+ [data-floating-nav][data-position='right'] [data-floating-nav-items] {
4354
+ flex-direction: column;
4355
+ }
4356
+
4357
+ /* Horizontal layout (top/bottom positions) */
4358
+ [data-floating-nav][data-position='top'] [data-floating-nav-items],
4359
+ [data-floating-nav][data-position='bottom'] [data-floating-nav-items] {
4360
+ flex-direction: row;
4361
+ }
4362
+
4363
+ /* =============================================================================
4364
+ Navigation Items
4365
+ ============================================================================= */
4366
+
4367
+ [data-floating-nav-item] {
4368
+ display: flex;
4369
+ align-items: center;
4370
+ gap: 0.75rem;
4371
+ border: none;
4372
+ border-radius: 0.5rem;
4373
+ cursor: pointer;
4374
+ white-space: nowrap;
4375
+ text-decoration: none;
4376
+ background: transparent;
4377
+ transition:
4378
+ transform 150ms ease,
4379
+ background-color 150ms ease;
4380
+ animation: fn-item-enter 0.3s ease both;
4381
+ animation-delay: calc(var(--fn-index, 0) * 60ms + 0.6s);
4382
+ }
4383
+
4384
+ @keyframes fn-item-enter {
4385
+ from {
4386
+ opacity: 0;
4387
+ transform: scale(0.8);
4388
+ }
4389
+ to {
4390
+ opacity: 1;
4391
+ transform: scale(1);
4392
+ }
4393
+ }
4394
+
4395
+ [data-floating-nav-item]:hover {
4396
+ transform: scale(1.02);
4397
+ }
4398
+
4399
+ [data-floating-nav-item]:active {
4400
+ transform: scale(0.98);
4401
+ }
4402
+
4403
+ [data-floating-nav-item]:focus-visible {
4404
+ outline: 2px solid currentColor;
4405
+ outline-offset: -2px;
4406
+ border-radius: 0.5rem;
4407
+ }
4408
+
4409
+ /* =============================================================================
4410
+ Size Variants — Items
4411
+ ============================================================================= */
4412
+
4413
+ /* Small */
4414
+ [data-floating-nav][data-size='sm'] [data-floating-nav-item] {
4415
+ min-width: 2rem;
4416
+ min-height: 2rem;
4417
+ padding: 0.25rem 0.5rem;
4418
+ font-size: 0.8125rem;
4419
+ }
4420
+
4421
+ [data-floating-nav][data-size='sm'] [data-floating-nav-icon] {
4422
+ font-size: 1rem;
4423
+ width: 1.25rem;
4424
+ height: 1.25rem;
4425
+ }
4426
+
4427
+ /* Medium (default) */
4428
+ [data-floating-nav][data-size='md'] [data-floating-nav-item],
4429
+ [data-floating-nav]:not([data-size]) [data-floating-nav-item] {
4430
+ min-width: 2.5rem;
4431
+ min-height: 2.5rem;
4432
+ padding: 0.375rem 0.625rem;
4433
+ font-size: 0.875rem;
4434
+ }
4435
+
4436
+ [data-floating-nav][data-size='md'] [data-floating-nav-icon],
4437
+ [data-floating-nav]:not([data-size]) [data-floating-nav-icon] {
4438
+ font-size: 1.125rem;
4439
+ width: 1.5rem;
4440
+ height: 1.5rem;
4441
+ }
4442
+
4443
+ /* Large */
4444
+ [data-floating-nav][data-size='lg'] [data-floating-nav-item] {
4445
+ min-width: 3rem;
4446
+ min-height: 3rem;
4447
+ padding: 0.5rem 0.75rem;
4448
+ font-size: 1rem;
4449
+ }
4450
+
4451
+ [data-floating-nav][data-size='lg'] [data-floating-nav-icon] {
4452
+ font-size: 1.25rem;
4453
+ width: 1.75rem;
4454
+ height: 1.75rem;
4455
+ }
4456
+
4457
+ /* =============================================================================
4458
+ Icon & Label
4459
+ ============================================================================= */
4460
+
4461
+ [data-floating-nav-icon] {
4462
+ display: flex;
4463
+ align-items: center;
4464
+ justify-content: center;
4465
+ flex-shrink: 0;
4466
+ }
4467
+
4468
+ [data-floating-nav-label] {
4469
+ overflow: hidden;
4470
+ max-width: 0;
4471
+ opacity: 0;
4472
+ transition:
4473
+ max-width var(--fn-expand-duration, 300ms) var(--fn-expand-easing, cubic-bezier(0.4, 0, 0.2, 1)),
4474
+ opacity var(--fn-label-duration, 200ms) ease;
4475
+ }
4476
+
4477
+ /* Expanded: reveal labels */
4478
+ [data-floating-nav][data-expanded] [data-floating-nav-label] {
4479
+ max-width: 12rem;
4480
+ opacity: 1;
4481
+ }
4482
+
4483
+ /* =============================================================================
4484
+ Active Indicator
4485
+ ============================================================================= */
4486
+
4487
+ [data-floating-nav-indicator] {
4488
+ position: absolute;
4489
+ border-radius: 0.25rem;
4490
+ pointer-events: none;
4491
+ transition:
4492
+ top var(--fn-indicator-duration, 300ms) cubic-bezier(0.4, 0, 0.2, 1),
4493
+ left var(--fn-indicator-duration, 300ms) cubic-bezier(0.4, 0, 0.2, 1);
4494
+ }
4495
+
4496
+ /* Vertical indicator (left/right positions) — bar on the side */
4497
+ [data-floating-nav][data-position='left'] [data-floating-nav-indicator] {
4498
+ right: 0;
4499
+ width: 3px;
4500
+ height: 1.5rem;
4501
+ top: calc(var(--fn-active-index, 0) * (2.5rem + 0.125rem) + 0.5rem + 0.25rem);
4502
+ }
4503
+
4504
+ [data-floating-nav][data-position='right'] [data-floating-nav-indicator] {
4505
+ left: 0;
4506
+ width: 3px;
4507
+ height: 1.5rem;
4508
+ top: calc(var(--fn-active-index, 0) * (2.5rem + 0.125rem) + 0.5rem + 0.25rem);
4509
+ }
4510
+
4511
+ /* Horizontal indicator (top/bottom positions) — bar on the edge */
4512
+ [data-floating-nav][data-position='top'] [data-floating-nav-indicator] {
4513
+ bottom: 0;
4514
+ height: 3px;
4515
+ width: 1.5rem;
4516
+ left: calc(var(--fn-active-index, 0) * (2.5rem + 0.125rem) + 0.5rem + 0.25rem);
4517
+ }
4518
+
4519
+ [data-floating-nav][data-position='bottom'] [data-floating-nav-indicator] {
4520
+ top: 0;
4521
+ height: 3px;
4522
+ width: 1.5rem;
4523
+ left: calc(var(--fn-active-index, 0) * (2.5rem + 0.125rem) + 0.5rem + 0.25rem);
4524
+ }
4525
+
4526
+ /* Size adjustments for indicator position */
4527
+ [data-floating-nav][data-size='sm'][data-position='left'] [data-floating-nav-indicator],
4528
+ [data-floating-nav][data-size='sm'][data-position='right'] [data-floating-nav-indicator] {
4529
+ height: 1.25rem;
4530
+ top: calc(var(--fn-active-index, 0) * (2rem + 0.125rem) + 0.375rem + 0.25rem);
4531
+ }
4532
+
4533
+ [data-floating-nav][data-size='lg'][data-position='left'] [data-floating-nav-indicator],
4534
+ [data-floating-nav][data-size='lg'][data-position='right'] [data-floating-nav-indicator] {
4535
+ height: 1.75rem;
4536
+ top: calc(var(--fn-active-index, 0) * (3rem + 0.125rem) + 0.625rem + 0.25rem);
4537
+ }
4538
+
4539
+ [data-floating-nav][data-size='sm'][data-position='top'] [data-floating-nav-indicator],
4540
+ [data-floating-nav][data-size='sm'][data-position='bottom'] [data-floating-nav-indicator] {
4541
+ width: 1.25rem;
4542
+ left: calc(var(--fn-active-index, 0) * (2rem + 0.125rem) + 0.375rem + 0.25rem);
4543
+ }
4544
+
4545
+ [data-floating-nav][data-size='lg'][data-position='top'] [data-floating-nav-indicator],
4546
+ [data-floating-nav][data-size='lg'][data-position='bottom'] [data-floating-nav-indicator] {
4547
+ width: 1.75rem;
4548
+ left: calc(var(--fn-active-index, 0) * (3rem + 0.125rem) + 0.625rem + 0.25rem);
4549
+ }
4550
+
4551
+ /**
4552
+ * Grid - Base Structural Styles
4553
+ *
4554
+ * Layout: CSS grid with auto-fill, tile padding/sizing.
4555
+ * No colors or visual theming - those belong in theme styles.
4556
+ */
4557
+
4558
+ /* =============================================================================
4559
+ Grid Container
4560
+ ============================================================================= */
4561
+
4562
+ [data-grid] {
4563
+ display: grid;
4564
+ grid-template-columns: repeat(auto-fill, minmax(var(--grid-min-size, 120px), 1fr));
4565
+ gap: var(--grid-gap, 1rem);
4566
+ }
4567
+
4568
+ [data-grid][data-disabled] {
4569
+ pointer-events: none;
4570
+ opacity: 0.5;
4571
+ }
4572
+
4573
+ /* =============================================================================
4574
+ Grid Tiles
4575
+ ============================================================================= */
4576
+
4577
+ [data-grid-item] {
4578
+ display: flex;
4579
+ flex-direction: column;
4580
+ align-items: center;
4581
+ justify-content: center;
4582
+ gap: 0.5rem;
4583
+ padding: 1rem;
4584
+ border: 1px solid transparent;
4585
+ border-radius: 0.5rem;
4586
+ cursor: pointer;
4587
+ transition:
4588
+ background-color 150ms ease,
4589
+ border-color 150ms ease;
4590
+ background: transparent;
4591
+ text-align: center;
4592
+ word-break: break-word;
4593
+ }
4594
+
4595
+ [data-grid-item]:focus {
4596
+ outline: none;
4597
+ }
4598
+
4599
+ [data-grid-item][data-disabled],
4600
+ [data-grid-item]:disabled {
4601
+ pointer-events: none;
4602
+ opacity: 0.5;
4603
+ cursor: not-allowed;
4604
+ }
4605
+
4606
+ /* =============================================================================
4607
+ Size Variants
4608
+ ============================================================================= */
4609
+
4610
+ [data-grid][data-size='sm'] [data-grid-item] {
4611
+ padding: 0.5rem;
4612
+ gap: 0.25rem;
4613
+ font-size: 0.75rem;
4614
+ }
4615
+
4616
+ [data-grid][data-size='md'] [data-grid-item],
4617
+ [data-grid]:not([data-size]) [data-grid-item] {
4618
+ padding: 1rem;
4619
+ gap: 0.5rem;
4620
+ font-size: 0.875rem;
4621
+ }
4622
+
4623
+ [data-grid][data-size='lg'] [data-grid-item] {
4624
+ padding: 1.5rem;
4625
+ gap: 0.75rem;
4626
+ font-size: 1rem;
4627
+ }
4628
+
4629
+ /* =============================================================================
4630
+ Item Elements (reuse shared data-item-* from item.css)
4631
+ ============================================================================= */
4632
+
4633
+ [data-grid-item] [data-item-icon] {
4634
+ font-size: 1.5rem;
4635
+ }
4636
+
4637
+ [data-grid][data-size='sm'] [data-grid-item] [data-item-icon] {
4638
+ font-size: 1.25rem;
4639
+ }
4640
+
4641
+ [data-grid][data-size='lg'] [data-grid-item] [data-item-icon] {
4642
+ font-size: 2rem;
4643
+ }
4644
+
4645
+ /**
4646
+ * UploadTarget - Base Structural Styles
4647
+ *
4648
+ * Layout: flex centering, dashed border, sizing, transitions.
4649
+ * No colors or visual theming - those belong in theme styles.
4650
+ */
4651
+
4652
+ /* =============================================================================
4653
+ Drop Zone Container
4654
+ ============================================================================= */
4655
+
4656
+ [data-upload-target] {
4657
+ display: flex;
4658
+ flex-direction: column;
4659
+ align-items: center;
4660
+ justify-content: center;
4661
+ gap: 0.75rem;
4662
+ min-height: 10rem;
4663
+ padding: 2rem;
4664
+ border: 2px dashed currentColor;
4665
+ border-radius: 0.5rem;
4666
+ cursor: pointer;
4667
+ transition:
4668
+ border-color 150ms ease,
4669
+ background-color 150ms ease;
4670
+ user-select: none;
4671
+ }
4672
+
4673
+ [data-upload-target]:focus {
4674
+ outline: none;
4675
+ }
4676
+
4677
+ [data-upload-target][data-disabled] {
4678
+ pointer-events: none;
4679
+ opacity: 0.5;
4680
+ cursor: not-allowed;
4681
+ }
4682
+
4683
+ /* =============================================================================
4684
+ Upload Icon
4685
+ ============================================================================= */
4686
+
4687
+ [data-upload-target] [data-upload-icon] {
4688
+ font-size: 2rem;
4689
+ }
4690
+
4691
+ /* =============================================================================
4692
+ Browse Button
4693
+ ============================================================================= */
4694
+
4695
+ [data-upload-target] [data-upload-button] {
4696
+ padding: 0.375rem 0.75rem;
4697
+ border-radius: 0.375rem;
4698
+ font-size: 0.875rem;
4699
+ font-weight: 500;
4700
+ cursor: pointer;
4701
+ border: 1px solid currentColor;
4702
+ background: transparent;
4703
+ transition:
4704
+ background-color 150ms ease,
4705
+ color 150ms ease;
4706
+ }
4707
+
4708
+ [data-upload-target] [data-upload-button]:disabled {
4709
+ pointer-events: none;
4710
+ opacity: 0.5;
4711
+ }
4712
+
4713
+ /**
4714
+ * UploadProgress - Base Structural Styles
4715
+ *
4716
+ * Layout: header flex, file row layout, progress bar track, action positioning.
4717
+ * No colors or visual theming - those belong in theme styles.
4718
+ */
4719
+
4720
+ /* =============================================================================
4721
+ Container
4722
+ ============================================================================= */
4723
+
4724
+ [data-upload-progress] {
4725
+ display: flex;
4726
+ flex-direction: column;
4727
+ gap: 0.25rem;
4728
+ }
4729
+
4730
+ /* =============================================================================
4731
+ Header
4732
+ ============================================================================= */
4733
+
4734
+ [data-upload-header] {
4735
+ display: flex;
4736
+ align-items: center;
4737
+ justify-content: space-between;
4738
+ gap: 0.75rem;
4739
+ padding: 0.5rem 0.75rem;
4740
+ font-size: 0.875rem;
4741
+ font-weight: 500;
4742
+ }
4743
+
4744
+ [data-upload-clear] {
4745
+ padding: 0.25rem 0.5rem;
4746
+ border-radius: 0.25rem;
4747
+ font-size: 0.75rem;
4748
+ cursor: pointer;
4749
+ border: 1px solid currentColor;
4750
+ background: transparent;
4751
+ transition:
4752
+ background-color 150ms ease,
4753
+ color 150ms ease;
4754
+ }
4755
+
4756
+ /* =============================================================================
4757
+ File Status
4758
+ ============================================================================= */
4759
+
4760
+ [data-upload-file-status] {
4761
+ display: flex;
4762
+ align-items: center;
4763
+ gap: 0.75rem;
4764
+ padding: 0.375rem 0.75rem;
4765
+ font-size: 0.875rem;
4766
+ transition: background-color 150ms ease;
4767
+ }
4768
+
4769
+ /* =============================================================================
4770
+ File Elements
4771
+ ============================================================================= */
4772
+
4773
+ [data-upload-file-icon] {
4774
+ flex-shrink: 0;
4775
+ font-size: 1.25rem;
4776
+ }
4777
+
4778
+ [data-upload-file-name] {
4779
+ flex: 1;
4780
+ min-width: 0;
4781
+ overflow: hidden;
4782
+ text-overflow: ellipsis;
4783
+ white-space: nowrap;
4784
+ }
4785
+
4786
+ [data-upload-file-size] {
4787
+ flex-shrink: 0;
4788
+ font-size: 0.75rem;
4789
+ white-space: nowrap;
4790
+ }
4791
+
4792
+ /* =============================================================================
4793
+ Progress Bar
4794
+ ============================================================================= */
4795
+
4796
+ [data-upload-bar] {
4797
+ position: relative;
4798
+ width: 6rem;
4799
+ height: 0.375rem;
4800
+ border-radius: 9999px;
4801
+ overflow: hidden;
4802
+ flex-shrink: 0;
4803
+ }
4804
+
4805
+ [data-upload-fill] {
4806
+ height: 100%;
4807
+ border-radius: 9999px;
4808
+ transition: width 0.3s ease;
4809
+ }
4810
+
4811
+ /* =============================================================================
4812
+ Status Badge
4813
+ ============================================================================= */
4814
+
4815
+ [data-upload-status] {
4816
+ flex-shrink: 0;
4817
+ font-size: 0.75rem;
4818
+ font-weight: 500;
4819
+ text-transform: capitalize;
4820
+ }
4821
+
4822
+ /* =============================================================================
4823
+ Action Buttons
4824
+ ============================================================================= */
4825
+
4826
+ [data-upload-actions] {
4827
+ display: flex;
4828
+ gap: 0.25rem;
4829
+ flex-shrink: 0;
4830
+ }
4831
+
4832
+ [data-upload-actions] button {
4833
+ display: inline-flex;
4834
+ align-items: center;
4835
+ justify-content: center;
4836
+ width: 1.5rem;
4837
+ height: 1.5rem;
4838
+ padding: 0;
4839
+ border: none;
4840
+ border-radius: 0.25rem;
4841
+ cursor: pointer;
4842
+ background: transparent;
4843
+ font-size: 0.875rem;
4844
+ transition:
4845
+ background-color 150ms ease,
4846
+ color 150ms ease;
4847
+ }
4848
+
4849
+ /* =============================================================================
4850
+ Grid View Tiles
4851
+ ============================================================================= */
4852
+
4853
+ [data-grid] [data-upload-file-status] {
4854
+ flex-direction: column;
4855
+ align-items: center;
4856
+ text-align: center;
4857
+ padding: 1rem;
4858
+ gap: 0.5rem;
4859
+ }
4860
+
4861
+ [data-grid] [data-upload-file-status] [data-upload-file-icon] {
4862
+ font-size: 2rem;
4863
+ }
4864
+
4865
+ [data-grid] [data-upload-file-status] [data-upload-bar] {
4866
+ width: 100%;
4867
+ }
4868
+