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