@plexui/styles 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -2
  3. package/dist/es/components/Accordion/Accordion.module.css +89 -0
  4. package/dist/es/components/Alert/Alert.module.css +210 -0
  5. package/dist/es/components/Avatar/Avatar.module.css +168 -0
  6. package/dist/es/components/Avatar/AvatarGroup.module.css +26 -0
  7. package/dist/es/components/Badge/Badge.module.css +196 -0
  8. package/dist/es/components/Breadcrumb/Breadcrumb.module.css +59 -0
  9. package/dist/es/components/Button/Button.module.css +863 -0
  10. package/dist/es/components/ButtonGroup/ButtonGroup.module.css +158 -0
  11. package/dist/es/components/Card/Card.module.css +125 -0
  12. package/dist/es/components/Checkbox/Checkbox.module.css +225 -0
  13. package/dist/es/components/CodeBlock/CodeBlock.module.css +139 -0
  14. package/dist/es/components/DataTable/DataTable.module.css +117 -0
  15. package/dist/es/components/DatePicker/Calendar.module.css +271 -0
  16. package/dist/es/components/DateRangePicker/Calendar.module.css +295 -0
  17. package/dist/es/components/DateRangePicker/Trigger.module.css +25 -0
  18. package/dist/es/components/Dialog/Dialog.module.css +240 -0
  19. package/dist/es/components/EmptyMessage/EmptyMessage.module.css +116 -0
  20. package/dist/es/components/Field/Field.module.css +152 -0
  21. package/dist/es/components/FieldError/FieldError.module.css +28 -0
  22. package/dist/es/components/FileUpload/FileUpload.module.css +133 -0
  23. package/dist/es/components/FloatingLabelInput/FloatingLabelInput.module.css +220 -0
  24. package/dist/es/components/FloatingLabelSelect/FloatingLabelSelect.module.css +152 -0
  25. package/dist/es/components/Image/Image.module.css +9 -0
  26. package/dist/es/components/Indicator/CircularProgress.module.css +28 -0
  27. package/dist/es/components/Indicator/LoadingDots.module.css +35 -0
  28. package/dist/es/components/Indicator/LoadingIndicator.module.css +41 -0
  29. package/dist/es/components/Input/Input.module.css +519 -0
  30. package/dist/es/components/InputGroup/InputGroup.module.css +309 -0
  31. package/dist/es/components/Kbd/Kbd.module.css +47 -0
  32. package/dist/es/components/Label/Label.module.css +16 -0
  33. package/dist/es/components/Markdown/Markdown.module.css +233 -0
  34. package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +297 -0
  35. package/dist/es/components/Menu/Menu.module.css +389 -0
  36. package/dist/es/components/OTPInput/OTPInput.module.css +70 -0
  37. package/dist/es/components/Popover/Popover.module.css +82 -0
  38. package/dist/es/components/Progress/Progress.module.css +34 -0
  39. package/dist/es/components/ProgressSteps/ProgressSteps.module.css +246 -0
  40. package/dist/es/components/RadioGroup/RadioGroup.module.css +159 -0
  41. package/dist/es/components/Select/Select.module.css +341 -0
  42. package/dist/es/components/SelectControl/SelectControl.module.css +558 -0
  43. package/dist/es/components/Separator/Separator.module.css +16 -0
  44. package/dist/es/components/ShimmerText/ShimmerText.module.css +43 -0
  45. package/dist/es/components/Sidebar/Sidebar.module.css +913 -0
  46. package/dist/es/components/Skeleton/Skeleton.module.css +17 -0
  47. package/dist/es/components/Slider/Slider.module.css +199 -0
  48. package/dist/es/components/StatCard/StatCard.module.css +234 -0
  49. package/dist/es/components/Switch/Switch.module.css +121 -0
  50. package/dist/es/components/Table/Table.module.css +56 -0
  51. package/dist/es/components/Tabs/Tabs.module.css +688 -0
  52. package/dist/es/components/TagInput/TagInput.module.css +320 -0
  53. package/dist/es/components/TextLink/TextLink.module.css +50 -0
  54. package/dist/es/components/Textarea/Textarea.module.css +272 -0
  55. package/dist/es/components/Toast/Toast.module.css +99 -0
  56. package/dist/es/components/Tooltip/Tooltip.module.css +91 -0
  57. package/dist/es/components/Transition/Animate.module.css +54 -0
  58. package/dist/es/components/Transition/AnimateLayout.module.css +101 -0
  59. package/dist/es/components/Transition/AnimateLayoutGroup.module.css +88 -0
  60. package/dist/es/components/Transition/TransitionGroup.module.css +4 -0
  61. package/dist/es/styles/base.css +102 -0
  62. package/dist/es/styles/globals.css +50 -0
  63. package/dist/es/styles/index.css +22 -0
  64. package/dist/es/styles/katex.min.css +1296 -0
  65. package/dist/es/styles/tailwind-utilities.css +1316 -0
  66. package/dist/es/styles/touch.css +71 -0
  67. package/dist/es/styles/variables-components.css +626 -0
  68. package/dist/es/styles/variables-primitive.css +327 -0
  69. package/dist/es/styles/variables-semantic.css +629 -0
  70. package/dist/es/styles/variables-tailwind-theme.css +34 -0
  71. package/dist/es/styles/variables-tokens-root.css +40 -0
  72. package/dist/es/types.js +4 -0
  73. package/dist/es/types.js.map +1 -0
  74. package/dist/es/vite/index.js +54 -0
  75. package/dist/es/vite/index.js.map +1 -0
  76. package/dist/types/types.d.ts +15 -0
  77. package/dist/types/vite/index.d.ts +55 -0
  78. package/package.json +109 -4
  79. package/postcss/functions.mjs +23 -0
  80. package/postcss/injectBreakpoints.mjs +47 -0
  81. package/postcss/mixins.mjs +100 -0
  82. package/postcss/parseLightDark.mjs +174 -0
  83. package/postcss/wrapModulesInLayer.mjs +21 -0
  84. package/postcss.config.mjs +52 -0
