raft-ui 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,11 +1,13 @@
1
- import { a as useThemeFamily, c as tv, i as useTheme, n as buttonVariants, o as ThemeContext, r as Spinner, s as ThemeStateContext, t as Button } from "./button-CJqMhTPQ.mjs";
2
1
  import { cn } from "./cn.mjs";
3
- import { createContext, use, useCallback, useEffect, useId, useMemo, useState, useSyncExternalStore } from "react";
2
+ import { a as useThemeFamily, c as tv, i as useTheme, n as buttonVariants, o as ThemeContext, r as Spinner, s as ThemeStateContext, t as Button } from "./button-jUlaK4eN.mjs";
3
+ import { Dialog as Dialog$1 } from "@base-ui/react/dialog";
4
+ import { AlertTriangle, Check, CheckCircle2, ChevronDown, Copy, Info, Minus, X } from "lucide-react";
5
+ import { createContext, use, useCallback, useContext, useEffect, useId, useMemo, useState, useSyncExternalStore } from "react";
4
6
  import { mergeProps } from "@base-ui/react/merge-props";
5
7
  import { useRender } from "@base-ui/react/use-render";
6
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { useClipboard } from "foxact/use-clipboard";
7
10
  import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
8
- import { AlertTriangle, Check, CheckCircle2, ChevronDown, Info, Minus, X } from "lucide-react";
9
11
  import { Avatar as Avatar$1, ContextMenu as ContextMenu$1 } from "@base-ui/react";
10
12
  import { Menu } from "@base-ui/react/menu";
11
13
  import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
@@ -16,10 +18,500 @@ import { Combobox as Combobox$1 } from "@base-ui/react/combobox";
16
18
  import { Select as Select$1 } from "@base-ui/react/select";
17
19
  import { Radio } from "@base-ui/react/radio";
18
20
  import { RadioGroup as RadioGroup$1 } from "@base-ui/react/radio-group";
21
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
19
22
  import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
