@northslopetech/altitude-ui 3.0.0 → 3.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.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/components/ui/alert.tsx
2
- import * as React from "react";
3
- import { cva as cva2 } from "class-variance-authority";
2
+ import * as React2 from "react";
3
+ import { cva as cva3 } from "class-variance-authority";
4
4
 
5
5
  // src/lib/utils.ts
6
6
  import { clsx } from "clsx";
@@ -70,124 +70,6 @@ function cn(...inputs) {
70
70
  return twMerge(clsx(inputs));
71
71
  }
72
72
 
73
- // src/components/ui/alert.tsx
74
- import { jsx } from "react/jsx-runtime";
75
- var alertVariants = cva2(
76
- "relative flex flex-wrap w-full items-center data-[multiline]:items-start gap-4 rounded-md border px-4 py-3 [&>[data-slot=alert-body]>svg]:size-4 [&>[data-slot=alert-body]>svg]:shrink-0",
77
- {
78
- variants: {
79
- variant: {
80
- default: "surface-default border-default [&>[data-slot=alert-body]>svg]:text-default",
81
- info: "surface-info border-info [&>[data-slot=alert-body]>svg]:text-info",
82
- success: "surface-success border-success [&>[data-slot=alert-body]>svg]:text-success",
83
- warning: "surface-warning border-warning [&>[data-slot=alert-body]>svg]:text-warning",
84
- error: "surface-error border-error [&>[data-slot=alert-body]>svg]:text-error"
85
- }
86
- },
87
- defaultVariants: {
88
- variant: "default"
89
- }
90
- }
91
- );
92
- function Alert({ className, variant, ref, ...props }) {
93
- return /* @__PURE__ */ jsx(
94
- "div",
95
- {
96
- ref,
97
- "data-slot": "alert",
98
- role: variant === "warning" || variant === "error" ? "alert" : "status",
99
- className: cn(alertVariants({ variant }), className),
100
- ...props
101
- }
102
- );
103
- }
104
- function AlertBody({ className, ref, ...props }) {
105
- return /* @__PURE__ */ jsx(
106
- "div",
107
- {
108
- ref,
109
- "data-slot": "alert-body",
110
- className: cn(
111
- "grid flex-1 min-w-0 grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 items-start [&>svg]:col-start-1 [&>svg]:row-start-1 [&>svg]:mt-0.5",
112
- className
113
- ),
114
- ...props
115
- }
116
- );
117
- }
118
- function AlertTitle({ className, ref, ...props }) {
119
- return /* @__PURE__ */ jsx(
120
- "p",
121
- {
122
- ref,
123
- "data-slot": "alert-title",
124
- className: cn(
125
- "col-start-2 row-start-1 type-body-sm-medium text-default",
126
- className
127
- ),
128
- ...props
129
- }
130
- );
131
- }
132
- function AlertDescription({
133
- className,
134
- ref: externalRef,
135
- ...props
136
- }) {
137
- const localRef = React.useRef(null);
138
- React.useLayoutEffect(() => {
139
- const el = localRef.current;
140
- if (!el) return;
141
- const alert = el.closest("[data-slot=alert]");
142
- if (!alert) return;
143
- const update = () => {
144
- const lineHeight = parseFloat(getComputedStyle(el).lineHeight);
145
- alert.toggleAttribute(
146
- "data-multiline",
147
- el.clientHeight > lineHeight * 1.5
148
- );
149
- };
150
- update();
151
- const resizeObserver = new ResizeObserver(update);
152
- resizeObserver.observe(el);
153
- return () => {
154
- resizeObserver.disconnect();
155
- alert.removeAttribute("data-multiline");
156
- };
157
- }, []);
158
- return /* @__PURE__ */ jsx(
159
- "p",
160
- {
161
- ref: (node) => {
162
- localRef.current = node;
163
- if (typeof externalRef === "function") externalRef(node);
164
- else if (externalRef)
165
- externalRef.current = node;
166
- },
167
- "data-slot": "alert-description",
168
- className: cn(
169
- "col-start-2 type-body-sm-regular text-secondary",
170
- className
171
- ),
172
- ...props
173
- }
174
- );
175
- }
176
- function AlertActions({ className, ref, ...props }) {
177
- return /* @__PURE__ */ jsx(
178
- "div",
179
- {
180
- ref,
181
- "data-slot": "alert-actions",
182
- className: cn("shrink-0 flex items-center gap-2", className),
183
- ...props
184
- }
185
- );
186
- }
187
-
188
- // src/components/ui/accordion.tsx
189
- import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion";
190
-
191
73
  // src/components/ui/icons.tsx
192
74
  import { LockIcon as PhosphorLock } from "@phosphor-icons/react/Lock";
193
75
  import { CheckIcon as PhosphorCheck } from "@phosphor-icons/react/Check";
@@ -248,7 +130,7 @@ import { SquaresFourIcon as PhosphorSquaresFour } from "@phosphor-icons/react/Sq
248
130
  import { MagnifyingGlassPlusIcon as PhosphorMagnifyingGlassPlus } from "@phosphor-icons/react/MagnifyingGlassPlus";
249
131
  import { MagnifyingGlassMinusIcon as PhosphorMagnifyingGlassMinus } from "@phosphor-icons/react/MagnifyingGlassMinus";
250
132
  import { SidebarSimpleIcon as PhosphorSidebarSimple } from "@phosphor-icons/react/SidebarSimple";