@@ -0,0 +1,688 @@
1
+ @layer components {.Tabs {
2
+ position: relative;
3
+ display: inline-flex;
4
+ flex-wrap: nowrap;
5
+ gap: var(--segmented-control-gap);
6
+ font-size: var(--segmented-control-font-size);
7
+ font-weight: var(--segmented-control-font-weight);
8
+ -ms-overflow-style: none;
9
+ scrollbar-width: none;
10
+ vertical-align: middle;
11
+ white-space: nowrap;
12
+ }
13
+
14
+ .Tabs::-webkit-scrollbar {
15
+ width: 0;
16
+ height: 0;
17
+ }
18
+
19
+ .Tabs::-webkit-scrollbar-track,
20
+ .Tabs::-webkit-scrollbar-thumb {
21
+ background: transparent;
22
+ }
23
+
24
+ /* =============================================
25
+ Variant: Segmented (default — existing behavior)
26
+ ============================================= */
27
+ .Tabs:where([data-variant="segmented"]) {
28
+ overflow: auto;
29
+ height: var(--segmented-control-size);
30
+ padding: var(--segmented-control-gutter);
31
+ border-radius: var(--segmented-control-radius);
32
+ background: var(--segmented-control-background);
33
+ }
34
+
35
+ .Tabs:where([data-variant="segmented"]:not([data-pill])) {
36
+ --segmented-control-option-radius: calc(
37
+ var(--segmented-control-radius) - var(--segmented-control-gutter)
38
+ );
39
+ }
40
+
41
+ .Tabs:where([data-variant="segmented"][data-pill]) {
42
+ border-radius: var(--radius-full);
43
+ --segmented-control-option-radius: var(--radius-full);
44
+ }
45
+
46
+ .Tabs:where([data-variant="segmented"][data-block]) {
47
+ overflow: hidden;
48
+ display: flex;
49
+ width: 100%;
50
+ white-space: normal;
51
+ }
52
+
53
+ /* =============================================
54
+ Variant: Underline
55
+ ============================================= */
56
+ .Tabs:where([data-variant="underline"]) {
57
+ --segmented-control-option-radius: 0;
58
+
59
+ overflow: auto;
60
+ height: var(--segmented-control-size);
61
+ padding: 0;
62
+ border-radius: 0;
63
+ background: transparent;
64
+ gap: 0;
65
+ border-bottom: 1px solid var(--tabs-underline-border-color);
66
+ }
67
+
68
+ .Tabs:where([data-variant="underline"][data-block]) {
69
+ overflow: hidden;
70
+ display: flex;
71
+ width: 100%;
72
+ white-space: normal;
73
+ }
74
+
75
+ /* =============================================
76
+ Variant: Underline flush
77
+ ============================================= */
78
+ .Tabs:where([data-variant="underline"][data-flush]) {
79
+ gap: var(--segmented-control-option-gutter);
80
+ border-bottom: none;
81
+ }
82
+
83
+ .Tabs:where([data-variant="underline"][data-flush][data-block]) {
84
+ gap: 0;
85
+ }
86
+
87
+ /* =============================================
88
+ Vertical orientation
89
+ ============================================= */
90
+ .Tabs:where([data-orientation="vertical"]) {
91
+ flex-direction: column;
92
+ height: auto;
93
+ width: -moz-fit-content;
94
+ width: fit-content;
95
+ white-space: nowrap;
96
+ }
97
+
98
+ .Tabs:where([data-orientation="vertical"][data-variant="segmented"]) {
99
+ overflow-y: auto;
100
+ overflow-x: hidden;
101
+ }
102
+
103
+ .Tabs:where([data-orientation="vertical"][data-variant="underline"]) {
104
+ overflow-y: auto;
105
+ overflow-x: hidden;
106
+ border-bottom: none;
107
+ border-left: 1px solid var(--tabs-underline-border-color);
108
+ }
109
+
110
+ .Tabs:where([data-orientation="vertical"][data-block]) {
111
+ width: 100%;
112
+ }
113
+
114
+ .Tabs:where([data-orientation="vertical"][data-variant="segmented"][data-pill]) {
115
+ border-radius: calc(var(--segmented-control-size) / 2);
116
+ --segmented-control-option-radius: calc(var(--segmented-control-size) / 2);
117
+ }
118
+
119
+ /* =============================================
120
+ Sizes
121
+ ============================================= */
122
+ .Tabs:where([data-size="3xs"]) {
123
+ --segmented-control-size: var(--control-size-3xs);
124
+ --segmented-control-font-size: var(--control-font-size-sm);
125
+ --segmented-control-radius: var(--control-radius-sm);
126
+ --segmented-control-option-gutter: var(--control-gutter-xs);
127
+ /* Icon and content */
128
+ --segmented-control-icon-size: var(--control-icon-size-xs);
129
+ --segmented-control-content-gap: var(--button-gap-sm);
130
+ --segmented-control-icon-offset: -1px;
131
+ --segmented-control-badge-offset: -1px;
132
+ /* Badge tokens — inherited from badge-size-2xs */
133
+ --option-badge-size: var(--badge-size-2xs);
134
+ --option-badge-gutter: var(--badge-gutter-2xs);
135
+ --option-badge-font-size: var(--badge-font-size-2xs);
136
+ --option-badge-font-weight: var(--badge-font-weight-2xs);
137
+ --option-badge-tracking: var(--badge-tracking-2xs);
138
+ --option-badge-radius: var(--badge-radius-2xs);
139
+ }
140
+
141
+ .Tabs:where([data-size="2xs"]) {
142
+ --segmented-control-size: var(--control-size-2xs);
143
+ --segmented-control-font-size: var(--control-font-size-sm);
144
+ --segmented-control-radius: var(--control-radius-sm);
145
+ --segmented-control-option-gutter: var(--control-gutter-xs);
146
+ /* Icon and content */
147
+ --segmented-control-icon-size: var(--control-icon-size-sm);
148
+ --segmented-control-content-gap: var(--button-gap-md);
149
+ --segmented-control-icon-offset: -1px;
150
+ --segmented-control-badge-offset: -1px;
151
+ /* Badge tokens — inherited from badge-size-2xs */
152
+ --option-badge-size: var(--badge-size-2xs);
153
+ --option-badge-gutter: var(--badge-gutter-2xs);
154
+ --option-badge-font-size: var(--badge-font-size-2xs);
155
+ --option-badge-font-weight: var(--badge-font-weight-2xs);
156
+ --option-badge-tracking: var(--badge-tracking-2xs);
157
+ --option-badge-radius: var(--badge-radius-2xs);
158
+ }
159
+
160
+ .Tabs:where([data-size="xs"]) {
161
+ --segmented-control-size: var(--control-size-xs);
162
+ --segmented-control-font-size: var(--control-font-size-md);
163
+ --segmented-control-radius: var(--control-radius-sm);
164
+ --segmented-control-option-gutter: var(--control-gutter-xs);
165
+ /* Icon and content */
166
+ --segmented-control-icon-size: var(--control-icon-size-sm);
167
+ --segmented-control-content-gap: var(--button-gap-md);
168
+ --segmented-control-icon-offset: -1px;
169
+ --segmented-control-badge-offset: -1px;
170
+ /* Badge tokens — inherited from badge-size-xs */
171
+ --option-badge-size: var(--badge-size-xs);
172
+ --option-badge-gutter: var(--badge-gutter-xs);
173
+ --option-badge-font-size: var(--badge-font-size-xs);
174
+ --option-badge-font-weight: var(--badge-font-weight-xs);
175
+ --option-badge-tracking: var(--badge-tracking-xs);
176
+ --option-badge-radius: var(--badge-radius-xs);
177
+ }
178
+
179
+ .Tabs:where([data-size="sm"]) {
180
+ --segmented-control-size: var(--control-size-sm);
181
+ --segmented-control-font-size: var(--control-font-size-md);
182
+ --segmented-control-radius: var(--control-radius-sm);
183
+ --segmented-control-option-gutter: var(--control-gutter-sm);
184
+ /* Icon and content */
185
+ --segmented-control-icon-size: var(--control-icon-size-md);
186
+ --segmented-control-content-gap: var(--button-gap-md);
187
+ --segmented-control-icon-offset: -1px;
188
+ --segmented-control-badge-offset: -1px;
189
+ /* Badge tokens — inherited from badge-size-sm */
190
+ --option-badge-size: var(--badge-size-sm);
191
+ --option-badge-gutter: var(--badge-gutter-sm);
192
+ --option-badge-font-size: var(--badge-font-size-sm);
193
+ --option-badge-font-weight: var(--badge-font-weight-sm);
194
+ --option-badge-tracking: var(--badge-tracking-sm);
195
+ --option-badge-radius: var(--badge-radius-sm);
196
+ }
197
+
198
+ .Tabs:where([data-size="md"]) {
199
+ --segmented-control-size: var(--control-size-md);
200
+ --segmented-control-font-size: var(--control-font-size-md);
201
+ --segmented-control-radius: var(--control-radius-md);
202
+ --segmented-control-option-gutter: var(--control-gutter-md);
203
+ /* Icon and content */
204
+ --segmented-control-icon-size: var(--control-icon-size-md);
205
+ --segmented-control-content-gap: var(--button-gap-lg);
206
+ --segmented-control-icon-offset: -1px;
207
+ --segmented-control-badge-offset: -1px;
208
+ /* Badge tokens — inherited from badge-size-md */
209
+ --option-badge-size: var(--badge-size-md);
210
+ --option-badge-gutter: var(--badge-gutter-md);
211
+ --option-badge-font-size: var(--badge-font-size-md);
212
+ --option-badge-font-weight: var(--badge-font-weight-md);
213
+ --option-badge-tracking: var(--badge-tracking-md);
214
+ --option-badge-radius: var(--badge-radius-md);
215
+ }
216
+
217
+ .Tabs:where([data-size="lg"]) {
218
+ --segmented-control-size: var(--control-size-lg);
219
+ --segmented-control-font-size: var(--control-font-size-md);
220
+ --segmented-control-radius: var(--control-radius-lg);
221
+ --segmented-control-option-gutter: var(--control-gutter-md);
222
+ /* Icon and content */
223
+ --segmented-control-icon-size: var(--control-icon-size-md);
224
+ --segmented-control-content-gap: var(--button-gap-lg);
225
+ --segmented-control-icon-offset: -1px;
226
+ --segmented-control-badge-offset: -1px;
227
+ /* Badge tokens — inherited from badge-size-md */
228
+ --option-badge-size: var(--badge-size-md);
229
+ --option-badge-gutter: var(--badge-gutter-md);
230
+ --option-badge-font-size: var(--badge-font-size-md);
231
+ --option-badge-font-weight: var(--badge-font-weight-md);
232
+ --option-badge-tracking: var(--badge-tracking-md);
233
+ --option-badge-radius: var(--badge-radius-md);
234
+ }
235
+
236
+ .Tabs:where([data-size="xl"]) {
237
+ --segmented-control-size: var(--control-size-xl);
238
+ --segmented-control-font-size: var(--control-font-size-md);
239
+ --segmented-control-radius: var(--control-radius-xl);
240
+ --segmented-control-option-gutter: var(--control-gutter-lg);
241
+ /* Icon and content */
242
+ --segmented-control-icon-size: var(--control-icon-size-md);
243
+ --segmented-control-content-gap: var(--button-gap-lg);
244
+ --segmented-control-icon-offset: -1px;
245
+ --segmented-control-badge-offset: -1px;
246
+ /* Badge tokens — inherited from badge-size-md */
247
+ --option-badge-size: var(--badge-size-md);
248
+ --option-badge-gutter: var(--badge-gutter-md);
249
+ --option-badge-font-size: var(--badge-font-size-md);
250
+ --option-badge-font-weight: var(--badge-font-weight-md);
251
+ --option-badge-tracking: var(--badge-tracking-md);
252
+ --option-badge-radius: var(--badge-radius-md);
253
+ }
254
+
255
+ .Tabs:where([data-size="2xl"]) {
256
+ --segmented-control-size: var(--control-size-2xl);
257
+ --segmented-control-font-size: var(--control-font-size-lg);
258
+ --segmented-control-radius: var(--control-radius-xl);
259
+ --segmented-control-option-gutter: var(--control-gutter-xl);
260
+ /* Icon and content */
261
+ --segmented-control-icon-size: var(--control-icon-size-lg);
262
+ --segmented-control-content-gap: var(--button-gap-lg);
263
+ --segmented-control-icon-offset: -2px;
264
+ --segmented-control-badge-offset: -2px;
265
+ /* Badge tokens — inherited from badge-size-lg */
266
+ --option-badge-size: var(--badge-size-lg);
267
+ --option-badge-gutter: var(--badge-gutter-lg);
268
+ --option-badge-font-size: var(--badge-font-size-lg);
269
+ --option-badge-font-weight: var(--badge-font-weight-lg);
270
+ --option-badge-tracking: var(--badge-tracking-lg);
271
+ --option-badge-radius: var(--badge-radius-lg);
272
+ }
273
+
274
+ .Tabs:where([data-size="3xl"]) {
275
+ --segmented-control-size: var(--control-size-3xl);
276
+ --segmented-control-font-size: var(--control-font-size-lg);
277
+ --segmented-control-radius: var(--control-radius-xl);
278
+ --segmented-control-option-gutter: var(--control-gutter-xl);
279
+ /* Icon and content */
280
+ --segmented-control-icon-size: var(--control-icon-size-lg);
281
+ --segmented-control-content-gap: var(--button-gap-lg);
282
+ --segmented-control-icon-offset: -2px;
283
+ --segmented-control-badge-offset: -2px;
284
+ /* Badge tokens — inherited from badge-size-lg */
285
+ --option-badge-size: var(--badge-size-lg);
286
+ --option-badge-gutter: var(--badge-gutter-lg);
287
+ --option-badge-font-size: var(--badge-font-size-lg);
288
+ --option-badge-font-weight: var(--badge-font-weight-lg);
289
+ --option-badge-tracking: var(--badge-tracking-lg);
290
+ --option-badge-radius: var(--badge-radius-lg);
291
+ }
292
+
293
+ /* =============================================
294
+ Gutter sizes (segmented variant only)
295
+ ============================================= */
296
+ .Tabs:where([data-gutter-size="2xs"]) {
297
+ --segmented-control-option-gutter: var(--control-gutter-2xs);
298
+ }
299
+
300
+ .Tabs:where([data-gutter-size="xs"]) {
301
+ --segmented-control-option-gutter: var(--control-gutter-xs);
302
+ }
303
+
304
+ .Tabs:where([data-gutter-size="sm"]) {
305
+ --segmented-control-option-gutter: var(--control-gutter-sm);
306
+ }
307
+
308
+ .Tabs:where([data-gutter-size="md"]) {
309
+ --segmented-control-option-gutter: var(--control-gutter-md);
310
+ }
311
+
312
+ .Tabs:where([data-gutter-size="lg"]) {
313
+ --segmented-control-option-gutter: var(--control-gutter-lg);
314
+ }
315
+
316
+ .Tabs:where([data-gutter-size="xl"]) {
317
+ --segmented-control-option-gutter: var(--control-gutter-xl);
318
+ }/* =============================================
319
+ Tab (trigger item)
320
+ ============================================= */.Tab {
321
+ position: relative;
322
+ padding: 0 var(--segmented-control-option-gutter);
323
+ color: var(--color-text-secondary);
324
+ cursor: pointer;
325
+ line-height: 1;
326
+ display: flex;
327
+ flex-shrink: 0;
328
+ align-items: center;
329
+ justify-content: center;
330
+ transition-duration: var(--transition-duration-basic);
331
+ transition-property: opacity, background-color, color;
332
+ transition-timing-function: var(--transition-ease-basic);
333
+ }
334
+
335
+ .Tab:focus {
336
+ outline: 0;
337
+ }
338
+
339
+ /* =============================================
340
+ Segmented variant — Tab styles
341
+ ============================================= */
342
+ :where(.Tabs[data-variant="segmented"]) .Tab {
343
+ border-radius: var(--segmented-control-option-radius);
344
+ }
345
+
346
+ :where(.Tabs[data-variant="segmented"][data-block]) .Tab {
347
+ flex: 1;
348
+ }
349
+
350
+ :where(.Tabs[data-variant="segmented"][data-pill]) .Tab {
351
+ min-width: calc(var(--segmented-control-size) - 2 * var(--segmented-control-gutter));
352
+ padding: 0 calc(var(--segmented-control-option-gutter) * var(--control-gutter-pill-scaling));
353
+ }
354
+
355
+ /* Hover highlight pseudo-element (segmented only) */
356
+ :where(.Tabs[data-variant="segmented"]) .Tab::before {
357
+ position: absolute;
358
+ inset: var(--segmented-control-option-highlight-gutter);
359
+ border-radius: var(--segmented-control-option-radius);
360
+ background: var(--segmented-control-option-highlight-background-color);
361
+ content: "";
362
+ opacity: 0;
363
+ pointer-events: none;
364
+ transform: scale(1);
365
+ transition-duration: var(--transition-duration-basic);
366
+ transition-property: opacity, transform;
367
+ transition-timing-function: var(--transition-ease-basic);
368
+ will-change: transform;
369
+ }
370
+
371
+ :where(.Tabs[data-variant="segmented"]) .Tab:active::before {
372
+ transform: scale(var(--scale), 0.97);
373
+ }
374
+ @media (hover: hover) and (pointer: fine) {:where(.Tabs[data-variant="segmented"]) .Tab[data-state="off"]:where(:not([disabled])):hover {
375
+ color: var(--color-text);
376
+ }
377
+
378
+ :where(.Tabs[data-variant="segmented"]) .Tab[data-state="off"]:where(:not([disabled])):hover::before {
379
+ opacity: 0.5;
380
+ }
381
+ }
382
+
383
+ :where(.Tabs[data-variant="segmented"]) .Tab[data-state="off"]:where(:not([disabled])):focus-visible {
384
+ color: var(--color-text);
385
+ outline: 2px solid var(--color-ring);
386
+ }
387
+
388
+ :where(.Tabs[data-variant="segmented"]) .Tab[data-state="off"]:where(:not([disabled])):active::before {
389
+ opacity: 0.75;
390
+ }
391
+
392
+ /* =============================================
393
+ Underline variant — Tab styles
394
+ ============================================= */
395
+ :where(.Tabs[data-variant="underline"]) .Tab {
396
+ border-radius: 0;
397
+ }
398
+
399
+ :where(.Tabs[data-variant="underline"][data-block]) .Tab {
400
+ flex: 1;
401
+ }
402
+ @media (hover: hover) and (pointer: fine) {:where(.Tabs[data-variant="underline"]) .Tab[data-state="off"]:where(:not([disabled])):hover {
403
+ color: var(--color-text);
404
+ }
405
+ }
406
+
407
+ :where(.Tabs[data-variant="underline"]) .Tab[data-state="off"]:where(:not([disabled])):focus-visible {
408
+ color: var(--color-text);
409
+ outline: 2px solid var(--color-ring);
410
+ outline-offset: -2px;
411
+ }
412
+
413
+ /* Flush underline variant — Tab styles */
414
+ :where(.Tabs[data-variant="underline"][data-flush]) .Tab {
415
+ padding: 0;
416
+ }
417
+
418
+ /* =============================================
419
+ Vertical orientation — Tab styles
420
+ ============================================= */
421
+ :where(.Tabs[data-orientation="vertical"]) .Tab {
422
+ justify-content: flex-start;
423
+ width: 100%;
424
+ height: var(--segmented-control-size);
425
+ }
426
+
427
+ :where(.Tabs[data-orientation="vertical"][data-block]) .Tab {
428
+ flex: none;
429
+ }
430
+
431
+ /* =============================================
432
+ Shared states
433
+ ============================================= */
434
+ .Tab[data-state="on"] {
435
+ color: var(--color-text);
436
+ }
437
+
438
+ .Tab[data-state="on"]:focus-visible {
439
+ outline: 2px solid var(--color-ring);
440
+ }
441
+
442
+ .Tab[data-disabled] {
443
+ cursor: not-allowed;
444
+ opacity: 0.5;
445
+ }
446
+
447
+ .Tab[data-disabled]::before {
448
+ opacity: 0 !important;
449
+ }
450
+
451
+ .Tab svg {
452
+ display: block;
453
+ }/* =============================================
454
+ Thumb (animated indicator)
455
+ ============================================= */.TabsThumb {
456
+ position: absolute;
457
+ pointer-events: none;
458
+ will-change: transform;
459
+ }
460
+
461
+ /* Segmented horizontal: background highlight */
462
+ :where(.Tabs[data-variant="segmented"][data-orientation="horizontal"]) .TabsThumb {
463
+ top: var(--segmented-control-gutter);
464
+ bottom: var(--segmented-control-gutter);
465
+ left: 0;
466
+ border-radius: var(--segmented-control-option-radius);
467
+ background: var(--segmented-control-thumb-background);
468
+ box-shadow: var(--segmented-control-thumb-shadow);
469
+ }
470
+
471
+ /* Segmented vertical: background highlight */
472
+ :where(.Tabs[data-variant="segmented"][data-orientation="vertical"]) .TabsThumb {
473
+ left: var(--segmented-control-gutter);
474
+ right: var(--segmented-control-gutter);
475
+ top: 0;
476
+ border-radius: var(--segmented-control-option-radius);
477
+ background: var(--segmented-control-thumb-background);
478
+ box-shadow: var(--segmented-control-thumb-shadow);
479
+ }
480
+
481
+ /* Underline horizontal: thin line at the bottom */
482
+ :where(.Tabs[data-variant="underline"][data-orientation="horizontal"]) .TabsThumb {
483
+ bottom: 0;
484
+ left: 0;
485
+ height: var(--tabs-underline-indicator-height);
486
+ border-radius: calc(var(--tabs-underline-indicator-height) / 2) calc(var(--tabs-underline-indicator-height) / 2) 0 0;
487
+ background: var(--tabs-underline-indicator-color);
488
+ box-shadow: none;
489
+ }
490
+
491
+ /* Underline vertical: thin line on the left */
492
+ :where(.Tabs[data-variant="underline"][data-orientation="vertical"]) .TabsThumb {
493
+ left: 0;
494
+ top: 0;
495
+ width: var(--tabs-underline-indicator-height);
496
+ border-radius: 0 calc(var(--tabs-underline-indicator-height) / 2) calc(var(--tabs-underline-indicator-height) / 2) 0;
497
+ background: var(--tabs-underline-indicator-color);
498
+ box-shadow: none;
499
+ }
500
+
501
+ /* Flush underline horizontal: 1px line, no radius */
502
+ :where(.Tabs[data-variant="underline"][data-flush][data-orientation="horizontal"]) .TabsThumb {
503
+ height: 1px;
504
+ border-radius: 0;
505
+ }
506
+
507
+ /* Flush underline vertical: 1px line, no radius */
508
+ :where(.Tabs[data-variant="underline"][data-flush][data-orientation="vertical"]) .TabsThumb {
509
+ width: 1px;
510
+ border-radius: 0;
511
+ }/* =============================================
512
+ Tab Content (icon + text + badge layout)
513
+ ============================================= */.TabContent {
514
+ position: relative;
515
+ display: flex;
516
+ align-items: center;
517
+ gap: var(--segmented-control-content-gap);
518
+ }
519
+
520
+ /* Icon auto-sizing (same as Button) */
521
+ .TabContent svg:where(:not([data-no-autosize])) {
522
+ width: var(--segmented-control-icon-size);
523
+ height: var(--segmented-control-icon-size);
524
+ }
525
+
526
+ /* Negative margin for icon when followed by text */
527
+ .TabContent svg:where(:first-child:not(:only-child)) {
528
+ margin-left: var(--segmented-control-icon-offset);
529
+ }/* =============================================
530
+ Tab Badge (CSS-only, no Badge component)
531
+ ============================================= */.TabBadge {
532
+ display: inline-flex;
533
+ align-items: center;
534
+ height: var(--option-badge-size);
535
+ padding: 0 var(--option-badge-gutter);
536
+ border-radius: var(--option-badge-radius);
537
+ background-color: var(--option-badge-bg);
538
+ color: var(--option-badge-color);
539
+ font-size: var(--option-badge-font-size);
540
+ font-weight: var(--option-badge-font-weight);
541
+ letter-spacing: var(--option-badge-tracking);
542
+ white-space: nowrap;
543
+ margin-right: var(--segmented-control-badge-offset);
544
+ }
545
+
546
+ /* =============================================
547
+ Soft variant (default)
548
+ ============================================= */
549
+ .TabBadge[data-variant="soft"]:where([data-color="secondary"]) {
550
+ --option-badge-bg: var(--color-background-secondary-soft-alpha);
551
+ --option-badge-color: var(--color-text-secondary-soft);
552
+ }
553
+
554
+ .TabBadge[data-variant="soft"]:where([data-color="success"]) {
555
+ --option-badge-bg: var(--color-background-success-soft-alpha);
556
+ --option-badge-color: var(--color-text-success-soft);
557
+ }
558
+
559
+ .TabBadge[data-variant="soft"]:where([data-color="warning"]) {
560
+ --option-badge-bg: var(--color-background-warning-soft-alpha);
561
+ --option-badge-color: var(--color-text-warning-soft);
562
+ }
563
+
564
+ .TabBadge[data-variant="soft"]:where([data-color="danger"]) {
565
+ --option-badge-bg: var(--color-background-danger-soft-alpha);
566
+ --option-badge-color: var(--color-text-danger-soft);
567
+ }
568
+
569
+ .TabBadge[data-variant="soft"]:where([data-color="info"]) {
570
+ --option-badge-bg: var(--color-background-info-soft-alpha);
571
+ --option-badge-color: var(--color-text-info-soft);
572
+ }
573
+
574
+ .TabBadge[data-variant="soft"]:where([data-color="discovery"]) {
575
+ --option-badge-bg: var(--color-background-discovery-soft-alpha);
576
+ --option-badge-color: var(--color-text-discovery-soft);
577
+ }
578
+
579
+ .TabBadge[data-variant="soft"]:where([data-color="caution"]) {
580
+ --option-badge-bg: var(--color-background-caution-soft-alpha);
581
+ --option-badge-color: var(--color-text-caution-soft);
582
+ }
583
+
584
+ /* =============================================
585
+ Solid variant
586
+ ============================================= */
587
+ .TabBadge[data-variant="solid"]:where([data-color="secondary"]) {
588
+ --option-badge-bg: var(--color-background-secondary-solid);
589
+ --option-badge-color: var(--color-text-secondary-solid);
590
+ }
591
+
592
+ .TabBadge[data-variant="solid"]:where([data-color="success"]) {
593
+ --option-badge-bg: var(--color-background-success-solid);
594
+ --option-badge-color: var(--color-text-success-solid);
595
+ }
596
+
597
+ .TabBadge[data-variant="solid"]:where([data-color="warning"]) {
598
+ --option-badge-bg: var(--color-background-warning-solid);
599
+ --option-badge-color: var(--color-text-warning-solid);
600
+ }
601
+
602
+ .TabBadge[data-variant="solid"]:where([data-color="danger"]) {
603
+ --option-badge-bg: var(--color-background-danger-solid);
604
+ --option-badge-color: var(--color-text-danger-solid);
605
+ }
606
+
607
+ .TabBadge[data-variant="solid"]:where([data-color="info"]) {
608
+ --option-badge-bg: var(--color-background-info-solid);
609
+ --option-badge-color: var(--color-text-info-solid);
610
+ }
611
+
612
+ .TabBadge[data-variant="solid"]:where([data-color="discovery"]) {
613
+ --option-badge-bg: var(--color-background-discovery-solid);
614
+ --option-badge-color: var(--color-text-discovery-solid);
615
+ }
616
+
617
+ .TabBadge[data-variant="solid"]:where([data-color="caution"]) {
618
+ --option-badge-bg: var(--color-background-caution-solid);
619
+ --option-badge-color: var(--color-text-caution-solid);
620
+ }
621
+
622
+ /* =============================================
623
+ Outline variant
624
+ ============================================= */
625
+ .TabBadge[data-variant="outline"] {
626
+ background-color: transparent;
627
+ box-shadow: 0 0 0 1px var(--option-badge-border) inset;
628
+ }
629
+
630
+ .TabBadge[data-variant="outline"]:where([data-color="secondary"]) {
631
+ --option-badge-border: var(--color-border-secondary-outline);
632
+ --option-badge-color: var(--color-text-secondary-outline);
633
+ }
634
+
635
+ .TabBadge[data-variant="outline"]:where([data-color="success"]) {
636
+ --option-badge-border: var(--color-border-success-outline);
637
+ --option-badge-color: var(--color-text-success-outline);
638
+ }
639
+
640
+ .TabBadge[data-variant="outline"]:where([data-color="warning"]) {
641
+ --option-badge-border: var(--color-border-warning-outline);
642
+ --option-badge-color: var(--color-text-warning-outline);
643
+ }
644
+
645
+ .TabBadge[data-variant="outline"]:where([data-color="danger"]) {
646
+ --option-badge-border: var(--color-border-danger-outline);
647
+ --option-badge-color: var(--color-text-danger-outline);
648
+ }
649
+
650
+ .TabBadge[data-variant="outline"]:where([data-color="info"]) {
651
+ --option-badge-border: var(--color-border-info-outline);
652
+ --option-badge-color: var(--color-text-info-outline);
653
+ }
654
+
655
+ .TabBadge[data-variant="outline"]:where([data-color="discovery"]) {
656
+ --option-badge-border: var(--color-border-discovery-outline);
657
+ --option-badge-color: var(--color-text-discovery-outline);
658
+ }
659
+
660
+ .TabBadge[data-variant="outline"]:where([data-color="caution"]) {
661
+ --option-badge-border: var(--color-border-caution-outline);
662
+ --option-badge-color: var(--color-text-caution-outline);
663
+ }
664
+
665
+ /* =============================================
666
+ Pill
667
+ ============================================= */
668
+ .TabBadge[data-pill] {
669
+ border-radius: var(--radius-full);
670
+ padding: 0 calc(var(--option-badge-gutter) * var(--control-gutter-pill-scaling));
671
+ }/* =============================================
672
+ overflow="menu": tabs that do not fit move into a menu at the end
673
+ ============================================= */.OverflowHost {
674
+ display: contents;
675
+ }/* The strip stays within its container and is measured against it */.Tabs[data-overflow="menu"] {
676
+ min-width: 0;
677
+ max-width: 100%;
678
+ overflow: hidden;
679
+ }/* Name and chevron of the menu button, in one row */.OverflowLabel {
680
+ display: inline-flex;
681
+ align-items: center;
682
+ gap: var(--segmented-control-content-gap);
683
+ }/* A hidden tab's count, next to its name in the menu */.OverflowBadge {
684
+ margin-inline-start: auto;
685
+ padding-inline-start: calc(var(--spacing) * 3);
686
+ color: var(--color-text-secondary);
687
+ }
688
+ }