20
23
  import { DndContext, PointerSensor, TouchSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
21
24
  import { SortableContext, arrayMove, horizontalListSortingStrategy, useSortable } from "@dnd-kit/sortable";
22
25
  import { Separator as Separator$1 } from "@base-ui/react/separator";
26
+ //#region src/components/alert-dialog/alert-dialog.tsx
27
+ const alertDialog = tv({
28
+ slots: {
29
+ overlay: [
30
+ "fixed inset-0 z-50",
31
+ "transition-opacity duration-150 ease-out",
32
+ "data-[starting-style]:opacity-0 data-[ending-style]:opacity-0"
33
+ ],
34
+ content: [
35
+ "fixed top-1/2 left-1/2 z-50 grid w-[calc(100%-2rem)] max-w-[408px] -translate-x-1/2 -translate-y-1/2",
36
+ "origin-center transform-gpu outline-none transition-[opacity,transform] duration-150 ease-out",
37
+ "data-[starting-style]:scale-[.98] data-[starting-style]:opacity-0",
38
+ "data-[ending-style]:opacity-0"
39
+ ],
40
+ header: ["grid grid-cols-[minmax(0,1fr)_max-content] items-center gap-3 min-w-0"],
41
+ body: ["min-w-0"],
42
+ footer: ["flex items-center justify-end gap-3"],
43
+ title: ["m-0 min-w-0 text-foreground-strong"],
44
+ description: ["m-0 text-foreground-muted"]
45
+ },
46
+ variants: { theme: {
47
+ brutal: {
48
+ overlay: ["bg-layer-backdrop"],
49
+ content: ["gap-4 border-2 border-line-strong bg-layer-panel px-6 py-4 shadow-xl"],
50
+ body: ["py-2 font-medium"],
51
+ title: ["font-heading text-lg leading-none font-bold uppercase"],
52
+ description: ["font-sans text-sm leading-5 text-foreground/60"]
53
+ },
54
+ elegant: {
55
+ overlay: ["bg-layer-backdrop backdrop-blur-[2px]"],
56
+ content: ["overflow-clip rounded-lg bg-layer-popover shadow-xl"],
57
+ header: ["border-b border-line-subtle bg-black/[0.02] px-5 py-3"],
58
+ body: ["px-6 py-5"],
59
+ footer: ["border-t border-line-subtle bg-black/[0.015] px-5 py-3"],
60
+ title: ["font-sans text-sm leading-5 font-medium tracking-[-0.005em]"],
61
+ description: ["font-sans text-sm leading-5 text-[oklch(0.48_0_0)] dark:text-[oklch(0.76_0_0)]"]
62
+ }
63
+ } }
64
+ });
65
+ function AlertDialog(props) {
66
+ return /* @__PURE__ */ jsx(Dialog$1.Root, {
67
+ "data-slot": "alert-dialog",
68
+ ...props
69
+ });
70
+ }
71
+ function AlertDialogTrigger(props) {
72
+ return /* @__PURE__ */ jsx(Dialog$1.Trigger, {
73
+ "data-slot": "alert-dialog-trigger",
74
+ ...props
75
+ });
76
+ }
77
+ function AlertDialogPortal(props) {
78
+ return /* @__PURE__ */ jsx(Dialog$1.Portal, {
79
+ "data-slot": "alert-dialog-portal",
80
+ ...props
81
+ });
82
+ }
83
+ function AlertDialogClose({ className, variant, size, children, ...props }) {
84
+ const isBrutal = useThemeFamily() === "brutal";
85
+ return /* @__PURE__ */ jsx(Dialog$1.Close, {
86
+ "data-slot": "alert-dialog-close",
87
+ render: /* @__PURE__ */ jsx(Button, {
88
+ variant: variant ?? (isBrutal ? "outline" : "ghost"),
89
+ size: size ?? (isBrutal ? "icon-md" : "icon-sm"),
90
+ "aria-label": "Close",
91
+ className: isBrutal ? className : cn("p-0 text-foreground-placeholder hover:border-transparent hover:bg-transparent hover:text-foreground", className)
92
+ }),
93
+ ...props,
94
+ children: children ?? /* @__PURE__ */ jsx(X, { className: isBrutal ? "size-5" : "size-4" })
95
+ });
96
+ }
97
+ function AlertDialogOverlay({ className, ...props }) {
98
+ const theme = useThemeFamily();
99
+ const { overlay } = alertDialog({ theme });
100
+ return /* @__PURE__ */ jsx(Dialog$1.Backdrop, {
101
+ "data-slot": "alert-dialog-overlay",
102
+ "data-theme": theme,
103
+ className: overlay({ className }),
104
+ ...props
105
+ });
106
+ }
107
+ function AlertDialogContent({ className, children, portalProps, overlay, ...props }) {
108
+ const theme = useThemeFamily();
109
+ const { resolvedMode } = useTheme();
110
+ const { content } = alertDialog({ theme });
111
+ return /* @__PURE__ */ jsxs(AlertDialogPortal, {
112
+ ...portalProps,
113
+ children: [overlay === false ? null : /* @__PURE__ */ jsx(AlertDialogOverlay, { ...overlay }), /* @__PURE__ */ jsx(Dialog$1.Popup, {
114
+ "data-slot": "alert-dialog-content",
115
+ "data-theme": theme,
116
+ className: cn(content({ className }), resolvedMode === "dark" && "dark"),
117
+ ...props,
118
+ role: "alertdialog",
119
+ children
120
+ })]
121
+ });
122
+ }
123
+ function AlertDialogHeader({ className, ...props }) {
124
+ const { header } = alertDialog({ theme: useThemeFamily() });
125
+ return /* @__PURE__ */ jsx("div", {
126
+ "data-slot": "alert-dialog-header",
127
+ className: header({ className }),
128
+ ...props
129
+ });
130
+ }
131
+ function AlertDialogBody({ className, ...props }) {
132
+ const { body } = alertDialog({ theme: useThemeFamily() });
133
+ return /* @__PURE__ */ jsx("div", {
134
+ "data-slot": "alert-dialog-body",
135
+ className: body({ className }),
136
+ ...props
137
+ });
138
+ }
139
+ function AlertDialogFooter({ className, ...props }) {
140
+ const { footer } = alertDialog({ theme: useThemeFamily() });
141
+ return /* @__PURE__ */ jsx("div", {
142
+ "data-slot": "alert-dialog-footer",
143
+ className: footer({ className }),
144
+ ...props
145
+ });
146
+ }
147
+ function AlertDialogTitle({ className, ...props }) {
148
+ const { title } = alertDialog({ theme: useThemeFamily() });
149
+ return /* @__PURE__ */ jsx(Dialog$1.Title, {
150
+ "data-slot": "alert-dialog-title",
151
+ className: title({ className }),
152
+ ...props
153
+ });
154
+ }
155
+ function AlertDialogDescription({ className, ...props }) {
156
+ const { description } = alertDialog({ theme: useThemeFamily() });
157
+ return /* @__PURE__ */ jsx(Dialog$1.Description, {
158
+ "data-slot": "alert-dialog-description",
159
+ className: description({ className }),
160
+ ...props
161
+ });
162
+ }
163
+ function AlertDialogAction(props) {
164
+ return /* @__PURE__ */ jsx(Button, {
165
+ "data-slot": "alert-dialog-action",
166
+ ...props
167
+ });
168
+ }
169
+ function AlertDialogCancel({ className, variant = "outline", size = "sm", ...props }) {
170
+ return /* @__PURE__ */ jsx(Dialog$1.Close, {
171
+ "data-slot": "alert-dialog-cancel",
172
+ render: /* @__PURE__ */ jsx(Button, {
173
+ className,
174
+ variant,
175
+ size
176
+ }),
177
+ ...props
178
+ });
179
+ }
180
+ //#endregion
181
+ //#region src/components/dialog/dialog.tsx
182
+ const dialog = tv({
183
+ slots: {
184
+ overlay: [
185
+ "fixed inset-0 z-50",
186
+ "transition-opacity duration-150 ease-out",
187
+ "data-[starting-style]:opacity-0 data-[ending-style]:opacity-0"
188
+ ],
189
+ content: [
190
+ "fixed top-1/2 left-1/2 z-50 grid w-[calc(100%-2rem)] max-w-md -translate-x-1/2 -translate-y-1/2",
191
+ "origin-center transform-gpu outline-none transition-[opacity,transform] duration-150 ease-out",
192
+ "data-[starting-style]:scale-[.98] data-[starting-style]:opacity-0",
193
+ "data-[ending-style]:opacity-0"
194
+ ],
195
+ header: ["grid grid-cols-[minmax(0,1fr)_max-content] items-center gap-3 min-w-0"],
196
+ body: ["min-w-0"],
197
+ footer: ["flex items-center justify-end gap-3"],
198
+ title: ["m-0 min-w-0 text-foreground-strong"],
199
+ description: ["m-0 text-foreground-muted"]
200
+ },
201
+ variants: { theme: {
202
+ brutal: {
203
+ overlay: ["bg-layer-backdrop"],
204
+ content: ["gap-4 border-2 border-line-strong bg-layer-panel px-6 py-4 shadow-xl"],
205
+ body: ["py-2 font-medium"],
206
+ title: ["font-heading text-lg leading-none font-bold uppercase"],
207
+ description: ["font-sans text-sm leading-5 text-foreground/60"]
208
+ },
209
+ elegant: {
210
+ overlay: ["bg-layer-backdrop backdrop-blur-[2px]"],
211
+ content: ["overflow-clip rounded-lg bg-layer-popover shadow-xl"],
212
+ header: ["border-b border-line-subtle bg-black/[0.02] px-6 py-3"],
213
+ body: ["px-6 py-5"],
214
+ footer: ["border-t border-line-subtle bg-black/[0.015] px-6 py-3"],
215
+ title: ["font-sans text-sm leading-5 font-medium tracking-[-0.005em]"],
216
+ description: ["font-sans text-sm leading-5 text-[oklch(0.48_0_0)] dark:text-[oklch(0.76_0_0)]"]
217
+ }
218
+ } }
219
+ });
220
+ function Dialog(props) {
221
+ return /* @__PURE__ */ jsx(Dialog$1.Root, {
222
+ "data-slot": "dialog",
223
+ ...props
224
+ });
225
+ }
226
+ function DialogTrigger(props) {
227
+ return /* @__PURE__ */ jsx(Dialog$1.Trigger, {
228
+ "data-slot": "dialog-trigger",
229
+ ...props
230
+ });
231
+ }
232
+ function DialogPortal(props) {
233
+ return /* @__PURE__ */ jsx(Dialog$1.Portal, {
234
+ "data-slot": "dialog-portal",
235
+ ...props
236
+ });
237
+ }
238
+ function DialogOverlay({ className, ...props }) {
239
+ const theme = useThemeFamily();
240
+ const { overlay } = dialog({ theme });
241
+ return /* @__PURE__ */ jsx(Dialog$1.Backdrop, {
242
+ "data-slot": "dialog-overlay",
243
+ "data-theme": theme,
244
+ className: overlay({ className }),
245
+ ...props
246
+ });
247
+ }
248
+ function DialogContent({ className, children, portalProps, overlay, ...props }) {
249
+ const theme = useThemeFamily();
250
+ const { resolvedMode } = useTheme();
251
+ const { content } = dialog({ theme });
252
+ return /* @__PURE__ */ jsxs(DialogPortal, {
253
+ ...portalProps,
254
+ children: [overlay === false ? null : /* @__PURE__ */ jsx(DialogOverlay, { ...overlay }), /* @__PURE__ */ jsx(Dialog$1.Popup, {
255
+ "data-slot": "dialog-content",
256
+ "data-theme": theme,
257
+ className: cn(content({ className }), resolvedMode === "dark" && "dark"),
258
+ ...props,
259
+ children
260
+ })]
261
+ });
262
+ }
263
+ function DialogClose({ className, variant, size, children, render, ...props }) {
264
+ const isBrutal = useThemeFamily() === "brutal";
265
+ if (render) return /* @__PURE__ */ jsx(Dialog$1.Close, {
266
+ "data-slot": "dialog-close",
267
+ render,
268
+ ...props,
269
+ children
270
+ });
271
+ return /* @__PURE__ */ jsx(Dialog$1.Close, {
272
+ "data-slot": "dialog-close",
273
+ render: /* @__PURE__ */ jsx(Button, {
274
+ variant: variant ?? (isBrutal ? "outline" : "ghost"),
275
+ size: size ?? (isBrutal ? "icon-md" : "icon-sm"),
276
+ "aria-label": "Close",
277
+ className: isBrutal ? className : cn("p-0 text-foreground-placeholder hover:border-transparent hover:bg-transparent hover:text-foreground", className)
278
+ }),
279
+ ...props,
280
+ children: children ?? /* @__PURE__ */ jsx(X, { className: isBrutal ? "size-5" : "size-4" })
281
+ });
282
+ }
283
+ function DialogHeader({ className, ...props }) {
284
+ const { header } = dialog({ theme: useThemeFamily() });
285
+ return /* @__PURE__ */ jsx("div", {
286
+ "data-slot": "dialog-header",
287
+ className: header({ className }),
288
+ ...props
289
+ });
290
+ }
291
+ function DialogBody({ className, ...props }) {
292
+ const { body } = dialog({ theme: useThemeFamily() });
293
+ return /* @__PURE__ */ jsx("div", {
294
+ "data-slot": "dialog-body",
295
+ className: body({ className }),
296
+ ...props
297
+ });
298
+ }
299
+ function DialogFooter({ className, ...props }) {
300
+ const { footer } = dialog({ theme: useThemeFamily() });
301
+ return /* @__PURE__ */ jsx("div", {
302
+ "data-slot": "dialog-footer",
303
+ className: footer({ className }),
304
+ ...props
305
+ });
306
+ }
307
+ function DialogTitle({ className, ...props }) {
308
+ const { title } = dialog({ theme: useThemeFamily() });
309
+ return /* @__PURE__ */ jsx(Dialog$1.Title, {
310
+ "data-slot": "dialog-title",
311
+ className: title({ className }),
312
+ ...props
313
+ });
314
+ }
315
+ function DialogDescription({ className, ...props }) {
316
+ const { description } = dialog({ theme: useThemeFamily() });
317
+ return /* @__PURE__ */ jsx(Dialog$1.Description, {
318
+ "data-slot": "dialog-description",
319
+ className: description({ className }),
320
+ ...props
321
+ });
322
+ }
323
+ //#endregion
324
+ //#region src/components/copyable-code/copyable-code.tsx
325
+ const copyableCode = tv({
326
+ slots: {
327
+ root: ["group/copyable-code flex w-full min-w-0 items-center gap-2"],
328
+ code: ["min-w-0 flex-1 font-mono text-xs"],
329
+ codeInner: ["block w-full min-w-0 max-w-full break-all"],
330
+ action: [
331
+ "shrink-0",
332
+ "[&_[data-slot=button]]:transition-[color,background-color,box-shadow]",
333
+ "[&_[data-slot=button]]:duration-150 [&_[data-slot=button]]:ease-out"
334
+ ],
335
+ iconSwap: [
336
+ "relative inline-grid size-3",
337
+ "[&_[data-slot=copyable-code-icon]]:col-start-1 [&_[data-slot=copyable-code-icon]]:row-start-1",
338
+ "[&_[data-slot=copyable-code-icon]]:origin-center",
339
+ "[&_[data-slot=copyable-code-icon]]:transition-[opacity,filter,scale]",
340
+ "[&_[data-slot=copyable-code-icon]]:duration-[170ms]",
341
+ "[&_[data-slot=copyable-code-icon]]:ease-[cubic-bezier(0.16,1,0.3,1)]",
342
+ "[&_[data-slot=copyable-code-icon]]:will-change-[opacity,filter,scale]",
343
+ "motion-reduce:[&_[data-slot=copyable-code-icon]]:transition-none",
344
+ "data-[state=idle]:[&_[data-icon=copy]]:scale-100 data-[state=idle]:[&_[data-icon=copy]]:opacity-100 data-[state=idle]:[&_[data-icon=copy]]:blur-0",
345
+ "data-[state=idle]:[&_[data-icon=check]]:scale-[0.72] data-[state=idle]:[&_[data-icon=check]]:opacity-0 data-[state=idle]:[&_[data-icon=check]]:blur-[1px]",
346
+ "data-[state=copied]:[&_[data-icon=check]]:scale-100 data-[state=copied]:[&_[data-icon=check]]:opacity-100 data-[state=copied]:[&_[data-icon=check]]:blur-0",
347
+ "data-[state=copied]:[&_[data-icon=copy]]:scale-[0.72] data-[state=copied]:[&_[data-icon=copy]]:opacity-0 data-[state=copied]:[&_[data-icon=copy]]:blur-[1px]"
348
+ ]
349
+ },
350
+ variants: {
351
+ theme: {
352
+ brutal: {
353
+ code: ["border-2 border-line-strong bg-black text-[oklch(0.88_0.18_132)] shadow-sm"],
354
+ codeInner: "break-all"
355
+ },
356
+ elegant: {
357
+ code: [
358
+ "bg-[oklch(0.988_0.002_286)] text-[oklch(0.45_0.04_74)]",
359
+ "shadow-[0_0_0_0.5px_oklch(0_0_0_/_0.22)]",
360
+ "dark:bg-layer-panel dark:text-[oklch(0.82_0.06_90)] dark:shadow-[0_0_0_0.5px_oklch(1_0_0_/_0.16)]"
361
+ ],
362
+ codeInner: ["border-x border-dashed border-[oklch(0_0_0_/_0.12)] bg-white px-1", "dark:border-[oklch(1_0_0_/_0.14)] dark:bg-layer-popover"],
363
+ action: [
364
+ "[&_[data-slot=button]]:text-foreground-muted",
365
+ "[&_[data-slot=button]]:shadow-none",
366
+ "[&_[data-slot=button]]:hover:bg-transparent [&_[data-slot=button]]:hover:text-foreground-strong [&_[data-slot=button]]:hover:before:bg-transparent"
367
+ ]
368
+ }
369
+ },
370
+ size: {
371
+ sm: { code: "px-3 py-1.5 leading-5" },
372
+ md: { code: "px-3 py-2 leading-5" }
373
+ }
374
+ },
375
+ defaultVariants: { size: "md" },
376
+ compoundVariants: [{
377
+ theme: "elegant",
378
+ size: "sm",
379
+ class: {
380
+ code: "px-2 py-0",
381
+ codeInner: "py-1.5 leading-5"
382
+ }
383
+ }, {
384
+ theme: "elegant",
385
+ size: "md",
386
+ class: {
387
+ code: "px-2 py-0",
388
+ codeInner: "py-2 leading-5"
389
+ }
390
+ }]
391
+ });
392
+ const CopyableCodeContext = createContext(null);
393
+ function useCopyableCode(part) {
394
+ const context = useContext(CopyableCodeContext);
395
+ if (!context) throw new Error(`${part} must be used inside CopyableCode.Root.`);
396
+ return context;
397
+ }
398
+ function CopyableCodeRoot({ copied, onCopy, size = "md", className, ...props }) {
399
+ const { root } = copyableCode({
400
+ theme: useThemeFamily(),
401
+ size
402
+ });
403
+ const { copied: clipboardCopied, copy } = useClipboard({ timeout: 1400 });
404
+ const effectiveCopied = copied ?? clipboardCopied;
405
+ const copyValue = useCallback(async (value) => {
406
+ await copy(value);
407
+ await onCopy?.(value);
408
+ }, [copy, onCopy]);
409
+ const context = useMemo(() => ({
410
+ copied: effectiveCopied,
411
+ copyValue,
412
+ size
413
+ }), [
414
+ copyValue,
415
+ effectiveCopied,
416
+ size
417
+ ]);
418
+ return /* @__PURE__ */ jsx(CopyableCodeContext.Provider, {
419
+ value: context,
420
+ children: /* @__PURE__ */ jsx("div", {
421
+ "data-slot": "copyable-code",
422
+ "data-size": size,
423
+ "data-state": effectiveCopied ? "copied" : "idle",
424
+ className: root({ className }),
425
+ ...props
426
+ })
427
+ });
428
+ }
429
+ function CopyableCodeCode({ children, className, truncate, ...props }) {
430
+ const { size } = useCopyableCode("CopyableCode.Code");
431
+ const { code, codeInner } = copyableCode({
432
+ theme: useThemeFamily(),
433
+ size
434
+ });
435
+ const scrollClassName = "overflow-x-auto overflow-y-hidden break-normal whitespace-nowrap text-clip [scrollbar-width:none] [&::-webkit-scrollbar]:hidden";
436
+ return /* @__PURE__ */ jsx("code", {
437
+ "data-slot": "copyable-code-code",
438
+ "data-truncate": truncate ? "true" : void 0,
439
+ className: code({ className }),
440
+ ...props,
441
+ children: /* @__PURE__ */ jsx("span", {
442
+ "data-slot": "copyable-code-code-inner",
443
+ className: codeInner({ className: [truncate && scrollClassName] }),
444
+ children
445
+ })
446
+ });
447
+ }
448
+ function CopyableCodeAction({ ariaLabel = "Copy code", children, buttonClassName, className, copiedAriaLabel = "Copied code", onClick, size, variant, ...props }) {
449
+ const { copied, copyValue } = useCopyableCode("CopyableCode.Action");
450
+ const theme = useThemeFamily();
451
+ const { action } = copyableCode({ theme });
452
+ const accessibleLabel = copied ? copiedAriaLabel : ariaLabel;
453
+ const buttonSize = size ?? (theme === "elegant" ? "icon-xs" : "icon-sm");
454
+ const buttonVariant = variant ?? (theme === "elegant" ? "ghost" : "outline");
455
+ const handleClick = async (event) => {
456
+ await copyValue(event.currentTarget.closest("[data-slot=\"copyable-code\"]")?.querySelector("[data-slot=\"copyable-code-code\"]")?.textContent ?? "");
457
+ onClick?.(event);
458
+ };
459
+ return /* @__PURE__ */ jsx("span", {
460
+ "data-slot": "copyable-code-action",
461
+ className: action({ className }),
462
+ children: /* @__PURE__ */ jsx(Button, {
463
+ type: "button",
464
+ variant: buttonVariant,
465
+ size: buttonSize,
466
+ "aria-label": accessibleLabel,
467
+ "aria-live": "polite",
468
+ onClick: handleClick,
469
+ className: buttonClassName,
470
+ ...props,
471
+ children: typeof children === "function" ? children({ copied }) : children ?? /* @__PURE__ */ jsx(CopyableCodeActionIcon, { copied })
472
+ })
473
+ });
474
+ }
475
+ function CopyableCodeActionIcon({ copied }) {
476
+ const { iconSwap } = copyableCode();
477
+ return /* @__PURE__ */ jsxs("span", {
478
+ "data-slot": "copyable-code-icon-swap",
479
+ "data-state": copied ? "copied" : "idle",
480
+ className: iconSwap(),
481
+ "aria-hidden": true,
482
+ children: [/* @__PURE__ */ jsx(Copy, {
483
+ "data-slot": "copyable-code-icon",
484
+ "data-icon": "copy",
485
+ className: "size-3",
486
+ strokeWidth: 1.75
487
+ }), /* @__PURE__ */ jsx(Check, {
488
+ "data-slot": "copyable-code-icon",
489
+ "data-icon": "check",
490
+ className: "size-3",
491
+ strokeWidth: 1.75
492
+ })]
493
+ });
494
+ }
495
+ function CopyableCodePreset({ actionClassName, ariaLabel, codeClassName, children, copiedAriaLabel, truncate, ...props }) {
496
+ return /* @__PURE__ */ jsxs(CopyableCodeRoot, {
497
+ ...props,
498
+ children: [/* @__PURE__ */ jsx(CopyableCodeCode, {
499
+ className: codeClassName,
500
+ truncate,
501
+ children
502
+ }), /* @__PURE__ */ jsx(CopyableCodeAction, {
503
+ ariaLabel,
504
+ className: actionClassName,
505
+ copiedAriaLabel
506
+ })]
507
+ });
508
+ }
509
+ const CopyableCode = Object.assign(CopyableCodePreset, {
510
+ Action: CopyableCodeAction,
511
+ Code: CopyableCodeCode,
512
+ Root: CopyableCodeRoot
513
+ });
514
+ //#endregion
23
515
  //#region src/components/checkbox/checkbox-indicator.tsx
24
516
  const checkboxIndicator = tv({
25
517
  slots: { root: [
@@ -1477,7 +1969,7 @@ const popover = tv({
1477
1969
  description: ["text-xs leading-5 text-foreground-muted"],
1478
1970
  close: ["text-[11px] font-medium tracking-[-0.005em]", "text-foreground-muted transition-colors duration-150 hover:text-foreground-strong"],
1479
1971
  arrow: ["border-l border-t border-line-muted bg-layer-popover"],
1480
- backdrop: ["bg-black/20"]
1972
+ backdrop: ["bg-layer-backdrop backdrop-blur-[2px]"]
1481
1973
  }
1482
1974
  } }
1483
1975
  });
@@ -1594,9 +2086,11 @@ function PopoverArrow({ className, ...props }) {
1594
2086
  });
1595
2087
  }