251
- import { jsx as jsx2 } from "react/jsx-runtime";
133
+ import { jsx } from "react/jsx-runtime";
252
134
  function createIcon(PhosphorIcon) {
253
135
  function Wrapped({
254
136
  className,
@@ -257,7 +139,7 @@ function createIcon(PhosphorIcon) {
257
139
  ref,
258
140
  ...props
259
141
  }) {
260
- return /* @__PURE__ */ jsx2(
142
+ return /* @__PURE__ */ jsx(
261
143
  PhosphorIcon,
262
144
  {
263
145
  ref,
@@ -331,81 +213,12 @@ var PanelIcon = createIcon(PhosphorSidebarSimple);
331
213
  var ZoomInIcon = createIcon(PhosphorMagnifyingGlassPlus);
332
214
  var ZoomOutIcon = createIcon(PhosphorMagnifyingGlassMinus);
333
215
 
334
- // src/components/ui/accordion.tsx
335
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
336
- function Accordion({ className, ref, ...props }) {
337
- return /* @__PURE__ */ jsx3(
338
- AccordionPrimitive.Root,
339
- {
340
- ref,
341
- "data-slot": "accordion",
342
- className: cn("flex w-full flex-col", className),
343
- ...props
344
- }
345
- );
346
- }
347
- function AccordionItem({ className, ref, ...props }) {
348
- return /* @__PURE__ */ jsx3(
349
- AccordionPrimitive.Item,
350
- {
351
- ref,
352
- "data-slot": "accordion-item",
353
- className: cn("border-b border-muted", className),
354
- ...props
355
- }
356
- );
357
- }
358
- function AccordionTrigger({
359
- className,
360
- children,
361
- ref,
362
- ...props
363
- }) {
364
- return /* @__PURE__ */ jsx3(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
365
- AccordionPrimitive.Trigger,
366
- {
367
- ref,
368
- "data-slot": "accordion-trigger",
369
- className: cn(
370
- "group/accordion-trigger flex flex-1 items-center justify-between py-4 type-body-sm-medium text-default outline-none focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-focus-default data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
371
- className
372
- ),
373
- ...props,
374
- children: [
375
- children,
376
- /* @__PURE__ */ jsx3(CaretDownIcon, { className: "shrink-0 text-secondary group-data-[panel-open]/accordion-trigger:hidden" }),
377
- /* @__PURE__ */ jsx3(CaretUpIcon, { className: "hidden shrink-0 text-secondary group-data-[panel-open]/accordion-trigger:block" })
378
- ]
379
- }
380
- ) });
381
- }
382
- function AccordionContent({
383
- className,
384
- children,
385
- ref,
386
- ...props
387
- }) {
388
- return /* @__PURE__ */ jsx3(
389
- AccordionPrimitive.Panel,
390
- {
391
- ref,
392
- "data-slot": "accordion-content",
393
- className: cn(
394
- "h-(--accordion-panel-height) overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0",
395
- className
396
- ),
397
- ...props,
398
- children: /* @__PURE__ */ jsx3("div", { className: "pb-4 type-body-sm-regular text-default", children })
399
- }
400
- );
401
- }
402
-
403
216
  // src/components/ui/button.tsx
404
- import * as React2 from "react";
217
+ import * as React from "react";
405
218
  import { Button as ButtonPrimitive } from "@base-ui/react/button";
406
- import { cva as cva3 } from "class-variance-authority";
407
- import { jsx as jsx4 } from "react/jsx-runtime";
408
- var buttonVariants = cva3(
219
+ import { cva as cva2 } from "class-variance-authority";
220
+ import { jsx as jsx2 } from "react/jsx-runtime";
221
+ var buttonVariants = cva2(
409
222
  [
410
223
  // Base layout
411
224
  "inline-flex items-center justify-center gap-2 whitespace-nowrap",
@@ -451,7 +264,7 @@ var buttonVariants = cva3(
451
264
  ],
452
265
  "destructive-subtle": [
453
266
  // Base
454
- "interactive-default text-error shadow-xs",
267
+ "interactive-destructive-subtle interactive-destructive-subtle-fg shadow-xs",
455
268
  "border border-default",
456
269
  // Hover & active
457
270
  "hover:interactive-hover",
@@ -515,7 +328,7 @@ var buttonVariants = cva3(
515
328
  }
516
329
  }
517
330
  );
518
- var hasTextChildren = (children) => React2.Children.toArray(children).some(
331
+ var hasTextChildren = (children) => React.Children.toArray(children).some(
519
332
  (child) => typeof child === "string" && child.trim().length > 0
520
333
  );
521
334
  function Button({
@@ -529,7 +342,7 @@ function Button({
529
342
  }) {
530
343
  const isIconOnly = !hasTextChildren(children);
531
344
  const iconOnlyClasses = isIconOnly ? "aspect-square px-0 py-0" : void 0;
532
- return /* @__PURE__ */ jsx4(
345
+ return /* @__PURE__ */ jsx2(
533
346
  ButtonPrimitive,
534
347
  {
535
348
  "data-slot": "button",
@@ -546,85 +359,285 @@ function Button({
546
359
  );
547
360
  }
548
361
 
549
- // src/components/ui/button-group.tsx
550
- import * as React3 from "react";
551
- import { mergeProps } from "@base-ui/react/merge-props";
552
- import { useRender } from "@base-ui/react/use-render";
553
- import { cva as cva4 } from "class-variance-authority";
554
-
555
- // src/components/ui/separator.tsx
556
- import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
557
- import { jsx as jsx5 } from "react/jsx-runtime";
558
- function Separator({
559
- className,
560
- orientation = "horizontal",
561
- ref,
562
- ...props
563
- }) {
564
- return /* @__PURE__ */ jsx5(
565
- SeparatorPrimitive,
566
- {
567
- ref,
568
- "data-slot": "separator",
569
- orientation,
570
- className: cn(
571
- "shrink-0 border-0 border-default data-[orientation=horizontal]:border-t data-[orientation=horizontal]:h-0 data-[orientation=horizontal]:w-full data-[orientation=vertical]:border-l data-[orientation=vertical]:h-full data-[orientation=vertical]:w-0",
572
- className
573
- ),
574
- ...props
575
- }
576
- );
577
- }
578
-
579
- // src/components/ui/button-group.tsx
580
- import { jsx as jsx6 } from "react/jsx-runtime";
581
- var ButtonGroupContext = React3.createContext(
582
- "horizontal"
583
- );
584
- var buttonGroupVariants = cva4(
585
- "flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2",
362
+ // src/components/ui/alert.tsx
363
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
364
+ var alertVariants = cva3(
365
+ "relative flex flex-wrap w-full items-center data-[multiline]:items-start gap-4 rounded-md px-4 py-3 [&>[data-slot=alert-body]>svg]:size-4 [&>[data-slot=alert-body]>svg]:shrink-0",
586
366
  {
587
367
  variants: {
588
368
  variant: {
589
- outlined: "",
590
- ghost: "[&>[data-slot]:not([data-slot='button-group-separator'])]:border-0 [&>[data-slot]:not([data-slot='button-group-separator'])]:shadow-none"
591
- },
592
- orientation: {
593
- horizontal: [
594
- "[&>[data-slot]:not(:last-child)]:rounded-r-none",
595
- "[&>[data-slot]:not(:first-child)]:rounded-l-none",
596
- "[&>[data-slot]:not([data-slot='button-group-separator']):not(:first-child)]:border-l-0"
597
- ].join(" "),
598
- vertical: [
599
- "flex-col",
600
- "[&>[data-slot]:not(:last-child)]:rounded-b-none",
601
- "[&>[data-slot]:not(:first-child)]:rounded-t-none",
602
- "[&>[data-slot]:not([data-slot='button-group-separator']):not(:first-child)]:border-t-0"
603
- ].join(" ")
369
+ default: "surface-secondary [&>[data-slot=alert-body]>svg]:text-default",
370
+ info: "surface-info border-info [&>[data-slot=alert-body]>svg]:text-info",
371
+ success: "surface-success border-success [&>[data-slot=alert-body]>svg]:text-success",
372
+ warning: "surface-warning border-warning [&>[data-slot=alert-body]>svg]:text-warning",
373
+ error: "surface-error border-error [&>[data-slot=alert-body]>svg]:text-error"
604
374
  }
605
375
  },
606
376
  defaultVariants: {
607
- variant: "outlined",
608
- orientation: "horizontal"
377
+ variant: "default"
609
378
  }
610
379
  }
611
380
  );
612
- function ButtonGroup({
613
- className,
614
- variant,
615
- orientation,
616
- children,
617
- ref,
618
- ...props
619
- }) {
620
- return /* @__PURE__ */ jsx6(ButtonGroupContext, { value: orientation ?? "horizontal", children: /* @__PURE__ */ jsx6(
381
+ function Alert({ className, variant, onDismiss, ref, ...props }) {
382
+ return /* @__PURE__ */ jsxs(
621
383
  "div",
622
384
  {
623
- role: "group",
624
- "data-slot": "button-group",
625
- "data-variant": variant ?? "outlined",
626
- "data-orientation": orientation ?? "horizontal",
627
- className: cn(buttonGroupVariants({ variant, orientation }), className),
385
+ ref,
386
+ "data-slot": "alert",
387
+ role: variant === "warning" || variant === "error" ? "alert" : "status",
388
+ className: cn(alertVariants({ variant }), className),
389
+ ...props,
390
+ children: [
391
+ props.children,
392
+ onDismiss && /* @__PURE__ */ jsx3(
393
+ Button,
394
+ {
395
+ type: "button",
396
+ variant: "ghost",
397
+ size: "mini",
398
+ "aria-label": "Dismiss",
399
+ onClick: onDismiss,
400
+ className: "shrink-0 self-start",
401
+ children: /* @__PURE__ */ jsx3(CloseIcon, { size: 16 })
402
+ }
403
+ )
404
+ ]
405
+ }
406
+ );
407
+ }
408
+ function AlertBody({ className, ref, ...props }) {
409
+ return /* @__PURE__ */ jsx3(
410
+ "div",
411
+ {
412
+ ref,
413
+ "data-slot": "alert-body",
414
+ className: cn(
415
+ "grid flex-1 min-w-0 grid-cols-1 gap-y-0.5 items-start [&:has(>svg)]:grid-cols-[auto_1fr] [&:has(>svg)]:gap-x-3 [&>svg]:col-start-1 [&>svg]:row-start-1 [&>svg]:mt-0.5",
416
+ className
417
+ ),
418
+ ...props
419
+ }
420
+ );
421
+ }
422
+ function AlertTitle({ className, ref, ...props }) {
423
+ return /* @__PURE__ */ jsx3(
424
+ "p",
425
+ {
426
+ ref,
427
+ "data-slot": "alert-title",
428
+ className: cn(
429
+ "row-start-1 type-body-sm-medium text-default [div:has(>svg)>&]:col-start-2",
430
+ className
431
+ ),
432
+ ...props
433
+ }
434
+ );
435
+ }
436
+ function AlertDescription({
437
+ className,
438
+ ref: externalRef,
439
+ ...props
440
+ }) {
441
+ const localRef = React2.useRef(null);
442
+ React2.useLayoutEffect(() => {
443
+ const el = localRef.current;
444
+ if (!el) return;
445
+ const alert = el.closest("[data-slot=alert]");
446
+ if (!alert) return;
447
+ const update = () => {
448
+ const lineHeight = parseFloat(getComputedStyle(el).lineHeight);
449
+ alert.toggleAttribute(
450
+ "data-multiline",
451
+ el.clientHeight > lineHeight * 1.5
452
+ );
453
+ };
454
+ update();
455
+ const resizeObserver = new ResizeObserver(update);
456
+ resizeObserver.observe(el);
457
+ return () => {
458
+ resizeObserver.disconnect();
459
+ alert.removeAttribute("data-multiline");
460
+ };
461
+ }, []);
462
+ return /* @__PURE__ */ jsx3(
463
+ "p",
464
+ {
465
+ ref: (node) => {
466
+ localRef.current = node;
467
+ if (typeof externalRef === "function") externalRef(node);
468
+ else if (externalRef)
469
+ externalRef.current = node;
470
+ },
471
+ "data-slot": "alert-description",
472
+ className: cn(
473
+ "type-body-sm-regular text-secondary [div:has(>svg)>&]:col-start-2",
474
+ className
475
+ ),
476
+ ...props
477
+ }
478
+ );
479
+ }
480
+ function AlertActions({ className, ref, ...props }) {
481
+ return /* @__PURE__ */ jsx3(
482
+ "div",
483
+ {
484
+ ref,
485
+ "data-slot": "alert-actions",
486
+ className: cn("shrink-0 flex items-center gap-2", className),
487
+ ...props
488
+ }
489
+ );
490
+ }
491
+
492
+ // src/components/ui/accordion.tsx
493
+ import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion";
494
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
495
+ function Accordion({ className, ref, ...props }) {
496
+ return /* @__PURE__ */ jsx4(
497
+ AccordionPrimitive.Root,
498
+ {
499
+ ref,
500
+ "data-slot": "accordion",
501
+ className: cn("flex w-full flex-col", className),
502
+ ...props
503
+ }
504
+ );
505
+ }
506
+ function AccordionItem({ className, ref, ...props }) {
507
+ return /* @__PURE__ */ jsx4(
508
+ AccordionPrimitive.Item,
509
+ {
510
+ ref,
511
+ "data-slot": "accordion-item",
512
+ className: cn("border-b border-muted", className),
513
+ ...props
514
+ }
515
+ );
516
+ }
517
+ function AccordionTrigger({
518
+ className,
519
+ children,
520
+ ref,
521
+ ...props
522
+ }) {
523
+ return /* @__PURE__ */ jsx4(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs2(
524
+ AccordionPrimitive.Trigger,
525
+ {
526
+ ref,
527
+ "data-slot": "accordion-trigger",
528
+ className: cn(
529
+ "group/accordion-trigger flex flex-1 items-center justify-between py-4 type-body-sm-medium text-default outline-none focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-focus-default data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
530
+ className
531
+ ),
532
+ ...props,
533
+ children: [
534
+ children,
535
+ /* @__PURE__ */ jsx4(CaretDownIcon, { className: "shrink-0 text-secondary group-data-[panel-open]/accordion-trigger:hidden" }),
536
+ /* @__PURE__ */ jsx4(CaretUpIcon, { className: "hidden shrink-0 text-secondary group-data-[panel-open]/accordion-trigger:block" })
537
+ ]
538
+ }
539
+ ) });
540
+ }
541
+ function AccordionContent({
542
+ className,
543
+ children,
544
+ ref,
545
+ ...props
546
+ }) {
547
+ return /* @__PURE__ */ jsx4(
548
+ AccordionPrimitive.Panel,
549
+ {
550
+ ref,
551
+ "data-slot": "accordion-content",
552
+ className: cn(
553
+ "h-(--accordion-panel-height) overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0",
554
+ className
555
+ ),
556
+ ...props,
557
+ children: /* @__PURE__ */ jsx4("div", { className: "pb-4 type-body-sm-regular text-default", children })
558
+ }
559
+ );
560
+ }
561
+
562
+ // src/components/ui/button-group.tsx
563
+ import * as React3 from "react";
564
+ import { mergeProps } from "@base-ui/react/merge-props";
565
+ import { useRender } from "@base-ui/react/use-render";
566
+ import { cva as cva4 } from "class-variance-authority";
567
+
568
+ // src/components/ui/separator.tsx
569
+ import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
570
+ import { jsx as jsx5 } from "react/jsx-runtime";
571
+ function Separator({
572
+ className,
573
+ orientation = "horizontal",
574
+ ref,
575
+ ...props
576
+ }) {
577
+ return /* @__PURE__ */ jsx5(
578
+ SeparatorPrimitive,
579
+ {
580
+ ref,
581
+ "data-slot": "separator",
582
+ orientation,
583
+ className: cn(
584
+ "shrink-0 border-0 border-default data-[orientation=horizontal]:border-t data-[orientation=horizontal]:h-0 data-[orientation=horizontal]:w-full data-[orientation=vertical]:border-l data-[orientation=vertical]:h-full data-[orientation=vertical]:w-0",
585
+ className
586
+ ),
587
+ ...props
588
+ }
589
+ );
590
+ }
591
+
592
+ // src/components/ui/button-group.tsx
593
+ import { jsx as jsx6 } from "react/jsx-runtime";
594
+ var ButtonGroupContext = React3.createContext(
595
+ "horizontal"
596
+ );
597
+ var buttonGroupVariants = cva4(
598
+ "flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2",
599
+ {
600
+ variants: {
601
+ variant: {
602
+ outlined: "",
603
+ ghost: "[&>[data-slot]:not([data-slot='button-group-separator'])]:border-0 [&>[data-slot]:not([data-slot='button-group-separator'])]:shadow-none"
604
+ },
605
+ orientation: {
606
+ horizontal: [
607
+ "[&>[data-slot]:not(:last-child)]:rounded-r-none",
608
+ "[&>[data-slot]:not(:first-child)]:rounded-l-none",
609
+ "[&>[data-slot]:not([data-slot='button-group-separator']):not(:first-child)]:border-l-0"
610
+ ].join(" "),
611
+ vertical: [
612
+ "flex-col",
613
+ "[&>[data-slot]:not(:last-child)]:rounded-b-none",
614
+ "[&>[data-slot]:not(:first-child)]:rounded-t-none",
615
+ "[&>[data-slot]:not([data-slot='button-group-separator']):not(:first-child)]:border-t-0"
616
+ ].join(" ")
617
+ }
618
+ },
619
+ defaultVariants: {
620
+ variant: "outlined",
621
+ orientation: "horizontal"
622
+ }
623
+ }
624
+ );
625
+ function ButtonGroup({
626
+ className,
627
+ variant,
628
+ orientation,
629
+ children,
630
+ ref,
631
+ ...props
632
+ }) {
633
+ return /* @__PURE__ */ jsx6(ButtonGroupContext, { value: orientation ?? "horizontal", children: /* @__PURE__ */ jsx6(
634
+ "div",
635
+ {
636
+ role: "group",
637
+ "data-slot": "button-group",
638
+ "data-variant": variant ?? "outlined",
639
+ "data-orientation": orientation ?? "horizontal",
640
+ className: cn(buttonGroupVariants({ variant, orientation }), className),
628
641
  ref,
629
642
  ...props,
630
643
  children
@@ -690,10 +703,110 @@ function ButtonGroupSeparator({
690
703
  );
691
704
  }
692
705
 
693
- // src/components/ui/text.tsx
706
+ // src/components/ui/empty.tsx
694
707
  import { cva as cva5 } from "class-variance-authority";
695
708
  import { jsx as jsx7 } from "react/jsx-runtime";
696
- var textVariants = cva5("text-default", {
709
+ var emptyVariants = cva5("w-full rounded-md p-8 text-center", {
710
+ variants: {
711
+ variant: {
712
+ default: "",
713
+ outline: "border border-default",
714
+ background: "surface-muted",
715
+ "outline-dashed": "border border-dashed border-default"
716
+ }
717
+ },
718
+ defaultVariants: {
719
+ variant: "default"
720
+ }
721
+ });
722
+ var Empty = ({ className, variant, children, ref, ...props }) => /* @__PURE__ */ jsx7(
723
+ "div",
724
+ {
725
+ ref,
726
+ "data-slot": "empty",
727
+ className: cn(emptyVariants({ variant }), className),
728
+ ...props,
729
+ children: /* @__PURE__ */ jsx7("div", { className: "flex w-full flex-col items-center gap-4", children })
730
+ }
731
+ );
732
+ Empty.displayName = "Empty";
733
+ var emptyMediaVariants = cva5("flex shrink-0 items-center justify-center", {
734
+ variants: {
735
+ variant: {
736
+ default: "",
737
+ icon: "size-10 rounded-lg surface-secondary p-2"
738
+ }
739
+ },
740
+ defaultVariants: {
741
+ variant: "default"
742
+ }
743
+ });
744
+ var EmptyMedia = ({ className, variant, ...props }) => /* @__PURE__ */ jsx7(
745
+ "div",
746
+ {
747
+ "data-slot": "empty-media",
748
+ className: cn(emptyMediaVariants({ variant }), className),
749
+ ...props
750
+ }
751
+ );
752
+ EmptyMedia.displayName = "EmptyMedia";
753
+ var EmptyContent = ({ className, ref, ...props }) => /* @__PURE__ */ jsx7(
754
+ "div",
755
+ {
756
+ ref,
757
+ "data-slot": "empty-content",
758
+ className: cn("flex w-full flex-col gap-1", className),
759
+ ...props
760
+ }
761
+ );
762
+ EmptyContent.displayName = "EmptyContent";
763
+ var EmptyTitle = ({
764
+ className,
765
+ as: Component = "p",
766
+ ref,
767
+ ...props
768
+ }) => /* @__PURE__ */ jsx7(
769
+ Component,
770
+ {
771
+ ref,
772
+ "data-slot": "empty-title",
773
+ className: cn("type-body-md-medium text-default", className),
774
+ ...props
775
+ }
776
+ );
777
+ EmptyTitle.displayName = "EmptyTitle";
778
+ var EmptyDescription = ({
779
+ className,
780
+ ref,
781
+ ...props
782
+ }) => /* @__PURE__ */ jsx7(
783
+ "p",
784
+ {
785
+ ref,
786
+ "data-slot": "empty-description",
787
+ className: cn("type-body-sm text-secondary", className),
788
+ ...props
789
+ }
790
+ );
791
+ EmptyDescription.displayName = "EmptyDescription";
792
+ var EmptyActions = ({ className, ref, ...props }) => /* @__PURE__ */ jsx7(
793
+ "div",
794
+ {
795
+ ref,
796
+ "data-slot": "empty-actions",
797
+ className: cn(
798
+ "flex flex-wrap items-center justify-center gap-2",
799
+ className
800
+ ),
801
+ ...props
802
+ }
803
+ );
804
+ EmptyActions.displayName = "EmptyActions";
805
+
806
+ // src/components/ui/text.tsx
807
+ import { cva as cva6 } from "class-variance-authority";
808
+ import { jsx as jsx8 } from "react/jsx-runtime";
809
+ var textVariants = cva6("text-default", {
697
810
  variants: {
698
811
  variant: {
699
812
  // Headings
@@ -746,7 +859,7 @@ function getDefaultElement(variant) {
746
859
  }
747
860
  function Text({ className, variant, as, style, ref, ...props }) {
748
861
  const Component = as || getDefaultElement(variant);
749
- return /* @__PURE__ */ jsx7(
862
+ return /* @__PURE__ */ jsx8(
750
863
  Component,
751
864
  {
752
865
  className: cn(textVariants({ variant }), className),
@@ -758,9 +871,9 @@ function Text({ className, variant, as, style, ref, ...props }) {
758
871
  }
759
872
 
760
873
  // src/components/ui/card.tsx
761
- import { jsx as jsx8 } from "react/jsx-runtime";
874
+ import { jsx as jsx9 } from "react/jsx-runtime";
762
875
  function Card({ className, size = "default", ref, ...props }) {
763
- return /* @__PURE__ */ jsx8(
876
+ return /* @__PURE__ */ jsx9(
764
877
  "div",
765
878
  {
766
879
  ref,
@@ -775,7 +888,7 @@ function Card({ className, size = "default", ref, ...props }) {
775
888
  );
776
889
  }
777
890
  function CardHeader({ className, ref, ...props }) {
778
- return /* @__PURE__ */ jsx8(
891
+ return /* @__PURE__ */ jsx9(
779
892
  "div",
780
893
  {
781
894
  ref,
@@ -789,7 +902,7 @@ function CardHeader({ className, ref, ...props }) {
789
902
  );
790
903
  }
791
904
  function CardTitle({ className, ref, ...props }) {
792
- return /* @__PURE__ */ jsx8(
905
+ return /* @__PURE__ */ jsx9(
793
906
  Text,
794
907
  {
795
908
  ref,
@@ -801,7 +914,7 @@ function CardTitle({ className, ref, ...props }) {
801
914
  );
802
915
  }
803
916
  function CardDescription({ className, ref, ...props }) {
804
- return /* @__PURE__ */ jsx8(
917
+ return /* @__PURE__ */ jsx9(
805
918
  Text,
806
919
  {
807
920
  ref,
@@ -813,71 +926,380 @@ function CardDescription({ className, ref, ...props }) {
813
926
  );
814
927
  }
815
928
  function CardAction({ className, ref, ...props }) {
816
- return /* @__PURE__ */ jsx8(
929
+ return /* @__PURE__ */ jsx9(
930
+ "div",
931
+ {
932
+ ref,
933
+ "data-slot": "card-action",
934
+ className: cn(
935
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
936
+ className
937
+ ),
938
+ ...props
939
+ }
940
+ );
941
+ }
942
+ function CardContent({ className, bleed, ref, ...props }) {
943
+ return /* @__PURE__ */ jsx9(
944
+ "div",
945
+ {
946
+ ref,
947
+ "data-slot": "card-content",
948
+ className: cn(
949
+ bleed ? "px-0" : "px-6 group-data-[size=sm]/card:px-3",
950
+ className
951
+ ),
952
+ ...props
953
+ }
954
+ );
955
+ }
956
+ function CardFooter({ className, ref, ...props }) {
957
+ return /* @__PURE__ */ jsx9(
817
958
  "div",
818
959
  {
819
960
  ref,
820
- "data-slot": "card-action",
961
+ "data-slot": "card-footer",
962
+ className: cn(
963
+ "flex items-center px-6 py-6 group-data-[size=sm]/card:p-3",
964
+ className
965
+ ),
966
+ ...props
967
+ }
968
+ );
969
+ }
970
+
971
+ // src/components/ui/select.tsx
972
+ import { Select as SelectPrimitive } from "@base-ui/react/select";
973
+ import { cva as cva7 } from "class-variance-authority";
974
+ import { jsx as jsx10, jsxs as jsxs3 } from "react/jsx-runtime";
975
+ var selectTriggerVariants = cva7(
976
+ [
977
+ // Layout
978
+ "flex w-full items-center justify-between",
979
+ // Appearance
980
+ "border border-default surface-default shadow-xs",
981
+ // Typography
982
+ "text-default type-body-sm-regular",
983
+ // Placeholder state (no value selected)
984
+ "data-[placeholder]:text-secondary",
985
+ // Transition
986
+ "transition-colors",
987
+ // Focus
988
+ "focus-visible:outline-none focus-visible:border-strong focus-visible:ring-2 focus-visible:ring-focus-default",
989
+ // Disabled
990
+ "disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed",
991
+ // Error
992
+ "aria-invalid:border-error",
993
+ "aria-invalid:focus-visible:ring-2 aria-invalid:focus-visible:ring-focus-error aria-invalid:focus-visible:border-error"
994
+ ],
995
+ {
996
+ variants: {
997
+ size: {
998
+ default: "h-9 gap-2 pl-3 pr-2 rounded-md",
999
+ large: "h-10 gap-3 pl-4 pr-2 rounded-md",
1000
+ small: "h-8 gap-1.5 px-2 rounded-sm",
1001
+ mini: "h-6 gap-1 px-1.5 rounded-sm type-body-xs-regular"
1002
+ }
1003
+ },
1004
+ defaultVariants: {
1005
+ size: "default"
1006
+ }
1007
+ }
1008
+ );
1009
+ var Select = SelectPrimitive.Root;
1010
+ var SelectGroup = SelectPrimitive.Group;
1011
+ var SelectValue = SelectPrimitive.Value;
1012
+ function SelectTrigger({
1013
+ className,
1014
+ size,
1015
+ children,
1016
+ ref,
1017
+ ...props
1018
+ }) {
1019
+ return /* @__PURE__ */ jsxs3(
1020
+ SelectPrimitive.Trigger,
1021
+ {
1022
+ "data-slot": "select-trigger",
1023
+ ref,
1024
+ className: cn(selectTriggerVariants({ size }), className),
1025
+ ...props,
1026
+ children: [
1027
+ /* @__PURE__ */ jsx10("span", { className: "flex-1 truncate text-left", children }),
1028
+ /* @__PURE__ */ jsx10(
1029
+ SelectPrimitive.Icon,
1030
+ {
1031
+ "data-slot": "select-icon",
1032
+ className: "shrink-0 transition-transform duration-200 data-[open]:rotate-180",
1033
+ children: /* @__PURE__ */ jsx10(CaretDownIcon, { size: 16, className: "text-secondary" })
1034
+ }
1035
+ )
1036
+ ]
1037
+ }
1038
+ );
1039
+ }
1040
+ function SelectContent({
1041
+ className,
1042
+ positionerClassName,
1043
+ children,
1044
+ ref,
1045
+ ...props
1046
+ }) {
1047
+ return /* @__PURE__ */ jsx10(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx10(
1048
+ SelectPrimitive.Positioner,
1049
+ {
1050
+ side: "bottom",
1051
+ align: "start",
1052
+ alignItemWithTrigger: false,
1053
+ sideOffset: 4,
1054
+ className: cn(
1055
+ "z-50 w-[var(--anchor-width)] outline-none",
1056
+ positionerClassName
1057
+ ),
1058
+ ...props,
1059
+ children: /* @__PURE__ */ jsxs3(
1060
+ SelectPrimitive.Popup,
1061
+ {
1062
+ ref,
1063
+ className: cn(
1064
+ "relative max-h-60 min-w-32 overflow-hidden",
1065
+ "rounded-lg border border-default surface-default shadow-md",
1066
+ "data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95",
1067
+ "data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95",
1068
+ "duration-200",
1069
+ className
1070
+ ),
1071
+ children: [
1072
+ /* @__PURE__ */ jsx10(SelectScrollUpButton, {}),
1073
+ /* @__PURE__ */ jsx10(SelectPrimitive.List, { className: "p-[var(--3xs,2px)] overflow-y-auto max-h-[inherit]", children }),
1074
+ /* @__PURE__ */ jsx10(SelectScrollDownButton, {})
1075
+ ]
1076
+ }
1077
+ )
1078
+ }
1079
+ ) });
1080
+ }
1081
+ function SelectLabel({ className, ref, ...props }) {
1082
+ return /* @__PURE__ */ jsx10(
1083
+ SelectPrimitive.GroupLabel,
1084
+ {
1085
+ ref,
1086
+ className: cn(
1087
+ "text-secondary type-label-xs-semibold py-[5.5px] px-2",
1088
+ className
1089
+ ),
1090
+ ...props
1091
+ }
1092
+ );
1093
+ }
1094
+ function SelectItem({
1095
+ className,
1096
+ children,
1097
+ label,
1098
+ ref,
1099
+ ...props
1100
+ }) {
1101
+ return /* @__PURE__ */ jsx10(
1102
+ SelectPrimitive.Item,
1103
+ {
1104
+ ref,
1105
+ label: label ?? (typeof children === "string" ? children : void 0),
1106
+ className: cn(
1107
+ "relative flex w-full cursor-pointer select-none items-center",
1108
+ "min-h-8 px-2 py-[5.5px] rounded-md",
1109
+ "type-body-sm-regular outline-none transition-colors text-default",
1110
+ "data-[highlighted]:interactive-hover",
1111
+ "data-[selected]:surface-secondary",
1112
+ "data-[selected]:data-[highlighted]:interactive-hover",
1113
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1114
+ className
1115
+ ),
1116
+ ...props,
1117
+ children: /* @__PURE__ */ jsx10(SelectPrimitive.ItemText, { className: "flex-1 min-w-0 truncate", children })
1118
+ }
1119
+ );
1120
+ }
1121
+ function SelectSeparator({
1122
+ className,
1123
+ ref,
1124
+ ...props
1125
+ }) {
1126
+ return /* @__PURE__ */ jsx10(
1127
+ "div",
1128
+ {
1129
+ ref,
1130
+ role: "separator",
1131
+ className: cn(
1132
+ "-mx-[2px] my-1 h-px bg-[var(--color-border-default)]",
1133
+ className
1134
+ ),
1135
+ ...props
1136
+ }
1137
+ );
1138
+ }
1139
+ function SelectScrollUpButton({
1140
+ className,
1141
+ ref,
1142
+ ...props
1143
+ }) {
1144
+ return /* @__PURE__ */ jsx10(
1145
+ SelectPrimitive.ScrollUpArrow,
1146
+ {
1147
+ ref,
821
1148
  className: cn(
822
- "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
1149
+ "flex cursor-default items-center justify-center py-1 text-secondary",
823
1150
  className
824
1151
  ),
825
- ...props
1152
+ ...props,
1153
+ children: /* @__PURE__ */ jsx10(CaretUpIcon, { size: 14 })
826
1154
  }
827
1155
  );
828
1156
  }
829
- function CardContent({ className, bleed, ref, ...props }) {
830
- return /* @__PURE__ */ jsx8(
831
- "div",
1157
+ function SelectScrollDownButton({
1158
+ className,
1159
+ ref,
1160
+ ...props
1161
+ }) {
1162
+ return /* @__PURE__ */ jsx10(
1163
+ SelectPrimitive.ScrollDownArrow,
832
1164
  {
833
1165
  ref,
834
- "data-slot": "card-content",
835
1166
  className: cn(
836
- bleed ? "px-0" : "px-6 group-data-[size=sm]/card:px-3",
1167
+ "flex cursor-default items-center justify-center py-1 text-secondary",
837
1168
  className
838
1169
  ),
839
- ...props
1170
+ ...props,
1171
+ children: /* @__PURE__ */ jsx10(CaretDownIcon, { size: 14 })
840
1172
  }
841
1173
  );
842
1174
  }
843
- function CardFooter({ className, ref, ...props }) {
844
- return /* @__PURE__ */ jsx8(
845
- "div",
1175
+
1176
+ // src/components/ui/combobox.tsx
1177
+ import * as React5 from "react";
1178
+ import { Combobox as ComboboxPrimitive } from "@base-ui/react";
1179
+
1180
+ // src/components/ui/badge.tsx
1181
+ import * as React4 from "react";
1182
+ import { cva as cva8 } from "class-variance-authority";
1183
+ import { jsxs as jsxs4 } from "react/jsx-runtime";
1184
+ var badgeVariants = cva8(
1185
+ [
1186
+ // Layout
1187
+ "inline-flex items-center justify-center gap-1",
1188
+ // Size
1189
+ "h-6 px-2",
1190
+ // Text
1191
+ "whitespace-nowrap type-label-xs-medium",
1192
+ // Shape
1193
+ "rounded-md",
1194
+ // Transitions
1195
+ "transition-colors",
1196
+ // Focus — flush ring, no gap
1197
+ "focus-visible:outline-none",
1198
+ "focus-visible:ring-2 focus-visible:ring-focus-default",
1199
+ // Icons
1200
+ "[&_svg]:pointer-events-none [&_svg]:size-3 [&_svg]:shrink-0"
1201
+ ],
1202
+ {
1203
+ variants: {
1204
+ variant: {
1205
+ primary: ["interactive-accent interactive-accent-fg"],
1206
+ secondary: ["interactive-secondary interactive-secondary-fg"],
1207
+ outline: [
1208
+ "interactive-default interactive-default-fg",
1209
+ "border border-default"
1210
+ ],
1211
+ ghost: ["interactive-default interactive-default-fg"],
1212
+ urgent: [
1213
+ "interactive-destructive interactive-destructive-fg",
1214
+ // Focus
1215
+ "focus-visible:ring-3 focus-visible:ring-focus-error"
1216
+ ]
1217
+ }
1218
+ },
1219
+ defaultVariants: {}
1220
+ }
1221
+ );
1222
+ function isSingleDisplayCharacter(node) {
1223
+ if (node == null || typeof node === "boolean") return false;
1224
+ if (typeof node === "string" || typeof node === "number") {
1225
+ const trimmed = String(node).trim();
1226
+ return trimmed.length === 1;
1227
+ }
1228
+ if (Array.isArray(node)) {
1229
+ const parts = node.filter((x) => x != null && typeof x !== "boolean");
1230
+ if (parts.length !== 1) return false;
1231
+ return isSingleDisplayCharacter(parts[0]);
1232
+ }
1233
+ if (React4.isValidElement(node)) {
1234
+ return isSingleDisplayCharacter(
1235
+ node.props.children
1236
+ );
1237
+ }
1238
+ return false;
1239
+ }
1240
+ function Badge({
1241
+ className,
1242
+ variant,
1243
+ iconLeft,
1244
+ iconRight,
1245
+ onKeyDown,
1246
+ style,
1247
+ children,
1248
+ ref,
1249
+ ...props
1250
+ }) {
1251
+ if (!variant) {
1252
+ return null;
1253
+ }
1254
+ const circle = isSingleDisplayCharacter(children) && !iconLeft && !iconRight;
1255
+ return /* @__PURE__ */ jsxs4(
1256
+ "span",
846
1257
  {
847
- ref,
848
- "data-slot": "card-footer",
1258
+ ...props,
1259
+ role: "button",
1260
+ tabIndex: 0,
1261
+ onKeyDown: (e) => {
1262
+ if (e.key === "Enter" || e.key === " ") {
1263
+ e.preventDefault();
1264
+ e.currentTarget.click();
1265
+ }
1266
+ onKeyDown?.(e);
1267
+ },
849
1268
  className: cn(
850
- "flex items-center px-6 py-6 group-data-[size=sm]/card:p-3",
1269
+ badgeVariants({ variant }),
1270
+ circle ? "size-5 shrink-0 p-0" : "",
851
1271
  className
852
1272
  ),
853
- ...props
1273
+ style,
1274
+ ref,
1275
+ children: [
1276
+ iconLeft,
1277
+ children,
1278
+ iconRight
1279
+ ]
854
1280
  }
855
1281
  );
856
1282
  }
857
1283
 
858
- // src/components/ui/select.tsx
859
- import { Select as SelectPrimitive } from "@base-ui/react/select";
860
- import { cva as cva6 } from "class-variance-authority";
861
- import { jsx as jsx9, jsxs as jsxs2 } from "react/jsx-runtime";
862
- var selectTriggerVariants = cva6(
1284
+ // src/components/ui/combobox.tsx
1285
+ import { jsx as jsx11, jsxs as jsxs5 } from "react/jsx-runtime";
1286
+ var comboboxInputVariants = cva(
863
1287
  [
864
1288
  // Layout
865
- "flex w-full items-center justify-between",
1289
+ "flex w-full items-center",
866
1290
  // Appearance
867
1291
  "border border-default surface-default shadow-xs",
868
1292
  // Typography
869
1293
  "text-default type-body-sm-regular",
870
- // Placeholder state (no value selected)
871
- "data-[placeholder]:text-secondary",
872
1294
  // Transition
873
1295
  "transition-colors",
874
- // Focus
875
- "focus-visible:outline-none focus-visible:border-strong focus-visible:ring-2 focus-visible:ring-focus-default",
1296
+ // Focus (delegated from inner input)
1297
+ "focus-within:outline-none focus-within:border-strong focus-within:ring-2 focus-within:ring-focus-default",
876
1298
  // Disabled
877
- "disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed",
1299
+ "has-[:disabled]:pointer-events-none has-[:disabled]:opacity-50 has-[:disabled]:cursor-not-allowed",
878
1300
  // Error
879
- "aria-invalid:border-error",
880
- "aria-invalid:focus-visible:ring-2 aria-invalid:focus-visible:ring-focus-error aria-invalid:focus-visible:border-error"
1301
+ "has-[[aria-invalid=true]]:border-error",
1302
+ "has-[[aria-invalid=true]:focus-visible]:ring-2 has-[[aria-invalid=true]:focus-visible]:ring-focus-error has-[[aria-invalid=true]:focus-visible]:border-error"
881
1303
  ],
882
1304
  {
883
1305
  variants: {
@@ -893,128 +1315,224 @@ var selectTriggerVariants = cva6(
893
1315
  }
894
1316
  }
895
1317
  );
896
- var Select = SelectPrimitive.Root;
897
- var SelectGroup = SelectPrimitive.Group;
898
- var SelectValue = SelectPrimitive.Value;
899
- function SelectTrigger({
1318
+ var Combobox = ComboboxPrimitive.Root;
1319
+ var useComboboxFilter = ComboboxPrimitive.useFilter;
1320
+ function ComboboxTrigger({
1321
+ className,
1322
+ ...props
1323
+ }) {
1324
+ return /* @__PURE__ */ jsx11(
1325
+ ComboboxPrimitive.Trigger,
1326
+ {
1327
+ "data-slot": "combobox-trigger",
1328
+ "aria-label": "Toggle suggestions",
1329
+ className: cn(
1330
+ "shrink-0 transition-transform duration-200 data-[open]:rotate-180",
1331
+ className
1332
+ ),
1333
+ ...props,
1334
+ children: /* @__PURE__ */ jsx11(CaretDownIcon, { size: 16, className: "text-secondary" })
1335
+ }
1336
+ );
1337
+ }
1338
+ function ComboboxClear({ className, ...props }) {
1339
+ return /* @__PURE__ */ jsx11(
1340
+ ComboboxPrimitive.Clear,
1341
+ {
1342
+ "data-slot": "combobox-clear",
1343
+ "aria-label": "Clear selection",
1344
+ className: cn("shrink-0", className),
1345
+ ...props,
1346
+ children: /* @__PURE__ */ jsx11(CloseIcon, { size: 16, className: "text-secondary" })
1347
+ }
1348
+ );
1349
+ }
1350
+ function ComboboxInput({
900
1351
  className,
901
- size,
902
1352
  children,
1353
+ size,
1354
+ disabled = false,
1355
+ showTrigger = true,
1356
+ showClear = false,
903
1357
  ref,
904
1358
  ...props
905
1359
  }) {
906
- return /* @__PURE__ */ jsxs2(
907
- SelectPrimitive.Trigger,
1360
+ return /* @__PURE__ */ jsxs5(
1361
+ "div",
908
1362
  {
909
- "data-slot": "select-trigger",
910
1363
  ref,
911
- className: cn(selectTriggerVariants({ size }), className),
912
- ...props,
1364
+ "data-slot": "combobox-input",
1365
+ className: cn(
1366
+ "group/combobox-input",
1367
+ comboboxInputVariants({ size }),
1368
+ className
1369
+ ),
913
1370
  children: [
914
- /* @__PURE__ */ jsx9("span", { className: "flex-1 truncate text-left", children }),
915
- /* @__PURE__ */ jsx9(
916
- SelectPrimitive.Icon,
1371
+ /* @__PURE__ */ jsx11(
1372
+ ComboboxPrimitive.Input,
917
1373
  {
918
- "data-slot": "select-icon",
919
- className: "shrink-0 transition-transform duration-200 data-[open]:rotate-180",
920
- children: /* @__PURE__ */ jsx9(CaretDownIcon, { size: 16, className: "text-secondary" })
1374
+ disabled,
1375
+ className: "flex-1 min-w-0 bg-transparent outline-none placeholder:text-secondary",
1376
+ ...props
921
1377
  }
922
- )
1378
+ ),
1379
+ showClear && /* @__PURE__ */ jsx11(ComboboxClear, { disabled }),
1380
+ showTrigger && /* @__PURE__ */ jsx11(
1381
+ ComboboxTrigger,
1382
+ {
1383
+ className: "group-has-[[data-slot=combobox-clear]]/combobox-input:hidden",
1384
+ disabled
1385
+ }
1386
+ ),
1387
+ children
923
1388
  ]
924
1389
  }
925
1390
  );
926
1391
  }
927
- function SelectContent({
1392
+ function ComboboxContent({
928
1393
  className,
929
- positionerClassName,
930
- children,
931
- ref,
1394
+ side = "bottom",
1395
+ sideOffset = 8,
1396
+ align = "start",
1397
+ alignOffset = 0,
1398
+ anchor,
932
1399
  ...props
933
1400
  }) {
934
- return /* @__PURE__ */ jsx9(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx9(
935
- SelectPrimitive.Positioner,
1401
+ return /* @__PURE__ */ jsx11(ComboboxPrimitive.Portal, { children: /* @__PURE__ */ jsx11(
1402
+ ComboboxPrimitive.Positioner,
936
1403
  {
937
- side: "bottom",
938
- align: "start",
939
- alignItemWithTrigger: false,
940
- sideOffset: 4,
941
- className: cn(
942
- "z-50 w-[var(--anchor-width)] outline-none",
943
- positionerClassName
944
- ),
945
- ...props,
946
- children: /* @__PURE__ */ jsxs2(
947
- SelectPrimitive.Popup,
1404
+ side,
1405
+ sideOffset,
1406
+ align,
1407
+ alignOffset,
1408
+ anchor,
1409
+ className: "isolate z-50 w-[var(--anchor-width)] outline-none",
1410
+ children: /* @__PURE__ */ jsx11(
1411
+ ComboboxPrimitive.Popup,
948
1412
  {
949
- ref,
1413
+ "data-slot": "combobox-content",
950
1414
  className: cn(
951
- "relative max-h-60 min-w-32 overflow-hidden",
1415
+ // Layout matches SelectContent
1416
+ "group/combobox-content relative max-h-60 min-w-32 overflow-hidden",
1417
+ // Appearance
952
1418
  "rounded-lg border border-default surface-default shadow-md",
1419
+ // Open / close animation
953
1420
  "data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95",
954
1421
  "data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95",
955
- "duration-200",
1422
+ "duration-150",
956
1423
  className
957
1424
  ),
958
- children: [
959
- /* @__PURE__ */ jsx9(SelectScrollUpButton, {}),
960
- /* @__PURE__ */ jsx9(SelectPrimitive.List, { className: "p-[var(--3xs,2px)] overflow-y-auto max-h-[inherit]", children }),
961
- /* @__PURE__ */ jsx9(SelectScrollDownButton, {})
962
- ]
1425
+ ...props
963
1426
  }
964
1427
  )
965
1428
  }
966
1429
  ) });
967
1430
  }
968
- function SelectLabel({ className, ref, ...props }) {
969
- return /* @__PURE__ */ jsx9(
970
- SelectPrimitive.GroupLabel,
1431
+ function ComboboxList({ className, ...props }) {
1432
+ return /* @__PURE__ */ jsx11(
1433
+ ComboboxPrimitive.List,
1434
+ {
1435
+ "data-slot": "combobox-list",
1436
+ className: cn(
1437
+ // Layout — matches SelectContent list
1438
+ "group/combobox-list p-[2px] overflow-y-auto max-h-[inherit]",
1439
+ className
1440
+ ),
1441
+ ...props
1442
+ }
1443
+ );
1444
+ }
1445
+ function ComboboxItem({
1446
+ className,
1447
+ children,
1448
+ ...props
1449
+ }) {
1450
+ return /* @__PURE__ */ jsxs5(
1451
+ ComboboxPrimitive.Item,
1452
+ {
1453
+ "data-slot": "combobox-item",
1454
+ className: cn(
1455
+ // Layout
1456
+ "relative flex w-full cursor-default select-none items-center gap-2",
1457
+ "min-h-8 py-[5.5px] pr-8 pl-2 rounded-md",
1458
+ // Typography & appearance
1459
+ "text-default type-body-sm-regular",
1460
+ "outline-none transition-colors",
1461
+ // Highlighted
1462
+ "data-[highlighted]:interactive-hover data-[highlighted]:outline-none",
1463
+ // Disabled
1464
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1465
+ // SVG
1466
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0",
1467
+ className
1468
+ ),
1469
+ ...props,
1470
+ children: [
1471
+ children,
1472
+ /* @__PURE__ */ jsx11(
1473
+ ComboboxPrimitive.ItemIndicator,
1474
+ {
1475
+ render: /* @__PURE__ */ jsx11("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx11(CheckmarkIcon, { size: 16 }) })
1476
+ }
1477
+ )
1478
+ ]
1479
+ }
1480
+ );
1481
+ }
1482
+ function ComboboxGroup({ className, ...props }) {
1483
+ return /* @__PURE__ */ jsx11(
1484
+ ComboboxPrimitive.Group,
1485
+ {
1486
+ "data-slot": "combobox-group",
1487
+ className: cn(className),
1488
+ ...props
1489
+ }
1490
+ );
1491
+ }
1492
+ function ComboboxLabel({
1493
+ className,
1494
+ ...props
1495
+ }) {
1496
+ return /* @__PURE__ */ jsx11(
1497
+ ComboboxPrimitive.GroupLabel,
971
1498
  {
972
- ref,
1499
+ "data-slot": "combobox-label",
973
1500
  className: cn(
974
- "text-secondary type-label-xs-semibold py-[5.5px] px-2",
1501
+ "px-2 py-1.5 text-secondary type-label-xs-semibold",
975
1502
  className
976
1503
  ),
977
1504
  ...props
978
1505
  }
979
1506
  );
980
1507
  }
981
- function SelectItem({
1508
+ function ComboboxEmpty({
982
1509
  className,
983
- children,
984
- label,
985
- ref,
986
1510
  ...props
987
1511
  }) {
988
- return /* @__PURE__ */ jsx9(
989
- SelectPrimitive.Item,
1512
+ return /* @__PURE__ */ jsx11(
1513
+ "div",
990
1514
  {
991
- ref,
992
- label: label ?? (typeof children === "string" ? children : void 0),
1515
+ "data-slot": "combobox-empty",
1516
+ role: "status",
993
1517
  className: cn(
994
- "relative flex w-full cursor-pointer select-none items-center",
995
- "min-h-8 px-2 py-[5.5px] rounded-md",
996
- "type-body-sm-regular outline-none transition-colors text-default",
997
- "data-[highlighted]:interactive-hover",
998
- "data-[selected]:surface-secondary",
999
- "data-[selected]:data-[highlighted]:interactive-hover",
1000
- "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1518
+ // Visible by default, hidden when the list contains items
1519
+ "flex group-has-[[data-slot=combobox-item]]/combobox-list:hidden",
1520
+ "w-full justify-center py-2 text-center",
1521
+ "type-body-sm-regular text-secondary",
1001
1522
  className
1002
1523
  ),
1003
- ...props,
1004
- children: /* @__PURE__ */ jsx9(SelectPrimitive.ItemText, { className: "flex-1 min-w-0 truncate", children })
1524
+ ...props
1005
1525
  }
1006
1526
  );
1007
1527
  }
1008
- function SelectSeparator({
1528
+ function ComboboxSeparator({
1009
1529
  className,
1010
- ref,
1011
1530
  ...props
1012
1531
  }) {
1013
- return /* @__PURE__ */ jsx9(
1014
- "div",
1532
+ return /* @__PURE__ */ jsx11(
1533
+ ComboboxPrimitive.Separator,
1015
1534
  {
1016
- ref,
1017
- role: "separator",
1535
+ "data-slot": "combobox-separator",
1018
1536
  className: cn(
1019
1537
  "-mx-[2px] my-1 h-px bg-[var(--color-border-default)]",
1020
1538
  className
@@ -1023,52 +1541,126 @@ function SelectSeparator({
1023
1541
  }
1024
1542
  );
1025
1543
  }
1026
- function SelectScrollUpButton({
1544
+ var comboboxChipsVariants = cva(
1545
+ [
1546
+ // Layout
1547
+ "flex w-full flex-wrap items-center",
1548
+ "py-1",
1549
+ // Appearance
1550
+ "border border-default surface-default shadow-xs",
1551
+ // Typography
1552
+ "text-default type-body-sm-regular",
1553
+ // Transition
1554
+ "transition-colors",
1555
+ // Focus (delegated from inner input)
1556
+ "focus-within:outline-none focus-within:border-strong focus-within:ring-2 focus-within:ring-focus-default",
1557
+ // Disabled (uses data attribute since children are consumer-controlled)
1558
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed",
1559
+ // Error
1560
+ "has-[[aria-invalid=true]]:border-error",
1561
+ "has-[[aria-invalid=true]:focus-visible]:ring-2 has-[[aria-invalid=true]:focus-visible]:ring-focus-error has-[[aria-invalid=true]:focus-visible]:border-error",
1562
+ // When chips are present, tighten horizontal padding
1563
+ "has-data-[slot=combobox-chip]:px-1"
1564
+ ],
1565
+ {
1566
+ variants: {
1567
+ size: {
1568
+ default: "min-h-9 gap-1 pl-3 pr-2 rounded-md",
1569
+ large: "min-h-10 gap-1.5 pl-4 pr-2 rounded-md",
1570
+ small: "min-h-8 gap-1 px-2 rounded-sm",
1571
+ mini: "min-h-6 gap-0.5 px-1.5 rounded-sm type-body-xs-regular"
1572
+ }
1573
+ },
1574
+ defaultVariants: {
1575
+ size: "default"
1576
+ }
1577
+ }
1578
+ );
1579
+ function ComboboxChips({
1027
1580
  className,
1028
- ref,
1581
+ children,
1582
+ size,
1583
+ showTrigger = true,
1584
+ disabled = false,
1029
1585
  ...props
1030
1586
  }) {
1031
- return /* @__PURE__ */ jsx9(
1032
- SelectPrimitive.ScrollUpArrow,
1587
+ return /* @__PURE__ */ jsxs5(
1588
+ ComboboxPrimitive.Chips,
1033
1589
  {
1034
- ref,
1590
+ "data-slot": "combobox-chips",
1591
+ "data-disabled": disabled || void 0,
1592
+ className: cn(comboboxChipsVariants({ size }), className),
1593
+ ...props,
1594
+ children: [
1595
+ children,
1596
+ showTrigger && /* @__PURE__ */ jsx11(ComboboxTrigger, { className: "ml-auto", disabled })
1597
+ ]
1598
+ }
1599
+ );
1600
+ }
1601
+ function ComboboxChip({
1602
+ className,
1603
+ children,
1604
+ showRemove = true,
1605
+ removeLabel = "Remove",
1606
+ ...props
1607
+ }) {
1608
+ return /* @__PURE__ */ jsxs5(
1609
+ ComboboxPrimitive.Chip,
1610
+ {
1611
+ "data-slot": "combobox-chip",
1035
1612
  className: cn(
1036
- "flex cursor-default items-center justify-center py-1 text-secondary",
1613
+ badgeVariants({ variant: "secondary" }),
1614
+ // Overrides for chip context
1615
+ "gap-1 whitespace-nowrap",
1616
+ // Disabled
1617
+ "has-[:disabled]:pointer-events-none has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50",
1037
1618
  className
1038
1619
  ),
1039
1620
  ...props,
1040
- children: /* @__PURE__ */ jsx9(CaretUpIcon, { size: 14 })
1621
+ children: [
1622
+ children,
1623
+ showRemove && /* @__PURE__ */ jsx11(
1624
+ ComboboxPrimitive.ChipRemove,
1625
+ {
1626
+ "data-slot": "combobox-chip-remove",
1627
+ "aria-label": removeLabel,
1628
+ render: /* @__PURE__ */ jsx11("span", { className: "inline-flex cursor-pointer opacity-50 hover:opacity-100", children: /* @__PURE__ */ jsx11(CloseIcon, { size: 12, className: "pointer-events-none" }) })
1629
+ }
1630
+ )
1631
+ ]
1041
1632
  }
1042
1633
  );
1043
1634
  }
1044
- function SelectScrollDownButton({
1635
+ function ComboboxChipsInput({
1045
1636
  className,
1046
- ref,
1047
1637
  ...props
1048
1638
  }) {
1049
- return /* @__PURE__ */ jsx9(
1050
- SelectPrimitive.ScrollDownArrow,
1639
+ return /* @__PURE__ */ jsx11(
1640
+ ComboboxPrimitive.Input,
1051
1641
  {
1052
- ref,
1642
+ "data-slot": "combobox-chip-input",
1053
1643
  className: cn(
1054
- "flex cursor-default items-center justify-center py-1 text-secondary",
1644
+ "flex-1 min-w-16 bg-transparent outline-none placeholder:text-secondary",
1055
1645
  className
1056
1646
  ),
1057
- ...props,
1058
- children: /* @__PURE__ */ jsx9(CaretDownIcon, { size: 14 })
1647
+ ...props
1059
1648
  }
1060
1649
  );
1061
1650
  }
1651
+ function useComboboxAnchor() {
1652
+ return React5.useRef(null);
1653
+ }
1062
1654
 
1063
1655
  // src/components/ui/field.tsx
1064
1656
  import { useMemo } from "react";
1065
- import { cva as cva7 } from "class-variance-authority";
1657
+ import { cva as cva9 } from "class-variance-authority";
1066
1658
 
1067
1659
  // src/components/ui/label.tsx
1068
- import { jsx as jsx10 } from "react/jsx-runtime";
1660
+ import { jsx as jsx12 } from "react/jsx-runtime";
1069
1661
  var labelClasses = "type-label-sm-medium flex flex-row items-center gap-2 text-default select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50";
1070
1662
  function Label({ className, ref, ...props }) {
1071
- return /* @__PURE__ */ jsx10(
1663
+ return /* @__PURE__ */ jsx12(
1072
1664
  "label",
1073
1665
  {
1074
1666
  ref,
@@ -1080,9 +1672,9 @@ function Label({ className, ref, ...props }) {
1080
1672
  }
1081
1673
 
1082
1674
  // src/components/ui/field.tsx
1083
- import { jsx as jsx11, jsxs as jsxs3 } from "react/jsx-runtime";
1675
+ import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
1084
1676
  function FieldSet({ className, ...props }) {
1085
- return /* @__PURE__ */ jsx11(
1677
+ return /* @__PURE__ */ jsx13(
1086
1678
  "fieldset",
1087
1679
  {
1088
1680
  "data-slot": "field-set",
@@ -1100,7 +1692,7 @@ function FieldLegend({
1100
1692
  variant = "legend",
1101
1693
  ...props
1102
1694
  }) {
1103
- return /* @__PURE__ */ jsx11(
1695
+ return /* @__PURE__ */ jsx13(
1104
1696
  "legend",
1105
1697
  {
1106
1698
  "data-slot": "field-legend",
@@ -1116,7 +1708,7 @@ function FieldLegend({
1116
1708
  );
1117
1709
  }
1118
1710
  function FieldGroup({ className, ...props }) {
1119
- return /* @__PURE__ */ jsx11(
1711
+ return /* @__PURE__ */ jsx13(
1120
1712
  "div",
1121
1713
  {
1122
1714
  "data-slot": "field-group",
@@ -1128,7 +1720,7 @@ function FieldGroup({ className, ...props }) {
1128
1720
  }
1129
1721
  );
1130
1722
  }
1131
- var fieldVariants = cva7(
1723
+ var fieldVariants = cva9(
1132
1724
  "group/field data-[invalid=true]:text-error flex w-full gap-3",
1133
1725
  {
1134
1726
  variants: {
@@ -1156,7 +1748,7 @@ function Field({
1156
1748
  orientation = "vertical",
1157
1749
  ...props
1158
1750
  }) {
1159
- return /* @__PURE__ */ jsx11(
1751
+ return /* @__PURE__ */ jsx13(
1160
1752
  "div",
1161
1753
  {
1162
1754
  role: "group",
@@ -1168,7 +1760,7 @@ function Field({
1168
1760
  );
1169
1761
  }
1170
1762
  function FieldContent({ className, ...props }) {
1171
- return /* @__PURE__ */ jsx11(
1763
+ return /* @__PURE__ */ jsx13(
1172
1764
  "div",
1173
1765
  {
1174
1766
  "data-slot": "field-content",
@@ -1184,7 +1776,7 @@ function FieldLabel({
1184
1776
  className,
1185
1777
  ...props
1186
1778
  }) {
1187
- return /* @__PURE__ */ jsx11(
1779
+ return /* @__PURE__ */ jsx13(
1188
1780
  Label,
1189
1781
  {
1190
1782
  "data-slot": "field-label",
@@ -1199,7 +1791,7 @@ function FieldLabel({
1199
1791
  );
1200
1792
  }
1201
1793
  function FieldTitle({ className, ...props }) {
1202
- return /* @__PURE__ */ jsx11(
1794
+ return /* @__PURE__ */ jsx13(
1203
1795
  "div",
1204
1796
  {
1205
1797
  "data-slot": "field-label",
@@ -1212,7 +1804,7 @@ function FieldTitle({ className, ...props }) {
1212
1804
  );
1213
1805
  }
1214
1806
  function FieldDescription({ className, ...props }) {
1215
- return /* @__PURE__ */ jsx11(
1807
+ return /* @__PURE__ */ jsx13(
1216
1808
  "p",
1217
1809
  {
1218
1810
  "data-slot": "field-description",
@@ -1231,7 +1823,7 @@ function FieldSeparator({
1231
1823
  className,
1232
1824
  ...props
1233
1825
  }) {
1234
- return /* @__PURE__ */ jsxs3(
1826
+ return /* @__PURE__ */ jsxs6(
1235
1827
  "div",
1236
1828
  {
1237
1829
  "data-slot": "field-separator",
@@ -1242,8 +1834,8 @@ function FieldSeparator({
1242
1834
  ),
1243
1835
  ...props,
1244
1836
  children: [
1245
- /* @__PURE__ */ jsx11(Separator, { className: "absolute inset-0 top-1/2" }),
1246
- children && /* @__PURE__ */ jsx11(
1837
+ /* @__PURE__ */ jsx13(Separator, { className: "absolute inset-0 top-1/2" }),
1838
+ children && /* @__PURE__ */ jsx13(
1247
1839
  "span",
1248
1840
  {
1249
1841
  className: "surface-default text-secondary relative mx-auto block w-fit px-2",
@@ -1271,14 +1863,14 @@ function FieldError({
1271
1863
  if (errors?.length === 1 && errors[0]?.message) {
1272
1864
  return errors[0].message;
1273
1865
  }
1274
- return /* @__PURE__ */ jsx11("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: errors.map(
1275
- (error, index) => error?.message && /* @__PURE__ */ jsx11("li", { children: error.message }, index)
1866
+ return /* @__PURE__ */ jsx13("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: errors.map(
1867
+ (error, index) => error?.message && /* @__PURE__ */ jsx13("li", { children: error.message }, index)
1276
1868
  ) });
1277
1869
  }, [children, errors]);
1278
1870
  if (!content) {
1279
1871
  return null;
1280
1872
  }
1281
- return /* @__PURE__ */ jsx11(
1873
+ return /* @__PURE__ */ jsx13(
1282
1874
  "div",
1283
1875
  {
1284
1876
  role: "alert",
@@ -1291,19 +1883,19 @@ function FieldError({
1291
1883
  }
1292
1884
 
1293
1885
  // src/components/ui/dialog.tsx
1294
- import * as React4 from "react";
1886
+ import * as React6 from "react";
1295
1887
  import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
1296
- import { jsx as jsx12, jsxs as jsxs4 } from "react/jsx-runtime";
1297
- var DialogChromeContext = React4.createContext(null);
1888
+ import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
1889
+ var DialogChromeContext = React6.createContext(null);
1298
1890
  function useDialogChrome() {
1299
- return React4.useContext(DialogChromeContext) ?? { showCloseButton: false };
1891
+ return React6.useContext(DialogChromeContext) ?? { showCloseButton: false };
1300
1892
  }
1301
1893
  function DialogCloseControl({
1302
1894
  className,
1303
1895
  ref,
1304
1896
  ...props
1305
1897
  }) {
1306
- return /* @__PURE__ */ jsxs4(
1898
+ return /* @__PURE__ */ jsxs7(
1307
1899
  DialogPrimitive.Close,
1308
1900
  {
1309
1901
  ref,
@@ -1315,8 +1907,8 @@ function DialogCloseControl({
1315
1907
  ),
1316
1908
  ...props,
1317
1909
  children: [
1318
- /* @__PURE__ */ jsx12(CloseIcon, { size: 16, "aria-hidden": "true" }),
1319
- /* @__PURE__ */ jsx12("span", { className: "sr-only", children: "Close" })
1910
+ /* @__PURE__ */ jsx14(CloseIcon, { size: 16, "aria-hidden": "true" }),
1911
+ /* @__PURE__ */ jsx14("span", { className: "sr-only", children: "Close" })
1320
1912
  ]
1321
1913
  }
1322
1914
  );
@@ -1326,7 +1918,7 @@ var DIALOG_MOBILE_FRAME = "w-[320px] min-h-[240px] max-h-[min(640px,calc(100dvh-
1326
1918
  var Dialog = DialogPrimitive.Root;
1327
1919
  var DialogTrigger = DialogPrimitive.Trigger;
1328
1920
  function DialogOverlay({ className, ref, ...props }) {
1329
- return /* @__PURE__ */ jsx12(
1921
+ return /* @__PURE__ */ jsx14(
1330
1922
  DialogPrimitive.Backdrop,
1331
1923
  {
1332
1924
  ref,
@@ -1346,9 +1938,9 @@ function DialogContent({
1346
1938
  ref,
1347
1939
  ...props
1348
1940
  }) {
1349
- return /* @__PURE__ */ jsxs4(DialogPrimitive.Portal, { children: [
1350
- /* @__PURE__ */ jsx12(DialogOverlay, {}),
1351
- /* @__PURE__ */ jsx12(DialogPrimitive.Viewport, { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto p-4 sm:items-center sm:p-6", children: /* @__PURE__ */ jsx12(
1941
+ return /* @__PURE__ */ jsxs7(DialogPrimitive.Portal, { children: [
1942
+ /* @__PURE__ */ jsx14(DialogOverlay, {}),
1943
+ /* @__PURE__ */ jsx14(DialogPrimitive.Viewport, { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto p-4 sm:items-center sm:p-6", children: /* @__PURE__ */ jsx14(
1352
1944
  DialogPrimitive.Popup,
1353
1945
  {
1354
1946
  ref,
@@ -1360,13 +1952,13 @@ function DialogContent({
1360
1952
  className
1361
1953
  ),
1362
1954
  ...props,
1363
- children: /* @__PURE__ */ jsx12(DialogChromeContext, { value: { showCloseButton }, children })
1955
+ children: /* @__PURE__ */ jsx14(DialogChromeContext, { value: { showCloseButton }, children })
1364
1956
  }
1365
1957
  ) })
1366
1958
  ] });
1367
1959
  }
1368
1960
  function DialogBody({ className, ref, ...props }) {
1369
- return /* @__PURE__ */ jsx12(
1961
+ return /* @__PURE__ */ jsx14(
1370
1962
  "div",
1371
1963
  {
1372
1964
  ref,
@@ -1380,7 +1972,7 @@ function DialogBody({ className, ref, ...props }) {
1380
1972
  );
1381
1973
  }
1382
1974
  function DialogFooter({ className, ref, ...props }) {
1383
- return /* @__PURE__ */ jsx12(
1975
+ return /* @__PURE__ */ jsx14(
1384
1976
  "div",
1385
1977
  {
1386
1978
  ref,
@@ -1399,7 +1991,7 @@ function DialogHeader({
1399
1991
  ...props
1400
1992
  }) {
1401
1993
  const { showCloseButton } = useDialogChrome();
1402
- return /* @__PURE__ */ jsxs4(
1994
+ return /* @__PURE__ */ jsxs7(
1403
1995
  "div",
1404
1996
  {
1405
1997
  ref,
@@ -1409,14 +2001,14 @@ function DialogHeader({
1409
2001
  ),
1410
2002
  ...props,
1411
2003
  children: [
1412
- /* @__PURE__ */ jsx12("div", { className: "flex min-w-0 flex-col gap-1", children }),
1413
- showCloseButton ? /* @__PURE__ */ jsx12(DialogCloseControl, {}) : null
2004
+ /* @__PURE__ */ jsx14("div", { className: "flex min-w-0 flex-col gap-1", children }),
2005
+ showCloseButton ? /* @__PURE__ */ jsx14(DialogCloseControl, {}) : null
1414
2006
  ]
1415
2007
  }
1416
2008
  );
1417
2009
  }
1418
2010
  function DialogTitle({ className, ref, ...props }) {
1419
- return /* @__PURE__ */ jsx12(
2011
+ return /* @__PURE__ */ jsx14(
1420
2012
  DialogPrimitive.Title,
1421
2013
  {
1422
2014
  ref,
@@ -1430,7 +2022,7 @@ function DialogDescription({
1430
2022
  ref,
1431
2023
  ...props
1432
2024
  }) {
1433
- return /* @__PURE__ */ jsx12(
2025
+ return /* @__PURE__ */ jsx14(
1434
2026
  DialogPrimitive.Description,
1435
2027
  {
1436
2028
  ref,
@@ -1442,15 +2034,18 @@ function DialogDescription({
1442
2034
  var DialogClose = DialogPrimitive.Close;
1443
2035
 
1444
2036
  // src/components/ui/drawer.tsx
1445
- import * as React5 from "react";
2037
+ import * as React7 from "react";
1446
2038
  import { Drawer as DrawerPrimitive } from "vaul";
1447
- import { jsx as jsx13, jsxs as jsxs5 } from "react/jsx-runtime";
1448
- var Drawer = DrawerPrimitive.Root;
2039
+ import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
2040
+ var DrawerContext = React7.createContext({
2041
+ direction: "bottom"
2042
+ });
2043
+ var Drawer = ({ direction = "bottom", ...props }) => /* @__PURE__ */ jsx15(DrawerContext.Provider, { value: { direction }, children: /* @__PURE__ */ jsx15(DrawerPrimitive.Root, { direction, ...props }) });
1449
2044
  var DrawerTrigger = DrawerPrimitive.Trigger;
1450
2045
  var DrawerPortal = DrawerPrimitive.Portal;
1451
2046
  var DrawerClose = DrawerPrimitive.Close;
1452
- var DrawerOverlay = React5.forwardRef(
1453
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx13(
2047
+ var DrawerOverlay = React7.forwardRef(
2048
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx15(
1454
2049
  DrawerPrimitive.Overlay,
1455
2050
  {
1456
2051
  ref,
@@ -1461,44 +2056,43 @@ var DrawerOverlay = React5.forwardRef(
1461
2056
  )
1462
2057
  );
1463
2058
  DrawerOverlay.displayName = "DrawerOverlay";
1464
- var DrawerContent = React5.forwardRef(
1465
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs5(DrawerPortal, { children: [
1466
- /* @__PURE__ */ jsx13(DrawerOverlay, {}),
1467
- /* @__PURE__ */ jsxs5(
1468
- DrawerPrimitive.Content,
1469
- {
1470
- ref,
1471
- "data-slot": "drawer-content",
1472
- className: cn(
1473
- "group/drawer-content fixed z-50 flex h-auto flex-col surface-default shadow-lg outline-none",
1474
- // Bottom — slides up from the bottom edge
1475
- "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=bottom]:border-default",
1476
- // Top slides down from the top edge
1477
- "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=top]:border-default",
1478
- // Left slides in from the left edge
1479
- "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:h-full data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-r-xl data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:border-default data-[vaul-drawer-direction=left]:sm:max-w-sm",
1480
- // Right — slides in from the right edge
1481
- "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:h-full data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-l-xl data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:border-default data-[vaul-drawer-direction=right]:sm:max-w-sm",
1482
- className
1483
- ),
1484
- ...props,
1485
- children: [
1486
- /* @__PURE__ */ jsx13(
1487
- "div",
1488
- {
1489
- "aria-hidden": "true",
1490
- className: "mx-auto mt-2 hidden h-[3px] w-[50px] shrink-0 rounded-[2px] surface-inverse group-data-[vaul-drawer-direction=bottom]/drawer-content:block"
1491
- }
2059
+ var DrawerContent = React7.forwardRef(
2060
+ ({ className, children, ...props }, ref) => {
2061
+ const { direction } = React7.useContext(DrawerContext);
2062
+ return /* @__PURE__ */ jsxs8(DrawerPortal, { children: [
2063
+ /* @__PURE__ */ jsx15(DrawerOverlay, {}),
2064
+ /* @__PURE__ */ jsxs8(
2065
+ DrawerPrimitive.Content,
2066
+ {
2067
+ ref,
2068
+ "data-slot": "drawer-content",
2069
+ className: cn(
2070
+ "group/drawer-content fixed z-50 flex h-auto flex-col surface-default shadow-lg outline-none",
2071
+ direction === "bottom" && "inset-x-0 bottom-0 mt-24 max-h-[80vh] rounded-t-xl border-t border-default",
2072
+ direction === "top" && "inset-x-0 top-0 mb-24 max-h-[80vh] rounded-b-xl border-b border-default",
2073
+ direction === "left" && "inset-y-0 left-0 h-full w-3/4 rounded-r-xl border-r border-default",
2074
+ direction === "right" && "inset-y-0 right-0 h-full w-3/4 rounded-l-xl border-l border-default",
2075
+ className
1492
2076
  ),
1493
- children
1494
- ]
1495
- }
1496
- )
1497
- ] })
2077
+ ...props,
2078
+ children: [
2079
+ direction === "bottom" && /* @__PURE__ */ jsx15(
2080
+ "div",
2081
+ {
2082
+ "aria-hidden": "true",
2083
+ className: "mx-auto mt-2 h-[3px] w-[50px] shrink-0 rounded-[2px] surface-inverse"
2084
+ }
2085
+ ),
2086
+ children
2087
+ ]
2088
+ }
2089
+ )
2090
+ ] });
2091
+ }
1498
2092
  );
1499
2093
  DrawerContent.displayName = "DrawerContent";
1500
- var DrawerTitle = React5.forwardRef(
1501
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx13("div", { className: "shrink-0 p-4", children: /* @__PURE__ */ jsx13(
2094
+ var DrawerTitle = React7.forwardRef(
2095
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx15("div", { className: "shrink-0 p-4", children: /* @__PURE__ */ jsx15(
1502
2096
  DrawerPrimitive.Title,
1503
2097
  {
1504
2098
  ref,
@@ -1510,8 +2104,8 @@ var DrawerTitle = React5.forwardRef(
1510
2104
  ) })
1511
2105
  );
1512
2106
  DrawerTitle.displayName = "DrawerTitle";
1513
- var DrawerBody = React5.forwardRef(
1514
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx13(
2107
+ var DrawerBody = React7.forwardRef(
2108
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx15(
1515
2109
  "div",
1516
2110
  {
1517
2111
  ref,
@@ -1525,7 +2119,7 @@ var DrawerBody = React5.forwardRef(
1525
2119
  )
1526
2120
  );
1527
2121
  DrawerBody.displayName = "DrawerBody";
1528
- var DrawerDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13(
2122
+ var DrawerDescription = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx15(
1529
2123
  DrawerPrimitive.Description,
1530
2124
  {
1531
2125
  ref,
@@ -1535,8 +2129,8 @@ var DrawerDescription = React5.forwardRef(({ className, ...props }, ref) => /* @
1535
2129
  }
1536
2130
  ));
1537
2131
  DrawerDescription.displayName = "DrawerDescription";
1538
- var DrawerFooter = React5.forwardRef(
1539
- ({ className, ...props }, ref) => /* @__PURE__ */ jsx13(
2132
+ var DrawerFooter = React7.forwardRef(
2133
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx15(
1540
2134
  "div",
1541
2135
  {
1542
2136
  ref,
@@ -1554,9 +2148,9 @@ DrawerFooter.displayName = "DrawerFooter";
1554
2148
  // src/components/ui/breadcrumb.tsx
1555
2149
  import { mergeProps as mergeProps2 } from "@base-ui/react/merge-props";
1556
2150
  import { useRender as useRender2 } from "@base-ui/react/use-render";
1557
- import { jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
2151
+ import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
1558
2152
  function Breadcrumb({ className, ref, ...props }) {
1559
- return /* @__PURE__ */ jsx14(
2153
+ return /* @__PURE__ */ jsx16(
1560
2154
  "nav",
1561
2155
  {
1562
2156
  "aria-label": "breadcrumb",
@@ -1568,7 +2162,7 @@ function Breadcrumb({ className, ref, ...props }) {
1568
2162
  );
1569
2163
  }
1570
2164
  function BreadcrumbList({ className, ref, ...props }) {
1571
- return /* @__PURE__ */ jsx14(
2165
+ return /* @__PURE__ */ jsx16(
1572
2166
  "ol",
1573
2167
  {
1574
2168
  "data-slot": "breadcrumb-list",
@@ -1582,7 +2176,7 @@ function BreadcrumbList({ className, ref, ...props }) {
1582
2176
  );
1583
2177
  }
1584
2178
  function BreadcrumbItem({ className, ref, ...props }) {
1585
- return /* @__PURE__ */ jsx14(
2179
+ return /* @__PURE__ */ jsx16(
1586
2180
  "li",
1587
2181
  {
1588
2182
  "data-slot": "breadcrumb-item",
@@ -1614,7 +2208,7 @@ function BreadcrumbLink({
1614
2208
  });
1615
2209
  }
1616
2210
  function BreadcrumbPage({ className, ref, ...props }) {
1617
- return /* @__PURE__ */ jsx14(
2211
+ return /* @__PURE__ */ jsx16(
1618
2212
  "span",
1619
2213
  {
1620
2214
  "data-slot": "breadcrumb-page",
@@ -1633,7 +2227,7 @@ function BreadcrumbSeparator({
1633
2227
  ref,
1634
2228
  ...props
1635
2229
  }) {
1636
- return /* @__PURE__ */ jsx14(
2230
+ return /* @__PURE__ */ jsx16(
1637
2231
  "li",
1638
2232
  {
1639
2233
  "data-slot": "breadcrumb-separator",
@@ -1642,7 +2236,7 @@ function BreadcrumbSeparator({
1642
2236
  className: cn("[&>svg]:size-3.5", className),
1643
2237
  ref,
1644
2238
  ...props,
1645
- children: children ?? /* @__PURE__ */ jsx14(CaretRightIcon, { className: "text-current cn-rtl-flip" })
2239
+ children: children ?? /* @__PURE__ */ jsx16(CaretRightIcon, { className: "text-current cn-rtl-flip" })
1646
2240
  }
1647
2241
  );
1648
2242
  }
@@ -1651,7 +2245,7 @@ function BreadcrumbEllipsis({
1651
2245
  ref,
1652
2246
  ...props
1653
2247
  }) {
1654
- return /* @__PURE__ */ jsxs6(
2248
+ return /* @__PURE__ */ jsxs9(
1655
2249
  "span",
1656
2250
  {
1657
2251
  "data-slot": "breadcrumb-ellipsis",
@@ -1664,8 +2258,8 @@ function BreadcrumbEllipsis({
1664
2258
  ref,
1665
2259
  ...props,
1666
2260
  children: [
1667
- /* @__PURE__ */ jsx14(MoreMenuIcon, { className: "text-current" }),
1668
- /* @__PURE__ */ jsx14("span", { className: "sr-only", children: "More" })
2261
+ /* @__PURE__ */ jsx16(MoreMenuIcon, { className: "text-current" }),
2262
+ /* @__PURE__ */ jsx16("span", { className: "sr-only", children: "More" })
1669
2263
  ]
1670
2264
  }
1671
2265
  );
@@ -1673,18 +2267,18 @@ function BreadcrumbEllipsis({
1673
2267
 
1674
2268
  // src/components/ui/tooltip.tsx
1675
2269
  import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
1676
- import { jsx as jsx15, jsxs as jsxs7 } from "react/jsx-runtime";
2270
+ import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
1677
2271
  function TooltipProvider({
1678
2272
  delay = 0,
1679
2273
  ...props
1680
2274
  }) {
1681
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Provider, { delay, ...props });
2275
+ return /* @__PURE__ */ jsx17(TooltipPrimitive.Provider, { delay, ...props });
1682
2276
  }
1683
2277
  function Tooltip({ ...props }) {
1684
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Root, { ...props });
2278
+ return /* @__PURE__ */ jsx17(TooltipPrimitive.Root, { ...props });
1685
2279
  }
1686
2280
  function TooltipTrigger({ ...props }) {
1687
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
2281
+ return /* @__PURE__ */ jsx17(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
1688
2282
  }
1689
2283
  function TooltipContent({
1690
2284
  className,
@@ -1695,7 +2289,7 @@ function TooltipContent({
1695
2289
  children,
1696
2290
  ...props
1697
2291
  }) {
1698
- return /* @__PURE__ */ jsx15(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx15(
2292
+ return /* @__PURE__ */ jsx17(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx17(
1699
2293
  TooltipPrimitive.Positioner,
1700
2294
  {
1701
2295
  align,
@@ -1703,7 +2297,7 @@ function TooltipContent({
1703
2297
  side,
1704
2298
  sideOffset,
1705
2299
  className: "isolate z-50",
1706
- children: /* @__PURE__ */ jsxs7(
2300
+ children: /* @__PURE__ */ jsxs10(
1707
2301
  TooltipPrimitive.Popup,
1708
2302
  {
1709
2303
  "data-slot": "tooltip-content",
@@ -1727,7 +2321,7 @@ function TooltipContent({
1727
2321
  ...props,
1728
2322
  children: [
1729
2323
  children,
1730
- /* @__PURE__ */ jsx15(
2324
+ /* @__PURE__ */ jsx17(
1731
2325
  TooltipPrimitive.Arrow,
1732
2326
  {
1733
2327
  className: cn(
@@ -1752,14 +2346,277 @@ function TooltipContent({
1752
2346
  ) });
1753
2347
  }
1754
2348
 
2349
+ // src/components/ui/toast.tsx
2350
+ import { Toast as ToastPrimitive } from "@base-ui/react/toast";
2351
+ import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
2352
+ var toastManager = ToastPrimitive.createToastManager();
2353
+ function emit(manager, type, title, options = {}) {
2354
+ const { description, duration, priority, action, id } = options;
2355
+ return manager.add({
2356
+ id,
2357
+ title,
2358
+ description,
2359
+ type,
2360
+ timeout: duration,
2361
+ priority: priority ?? (type === "error" ? "high" : "low"),
2362
+ actionProps: action ? { children: action.label, onClick: action.onClick } : void 0
2363
+ });
2364
+ }
2365
+ function makeToast(manager) {
2366
+ function base(title, options) {
2367
+ return emit(manager, "default", title, options);
2368
+ }
2369
+ return Object.assign(base, {
2370
+ success: (title, options) => emit(manager, "success", title, options),
2371
+ error: (title, options) => emit(manager, "error", title, options),
2372
+ info: (title, options) => emit(manager, "info", title, options),
2373
+ warning: (title, options) => emit(manager, "warning", title, options),
2374
+ /** Resolve/reject a promise into loading → success/error toasts. */
2375
+ promise: manager.promise,
2376
+ /** Dismiss a specific toast by id. */
2377
+ dismiss: (id) => manager.close(id),
2378
+ /** Imperatively update an existing toast. */
2379
+ update: manager.update
2380
+ });
2381
+ }
2382
+ var toast = makeToast(toastManager);
2383
+ var TYPE_ICON = {
2384
+ default: null,
2385
+ success: CheckmarkIcon,
2386
+ error: ExclamationIcon,
2387
+ info: InformationIcon,
2388
+ warning: WarningIcon
2389
+ };
2390
+ var TYPE_ICON_COLOR = {
2391
+ default: "",
2392
+ success: "text-success",
2393
+ error: "text-error",
2394
+ info: "text-info",
2395
+ warning: "text-warning"
2396
+ };
2397
+ var TYPE_SURFACE = {
2398
+ default: "surface-default border border-default",
2399
+ success: "surface-success",
2400
+ error: "surface-error",
2401
+ info: "surface-info",
2402
+ warning: "surface-warning"
2403
+ };
2404
+ var VIEWPORT_POSITION = {
2405
+ "top-center": "top-4 left-1/2 -translate-x-1/2 sm:top-8",
2406
+ "top-right": "top-4 right-4 sm:top-8 sm:right-8",
2407
+ "bottom-left": "bottom-4 left-4 sm:bottom-8 sm:left-8",
2408
+ "bottom-center": "bottom-4 left-1/2 -translate-x-1/2 sm:bottom-8",
2409
+ "bottom-right": "bottom-4 right-4 sm:bottom-8 sm:right-8"
2410
+ };
2411
+ function ToastList({ side }) {
2412
+ const { toasts } = ToastPrimitive.useToastManager();
2413
+ return toasts.map((item) => {
2414
+ const rawType = item.type;
2415
+ const type = rawType in TYPE_SURFACE ? rawType : "default";
2416
+ const Icon = TYPE_ICON[type] ?? null;
2417
+ return /* @__PURE__ */ jsx18(
2418
+ ToastPrimitive.Root,
2419
+ {
2420
+ toast: item,
2421
+ "data-slot": "toast",
2422
+ swipeDirection: side === "top" ? ["up", "right"] : ["down", "right"],
2423
+ style: { "--y-dir": side === "top" ? 1 : -1 },
2424
+ className: cn(
2425
+ // Stacking math (CSS variables provided by Base UI)
2426
+ "[--gap:0.75rem] [--peek:0.625rem]",
2427
+ "[--scale:calc(max(0,1-(var(--toast-index)*0.06)))] [--shrink:calc(1-var(--scale))]",
2428
+ "[--height:var(--toast-frontmost-height,var(--toast-height))]",
2429
+ "[--offset-y:calc((var(--toast-offset-y)*var(--y-dir))+(var(--toast-index)*var(--gap)*var(--y-dir))+var(--toast-swipe-movement-y))]",
2430
+ // Layout — anchored to the viewport edge, full width, stacked by z-index
2431
+ "absolute left-auto right-0 mr-0 w-full",
2432
+ "z-[calc(1000-var(--toast-index))] h-[var(--height)] data-expanded:h-[var(--toast-height)]",
2433
+ side === "top" ? "top-0 origin-top" : "bottom-0 origin-bottom",
2434
+ // Surface — variant-tinted to match the Alert component (default = neutral)
2435
+ TYPE_SURFACE[type],
2436
+ "rounded-lg bg-clip-padding shadow-lg select-none",
2437
+ // Collapsed transform: peek + shrink each toast behind the front one
2438
+ "[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--y-dir)*((var(--toast-index)*var(--peek))+(var(--shrink)*var(--height))))))_scale(var(--scale))]",
2439
+ // Expanded (hover/focus) transform: fan out by real heights + gap
2440
+ "data-expanded:[transform:translateX(var(--toast-swipe-movement-x))_translateY(var(--offset-y))]",
2441
+ // Enter / exit
2442
+ "data-starting-style:[transform:translateY(calc(var(--y-dir)*-150%))]",
2443
+ "data-ending-style:opacity-0 data-limited:opacity-0",
2444
+ "[&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateY(calc(var(--y-dir)*-150%))]",
2445
+ // Swipe-to-dismiss exits
2446
+ "data-ending-style:data-[swipe-direction=down]:[transform:translateY(calc(var(--toast-swipe-movement-y)+150%))]",
2447
+ "data-ending-style:data-[swipe-direction=up]:[transform:translateY(calc(var(--toast-swipe-movement-y)-150%))]",
2448
+ "data-ending-style:data-[swipe-direction=left]:[transform:translateX(calc(var(--toast-swipe-movement-x)-150%))_translateY(var(--offset-y))]",
2449
+ "data-ending-style:data-[swipe-direction=right]:[transform:translateX(calc(var(--toast-swipe-movement-x)+150%))_translateY(var(--offset-y))]",
2450
+ // Invisible spacer keeps the hover target contiguous across the gap
2451
+ "after:absolute after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:content-['']",
2452
+ side === "top" ? "after:top-full" : "after:bottom-full",
2453
+ // Motion
2454
+ "[transition:transform_0.5s_cubic-bezier(0.22,1,0.36,1),opacity_0.4s,height_0.15s]"
2455
+ ),
2456
+ children: /* @__PURE__ */ jsxs11(
2457
+ ToastPrimitive.Content,
2458
+ {
2459
+ "data-slot": "toast-content",
2460
+ className: cn(
2461
+ "flex h-full gap-3 px-4 py-3 overflow-hidden",
2462
+ item.description ? "items-start" : "items-center",
2463
+ "transition-opacity duration-[250ms] ease-[cubic-bezier(0.22,1,0.36,1)]",
2464
+ "data-behind:opacity-0 data-expanded:opacity-100"
2465
+ ),
2466
+ children: [
2467
+ Icon ? /* @__PURE__ */ jsx18(
2468
+ Icon,
2469
+ {
2470
+ className: cn("mt-0.5 size-4 shrink-0", TYPE_ICON_COLOR[type])
2471
+ }
2472
+ ) : null,
2473
+ /* @__PURE__ */ jsxs11("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
2474
+ /* @__PURE__ */ jsx18(
2475
+ ToastPrimitive.Title,
2476
+ {
2477
+ "data-slot": "toast-title",
2478
+ className: item.description ? "type-body-sm-medium text-default" : "type-label-sm-medium text-default"
2479
+ }
2480
+ ),
2481
+ item.description && /* @__PURE__ */ jsx18(
2482
+ ToastPrimitive.Description,
2483
+ {
2484
+ "data-slot": "toast-description",
2485
+ className: "type-body-sm-regular text-secondary"
2486
+ }
2487
+ )
2488
+ ] }),
2489
+ item.actionProps ? /* @__PURE__ */ jsx18(
2490
+ ToastPrimitive.Action,
2491
+ {
2492
+ "data-slot": "toast-action",
2493
+ render: /* @__PURE__ */ jsx18(Button, { variant: "default", size: "mini" }),
2494
+ ...item.actionProps
2495
+ }
2496
+ ) : null,
2497
+ /* @__PURE__ */ jsx18(
2498
+ ToastPrimitive.Close,
2499
+ {
2500
+ "data-slot": "toast-close",
2501
+ "aria-label": "Dismiss notification",
2502
+ className: cn(
2503
+ "shrink-0 rounded-md p-1 text-secondary",
2504
+ "transition-colors hover:surface-secondary hover:text-default",
2505
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-default"
2506
+ ),
2507
+ children: /* @__PURE__ */ jsx18(CloseIcon, { className: "size-4" })
2508
+ }
2509
+ )
2510
+ ]
2511
+ }
2512
+ )
2513
+ },
2514
+ item.id
2515
+ );
2516
+ });
2517
+ }
2518
+ function Toaster({
2519
+ position = "bottom-right",
2520
+ timeout,
2521
+ limit,
2522
+ className,
2523
+ toastManager: manager = toastManager
2524
+ }) {
2525
+ const side = position.startsWith("top") ? "top" : "bottom";
2526
+ return /* @__PURE__ */ jsx18(
2527
+ ToastPrimitive.Provider,
2528
+ {
2529
+ toastManager: manager,
2530
+ timeout,
2531
+ limit,
2532
+ children: /* @__PURE__ */ jsx18(ToastPrimitive.Portal, { children: /* @__PURE__ */ jsx18(
2533
+ ToastPrimitive.Viewport,
2534
+ {
2535
+ "data-slot": "toaster",
2536
+ className: cn(
2537
+ "fixed z-50 mx-auto flex w-[calc(100vw-2rem)] sm:w-[400px]",
2538
+ VIEWPORT_POSITION[position],
2539
+ className
2540
+ ),
2541
+ children: /* @__PURE__ */ jsx18(ToastList, { side })
2542
+ }
2543
+ ) })
2544
+ }
2545
+ );
2546
+ }
2547
+ function createToaster() {
2548
+ const manager = ToastPrimitive.createToastManager();
2549
+ const scopedToast = makeToast(manager);
2550
+ function ScopedToaster(props) {
2551
+ return /* @__PURE__ */ jsx18(Toaster, { ...props, toastManager: manager });
2552
+ }
2553
+ return { toast: scopedToast, Toaster: ScopedToaster };
2554
+ }
2555
+
2556
+ // src/components/ui/hover-card.tsx
2557
+ import { PreviewCard as PreviewCardPrimitive } from "@base-ui/react/preview-card";
2558
+ import { jsx as jsx19 } from "react/jsx-runtime";
2559
+ function HoverCard({ ...props }) {
2560
+ return /* @__PURE__ */ jsx19(PreviewCardPrimitive.Root, { ...props });
2561
+ }
2562
+ HoverCard.displayName = "HoverCard";
2563
+ function HoverCardTrigger({ ...props }) {
2564
+ return /* @__PURE__ */ jsx19(PreviewCardPrimitive.Trigger, { "data-slot": "hover-card-trigger", ...props });
2565
+ }
2566
+ HoverCardTrigger.displayName = "HoverCardTrigger";
2567
+ function HoverCardContent({
2568
+ className,
2569
+ side = "bottom",
2570
+ sideOffset = 8,
2571
+ align = "center",
2572
+ alignOffset = 0,
2573
+ ...props
2574
+ }) {
2575
+ return /* @__PURE__ */ jsx19(PreviewCardPrimitive.Portal, { children: /* @__PURE__ */ jsx19(
2576
+ PreviewCardPrimitive.Positioner,
2577
+ {
2578
+ align,
2579
+ alignOffset,
2580
+ side,
2581
+ sideOffset,
2582
+ className: "isolate z-50",
2583
+ children: /* @__PURE__ */ jsx19(
2584
+ PreviewCardPrimitive.Popup,
2585
+ {
2586
+ "data-slot": "hover-card-content",
2587
+ className: cn(
2588
+ // Tokens
2589
+ "surface-default border-default text-default",
2590
+ // Layout
2591
+ "flex flex-col items-start w-fit max-w-xs origin-(--transform-origin) rounded-lg border p-4 shadow-md",
2592
+ // Side-based slide-in
2593
+ "data-[side=top]:slide-in-from-bottom-2",
2594
+ "data-[side=bottom]:slide-in-from-top-2",
2595
+ "data-[side=left]:slide-in-from-right-2",
2596
+ "data-[side=right]:slide-in-from-left-2",
2597
+ "data-[side=inline-start]:slide-in-from-right-2",
2598
+ "data-[side=inline-end]:slide-in-from-left-2",
2599
+ // Open / close animations
2600
+ "data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95",
2601
+ "data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
2602
+ className
2603
+ ),
2604
+ ...props
2605
+ }
2606
+ )
2607
+ }
2608
+ ) });
2609
+ }
2610
+ HoverCardContent.displayName = "HoverCardContent";
2611
+
1755
2612
  // src/components/ui/popover.tsx
1756
2613
  import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
1757
- import { jsx as jsx16 } from "react/jsx-runtime";
2614
+ import { jsx as jsx20 } from "react/jsx-runtime";
1758
2615
  function Popover({ ...props }) {
1759
- return /* @__PURE__ */ jsx16(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
2616
+ return /* @__PURE__ */ jsx20(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
1760
2617
  }
1761
2618
  function PopoverTrigger({ ...props }) {
1762
- return /* @__PURE__ */ jsx16(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
2619
+ return /* @__PURE__ */ jsx20(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
1763
2620
  }
1764
2621
  function PopoverContent({
1765
2622
  className,
@@ -1769,7 +2626,7 @@ function PopoverContent({
1769
2626
  sideOffset = 4,
1770
2627
  ...props
1771
2628
  }) {
1772
- return /* @__PURE__ */ jsx16(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx16(
2629
+ return /* @__PURE__ */ jsx20(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx20(
1773
2630
  PopoverPrimitive.Positioner,
1774
2631
  {
1775
2632
  align,
@@ -1777,7 +2634,7 @@ function PopoverContent({
1777
2634
  side,
1778
2635
  sideOffset,
1779
2636
  className: "isolate z-50",
1780
- children: /* @__PURE__ */ jsx16(
2637
+ children: /* @__PURE__ */ jsx20(
1781
2638
  PopoverPrimitive.Popup,
1782
2639
  {
1783
2640
  "data-slot": "popover-content",
@@ -1800,7 +2657,7 @@ function PopoverContent({
1800
2657
  ) });
1801
2658
  }
1802
2659
  function PopoverHeader({ className, ...props }) {
1803
- return /* @__PURE__ */ jsx16(
2660
+ return /* @__PURE__ */ jsx20(
1804
2661
  "div",
1805
2662
  {
1806
2663
  "data-slot": "popover-header",
@@ -1810,7 +2667,7 @@ function PopoverHeader({ className, ...props }) {
1810
2667
  );
1811
2668
  }
1812
2669
  function PopoverTitle({ className, ...props }) {
1813
- return /* @__PURE__ */ jsx16(
2670
+ return /* @__PURE__ */ jsx20(
1814
2671
  PopoverPrimitive.Title,
1815
2672
  {
1816
2673
  "data-slot": "popover-title",
@@ -1823,7 +2680,7 @@ function PopoverDescription({
1823
2680
  className,
1824
2681
  ...props
1825
2682
  }) {
1826
- return /* @__PURE__ */ jsx16(
2683
+ return /* @__PURE__ */ jsx20(
1827
2684
  PopoverPrimitive.Description,
1828
2685
  {
1829
2686
  "data-slot": "popover-description",
@@ -1834,15 +2691,15 @@ function PopoverDescription({
1834
2691
  }
1835
2692
 
1836
2693
  // src/components/ui/sidebar.tsx
1837
- import * as React6 from "react";
1838
- import { jsx as jsx17, jsxs as jsxs8 } from "react/jsx-runtime";
2694
+ import * as React8 from "react";
2695
+ import { jsx as jsx21, jsxs as jsxs12 } from "react/jsx-runtime";
1839
2696
  var SIDEBAR_CONSTANTS = {
1840
2697
  WIDTH: "144px",
1841
2698
  WIDTH_ICON: "48px"
1842
2699
  };
1843
- var SidebarContext = React6.createContext(null);
2700
+ var SidebarContext = React8.createContext(null);
1844
2701
  function useSidebar() {
1845
- const context = React6.useContext(SidebarContext);
2702
+ const context = React8.useContext(SidebarContext);
1846
2703
  if (!context) {
1847
2704
  throw new Error("useSidebar must be used within a SidebarProvider.");
1848
2705
  }
@@ -1858,9 +2715,9 @@ function SidebarProvider({
1858
2715
  ref,
1859
2716
  ...props
1860
2717
  }) {
1861
- const [_open, _setOpen] = React6.useState(defaultOpen);
2718
+ const [_open, _setOpen] = React8.useState(defaultOpen);
1862
2719
  const open = openProp ?? _open;
1863
- const setOpen = React6.useCallback(
2720
+ const setOpen = React8.useCallback(
1864
2721
  (value) => {
1865
2722
  const openState = typeof value === "function" ? value(open) : value;
1866
2723
  if (setOpenProp) {
@@ -1871,11 +2728,11 @@ function SidebarProvider({
1871
2728
  },
1872
2729
  [setOpenProp, open]
1873
2730
  );
1874
- const toggleSidebar = React6.useCallback(() => {
2731
+ const toggleSidebar = React8.useCallback(() => {
1875
2732
  return setOpen((open2) => !open2);
1876
2733
  }, [setOpen]);
1877
2734
  const state = open ? "expanded" : "collapsed";
1878
- const contextValue = React6.useMemo(
2735
+ const contextValue = React8.useMemo(
1879
2736
  () => ({
1880
2737
  state,
1881
2738
  open,
@@ -1884,7 +2741,7 @@ function SidebarProvider({
1884
2741
  }),
1885
2742
  [state, open, setOpen, toggleSidebar]
1886
2743
  );
1887
- return /* @__PURE__ */ jsx17(SidebarContext, { value: contextValue, children: /* @__PURE__ */ jsx17(
2744
+ return /* @__PURE__ */ jsx21(SidebarContext, { value: contextValue, children: /* @__PURE__ */ jsx21(
1888
2745
  "div",
1889
2746
  {
1890
2747
  style: {
@@ -1910,7 +2767,7 @@ function Sidebar({
1910
2767
  ...props
1911
2768
  }) {
1912
2769
  const { state } = useSidebar();
1913
- return /* @__PURE__ */ jsxs8(
2770
+ return /* @__PURE__ */ jsxs12(
1914
2771
  "aside",
1915
2772
  {
1916
2773
  ref,
@@ -1921,7 +2778,7 @@ function Sidebar({
1921
2778
  "aria-expanded": state === "expanded",
1922
2779
  role: "navigation",
1923
2780
  children: [
1924
- /* @__PURE__ */ jsx17(
2781
+ /* @__PURE__ */ jsx21(
1925
2782
  "div",
1926
2783
  {
1927
2784
  className: cn(
@@ -1930,14 +2787,14 @@ function Sidebar({
1930
2787
  )
1931
2788
  }
1932
2789
  ),
1933
- /* @__PURE__ */ jsx17(
2790
+ /* @__PURE__ */ jsx21(
1934
2791
  "div",
1935
2792
  {
1936
2793
  className: cn(
1937
- "fixed inset-y-0 z-10 h-svh w-[var(--sidebar-width)] transition-[left,right,width] duration-200 ease-linear flex left-0",
2794
+ "fixed inset-y-0 z-10 h-svh w-[var(--sidebar-width)] transition-[left,right,width] duration-200 ease-linear flex left-0 border-r border-[var(--color-sidebar-border)]",
1938
2795
  "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]"
1939
2796
  ),
1940
- children: /* @__PURE__ */ jsx17(
2797
+ children: /* @__PURE__ */ jsx21(
1941
2798
  "div",
1942
2799
  {
1943
2800
  "data-sidebar": "sidebar",
@@ -1956,7 +2813,7 @@ function Sidebar({
1956
2813
  );
1957
2814
  }
1958
2815
  function SidebarInset({ className, ref, ...props }) {
1959
- return /* @__PURE__ */ jsx17(
2816
+ return /* @__PURE__ */ jsx21(
1960
2817
  "main",
1961
2818
  {
1962
2819
  ref,
@@ -1969,7 +2826,7 @@ function SidebarInset({ className, ref, ...props }) {
1969
2826
  );
1970
2827
  }
1971
2828
  function SidebarHeader({ className, ref, ...props }) {
1972
- return /* @__PURE__ */ jsx17(
2829
+ return /* @__PURE__ */ jsx21(
1973
2830
  "div",
1974
2831
  {
1975
2832
  ref,
@@ -1984,7 +2841,7 @@ function SidebarHeader({ className, ref, ...props }) {
1984
2841
  );
1985
2842
  }
1986
2843
  function SidebarFooter({ className, ref, ...props }) {
1987
- return /* @__PURE__ */ jsx17(
2844
+ return /* @__PURE__ */ jsx21(
1988
2845
  "div",
1989
2846
  {
1990
2847
  ref,
@@ -1995,7 +2852,7 @@ function SidebarFooter({ className, ref, ...props }) {
1995
2852
  );
1996
2853
  }
1997
2854
  function SidebarContent({ className, ref, ...props }) {
1998
- return /* @__PURE__ */ jsx17(
2855
+ return /* @__PURE__ */ jsx21(
1999
2856
  "div",
2000
2857
  {
2001
2858
  ref,
@@ -2009,7 +2866,7 @@ function SidebarContent({ className, ref, ...props }) {
2009
2866
  );
2010
2867
  }
2011
2868
  function SidebarGroup({ className, ref, ...props }) {
2012
- return /* @__PURE__ */ jsx17(
2869
+ return /* @__PURE__ */ jsx21(
2013
2870
  "div",
2014
2871
  {
2015
2872
  ref,
@@ -2024,7 +2881,7 @@ function SidebarGroupContent({
2024
2881
  ref,
2025
2882
  ...props
2026
2883
  }) {
2027
- return /* @__PURE__ */ jsx17(
2884
+ return /* @__PURE__ */ jsx21(
2028
2885
  "div",
2029
2886
  {
2030
2887
  ref,
@@ -2035,7 +2892,7 @@ function SidebarGroupContent({
2035
2892
  );
2036
2893
  }
2037
2894
  function SidebarMenu({ className, ref, ...props }) {
2038
- return /* @__PURE__ */ jsx17(
2895
+ return /* @__PURE__ */ jsx21(
2039
2896
  "ul",
2040
2897
  {
2041
2898
  ref,
@@ -2046,7 +2903,7 @@ function SidebarMenu({ className, ref, ...props }) {
2046
2903
  );
2047
2904
  }
2048
2905
  function SidebarMenuItem({ className, ref, ...props }) {
2049
- return /* @__PURE__ */ jsx17(
2906
+ return /* @__PURE__ */ jsx21(
2050
2907
  "li",
2051
2908
  {
2052
2909
  ref,
@@ -2065,7 +2922,7 @@ function SidebarMenuButton({
2065
2922
  ...props
2066
2923
  }) {
2067
2924
  const { state } = useSidebar();
2068
- const button = /* @__PURE__ */ jsx17(
2925
+ const button = /* @__PURE__ */ jsx21(
2069
2926
  "button",
2070
2927
  {
2071
2928
  ref,
@@ -2084,19 +2941,37 @@ function SidebarMenuButton({
2084
2941
  return button;
2085
2942
  }
2086
2943
  const tooltipProps = typeof tooltip === "string" ? { children: tooltip } : tooltip;
2087
- return /* @__PURE__ */ jsx17(TooltipProvider, { delay: 0, children: /* @__PURE__ */ jsxs8(Tooltip, { children: [
2088
- /* @__PURE__ */ jsx17(TooltipTrigger, { render: button }),
2089
- /* @__PURE__ */ jsx17(TooltipContent, { side: "right", align: "center", ...tooltipProps })
2944
+ return /* @__PURE__ */ jsx21(TooltipProvider, { delay: 0, children: /* @__PURE__ */ jsxs12(Tooltip, { children: [
2945
+ /* @__PURE__ */ jsx21(TooltipTrigger, { render: button }),
2946
+ /* @__PURE__ */ jsx21(TooltipContent, { side: "right", align: "center", ...tooltipProps })
2090
2947
  ] }) });
2091
2948
  }
2949
+ function SidebarSeparator({
2950
+ className,
2951
+ ref,
2952
+ ...props
2953
+ }) {
2954
+ return /* @__PURE__ */ jsx21(
2955
+ "div",
2956
+ {
2957
+ ref,
2958
+ "data-sidebar": "separator",
2959
+ className: cn(
2960
+ "border-t border-[var(--color-sidebar-border)] w-full",
2961
+ className
2962
+ ),
2963
+ ...props
2964
+ }
2965
+ );
2966
+ }
2092
2967
 
2093
2968
  // src/components/ui/calendar.tsx
2094
- import * as React7 from "react";
2969
+ import * as React9 from "react";
2095
2970
  import {
2096
2971
  DayPicker,
2097
2972
  getDefaultClassNames
2098
2973
  } from "react-day-picker";
2099
- import { jsx as jsx18 } from "react/jsx-runtime";
2974
+ import { jsx as jsx22 } from "react/jsx-runtime";
2100
2975
  function Calendar({
2101
2976
  className,
2102
2977
  classNames,
@@ -2109,7 +2984,7 @@ function Calendar({
2109
2984
  ...props
2110
2985
  }) {
2111
2986
  const defaultClassNames = getDefaultClassNames();
2112
- return /* @__PURE__ */ jsx18(
2987
+ return /* @__PURE__ */ jsx22(
2113
2988
  DayPicker,
2114
2989
  {
2115
2990
  showOutsideDays,
@@ -2212,7 +3087,7 @@ function Calendar({
2212
3087
  ...classNames
2213
3088
  },
2214
3089
  components: {
2215
- Root: ({ className: rootClassName, rootRef, ...rootProps }) => /* @__PURE__ */ jsx18(
3090
+ Root: ({ className: rootClassName, rootRef, ...rootProps }) => /* @__PURE__ */ jsx22(
2216
3091
  "div",
2217
3092
  {
2218
3093
  "data-slot": "calendar",
@@ -2227,7 +3102,7 @@ function Calendar({
2227
3102
  ...chevronProps
2228
3103
  }) => {
2229
3104
  if (orientation === "left") {
2230
- return /* @__PURE__ */ jsx18(
3105
+ return /* @__PURE__ */ jsx22(
2231
3106
  ArrowLeftIcon,
2232
3107
  {
2233
3108
  className: cn("size-4", chevronClassName),
@@ -2236,7 +3111,7 @@ function Calendar({
2236
3111
  );
2237
3112
  }
2238
3113
  if (orientation === "right") {
2239
- return /* @__PURE__ */ jsx18(
3114
+ return /* @__PURE__ */ jsx22(
2240
3115
  ArrowRightIcon,
2241
3116
  {
2242
3117
  className: cn("size-4", chevronClassName),
@@ -2244,7 +3119,7 @@ function Calendar({
2244
3119
  }
2245
3120
  );
2246
3121
  }
2247
- return /* @__PURE__ */ jsx18(
3122
+ return /* @__PURE__ */ jsx22(
2248
3123
  CaretDownIcon,
2249
3124
  {
2250
3125
  className: cn("size-4", chevronClassName),
@@ -2252,8 +3127,8 @@ function Calendar({
2252
3127
  }
2253
3128
  );
2254
3129
  },
2255
- DayButton: (dayButtonProps) => /* @__PURE__ */ jsx18(CalendarDayButton, { locale, ...dayButtonProps }),
2256
- WeekNumber: ({ children, ...weekNumberProps }) => /* @__PURE__ */ jsx18("td", { ...weekNumberProps, children: /* @__PURE__ */ jsx18("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) }),
3130
+ DayButton: (dayButtonProps) => /* @__PURE__ */ jsx22(CalendarDayButton, { locale, ...dayButtonProps }),
3131
+ WeekNumber: ({ children, ...weekNumberProps }) => /* @__PURE__ */ jsx22("td", { ...weekNumberProps, children: /* @__PURE__ */ jsx22("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) }),
2257
3132
  ...components
2258
3133
  },
2259
3134
  ...props
@@ -2267,11 +3142,11 @@ function CalendarDayButton({
2267
3142
  locale,
2268
3143
  ...props
2269
3144
  }) {
2270
- const ref = React7.useRef(null);
2271
- React7.useEffect(() => {
3145
+ const ref = React9.useRef(null);
3146
+ React9.useEffect(() => {
2272
3147
  if (modifiers.focused) ref.current?.focus();
2273
3148
  }, [modifiers.focused]);
2274
- return /* @__PURE__ */ jsx18(
3149
+ return /* @__PURE__ */ jsx22(
2275
3150
  Button,
2276
3151
  {
2277
3152
  ref,
@@ -2306,8 +3181,8 @@ Calendar.displayName = "Calendar";
2306
3181
  CalendarDayButton.displayName = "CalendarDayButton";
2307
3182
 
2308
3183
  // src/components/ui/date-picker.tsx
2309
- import * as React8 from "react";
2310
- import { jsx as jsx19, jsxs as jsxs9 } from "react/jsx-runtime";
3184
+ import * as React10 from "react";
3185
+ import { jsx as jsx23, jsxs as jsxs13 } from "react/jsx-runtime";
2311
3186
  function DatePickerTrigger({
2312
3187
  label,
2313
3188
  placeholder = "Pick a date",
@@ -2316,11 +3191,11 @@ function DatePickerTrigger({
2316
3191
  ref,
2317
3192
  ...rest
2318
3193
  }) {
2319
- return /* @__PURE__ */ jsxs9(
3194
+ return /* @__PURE__ */ jsxs13(
2320
3195
  PopoverTrigger,
2321
3196
  {
2322
3197
  disabled,
2323
- render: /* @__PURE__ */ jsx19(
3198
+ render: /* @__PURE__ */ jsx23(
2324
3199
  "button",
2325
3200
  {
2326
3201
  ref,
@@ -2345,7 +3220,7 @@ function DatePickerTrigger({
2345
3220
  }
2346
3221
  ),
2347
3222
  children: [
2348
- /* @__PURE__ */ jsx19(
3223
+ /* @__PURE__ */ jsx23(
2349
3224
  CalendarIcon,
2350
3225
  {
2351
3226
  size: 16,
@@ -2353,7 +3228,7 @@ function DatePickerTrigger({
2353
3228
  "aria-hidden": "true"
2354
3229
  }
2355
3230
  ),
2356
- /* @__PURE__ */ jsx19("span", { className: "truncate", children: label ?? placeholder })
3231
+ /* @__PURE__ */ jsx23("span", { className: "truncate", children: label ?? placeholder })
2357
3232
  ]
2358
3233
  }
2359
3234
  );
@@ -2370,8 +3245,8 @@ function DatePicker(props) {
2370
3245
  className,
2371
3246
  ref
2372
3247
  } = props;
2373
- const [date, setDate] = React8.useState(defaultValue);
2374
- const isControlled = React8.useRef("value" in props).current;
3248
+ const [date, setDate] = React10.useState(defaultValue);
3249
+ const isControlled = React10.useRef("value" in props).current;
2375
3250
  const selected = isControlled ? value : date;
2376
3251
  const handleSelect = (day) => {
2377
3252
  if (!isControlled) setDate(day);
@@ -2382,8 +3257,8 @@ function DatePicker(props) {
2382
3257
  month: "long",
2383
3258
  day: "numeric"
2384
3259
  }) : null;
2385
- return /* @__PURE__ */ jsxs9(Popover, { children: [
2386
- /* @__PURE__ */ jsx19(
3260
+ return /* @__PURE__ */ jsxs13(Popover, { children: [
3261
+ /* @__PURE__ */ jsx23(
2387
3262
  DatePickerTrigger,
2388
3263
  {
2389
3264
  ref,
@@ -2393,7 +3268,7 @@ function DatePicker(props) {
2393
3268
  className
2394
3269
  }
2395
3270
  ),
2396
- /* @__PURE__ */ jsx19(PopoverContent, { className: "w-auto p-0", align: "center", children: /* @__PURE__ */ jsx19(
3271
+ /* @__PURE__ */ jsx23(PopoverContent, { className: "w-auto p-0", align: "center", children: /* @__PURE__ */ jsx23(
2397
3272
  Calendar,
2398
3273
  {
2399
3274
  mode: "single",
@@ -2412,11 +3287,11 @@ function DatePicker(props) {
2412
3287
  }
2413
3288
 
2414
3289
  // src/components/ui/upload.tsx
2415
- import * as React9 from "react";
2416
- import { cva as cva8 } from "class-variance-authority";
2417
- import { jsx as jsx20, jsxs as jsxs10 } from "react/jsx-runtime";
3290
+ import * as React11 from "react";
3291
+ import { cva as cva10 } from "class-variance-authority";
3292
+ import { jsx as jsx24, jsxs as jsxs14 } from "react/jsx-runtime";
2418
3293
  var DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
2419
- var uploadVariants = cva8(
3294
+ var uploadVariants = cva10(
2420
3295
  "relative flex flex-col items-center justify-center rounded-lg transition-all duration-200 ease-in-out overflow-hidden w-full p-16 min-h-[200px]",
2421
3296
  {
2422
3297
  variants: {
@@ -2451,8 +3326,8 @@ function Upload({
2451
3326
  ref,
2452
3327
  ...props
2453
3328
  }) {
2454
- const fileInputRef = React9.useRef(null);
2455
- const [isDragOver, setIsDragOver] = React9.useState(false);
3329
+ const fileInputRef = React11.useRef(null);
3330
+ const [isDragOver, setIsDragOver] = React11.useState(false);
2456
3331
  const getFileTypeDisplay = () => {
2457
3332
  const typeMap = {
2458
3333
  "application/pdf": "PDF",
@@ -2516,17 +3391,17 @@ function Upload({
2516
3391
  const renderContent = () => {
2517
3392
  switch (effectiveState) {
2518
3393
  case "error":
2519
- return /* @__PURE__ */ jsxs10(
3394
+ return /* @__PURE__ */ jsxs14(
2520
3395
  "div",
2521
3396
  {
2522
3397
  className: "flex flex-col items-center text-center max-w-[289px]",
2523
3398
  style: { gap: "32px" },
2524
3399
  children: [
2525
- /* @__PURE__ */ jsxs10("div", { className: "space-y-4", children: [
2526
- /* @__PURE__ */ jsx20(Text, { variant: "h5", children: "Upload fail" }),
2527
- /* @__PURE__ */ jsx20(Text, { variant: "body-md", className: "text-error", children: errorMessage })
3400
+ /* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
3401
+ /* @__PURE__ */ jsx24(Text, { variant: "h5", children: "Upload fail" }),
3402
+ /* @__PURE__ */ jsx24(Text, { variant: "body-md", className: "text-error", children: errorMessage })
2528
3403
  ] }),
2529
- /* @__PURE__ */ jsx20(
3404
+ /* @__PURE__ */ jsx24(
2530
3405
  Button,
2531
3406
  {
2532
3407
  variant: "destructive",
@@ -2540,22 +3415,22 @@ function Upload({
2540
3415
  }
2541
3416
  );
2542
3417
  case "uploading":
2543
- return /* @__PURE__ */ jsxs10(
3418
+ return /* @__PURE__ */ jsxs14(
2544
3419
  "div",
2545
3420
  {
2546
3421
  className: "flex flex-col items-center text-center max-w-[289px]",
2547
3422
  style: { gap: "32px" },
2548
3423
  children: [
2549
- /* @__PURE__ */ jsx20(Text, { variant: "h5", className: "text-default", children: "Uploading files" }),
2550
- /* @__PURE__ */ jsxs10("div", { className: "w-full max-w-[720px] space-y-2", children: [
2551
- /* @__PURE__ */ jsx20("div", { className: "w-full surface-secondary rounded-full h-2", children: /* @__PURE__ */ jsx20(
3424
+ /* @__PURE__ */ jsx24(Text, { variant: "h5", className: "text-default", children: "Uploading files" }),
3425
+ /* @__PURE__ */ jsxs14("div", { className: "w-full max-w-[720px] space-y-2", children: [
3426
+ /* @__PURE__ */ jsx24("div", { className: "w-full surface-secondary rounded-full h-2", children: /* @__PURE__ */ jsx24(
2552
3427
  "div",
2553
3428
  {
2554
3429
  className: "interactive-accent h-2 rounded-full transition-all duration-300 ease-in-out",
2555
3430
  style: { width: `${progress}%` }
2556
3431
  }
2557
3432
  ) }),
2558
- /* @__PURE__ */ jsxs10(Text, { variant: "body-sm", className: "text-secondary text-center", children: [
3433
+ /* @__PURE__ */ jsxs14(Text, { variant: "body-sm", className: "text-secondary text-center", children: [
2559
3434
  Math.round(progress),
2560
3435
  "% complete"
2561
3436
  ] })
@@ -2564,29 +3439,29 @@ function Upload({
2564
3439
  }
2565
3440
  );
2566
3441
  case "success":
2567
- return /* @__PURE__ */ jsx20(
3442
+ return /* @__PURE__ */ jsx24(
2568
3443
  "div",
2569
3444
  {
2570
3445
  className: "flex flex-col items-center text-center max-w-[289px]",
2571
3446
  style: { gap: "32px" },
2572
- children: /* @__PURE__ */ jsxs10("div", { className: "space-y-4", children: [
2573
- /* @__PURE__ */ jsx20(Text, { variant: "h5", className: "text-success", children: "Upload successful!" }),
2574
- selectedFiles.length > 0 && /* @__PURE__ */ jsx20("div", { className: "text-center", children: selectedFiles.map((file, index) => /* @__PURE__ */ jsx20(Text, { variant: "body-sm", children: file.name }, index)) })
3447
+ children: /* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
3448
+ /* @__PURE__ */ jsx24(Text, { variant: "h5", className: "text-success", children: "Upload successful!" }),
3449
+ selectedFiles.length > 0 && /* @__PURE__ */ jsx24("div", { className: "text-center", children: selectedFiles.map((file, index) => /* @__PURE__ */ jsx24(Text, { variant: "body-sm", children: file.name }, index)) })
2575
3450
  ] })
2576
3451
  }
2577
3452
  );
2578
3453
  default:
2579
- return /* @__PURE__ */ jsxs10(
3454
+ return /* @__PURE__ */ jsxs14(
2580
3455
  "div",
2581
3456
  {
2582
3457
  className: "flex flex-col items-center text-center max-w-[289px]",
2583
3458
  style: { gap: "32px" },
2584
3459
  children: [
2585
- /* @__PURE__ */ jsxs10("div", { className: "space-y-4", children: [
2586
- /* @__PURE__ */ jsx20(Text, { variant: "h5", className: "text-default", children: "Drag & drop files here" }),
2587
- /* @__PURE__ */ jsx20(Text, { variant: "body-md", className: "text-secondary", children: "or click to browse from your computer" })
3460
+ /* @__PURE__ */ jsxs14("div", { className: "space-y-4", children: [
3461
+ /* @__PURE__ */ jsx24(Text, { variant: "h5", className: "text-default", children: "Drag & drop files here" }),
3462
+ /* @__PURE__ */ jsx24(Text, { variant: "body-md", className: "text-secondary", children: "or click to browse from your computer" })
2588
3463
  ] }),
2589
- /* @__PURE__ */ jsx20(
3464
+ /* @__PURE__ */ jsx24(
2590
3465
  Button,
2591
3466
  {
2592
3467
  variant: "default",
@@ -2600,10 +3475,10 @@ function Upload({
2600
3475
  children: "Choose files"
2601
3476
  }
2602
3477
  ),
2603
- /* @__PURE__ */ jsxs10(Text, { variant: "body-sm", className: "text-secondary", children: [
3478
+ /* @__PURE__ */ jsxs14(Text, { variant: "body-sm", className: "text-secondary", children: [
2604
3479
  "Supported file: ",
2605
3480
  getFileTypeDisplay(),
2606
- /* @__PURE__ */ jsx20("br", {}),
3481
+ /* @__PURE__ */ jsx24("br", {}),
2607
3482
  "Max: ",
2608
3483
  Math.round(maxFileSize / 1024 / 1024),
2609
3484
  " MB each"
@@ -2613,7 +3488,7 @@ function Upload({
2613
3488
  );
2614
3489
  }
2615
3490
  };
2616
- return /* @__PURE__ */ jsxs10(
3491
+ return /* @__PURE__ */ jsxs14(
2617
3492
  "div",
2618
3493
  {
2619
3494
  ref,
@@ -2632,7 +3507,7 @@ function Upload({
2632
3507
  "aria-disabled": disabled,
2633
3508
  ...props,
2634
3509
  children: [
2635
- /* @__PURE__ */ jsx20(
3510
+ /* @__PURE__ */ jsx24(
2636
3511
  "input",
2637
3512
  {
2638
3513
  ref: fileInputRef,
@@ -2651,9 +3526,9 @@ function Upload({
2651
3526
 
2652
3527
  // src/components/ui/avatar.tsx
2653
3528
  import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar";
2654
- import { cva as cva9 } from "class-variance-authority";
2655
- import { jsx as jsx21 } from "react/jsx-runtime";
2656
- var avatarVariants = cva9(
3529
+ import { cva as cva11 } from "class-variance-authority";
3530
+ import { jsx as jsx25 } from "react/jsx-runtime";
3531
+ var avatarVariants = cva11(
2657
3532
  "relative flex shrink-0 overflow-hidden select-none",
2658
3533
  {
2659
3534
  variants: {
@@ -2681,7 +3556,7 @@ var avatarVariants = cva9(
2681
3556
  }
2682
3557
  );
2683
3558
  function Avatar({ className, size, shape, ref, ...props }) {
2684
- return /* @__PURE__ */ jsx21(
3559
+ return /* @__PURE__ */ jsx25(
2685
3560
  AvatarPrimitive.Root,
2686
3561
  {
2687
3562
  ref,
@@ -2697,7 +3572,7 @@ function AvatarImage({
2697
3572
  ref,
2698
3573
  ...props
2699
3574
  }) {
2700
- return /* @__PURE__ */ jsx21(
3575
+ return /* @__PURE__ */ jsx25(
2701
3576
  AvatarPrimitive.Image,
2702
3577
  {
2703
3578
  ref,
@@ -2712,7 +3587,7 @@ function AvatarFallback({
2712
3587
  ref,
2713
3588
  ...props
2714
3589
  }) {
2715
- return /* @__PURE__ */ jsx21(
3590
+ return /* @__PURE__ */ jsx25(
2716
3591
  AvatarPrimitive.Fallback,
2717
3592
  {
2718
3593
  ref,
@@ -2737,7 +3612,7 @@ function AvatarGroup({
2737
3612
  ref,
2738
3613
  ...props
2739
3614
  }) {
2740
- return /* @__PURE__ */ jsx21(
3615
+ return /* @__PURE__ */ jsx25(
2741
3616
  "div",
2742
3617
  {
2743
3618
  ref,
@@ -2758,7 +3633,7 @@ function AvatarGroupCount({
2758
3633
  ref,
2759
3634
  ...props
2760
3635
  }) {
2761
- return /* @__PURE__ */ jsx21(
3636
+ return /* @__PURE__ */ jsx25(
2762
3637
  "div",
2763
3638
  {
2764
3639
  ref,
@@ -2780,9 +3655,9 @@ function AvatarGroupCount({
2780
3655
 
2781
3656
  // src/components/ui/checkbox.tsx
2782
3657
  import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox";
2783
- import { cva as cva10 } from "class-variance-authority";
2784
- import { jsx as jsx22, jsxs as jsxs11 } from "react/jsx-runtime";
2785
- var checkboxVariants = cva10([
3658
+ import { cva as cva12 } from "class-variance-authority";
3659
+ import { jsx as jsx26, jsxs as jsxs15 } from "react/jsx-runtime";
3660
+ var checkboxVariants = cva12([
2786
3661
  // Base layout & appearance
2787
3662
  "peer group relative size-4 shrink-0",
2788
3663
  "rounded-xs border border-default surface-default shadow-xs",
@@ -2807,27 +3682,27 @@ var checkboxVariants = cva10([
2807
3682
  "[&_svg]:pointer-events-none [&_svg]:shrink-0"
2808
3683
  ]);
2809
3684
  function Checkbox({ className, ref, ...props }) {
2810
- return /* @__PURE__ */ jsx22(
3685
+ return /* @__PURE__ */ jsx26(
2811
3686
  CheckboxPrimitive.Root,
2812
3687
  {
2813
3688
  "data-slot": "checkbox",
2814
3689
  ref,
2815
3690
  className: cn(checkboxVariants(), className),
2816
3691
  ...props,
2817
- children: /* @__PURE__ */ jsxs11(
3692
+ children: /* @__PURE__ */ jsxs15(
2818
3693
  CheckboxPrimitive.Indicator,
2819
3694
  {
2820
3695
  "data-slot": "checkbox-indicator",
2821
3696
  className: "absolute inset-0 flex items-center justify-center text-current",
2822
3697
  children: [
2823
- /* @__PURE__ */ jsx22(
3698
+ /* @__PURE__ */ jsx26(
2824
3699
  CheckmarkIcon,
2825
3700
  {
2826
3701
  size: 14,
2827
3702
  className: "text-current hidden group-data-[checked]:block"
2828
3703
  }
2829
3704
  ),
2830
- /* @__PURE__ */ jsx22(
3705
+ /* @__PURE__ */ jsx26(
2831
3706
  MinusIcon,
2832
3707
  {
2833
3708
  size: 14,
@@ -2841,11 +3716,143 @@ function Checkbox({ className, ref, ...props }) {
2841
3716
  );
2842
3717
  }
2843
3718
 
3719
+ // src/components/ui/radio-group.tsx
3720
+ import * as React12 from "react";
3721
+ import { RadioGroup as RadioGroupPrimitive } from "@base-ui/react/radio-group";
3722
+ import { Radio as RadioPrimitive } from "@base-ui/react/radio";
3723
+ import { cva as cva13 } from "class-variance-authority";
3724
+ import { jsx as jsx27, jsxs as jsxs16 } from "react/jsx-runtime";
3725
+ var radioGroupVariants = cva13("flex", {
3726
+ variants: {
3727
+ orientation: {
3728
+ vertical: "flex-col gap-2",
3729
+ horizontal: "flex-row flex-wrap gap-4"
3730
+ },
3731
+ layout: {
3732
+ // Items shrink-wrap their content
3733
+ inline: "",
3734
+ // Items stretch to fill the container; labels take remaining space.
3735
+ // Requires each item to be wrapped in a single element:
3736
+ // RadioGroup > div > (RadioGroupItem + label)
3737
+ // Using RadioGroupCard satisfies this automatically.
3738
+ // Extra wrapper elements (Fragment, nested divs) will silently break this layout.
3739
+ block: "[&>*>label]:flex-1 [&>*>label]:min-w-0"
3740
+ }
3741
+ },
3742
+ compoundVariants: [
3743
+ // vertical + block: each item spans full container width
3744
+ { orientation: "vertical", layout: "block", class: "[&>*]:w-full" },
3745
+ // horizontal + block: items share the row equally
3746
+ { orientation: "horizontal", layout: "block", class: "[&>*]:flex-1" }
3747
+ ],
3748
+ defaultVariants: {
3749
+ orientation: "vertical",
3750
+ layout: "inline"
3751
+ }
3752
+ });
3753
+ var radioItemVariants = cva13([
3754
+ // Base layout & appearance
3755
+ "peer group inline-flex relative size-4 shrink-0",
3756
+ "rounded-full border border-default surface-default shadow-xs",
3757
+ // Transitions & hover
3758
+ "transition-colors hover:interactive-hover",
3759
+ // Focus
3760
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-default",
3761
+ // Disabled — checked items are slightly more opaque per design
3762
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50",
3763
+ "data-[disabled]:data-[checked]:opacity-30",
3764
+ // Error (aria-invalid)
3765
+ "aria-invalid:border-error",
3766
+ "aria-invalid:focus-visible:ring-3 aria-invalid:focus-visible:ring-focus-error"
3767
+ ]);
3768
+ function RadioGroup({
3769
+ className,
3770
+ orientation,
3771
+ layout,
3772
+ ...props
3773
+ }) {
3774
+ return /* @__PURE__ */ jsx27(
3775
+ RadioGroupPrimitive,
3776
+ {
3777
+ "data-slot": "radio-group",
3778
+ className: cn(radioGroupVariants({ orientation, layout }), className),
3779
+ ...props
3780
+ }
3781
+ );
3782
+ }
3783
+ function RadioGroupItem({ className, ...props }) {
3784
+ return /* @__PURE__ */ jsx27(
3785
+ RadioPrimitive.Root,
3786
+ {
3787
+ "data-slot": "radio-group-item",
3788
+ className: cn(radioItemVariants(), className),
3789
+ ...props,
3790
+ children: /* @__PURE__ */ jsx27(
3791
+ RadioPrimitive.Indicator,
3792
+ {
3793
+ "data-slot": "radio-group-indicator",
3794
+ className: "absolute inset-0 flex items-center justify-center",
3795
+ children: /* @__PURE__ */ jsx27("span", { className: "size-2 rounded-full interactive-accent group-aria-invalid:interactive-destructive" })
3796
+ }
3797
+ )
3798
+ }
3799
+ );
3800
+ }
3801
+ function RadioGroupCard({
3802
+ className,
3803
+ label,
3804
+ description,
3805
+ flipped = false,
3806
+ id,
3807
+ ref,
3808
+ ...props
3809
+ }) {
3810
+ const generatedId = React12.useId();
3811
+ const itemId = id ?? generatedId;
3812
+ return /* @__PURE__ */ jsxs16(
3813
+ "label",
3814
+ {
3815
+ ref,
3816
+ "data-slot": "radio-group-card",
3817
+ "data-disabled": props.disabled ? "" : void 0,
3818
+ className: cn(
3819
+ "flex items-start gap-3 p-3 border border-default surface-default rounded-md cursor-pointer w-full",
3820
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50",
3821
+ className
3822
+ ),
3823
+ children: [
3824
+ !flipped && // data-[disabled]:opacity-100 cancels the item-level opacity since
3825
+ // the card wrapper already applies opacity-50 for the whole card.
3826
+ /* @__PURE__ */ jsx27(
3827
+ RadioGroupItem,
3828
+ {
3829
+ id: itemId,
3830
+ className: "mt-[2.5px] data-[disabled]:opacity-100",
3831
+ ...props
3832
+ }
3833
+ ),
3834
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-1.5 min-w-0 flex-1", children: [
3835
+ /* @__PURE__ */ jsx27("span", { className: "type-body-sm-medium text-default", children: label }),
3836
+ description && /* @__PURE__ */ jsx27("span", { className: "type-body-xs-regular text-secondary", children: description })
3837
+ ] }),
3838
+ flipped && /* @__PURE__ */ jsx27(
3839
+ RadioGroupItem,
3840
+ {
3841
+ id: itemId,
3842
+ className: "mt-[2.5px] data-[disabled]:opacity-100",
3843
+ ...props
3844
+ }
3845
+ )
3846
+ ]
3847
+ }
3848
+ );
3849
+ }
3850
+
2844
3851
  // src/components/ui/switch.tsx
2845
3852
  import { Switch as SwitchPrimitive } from "@base-ui/react/switch";
2846
- import { cva as cva11 } from "class-variance-authority";
2847
- import { jsx as jsx23 } from "react/jsx-runtime";
2848
- var switchVariants = cva11(
3853
+ import { cva as cva14 } from "class-variance-authority";
3854
+ import { jsx as jsx28 } from "react/jsx-runtime";
3855
+ var switchVariants = cva14(
2849
3856
  "peer inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 relative focus-visible:ring-3 focus-visible:ring-focus-default aria-invalid:border-error aria-invalid:ring-3 aria-invalid:ring-focus-error data-checked:interactive-accent data-unchecked:interactive-secondary data-unchecked:border-default data-disabled:cursor-not-allowed data-disabled:opacity-50",
2850
3857
  {
2851
3858
  variants: {
@@ -2859,7 +3866,7 @@ var switchVariants = cva11(
2859
3866
  }
2860
3867
  }
2861
3868
  );
2862
- var switchThumbVariants = cva11(
3869
+ var switchThumbVariants = cva14(
2863
3870
  "pointer-events-none block rounded-full surface-default shadow-sm ring-0 transition-transform",
2864
3871
  {
2865
3872
  variants: {
@@ -2874,14 +3881,14 @@ var switchThumbVariants = cva11(
2874
3881
  }
2875
3882
  );
2876
3883
  function Switch({ className, size, ref, ...props }) {
2877
- return /* @__PURE__ */ jsx23(
3884
+ return /* @__PURE__ */ jsx28(
2878
3885
  SwitchPrimitive.Root,
2879
3886
  {
2880
3887
  ref,
2881
3888
  "data-slot": "switch",
2882
3889
  className: cn(switchVariants({ size }), className),
2883
3890
  ...props,
2884
- children: /* @__PURE__ */ jsx23(
3891
+ children: /* @__PURE__ */ jsx28(
2885
3892
  SwitchPrimitive.Thumb,
2886
3893
  {
2887
3894
  "data-slot": "switch-thumb",
@@ -2892,11 +3899,116 @@ function Switch({ className, size, ref, ...props }) {
2892
3899
  );
2893
3900
  }
2894
3901
 
3902
+ // src/components/ui/slider.tsx
3903
+ import { Slider as SliderPrimitive } from "@base-ui/react/slider";
3904
+ import { cva as cva15 } from "class-variance-authority";
3905
+ import { jsx as jsx29, jsxs as jsxs17 } from "react/jsx-runtime";
3906
+ var sliderControlVariants = cva15([
3907
+ // Base layout
3908
+ "relative flex w-full touch-none select-none items-center",
3909
+ // Disabled
3910
+ "data-[disabled]:opacity-50",
3911
+ // Vertical orientation
3912
+ "data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40",
3913
+ "data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col"
3914
+ ]);
3915
+ var sliderTrackVariants = cva15([
3916
+ // Base layout & appearance
3917
+ "relative grow overflow-hidden rounded-full",
3918
+ "interactive-secondary",
3919
+ // Horizontal orientation
3920
+ "data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full",
3921
+ // Vertical orientation
3922
+ "data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-1"
3923
+ ]);
3924
+ var sliderIndicatorVariants = cva15([
3925
+ // Background
3926
+ "interactive-accent",
3927
+ // Horizontal orientation
3928
+ "data-[orientation=horizontal]:h-full",
3929
+ // Vertical orientation
3930
+ "data-[orientation=vertical]:w-full"
3931
+ ]);
3932
+ var sliderThumbVariants = cva15([
3933
+ // Base layout & appearance
3934
+ "relative block size-3 shrink-0",
3935
+ "rounded-full border border-[var(--color-interactive-accent)] interactive-default shadow-xs",
3936
+ // Transitions
3937
+ "transition-[color,box-shadow]",
3938
+ // Extended hit area
3939
+ "after:absolute after:-inset-2",
3940
+ // Hover & active
3941
+ "hover:ring-2 hover:ring-focus-default active:ring-2 active:ring-focus-default",
3942
+ // Focus (targets inner hidden input via :has)
3943
+ "has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-focus-default has-[:focus-visible]:outline-hidden",
3944
+ // Disabled
3945
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
3946
+ ]);
3947
+ function Slider({
3948
+ className,
3949
+ defaultValue,
3950
+ value,
3951
+ min = 0,
3952
+ max = 100,
3953
+ thumbLabels,
3954
+ ...props
3955
+ }) {
3956
+ const values = Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : typeof value === "number" ? [value] : typeof defaultValue === "number" ? [defaultValue] : [min];
3957
+ return /* @__PURE__ */ jsx29(
3958
+ SliderPrimitive.Root,
3959
+ {
3960
+ "data-slot": "slider",
3961
+ className: cn(
3962
+ "data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full",
3963
+ className
3964
+ ),
3965
+ defaultValue,
3966
+ value,
3967
+ min,
3968
+ max,
3969
+ thumbAlignment: "edge",
3970
+ ...props,
3971
+ children: /* @__PURE__ */ jsxs17(
3972
+ SliderPrimitive.Control,
3973
+ {
3974
+ "data-slot": "slider-control",
3975
+ className: sliderControlVariants(),
3976
+ children: [
3977
+ /* @__PURE__ */ jsx29(
3978
+ SliderPrimitive.Track,
3979
+ {
3980
+ "data-slot": "slider-track",
3981
+ className: sliderTrackVariants(),
3982
+ children: /* @__PURE__ */ jsx29(
3983
+ SliderPrimitive.Indicator,
3984
+ {
3985
+ "data-slot": "slider-range",
3986
+ className: sliderIndicatorVariants()
3987
+ }
3988
+ )
3989
+ }
3990
+ ),
3991
+ Array.from({ length: values.length }, (_, index) => /* @__PURE__ */ jsx29(
3992
+ SliderPrimitive.Thumb,
3993
+ {
3994
+ "data-slot": "slider-thumb",
3995
+ "aria-label": thumbLabels?.[index],
3996
+ className: sliderThumbVariants()
3997
+ },
3998
+ index
3999
+ ))
4000
+ ]
4001
+ }
4002
+ )
4003
+ }
4004
+ );
4005
+ }
4006
+
2895
4007
  // src/components/ui/input.tsx
2896
4008
  import { Input as InputPrimitive } from "@base-ui/react/input";
2897
- import { cva as cva12 } from "class-variance-authority";
2898
- import { jsx as jsx24 } from "react/jsx-runtime";
2899
- var inputVariants = cva12(
4009
+ import { cva as cva16 } from "class-variance-authority";
4010
+ import { jsx as jsx30 } from "react/jsx-runtime";
4011
+ var inputVariants = cva16(
2900
4012
  cn(
2901
4013
  // Layout
2902
4014
  "w-full min-w-0",
@@ -2934,7 +4046,7 @@ var inputVariants = cva12(
2934
4046
  }
2935
4047
  );
2936
4048
  function Input({ className, size, roundness, ref, ...props }) {
2937
- return /* @__PURE__ */ jsx24(
4049
+ return /* @__PURE__ */ jsx30(
2938
4050
  InputPrimitive,
2939
4051
  {
2940
4052
  "data-slot": "input",
@@ -2946,9 +4058,9 @@ function Input({ className, size, roundness, ref, ...props }) {
2946
4058
  }
2947
4059
 
2948
4060
  // src/components/ui/textarea.tsx
2949
- import { jsx as jsx25 } from "react/jsx-runtime";
4061
+ import { jsx as jsx31 } from "react/jsx-runtime";
2950
4062
  function Textarea({ className, style, ref, ...props }) {
2951
- return /* @__PURE__ */ jsx25(
4063
+ return /* @__PURE__ */ jsx31(
2952
4064
  "textarea",
2953
4065
  {
2954
4066
  className: cn(
@@ -2963,9 +4075,9 @@ function Textarea({ className, style, ref, ...props }) {
2963
4075
  }
2964
4076
 
2965
4077
  // src/components/ui/input-group.tsx
2966
- import { cva as cva13 } from "class-variance-authority";
2967
- import { jsx as jsx26 } from "react/jsx-runtime";
2968
- var inputGroupVariants = cva13(
4078
+ import { cva as cva17 } from "class-variance-authority";
4079
+ import { jsx as jsx32 } from "react/jsx-runtime";
4080
+ var inputGroupVariants = cva17(
2969
4081
  cn(
2970
4082
  // Layout
2971
4083
  "group/input-group relative flex w-full min-w-0 items-center overflow-hidden",
@@ -3012,7 +4124,7 @@ function InputGroup({
3012
4124
  ref,
3013
4125
  ...props
3014
4126
  }) {
3015
- return /* @__PURE__ */ jsx26(
4127
+ return /* @__PURE__ */ jsx32(
3016
4128
  "div",
3017
4129
  {
3018
4130
  ref,
@@ -3024,7 +4136,7 @@ function InputGroup({
3024
4136
  }
3025
4137
  );
3026
4138
  }
3027
- var inputGroupAddonVariants = cva13(
4139
+ var inputGroupAddonVariants = cva17(
3028
4140
  "flex h-auto items-center justify-center gap-2 py-1.5 type-body-sm-regular group-data-[size=mini]/input-group:type-body-xs-regular text-secondary select-none [&>svg:not([class*='size-'])]:size-4",
3029
4141
  {
3030
4142
  variants: {
@@ -3046,7 +4158,7 @@ function InputGroupAddon({
3046
4158
  ref,
3047
4159
  ...props
3048
4160
  }) {
3049
- return /* @__PURE__ */ jsx26(
4161
+ return /* @__PURE__ */ jsx32(
3050
4162
  "div",
3051
4163
  {
3052
4164
  ref,
@@ -3061,7 +4173,7 @@ function InputGroupAddon({
3061
4173
  }
3062
4174
  );
3063
4175
  }
3064
- var inputGroupButtonVariants = cva13("shadow-none py-0", {
4176
+ var inputGroupButtonVariants = cva17("shadow-none py-0", {
3065
4177
  variants: {
3066
4178
  size: {
3067
4179
  xs: "h-6 gap-1 rounded-sm px-1.5 type-label-xs-medium [&>svg:not([class*='size-'])]:size-3.5",
@@ -3082,7 +4194,7 @@ function InputGroupButton({
3082
4194
  ref,
3083
4195
  ...props
3084
4196
  }) {
3085
- return /* @__PURE__ */ jsx26(
4197
+ return /* @__PURE__ */ jsx32(
3086
4198
  Button,
3087
4199
  {
3088
4200
  ref,
@@ -3094,7 +4206,7 @@ function InputGroupButton({
3094
4206
  );
3095
4207
  }
3096
4208
  function InputGroupText({ className, ref, ...props }) {
3097
- return /* @__PURE__ */ jsx26(
4209
+ return /* @__PURE__ */ jsx32(
3098
4210
  "span",
3099
4211
  {
3100
4212
  ref,
@@ -3111,7 +4223,7 @@ function InputGroupInput({ className, ref, ...props }) {
3111
4223
  // Most of these classes override Input's default border, background, shadow,
3112
4224
  // and focus/error/disabled styles so that InputGroup owns all visual states
3113
4225
  // via its own has-[...] selectors.
3114
- /* @__PURE__ */ jsx26(
4226
+ /* @__PURE__ */ jsx32(
3115
4227
  Input,
3116
4228
  {
3117
4229
  ref,
@@ -3133,7 +4245,7 @@ function InputGroupTextarea({
3133
4245
  return (
3134
4246
  // Same overrides as InputGroupInput — strips Textarea's own border, background,
3135
4247
  // shadow, and focus/error/disabled styles so InputGroup owns all visual states.
3136
- /* @__PURE__ */ jsx26(
4248
+ /* @__PURE__ */ jsx32(
3137
4249
  Textarea,
3138
4250
  {
3139
4251
  ref,
@@ -3148,121 +4260,59 @@ function InputGroupTextarea({
3148
4260
  );
3149
4261
  }
3150
4262
 
3151
- // src/components/ui/badge.tsx
3152
- import * as React10 from "react";
3153
- import { cva as cva14 } from "class-variance-authority";
3154
- import { jsxs as jsxs12 } from "react/jsx-runtime";
3155
- var badgeVariants = cva14(
4263
+ // src/components/ui/tag.tsx
4264
+ import { cva as cva18 } from "class-variance-authority";
4265
+ import { jsx as jsx33 } from "react/jsx-runtime";
4266
+ var tagVariants = cva18(
3156
4267
  [
3157
4268
  // Layout
3158
- "inline-flex items-center justify-center gap-1",
4269
+ "inline-flex items-center justify-center",
3159
4270
  // Size
3160
- "h-6 px-2",
4271
+ "h-6 px-2.5",
3161
4272
  // Text
3162
- "whitespace-nowrap type-label-xs-medium",
3163
- // Shape
3164
- "rounded-md",
3165
- // Transitions
3166
- "transition-colors",
3167
- // Focus — flush ring, no gap
3168
- "focus-visible:outline-none",
3169
- "focus-visible:ring-2 focus-visible:ring-focus-default",
3170
- // Icons
3171
- "[&_svg]:pointer-events-none [&_svg]:size-3 [&_svg]:shrink-0"
3172
- ],
3173
- {
3174
- variants: {
3175
- variant: {
3176
- primary: ["interactive-accent interactive-accent-fg"],
3177
- secondary: ["interactive-secondary interactive-secondary-fg"],
3178
- outline: [
3179
- "interactive-default interactive-default-fg",
3180
- "border border-default"
3181
- ],
3182
- ghost: ["interactive-default interactive-default-fg"],
3183
- urgent: [
3184
- "interactive-destructive interactive-destructive-fg",
3185
- // Focus
3186
- "focus-visible:ring-3 focus-visible:ring-focus-error"
3187
- ]
3188
- }
3189
- },
3190
- defaultVariants: {}
3191
- }
3192
- );
3193
- function isSingleDisplayCharacter(node) {
3194
- if (node == null || typeof node === "boolean") return false;
3195
- if (typeof node === "string" || typeof node === "number") {
3196
- const trimmed = String(node).trim();
3197
- return trimmed.length === 1;
3198
- }
3199
- if (Array.isArray(node)) {
3200
- const parts = node.filter((x) => x != null && typeof x !== "boolean");
3201
- if (parts.length !== 1) return false;
3202
- return isSingleDisplayCharacter(parts[0]);
3203
- }
3204
- if (React10.isValidElement(node)) {
3205
- return isSingleDisplayCharacter(
3206
- node.props.children
3207
- );
3208
- }
3209
- return false;
3210
- }
3211
- function Badge({
3212
- className,
3213
- variant,
3214
- iconLeft,
3215
- iconRight,
3216
- onKeyDown,
3217
- style,
3218
- children,
3219
- ref,
3220
- ...props
3221
- }) {
3222
- if (!variant) {
3223
- return null;
3224
- }
3225
- const circle = isSingleDisplayCharacter(children) && !iconLeft && !iconRight;
3226
- return /* @__PURE__ */ jsxs12(
3227
- "span",
3228
- {
3229
- ...props,
3230
- role: "button",
3231
- tabIndex: 0,
3232
- onKeyDown: (e) => {
3233
- if (e.key === "Enter" || e.key === " ") {
3234
- e.preventDefault();
3235
- e.currentTarget.click();
3236
- }
3237
- onKeyDown?.(e);
3238
- },
3239
- className: cn(
3240
- badgeVariants({ variant }),
3241
- circle ? "size-5 shrink-0 p-0" : "",
3242
- className
3243
- ),
3244
- style,
4273
+ "whitespace-nowrap type-label-xs-medium",
4274
+ // Shape
4275
+ "rounded-full"
4276
+ ],
4277
+ {
4278
+ variants: {
4279
+ color: {
4280
+ violet: "bg-violet-200 text-black",
4281
+ cyan: "bg-cyan-200 text-black",
4282
+ indigo: "bg-indigo-100 text-black",
4283
+ orange: "bg-orange-200 text-black",
4284
+ pink: "bg-pink-200 text-black",
4285
+ verdant: "bg-verdant-200 text-black",
4286
+ stone: "bg-stone-200 text-black"
4287
+ }
4288
+ },
4289
+ defaultVariants: {
4290
+ color: "stone"
4291
+ }
4292
+ }
4293
+ );
4294
+ function Tag({ className, color, ref, ...props }) {
4295
+ return /* @__PURE__ */ jsx33(
4296
+ "span",
4297
+ {
4298
+ className: cn(tagVariants({ color }), className),
3245
4299
  ref,
3246
- children: [
3247
- iconLeft,
3248
- children,
3249
- iconRight
3250
- ]
4300
+ ...props
3251
4301
  }
3252
4302
  );
3253
4303
  }
3254
4304
 
3255
4305
  // src/components/ui/alert-dialog.tsx
3256
4306
  import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog";
3257
- import { jsx as jsx27, jsxs as jsxs13 } from "react/jsx-runtime";
4307
+ import { jsx as jsx34, jsxs as jsxs18 } from "react/jsx-runtime";
3258
4308
  function AlertDialog({ ...props }) {
3259
- return /* @__PURE__ */ jsx27(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
4309
+ return /* @__PURE__ */ jsx34(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
3260
4310
  }
3261
4311
  function AlertDialogTrigger({
3262
4312
  ref,
3263
4313
  ...props
3264
4314
  }) {
3265
- return /* @__PURE__ */ jsx27(
4315
+ return /* @__PURE__ */ jsx34(
3266
4316
  AlertDialogPrimitive.Trigger,
3267
4317
  {
3268
4318
  ref,
@@ -3276,7 +4326,7 @@ function AlertDialogOverlay({
3276
4326
  ref,
3277
4327
  ...props
3278
4328
  }) {
3279
- return /* @__PURE__ */ jsx27(
4329
+ return /* @__PURE__ */ jsx34(
3280
4330
  AlertDialogPrimitive.Backdrop,
3281
4331
  {
3282
4332
  ref,
@@ -3298,9 +4348,9 @@ function AlertDialogContent({
3298
4348
  ref,
3299
4349
  ...props
3300
4350
  }) {
3301
- return /* @__PURE__ */ jsxs13(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", children: [
3302
- /* @__PURE__ */ jsx27(AlertDialogOverlay, {}),
3303
- /* @__PURE__ */ jsx27(
4351
+ return /* @__PURE__ */ jsxs18(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", children: [
4352
+ /* @__PURE__ */ jsx34(AlertDialogOverlay, {}),
4353
+ /* @__PURE__ */ jsx34(
3304
4354
  AlertDialogPrimitive.Popup,
3305
4355
  {
3306
4356
  ref,
@@ -3333,7 +4383,7 @@ function AlertDialogHeader({
3333
4383
  ref,
3334
4384
  ...props
3335
4385
  }) {
3336
- return /* @__PURE__ */ jsx27(
4386
+ return /* @__PURE__ */ jsx34(
3337
4387
  "div",
3338
4388
  {
3339
4389
  ref,
@@ -3353,7 +4403,7 @@ function AlertDialogFooter({
3353
4403
  ref,
3354
4404
  ...props
3355
4405
  }) {
3356
- return /* @__PURE__ */ jsx27(
4406
+ return /* @__PURE__ */ jsx34(
3357
4407
  "div",
3358
4408
  {
3359
4409
  ref,
@@ -3375,7 +4425,7 @@ function AlertDialogTitle({
3375
4425
  ref,
3376
4426
  ...props
3377
4427
  }) {
3378
- return /* @__PURE__ */ jsx27(
4428
+ return /* @__PURE__ */ jsx34(
3379
4429
  AlertDialogPrimitive.Title,
3380
4430
  {
3381
4431
  ref,
@@ -3390,7 +4440,7 @@ function AlertDialogDescription({
3390
4440
  ref,
3391
4441
  ...props
3392
4442
  }) {
3393
- return /* @__PURE__ */ jsx27(
4443
+ return /* @__PURE__ */ jsx34(
3394
4444
  AlertDialogPrimitive.Description,
3395
4445
  {
3396
4446
  ref,
@@ -3407,12 +4457,12 @@ function AlertDialogAction({
3407
4457
  ref,
3408
4458
  ...props
3409
4459
  }) {
3410
- return /* @__PURE__ */ jsx27(
4460
+ return /* @__PURE__ */ jsx34(
3411
4461
  AlertDialogPrimitive.Close,
3412
4462
  {
3413
4463
  ref,
3414
4464
  "data-slot": "alert-dialog-action",
3415
- render: /* @__PURE__ */ jsx27(Button, { variant, size }),
4465
+ render: /* @__PURE__ */ jsx34(Button, { variant, size }),
3416
4466
  className,
3417
4467
  ...props
3418
4468
  }
@@ -3425,12 +4475,12 @@ function AlertDialogCancel({
3425
4475
  ref,
3426
4476
  ...props
3427
4477
  }) {
3428
- return /* @__PURE__ */ jsx27(
4478
+ return /* @__PURE__ */ jsx34(
3429
4479
  AlertDialogPrimitive.Close,
3430
4480
  {
3431
4481
  ref,
3432
4482
  "data-slot": "alert-dialog-cancel",
3433
- render: /* @__PURE__ */ jsx27(Button, { variant, size }),
4483
+ render: /* @__PURE__ */ jsx34(Button, { variant, size }),
3434
4484
  className,
3435
4485
  ...props
3436
4486
  }
@@ -3438,14 +4488,14 @@ function AlertDialogCancel({
3438
4488
  }
3439
4489
 
3440
4490
  // src/components/ui/item.tsx
3441
- import * as React11 from "react";
4491
+ import * as React13 from "react";
3442
4492
  import { mergeProps as mergeProps3 } from "@base-ui/react/merge-props";
3443
4493
  import { useRender as useRender3 } from "@base-ui/react/use-render";
3444
- import { cva as cva15 } from "class-variance-authority";
3445
- import { jsx as jsx28 } from "react/jsx-runtime";
3446
- var ItemGroupContext = React11.createContext(false);
4494
+ import { cva as cva19 } from "class-variance-authority";
4495
+ import { jsx as jsx35 } from "react/jsx-runtime";
4496
+ var ItemGroupContext = React13.createContext(false);
3447
4497
  function ItemGroup({ className, ref, ...props }) {
3448
- return /* @__PURE__ */ jsx28(ItemGroupContext, { value: true, children: /* @__PURE__ */ jsx28(
4498
+ return /* @__PURE__ */ jsx35(ItemGroupContext, { value: true, children: /* @__PURE__ */ jsx35(
3449
4499
  "div",
3450
4500
  {
3451
4501
  ref,
@@ -3464,7 +4514,7 @@ function ItemSeparator({
3464
4514
  ref,
3465
4515
  ...props
3466
4516
  }) {
3467
- return /* @__PURE__ */ jsx28(
4517
+ return /* @__PURE__ */ jsx35(
3468
4518
  Separator,
3469
4519
  {
3470
4520
  ref,
@@ -3475,7 +4525,7 @@ function ItemSeparator({
3475
4525
  }
3476
4526
  );
3477
4527
  }
3478
- var itemVariants = cva15(
4528
+ var itemVariants = cva19(
3479
4529
  "surface-default rounded-md border group/item flex w-full flex-wrap transition-colors duration-100 outline-none [a]:relative [a]:isolate [a]:after:absolute [a]:after:inset-0 [a]:after:rounded-[inherit] [a]:after:-z-10 [a]:after:pointer-events-none [a]:after:transition-colors",
3480
4530
  {
3481
4531
  variants: {
@@ -3502,7 +4552,7 @@ var Item = ({
3502
4552
  render,
3503
4553
  ...props
3504
4554
  }) => {
3505
- const insideGroup = React11.useContext(ItemGroupContext);
4555
+ const insideGroup = React13.useContext(ItemGroupContext);
3506
4556
  return useRender3({
3507
4557
  defaultTagName: "div",
3508
4558
  props: mergeProps3(
@@ -3520,7 +4570,7 @@ var Item = ({
3520
4570
  }
3521
4571
  });
3522
4572
  };
3523
- var itemMediaVariants = cva15(
4573
+ var itemMediaVariants = cva19(
3524
4574
  "gap-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none",
3525
4575
  {
3526
4576
  variants: {
@@ -3542,7 +4592,7 @@ function ItemMedia({
3542
4592
  ref,
3543
4593
  ...props
3544
4594
  }) {
3545
- return /* @__PURE__ */ jsx28(
4595
+ return /* @__PURE__ */ jsx35(
3546
4596
  "div",
3547
4597
  {
3548
4598
  ref,
@@ -3558,7 +4608,7 @@ function ItemContent({
3558
4608
  ref,
3559
4609
  ...props
3560
4610
  }) {
3561
- return /* @__PURE__ */ jsx28(
4611
+ return /* @__PURE__ */ jsx35(
3562
4612
  "div",
3563
4613
  {
3564
4614
  ref,
@@ -3572,7 +4622,7 @@ function ItemContent({
3572
4622
  );
3573
4623
  }
3574
4624
  function ItemTitle({ className, ref, ...props }) {
3575
- return /* @__PURE__ */ jsx28(
4625
+ return /* @__PURE__ */ jsx35(
3576
4626
  "div",
3577
4627
  {
3578
4628
  ref,
@@ -3590,7 +4640,7 @@ function ItemDescription({
3590
4640
  ref,
3591
4641
  ...props
3592
4642
  }) {
3593
- return /* @__PURE__ */ jsx28(
4643
+ return /* @__PURE__ */ jsx35(
3594
4644
  "p",
3595
4645
  {
3596
4646
  ref,
@@ -3608,7 +4658,7 @@ function ItemActions({
3608
4658
  ref,
3609
4659
  ...props
3610
4660
  }) {
3611
- return /* @__PURE__ */ jsx28(
4661
+ return /* @__PURE__ */ jsx35(
3612
4662
  "div",
3613
4663
  {
3614
4664
  ref,
@@ -3619,7 +4669,7 @@ function ItemActions({
3619
4669
  );
3620
4670
  }
3621
4671
  function ItemHeader({ className, ref, ...props }) {
3622
- return /* @__PURE__ */ jsx28(
4672
+ return /* @__PURE__ */ jsx35(
3623
4673
  "div",
3624
4674
  {
3625
4675
  ref,
@@ -3633,7 +4683,7 @@ function ItemHeader({ className, ref, ...props }) {
3633
4683
  );
3634
4684
  }
3635
4685
  function ItemFooter({ className, ref, ...props }) {
3636
- return /* @__PURE__ */ jsx28(
4686
+ return /* @__PURE__ */ jsx35(
3637
4687
  "div",
3638
4688
  {
3639
4689
  ref,
@@ -3649,14 +4699,14 @@ function ItemFooter({ className, ref, ...props }) {
3649
4699
 
3650
4700
  // src/components/ui/tabs.tsx
3651
4701
  import { Tabs as TabsPrimitive } from "@base-ui/react/tabs";
3652
- import { cva as cva16 } from "class-variance-authority";
3653
- import { jsx as jsx29 } from "react/jsx-runtime";
4702
+ import { cva as cva20 } from "class-variance-authority";
4703
+ import { jsx as jsx36 } from "react/jsx-runtime";
3654
4704
  function Tabs({
3655
4705
  className,
3656
4706
  orientation = "horizontal",
3657
4707
  ...props
3658
4708
  }) {
3659
- return /* @__PURE__ */ jsx29(
4709
+ return /* @__PURE__ */ jsx36(
3660
4710
  TabsPrimitive.Root,
3661
4711
  {
3662
4712
  "data-slot": "tabs",
@@ -3670,7 +4720,7 @@ function Tabs({
3670
4720
  }
3671
4721
  );
3672
4722
  }
3673
- var tabsListVariants = cva16(
4723
+ var tabsListVariants = cva20(
3674
4724
  [
3675
4725
  // base layout
3676
4726
  "group/tabs-list inline-flex w-fit items-center p-1",
@@ -3698,7 +4748,7 @@ function TabsList({
3698
4748
  variant = "default",
3699
4749
  ...props
3700
4750
  }) {
3701
- return /* @__PURE__ */ jsx29(
4751
+ return /* @__PURE__ */ jsx36(
3702
4752
  TabsPrimitive.List,
3703
4753
  {
3704
4754
  "data-slot": "tabs-list",
@@ -3708,7 +4758,7 @@ function TabsList({
3708
4758
  }
3709
4759
  );
3710
4760
  }
3711
- var tabsTriggerVariants = cva16(
4761
+ var tabsTriggerVariants = cva20(
3712
4762
  [
3713
4763
  // base layout
3714
4764
  "relative inline-flex shrink-0 items-center justify-center whitespace-nowrap",
@@ -3762,7 +4812,7 @@ function TabsTrigger({
3762
4812
  size = "regular",
3763
4813
  ...props
3764
4814
  }) {
3765
- return /* @__PURE__ */ jsx29(
4815
+ return /* @__PURE__ */ jsx36(
3766
4816
  TabsPrimitive.Tab,
3767
4817
  {
3768
4818
  "data-slot": "tabs-trigger",
@@ -3772,7 +4822,7 @@ function TabsTrigger({
3772
4822
  );
3773
4823
  }
3774
4824
  function TabsContent({ className, ...props }) {
3775
- return /* @__PURE__ */ jsx29(
4825
+ return /* @__PURE__ */ jsx36(
3776
4826
  TabsPrimitive.Panel,
3777
4827
  {
3778
4828
  "data-slot": "tabs-content",
@@ -3785,8 +4835,8 @@ function TabsContent({ className, ...props }) {
3785
4835
  // src/components/ui/dropdown-menu.tsx
3786
4836
  import { Menu as MenuPrimitive } from "@base-ui/react/menu";
3787
4837
  import { Separator as SeparatorPrimitive2 } from "@base-ui/react/separator";
3788
- import { cva as cva17 } from "class-variance-authority";
3789
- import { jsx as jsx30, jsxs as jsxs14 } from "react/jsx-runtime";
4838
+ import { cva as cva21 } from "class-variance-authority";
4839
+ import { jsx as jsx37, jsxs as jsxs19 } from "react/jsx-runtime";
3790
4840
  var DropdownMenu = MenuPrimitive.Root;
3791
4841
  var DropdownMenuGroup = MenuPrimitive.Group;
3792
4842
  var DropdownMenuSub = MenuPrimitive.SubmenuRoot;
@@ -3796,7 +4846,7 @@ function DropdownMenuTrigger({
3796
4846
  ref,
3797
4847
  ...props
3798
4848
  }) {
3799
- return /* @__PURE__ */ jsx30(
4849
+ return /* @__PURE__ */ jsx37(
3800
4850
  MenuPrimitive.Trigger,
3801
4851
  {
3802
4852
  "data-slot": "dropdown-trigger",
@@ -3815,7 +4865,7 @@ function DropdownMenuContent({
3815
4865
  ref,
3816
4866
  ...props
3817
4867
  }) {
3818
- return /* @__PURE__ */ jsx30(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx30(
4868
+ return /* @__PURE__ */ jsx37(MenuPrimitive.Portal, { children: /* @__PURE__ */ jsx37(
3819
4869
  MenuPrimitive.Positioner,
3820
4870
  {
3821
4871
  className: "isolate z-50 outline-none",
@@ -3823,7 +4873,7 @@ function DropdownMenuContent({
3823
4873
  alignOffset,
3824
4874
  side,
3825
4875
  sideOffset,
3826
- children: /* @__PURE__ */ jsx30(
4876
+ children: /* @__PURE__ */ jsx37(
3827
4877
  MenuPrimitive.Popup,
3828
4878
  {
3829
4879
  "data-slot": "dropdown-content",
@@ -3850,7 +4900,7 @@ function DropdownMenuSubTrigger({
3850
4900
  ref,
3851
4901
  ...props
3852
4902
  }) {
3853
- return /* @__PURE__ */ jsxs14(
4903
+ return /* @__PURE__ */ jsxs19(
3854
4904
  MenuPrimitive.SubmenuTrigger,
3855
4905
  {
3856
4906
  "data-slot": "dropdown-sub-trigger",
@@ -3869,7 +4919,7 @@ function DropdownMenuSubTrigger({
3869
4919
  ...props,
3870
4920
  children: [
3871
4921
  children,
3872
- /* @__PURE__ */ jsx30(ArrowRightIcon, { size: 16, className: "ml-auto text-secondary" })
4922
+ /* @__PURE__ */ jsx37(ArrowRightIcon, { size: 16, className: "ml-auto text-secondary" })
3873
4923
  ]
3874
4924
  }
3875
4925
  );
@@ -3883,7 +4933,7 @@ function DropdownMenuSubContent({
3883
4933
  ref,
3884
4934
  ...props
3885
4935
  }) {
3886
- return /* @__PURE__ */ jsx30(
4936
+ return /* @__PURE__ */ jsx37(
3887
4937
  DropdownMenuContent,
3888
4938
  {
3889
4939
  "data-slot": "dropdown-sub-content",
@@ -3897,7 +4947,7 @@ function DropdownMenuSubContent({
3897
4947
  }
3898
4948
  );
3899
4949
  }
3900
- var dropdownMenuItemVariants = cva17(
4950
+ var dropdownMenuItemVariants = cva21(
3901
4951
  [
3902
4952
  "relative flex w-full cursor-default select-none items-center gap-2",
3903
4953
  "min-h-8 px-2 py-[5.5px] rounded-md",
@@ -3926,7 +4976,7 @@ function DropdownMenuItem({
3926
4976
  ref,
3927
4977
  ...props
3928
4978
  }) {
3929
- return /* @__PURE__ */ jsx30(
4979
+ return /* @__PURE__ */ jsx37(
3930
4980
  MenuPrimitive.Item,
3931
4981
  {
3932
4982
  "data-slot": "dropdown-item",
@@ -3948,7 +4998,7 @@ function DropdownMenuCheckboxItem({
3948
4998
  ref,
3949
4999
  ...props
3950
5000
  }) {
3951
- return /* @__PURE__ */ jsxs14(
5001
+ return /* @__PURE__ */ jsxs19(
3952
5002
  MenuPrimitive.CheckboxItem,
3953
5003
  {
3954
5004
  "data-slot": "dropdown-checkbox-item",
@@ -3966,7 +5016,7 @@ function DropdownMenuCheckboxItem({
3966
5016
  checked,
3967
5017
  ...props,
3968
5018
  children: [
3969
- /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx30(MenuPrimitive.CheckboxItemIndicator, { children: /* @__PURE__ */ jsx30(CheckmarkIcon, { size: 16 }) }) }),
5019
+ /* @__PURE__ */ jsx37("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx37(MenuPrimitive.CheckboxItemIndicator, { children: /* @__PURE__ */ jsx37(CheckmarkIcon, { size: 16 }) }) }),
3970
5020
  children
3971
5021
  ]
3972
5022
  }
@@ -3979,7 +5029,7 @@ function DropdownMenuRadioItem({
3979
5029
  ref,
3980
5030
  ...props
3981
5031
  }) {
3982
- return /* @__PURE__ */ jsxs14(
5032
+ return /* @__PURE__ */ jsxs19(
3983
5033
  MenuPrimitive.RadioItem,
3984
5034
  {
3985
5035
  "data-slot": "dropdown-radio-item",
@@ -3997,7 +5047,7 @@ function DropdownMenuRadioItem({
3997
5047
  ...props,
3998
5048
  children: [
3999
5049
  children,
4000
- /* @__PURE__ */ jsx30("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx30("span", { className: "hidden size-2 rounded-full bg-[var(--color-interactive-accent)] group-data-[checked]:block" }) })
5050
+ /* @__PURE__ */ jsx37("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx37("span", { className: "hidden size-2 rounded-full bg-[var(--color-interactive-accent)] group-data-[checked]:block" }) })
4001
5051
  ]
4002
5052
  }
4003
5053
  );
@@ -4007,7 +5057,7 @@ function DropdownMenuLabel({
4007
5057
  ref,
4008
5058
  ...props
4009
5059
  }) {
4010
- return /* @__PURE__ */ jsx30(
5060
+ return /* @__PURE__ */ jsx37(
4011
5061
  MenuPrimitive.GroupLabel,
4012
5062
  {
4013
5063
  "data-slot": "dropdown-label",
@@ -4025,7 +5075,7 @@ function DropdownMenuSeparator({
4025
5075
  ref,
4026
5076
  ...props
4027
5077
  }) {
4028
- return /* @__PURE__ */ jsx30(
5078
+ return /* @__PURE__ */ jsx37(
4029
5079
  SeparatorPrimitive2,
4030
5080
  {
4031
5081
  "data-slot": "dropdown-separator",
@@ -4042,7 +5092,7 @@ function DropdownMenuShortcut({
4042
5092
  className,
4043
5093
  ...props
4044
5094
  }) {
4045
- return /* @__PURE__ */ jsx30(
5095
+ return /* @__PURE__ */ jsx37(
4046
5096
  "span",
4047
5097
  {
4048
5098
  "data-slot": "dropdown-shortcut",
@@ -4056,15 +5106,462 @@ function DropdownMenuShortcut({
4056
5106
  );
4057
5107
  }
4058
5108
 
5109
+ // src/components/ui/chart.tsx
5110
+ import * as React14 from "react";
5111
+ import * as RechartsPrimitive from "recharts";
5112
+ import { Fragment, jsx as jsx38, jsxs as jsxs20 } from "react/jsx-runtime";
5113
+ var THEMES = { light: "", dark: ".dark" };
5114
+ var INITIAL_DIMENSION = { width: 320, height: 200 };
5115
+ var ChartContext = React14.createContext(null);
5116
+ function useChart() {
5117
+ const context = React14.useContext(ChartContext);
5118
+ if (!context) {
5119
+ throw new Error("useChart must be used within a <ChartContainer />");
5120
+ }
5121
+ return context;
5122
+ }
5123
+ function ChartContainer({
5124
+ id,
5125
+ className,
5126
+ children,
5127
+ config,
5128
+ initialDimension = INITIAL_DIMENSION,
5129
+ ...props
5130
+ }) {
5131
+ const uniqueId = React14.useId();
5132
+ const chartId = `chart-${id ?? uniqueId.replace(/:/g, "")}`;
5133
+ return /* @__PURE__ */ jsx38(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs20(
5134
+ "div",
5135
+ {
5136
+ "data-slot": "chart",
5137
+ "data-chart": chartId,
5138
+ className: cn(
5139
+ // Layout
5140
+ "flex aspect-video justify-center text-xs",
5141
+ // Axis
5142
+ "[&_.recharts-cartesian-axis-tick_text]:fill-(--color-text-secondary)",
5143
+ // Grid
5144
+ "[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-(--color-border-default)/50",
5145
+ "[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-(--color-border-default)",
5146
+ "[&_.recharts-reference-line_[stroke='#ccc']]:stroke-(--color-border-default)",
5147
+ // Tooltip cursor
5148
+ "[&_.recharts-curve.recharts-tooltip-cursor]:stroke-(--color-border-default)",
5149
+ "[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-(--color-surface-muted)",
5150
+ // Dots & sectors
5151
+ "[&_.recharts-dot[stroke='#fff']]:stroke-transparent",
5152
+ "[&_.recharts-sector]:outline-hidden",
5153
+ // Separate pie/donut slices with a stroke matching the surface behind the chart
5154
+ "[&_.recharts-sector[stroke='#fff']]:stroke-(--color-surface-default)",
5155
+ "[&_.recharts-sector[stroke='#fff']]:[stroke-width:2px]",
5156
+ "[&_.recharts-radial-bar-background-sector]:fill-(--color-surface-muted)",
5157
+ // Misc
5158
+ "[&_.recharts-layer]:outline-hidden",
5159
+ "[&_.recharts-surface]:outline-hidden",
5160
+ className
5161
+ ),
5162
+ ...props,
5163
+ children: [
5164
+ /* @__PURE__ */ jsx38(ChartStyle, { id: chartId, config }),
5165
+ /* @__PURE__ */ jsx38(
5166
+ RechartsPrimitive.ResponsiveContainer,
5167
+ {
5168
+ initialDimension,
5169
+ children
5170
+ }
5171
+ )
5172
+ ]
5173
+ }
5174
+ ) });
5175
+ }
5176
+ var ChartStyle = ({ id, config }) => {
5177
+ const colorConfig = Object.entries(config).filter(
5178
+ ([, item]) => item.theme ?? item.color
5179
+ );
5180
+ if (!colorConfig.length) {
5181
+ return null;
5182
+ }
5183
+ return /* @__PURE__ */ jsx38(
5184
+ "style",
5185
+ {
5186
+ dangerouslySetInnerHTML: {
5187
+ __html: Object.entries(THEMES).map(
5188
+ ([theme, prefix]) => `
5189
+ ${prefix} [data-chart=${id}] {
5190
+ ${colorConfig.map(([key, itemConfig]) => {
5191
+ const color = itemConfig.theme?.[theme] ?? itemConfig.color;
5192
+ return color ? ` --color-${key}: ${color};` : null;
5193
+ }).filter(Boolean).join("\n")}
5194
+ }
5195
+ `
5196
+ ).join("\n")
5197
+ }
5198
+ }
5199
+ );
5200
+ };
5201
+ var ChartTooltip = RechartsPrimitive.Tooltip;
5202
+ function ChartTooltipContent({
5203
+ active,
5204
+ payload,
5205
+ className,
5206
+ indicator = "dot",
5207
+ hideLabel = false,
5208
+ hideIndicator = false,
5209
+ label,
5210
+ labelFormatter,
5211
+ labelClassName,
5212
+ formatter,
5213
+ color,
5214
+ nameKey,
5215
+ labelKey
5216
+ }) {
5217
+ const { config } = useChart();
5218
+ const tooltipLabel = React14.useMemo(() => {
5219
+ if (hideLabel || !payload?.length) {
5220
+ return null;
5221
+ }
5222
+ const [item] = payload;
5223
+ const key = `${labelKey ?? item?.dataKey ?? item?.name ?? "value"}`;
5224
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
5225
+ const value = !labelKey && typeof label === "string" ? config[label]?.label ?? label : itemConfig?.label;
5226
+ if (labelFormatter) {
5227
+ return /* @__PURE__ */ jsx38("div", { className: cn("font-semibold text-default", labelClassName), children: labelFormatter(value, payload) });
5228
+ }
5229
+ if (!value) {
5230
+ return null;
5231
+ }
5232
+ return /* @__PURE__ */ jsx38("div", { className: cn("font-semibold text-default", labelClassName), children: value });
5233
+ }, [
5234
+ label,
5235
+ labelFormatter,
5236
+ payload,
5237
+ hideLabel,
5238
+ labelClassName,
5239
+ config,
5240
+ labelKey
5241
+ ]);
5242
+ if (!active || !payload?.length) {
5243
+ return null;
5244
+ }
5245
+ const nestLabel = payload.length === 1 && indicator !== "dot";
5246
+ return /* @__PURE__ */ jsxs20(
5247
+ "div",
5248
+ {
5249
+ className: cn(
5250
+ "grid min-w-[8rem] items-start gap-1.5 rounded-xl border border-muted surface-default px-3 py-2.5 text-xs text-secondary shadow-lg",
5251
+ className
5252
+ ),
5253
+ children: [
5254
+ !nestLabel ? tooltipLabel : null,
5255
+ /* @__PURE__ */ jsx38("div", { className: "grid gap-1.5", children: payload.filter((item) => item.type !== "none").map((item, index) => {
5256
+ const key = `${nameKey ?? item.name ?? item.dataKey ?? "value"}`;
5257
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
5258
+ const indicatorColor = color ?? item.payload?.fill ?? item.color ?? (itemConfig && "color" in itemConfig ? itemConfig.color : void 0);
5259
+ return /* @__PURE__ */ jsx38(
5260
+ "div",
5261
+ {
5262
+ className: cn(
5263
+ "flex w-full flex-wrap items-stretch gap-1.5 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-secondary",
5264
+ indicator === "dot" && "items-center"
5265
+ ),
5266
+ children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ jsxs20(Fragment, { children: [
5267
+ itemConfig?.icon ? /* @__PURE__ */ jsx38(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ jsx38(
5268
+ "div",
5269
+ {
5270
+ className: cn(
5271
+ "shrink-0 border-(--color-border) bg-(--color-bg)",
5272
+ {
5273
+ "h-3.5 w-3.5 rounded-[4px]": indicator === "dot",
5274
+ "w-1 rounded-full": indicator === "line",
5275
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
5276
+ "my-0.5": nestLabel && indicator === "dashed"
5277
+ }
5278
+ ),
5279
+ style: {
5280
+ "--color-bg": indicatorColor,
5281
+ "--color-border": indicatorColor
5282
+ }
5283
+ }
5284
+ ),
5285
+ /* @__PURE__ */ jsxs20(
5286
+ "div",
5287
+ {
5288
+ className: cn(
5289
+ "flex flex-1 justify-between leading-none",
5290
+ nestLabel ? "items-end" : "items-center"
5291
+ ),
5292
+ children: [
5293
+ /* @__PURE__ */ jsxs20("div", { className: "grid gap-1.5", children: [
5294
+ nestLabel ? tooltipLabel : null,
5295
+ /* @__PURE__ */ jsx38("span", { className: "text-secondary", children: itemConfig?.label ?? item.name })
5296
+ ] }),
5297
+ item.value != null && /* @__PURE__ */ jsx38("span", { className: "ml-3 font-semibold text-default tabular-nums", children: typeof item.value === "number" ? item.value.toLocaleString() : String(item.value) })
5298
+ ]
5299
+ }
5300
+ )
5301
+ ] })
5302
+ },
5303
+ index
5304
+ );
5305
+ }) })
5306
+ ]
5307
+ }
5308
+ );
5309
+ }
5310
+ var ChartLegend = RechartsPrimitive.Legend;
5311
+ function ChartLegendContent({
5312
+ className,
5313
+ hideIcon = false,
5314
+ payload,
5315
+ verticalAlign = "bottom",
5316
+ nameKey
5317
+ }) {
5318
+ const { config } = useChart();
5319
+ if (!payload?.length) {
5320
+ return null;
5321
+ }
5322
+ return /* @__PURE__ */ jsx38(
5323
+ "div",
5324
+ {
5325
+ className: cn(
5326
+ "flex items-center justify-center gap-4",
5327
+ verticalAlign === "top" ? "pb-3" : "pt-3",
5328
+ className
5329
+ ),
5330
+ children: payload.filter((item) => item.type !== "none").map((item, index) => {
5331
+ const key = `${nameKey ?? item.dataKey ?? "value"}`;
5332
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
5333
+ const indicatorColor = item.color ?? (itemConfig && "color" in itemConfig ? itemConfig.color : void 0);
5334
+ return /* @__PURE__ */ jsxs20(
5335
+ "div",
5336
+ {
5337
+ className: cn(
5338
+ "flex items-center gap-1.5 text-secondary [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-secondary"
5339
+ ),
5340
+ children: [
5341
+ itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsx38(itemConfig.icon, {}) : /* @__PURE__ */ jsx38(
5342
+ "div",
5343
+ {
5344
+ className: "h-2 w-2 shrink-0 rounded-[2px]",
5345
+ style: {
5346
+ backgroundColor: indicatorColor
5347
+ }
5348
+ }
5349
+ ),
5350
+ itemConfig?.label
5351
+ ]
5352
+ },
5353
+ index
5354
+ );
5355
+ })
5356
+ }
5357
+ );
5358
+ }
5359
+ function getPayloadConfigFromPayload(config, payload, key) {
5360
+ if (typeof payload !== "object" || payload === null) {
5361
+ return void 0;
5362
+ }
5363
+ const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
5364
+ let configLabelKey = key;
5365
+ if (key in payload && typeof payload[key] === "string") {
5366
+ configLabelKey = payload[key];
5367
+ } else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") {
5368
+ configLabelKey = payloadPayload[key];
5369
+ }
5370
+ return configLabelKey in config ? config[configLabelKey] : config[key];
5371
+ }
5372
+
5373
+ // src/components/ui/carousel.tsx
5374
+ import * as React15 from "react";
5375
+ import useEmblaCarousel from "embla-carousel-react";
5376
+ import { jsx as jsx39 } from "react/jsx-runtime";
5377
+ var CarouselContext = React15.createContext(null);
5378
+ function useCarousel() {
5379
+ const context = React15.useContext(CarouselContext);
5380
+ if (!context) {
5381
+ throw new Error("useCarousel must be used within a <Carousel />");
5382
+ }
5383
+ return context;
5384
+ }
5385
+ function Carousel({
5386
+ opts,
5387
+ plugins,
5388
+ setApi,
5389
+ className,
5390
+ children,
5391
+ ref,
5392
+ ...props
5393
+ }) {
5394
+ const [carouselRef, api] = useEmblaCarousel({ ...opts }, plugins);
5395
+ const [canScrollPrev, setCanScrollPrev] = React15.useState(false);
5396
+ const [canScrollNext, setCanScrollNext] = React15.useState(false);
5397
+ const onSelect = React15.useCallback((emblaApi) => {
5398
+ if (!emblaApi) return;
5399
+ setCanScrollPrev(emblaApi.canScrollPrev());
5400
+ setCanScrollNext(emblaApi.canScrollNext());
5401
+ }, []);
5402
+ const scrollPrev = React15.useCallback(() => {
5403
+ api?.scrollPrev();
5404
+ }, [api]);
5405
+ const scrollNext = React15.useCallback(() => {
5406
+ api?.scrollNext();
5407
+ }, [api]);
5408
+ const handleKeyDown = React15.useCallback(
5409
+ (event) => {
5410
+ if (event.key === "ArrowLeft") {
5411
+ event.preventDefault();
5412
+ scrollPrev();
5413
+ } else if (event.key === "ArrowRight") {
5414
+ event.preventDefault();
5415
+ scrollNext();
5416
+ }
5417
+ },
5418
+ [scrollPrev, scrollNext]
5419
+ );
5420
+ React15.useEffect(() => {
5421
+ if (!api || !setApi) return;
5422
+ setApi(api);
5423
+ }, [api, setApi]);
5424
+ React15.useEffect(() => {
5425
+ if (!api) return;
5426
+ onSelect(api);
5427
+ api.on("reInit", onSelect);
5428
+ api.on("select", onSelect);
5429
+ return () => {
5430
+ api.off("reInit", onSelect);
5431
+ api.off("select", onSelect);
5432
+ };
5433
+ }, [api, onSelect]);
5434
+ return /* @__PURE__ */ jsx39(
5435
+ CarouselContext.Provider,
5436
+ {
5437
+ value: {
5438
+ carouselRef,
5439
+ api,
5440
+ scrollPrev,
5441
+ scrollNext,
5442
+ canScrollPrev,
5443
+ canScrollNext
5444
+ },
5445
+ children: /* @__PURE__ */ jsx39(
5446
+ "div",
5447
+ {
5448
+ ...props,
5449
+ ref,
5450
+ className: cn("flex items-center gap-4", className),
5451
+ role: "region",
5452
+ "aria-roledescription": "carousel",
5453
+ "data-slot": "carousel",
5454
+ tabIndex: 0,
5455
+ onKeyDownCapture: (event) => {
5456
+ props.onKeyDownCapture?.(event);
5457
+ handleKeyDown(event);
5458
+ },
5459
+ children
5460
+ }
5461
+ )
5462
+ }
5463
+ );
5464
+ }
5465
+ function CarouselContent({ className, ref, ...props }) {
5466
+ const { carouselRef } = useCarousel();
5467
+ return /* @__PURE__ */ jsx39(
5468
+ "div",
5469
+ {
5470
+ ref: carouselRef,
5471
+ className: "overflow-hidden flex-1 min-w-0",
5472
+ "data-slot": "carousel-viewport",
5473
+ children: /* @__PURE__ */ jsx39(
5474
+ "div",
5475
+ {
5476
+ ref,
5477
+ "data-slot": "carousel-content",
5478
+ className: cn("flex -ml-4", className),
5479
+ ...props
5480
+ }
5481
+ )
5482
+ }
5483
+ );
5484
+ }
5485
+ function CarouselItem({
5486
+ className,
5487
+ index,
5488
+ total,
5489
+ "aria-label": ariaLabel,
5490
+ ref,
5491
+ ...props
5492
+ }) {
5493
+ const label = ariaLabel ?? (index !== void 0 && total !== void 0 ? `Slide ${index + 1} of ${total}` : void 0);
5494
+ return /* @__PURE__ */ jsx39(
5495
+ "div",
5496
+ {
5497
+ ref,
5498
+ role: "group",
5499
+ "aria-roledescription": "slide",
5500
+ "aria-label": label,
5501
+ "data-slot": "carousel-item",
5502
+ className: cn("min-w-0 shrink-0 grow-0 basis-full pl-4", className),
5503
+ ...props
5504
+ }
5505
+ );
5506
+ }
5507
+ function CarouselPrevious({
5508
+ className,
5509
+ variant = "default",
5510
+ size = "default",
5511
+ ref,
5512
+ ...props
5513
+ }) {
5514
+ const { scrollPrev, canScrollPrev } = useCarousel();
5515
+ return /* @__PURE__ */ jsx39(
5516
+ Button,
5517
+ {
5518
+ ref,
5519
+ "data-slot": "carousel-previous",
5520
+ variant,
5521
+ size,
5522
+ className: cn("size-9 shrink-0 rounded-md", className),
5523
+ disabled: !canScrollPrev,
5524
+ onClick: scrollPrev,
5525
+ "aria-label": "Previous slide",
5526
+ ...props,
5527
+ children: /* @__PURE__ */ jsx39(ArrowLeftIcon, { className: "size-4" })
5528
+ }
5529
+ );
5530
+ }
5531
+ function CarouselNext({
5532
+ className,
5533
+ variant = "default",
5534
+ size = "default",
5535
+ ref,
5536
+ ...props
5537
+ }) {
5538
+ const { scrollNext, canScrollNext } = useCarousel();
5539
+ return /* @__PURE__ */ jsx39(
5540
+ Button,
5541
+ {
5542
+ ref,
5543
+ "data-slot": "carousel-next",
5544
+ variant,
5545
+ size,
5546
+ className: cn("size-9 shrink-0 rounded-md", className),
5547
+ disabled: !canScrollNext,
5548
+ onClick: scrollNext,
5549
+ "aria-label": "Next slide",
5550
+ ...props,
5551
+ children: /* @__PURE__ */ jsx39(ArrowRightIcon, { className: "size-4" })
5552
+ }
5553
+ );
5554
+ }
5555
+
4059
5556
  // src/components/ui/table.tsx
4060
- import { jsx as jsx31 } from "react/jsx-runtime";
5557
+ import { jsx as jsx40 } from "react/jsx-runtime";
4061
5558
  function Table({ className, ref, ...props }) {
4062
- return /* @__PURE__ */ jsx31(
5559
+ return /* @__PURE__ */ jsx40(
4063
5560
  "div",
4064
5561
  {
4065
5562
  "data-slot": "table-container",
4066
5563
  className: "relative w-full overflow-x-auto",
4067
- children: /* @__PURE__ */ jsx31(
5564
+ children: /* @__PURE__ */ jsx40(
4068
5565
  "table",
4069
5566
  {
4070
5567
  ref,
@@ -4085,7 +5582,7 @@ function TableHeader({
4085
5582
  ref,
4086
5583
  ...props
4087
5584
  }) {
4088
- return /* @__PURE__ */ jsx31(
5585
+ return /* @__PURE__ */ jsx40(
4089
5586
  "thead",
4090
5587
  {
4091
5588
  ref,
@@ -4106,14 +5603,14 @@ function TableBody({
4106
5603
  ref,
4107
5604
  ...props
4108
5605
  }) {
4109
- return /* @__PURE__ */ jsx31("tbody", { ref, "data-slot": "table-body", className, ...props });
5606
+ return /* @__PURE__ */ jsx40("tbody", { ref, "data-slot": "table-body", className, ...props });
4110
5607
  }
4111
5608
  function TableFooter({
4112
5609
  className,
4113
5610
  ref,
4114
5611
  ...props
4115
5612
  }) {
4116
- return /* @__PURE__ */ jsx31(
5613
+ return /* @__PURE__ */ jsx40(
4117
5614
  "tfoot",
4118
5615
  {
4119
5616
  ref,
@@ -4132,7 +5629,7 @@ function TableFooter({
4132
5629
  );
4133
5630
  }
4134
5631
  function TableRow({ className, ref, ...props }) {
4135
- return /* @__PURE__ */ jsx31(
5632
+ return /* @__PURE__ */ jsx40(
4136
5633
  "tr",
4137
5634
  {
4138
5635
  ref,
@@ -4156,7 +5653,7 @@ function TableHead({
4156
5653
  align = "left",
4157
5654
  ...props
4158
5655
  }) {
4159
- return /* @__PURE__ */ jsx31(
5656
+ return /* @__PURE__ */ jsx40(
4160
5657
  "th",
4161
5658
  {
4162
5659
  ref,
@@ -4184,7 +5681,7 @@ function TableCell({
4184
5681
  align = "left",
4185
5682
  ...props
4186
5683
  }) {
4187
- return /* @__PURE__ */ jsx31(
5684
+ return /* @__PURE__ */ jsx40(
4188
5685
  "td",
4189
5686
  {
4190
5687
  ref,
@@ -4210,7 +5707,7 @@ function TableCaption({
4210
5707
  ref,
4211
5708
  ...props
4212
5709
  }) {
4213
- return /* @__PURE__ */ jsx31(
5710
+ return /* @__PURE__ */ jsx40(
4214
5711
  "caption",
4215
5712
  {
4216
5713
  ref,
@@ -4227,11 +5724,20 @@ function TableCaption({
4227
5724
  );
4228
5725
  }
4229
5726
 
5727
+ // src/components/ui/data-table/data-table.tsx
5728
+ import * as React16 from "react";
5729
+ import {
5730
+ useReactTable,
5731
+ getCoreRowModel,
5732
+ getSortedRowModel,
5733
+ getPaginationRowModel
5734
+ } from "@tanstack/react-table";
5735
+
4230
5736
  // src/components/ui/data-table/data-table-view.tsx
4231
5737
  import {
4232
5738
  flexRender
4233
5739
  } from "@tanstack/react-table";
4234
- import { jsx as jsx32, jsxs as jsxs15 } from "react/jsx-runtime";
5740
+ import { jsx as jsx41, jsxs as jsxs21 } from "react/jsx-runtime";
4235
5741
  function DataTableView({
4236
5742
  table,
4237
5743
  emptyState = "No results.",
@@ -4240,15 +5746,15 @@ function DataTableView({
4240
5746
  className,
4241
5747
  ...props
4242
5748
  }) {
4243
- return /* @__PURE__ */ jsx32(
5749
+ return /* @__PURE__ */ jsx41(
4244
5750
  "div",
4245
5751
  {
4246
5752
  className: cn("relative", loading && "opacity-50 pointer-events-none"),
4247
5753
  "aria-busy": loading || void 0,
4248
- children: /* @__PURE__ */ jsxs15(Table, { className, ...props, children: [
4249
- /* @__PURE__ */ jsx32(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx32(TableRow, { children: headerGroup.headers.map((header) => {
5754
+ children: /* @__PURE__ */ jsxs21(Table, { className, ...props, children: [
5755
+ /* @__PURE__ */ jsx41(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx41(TableRow, { children: headerGroup.headers.map((header) => {
4250
5756
  const sorted = header.column.getIsSorted();
4251
- return /* @__PURE__ */ jsx32(
5757
+ return /* @__PURE__ */ jsx41(
4252
5758
  TableHead,
4253
5759
  {
4254
5760
  colSpan: header.colSpan,
@@ -4261,21 +5767,21 @@ function DataTableView({
4261
5767
  header.id
4262
5768
  );
4263
5769
  }) }, headerGroup.id)) }),
4264
- /* @__PURE__ */ jsx32(TableBody, { children: table.getRowModel().rows.length > 0 ? table.getRowModel().rows.map((row) => {
5770
+ /* @__PURE__ */ jsx41(TableBody, { children: table.getRowModel().rows.length > 0 ? table.getRowModel().rows.map((row) => {
4265
5771
  const rowProps = getRowProps?.(row);
4266
- return /* @__PURE__ */ jsx32(
5772
+ return /* @__PURE__ */ jsx41(
4267
5773
  TableRow,
4268
5774
  {
4269
5775
  "data-state": row.getIsSelected() ? "selected" : void 0,
4270
5776
  ...rowProps,
4271
- children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx32(TableCell, { children: flexRender(
5777
+ children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx41(TableCell, { children: flexRender(
4272
5778
  cell.column.columnDef.cell,
4273
5779
  cell.getContext()
4274
5780
  ) }, cell.id))
4275
5781
  },
4276
5782
  row.id
4277
5783
  );
4278
- }) : /* @__PURE__ */ jsx32(TableRow, { children: /* @__PURE__ */ jsx32(
5784
+ }) : /* @__PURE__ */ jsx41(TableRow, { children: /* @__PURE__ */ jsx41(
4279
5785
  TableCell,
4280
5786
  {
4281
5787
  colSpan: table.getVisibleLeafColumns().length,
@@ -4289,7 +5795,7 @@ function DataTableView({
4289
5795
  }
4290
5796
 
4291
5797
  // src/components/ui/data-table/data-table-pagination.tsx
4292
- import { jsx as jsx33, jsxs as jsxs16 } from "react/jsx-runtime";
5798
+ import { jsx as jsx42, jsxs as jsxs22 } from "react/jsx-runtime";
4293
5799
  function DataTablePagination({
4294
5800
  table,
4295
5801
  pageSizeOptions = [10, 20, 50, 100],
@@ -4301,7 +5807,7 @@ function DataTablePagination({
4301
5807
  const from = totalRows > 0 ? pageIndex * pageSize + 1 : 0;
4302
5808
  const to = Math.min((pageIndex + 1) * pageSize, totalRows);
4303
5809
  const resolvedPageSizeOptions = pageSizeOptions.includes(pageSize) ? pageSizeOptions : [...pageSizeOptions, pageSize].sort((a, b) => a - b);
4304
- return /* @__PURE__ */ jsxs16(
5810
+ return /* @__PURE__ */ jsxs22(
4305
5811
  "div",
4306
5812
  {
4307
5813
  className: cn(
@@ -4310,7 +5816,7 @@ function DataTablePagination({
4310
5816
  ),
4311
5817
  ...props,
4312
5818
  children: [
4313
- /* @__PURE__ */ jsx33(
5819
+ /* @__PURE__ */ jsx42(
4314
5820
  Text,
4315
5821
  {
4316
5822
  variant: "body-sm",
@@ -4319,8 +5825,8 @@ function DataTablePagination({
4319
5825
  children: totalRows > 0 ? `Showing ${from}\u2013${to} of ${totalRows}` : "No results"
4320
5826
  }
4321
5827
  ),
4322
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-1", children: [
4323
- /* @__PURE__ */ jsx33(
5828
+ /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-1", children: [
5829
+ /* @__PURE__ */ jsx42(
4324
5830
  Button,
4325
5831
  {
4326
5832
  variant: "ghost",
@@ -4328,10 +5834,10 @@ function DataTablePagination({
4328
5834
  onClick: () => table.firstPage(),
4329
5835
  disabled: !table.getCanPreviousPage(),
4330
5836
  "aria-label": "Go to first page",
4331
- children: /* @__PURE__ */ jsx33(ArrowLeftIcon, { "aria-hidden": "true" })
5837
+ children: /* @__PURE__ */ jsx42(ArrowLeftIcon, { "aria-hidden": "true" })
4332
5838
  }
4333
5839
  ),
4334
- /* @__PURE__ */ jsx33(
5840
+ /* @__PURE__ */ jsx42(
4335
5841
  Button,
4336
5842
  {
4337
5843
  variant: "ghost",
@@ -4339,11 +5845,11 @@ function DataTablePagination({
4339
5845
  onClick: () => table.previousPage(),
4340
5846
  disabled: !table.getCanPreviousPage(),
4341
5847
  "aria-label": "Go to previous page",
4342
- children: /* @__PURE__ */ jsx33(CaretLeftIcon, { "aria-hidden": "true" })
5848
+ children: /* @__PURE__ */ jsx42(CaretLeftIcon, { "aria-hidden": "true" })
4343
5849
  }
4344
5850
  ),
4345
- /* @__PURE__ */ jsx33(Text, { as: "span", variant: "body-sm", className: "px-2 whitespace-nowrap", children: table.getPageCount() > 0 ? `Page ${pageIndex + 1} of ${table.getPageCount()}` : "No pages" }),
4346
- /* @__PURE__ */ jsx33(
5851
+ /* @__PURE__ */ jsx42(Text, { as: "span", variant: "body-sm", className: "px-2 whitespace-nowrap", children: table.getPageCount() > 0 ? `Page ${pageIndex + 1} of ${table.getPageCount()}` : "No pages" }),
5852
+ /* @__PURE__ */ jsx42(
4347
5853
  Button,
4348
5854
  {
4349
5855
  variant: "ghost",
@@ -4351,10 +5857,10 @@ function DataTablePagination({
4351
5857
  onClick: () => table.nextPage(),
4352
5858
  disabled: !table.getCanNextPage(),
4353
5859
  "aria-label": "Go to next page",
4354
- children: /* @__PURE__ */ jsx33(CaretRightIcon, { "aria-hidden": "true" })
5860
+ children: /* @__PURE__ */ jsx42(CaretRightIcon, { "aria-hidden": "true" })
4355
5861
  }
4356
5862
  ),
4357
- /* @__PURE__ */ jsx33(
5863
+ /* @__PURE__ */ jsx42(
4358
5864
  Button,
4359
5865
  {
4360
5866
  variant: "ghost",
@@ -4362,12 +5868,12 @@ function DataTablePagination({
4362
5868
  onClick: () => table.lastPage(),
4363
5869
  disabled: !table.getCanNextPage(),
4364
5870
  "aria-label": "Go to last page",
4365
- children: /* @__PURE__ */ jsx33(ArrowRightIcon, { "aria-hidden": "true" })
5871
+ children: /* @__PURE__ */ jsx42(ArrowRightIcon, { "aria-hidden": "true" })
4366
5872
  }
4367
5873
  )
4368
5874
  ] }),
4369
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
4370
- /* @__PURE__ */ jsx33(
5875
+ /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
5876
+ /* @__PURE__ */ jsx42(
4371
5877
  Text,
4372
5878
  {
4373
5879
  as: "span",
@@ -4376,14 +5882,14 @@ function DataTablePagination({
4376
5882
  children: "Rows per page"
4377
5883
  }
4378
5884
  ),
4379
- /* @__PURE__ */ jsxs16(
5885
+ /* @__PURE__ */ jsxs22(
4380
5886
  Select,
4381
5887
  {
4382
5888
  value: pageSize.toString(),
4383
5889
  onValueChange: (value) => table.setPageSize(Number(value)),
4384
5890
  children: [
4385
- /* @__PURE__ */ jsx33(SelectTrigger, { className: "h-8 w-[70px]", children: /* @__PURE__ */ jsx33(SelectValue, {}) }),
4386
- /* @__PURE__ */ jsx33(SelectContent, { children: resolvedPageSizeOptions.map((size) => /* @__PURE__ */ jsx33(SelectItem, { value: size.toString(), children: size }, size)) })
5891
+ /* @__PURE__ */ jsx42(SelectTrigger, { className: "h-8 w-[70px]", children: /* @__PURE__ */ jsx42(SelectValue, {}) }),
5892
+ /* @__PURE__ */ jsx42(SelectContent, { children: resolvedPageSizeOptions.map((size) => /* @__PURE__ */ jsx42(SelectItem, { value: size.toString(), children: size }, size)) })
4387
5893
  ]
4388
5894
  }
4389
5895
  )
@@ -4394,7 +5900,7 @@ function DataTablePagination({
4394
5900
  }
4395
5901
 
4396
5902
  // src/components/ui/data-table/data-table-column-header.tsx
4397
- import { jsx as jsx34, jsxs as jsxs17 } from "react/jsx-runtime";
5903
+ import { jsx as jsx43, jsxs as jsxs23 } from "react/jsx-runtime";
4398
5904
  function DataTableColumnHeader({
4399
5905
  column,
4400
5906
  title,
@@ -4402,7 +5908,7 @@ function DataTableColumnHeader({
4402
5908
  ...props
4403
5909
  }) {
4404
5910
  if (!column.getCanSort()) {
4405
- return /* @__PURE__ */ jsx34(
5911
+ return /* @__PURE__ */ jsx43(
4406
5912
  Text,
4407
5913
  {
4408
5914
  as: "div",
@@ -4414,9 +5920,9 @@ function DataTableColumnHeader({
4414
5920
  );
4415
5921
  }
4416
5922
  const sorted = column.getIsSorted();
4417
- return /* @__PURE__ */ jsxs17("div", { className: cn("flex items-center gap-2", className), ...props, children: [
4418
- /* @__PURE__ */ jsx34(Text, { as: "span", variant: "body-sm-medium", children: title }),
4419
- /* @__PURE__ */ jsx34(
5923
+ return /* @__PURE__ */ jsxs23("div", { className: cn("flex items-center gap-2", className), ...props, children: [
5924
+ /* @__PURE__ */ jsx43(Text, { as: "span", variant: "body-sm-medium", children: title }),
5925
+ /* @__PURE__ */ jsx43(
4420
5926
  Button,
4421
5927
  {
4422
5928
  variant: "ghost",
@@ -4428,38 +5934,134 @@ function DataTableColumnHeader({
4428
5934
  },
4429
5935
  "aria-label": `Sort by ${title}`,
4430
5936
  className: "text-secondary",
4431
- children: sorted === "desc" ? /* @__PURE__ */ jsx34(CaretDownIcon, { "aria-hidden": "true" }) : sorted === "asc" ? /* @__PURE__ */ jsx34(CaretUpIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx34(ArrowsDownUpIcon, { "aria-hidden": "true", size: 16 })
5937
+ children: sorted === "desc" ? /* @__PURE__ */ jsx43(CaretDownIcon, { "aria-hidden": "true" }) : sorted === "asc" ? /* @__PURE__ */ jsx43(CaretUpIcon, { "aria-hidden": "true" }) : /* @__PURE__ */ jsx43(ArrowsDownUpIcon, { "aria-hidden": "true", size: 16 })
4432
5938
  }
4433
5939
  )
4434
5940
  ] });
4435
5941
  }
4436
5942
 
5943
+ // src/components/ui/data-table/data-table.tsx
5944
+ import { jsx as jsx44, jsxs as jsxs24 } from "react/jsx-runtime";
5945
+ function createSelectColumn() {
5946
+ return {
5947
+ id: "select",
5948
+ header: ({ table }) => /* @__PURE__ */ jsx44("div", { className: "flex items-center", children: /* @__PURE__ */ jsx44(
5949
+ Checkbox,
5950
+ {
5951
+ checked: table.getIsAllPageRowsSelected(),
5952
+ indeterminate: table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected(),
5953
+ onCheckedChange: (checked) => table.toggleAllPageRowsSelected(!!checked),
5954
+ "aria-label": "Select all"
5955
+ }
5956
+ ) }),
5957
+ cell: ({ row }) => /* @__PURE__ */ jsx44("div", { className: "flex items-center", children: /* @__PURE__ */ jsx44(
5958
+ Checkbox,
5959
+ {
5960
+ checked: row.getIsSelected(),
5961
+ onCheckedChange: (checked) => row.toggleSelected(!!checked),
5962
+ "aria-label": "Select row"
5963
+ }
5964
+ ) }),
5965
+ enableSorting: false,
5966
+ enableHiding: false
5967
+ };
5968
+ }
5969
+ function DataTable({
5970
+ columns,
5971
+ data,
5972
+ getRowId,
5973
+ showPagination = true,
5974
+ pageSizeOptions,
5975
+ initialPageSize = 10,
5976
+ enableRowSelection = false,
5977
+ onRowSelectionChange: onRowSelectionChangeProp,
5978
+ enableSorting = true,
5979
+ emptyState,
5980
+ loading,
5981
+ ...tableProps
5982
+ }) {
5983
+ const [sorting, setSorting] = React16.useState([]);
5984
+ const [rowSelection, setRowSelection] = React16.useState({});
5985
+ const handleRowSelectionChange = React16.useCallback(
5986
+ (updaterOrValue) => {
5987
+ const next = typeof updaterOrValue === "function" ? updaterOrValue(rowSelection) : updaterOrValue;
5988
+ setRowSelection(next);
5989
+ onRowSelectionChangeProp?.(next);
5990
+ },
5991
+ [rowSelection, onRowSelectionChangeProp]
5992
+ );
5993
+ const allColumns = React16.useMemo(
5994
+ () => enableRowSelection ? [createSelectColumn(), ...columns] : columns,
5995
+ [columns, enableRowSelection]
5996
+ );
5997
+ const resolvedColumns = React16.useMemo(
5998
+ () => enableSorting ? allColumns.map((col) => {
5999
+ if (col.id === "select" || col.id === "actions") return col;
6000
+ if (typeof col.header === "string") {
6001
+ const title = col.header;
6002
+ return {
6003
+ ...col,
6004
+ header: ({ column }) => /* @__PURE__ */ jsx44(DataTableColumnHeader, { column, title })
6005
+ };
6006
+ }
6007
+ return col;
6008
+ }) : allColumns,
6009
+ [allColumns, enableSorting]
6010
+ );
6011
+ const table = useReactTable({
6012
+ data,
6013
+ columns: resolvedColumns,
6014
+ state: { sorting, rowSelection },
6015
+ onSortingChange: setSorting,
6016
+ onRowSelectionChange: enableRowSelection ? handleRowSelectionChange : void 0,
6017
+ getCoreRowModel: getCoreRowModel(),
6018
+ getSortedRowModel: enableSorting ? getSortedRowModel() : void 0,
6019
+ getPaginationRowModel: showPagination ? getPaginationRowModel() : void 0,
6020
+ getRowId,
6021
+ ...showPagination && {
6022
+ initialState: { pagination: { pageSize: initialPageSize } }
6023
+ }
6024
+ });
6025
+ return /* @__PURE__ */ jsxs24("div", { children: [
6026
+ /* @__PURE__ */ jsx44(
6027
+ DataTableView,
6028
+ {
6029
+ table,
6030
+ emptyState,
6031
+ loading,
6032
+ ...tableProps
6033
+ }
6034
+ ),
6035
+ showPagination && /* @__PURE__ */ jsx44(DataTablePagination, { table, pageSizeOptions })
6036
+ ] });
6037
+ }
6038
+
4437
6039
  // src/components/ui/data-table/data-table-view-options.tsx
4438
- import { jsx as jsx35, jsxs as jsxs18 } from "react/jsx-runtime";
6040
+ import { jsx as jsx45, jsxs as jsxs25 } from "react/jsx-runtime";
4439
6041
  function DataTableViewOptions({
4440
6042
  table,
4441
6043
  ...props
4442
6044
  }) {
4443
- return /* @__PURE__ */ jsxs18(DropdownMenu, { children: [
4444
- /* @__PURE__ */ jsx35(
6045
+ return /* @__PURE__ */ jsxs25(DropdownMenu, { children: [
6046
+ /* @__PURE__ */ jsx45(
4445
6047
  DropdownMenuTrigger,
4446
6048
  {
4447
- render: /* @__PURE__ */ jsx35(
6049
+ render: /* @__PURE__ */ jsx45(
4448
6050
  Button,
4449
6051
  {
4450
6052
  variant: "ghost",
4451
6053
  size: "sm",
4452
6054
  ...props,
4453
6055
  "aria-label": "Table options",
4454
- children: /* @__PURE__ */ jsx35(CogIcon, { "aria-hidden": "true" })
6056
+ children: /* @__PURE__ */ jsx45(CogIcon, { "aria-hidden": "true" })
4455
6057
  }
4456
6058
  )
4457
6059
  }
4458
6060
  ),
4459
- /* @__PURE__ */ jsxs18(DropdownMenuContent, { align: "end", children: [
4460
- /* @__PURE__ */ jsx35(DropdownMenuLabel, { children: "Toggle columns" }),
4461
- /* @__PURE__ */ jsx35(DropdownMenuSeparator, {}),
4462
- table.getAllColumns().filter((column) => column.getCanHide()).map((column) => /* @__PURE__ */ jsx35(
6061
+ /* @__PURE__ */ jsxs25(DropdownMenuContent, { align: "end", children: [
6062
+ /* @__PURE__ */ jsx45(DropdownMenuLabel, { children: "Toggle columns" }),
6063
+ /* @__PURE__ */ jsx45(DropdownMenuSeparator, {}),
6064
+ table.getAllColumns().filter((column) => column.getCanHide()).map((column) => /* @__PURE__ */ jsx45(
4463
6065
  DropdownMenuCheckboxItem,
4464
6066
  {
4465
6067
  checked: column.getIsVisible(),
@@ -4528,6 +6130,16 @@ export {
4528
6130
  CaretLeftIcon,
4529
6131
  CaretRightIcon,
4530
6132
  CaretUpIcon,
6133
+ Carousel,
6134
+ CarouselContent,
6135
+ CarouselItem,
6136
+ CarouselNext,
6137
+ CarouselPrevious,
6138
+ ChartContainer,
6139
+ ChartLegend,
6140
+ ChartLegendContent,
6141
+ ChartTooltip,
6142
+ ChartTooltipContent,
4531
6143
  ChatIcon,
4532
6144
  CheckIcon,
4533
6145
  Checkbox,
@@ -4535,7 +6147,21 @@ export {
4535
6147
  CheckmarkSquareIcon,
4536
6148
  CloseIcon,
4537
6149
  CogIcon,
6150
+ Combobox,
6151
+ ComboboxChip,
6152
+ ComboboxChips,
6153
+ ComboboxChipsInput,
6154
+ ComboboxContent,
6155
+ ComboboxEmpty,
6156
+ ComboboxGroup,
6157
+ ComboboxInput,
6158
+ ComboboxItem,
6159
+ ComboboxLabel,
6160
+ ComboboxList,
6161
+ ComboboxSeparator,
6162
+ ComboboxTrigger,
4538
6163
  CredentialsIcon,
6164
+ DataTable,
4539
6165
  DataTableColumnHeader,
4540
6166
  DataTablePagination,
4541
6167
  DataTableView,
@@ -4580,6 +6206,12 @@ export {
4580
6206
  DropdownMenuSubTrigger,
4581
6207
  DropdownMenuTrigger,
4582
6208
  EditIcon,
6209
+ Empty,
6210
+ EmptyActions,
6211
+ EmptyContent,
6212
+ EmptyDescription,
6213
+ EmptyMedia,
6214
+ EmptyTitle,
4583
6215
  EnvelopeIcon,
4584
6216
  ExclamationIcon,
4585
6217
  EyeClosedIcon,
@@ -4602,6 +6234,9 @@ export {
4602
6234
  GraphPieIcon,
4603
6235
  HamburgerMenuIcon,
4604
6236
  HomeIcon,
6237
+ HoverCard,
6238
+ HoverCardContent,
6239
+ HoverCardTrigger,
4605
6240
  InformationIcon,
4606
6241
  Input,
4607
6242
  InputGroup,
@@ -4638,6 +6273,9 @@ export {
4638
6273
  PopoverTrigger,
4639
6274
  PrintIcon,
4640
6275
  QuestionCircleIcon,
6276
+ RadioGroup,
6277
+ RadioGroupCard,
6278
+ RadioGroupItem,
4641
6279
  Select,
4642
6280
  SelectContent,
4643
6281
  SelectGroup,
@@ -4661,6 +6299,8 @@ export {
4661
6299
  SidebarMenuButton,
4662
6300
  SidebarMenuItem,
4663
6301
  SidebarProvider,
6302
+ SidebarSeparator,
6303
+ Slider,
4664
6304
  StarIcon,
4665
6305
  StatementIcon,
4666
6306
  Switch,
@@ -4677,8 +6317,10 @@ export {
4677
6317
  TabsContent,
4678
6318
  TabsList,
4679
6319
  TabsTrigger,
6320
+ Tag,
4680
6321
  Text,
4681
6322
  Textarea,
6323
+ Toaster,
4682
6324
  Tooltip,
4683
6325
  TooltipContent,
4684
6326
  TooltipProvider,
@@ -4689,6 +6331,8 @@ export {
4689
6331
  UserMultiIcon,
4690
6332
  WarningIcon,
4691
6333
  WrenchIcon,
6334
+ ZoomInIcon,
6335
+ ZoomOutIcon,
4692
6336
  alertVariants,
4693
6337
  avatarVariants,
4694
6338
  badgeVariants,
@@ -4696,18 +6340,34 @@ export {
4696
6340
  buttonGroupVariants,
4697
6341
  buttonVariants,
4698
6342
  checkboxVariants,
6343
+ cn,
6344
+ comboboxChipsVariants,
6345
+ comboboxInputVariants,
6346
+ createToaster,
6347
+ cva,
4699
6348
  dropdownMenuItemVariants,
6349
+ emptyMediaVariants,
6350
+ emptyVariants,
4700
6351
  inputGroupAddonVariants,
4701
6352
  inputGroupButtonVariants,
4702
6353
  inputGroupVariants,
4703
6354
  inputVariants,
4704
6355
  itemMediaVariants,
4705
6356
  itemVariants,
6357
+ radioGroupVariants,
6358
+ radioItemVariants,
4706
6359
  selectTriggerVariants,
4707
6360
  switchVariants,
4708
6361
  tabsListVariants,
4709
6362
  tabsTriggerVariants,
6363
+ tagVariants,
4710
6364
  textVariants,
6365
+ toast,
6366
+ toastManager,
4711
6367
  uploadVariants,
6368
+ useCarousel,
6369
+ useChart,
6370
+ useComboboxAnchor,
6371
+ useComboboxFilter,
4712
6372
  useSidebar
4713
6373
  };