@rokkit/themes 1.0.0-next.14 → 1.0.0-next.141

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