1596
2088
  function PopoverBackdrop({ className, ...props }) {
1597
- const { backdrop } = popover({ theme: useThemeFamily() });
2089
+ const theme = useThemeFamily();
2090
+ const { backdrop } = popover({ theme });
1598
2091
  return /* @__PURE__ */ jsx(Popover$1.Backdrop, {
1599
2092
  "data-slot": "popover-backdrop",
2093
+ "data-theme": theme,
1600
2094
  className: backdrop({ className }),
1601
2095
  ...props
1602
2096
  });
@@ -2751,6 +3245,114 @@ function RadioGroupItem({ appearance = "default", className, children, ...props
2751
3245
  });
2752
3246
  }
2753
3247
  //#endregion
3248
+ //#region src/components/switch/switch.tsx
3249
+ const switchRecipe = tv({
3250
+ slots: {
3251
+ root: [
3252
+ "group/switch relative inline-flex shrink-0 touch-manipulation items-center outline-none",
3253
+ "transition-[background-color,box-shadow,transform] duration-[180ms] ease-out",
3254
+ "motion-reduce:transition-none",
3255
+ "not-data-[disabled]:cursor-pointer",
3256
+ "data-[disabled]:cursor-not-allowed data-[disabled]:active:scale-100",
3257
+ "after:absolute after:-inset-x-3 after:-inset-y-2 after:content-['']"
3258
+ ],
3259
+ thumb: [
3260
+ "pointer-events-none block",
3261
+ "transition-transform duration-[180ms] ease-out",
3262
+ "motion-reduce:transition-none"
3263
+ ]
3264
+ },
3265
+ variants: {
3266
+ theme: {
3267
+ brutal: {
3268
+ root: [
3269
+ "rounded-none border-[2.5px] border-line-strong bg-layer-panel",
3270
+ "hover:bg-layer-panel data-[checked]:bg-primary-400",
3271
+ "data-[checked]:hover:bg-primary-400",
3272
+ "data-[disabled]:border-line-muted data-[disabled]:bg-layer-panel data-[disabled]:opacity-50 data-[disabled]:hover:bg-layer-panel",
3273
+ "data-[checked]:data-[disabled]:border-line-muted data-[checked]:data-[disabled]:bg-primary-400",
3274
+ "focus-visible:ring-2 focus-visible:ring-line-focus focus-visible:ring-offset-2 focus-visible:ring-offset-background",
3275
+ "active:scale-[0.98] motion-reduce:active:scale-100"
3276
+ ],
3277
+ thumb: [
3278
+ "rounded-none bg-line-strong shadow-none",
3279
+ "data-[checked]:bg-line-strong",
3280
+ "data-[disabled]:bg-line-muted",
3281
+ "data-[checked]:data-[disabled]:bg-line-subtle"
3282
+ ]
3283
+ },
3284
+ elegant: {
3285
+ root: [
3286
+ "rounded-full bg-foreground/[0.12]",
3287
+ "shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.05),0_1px_1.5px_-1px_oklch(0_0_0_/_0.08)]",
3288
+ "hover:bg-foreground/[0.16]",
3289
+ "data-[checked]:bg-foreground-strong data-[checked]:shadow-[inset_0_1px_0.5px_oklch(1_0_0_/_0.12),0_1px_1.5px_-1px_oklch(0_0_0_/_0.12)]",
3290
+ "data-[checked]:hover:bg-foreground-strong",
3291
+ "data-[disabled]:bg-layer-panel data-[disabled]:shadow-[inset_0_0_0_1px_var(--line-subtle)]",
3292
+ "data-[checked]:data-[disabled]:bg-layer-panel data-[checked]:data-[disabled]:shadow-[inset_0_0_0_1px_var(--line-subtle)]",
3293
+ "focus-visible:ring-2 focus-visible:ring-line-focus focus-visible:ring-offset-2 focus-visible:ring-offset-background",
3294
+ "active:scale-[0.96] motion-reduce:active:scale-100"
3295
+ ],
3296
+ thumb: [
3297
+ "rounded-full bg-layer-popover",
3298
+ "shadow-[0_1px_1.5px_-0.5px_oklch(0_0_0_/_0.18),0_0_0_1px_oklch(0_0_0_/_0.04)]",
3299
+ "data-[disabled]:bg-[oklch(0.88_0.004_286)] data-[disabled]:shadow-none",
3300
+ "data-[checked]:data-[disabled]:bg-[oklch(0.88_0.004_286)]"
3301
+ ]
3302
+ }
3303
+ },
3304
+ size: {
3305
+ sm: {
3306
+ root: "h-4 w-7 p-0.5",
3307
+ thumb: "size-3 data-[checked]:translate-x-3"
3308
+ },
3309
+ md: {
3310
+ root: "h-5 w-9 p-0.5",
3311
+ thumb: "size-4 data-[checked]:translate-x-4"
3312
+ }
3313
+ }
3314
+ },
3315
+ compoundVariants: [{
3316
+ theme: "brutal",
3317
+ size: "sm",
3318
+ class: {
3319
+ root: "h-5 w-9 p-0",
3320
+ thumb: "size-3.5 translate-x-px data-[checked]:translate-x-4"
3321
+ }
3322
+ }, {
3323
+ theme: "brutal",
3324
+ size: "md",
3325
+ class: {
3326
+ root: "h-6 w-11 p-0",
3327
+ thumb: "size-[18px] translate-x-px data-[checked]:translate-x-5"
3328
+ }
3329
+ }],
3330
+ defaultVariants: { size: "sm" }
3331
+ });
3332
+ function Switch({ size, className, children, ...props }) {
3333
+ const { root } = switchRecipe({
3334
+ theme: useThemeFamily(),
3335
+ size
3336
+ });
3337
+ return /* @__PURE__ */ jsx(Switch$1.Root, {
3338
+ "data-slot": "switch",
3339
+ className: root({ className }),
3340
+ ...props,
3341
+ children: children ?? /* @__PURE__ */ jsx(SwitchThumb, { size })
3342
+ });
3343
+ }
3344
+ function SwitchThumb({ size, className, ...props }) {
3345
+ const { thumb } = switchRecipe({
3346
+ theme: useThemeFamily(),
3347
+ size
3348
+ });
3349
+ return /* @__PURE__ */ jsx(Switch$1.Thumb, {
3350
+ "data-slot": "switch-thumb",
3351
+ className: thumb({ className }),
3352
+ ...props
3353
+ });
3354
+ }
3355
+ //#endregion
2754
3356
  //#region src/components/segmented-control/segmented-control.tsx
