@hachej/boring-ui-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2503 @@
1
+ // src/lib.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ // src/button.tsx
9
+ import * as React from "react";
10
+ import { Slot } from "@radix-ui/react-slot";
11
+ import { cva } from "class-variance-authority";
12
+ import { jsx } from "react/jsx-runtime";
13
+ var buttonVariants = cva(
14
+ "inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
15
+ {
16
+ variants: {
17
+ variant: {
18
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
19
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
20
+ outline: "border border-input bg-background shadow-xs hover:bg-muted/60 hover:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
21
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
22
+ ghost: "hover:bg-muted/60 hover:text-foreground dark:hover:bg-muted/40",
23
+ link: "text-primary underline-offset-4 hover:underline"
24
+ },
25
+ size: {
26
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
27
+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
28
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
29
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
30
+ icon: "size-9",
31
+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
32
+ "icon-sm": "size-8",
33
+ "icon-lg": "size-10"
34
+ }
35
+ },
36
+ defaultVariants: {
37
+ variant: "default",
38
+ size: "default"
39
+ }
40
+ }
41
+ );
42
+ var Button = React.forwardRef(
43
+ ({ className, variant = "default", size = "default", asChild = false, ...props }, ref) => {
44
+ const Comp = asChild ? Slot : "button";
45
+ return /* @__PURE__ */ jsx(
46
+ Comp,
47
+ {
48
+ "data-slot": "button",
49
+ "data-variant": variant,
50
+ "data-size": size,
51
+ className: cn(buttonVariants({ variant, size, className })),
52
+ ref,
53
+ ...props
54
+ }
55
+ );
56
+ }
57
+ );
58
+ Button.displayName = "Button";
59
+
60
+ // src/badge.tsx
61
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
62
+ import { cva as cva2 } from "class-variance-authority";
63
+ import { jsx as jsx2 } from "react/jsx-runtime";
64
+ var badgeVariants = cva2(
65
+ "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
66
+ {
67
+ variants: {
68
+ variant: {
69
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
70
+ secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
71
+ destructive: "bg-destructive text-destructive-foreground focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
72
+ outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
73
+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
74
+ link: "text-primary underline-offset-4 [a&]:hover:underline"
75
+ }
76
+ },
77
+ defaultVariants: {
78
+ variant: "default"
79
+ }
80
+ }
81
+ );
82
+ function Badge({ className, variant = "default", asChild = false, ...props }) {
83
+ const Comp = asChild ? Slot2 : "span";
84
+ return /* @__PURE__ */ jsx2(
85
+ Comp,
86
+ {
87
+ "data-slot": "badge",
88
+ "data-variant": variant,
89
+ className: cn(badgeVariants({ variant }), className),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+
95
+ // src/input.tsx
96
+ import * as React2 from "react";
97
+ import { jsx as jsx3 } from "react/jsx-runtime";
98
+ var Input = React2.forwardRef(
99
+ ({ className, type, ...props }, ref) => /* @__PURE__ */ jsx3(
100
+ "input",
101
+ {
102
+ type,
103
+ "data-slot": "input",
104
+ className: cn(
105
+ "h-9 w-full min-w-0 rounded-md border border-input bg-background px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30",
106
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
107
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
108
+ className
109
+ ),
110
+ ref,
111
+ ...props
112
+ }
113
+ )
114
+ );
115
+ Input.displayName = "Input";
116
+
117
+ // src/textarea.tsx
118
+ import * as React3 from "react";
119
+ import { jsx as jsx4 } from "react/jsx-runtime";
120
+ var Textarea = React3.forwardRef(
121
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx4(
122
+ "textarea",
123
+ {
124
+ "data-slot": "textarea",
125
+ className: cn(
126
+ "min-h-20 w-full rounded-md border border-input bg-background px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30",
127
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
128
+ "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
129
+ className
130
+ ),
131
+ ref,
132
+ ...props
133
+ }
134
+ )
135
+ );
136
+ Textarea.displayName = "Textarea";
137
+
138
+ // src/separator.tsx
139
+ import * as React4 from "react";
140
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
141
+ import { jsx as jsx5 } from "react/jsx-runtime";
142
+ var Separator = React4.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx5(
143
+ SeparatorPrimitive.Root,
144
+ {
145
+ ref,
146
+ "data-slot": "separator",
147
+ decorative,
148
+ orientation,
149
+ className: cn(
150
+ "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
151
+ className
152
+ ),
153
+ ...props
154
+ }
155
+ ));
156
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
157
+
158
+ // src/tooltip.tsx
159
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
160
+ import { jsx as jsx6, jsxs } from "react/jsx-runtime";
161
+ function TooltipProvider({
162
+ delayDuration = 0,
163
+ ...props
164
+ }) {
165
+ return /* @__PURE__ */ jsx6(
166
+ TooltipPrimitive.Provider,
167
+ {
168
+ "data-slot": "tooltip-provider",
169
+ delayDuration,
170
+ ...props
171
+ }
172
+ );
173
+ }
174
+ function Tooltip({ ...props }) {
175
+ return /* @__PURE__ */ jsx6(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
176
+ }
177
+ function TooltipTrigger({
178
+ ...props
179
+ }) {
180
+ return /* @__PURE__ */ jsx6(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
181
+ }
182
+ function TooltipContent({
183
+ className,
184
+ sideOffset = 0,
185
+ children,
186
+ ...props
187
+ }) {
188
+ return /* @__PURE__ */ jsx6(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
189
+ TooltipPrimitive.Content,
190
+ {
191
+ "data-slot": "tooltip-content",
192
+ sideOffset,
193
+ className: cn(
194
+ "z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
195
+ className
196
+ ),
197
+ ...props,
198
+ children: [
199
+ children,
200
+ /* @__PURE__ */ jsx6(TooltipPrimitive.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
201
+ ]
202
+ }
203
+ ) });
204
+ }
205
+
206
+ // src/dialog.tsx
207
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
208
+ import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
209
+ function Dialog({ ...props }) {
210
+ return /* @__PURE__ */ jsx7(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
211
+ }
212
+ function DialogTrigger({
213
+ ...props
214
+ }) {
215
+ return /* @__PURE__ */ jsx7(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
216
+ }
217
+ function DialogPortal({
218
+ ...props
219
+ }) {
220
+ return /* @__PURE__ */ jsx7(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
221
+ }
222
+ function DialogClose({ ...props }) {
223
+ return /* @__PURE__ */ jsx7(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
224
+ }
225
+ function DialogOverlay({
226
+ className,
227
+ ...props
228
+ }) {
229
+ return /* @__PURE__ */ jsx7(
230
+ DialogPrimitive.Overlay,
231
+ {
232
+ "data-slot": "dialog-overlay",
233
+ className: cn(
234
+ "fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
235
+ className
236
+ ),
237
+ ...props
238
+ }
239
+ );
240
+ }
241
+ function DialogContent({
242
+ className,
243
+ children,
244
+ showCloseButton = true,
245
+ ...props
246
+ }) {
247
+ return /* @__PURE__ */ jsxs2(DialogPortal, { "data-slot": "dialog-portal", children: [
248
+ /* @__PURE__ */ jsx7(DialogOverlay, {}),
249
+ /* @__PURE__ */ jsxs2(
250
+ DialogPrimitive.Content,
251
+ {
252
+ "data-slot": "dialog-content",
253
+ className: cn(
254
+ "fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",
255
+ className
256
+ ),
257
+ ...props,
258
+ children: [
259
+ children,
260
+ showCloseButton && /* @__PURE__ */ jsxs2(
261
+ DialogPrimitive.Close,
262
+ {
263
+ "data-slot": "dialog-close",
264
+ className: "absolute top-4 right-4 inline-flex size-6 items-center justify-center rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
265
+ children: [
266
+ /* @__PURE__ */ jsx7("span", { "aria-hidden": "true", className: "text-base leading-none", children: "\xD7" }),
267
+ /* @__PURE__ */ jsx7("span", { className: "sr-only", children: "Close" })
268
+ ]
269
+ }
270
+ )
271
+ ]
272
+ }
273
+ )
274
+ ] });
275
+ }
276
+ function DialogHeader({ className, ...props }) {
277
+ return /* @__PURE__ */ jsx7(
278
+ "div",
279
+ {
280
+ "data-slot": "dialog-header",
281
+ className: cn("flex flex-col gap-2 text-center sm:text-left", className),
282
+ ...props
283
+ }
284
+ );
285
+ }
286
+ function DialogFooter({
287
+ className,
288
+ showCloseButton = false,
289
+ children,
290
+ ...props
291
+ }) {
292
+ return /* @__PURE__ */ jsxs2(
293
+ "div",
294
+ {
295
+ "data-slot": "dialog-footer",
296
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
297
+ ...props,
298
+ children: [
299
+ children,
300
+ showCloseButton && /* @__PURE__ */ jsx7(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx7(Button, { variant: "outline", children: "Close" }) })
301
+ ]
302
+ }
303
+ );
304
+ }
305
+ function DialogTitle({
306
+ className,
307
+ ...props
308
+ }) {
309
+ return /* @__PURE__ */ jsx7(
310
+ DialogPrimitive.Title,
311
+ {
312
+ "data-slot": "dialog-title",
313
+ className: cn("text-lg leading-none font-semibold", className),
314
+ ...props
315
+ }
316
+ );
317
+ }
318
+ function DialogDescription({
319
+ className,
320
+ ...props
321
+ }) {
322
+ return /* @__PURE__ */ jsx7(
323
+ DialogPrimitive.Description,
324
+ {
325
+ "data-slot": "dialog-description",
326
+ className: cn("text-sm text-muted-foreground", className),
327
+ ...props
328
+ }
329
+ );
330
+ }
331
+
332
+ // src/dropdown-menu.tsx
333
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
334
+ import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
335
+ function DropdownMenu({ ...props }) {
336
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
337
+ }
338
+ function DropdownMenuPortal({
339
+ ...props
340
+ }) {
341
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
342
+ }
343
+ function DropdownMenuTrigger({
344
+ ...props
345
+ }) {
346
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props });
347
+ }
348
+ function DropdownMenuContent({
349
+ className,
350
+ sideOffset = 4,
351
+ ...props
352
+ }) {
353
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx8(
354
+ DropdownMenuPrimitive.Content,
355
+ {
356
+ "data-slot": "dropdown-menu-content",
357
+ sideOffset,
358
+ className: cn(
359
+ "z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
360
+ className
361
+ ),
362
+ ...props
363
+ }
364
+ ) });
365
+ }
366
+ function DropdownMenuGroup({
367
+ ...props
368
+ }) {
369
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
370
+ }
371
+ function DropdownMenuItem({
372
+ className,
373
+ inset,
374
+ variant = "default",
375
+ ...props
376
+ }) {
377
+ return /* @__PURE__ */ jsx8(
378
+ DropdownMenuPrimitive.Item,
379
+ {
380
+ "data-slot": "dropdown-menu-item",
381
+ "data-inset": inset,
382
+ "data-variant": variant,
383
+ className: cn(
384
+ "relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!",
385
+ className
386
+ ),
387
+ ...props
388
+ }
389
+ );
390
+ }
391
+ function DropdownMenuCheckboxItem({
392
+ className,
393
+ children,
394
+ checked,
395
+ ...props
396
+ }) {
397
+ return /* @__PURE__ */ jsxs3(
398
+ DropdownMenuPrimitive.CheckboxItem,
399
+ {
400
+ "data-slot": "dropdown-menu-checkbox-item",
401
+ className: cn(
402
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
403
+ className
404
+ ),
405
+ checked,
406
+ ...props,
407
+ children: [
408
+ /* @__PURE__ */ jsx8("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx8(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2713" }) }) }),
409
+ children
410
+ ]
411
+ }
412
+ );
413
+ }
414
+ function DropdownMenuRadioGroup({
415
+ ...props
416
+ }) {
417
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.RadioGroup, { "data-slot": "dropdown-menu-radio-group", ...props });
418
+ }
419
+ function DropdownMenuRadioItem({
420
+ className,
421
+ children,
422
+ ...props
423
+ }) {
424
+ return /* @__PURE__ */ jsxs3(
425
+ DropdownMenuPrimitive.RadioItem,
426
+ {
427
+ "data-slot": "dropdown-menu-radio-item",
428
+ className: cn(
429
+ "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
430
+ className
431
+ ),
432
+ ...props,
433
+ children: [
434
+ /* @__PURE__ */ jsx8("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx8(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", className: "size-2 rounded-full bg-current" }) }) }),
435
+ children
436
+ ]
437
+ }
438
+ );
439
+ }
440
+ function DropdownMenuLabel({
441
+ className,
442
+ inset,
443
+ ...props
444
+ }) {
445
+ return /* @__PURE__ */ jsx8(
446
+ DropdownMenuPrimitive.Label,
447
+ {
448
+ "data-slot": "dropdown-menu-label",
449
+ "data-inset": inset,
450
+ className: cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className),
451
+ ...props
452
+ }
453
+ );
454
+ }
455
+ function DropdownMenuSeparator({
456
+ className,
457
+ ...props
458
+ }) {
459
+ return /* @__PURE__ */ jsx8(
460
+ DropdownMenuPrimitive.Separator,
461
+ {
462
+ "data-slot": "dropdown-menu-separator",
463
+ className: cn("-mx-1 my-1 h-px bg-border", className),
464
+ ...props
465
+ }
466
+ );
467
+ }
468
+ function DropdownMenuShortcut({ className, ...props }) {
469
+ return /* @__PURE__ */ jsx8(
470
+ "span",
471
+ {
472
+ "data-slot": "dropdown-menu-shortcut",
473
+ className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className),
474
+ ...props
475
+ }
476
+ );
477
+ }
478
+ function DropdownMenuSub({ ...props }) {
479
+ return /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
480
+ }
481
+ function DropdownMenuSubTrigger({
482
+ className,
483
+ inset,
484
+ children,
485
+ ...props
486
+ }) {
487
+ return /* @__PURE__ */ jsxs3(
488
+ DropdownMenuPrimitive.SubTrigger,
489
+ {
490
+ "data-slot": "dropdown-menu-sub-trigger",
491
+ "data-inset": inset,
492
+ className: cn(
493
+ "flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
494
+ className
495
+ ),
496
+ ...props,
497
+ children: [
498
+ children,
499
+ /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", className: "ml-auto text-sm leading-none", children: "\u203A" })
500
+ ]
501
+ }
502
+ );
503
+ }
504
+ function DropdownMenuSubContent({
505
+ className,
506
+ ...props
507
+ }) {
508
+ return /* @__PURE__ */ jsx8(
509
+ DropdownMenuPrimitive.SubContent,
510
+ {
511
+ "data-slot": "dropdown-menu-sub-content",
512
+ className: cn(
513
+ "z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
514
+ className
515
+ ),
516
+ ...props
517
+ }
518
+ );
519
+ }
520
+
521
+ // src/select.tsx
522
+ import * as SelectPrimitive from "@radix-ui/react-select";
523
+ import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
524
+ function Select({
525
+ ...props
526
+ }) {
527
+ return /* @__PURE__ */ jsx9(SelectPrimitive.Root, { "data-slot": "select", ...props });
528
+ }
529
+ function SelectGroup({
530
+ ...props
531
+ }) {
532
+ return /* @__PURE__ */ jsx9(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
533
+ }
534
+ function SelectValue({
535
+ ...props
536
+ }) {
537
+ return /* @__PURE__ */ jsx9(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
538
+ }
539
+ function SelectTrigger({
540
+ className,
541
+ size = "default",
542
+ children,
543
+ ...props
544
+ }) {
545
+ return /* @__PURE__ */ jsxs4(
546
+ SelectPrimitive.Trigger,
547
+ {
548
+ "data-slot": "select-trigger",
549
+ "data-size": size,
550
+ className: cn(
551
+ "flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
552
+ className
553
+ ),
554
+ ...props,
555
+ children: [
556
+ children,
557
+ /* @__PURE__ */ jsx9(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "text-xs opacity-50", children: "\u2304" }) })
558
+ ]
559
+ }
560
+ );
561
+ }
562
+ function SelectContent({
563
+ className,
564
+ children,
565
+ position = "item-aligned",
566
+ align = "center",
567
+ ...props
568
+ }) {
569
+ return /* @__PURE__ */ jsx9(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs4(
570
+ SelectPrimitive.Content,
571
+ {
572
+ "data-slot": "select-content",
573
+ className: cn(
574
+ "relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
575
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
576
+ className
577
+ ),
578
+ position,
579
+ align,
580
+ ...props,
581
+ children: [
582
+ /* @__PURE__ */ jsx9(SelectScrollUpButton, {}),
583
+ /* @__PURE__ */ jsx9(
584
+ SelectPrimitive.Viewport,
585
+ {
586
+ className: cn(
587
+ "p-1",
588
+ position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
589
+ ),
590
+ children
591
+ }
592
+ ),
593
+ /* @__PURE__ */ jsx9(SelectScrollDownButton, {})
594
+ ]
595
+ }
596
+ ) });
597
+ }
598
+ function SelectLabel({
599
+ className,
600
+ ...props
601
+ }) {
602
+ return /* @__PURE__ */ jsx9(
603
+ SelectPrimitive.Label,
604
+ {
605
+ "data-slot": "select-label",
606
+ className: cn("px-2 py-1.5 text-xs text-muted-foreground", className),
607
+ ...props
608
+ }
609
+ );
610
+ }
611
+ function SelectItem({
612
+ className,
613
+ children,
614
+ ...props
615
+ }) {
616
+ return /* @__PURE__ */ jsxs4(
617
+ SelectPrimitive.Item,
618
+ {
619
+ "data-slot": "select-item",
620
+ className: cn(
621
+ "relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
622
+ className
623
+ ),
624
+ ...props,
625
+ children: [
626
+ /* @__PURE__ */ jsx9(
627
+ "span",
628
+ {
629
+ "data-slot": "select-item-indicator",
630
+ className: "absolute right-2 flex size-3.5 items-center justify-center",
631
+ children: /* @__PURE__ */ jsx9(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2713" }) })
632
+ }
633
+ ),
634
+ /* @__PURE__ */ jsx9(SelectPrimitive.ItemText, { children })
635
+ ]
636
+ }
637
+ );
638
+ }
639
+ function SelectSeparator({
640
+ className,
641
+ ...props
642
+ }) {
643
+ return /* @__PURE__ */ jsx9(
644
+ SelectPrimitive.Separator,
645
+ {
646
+ "data-slot": "select-separator",
647
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className),
648
+ ...props
649
+ }
650
+ );
651
+ }
652
+ function SelectScrollUpButton({
653
+ className,
654
+ ...props
655
+ }) {
656
+ return /* @__PURE__ */ jsx9(
657
+ SelectPrimitive.ScrollUpButton,
658
+ {
659
+ "data-slot": "select-scroll-up-button",
660
+ className: cn(
661
+ "flex cursor-default items-center justify-center py-1",
662
+ className
663
+ ),
664
+ ...props,
665
+ children: /* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2303" })
666
+ }
667
+ );
668
+ }
669
+ function SelectScrollDownButton({
670
+ className,
671
+ ...props
672
+ }) {
673
+ return /* @__PURE__ */ jsx9(
674
+ SelectPrimitive.ScrollDownButton,
675
+ {
676
+ "data-slot": "select-scroll-down-button",
677
+ className: cn(
678
+ "flex cursor-default items-center justify-center py-1",
679
+ className
680
+ ),
681
+ ...props,
682
+ children: /* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2304" })
683
+ }
684
+ );
685
+ }
686
+
687
+ // src/command.tsx
688
+ import { Command as CommandPrimitive } from "cmdk";
689
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
690
+ function Command({
691
+ className,
692
+ ...props
693
+ }) {
694
+ return /* @__PURE__ */ jsx10(
695
+ CommandPrimitive,
696
+ {
697
+ "data-slot": "command",
698
+ className: cn(
699
+ "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
700
+ className
701
+ ),
702
+ ...props
703
+ }
704
+ );
705
+ }
706
+ function CommandDialog({
707
+ title = "Command Palette",
708
+ description = "Search for a command to run...",
709
+ children,
710
+ className,
711
+ showCloseButton = true,
712
+ ...props
713
+ }) {
714
+ return /* @__PURE__ */ jsx10(Dialog, { ...props, children: /* @__PURE__ */ jsxs5(
715
+ DialogContent,
716
+ {
717
+ className: cn("overflow-hidden p-0", className),
718
+ showCloseButton,
719
+ children: [
720
+ /* @__PURE__ */ jsxs5(DialogHeader, { className: "sr-only", children: [
721
+ /* @__PURE__ */ jsx10(DialogTitle, { children: title }),
722
+ /* @__PURE__ */ jsx10(DialogDescription, { children: description })
723
+ ] }),
724
+ /* @__PURE__ */ jsx10(Command, { className: "**:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children })
725
+ ]
726
+ }
727
+ ) });
728
+ }
729
+ function CommandInput({
730
+ className,
731
+ ...props
732
+ }) {
733
+ return /* @__PURE__ */ jsxs5(
734
+ "div",
735
+ {
736
+ "data-slot": "command-input-wrapper",
737
+ className: "flex h-9 items-center gap-2 border-b px-3",
738
+ children: [
739
+ /* @__PURE__ */ jsx10("span", { "aria-hidden": "true", className: "shrink-0 text-sm opacity-50", children: "\u2315" }),
740
+ /* @__PURE__ */ jsx10(
741
+ CommandPrimitive.Input,
742
+ {
743
+ "data-slot": "command-input",
744
+ className: cn(
745
+ "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
746
+ className
747
+ ),
748
+ ...props
749
+ }
750
+ )
751
+ ]
752
+ }
753
+ );
754
+ }
755
+ function CommandList({
756
+ className,
757
+ ...props
758
+ }) {
759
+ return /* @__PURE__ */ jsx10(
760
+ CommandPrimitive.List,
761
+ {
762
+ "data-slot": "command-list",
763
+ className: cn(
764
+ "max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",
765
+ className
766
+ ),
767
+ ...props
768
+ }
769
+ );
770
+ }
771
+ function CommandEmpty({
772
+ ...props
773
+ }) {
774
+ return /* @__PURE__ */ jsx10(
775
+ CommandPrimitive.Empty,
776
+ {
777
+ "data-slot": "command-empty",
778
+ className: "py-6 text-center text-sm",
779
+ ...props
780
+ }
781
+ );
782
+ }
783
+ function CommandGroup({
784
+ className,
785
+ ...props
786
+ }) {
787
+ return /* @__PURE__ */ jsx10(
788
+ CommandPrimitive.Group,
789
+ {
790
+ "data-slot": "command-group",
791
+ className: cn(
792
+ "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
793
+ className
794
+ ),
795
+ ...props
796
+ }
797
+ );
798
+ }
799
+ function CommandSeparator({
800
+ className,
801
+ ...props
802
+ }) {
803
+ return /* @__PURE__ */ jsx10(
804
+ CommandPrimitive.Separator,
805
+ {
806
+ "data-slot": "command-separator",
807
+ className: cn("-mx-1 h-px bg-border", className),
808
+ ...props
809
+ }
810
+ );
811
+ }
812
+ function CommandItem({
813
+ className,
814
+ ...props
815
+ }) {
816
+ return /* @__PURE__ */ jsx10(
817
+ CommandPrimitive.Item,
818
+ {
819
+ "data-slot": "command-item",
820
+ className: cn(
821
+ "relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
822
+ className
823
+ ),
824
+ ...props
825
+ }
826
+ );
827
+ }
828
+ function CommandShortcut({
829
+ className,
830
+ ...props
831
+ }) {
832
+ return /* @__PURE__ */ jsx10(
833
+ "span",
834
+ {
835
+ "data-slot": "command-shortcut",
836
+ className: cn(
837
+ "ml-auto text-xs tracking-widest text-muted-foreground",
838
+ className
839
+ ),
840
+ ...props
841
+ }
842
+ );
843
+ }
844
+
845
+ // src/tabs.tsx
846
+ import { cva as cva3 } from "class-variance-authority";
847
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
848
+ import { jsx as jsx11 } from "react/jsx-runtime";
849
+ function Tabs({
850
+ className,
851
+ orientation = "horizontal",
852
+ ...props
853
+ }) {
854
+ return /* @__PURE__ */ jsx11(
855
+ TabsPrimitive.Root,
856
+ {
857
+ "data-slot": "tabs",
858
+ "data-orientation": orientation,
859
+ orientation,
860
+ className: cn(
861
+ "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",
862
+ className
863
+ ),
864
+ ...props
865
+ }
866
+ );
867
+ }
868
+ var tabsListVariants = cva3(
869
+ "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none",
870
+ {
871
+ variants: {
872
+ variant: {
873
+ default: "bg-muted",
874
+ line: "gap-1 bg-transparent"
875
+ }
876
+ },
877
+ defaultVariants: {
878
+ variant: "default"
879
+ }
880
+ }
881
+ );
882
+ function TabsList({
883
+ className,
884
+ variant = "default",
885
+ ...props
886
+ }) {
887
+ return /* @__PURE__ */ jsx11(
888
+ TabsPrimitive.List,
889
+ {
890
+ "data-slot": "tabs-list",
891
+ "data-variant": variant,
892
+ className: cn(tabsListVariants({ variant }), className),
893
+ ...props
894
+ }
895
+ );
896
+ }
897
+ function TabsTrigger({
898
+ className,
899
+ ...props
900
+ }) {
901
+ return /* @__PURE__ */ jsx11(
902
+ TabsPrimitive.Trigger,
903
+ {
904
+ "data-slot": "tabs-trigger",
905
+ className: cn(
906
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
907
+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent",
908
+ "data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground",
909
+ "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
910
+ className
911
+ ),
912
+ ...props
913
+ }
914
+ );
915
+ }
916
+ function TabsContent({
917
+ className,
918
+ ...props
919
+ }) {
920
+ return /* @__PURE__ */ jsx11(
921
+ TabsPrimitive.Content,
922
+ {
923
+ "data-slot": "tabs-content",
924
+ className: cn("flex-1 outline-none", className),
925
+ ...props
926
+ }
927
+ );
928
+ }
929
+
930
+ // src/icon-button.tsx
931
+ import * as React5 from "react";
932
+ import { jsx as jsx12 } from "react/jsx-runtime";
933
+ var IconButton = React5.forwardRef(
934
+ ({ size = "icon-sm", ...props }, ref) => /* @__PURE__ */ jsx12(Button, { ref, size, ...props })
935
+ );
936
+ IconButton.displayName = "IconButton";
937
+
938
+ // src/kbd.tsx
939
+ import { jsx as jsx13 } from "react/jsx-runtime";
940
+ function Kbd({ className, ...props }) {
941
+ return /* @__PURE__ */ jsx13(
942
+ "kbd",
943
+ {
944
+ "data-slot": "kbd",
945
+ className: cn(
946
+ "inline-flex h-5 min-w-5 items-center justify-center rounded border bg-muted px-1 font-mono text-[10px] font-medium text-muted-foreground shadow-xs",
947
+ className
948
+ ),
949
+ ...props
950
+ }
951
+ );
952
+ }
953
+
954
+ // src/spinner.tsx
955
+ import { jsx as jsx14 } from "react/jsx-runtime";
956
+ function Spinner({ className, ...props }) {
957
+ return /* @__PURE__ */ jsx14(
958
+ "span",
959
+ {
960
+ "data-slot": "spinner",
961
+ "aria-hidden": "true",
962
+ className: cn("inline-block size-4 animate-spin rounded-full border-2 border-current border-t-transparent", className),
963
+ ...props
964
+ }
965
+ );
966
+ }
967
+
968
+ // src/empty-state.tsx
969
+ import { jsx as jsx15, jsxs as jsxs6 } from "react/jsx-runtime";
970
+ function EmptyState({ className, title, description, icon, actions, children, ...props }) {
971
+ return /* @__PURE__ */ jsxs6("div", { "data-slot": "empty-state", className: cn("flex min-h-40 flex-col items-center justify-center gap-3 rounded-lg border border-dashed p-8 text-center", className), ...props, children: [
972
+ icon && /* @__PURE__ */ jsx15("div", { "data-slot": "empty-state-icon", className: "text-muted-foreground", children: icon }),
973
+ (title || description) && /* @__PURE__ */ jsxs6("div", { className: "space-y-1", children: [
974
+ title && /* @__PURE__ */ jsx15("h3", { "data-slot": "empty-state-title", className: "text-sm font-medium text-foreground", children: title }),
975
+ description && /* @__PURE__ */ jsx15("p", { "data-slot": "empty-state-description", className: "text-sm text-muted-foreground", children: description })
976
+ ] }),
977
+ children,
978
+ actions && /* @__PURE__ */ jsx15("div", { "data-slot": "empty-state-actions", className: "flex items-center justify-center gap-2", children: actions })
979
+ ] });
980
+ }
981
+
982
+ // src/error-state.tsx
983
+ import { jsx as jsx16, jsxs as jsxs7 } from "react/jsx-runtime";
984
+ function ErrorState({ className, title = "Something went wrong", description, details, actions, children, ...props }) {
985
+ return /* @__PURE__ */ jsx16("div", { "data-slot": "error-state", className: cn("rounded-lg border border-destructive/30 bg-destructive/5 p-4 text-destructive-foreground", className), ...props, children: /* @__PURE__ */ jsxs7("div", { className: "space-y-2", children: [
986
+ title && /* @__PURE__ */ jsx16("h2", { "data-slot": "error-state-title", className: "text-base font-semibold text-destructive", children: title }),
987
+ description && /* @__PURE__ */ jsx16("p", { "data-slot": "error-state-description", className: "text-sm text-foreground", children: description }),
988
+ children,
989
+ details && /* @__PURE__ */ jsx16("pre", { "data-slot": "error-state-details", className: "max-h-48 overflow-auto rounded-md bg-background p-3 text-xs text-muted-foreground", children: details }),
990
+ actions && /* @__PURE__ */ jsx16("div", { "data-slot": "error-state-actions", className: "flex flex-wrap gap-2 pt-2", children: actions })
991
+ ] }) });
992
+ }
993
+
994
+ // src/pane.tsx
995
+ import { jsx as jsx17 } from "react/jsx-runtime";
996
+ function Pane({ className, ...props }) {
997
+ return /* @__PURE__ */ jsx17("section", { "data-slot": "pane", className: cn("flex min-h-0 flex-col rounded-lg border bg-card text-card-foreground", className), ...props });
998
+ }
999
+ function PaneHeader({ className, ...props }) {
1000
+ return /* @__PURE__ */ jsx17("header", { "data-slot": "pane-header", className: cn("flex min-h-11 items-center justify-between gap-3 border-b px-3", className), ...props });
1001
+ }
1002
+ function PaneTitle({ className, ...props }) {
1003
+ return /* @__PURE__ */ jsx17("h2", { "data-slot": "pane-title", className: cn("truncate text-sm font-semibold", className), ...props });
1004
+ }
1005
+ function PaneDescription({ className, ...props }) {
1006
+ return /* @__PURE__ */ jsx17("p", { "data-slot": "pane-description", className: cn("text-xs text-muted-foreground", className), ...props });
1007
+ }
1008
+ function PaneBody({ className, ...props }) {
1009
+ return /* @__PURE__ */ jsx17("div", { "data-slot": "pane-body", className: cn("min-h-0 flex-1 overflow-auto p-3", className), ...props });
1010
+ }
1011
+ function PaneFooter({ className, ...props }) {
1012
+ return /* @__PURE__ */ jsx17("footer", { "data-slot": "pane-footer", className: cn("flex items-center justify-end gap-2 border-t px-3 py-2", className), ...props });
1013
+ }
1014
+ function PaneToolbar({ className, ...props }) {
1015
+ return /* @__PURE__ */ jsx17("div", { "data-slot": "pane-toolbar", className: cn("flex items-center gap-1", className), ...props });
1016
+ }
1017
+
1018
+ // src/field.tsx
1019
+ import { jsx as jsx18 } from "react/jsx-runtime";
1020
+ function Field({ className, ...props }) {
1021
+ return /* @__PURE__ */ jsx18("div", { "data-slot": "field", className: cn("grid gap-2", className), ...props });
1022
+ }
1023
+ function FieldLabel({ className, ...props }) {
1024
+ return /* @__PURE__ */ jsx18("label", { "data-slot": "field-label", className: cn("text-sm font-medium leading-none", className), ...props });
1025
+ }
1026
+ function FieldDescription({ className, ...props }) {
1027
+ return /* @__PURE__ */ jsx18("p", { "data-slot": "field-description", className: cn("text-sm text-muted-foreground", className), ...props });
1028
+ }
1029
+ function FieldError({ className, ...props }) {
1030
+ return /* @__PURE__ */ jsx18("p", { "data-slot": "field-error", className: cn("text-sm text-destructive", className), ...props });
1031
+ }
1032
+
1033
+ // src/status-badge.tsx
1034
+ import { jsx as jsx19 } from "react/jsx-runtime";
1035
+ var toneClasses = {
1036
+ neutral: "bg-muted text-muted-foreground",
1037
+ success: "bg-[color:var(--boring-success-soft,var(--secondary))] text-[color:var(--boring-success,var(--secondary-foreground))]",
1038
+ warning: "bg-[color:var(--boring-warning-soft,var(--accent))] text-[color:var(--boring-warning,var(--accent-foreground))]",
1039
+ danger: "bg-destructive/10 text-destructive",
1040
+ info: "bg-accent text-accent-foreground"
1041
+ };
1042
+ function StatusBadge({ className, tone = "neutral", variant = "ghost", ...props }) {
1043
+ return /* @__PURE__ */ jsx19(Badge, { "data-slot": "status-badge", variant, className: cn(toneClasses[tone], className), ...props });
1044
+ }
1045
+
1046
+ // src/notice.tsx
1047
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
1048
+ var noticeToneClasses = {
1049
+ info: "border-border bg-muted/20 text-foreground [&_[data-slot=notice-icon]]:text-muted-foreground",
1050
+ success: "border-success/35 bg-[color:var(--success-soft)] text-success [&_[data-slot=notice-description]]:text-foreground",
1051
+ warning: "border-warning/35 bg-[color:var(--warning-soft,var(--accent-soft))] text-foreground [&_[data-slot=notice-icon]]:text-[color:var(--warning,var(--accent))]",
1052
+ error: "border-destructive/40 bg-destructive/10 text-destructive [&_[data-slot=notice-description]]:text-foreground",
1053
+ accent: "border-accent/40 bg-[color:var(--accent-soft)] text-foreground [&_[data-slot=notice-icon]]:text-[color:var(--accent)]",
1054
+ destructive: "border-destructive/50 bg-destructive/10 text-destructive [&_[data-slot=notice-description]]:text-foreground"
1055
+ };
1056
+ function Notice({
1057
+ className,
1058
+ tone = "info",
1059
+ title,
1060
+ description,
1061
+ icon,
1062
+ actions,
1063
+ children,
1064
+ ...props
1065
+ }) {
1066
+ return /* @__PURE__ */ jsxs8(
1067
+ "div",
1068
+ {
1069
+ "data-slot": "notice",
1070
+ "data-tone": tone,
1071
+ className: cn(
1072
+ "flex items-start gap-3 rounded-md border px-3 py-2 text-sm",
1073
+ noticeToneClasses[tone],
1074
+ className
1075
+ ),
1076
+ ...props,
1077
+ children: [
1078
+ icon && /* @__PURE__ */ jsx20("div", { "data-slot": "notice-icon", className: "mt-0.5 shrink-0", children: icon }),
1079
+ /* @__PURE__ */ jsxs8("div", { className: "min-w-0 flex-1", children: [
1080
+ title && /* @__PURE__ */ jsx20("div", { "data-slot": "notice-title", className: "font-medium leading-snug", children: title }),
1081
+ description && /* @__PURE__ */ jsx20("div", { "data-slot": "notice-description", className: cn("text-muted-foreground", title && "mt-0.5"), children: description }),
1082
+ children
1083
+ ] }),
1084
+ actions && /* @__PURE__ */ jsx20("div", { "data-slot": "notice-actions", className: "flex shrink-0 items-center gap-2", children: actions })
1085
+ ]
1086
+ }
1087
+ );
1088
+ }
1089
+
1090
+ // src/skeleton.tsx
1091
+ import { jsx as jsx21 } from "react/jsx-runtime";
1092
+ function Skeleton({ className, ...props }) {
1093
+ return /* @__PURE__ */ jsx21(
1094
+ "div",
1095
+ {
1096
+ "data-slot": "skeleton",
1097
+ "aria-hidden": "true",
1098
+ className: cn("animate-pulse rounded-md bg-muted", className),
1099
+ ...props
1100
+ }
1101
+ );
1102
+ }
1103
+
1104
+ // src/inline-code.tsx
1105
+ import { jsx as jsx22 } from "react/jsx-runtime";
1106
+ function InlineCode({ className, ...props }) {
1107
+ return /* @__PURE__ */ jsx22(
1108
+ "code",
1109
+ {
1110
+ "data-slot": "inline-code",
1111
+ className: cn("rounded bg-muted px-1.5 py-0.5 font-mono text-[0.85em] text-foreground", className),
1112
+ ...props
1113
+ }
1114
+ );
1115
+ }
1116
+
1117
+ // src/toolbar.tsx
1118
+ import { jsx as jsx23 } from "react/jsx-runtime";
1119
+ function Toolbar({ className, ...props }) {
1120
+ return /* @__PURE__ */ jsx23(
1121
+ "div",
1122
+ {
1123
+ "data-slot": "toolbar",
1124
+ role: "toolbar",
1125
+ className: cn("flex items-center gap-1 overflow-x-auto whitespace-nowrap [&::-webkit-scrollbar]:hidden", className),
1126
+ ...props
1127
+ }
1128
+ );
1129
+ }
1130
+ function ToolbarGroup({ className, ...props }) {
1131
+ return /* @__PURE__ */ jsx23("div", { "data-slot": "toolbar-group", className: cn("flex items-center gap-0.5", className), ...props });
1132
+ }
1133
+ function ToolbarButton({ className, variant = "ghost", size = "icon-sm", ...props }) {
1134
+ return /* @__PURE__ */ jsx23(Button, { "data-slot": "toolbar-button", variant, size, className: cn("shrink-0", className), ...props });
1135
+ }
1136
+ function ToolbarSeparator({ className, ...props }) {
1137
+ return /* @__PURE__ */ jsx23("div", { "data-slot": "toolbar-separator", "aria-hidden": "true", className: cn("mx-1 h-4 w-px shrink-0 bg-border/60", className), ...props });
1138
+ }
1139
+
1140
+ // src/chip.tsx
1141
+ import { jsx as jsx24 } from "react/jsx-runtime";
1142
+ function Chip({ className, selected, ...props }) {
1143
+ return /* @__PURE__ */ jsx24(
1144
+ "span",
1145
+ {
1146
+ "data-slot": "chip",
1147
+ "data-selected": selected ? "true" : void 0,
1148
+ className: cn(
1149
+ "inline-flex min-h-6 items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-xs text-foreground",
1150
+ selected && "border-foreground/20 bg-foreground/10",
1151
+ className
1152
+ ),
1153
+ ...props
1154
+ }
1155
+ );
1156
+ }
1157
+ function ChipButton({ className, selected, variant = "outline", size = "xs", ...props }) {
1158
+ return /* @__PURE__ */ jsx24(
1159
+ Button,
1160
+ {
1161
+ "data-slot": "chip-button",
1162
+ "data-selected": selected ? "true" : void 0,
1163
+ variant,
1164
+ size,
1165
+ className: cn(
1166
+ "h-auto rounded-full px-2 py-0.5 text-xs",
1167
+ selected && "border-foreground/20 bg-foreground/10",
1168
+ className
1169
+ ),
1170
+ ...props
1171
+ }
1172
+ );
1173
+ }
1174
+ function ChipRemove({ className, children, variant = "ghost", size = "icon-xs", ...props }) {
1175
+ return /* @__PURE__ */ jsx24(
1176
+ Button,
1177
+ {
1178
+ "data-slot": "chip-remove",
1179
+ variant,
1180
+ size,
1181
+ className: cn("size-4 rounded-full text-muted-foreground hover:text-foreground", className),
1182
+ ...props,
1183
+ children: children ?? /* @__PURE__ */ jsx24("span", { "aria-hidden": "true", className: "text-[13px] leading-none", children: "\xD7" })
1184
+ }
1185
+ );
1186
+ }
1187
+
1188
+ // src/segmented-control.tsx
1189
+ import { jsx as jsx25 } from "react/jsx-runtime";
1190
+ function SegmentedControl({ className, ...props }) {
1191
+ return /* @__PURE__ */ jsx25(
1192
+ "div",
1193
+ {
1194
+ "data-slot": "segmented-control",
1195
+ role: "tablist",
1196
+ className: cn("inline-flex items-center gap-0.5 rounded-md border border-border bg-muted/50 p-0.5", className),
1197
+ ...props
1198
+ }
1199
+ );
1200
+ }
1201
+ function SegmentedControlItem({ className, selected, variant = "ghost", size = "xs", ...props }) {
1202
+ return /* @__PURE__ */ jsx25(
1203
+ Button,
1204
+ {
1205
+ "data-slot": "segmented-control-item",
1206
+ role: "tab",
1207
+ "aria-selected": selected,
1208
+ "data-selected": selected ? "true" : void 0,
1209
+ variant,
1210
+ size,
1211
+ className: cn(
1212
+ "rounded-sm border border-transparent px-2 font-normal shadow-none",
1213
+ selected ? "bg-background font-medium text-foreground shadow-sm hover:bg-background" : "text-muted-foreground hover:text-foreground",
1214
+ className
1215
+ ),
1216
+ ...props
1217
+ }
1218
+ );
1219
+ }
1220
+
1221
+ // src/settings.tsx
1222
+ import { jsx as jsx26, jsxs as jsxs9 } from "react/jsx-runtime";
1223
+ function SettingsPanel({ className, icon, title, description, footer, danger, testId, children, ...props }) {
1224
+ return /* @__PURE__ */ jsxs9(
1225
+ "section",
1226
+ {
1227
+ "data-slot": "settings-panel",
1228
+ "data-testid": testId,
1229
+ className: cn("scroll-mt-6 overflow-hidden rounded-lg border border-border/60 bg-background shadow-none", className),
1230
+ ...props,
1231
+ children: [
1232
+ /* @__PURE__ */ jsxs9("div", { "data-slot": "settings-panel-header", className: "flex min-h-11 items-center gap-2 border-b border-border/50 px-4 py-2.5", children: [
1233
+ icon && /* @__PURE__ */ jsx26("span", { "data-slot": "settings-panel-icon", className: danger ? "text-destructive" : "text-muted-foreground", children: icon }),
1234
+ /* @__PURE__ */ jsxs9("div", { className: "min-w-0", children: [
1235
+ /* @__PURE__ */ jsx26("h2", { "data-slot": "settings-panel-title", className: cn("text-[13px] font-medium leading-5", danger ? "text-destructive" : "text-foreground"), children: title }),
1236
+ description ? /* @__PURE__ */ jsx26("p", { "data-slot": "settings-panel-description", className: "text-[12px] leading-5 text-muted-foreground", children: description }) : null
1237
+ ] })
1238
+ ] }),
1239
+ /* @__PURE__ */ jsx26("div", { "data-slot": "settings-panel-body", className: "p-4", children }),
1240
+ footer ? /* @__PURE__ */ jsx26("div", { "data-slot": "settings-panel-footer", className: "flex items-center justify-end gap-2 border-t border-border/50 bg-muted/10 px-4 py-3", children: footer }) : null
1241
+ ]
1242
+ }
1243
+ );
1244
+ }
1245
+ function SettingsNav({ className, label, items, ...props }) {
1246
+ return /* @__PURE__ */ jsxs9("nav", { "data-slot": "settings-nav", "aria-label": `${label} sections`, className: cn("boring-settings-nav", className), ...props, children: [
1247
+ /* @__PURE__ */ jsx26("p", { "data-slot": "settings-nav-label", className: "boring-settings-nav-label", children: label }),
1248
+ items.map((item) => /* @__PURE__ */ jsx26("a", { "data-slot": "settings-nav-item", href: item.href, className: "boring-settings-nav-item", children: /* @__PURE__ */ jsxs9("span", { className: "min-w-0", children: [
1249
+ /* @__PURE__ */ jsx26("span", { className: "block truncate text-[12.5px] font-medium text-foreground", children: item.label }),
1250
+ item.description ? /* @__PURE__ */ jsx26("span", { className: "block truncate text-[11.5px] leading-4 text-muted-foreground", children: item.description }) : null
1251
+ ] }) }, item.href))
1252
+ ] });
1253
+ }
1254
+ function SettingsPageHeader({ className, eyebrow, title, description, context, children, ...props }) {
1255
+ return /* @__PURE__ */ jsxs9("header", { "data-slot": "settings-page-header", className: cn("boring-settings-page-header", className), ...props, children: [
1256
+ context,
1257
+ /* @__PURE__ */ jsxs9("div", { className: "max-w-2xl", children: [
1258
+ eyebrow ? /* @__PURE__ */ jsx26("p", { "data-slot": "settings-page-eyebrow", className: "text-[11px] font-medium uppercase leading-4 text-muted-foreground", children: eyebrow }) : null,
1259
+ /* @__PURE__ */ jsx26("h1", { "data-slot": "settings-page-title", className: "mt-1 text-[20px] font-semibold leading-7 tracking-tight text-foreground", children: title }),
1260
+ description ? /* @__PURE__ */ jsx26("p", { "data-slot": "settings-page-description", className: "mt-2 text-[13px] leading-5 text-muted-foreground", children: description }) : null
1261
+ ] }),
1262
+ children
1263
+ ] });
1264
+ }
1265
+ function SettingsActionRow({ className, title, description, action, ...props }) {
1266
+ return /* @__PURE__ */ jsxs9("div", { "data-slot": "settings-action-row", className: cn("boring-settings-action-row", className), ...props, children: [
1267
+ /* @__PURE__ */ jsxs9("div", { className: "min-w-0", children: [
1268
+ /* @__PURE__ */ jsx26("p", { "data-slot": "settings-action-title", className: "text-[13px] font-medium leading-5 text-foreground", children: title }),
1269
+ description ? /* @__PURE__ */ jsx26("p", { "data-slot": "settings-action-description", className: "mt-1 max-w-xl text-[12px] leading-5 text-muted-foreground", children: description }) : null
1270
+ ] }),
1271
+ /* @__PURE__ */ jsx26("div", { "data-slot": "settings-action", className: "shrink-0", children: action })
1272
+ ] });
1273
+ }
1274
+ function DetailLine({ className, icon, label, children, ...props }) {
1275
+ return /* @__PURE__ */ jsxs9("div", { "data-slot": "detail-line", className: cn("flex min-h-12 items-center gap-3 px-3 py-2 text-[13px]", className), ...props, children: [
1276
+ icon ? /* @__PURE__ */ jsx26("span", { "data-slot": "detail-line-icon", className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground", children: icon }) : null,
1277
+ /* @__PURE__ */ jsx26("dt", { "data-slot": "detail-line-label", className: "w-32 shrink-0 text-[12px] text-muted-foreground", children: label }),
1278
+ /* @__PURE__ */ jsx26("dd", { "data-slot": "detail-line-value", className: "min-w-0 flex-1 text-foreground", children })
1279
+ ] });
1280
+ }
1281
+
1282
+ // src/disclosure.tsx
1283
+ import * as React6 from "react";
1284
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
1285
+ import { jsx as jsx27, jsxs as jsxs10 } from "react/jsx-runtime";
1286
+ var Disclosure = CollapsiblePrimitive.Root;
1287
+ var DisclosureContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
1288
+ CollapsiblePrimitive.Content,
1289
+ {
1290
+ ref,
1291
+ "data-slot": "disclosure-content",
1292
+ className: cn("overflow-hidden data-[state=closed]:animate-out data-[state=open]:animate-in", className),
1293
+ ...props
1294
+ }
1295
+ ));
1296
+ DisclosureContent.displayName = "DisclosureContent";
1297
+ var DisclosureTrigger = React6.forwardRef(
1298
+ ({ className, children, chevron, variant = "ghost", size = "sm", ...props }, ref) => /* @__PURE__ */ jsx27(CollapsiblePrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs10(
1299
+ Button,
1300
+ {
1301
+ ref,
1302
+ "data-slot": "disclosure-trigger",
1303
+ variant,
1304
+ size,
1305
+ className: cn("group/disclosure justify-start gap-2", className),
1306
+ ...props,
1307
+ children: [
1308
+ chevron ?? /* @__PURE__ */ jsx27(DisclosureChevron, {}),
1309
+ children
1310
+ ]
1311
+ }
1312
+ ) })
1313
+ );
1314
+ DisclosureTrigger.displayName = "DisclosureTrigger";
1315
+ function DisclosureChevron({ className, ...props }) {
1316
+ return /* @__PURE__ */ jsx27(
1317
+ "span",
1318
+ {
1319
+ "data-slot": "disclosure-chevron",
1320
+ "aria-hidden": "true",
1321
+ className: cn("inline-block text-[11px] text-muted-foreground transition-transform group-data-[state=open]/disclosure:rotate-90", className),
1322
+ ...props,
1323
+ children: "\u25B6"
1324
+ }
1325
+ );
1326
+ }
1327
+
1328
+ // src/resize-handle.tsx
1329
+ import { jsx as jsx28 } from "react/jsx-runtime";
1330
+ function ResizeHandle({
1331
+ className,
1332
+ orientation = "vertical",
1333
+ onResizeStart,
1334
+ role = "separator",
1335
+ tabIndex = 0,
1336
+ ...props
1337
+ }) {
1338
+ return /* @__PURE__ */ jsx28(
1339
+ "div",
1340
+ {
1341
+ "data-slot": "resize-handle",
1342
+ "data-orientation": orientation,
1343
+ role,
1344
+ "aria-orientation": orientation,
1345
+ tabIndex,
1346
+ onPointerDown: onResizeStart,
1347
+ className: cn(
1348
+ "shrink-0 touch-none select-none bg-transparent transition-colors hover:bg-border/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
1349
+ orientation === "vertical" ? "w-1 cursor-col-resize" : "h-1 cursor-row-resize",
1350
+ className
1351
+ ),
1352
+ ...props
1353
+ }
1354
+ );
1355
+ }
1356
+
1357
+ // src/avatar.tsx
1358
+ import { jsx as jsx29 } from "react/jsx-runtime";
1359
+ function Avatar({ className, ...props }) {
1360
+ return /* @__PURE__ */ jsx29(
1361
+ "div",
1362
+ {
1363
+ "data-slot": "avatar",
1364
+ className: cn("relative flex size-8 shrink-0 overflow-hidden rounded-full bg-muted text-foreground", className),
1365
+ ...props
1366
+ }
1367
+ );
1368
+ }
1369
+ function AvatarFallback({ className, ...props }) {
1370
+ return /* @__PURE__ */ jsx29(
1371
+ "span",
1372
+ {
1373
+ "data-slot": "avatar-fallback",
1374
+ className: cn("flex size-full items-center justify-center text-xs font-medium uppercase", className),
1375
+ ...props
1376
+ }
1377
+ );
1378
+ }
1379
+ function InitialsAvatar({ initials, className, ...props }) {
1380
+ return /* @__PURE__ */ jsx29(Avatar, { className, ...props, children: /* @__PURE__ */ jsx29(AvatarFallback, { children: initials }) });
1381
+ }
1382
+
1383
+ // src/toast.tsx
1384
+ import * as React7 from "react";
1385
+ import { createPortal } from "react-dom";
1386
+ import { jsx as jsx30, jsxs as jsxs11 } from "react/jsx-runtime";
1387
+ var toasts = [];
1388
+ var listeners = /* @__PURE__ */ new Set();
1389
+ var nextId = 0;
1390
+ function emit() {
1391
+ for (const listener of listeners) listener(toasts);
1392
+ }
1393
+ function addToast(input) {
1394
+ const id = `t${++nextId}`;
1395
+ const record = { ...input, id, createdAt: Date.now(), durationMs: input.durationMs ?? 3e3 };
1396
+ toasts = [...toasts, record];
1397
+ emit();
1398
+ if (record.durationMs && record.durationMs > 0) setTimeout(() => dismissToast(id), record.durationMs);
1399
+ return id;
1400
+ }
1401
+ function dismissToast(id) {
1402
+ const before = toasts.length;
1403
+ toasts = toasts.filter((toast2) => toast2.id !== id);
1404
+ if (toasts.length !== before) emit();
1405
+ }
1406
+ function subscribeToasts(listener) {
1407
+ listeners.add(listener);
1408
+ listener(toasts);
1409
+ return () => listeners.delete(listener);
1410
+ }
1411
+ function getActiveToasts() {
1412
+ return toasts;
1413
+ }
1414
+ function clearToasts() {
1415
+ if (!toasts.length) return;
1416
+ toasts = [];
1417
+ emit();
1418
+ }
1419
+ function normalize(input, variant) {
1420
+ return typeof input === "string" ? { title: input, variant } : { variant, ...input };
1421
+ }
1422
+ var toast = Object.assign(
1423
+ (input) => addToast(normalize(input, "info")),
1424
+ {
1425
+ success: (input) => addToast(normalize(input, "success")),
1426
+ error: (input) => addToast(normalize(input, "error")),
1427
+ info: (input) => addToast(normalize(input, "info")),
1428
+ dismiss: dismissToast
1429
+ }
1430
+ );
1431
+ var VARIANT_CLASS = {
1432
+ success: "border-accent/40 bg-background text-foreground [&_[data-toast-icon]]:text-accent",
1433
+ error: "border-destructive/50 bg-background text-foreground [&_[data-toast-icon]]:text-destructive",
1434
+ info: "border-border bg-background text-foreground [&_[data-toast-icon]]:text-foreground/70"
1435
+ };
1436
+ var VARIANT_ICON = {
1437
+ success: "\u2713",
1438
+ error: "!",
1439
+ info: "i"
1440
+ };
1441
+ function Toaster({ position = "bottom-right", className }) {
1442
+ const [items, setItems] = React7.useState(() => toasts);
1443
+ React7.useEffect(() => subscribeToasts(setItems), []);
1444
+ if (typeof document === "undefined") return null;
1445
+ const node = /* @__PURE__ */ jsx30(
1446
+ "div",
1447
+ {
1448
+ role: "region",
1449
+ "aria-label": "Notifications",
1450
+ "data-testid": "toaster",
1451
+ className: cn(
1452
+ "pointer-events-none fixed z-[1000] flex w-[340px] max-w-[calc(100vw-2rem)] flex-col gap-2",
1453
+ position === "bottom-right" && "bottom-4 right-4 items-end",
1454
+ position === "bottom-left" && "bottom-4 left-4 items-start",
1455
+ position === "top-right" && "top-4 right-4 items-end",
1456
+ position === "top-left" && "top-4 left-4 items-start",
1457
+ className
1458
+ ),
1459
+ children: items.map((item) => {
1460
+ const variant = item.variant ?? "info";
1461
+ return /* @__PURE__ */ jsxs11(
1462
+ "div",
1463
+ {
1464
+ role: "status",
1465
+ "data-testid": "toast",
1466
+ "data-variant": variant,
1467
+ className: cn(
1468
+ "pointer-events-auto flex w-full items-start gap-2.5 rounded-md border px-3 py-2 shadow-md",
1469
+ "animate-in fade-in slide-in-from-bottom-2 duration-150",
1470
+ VARIANT_CLASS[variant]
1471
+ ),
1472
+ children: [
1473
+ /* @__PURE__ */ jsx30("span", { "data-toast-icon": true, className: "mt-0.5 flex h-3.5 w-3.5 shrink-0 items-center justify-center text-[11px] font-semibold leading-none", children: VARIANT_ICON[variant] }),
1474
+ /* @__PURE__ */ jsxs11("div", { className: "min-w-0 flex-1", children: [
1475
+ item.title && /* @__PURE__ */ jsx30("div", { className: "text-sm font-medium leading-snug", children: item.title }),
1476
+ item.description && /* @__PURE__ */ jsx30("div", { className: cn("text-xs text-muted-foreground", item.title ? "mt-0.5" : "leading-snug"), children: item.description })
1477
+ ] }),
1478
+ /* @__PURE__ */ jsx30(IconButton, { type: "button", variant: "ghost", size: "icon-xs", onClick: () => dismissToast(item.id), "aria-label": "Dismiss", className: "shrink-0 text-muted-foreground/70", children: /* @__PURE__ */ jsx30("span", { "aria-hidden": "true", className: "text-[13px] leading-none", children: "\xD7" }) })
1479
+ ]
1480
+ },
1481
+ item.id
1482
+ );
1483
+ })
1484
+ }
1485
+ );
1486
+ return createPortal(node, document.body);
1487
+ }
1488
+
1489
+ // src/loading-state.tsx
1490
+ import { jsx as jsx31, jsxs as jsxs12 } from "react/jsx-runtime";
1491
+ function LoadingState({ className, label = "Loading\u2026", centered = false, children, ...props }) {
1492
+ return /* @__PURE__ */ jsxs12(
1493
+ "div",
1494
+ {
1495
+ "data-slot": "loading-state",
1496
+ role: "status",
1497
+ className: cn(
1498
+ "flex items-center gap-2 text-sm text-muted-foreground",
1499
+ centered && "h-full w-full justify-center",
1500
+ className
1501
+ ),
1502
+ ...props,
1503
+ children: [
1504
+ /* @__PURE__ */ jsx31(Spinner, { className: "size-3.5" }),
1505
+ /* @__PURE__ */ jsx31("span", { children: children ?? label })
1506
+ ]
1507
+ }
1508
+ );
1509
+ }
1510
+
1511
+ // src/list.tsx
1512
+ import { jsx as jsx32 } from "react/jsx-runtime";
1513
+ function List2({ className, ...props }) {
1514
+ return /* @__PURE__ */ jsx32("div", { "data-slot": "list", className: cn("divide-y divide-border/60", className), ...props });
1515
+ }
1516
+ function ListRow({ className, interactive, ...props }) {
1517
+ return /* @__PURE__ */ jsx32(
1518
+ "div",
1519
+ {
1520
+ "data-slot": "list-row",
1521
+ "data-interactive": interactive ? "true" : void 0,
1522
+ className: cn(
1523
+ "flex items-center justify-between gap-3 py-3",
1524
+ interactive && "cursor-pointer rounded-md px-2 transition-colors hover:bg-muted/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
1525
+ className
1526
+ ),
1527
+ ...props
1528
+ }
1529
+ );
1530
+ }
1531
+ function ListRowMain({ className, ...props }) {
1532
+ return /* @__PURE__ */ jsx32("div", { "data-slot": "list-row-main", className: cn("min-w-0 flex-1", className), ...props });
1533
+ }
1534
+ function ListRowTitle({ className, ...props }) {
1535
+ return /* @__PURE__ */ jsx32("p", { "data-slot": "list-row-title", className: cn("truncate text-sm font-medium text-foreground", className), ...props });
1536
+ }
1537
+ function ListRowDescription({ className, ...props }) {
1538
+ return /* @__PURE__ */ jsx32("p", { "data-slot": "list-row-description", className: cn("truncate text-xs text-muted-foreground", className), ...props });
1539
+ }
1540
+ function ListRowMeta({ className, ...props }) {
1541
+ return /* @__PURE__ */ jsx32("div", { "data-slot": "list-row-meta", className: cn("flex shrink-0 items-center gap-2 text-xs text-muted-foreground", className), ...props });
1542
+ }
1543
+ function ListRowActions({ className, ...props }) {
1544
+ return /* @__PURE__ */ jsx32("div", { "data-slot": "list-row-actions", className: cn("flex shrink-0 items-center gap-2", className), ...props });
1545
+ }
1546
+
1547
+ // src/detail-list.tsx
1548
+ import { jsx as jsx33 } from "react/jsx-runtime";
1549
+ function DetailList({ className, ...props }) {
1550
+ return /* @__PURE__ */ jsx33(
1551
+ "dl",
1552
+ {
1553
+ "data-slot": "detail-list",
1554
+ className: cn("divide-y divide-border/50 rounded-md border border-border/50 bg-muted/10", className),
1555
+ ...props
1556
+ }
1557
+ );
1558
+ }
1559
+
1560
+ // src/floating-panel.tsx
1561
+ import { jsx as jsx34 } from "react/jsx-runtime";
1562
+ function FloatingPanel({ className, ...props }) {
1563
+ return /* @__PURE__ */ jsx34(
1564
+ "div",
1565
+ {
1566
+ "data-slot": "floating-panel",
1567
+ className: cn("rounded-lg border border-border/70 bg-[color:var(--surface-workbench-left,var(--background))] p-2 text-foreground shadow-2xl", className),
1568
+ ...props
1569
+ }
1570
+ );
1571
+ }
1572
+ function FloatingPanelHeader({ className, ...props }) {
1573
+ return /* @__PURE__ */ jsx34("div", { "data-slot": "floating-panel-header", className: cn("flex items-center justify-between gap-2 border-b border-border px-1 pb-2", className), ...props });
1574
+ }
1575
+ function FloatingPanelBody({ className, ...props }) {
1576
+ return /* @__PURE__ */ jsx34("div", { "data-slot": "floating-panel-body", className: cn("py-1", className), ...props });
1577
+ }
1578
+
1579
+ // src/card.tsx
1580
+ import { jsx as jsx35 } from "react/jsx-runtime";
1581
+ function Card({ className, ...props }) {
1582
+ return /* @__PURE__ */ jsx35(
1583
+ "div",
1584
+ {
1585
+ "data-slot": "card",
1586
+ className: cn(
1587
+ "flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm",
1588
+ className
1589
+ ),
1590
+ ...props
1591
+ }
1592
+ );
1593
+ }
1594
+ function CardHeader({ className, ...props }) {
1595
+ return /* @__PURE__ */ jsx35(
1596
+ "div",
1597
+ {
1598
+ "data-slot": "card-header",
1599
+ className: cn(
1600
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
1601
+ className
1602
+ ),
1603
+ ...props
1604
+ }
1605
+ );
1606
+ }
1607
+ function CardTitle({ className, ...props }) {
1608
+ return /* @__PURE__ */ jsx35(
1609
+ "div",
1610
+ {
1611
+ "data-slot": "card-title",
1612
+ className: cn("leading-none font-semibold", className),
1613
+ ...props
1614
+ }
1615
+ );
1616
+ }
1617
+ function CardDescription({ className, ...props }) {
1618
+ return /* @__PURE__ */ jsx35(
1619
+ "div",
1620
+ {
1621
+ "data-slot": "card-description",
1622
+ className: cn("text-sm text-muted-foreground", className),
1623
+ ...props
1624
+ }
1625
+ );
1626
+ }
1627
+ function CardAction({ className, ...props }) {
1628
+ return /* @__PURE__ */ jsx35(
1629
+ "div",
1630
+ {
1631
+ "data-slot": "card-action",
1632
+ className: cn(
1633
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
1634
+ className
1635
+ ),
1636
+ ...props
1637
+ }
1638
+ );
1639
+ }
1640
+ function CardContent({ className, ...props }) {
1641
+ return /* @__PURE__ */ jsx35(
1642
+ "div",
1643
+ {
1644
+ "data-slot": "card-content",
1645
+ className: cn("px-6", className),
1646
+ ...props
1647
+ }
1648
+ );
1649
+ }
1650
+ function CardFooter({ className, ...props }) {
1651
+ return /* @__PURE__ */ jsx35(
1652
+ "div",
1653
+ {
1654
+ "data-slot": "card-footer",
1655
+ className: cn("flex items-center px-6 [.border-t]:pt-6", className),
1656
+ ...props
1657
+ }
1658
+ );
1659
+ }
1660
+
1661
+ // src/label.tsx
1662
+ import * as LabelPrimitive from "@radix-ui/react-label";
1663
+ import { jsx as jsx36 } from "react/jsx-runtime";
1664
+ function Label3({
1665
+ className,
1666
+ ...props
1667
+ }) {
1668
+ return /* @__PURE__ */ jsx36(
1669
+ LabelPrimitive.Root,
1670
+ {
1671
+ "data-slot": "label",
1672
+ className: cn(
1673
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
1674
+ className
1675
+ ),
1676
+ ...props
1677
+ }
1678
+ );
1679
+ }
1680
+
1681
+ // src/checkbox.tsx
1682
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
1683
+ import { jsx as jsx37 } from "react/jsx-runtime";
1684
+ function Checkbox({
1685
+ className,
1686
+ ...props
1687
+ }) {
1688
+ return /* @__PURE__ */ jsx37(
1689
+ CheckboxPrimitive.Root,
1690
+ {
1691
+ "data-slot": "checkbox",
1692
+ className: cn(
1693
+ "peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary",
1694
+ className
1695
+ ),
1696
+ ...props,
1697
+ children: /* @__PURE__ */ jsx37(
1698
+ CheckboxPrimitive.Indicator,
1699
+ {
1700
+ "data-slot": "checkbox-indicator",
1701
+ className: "grid place-content-center text-current transition-none",
1702
+ children: /* @__PURE__ */ jsx37("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2713" })
1703
+ }
1704
+ )
1705
+ }
1706
+ );
1707
+ }
1708
+
1709
+ // src/alert-dialog.tsx
1710
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
1711
+ import { jsx as jsx38, jsxs as jsxs13 } from "react/jsx-runtime";
1712
+ function AlertDialog({
1713
+ ...props
1714
+ }) {
1715
+ return /* @__PURE__ */ jsx38(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
1716
+ }
1717
+ function AlertDialogTrigger({
1718
+ ...props
1719
+ }) {
1720
+ return /* @__PURE__ */ jsx38(AlertDialogPrimitive.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
1721
+ }
1722
+ function AlertDialogPortal({
1723
+ ...props
1724
+ }) {
1725
+ return /* @__PURE__ */ jsx38(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
1726
+ }
1727
+ function AlertDialogOverlay({
1728
+ className,
1729
+ ...props
1730
+ }) {
1731
+ return /* @__PURE__ */ jsx38(
1732
+ AlertDialogPrimitive.Overlay,
1733
+ {
1734
+ "data-slot": "alert-dialog-overlay",
1735
+ className: cn(
1736
+ "fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
1737
+ className
1738
+ ),
1739
+ ...props
1740
+ }
1741
+ );
1742
+ }
1743
+ function AlertDialogContent({
1744
+ className,
1745
+ size = "default",
1746
+ ...props
1747
+ }) {
1748
+ return /* @__PURE__ */ jsxs13(AlertDialogPortal, { children: [
1749
+ /* @__PURE__ */ jsx38(AlertDialogOverlay, {}),
1750
+ /* @__PURE__ */ jsx38(
1751
+ AlertDialogPrimitive.Content,
1752
+ {
1753
+ "data-slot": "alert-dialog-content",
1754
+ "data-size": size,
1755
+ className: cn(
1756
+ "group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg",
1757
+ className
1758
+ ),
1759
+ ...props
1760
+ }
1761
+ )
1762
+ ] });
1763
+ }
1764
+ function AlertDialogHeader({
1765
+ className,
1766
+ ...props
1767
+ }) {
1768
+ return /* @__PURE__ */ jsx38(
1769
+ "div",
1770
+ {
1771
+ "data-slot": "alert-dialog-header",
1772
+ className: cn(
1773
+ "grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
1774
+ className
1775
+ ),
1776
+ ...props
1777
+ }
1778
+ );
1779
+ }
1780
+ function AlertDialogFooter({
1781
+ className,
1782
+ ...props
1783
+ }) {
1784
+ return /* @__PURE__ */ jsx38(
1785
+ "div",
1786
+ {
1787
+ "data-slot": "alert-dialog-footer",
1788
+ className: cn(
1789
+ "flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
1790
+ className
1791
+ ),
1792
+ ...props
1793
+ }
1794
+ );
1795
+ }
1796
+ function AlertDialogTitle({
1797
+ className,
1798
+ ...props
1799
+ }) {
1800
+ return /* @__PURE__ */ jsx38(
1801
+ AlertDialogPrimitive.Title,
1802
+ {
1803
+ "data-slot": "alert-dialog-title",
1804
+ className: cn(
1805
+ "text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
1806
+ className
1807
+ ),
1808
+ ...props
1809
+ }
1810
+ );
1811
+ }
1812
+ function AlertDialogDescription({
1813
+ className,
1814
+ ...props
1815
+ }) {
1816
+ return /* @__PURE__ */ jsx38(
1817
+ AlertDialogPrimitive.Description,
1818
+ {
1819
+ "data-slot": "alert-dialog-description",
1820
+ className: cn("text-sm text-muted-foreground", className),
1821
+ ...props
1822
+ }
1823
+ );
1824
+ }
1825
+ function AlertDialogMedia({
1826
+ className,
1827
+ ...props
1828
+ }) {
1829
+ return /* @__PURE__ */ jsx38(
1830
+ "div",
1831
+ {
1832
+ "data-slot": "alert-dialog-media",
1833
+ className: cn(
1834
+ "mb-2 inline-flex size-16 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8",
1835
+ className
1836
+ ),
1837
+ ...props
1838
+ }
1839
+ );
1840
+ }
1841
+ function AlertDialogAction({
1842
+ className,
1843
+ variant = "default",
1844
+ size = "default",
1845
+ ...props
1846
+ }) {
1847
+ return /* @__PURE__ */ jsx38(Button, { variant, size, asChild: true, children: /* @__PURE__ */ jsx38(
1848
+ AlertDialogPrimitive.Action,
1849
+ {
1850
+ "data-slot": "alert-dialog-action",
1851
+ className: cn(className),
1852
+ ...props
1853
+ }
1854
+ ) });
1855
+ }
1856
+ function AlertDialogCancel({
1857
+ className,
1858
+ variant = "outline",
1859
+ size = "default",
1860
+ ...props
1861
+ }) {
1862
+ return /* @__PURE__ */ jsx38(Button, { variant, size, asChild: true, children: /* @__PURE__ */ jsx38(
1863
+ AlertDialogPrimitive.Cancel,
1864
+ {
1865
+ "data-slot": "alert-dialog-cancel",
1866
+ className: cn(className),
1867
+ ...props
1868
+ }
1869
+ ) });
1870
+ }
1871
+
1872
+ // src/popover.tsx
1873
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
1874
+ import { jsx as jsx39 } from "react/jsx-runtime";
1875
+ function Popover({
1876
+ ...props
1877
+ }) {
1878
+ return /* @__PURE__ */ jsx39(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
1879
+ }
1880
+ function PopoverTrigger({
1881
+ ...props
1882
+ }) {
1883
+ return /* @__PURE__ */ jsx39(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
1884
+ }
1885
+ function PopoverContent({
1886
+ className,
1887
+ align = "center",
1888
+ sideOffset = 4,
1889
+ ...props
1890
+ }) {
1891
+ return /* @__PURE__ */ jsx39(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx39(
1892
+ PopoverPrimitive.Content,
1893
+ {
1894
+ "data-slot": "popover-content",
1895
+ align,
1896
+ sideOffset,
1897
+ className: cn(
1898
+ "z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
1899
+ className
1900
+ ),
1901
+ ...props
1902
+ }
1903
+ ) });
1904
+ }
1905
+ function PopoverAnchor({
1906
+ ...props
1907
+ }) {
1908
+ return /* @__PURE__ */ jsx39(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
1909
+ }
1910
+ function PopoverHeader({ className, ...props }) {
1911
+ return /* @__PURE__ */ jsx39(
1912
+ "div",
1913
+ {
1914
+ "data-slot": "popover-header",
1915
+ className: cn("flex flex-col gap-1 text-sm", className),
1916
+ ...props
1917
+ }
1918
+ );
1919
+ }
1920
+ function PopoverTitle({ className, ...props }) {
1921
+ return /* @__PURE__ */ jsx39(
1922
+ "div",
1923
+ {
1924
+ "data-slot": "popover-title",
1925
+ className: cn("font-medium", className),
1926
+ ...props
1927
+ }
1928
+ );
1929
+ }
1930
+ function PopoverDescription({
1931
+ className,
1932
+ ...props
1933
+ }) {
1934
+ return /* @__PURE__ */ jsx39(
1935
+ "p",
1936
+ {
1937
+ "data-slot": "popover-description",
1938
+ className: cn("text-muted-foreground", className),
1939
+ ...props
1940
+ }
1941
+ );
1942
+ }
1943
+
1944
+ // src/scroll-area.tsx
1945
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
1946
+ import { jsx as jsx40, jsxs as jsxs14 } from "react/jsx-runtime";
1947
+ function ScrollArea({
1948
+ className,
1949
+ children,
1950
+ ...props
1951
+ }) {
1952
+ return /* @__PURE__ */ jsxs14(
1953
+ ScrollAreaPrimitive.Root,
1954
+ {
1955
+ "data-slot": "scroll-area",
1956
+ className: cn("relative", className),
1957
+ ...props,
1958
+ children: [
1959
+ /* @__PURE__ */ jsx40(
1960
+ ScrollAreaPrimitive.Viewport,
1961
+ {
1962
+ "data-slot": "scroll-area-viewport",
1963
+ className: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",
1964
+ children
1965
+ }
1966
+ ),
1967
+ /* @__PURE__ */ jsx40(ScrollBar, {}),
1968
+ /* @__PURE__ */ jsx40(ScrollAreaPrimitive.Corner, {})
1969
+ ]
1970
+ }
1971
+ );
1972
+ }
1973
+ function ScrollBar({
1974
+ className,
1975
+ orientation = "vertical",
1976
+ ...props
1977
+ }) {
1978
+ return /* @__PURE__ */ jsx40(
1979
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
1980
+ {
1981
+ "data-slot": "scroll-area-scrollbar",
1982
+ orientation,
1983
+ className: cn(
1984
+ "flex touch-none p-px transition-colors select-none",
1985
+ orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent",
1986
+ orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent",
1987
+ className
1988
+ ),
1989
+ ...props,
1990
+ children: /* @__PURE__ */ jsx40(
1991
+ ScrollAreaPrimitive.ScrollAreaThumb,
1992
+ {
1993
+ "data-slot": "scroll-area-thumb",
1994
+ className: "relative flex-1 rounded-full bg-border"
1995
+ }
1996
+ )
1997
+ }
1998
+ );
1999
+ }
2000
+
2001
+ // src/sheet.tsx
2002
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
2003
+ import { jsx as jsx41, jsxs as jsxs15 } from "react/jsx-runtime";
2004
+ function Sheet({ ...props }) {
2005
+ return /* @__PURE__ */ jsx41(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
2006
+ }
2007
+ function SheetTrigger({
2008
+ ...props
2009
+ }) {
2010
+ return /* @__PURE__ */ jsx41(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
2011
+ }
2012
+ function SheetClose({
2013
+ ...props
2014
+ }) {
2015
+ return /* @__PURE__ */ jsx41(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
2016
+ }
2017
+ function SheetPortal({
2018
+ ...props
2019
+ }) {
2020
+ return /* @__PURE__ */ jsx41(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
2021
+ }
2022
+ function SheetOverlay({
2023
+ className,
2024
+ ...props
2025
+ }) {
2026
+ return /* @__PURE__ */ jsx41(
2027
+ SheetPrimitive.Overlay,
2028
+ {
2029
+ "data-slot": "sheet-overlay",
2030
+ className: cn(
2031
+ "fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",
2032
+ className
2033
+ ),
2034
+ ...props
2035
+ }
2036
+ );
2037
+ }
2038
+ function SheetContent({
2039
+ className,
2040
+ children,
2041
+ side = "right",
2042
+ showCloseButton = true,
2043
+ ...props
2044
+ }) {
2045
+ return /* @__PURE__ */ jsxs15(SheetPortal, { children: [
2046
+ /* @__PURE__ */ jsx41(SheetOverlay, {}),
2047
+ /* @__PURE__ */ jsxs15(
2048
+ SheetPrimitive.Content,
2049
+ {
2050
+ "data-slot": "sheet-content",
2051
+ className: cn(
2052
+ "fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500",
2053
+ side === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
2054
+ side === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
2055
+ side === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
2056
+ side === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
2057
+ className
2058
+ ),
2059
+ ...props,
2060
+ children: [
2061
+ children,
2062
+ showCloseButton && /* @__PURE__ */ jsxs15(SheetPrimitive.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
2063
+ /* @__PURE__ */ jsx41("span", { "aria-hidden": "true", className: "text-base leading-none", children: "\xD7" }),
2064
+ /* @__PURE__ */ jsx41("span", { className: "sr-only", children: "Close" })
2065
+ ] })
2066
+ ]
2067
+ }
2068
+ )
2069
+ ] });
2070
+ }
2071
+ function SheetHeader({ className, ...props }) {
2072
+ return /* @__PURE__ */ jsx41(
2073
+ "div",
2074
+ {
2075
+ "data-slot": "sheet-header",
2076
+ className: cn("flex flex-col gap-1.5 p-4", className),
2077
+ ...props
2078
+ }
2079
+ );
2080
+ }
2081
+ function SheetFooter({ className, ...props }) {
2082
+ return /* @__PURE__ */ jsx41(
2083
+ "div",
2084
+ {
2085
+ "data-slot": "sheet-footer",
2086
+ className: cn("mt-auto flex flex-col gap-2 p-4", className),
2087
+ ...props
2088
+ }
2089
+ );
2090
+ }
2091
+ function SheetTitle({
2092
+ className,
2093
+ ...props
2094
+ }) {
2095
+ return /* @__PURE__ */ jsx41(
2096
+ SheetPrimitive.Title,
2097
+ {
2098
+ "data-slot": "sheet-title",
2099
+ className: cn("font-semibold text-foreground", className),
2100
+ ...props
2101
+ }
2102
+ );
2103
+ }
2104
+ function SheetDescription({
2105
+ className,
2106
+ ...props
2107
+ }) {
2108
+ return /* @__PURE__ */ jsx41(
2109
+ SheetPrimitive.Description,
2110
+ {
2111
+ "data-slot": "sheet-description",
2112
+ className: cn("text-sm text-muted-foreground", className),
2113
+ ...props
2114
+ }
2115
+ );
2116
+ }
2117
+
2118
+ // src/use-toast.ts
2119
+ function useToast() {
2120
+ return {
2121
+ toast(input) {
2122
+ if (typeof window === "undefined") return;
2123
+ window.dispatchEvent(new CustomEvent("boring-ui:toast", { detail: input }));
2124
+ }
2125
+ };
2126
+ }
2127
+
2128
+ // src/hover-card.tsx
2129
+ import * as React8 from "react";
2130
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
2131
+ import { jsx as jsx42 } from "react/jsx-runtime";
2132
+ var HoverCard = HoverCardPrimitive.Root;
2133
+ var HoverCardTrigger = HoverCardPrimitive.Trigger;
2134
+ var HoverCardContent = React8.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx42(
2135
+ HoverCardPrimitive.Content,
2136
+ {
2137
+ ref,
2138
+ align,
2139
+ sideOffset,
2140
+ className: cn(
2141
+ "z-50 w-64 origin-[--radix-hover-card-content-transform-origin] rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
2142
+ className
2143
+ ),
2144
+ ...props
2145
+ }
2146
+ ));
2147
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
2148
+
2149
+ // src/collapsible.tsx
2150
+ import * as CollapsiblePrimitive2 from "@radix-ui/react-collapsible";
2151
+ var Collapsible = CollapsiblePrimitive2.Root;
2152
+ var CollapsibleTrigger2 = CollapsiblePrimitive2.CollapsibleTrigger;
2153
+ var CollapsibleContent2 = CollapsiblePrimitive2.CollapsibleContent;
2154
+
2155
+ // src/button-group.tsx
2156
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
2157
+ import { cva as cva4 } from "class-variance-authority";
2158
+ import { jsx as jsx43 } from "react/jsx-runtime";
2159
+ var buttonGroupVariants = cva4(
2160
+ "flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
2161
+ {
2162
+ variants: {
2163
+ orientation: {
2164
+ horizontal: "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
2165
+ vertical: "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"
2166
+ }
2167
+ },
2168
+ defaultVariants: { orientation: "horizontal" }
2169
+ }
2170
+ );
2171
+ function ButtonGroup({
2172
+ className,
2173
+ orientation,
2174
+ ...props
2175
+ }) {
2176
+ return /* @__PURE__ */ jsx43(
2177
+ "div",
2178
+ {
2179
+ role: "group",
2180
+ "data-slot": "button-group",
2181
+ "data-orientation": orientation,
2182
+ className: cn(buttonGroupVariants({ orientation }), className),
2183
+ ...props
2184
+ }
2185
+ );
2186
+ }
2187
+ function ButtonGroupText({
2188
+ className,
2189
+ asChild = false,
2190
+ ...props
2191
+ }) {
2192
+ const Comp = asChild ? Slot3 : "div";
2193
+ return /* @__PURE__ */ jsx43(
2194
+ Comp,
2195
+ {
2196
+ className: cn(
2197
+ "flex items-center gap-2 rounded-md border bg-muted px-4 text-sm font-medium shadow-xs [&_svg:not([class*=size-])]:size-4 [&_svg]:pointer-events-none",
2198
+ className
2199
+ ),
2200
+ ...props
2201
+ }
2202
+ );
2203
+ }
2204
+ function ButtonGroupSeparator({
2205
+ className,
2206
+ orientation = "vertical",
2207
+ ...props
2208
+ }) {
2209
+ return /* @__PURE__ */ jsx43(
2210
+ Separator,
2211
+ {
2212
+ "data-slot": "button-group-separator",
2213
+ orientation,
2214
+ className: cn("relative !m-0 self-stretch bg-input data-[orientation=vertical]:h-auto", className),
2215
+ ...props
2216
+ }
2217
+ );
2218
+ }
2219
+
2220
+ // src/input-group.tsx
2221
+ import { cva as cva5 } from "class-variance-authority";
2222
+ import { jsx as jsx44 } from "react/jsx-runtime";
2223
+ function InputGroup({ className, ...props }) {
2224
+ return /* @__PURE__ */ jsx44(
2225
+ "div",
2226
+ {
2227
+ "data-slot": "input-group",
2228
+ role: "group",
2229
+ className: cn(
2230
+ "group/input-group relative flex h-9 w-full items-center rounded-md border border-[color:oklch(from_var(--border)_l_c_h/0.65)] shadow-xs outline-none transition-[color,box-shadow] dark:bg-input/30",
2231
+ "has-[>textarea]:h-auto",
2232
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2 has-[>[data-align=inline-end]]:[&>input]:pr-2",
2233
+ "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3",
2234
+ "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
2235
+ "has-[[data-slot=input-group-control]:focus-visible]:ring-1 has-[[data-slot=input-group-control]:focus-visible]:ring-ring",
2236
+ "has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40",
2237
+ className
2238
+ ),
2239
+ ...props
2240
+ }
2241
+ );
2242
+ }
2243
+ var inputGroupAddonVariants = cva5(
2244
+ "flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*=size-])]:size-4",
2245
+ {
2246
+ variants: {
2247
+ align: {
2248
+ "inline-start": "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
2249
+ "inline-end": "order-last pr-3 has-[>button]:mr-[-0.4rem] has-[>kbd]:mr-[-0.35rem]",
2250
+ "block-start": "[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5",
2251
+ "block-end": "[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5"
2252
+ }
2253
+ },
2254
+ defaultVariants: { align: "inline-start" }
2255
+ }
2256
+ );
2257
+ function InputGroupAddon({
2258
+ className,
2259
+ align = "inline-start",
2260
+ ...props
2261
+ }) {
2262
+ return /* @__PURE__ */ jsx44(
2263
+ "div",
2264
+ {
2265
+ role: "group",
2266
+ "data-slot": "input-group-addon",
2267
+ "data-align": align,
2268
+ className: cn(inputGroupAddonVariants({ align }), className),
2269
+ onClick: (e) => {
2270
+ if (e.target.closest("button")) return;
2271
+ e.currentTarget.parentElement?.querySelector("input")?.focus();
2272
+ },
2273
+ ...props
2274
+ }
2275
+ );
2276
+ }
2277
+ var inputGroupButtonVariants = cva5("flex items-center gap-2 text-sm shadow-none", {
2278
+ variants: {
2279
+ size: {
2280
+ xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*=size-])]:size-3.5",
2281
+ sm: "h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5",
2282
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
2283
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0"
2284
+ }
2285
+ },
2286
+ defaultVariants: { size: "xs" }
2287
+ });
2288
+ function InputGroupButton({
2289
+ className,
2290
+ type = "button",
2291
+ variant = "ghost",
2292
+ size = "xs",
2293
+ ...props
2294
+ }) {
2295
+ return /* @__PURE__ */ jsx44(Button, { type, "data-size": size, variant, className: cn(inputGroupButtonVariants({ size }), className), ...props });
2296
+ }
2297
+ function InputGroupText({ className, ...props }) {
2298
+ return /* @__PURE__ */ jsx44(
2299
+ "span",
2300
+ {
2301
+ className: cn("flex items-center gap-2 text-sm text-muted-foreground [&_svg:not([class*=size-])]:size-4 [&_svg]:pointer-events-none", className),
2302
+ ...props
2303
+ }
2304
+ );
2305
+ }
2306
+ function InputGroupInput({ className, ...props }) {
2307
+ return /* @__PURE__ */ jsx44(
2308
+ Input,
2309
+ {
2310
+ "data-slot": "input-group-control",
2311
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent", className),
2312
+ ...props
2313
+ }
2314
+ );
2315
+ }
2316
+ function InputGroupTextarea({ className, ...props }) {
2317
+ return /* @__PURE__ */ jsx44(
2318
+ Textarea,
2319
+ {
2320
+ "data-slot": "input-group-control",
2321
+ className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent", className),
2322
+ ...props
2323
+ }
2324
+ );
2325
+ }
2326
+ export {
2327
+ AlertDialog,
2328
+ AlertDialogAction,
2329
+ AlertDialogCancel,
2330
+ AlertDialogContent,
2331
+ AlertDialogDescription,
2332
+ AlertDialogFooter,
2333
+ AlertDialogHeader,
2334
+ AlertDialogMedia,
2335
+ AlertDialogOverlay,
2336
+ AlertDialogPortal,
2337
+ AlertDialogTitle,
2338
+ AlertDialogTrigger,
2339
+ Avatar,
2340
+ AvatarFallback,
2341
+ Badge,
2342
+ Button,
2343
+ ButtonGroup,
2344
+ ButtonGroupSeparator,
2345
+ ButtonGroupText,
2346
+ Card,
2347
+ CardAction,
2348
+ CardContent,
2349
+ CardDescription,
2350
+ CardFooter,
2351
+ CardHeader,
2352
+ CardTitle,
2353
+ Checkbox,
2354
+ Chip,
2355
+ ChipButton,
2356
+ ChipRemove,
2357
+ Collapsible,
2358
+ CollapsibleContent2 as CollapsibleContent,
2359
+ CollapsibleTrigger2 as CollapsibleTrigger,
2360
+ Command,
2361
+ CommandDialog,
2362
+ CommandEmpty,
2363
+ CommandGroup,
2364
+ CommandInput,
2365
+ CommandItem,
2366
+ CommandList,
2367
+ CommandSeparator,
2368
+ CommandShortcut,
2369
+ DetailLine,
2370
+ DetailList,
2371
+ Dialog,
2372
+ DialogClose,
2373
+ DialogContent,
2374
+ DialogDescription,
2375
+ DialogFooter,
2376
+ DialogHeader,
2377
+ DialogOverlay,
2378
+ DialogPortal,
2379
+ DialogTitle,
2380
+ DialogTrigger,
2381
+ Disclosure,
2382
+ DisclosureChevron,
2383
+ DisclosureContent,
2384
+ DisclosureTrigger,
2385
+ DropdownMenu,
2386
+ DropdownMenuCheckboxItem,
2387
+ DropdownMenuContent,
2388
+ DropdownMenuGroup,
2389
+ DropdownMenuItem,
2390
+ DropdownMenuLabel,
2391
+ DropdownMenuPortal,
2392
+ DropdownMenuRadioGroup,
2393
+ DropdownMenuRadioItem,
2394
+ DropdownMenuSeparator,
2395
+ DropdownMenuShortcut,
2396
+ DropdownMenuSub,
2397
+ DropdownMenuSubContent,
2398
+ DropdownMenuSubTrigger,
2399
+ DropdownMenuTrigger,
2400
+ EmptyState,
2401
+ ErrorState,
2402
+ Field,
2403
+ FieldDescription,
2404
+ FieldError,
2405
+ FieldLabel,
2406
+ FloatingPanel,
2407
+ FloatingPanelBody,
2408
+ FloatingPanelHeader,
2409
+ HoverCard,
2410
+ HoverCardContent,
2411
+ HoverCardTrigger,
2412
+ IconButton,
2413
+ InitialsAvatar,
2414
+ InlineCode,
2415
+ Input,
2416
+ InputGroup,
2417
+ InputGroupAddon,
2418
+ InputGroupButton,
2419
+ InputGroupInput,
2420
+ InputGroupText,
2421
+ InputGroupTextarea,
2422
+ Kbd,
2423
+ Label3 as Label,
2424
+ List2 as List,
2425
+ ListRow,
2426
+ ListRowActions,
2427
+ ListRowDescription,
2428
+ ListRowMain,
2429
+ ListRowMeta,
2430
+ ListRowTitle,
2431
+ LoadingState,
2432
+ Notice,
2433
+ Pane,
2434
+ PaneBody,
2435
+ PaneDescription,
2436
+ PaneFooter,
2437
+ PaneHeader,
2438
+ PaneTitle,
2439
+ PaneToolbar,
2440
+ Popover,
2441
+ PopoverAnchor,
2442
+ PopoverContent,
2443
+ PopoverDescription,
2444
+ PopoverHeader,
2445
+ PopoverTitle,
2446
+ PopoverTrigger,
2447
+ ResizeHandle,
2448
+ ScrollArea,
2449
+ ScrollBar,
2450
+ SegmentedControl,
2451
+ SegmentedControlItem,
2452
+ Select,
2453
+ SelectContent,
2454
+ SelectGroup,
2455
+ SelectItem,
2456
+ SelectLabel,
2457
+ SelectScrollDownButton,
2458
+ SelectScrollUpButton,
2459
+ SelectSeparator,
2460
+ SelectTrigger,
2461
+ SelectValue,
2462
+ Separator,
2463
+ SettingsActionRow,
2464
+ SettingsNav,
2465
+ SettingsPageHeader,
2466
+ SettingsPanel,
2467
+ Sheet,
2468
+ SheetClose,
2469
+ SheetContent,
2470
+ SheetDescription,
2471
+ SheetFooter,
2472
+ SheetHeader,
2473
+ SheetTitle,
2474
+ SheetTrigger,
2475
+ Skeleton,
2476
+ Spinner,
2477
+ StatusBadge,
2478
+ Tabs,
2479
+ TabsContent,
2480
+ TabsList,
2481
+ TabsTrigger,
2482
+ Textarea,
2483
+ Toaster,
2484
+ Toolbar,
2485
+ ToolbarButton,
2486
+ ToolbarGroup,
2487
+ ToolbarSeparator,
2488
+ Tooltip,
2489
+ TooltipContent,
2490
+ TooltipProvider,
2491
+ TooltipTrigger,
2492
+ badgeVariants,
2493
+ buttonGroupVariants,
2494
+ buttonVariants,
2495
+ clearToasts,
2496
+ cn,
2497
+ dismissToast,
2498
+ getActiveToasts,
2499
+ subscribeToasts,
2500
+ tabsListVariants,
2501
+ toast,
2502
+ useToast
2503
+ };