2755
3357
  const segmentedControl = tv({
2756
3358
  slots: {
@@ -3494,12 +4096,15 @@ const banner = tv({
3494
4096
  "group/banner grid grid-cols-[0_minmax(0,1fr)] items-start border-2 border-line-strong",
3495
4097
  "has-[>[data-slot=banner-action]]:grid-cols-[0_minmax(0,1fr)_auto]",
3496
4098
  "has-[>svg]:grid-cols-[18px_minmax(0,1fr)]",
4099
+ "has-[>[data-slot=status]]:grid-cols-[auto_minmax(0,1fr)]",
3497
4100
  "[&:has(>svg):has(>[data-slot=banner-action])]:grid-cols-[18px_minmax(0,1fr)_auto]",
4101
+ "[&:has(>[data-slot=status]):has(>[data-slot=banner-action])]:grid-cols-[auto_minmax(0,1fr)_auto]",
3498
4102
  "[&>svg]:col-start-1 [&>svg]:row-span-2 [&>svg]:mt-0.5",
3499
- "[&>svg]:size-[18px] [&>svg]:shrink-0 [&>svg]:text-foreground-strong"
4103
+ "[&>svg]:size-[18px] [&>svg]:shrink-0 [&>svg]:text-foreground-strong",
4104
+ "[&>[data-slot=status]]:col-start-1 [&>[data-slot=status]]:row-start-1 [&>[data-slot=status]]:row-span-2 [&>[data-slot=status]]:self-center"
3500
4105
  ],
3501
4106
  title: ["col-start-2 mb-0.5 text-sm font-bold text-foreground-strong", "group-data-[size=sm]/banner:text-xs"],
3502
- description: ["col-start-2 min-w-0 text-sm text-foreground-strong", "group-data-[size=sm]/banner:text-xs"],
4107
+ description: ["col-start-2 min-w-0 text-sm font-semibold text-foreground-strong", "group-data-[size=sm]/banner:text-xs"],
3503
4108
  action: ["col-start-3 row-span-2 row-start-1 shrink-0"]
3504
4109
  },
3505
4110
  elegant: {
@@ -3508,16 +4113,20 @@ const banner = tv({
3508
4113
  "text-[0.8125rem] leading-5 tracking-[-0.005em] text-foreground-strong",
3509
4114
  "grid-cols-[minmax(0,1fr)]",
3510
4115
  "has-[>svg]:grid-cols-[auto_minmax(0,1fr)]",
4116
+ "has-[>[data-slot=status]]:grid-cols-[auto_minmax(0,1fr)]",
3511
4117
  "has-[>[data-slot=banner-action]]:grid-cols-[minmax(0,1fr)_auto]",
3512
4118
  "has-[>svg]:has-[>[data-slot=banner-action]]:grid-cols-[auto_minmax(0,1fr)_auto]",
4119
+ "has-[>[data-slot=status]]:has-[>[data-slot=banner-action]]:grid-cols-[auto_minmax(0,1fr)_auto]",
3513
4120
  "has-[>[data-slot=banner-title]]:has-[>[data-slot=banner-description]]:items-start",
3514
4121
  "has-[>[data-slot=banner-title]]:has-[>[data-slot=banner-description]]:grid-rows-[auto_auto]",
3515
4122
  "has-[>[data-slot=banner-title]]:has-[>[data-slot=banner-description]]:gap-y-1",
3516
- "[&>svg]:col-start-1 [&>svg]:row-start-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:self-center"
4123
+ "[&>svg]:col-start-1 [&>svg]:row-start-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:self-center",
4124
+ "[&>[data-slot=status]]:col-start-1 [&>[data-slot=status]]:row-start-1 [&>[data-slot=status]]:self-center"
3517
4125
  ],
3518
4126
  title: [
3519
4127
  "col-start-1 row-start-1 flex h-5 min-w-0 items-center text-[0.84375rem] font-medium leading-5 text-foreground-strong",
3520
4128
  "group-has-[>svg]/banner:col-start-2",
4129
+ "group-has-[>[data-slot=status]]/banner:col-start-2",
3521
4130
  "group-data-[size=sm]/banner:h-4 group-data-[size=sm]/banner:text-[0.8125rem] group-data-[size=sm]/banner:leading-4",
3522
4131
  "group-data-[size=lg]/banner:h-6 group-data-[size=lg]/banner:text-[0.90625rem] group-data-[size=lg]/banner:leading-6",
3523
4132
  "group-data-[status=warning]/banner:text-[oklch(0.476_0.114_61.907)]"
@@ -3525,6 +4134,7 @@ const banner = tv({
3525
4134
  description: [
3526
4135
  "col-start-1 row-start-1 min-w-0 font-normal leading-4 text-foreground-muted",
3527
4136
  "group-has-[>svg]/banner:col-start-2",
4137
+ "group-has-[>[data-slot=status]]/banner:col-start-2",
3528
4138
  "group-has-[>[data-slot=banner-title]]/banner:row-start-2",
3529
4139
  "group-data-[size=sm]/banner:text-xs group-data-[size=sm]/banner:leading-4",
3530
4140
  "group-data-[size=lg]/banner:text-[0.875rem] group-data-[size=lg]/banner:leading-5",
@@ -3533,6 +4143,7 @@ const banner = tv({
3533
4143
  action: [
3534
4144
  "col-start-2 row-start-1 flex h-5 shrink-0 items-center gap-2",
3535
4145
  "group-has-[>svg]/banner:col-start-3",
4146
+ "group-has-[>[data-slot=status]]/banner:col-start-3",
3536
4147
  "group-has-[>[data-slot=banner-title]+[data-slot=banner-description]]/banner:row-span-2",
3537
4148
  "[&>button:has(svg):last-child]:size-5 [&>button:has(svg):last-child]:min-h-5 [&>button:has(svg):last-child]:min-w-5",
3538
4149
  "[&>button:has(svg):last-child]:rounded-sm",
@@ -3585,7 +4196,7 @@ const banner = tv({
3585
4196
  {
3586
4197
  theme: "brutal",
3587
4198
  status: "warning",
3588
- class: { root: "bg-warning-base/20" }
4199
+ class: { root: "bg-brutal-yellow/30" }
3589
4200
  },
3590
4201
  {
3591
4202
  theme: "brutal",
@@ -3600,17 +4211,17 @@ const banner = tv({
3600
4211
  {
3601
4212
  theme: "brutal",
3602
4213
  size: "sm",
3603
- class: { root: "gap-y-0 p-2 has-[>svg]:gap-x-2 has-[>[data-slot=banner-action]]:gap-x-2" }
4214
+ class: { root: "gap-y-0 p-2 has-[>svg]:gap-x-2 has-[>[data-slot=banner-action]]:gap-x-2 has-[>[data-slot=status]]:gap-x-1.5" }
3604
4215
  },
3605
4216
  {
3606
4217
  theme: "brutal",
3607
4218
  size: "md",
3608
- class: { root: "gap-y-0 p-3 has-[>svg]:gap-x-3 has-[>[data-slot=banner-action]]:gap-x-3" }
4219
+ class: { root: "gap-y-0 p-3 has-[>svg]:gap-x-3 has-[>[data-slot=banner-action]]:gap-x-3 has-[>[data-slot=status]]:gap-x-2" }
3609
4220
  },
3610
4221
  {
3611
4222
  theme: "brutal",
3612
4223
  size: "lg",
3613
- class: { root: "gap-y-0 p-4 shadow-sm has-[>svg]:gap-x-3 has-[>[data-slot=banner-action]]:gap-x-3" }
4224
+ class: { root: "gap-y-0 p-4 shadow-sm has-[>svg]:gap-x-3 has-[>[data-slot=banner-action]]:gap-x-3 has-[>[data-slot=status]]:gap-x-2" }
3614
4225
  },
3615
4226
  {
3616
4227
  theme: "elegant",
@@ -4591,4 +5202,4 @@ function ThemeProvider({ theme, defaultTheme = "brutal", onThemeChange, mode, de
4591
5202
  });
4592
5203
  }
4593
5204
  //#endregion
4594
- export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Banner, BannerAction, BannerDescription, BannerTitle, Button, Checkbox, Combobox, ComboboxChip, ComboboxChipRemove, ComboboxChips, ComboboxClear, ComboboxCollection, ComboboxContent, ComboboxControl, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxHeader, ComboboxInput, ComboboxInputGroup, ComboboxItem, ComboboxItemIndicator, ComboboxLabel, ComboboxList, ComboboxPopup, ComboboxPortal, ComboboxRow, ComboboxSeparator, ComboboxTrigger, ComboboxTriggerIndicator, ComboboxValue, ContextMenu, ContextMenuCheckboxItem, ContextMenuCheckboxItemIndicator, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRadioItemIndicator, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSubmenu, ContextMenuSubmenuTrigger, ContextMenuTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuCheckboxItemIndicator, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemCount, DropdownMenuLabel, DropdownMenuPopup, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuRadioItemIndicator, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSubmenu, DropdownMenuSubmenuTrigger, DropdownMenuTrigger, EmptyState, EmptyStateActions, EmptyStateContent, EmptyStateDescription, EmptyStateIcon, EmptyStateTitle, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupInput, Kbd, KbdGroup, Label, LabelAsterisk, LabelOptional, LabelSub, NotificationCenter, NotificationCenterActionButton, NotificationCenterCount, NotificationCenterEmptyState, NotificationCenterHeader, NotificationCenterItem, NotificationCenterItemActions, NotificationCenterItemBody, NotificationCenterItemContent, NotificationCenterItemIcon, NotificationCenterItemRow, NotificationCenterItemTitle, NotificationCenterList, NotificationCenterPopup, NotificationCenterScroller, NotificationCenterTitle, NotificationCenterTrigger, Popover, PopoverArrow, PopoverBackdrop, PopoverClose, PopoverContent, PopoverDescription, PopoverHeader, PopoverPopup, PopoverPortal, PopoverSeparator, PopoverTitle, PopoverTrigger, PopoverViewport, RadioGroup, RadioGroupIndicator, RadioGroupItem, SegmentedControl, SegmentedControlCount, SegmentedControlItem, SegmentedControlLabel, Select, SelectArrow, SelectContent, SelectGroup, SelectGroupLabel, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectList, SelectPopup, SelectPortal, SelectScrollDownArrow, SelectScrollUpArrow, SelectSeparator, SelectTrigger, SelectValue, Separator, SortableTabsList, SortableTabsTab, Spinner, Status, Tabs, TabsBackground, TabsIndicator, TabsLabel, TabsList, TabsPanel, TabsTab, Text, TextHeading, TextMono, TextSans, Textarea, TextareaCounter, TextareaGroup, ThemeProvider, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, buttonVariants, cn, useOrderedTabs, useTheme, useThemeFamily };
5205
+ export { AlertDialog, AlertDialogAction, AlertDialogBody, AlertDialogCancel, AlertDialogClose, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, Banner, BannerAction, BannerDescription, BannerTitle, Button, Checkbox, Combobox, ComboboxChip, ComboboxChipRemove, ComboboxChips, ComboboxClear, ComboboxCollection, ComboboxContent, ComboboxControl, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxHeader, ComboboxInput, ComboboxInputGroup, ComboboxItem, ComboboxItemIndicator, ComboboxLabel, ComboboxList, ComboboxPopup, ComboboxPortal, ComboboxRow, ComboboxSeparator, ComboboxTrigger, ComboboxTriggerIndicator, ComboboxValue, ContextMenu, ContextMenuCheckboxItem, ContextMenuCheckboxItemIndicator, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRadioItemIndicator, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSubmenu, ContextMenuSubmenuTrigger, ContextMenuTrigger, CopyableCode, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuCheckboxItemIndicator, DropdownMenuContent, DropdownMenuItem, DropdownMenuItemCount, DropdownMenuLabel, DropdownMenuPopup, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuRadioItemIndicator, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSubmenu, DropdownMenuSubmenuTrigger, DropdownMenuTrigger, EmptyState, EmptyStateActions, EmptyStateContent, EmptyStateDescription, EmptyStateIcon, EmptyStateTitle, Field, FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldValidity, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupInput, Kbd, KbdGroup, Label, LabelAsterisk, LabelOptional, LabelSub, NotificationCenter, NotificationCenterActionButton, NotificationCenterCount, NotificationCenterEmptyState, NotificationCenterHeader, NotificationCenterItem, NotificationCenterItemActions, NotificationCenterItemBody, NotificationCenterItemContent, NotificationCenterItemIcon, NotificationCenterItemRow, NotificationCenterItemTitle, NotificationCenterList, NotificationCenterPopup, NotificationCenterScroller, NotificationCenterTitle, NotificationCenterTrigger, Popover, PopoverArrow, PopoverBackdrop, PopoverClose, PopoverContent, PopoverDescription, PopoverHeader, PopoverPopup, PopoverPortal, PopoverSeparator, PopoverTitle, PopoverTrigger, PopoverViewport, RadioGroup, RadioGroupIndicator, RadioGroupItem, SegmentedControl, SegmentedControlCount, SegmentedControlItem, SegmentedControlLabel, Select, SelectArrow, SelectContent, SelectGroup, SelectGroupLabel, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectList, SelectPopup, SelectPortal, SelectScrollDownArrow, SelectScrollUpArrow, SelectSeparator, SelectTrigger, SelectValue, Separator, SortableTabsList, SortableTabsTab, Spinner, Status, Switch, SwitchThumb, Tabs, TabsBackground, TabsIndicator, TabsLabel, TabsList, TabsPanel, TabsTab, Text, TextHeading, TextMono, TextSans, Textarea, TextareaCounter, TextareaGroup, ThemeProvider, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, buttonVariants, cn, useOrderedTabs, useTheme, useThemeFamily };