@dynamic-labs-sdk/droplet 1.14.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/components/ui/accordion/accordion.stories.d.ts +19 -0
  2. package/dist/components/ui/accordion/accordion.stories.d.ts.map +1 -0
  3. package/dist/components/ui/alert/alert.d.ts +41 -0
  4. package/dist/components/ui/alert/alert.d.ts.map +1 -0
  5. package/dist/components/ui/alert/alert.stories.d.ts +26 -0
  6. package/dist/components/ui/alert/alert.stories.d.ts.map +1 -0
  7. package/dist/components/ui/alert/index.d.ts +3 -0
  8. package/dist/components/ui/alert/index.d.ts.map +1 -0
  9. package/dist/components/ui/alert-dialog/alert-dialog.d.ts +4 -1
  10. package/dist/components/ui/alert-dialog/alert-dialog.d.ts.map +1 -1
  11. package/dist/components/ui/badge/badge.d.ts +11 -1
  12. package/dist/components/ui/badge/badge.d.ts.map +1 -1
  13. package/dist/components/ui/badge/badge.stories.d.ts +3 -3
  14. package/dist/components/ui/badge/badge.stories.d.ts.map +1 -1
  15. package/dist/components/ui/breadcrumb/breadcrumb.d.ts +73 -0
  16. package/dist/components/ui/breadcrumb/breadcrumb.d.ts.map +1 -0
  17. package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts +19 -0
  18. package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts.map +1 -0
  19. package/dist/components/ui/breadcrumb/index.d.ts +3 -0
  20. package/dist/components/ui/breadcrumb/index.d.ts.map +1 -0
  21. package/dist/components/ui/button/button.d.ts +7 -3
  22. package/dist/components/ui/button/button.d.ts.map +1 -1
  23. package/dist/components/ui/button/button.stories.d.ts +6 -3
  24. package/dist/components/ui/button/button.stories.d.ts.map +1 -1
  25. package/dist/components/ui/card/card.d.ts +14 -3
  26. package/dist/components/ui/card/card.d.ts.map +1 -1
  27. package/dist/components/ui/card/card.stories.d.ts +8 -2
  28. package/dist/components/ui/card/card.stories.d.ts.map +1 -1
  29. package/dist/components/ui/check-icon/check-icon.stories.d.ts +26 -0
  30. package/dist/components/ui/check-icon/check-icon.stories.d.ts.map +1 -0
  31. package/dist/components/ui/checkbox/checkbox.stories.d.ts.map +1 -1
  32. package/dist/components/ui/collapsible/collapsible.d.ts +1 -1
  33. package/dist/components/ui/collapsible/collapsible.d.ts.map +1 -1
  34. package/dist/components/ui/collapsible/collapsible.stories.d.ts +1 -0
  35. package/dist/components/ui/collapsible/collapsible.stories.d.ts.map +1 -1
  36. package/dist/components/ui/combobox/combobox.d.ts +49 -0
  37. package/dist/components/ui/combobox/combobox.d.ts.map +1 -0
  38. package/dist/components/ui/combobox/combobox.stories.d.ts +24 -0
  39. package/dist/components/ui/combobox/combobox.stories.d.ts.map +1 -0
  40. package/dist/components/ui/combobox/index.d.ts +3 -0
  41. package/dist/components/ui/combobox/index.d.ts.map +1 -0
  42. package/dist/components/ui/command/command.d.ts.map +1 -1
  43. package/dist/components/ui/command/command.stories.d.ts +31 -0
  44. package/dist/components/ui/command/command.stories.d.ts.map +1 -0
  45. package/dist/components/ui/dialog/dialog.d.ts +5 -1
  46. package/dist/components/ui/dialog/dialog.d.ts.map +1 -1
  47. package/dist/components/ui/dialog/dialog.stories.d.ts.map +1 -1
  48. package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  49. package/dist/components/ui/field/field.d.ts +60 -0
  50. package/dist/components/ui/field/field.d.ts.map +1 -0
  51. package/dist/components/ui/field/field.stories.d.ts +40 -0
  52. package/dist/components/ui/field/field.stories.d.ts.map +1 -0
  53. package/dist/components/ui/field/index.d.ts +3 -0
  54. package/dist/components/ui/field/index.d.ts.map +1 -0
  55. package/dist/components/ui/flush-card-detach/flush-card-detach.stories.d.ts.map +1 -1
  56. package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts +57 -0
  57. package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts.map +1 -0
  58. package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts +24 -0
  59. package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts.map +1 -0
  60. package/dist/components/ui/icon/icon.stories.d.ts +510 -0
  61. package/dist/components/ui/icon/icon.stories.d.ts.map +1 -0
  62. package/dist/components/ui/input/input.d.ts.map +1 -1
  63. package/dist/components/ui/kbd/kbd.d.ts +1 -1
  64. package/dist/components/ui/kbd/kbd.stories.d.ts +15 -0
  65. package/dist/components/ui/kbd/kbd.stories.d.ts.map +1 -0
  66. package/dist/components/ui/pagination/index.d.ts +3 -0
  67. package/dist/components/ui/pagination/index.d.ts.map +1 -0
  68. package/dist/components/ui/pagination/pagination.d.ts +82 -0
  69. package/dist/components/ui/pagination/pagination.d.ts.map +1 -0
  70. package/dist/components/ui/pagination/pagination.stories.d.ts +16 -0
  71. package/dist/components/ui/pagination/pagination.stories.d.ts.map +1 -0
  72. package/dist/components/ui/popover/popover.d.ts +1 -1
  73. package/dist/components/ui/popover/popover.d.ts.map +1 -1
  74. package/dist/components/ui/progress/progress.d.ts +7 -4
  75. package/dist/components/ui/progress/progress.d.ts.map +1 -1
  76. package/dist/components/ui/progress/progress.stories.d.ts +4 -1
  77. package/dist/components/ui/progress/progress.stories.d.ts.map +1 -1
  78. package/dist/components/ui/radio-group/index.d.ts +1 -1
  79. package/dist/components/ui/radio-group/index.d.ts.map +1 -1
  80. package/dist/components/ui/radio-group/radio-group.d.ts +45 -2
  81. package/dist/components/ui/radio-group/radio-group.d.ts.map +1 -1
  82. package/dist/components/ui/radio-group/radio-group.stories.d.ts +19 -0
  83. package/dist/components/ui/radio-group/radio-group.stories.d.ts.map +1 -1
  84. package/dist/components/ui/scroll-area/scroll-area.stories.d.ts +15 -0
  85. package/dist/components/ui/scroll-area/scroll-area.stories.d.ts.map +1 -0
  86. package/dist/components/ui/search-input/search-input.stories.d.ts +27 -0
  87. package/dist/components/ui/search-input/search-input.stories.d.ts.map +1 -0
  88. package/dist/components/ui/select/select.d.ts.map +1 -1
  89. package/dist/components/ui/skeleton/skeleton.d.ts +1 -1
  90. package/dist/components/ui/skeleton/skeleton.d.ts.map +1 -1
  91. package/dist/components/ui/skeleton/skeleton.stories.d.ts +1 -1
  92. package/dist/components/ui/slider/index.d.ts +3 -0
  93. package/dist/components/ui/slider/index.d.ts.map +1 -0
  94. package/dist/components/ui/slider/slider.d.ts +28 -0
  95. package/dist/components/ui/slider/slider.d.ts.map +1 -0
  96. package/dist/components/ui/slider/slider.stories.d.ts +40 -0
  97. package/dist/components/ui/slider/slider.stories.d.ts.map +1 -0
  98. package/dist/components/ui/sonner/sonner.stories.d.ts +10 -0
  99. package/dist/components/ui/sonner/sonner.stories.d.ts.map +1 -0
  100. package/dist/components/ui/spinner/spinner.d.ts +13 -2
  101. package/dist/components/ui/spinner/spinner.d.ts.map +1 -1
  102. package/dist/components/ui/spinner/spinner.stories.d.ts +1 -3
  103. package/dist/components/ui/spinner/spinner.stories.d.ts.map +1 -1
  104. package/dist/components/ui/stepper/index.d.ts +3 -0
  105. package/dist/components/ui/stepper/index.d.ts.map +1 -0
  106. package/dist/components/ui/stepper/stepper.d.ts +36 -0
  107. package/dist/components/ui/stepper/stepper.d.ts.map +1 -0
  108. package/dist/components/ui/stepper/stepper.stories.d.ts +21 -0
  109. package/dist/components/ui/stepper/stepper.stories.d.ts.map +1 -0
  110. package/dist/components/ui/switch/switch.d.ts.map +1 -1
  111. package/dist/components/ui/table/table.d.ts +1 -1
  112. package/dist/components/ui/table/table.d.ts.map +1 -1
  113. package/dist/components/ui/toggle-group/index.d.ts +3 -0
  114. package/dist/components/ui/toggle-group/index.d.ts.map +1 -0
  115. package/dist/components/ui/toggle-group/toggle-group.d.ts +62 -0
  116. package/dist/components/ui/toggle-group/toggle-group.d.ts.map +1 -0
  117. package/dist/components/ui/toggle-group/toggle-group.stories.d.ts +20 -0
  118. package/dist/components/ui/toggle-group/toggle-group.stories.d.ts.map +1 -0
  119. package/dist/components/ui/tray/renderTrayLayout.d.ts +37 -0
  120. package/dist/components/ui/tray/renderTrayLayout.d.ts.map +1 -0
  121. package/dist/components/ui/tray/resolveTrayLayout.d.ts +35 -0
  122. package/dist/components/ui/tray/resolveTrayLayout.d.ts.map +1 -0
  123. package/dist/components/ui/well/well-reveal.stories.d.ts +27 -0
  124. package/dist/components/ui/well/well-reveal.stories.d.ts.map +1 -0
  125. package/dist/components/ui/well/well.d.ts +2 -2
  126. package/dist/components/ui/well/well.d.ts.map +1 -1
  127. package/dist/components/ui/well/well.stories.d.ts +2 -2
  128. package/dist/index.cjs +1320 -306
  129. package/dist/index.cjs.map +1 -1
  130. package/dist/index.d.ts +18 -2
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.esm.js +1292 -312
  133. package/dist/index.esm.js.map +1 -1
  134. package/dist/migration.cjs +1 -1
  135. package/dist/migration.esm.js +1 -1
  136. package/dist/{toggle-row-B7XCm0Z-.cjs → toggle-row-BafR1dY7.cjs} +93 -12
  137. package/dist/toggle-row-BafR1dY7.cjs.map +1 -0
  138. package/dist/{toggle-row-C-B8HtY0.esm.js → toggle-row-h0h1m_hc.esm.js} +88 -13
  139. package/dist/toggle-row-h0h1m_hc.esm.js.map +1 -0
  140. package/package.json +1 -1
  141. package/src/styles/globals.css +68 -23
  142. package/dist/toggle-row-B7XCm0Z-.cjs.map +0 -1
  143. package/dist/toggle-row-C-B8HtY0.esm.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
- const require_toggle_row = require('./toggle-row-B7XCm0Z-.cjs');
28
+ const require_toggle_row = require('./toggle-row-BafR1dY7.cjs');
29
29
  let react = require("react");
30
30
  let motion_react = require("motion/react");
31
31
  let _hugeicons_react = require("@hugeicons/react");
@@ -45,10 +45,10 @@ _radix_ui_react_collapsible = __toESM(_radix_ui_react_collapsible);
45
45
  let cmdk = require("cmdk");
46
46
  let _radix_ui_react_dialog = require("@radix-ui/react-dialog");
47
47
  _radix_ui_react_dialog = __toESM(_radix_ui_react_dialog);
48
- let _radix_ui_react_dropdown_menu = require("@radix-ui/react-dropdown-menu");
49
- let lucide_react = require("lucide-react");
50
48
  let _radix_ui_react_popover = require("@radix-ui/react-popover");
51
49
  _radix_ui_react_popover = __toESM(_radix_ui_react_popover);
50
+ let _radix_ui_react_dropdown_menu = require("@radix-ui/react-dropdown-menu");
51
+ let lucide_react = require("lucide-react");
52
52
  let _radix_ui_react_radio_group = require("@radix-ui/react-radio-group");
53
53
  _radix_ui_react_radio_group = __toESM(_radix_ui_react_radio_group);
54
54
  let _radix_ui_react_scroll_area = require("@radix-ui/react-scroll-area");
@@ -64,7 +64,7 @@ let next_link = require("next/link");
64
64
  next_link = __toESM(next_link);
65
65
 
66
66
  //#region src/components/unsaved-changes-bar/unsaved-changes-bar.tsx
67
- const spring$3 = {
67
+ const spring$4 = {
68
68
  bounce: 0,
69
69
  duration: .35,
70
70
  type: "spring"
@@ -102,7 +102,7 @@ const ProgressiveBlur = () => {
102
102
  });
103
103
  };
104
104
  const popTransition = {
105
- ...spring$3,
105
+ ...spring$4,
106
106
  duration: .25
107
107
  };
108
108
  const StatusIcon = ({ state }) => {
@@ -201,7 +201,7 @@ const UnsavedChangesBar = ({ hasChanges, onSave, onReset, suppressed = false })
201
201
  initial: { opacity: 0 },
202
202
  animate: { opacity: 1 },
203
203
  exit: { opacity: 0 },
204
- transition: spring$3,
204
+ transition: spring$4,
205
205
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProgressiveBlur, {})
206
206
  }, "blur") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
207
207
  className: "fixed bottom-10 left-1/2 -translate-x-1/2 z-50",
@@ -221,7 +221,7 @@ const UnsavedChangesBar = ({ hasChanges, onSave, onReset, suppressed = false })
221
221
  scale: .95,
222
222
  y: 20
223
223
  },
224
- transition: spring$3,
224
+ transition: spring$4,
225
225
  style: { willChange: "opacity, transform" },
226
226
  className: "flex items-center gap-1.5 rounded-xl bg-zinc-900 dark:bg-[oklch(0.940_0.008_231)] shadow-[0_0_0_1px_rgba(0,0,0,0.08),0_8px_24px_-4px_rgba(0,0,0,0.25),0_20px_50px_-8px_rgba(0,0,0,0.20)] dark:shadow-[0_0_0_1px_rgba(0,0,0,0.08),0_8px_20px_-4px_rgba(0,0,0,0.10),0_20px_50px_-8px_rgba(0,0,0,0.08)] pl-3 pr-1.5 py-1.5",
227
227
  children: [
@@ -333,12 +333,12 @@ const AccordionTrigger = ({ className, children, ...props }) => {
333
333
  className: "flex",
334
334
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_accordion.Trigger, {
335
335
  "data-slot": "accordion-trigger",
336
- className: require_toggle_row.cn("focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md px-1 py-4 text-left text-sm font-medium touch-manipulation transition-[color,background-color,opacity] duration-150 ease-out outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 cursor-pointer", className),
336
+ className: require_toggle_row.cn("focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md px-1 py-4 text-left text-sm font-medium touch-manipulation transition-[color,background-color,opacity] duration-150 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 cursor-pointer", className),
337
337
  ...props,
338
338
  children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
339
339
  icon: _hugeicons_core_free_icons.ArrowRight01Icon,
340
340
  size: 16,
341
- className: "text-muted-foreground/60 pointer-events-none shrink-0 transition-transform duration-200 [*[data-state=open]>&]:rotate-90"
341
+ className: "text-muted-foreground/60 pointer-events-none shrink-0 transition-transform duration-200 ease-out motion-reduce:transition-none [*[data-state=open]>&]:rotate-90"
342
342
  })]
343
343
  })
344
344
  });
@@ -355,6 +355,86 @@ const AccordionContent = ({ className, children, ...props }) => {
355
355
  });
356
356
  };
357
357
 
358
+ //#endregion
359
+ //#region src/components/ui/tray/resolveTrayLayout.tsx
360
+ /**
361
+ * Resolves the droplet "tray" layout for a container (Dialog/Card/Sheet/AlertDialog).
362
+ *
363
+ * Convention (footer-priority): a container gets exactly one muted tray — the
364
+ * **footer** when actions are present, otherwise the **header** (e.g. Table/CodeBlock).
365
+ * The non-tray slots form the raised white shelf. Pass an explicit `tray` to override.
366
+ *
367
+ * Returns the partitioned pieces so each container can assemble its own shell +
368
+ * shelf markup with the shared `--tray-*` tokens.
369
+ */
370
+ const resolveTrayLayout = ({ children, isHeader, isFooter, tray = "auto" }) => {
371
+ const elements = react.Children.toArray(children).filter(react.isValidElement);
372
+ const header = elements.find(isHeader);
373
+ const footer = elements.find(isFooter);
374
+ let edge;
375
+ if (tray === "auto") if (footer) edge = "footer";
376
+ else if (header) edge = "header";
377
+ else edge = "none";
378
+ else edge = tray;
379
+ let trayChild = void 0;
380
+ if (edge === "footer") trayChild = footer;
381
+ else if (edge === "header") trayChild = header;
382
+ const shelf = react.Children.toArray(children).filter((child) => {
383
+ if (!(0, react.isValidElement)(child)) return true;
384
+ if (edge === "footer" && isFooter(child)) return false;
385
+ if (edge === "header" && isHeader(child)) return false;
386
+ return true;
387
+ });
388
+ return {
389
+ edge,
390
+ shelf,
391
+ trayChild
392
+ };
393
+ };
394
+
395
+ //#endregion
396
+ //#region src/components/ui/tray/renderTrayLayout.tsx
397
+ /**
398
+ * Builds the shared droplet "tray" markup for a container (Dialog/Card/AlertDialog/…).
399
+ *
400
+ * Centralizes BOTH the convention (via {@link resolveTrayLayout}) and the render —
401
+ * the muted shell classes + the raised white shelf wrapper + the tray-slot
402
+ * placement — so every container (and new ones like Table/CodeBlock) shares one
403
+ * implementation and can't drift. Each container keeps its own root element
404
+ * (portal, animations, `shadow-elevated` vs `shadow-card`) and just merges
405
+ * `shellClassName` + renders `content`.
406
+ *
407
+ * Note: this composes the tray treatment; it does **not** make any container
408
+ * depend on `Card`. Containers stay independent primitives sharing a treatment.
409
+ */
410
+ const renderTrayLayout = ({ children, isHeader, isFooter, tray = "auto", shelfClassName }) => {
411
+ const { edge, shelf, trayChild } = resolveTrayLayout({
412
+ children,
413
+ isFooter,
414
+ isHeader,
415
+ tray
416
+ });
417
+ if (edge === "none") return {
418
+ content: children,
419
+ edge,
420
+ shellClassName: "bg-card"
421
+ };
422
+ const shellClassName = require_toggle_row.cn("flex flex-col bg-[var(--tray-chrome)] px-[var(--tray-inset)]", edge === "footer" ? "pt-[var(--tray-inset)]" : "pb-[var(--tray-inset)]");
423
+ return {
424
+ content: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
425
+ edge === "header" && trayChild,
426
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
427
+ "data-slot": "tray-shelf",
428
+ className: require_toggle_row.cn("flex flex-1 flex-col overflow-hidden bg-card rounded-[var(--tray-shelf-radius)] shadow-[var(--tray-shelf-shadow)]", shelfClassName),
429
+ children: shelf
430
+ }),
431
+ edge === "footer" && trayChild
432
+ ] }),
433
+ edge,
434
+ shellClassName
435
+ };
436
+ };
437
+
358
438
  //#endregion
359
439
  //#region src/components/ui/alert-dialog/alert-dialog.tsx
360
440
  const AlertDialog = _radix_ui_react_alert_dialog.Root;
@@ -365,15 +445,25 @@ const AlertDialogOverlay = ({ className, ...props }) => /* @__PURE__ */ (0, reac
365
445
  className: require_toggle_row.cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-[var(--overlay-md)] backdrop-blur-[2px] will-change-[opacity] duration-200 motion-reduce:animate-none", className),
366
446
  ...props
367
447
  });
368
- const AlertDialogContent = ({ className, size = "default", ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AlertDialogPortal, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDialogOverlay, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_alert_dialog.Content, {
369
- "data-slot": "alert-dialog-content",
370
- "data-size": size,
371
- className: require_toggle_row.cn("bg-muted overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] rounded-[16px] border-0 shadow-none duration-200 data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-md will-change-[opacity,transform] motion-reduce:animate-none", className),
372
- ...props
373
- })] });
448
+ const AlertDialogContent = ({ className, size = "default", tray = "auto", children, ...props }) => {
449
+ const { edge, shellClassName, content } = renderTrayLayout({
450
+ children,
451
+ isFooter: (el) => el.type === AlertDialogFooter,
452
+ isHeader: (el) => el.type === AlertDialogHeader,
453
+ tray
454
+ });
455
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(AlertDialogPortal, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDialogOverlay, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_alert_dialog.Content, {
456
+ "data-slot": "alert-dialog-content",
457
+ "data-size": size,
458
+ "data-tray": edge,
459
+ className: require_toggle_row.cn("overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 group/alert-dialog-content fixed top-[50%] left-[50%] z-50 w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] rounded-[16px] border-0 shadow-[var(--shadow-elevated)] duration-200 data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-md will-change-[opacity,transform] motion-reduce:animate-none", shellClassName, className),
460
+ ...props,
461
+ children: content
462
+ })] });
463
+ };
374
464
  const AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
375
465
  "data-slot": "alert-dialog-header",
376
- className: require_toggle_row.cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 px-5 py-4 border-b bg-card text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className),
466
+ className: require_toggle_row.cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 px-5 py-4 bg-card text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className),
377
467
  ...props
378
468
  });
379
469
  const AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -383,7 +473,7 @@ const AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ (0, react
383
473
  });
384
474
  const AlertDialogTitle = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_alert_dialog.Title, {
385
475
  "data-slot": "alert-dialog-title",
386
- className: require_toggle_row.cn("text-lg font-semibold text-balance sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className),
476
+ className: require_toggle_row.cn("text-[17px] font-semibold text-balance sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className),
387
477
  ...props
388
478
  });
389
479
  const AlertDialogDescription = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_alert_dialog.Description, {
@@ -391,7 +481,7 @@ const AlertDialogDescription = ({ className, ...props }) => /* @__PURE__ */ (0,
391
481
  className: require_toggle_row.cn("text-muted-foreground text-sm text-pretty", className),
392
482
  ...props
393
483
  });
394
- const AlertDialogAction = ({ className, variant = "default", size = "default", ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_toggle_row.Button, {
484
+ const AlertDialogAction = ({ className, variant = "destructive", size = "default", ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_toggle_row.Button, {
395
485
  variant,
396
486
  size,
397
487
  asChild: true,
@@ -436,11 +526,121 @@ const AvatarFallback = ({ className, ...props }) => {
436
526
  ...props
437
527
  });
438
528
  };
529
+ const AvatarBadge = ({ className, ...props }) => {
530
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
531
+ "data-slot": "avatar-badge",
532
+ className: require_toggle_row.cn("bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full ring-2 select-none", "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className),
533
+ ...props
534
+ });
535
+ };
536
+ const AvatarGroup = ({ className, ...props }) => {
537
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
538
+ "data-slot": "avatar-group",
539
+ className: require_toggle_row.cn("*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2", className),
540
+ ...props
541
+ });
542
+ };
543
+ const AvatarGroupCount = ({ className, ...props }) => {
544
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
545
+ "data-slot": "avatar-group-count",
546
+ className: require_toggle_row.cn("bg-muted text-muted-foreground ring-background relative flex size-8 shrink-0 items-center justify-center rounded-full text-sm ring-2 group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className),
547
+ ...props
548
+ });
549
+ };
550
+
551
+ //#endregion
552
+ //#region src/components/ui/alert/alert.tsx
553
+ const spring$3 = {
554
+ bounce: 0,
555
+ duration: .35,
556
+ type: "spring"
557
+ };
558
+ const alertVariants = (0, class_variance_authority.cva)("flex gap-3 rounded-xl border px-3.5 py-3 text-sm transition-[color,background-color,border-color] duration-150 motion-reduce:transition-none", {
559
+ defaultVariants: { variant: "neutral" },
560
+ variants: { variant: {
561
+ danger: "bg-[var(--danger-light)] text-[var(--text-danger)] border-[var(--border-danger)]/30",
562
+ info: "bg-[var(--brand-light)] text-[var(--text-link)] border-[var(--border-selected)]/30",
563
+ neutral: "bg-secondary text-secondary-foreground border-[var(--border-default)]",
564
+ success: "bg-[var(--success-light)] text-[var(--text-success)] border-[var(--border-success)]/30",
565
+ warning: "bg-[var(--warning-light)] text-[var(--text-warning)] border-[var(--border-warning)]/30"
566
+ } }
567
+ });
568
+ /** Maps each semantic variant to its Hugeicons icon. */
569
+ const variantIcons = {
570
+ danger: _hugeicons_core_free_icons.AlertCircleIcon,
571
+ info: _hugeicons_core_free_icons.InformationCircleIcon,
572
+ neutral: _hugeicons_core_free_icons.InformationCircleIcon,
573
+ success: _hugeicons_core_free_icons.CheckmarkCircle02Icon,
574
+ warning: _hugeicons_core_free_icons.Alert01Icon
575
+ };
576
+ /**
577
+ * An inline semantic callout for contextual feedback.
578
+ *
579
+ * Variants mirror the Badge semantic system: `neutral` (default) | `info` |
580
+ * `success` | `warning` | `danger`. Each variant carries a matching background
581
+ * tint, border, and leading icon drawn from the design-token set.
582
+ *
583
+ * - `danger` and `warning` use `role="alert"` (assertive); others use
584
+ * `role="status"` (polite) to avoid interrupting screen-reader flow.
585
+ * - Use `dismissible` + `onDismiss` for user-closeable callouts.
586
+ *
587
+ * @example
588
+ * <Alert variant="warning" title="Quota almost reached">
589
+ * You have used 90% of your monthly API calls.
590
+ * </Alert>
591
+ */
592
+ const Alert = ({ variant = "neutral", title, children, dismissible = false, onDismiss, className, ...props }) => {
593
+ const [dismissed, setDismissed] = (0, react.useState)(false);
594
+ const shouldReduceMotion = (0, motion_react.useReducedMotion)();
595
+ if (dismissed) return null;
596
+ const Icon$2 = variantIcons[variant];
597
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
598
+ role: variant === "danger" || variant === "warning" ? "alert" : "status",
599
+ "data-slot": "alert",
600
+ "data-variant": variant,
601
+ className: require_toggle_row.cn(alertVariants({ variant }), className),
602
+ ...props,
603
+ children: [
604
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
605
+ className: "shrink-0 mt-0.5 opacity-80",
606
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
607
+ icon: Icon$2,
608
+ size: 16
609
+ })
610
+ }),
611
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
612
+ className: "flex-1 min-w-0",
613
+ children: [title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
614
+ className: "font-medium leading-snug mb-0.5 text-pretty",
615
+ children: title
616
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
617
+ className: "leading-relaxed text-pretty",
618
+ children
619
+ })]
620
+ }),
621
+ dismissible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(motion_react.motion.button, {
622
+ type: "button",
623
+ "aria-label": "Dismiss",
624
+ whileTap: shouldReduceMotion ? void 0 : { scale: .96 },
625
+ transition: spring$3,
626
+ onClick: () => {
627
+ setDismissed(true);
628
+ onDismiss?.();
629
+ },
630
+ className: "relative before:absolute before:-inset-[13px] before:content-[''] shrink-0 mt-0.5 rounded-sm p-0.5 opacity-60 hover:opacity-100 transition-[opacity] duration-150 ease-out motion-reduce:transition-none touch-manipulation cursor-pointer",
631
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
632
+ icon: _hugeicons_core_free_icons.Cancel01Icon,
633
+ size: 14
634
+ })
635
+ })
636
+ ]
637
+ });
638
+ };
439
639
 
440
640
  //#endregion
441
641
  //#region src/components/ui/badge/badge.tsx
442
- const badgeVariants = (0, class_variance_authority.cva)("inline-flex items-center justify-center rounded-[5px] border border-transparent px-1.5 py-0.5 text-xs font-medium tabular-nums w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 [&>svg]:[stroke-width:2.5] gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow,background-color] duration-150 overflow-hidden", {
443
- defaultVariants: { variant: "default" },
642
+ const badgeVariants = (0, class_variance_authority.cva)("inline-flex items-center justify-center rounded-[5px] border border-transparent px-1.5 py-0.5 text-xs font-medium tabular-nums w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 [&>svg]:[stroke-width:2.5] gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow,background-color] duration-150 motion-reduce:transition-none overflow-hidden", {
643
+ defaultVariants: { variant: "neutral" },
444
644
  variants: { variant: {
445
645
  brand: "bg-[var(--brand-light)] text-[var(--brand-accented)] dark:text-[oklch(0.650_0.085_256)] border-[var(--brand-default)]/20 dark:border-[oklch(0.450_0.070_256)]/30 [a&]:hover:bg-[var(--brand-light)]/80",
446
646
  danger: "bg-[var(--danger-light)] text-[var(--text-danger)] border-[var(--border-danger)]/20 [a&]:hover:bg-[var(--danger-light)]/80",
@@ -448,11 +648,12 @@ const badgeVariants = (0, class_variance_authority.cva)("inline-flex items-cente
448
648
  "dashed-brand": "border-dashed border-[var(--brand-default)] text-[var(--brand-accented)] bg-transparent",
449
649
  default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
450
650
  destructive: "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
451
- ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
651
+ ghost: "hover:bg-accent hover:text-accent-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
452
652
  "gradient-brand": "bg-gradient-to-r from-[var(--brand-default)] to-[var(--process-default)] text-white border-transparent",
453
653
  "gradient-premium": "bg-gradient-to-r from-amber-500 to-orange-400 text-white border-transparent",
454
654
  inactive: "bg-[var(--inactive-light)] text-muted-foreground border-[var(--border-inactive)]/40 [a&]:hover:bg-[var(--inactive-light)]/80",
455
- link: "text-primary underline-offset-4 [a&]:hover:underline",
655
+ link: "text-primary underline-offset-4 hover:underline [a&]:hover:underline",
656
+ neutral: "bg-secondary text-secondary-foreground border-border [a&]:hover:bg-secondary/90",
456
657
  outline: "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
457
658
  process: "bg-[var(--process-light)] text-[var(--text-process)] border-[var(--border-process)]/20 [a&]:hover:bg-[var(--process-light)]/80",
458
659
  secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
@@ -460,7 +661,17 @@ const badgeVariants = (0, class_variance_authority.cva)("inline-flex items-cente
460
661
  warning: "bg-[var(--warning-light)] text-[var(--text-warning)] border-[var(--border-warning)]/20 [a&]:hover:bg-[var(--warning-light)]/80"
461
662
  } }
462
663
  });
463
- const Badge = ({ className, variant = "default", asChild = false, ...props }) => {
664
+ /**
665
+ * A small status/label badge.
666
+ *
667
+ * Semantic variants (preferred): `neutral` (grey — the default), `brand`, `success`,
668
+ * `warning`, `danger`, `process`, `inactive`. Pick the variant by meaning.
669
+ *
670
+ * The shadcn-style variants (`default`, `secondary`, `outline`, `ghost`, `link`,
671
+ * `destructive`, `dashed`, `dashed-brand`, `gradient-brand`, `gradient-premium`) are
672
+ * kept as deprecated aliases for backwards compatibility — prefer the semantic ones.
673
+ */
674
+ const Badge = ({ className, variant = "neutral", asChild = false, ...props }) => {
464
675
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(asChild ? _radix_ui_react_slot.Slot : "span", {
465
676
  "data-slot": "badge",
466
677
  "data-variant": variant,
@@ -470,35 +681,154 @@ const Badge = ({ className, variant = "default", asChild = false, ...props }) =>
470
681
  };
471
682
 
472
683
  //#endregion
473
- //#region src/components/ui/card/card.tsx
474
- const Card = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
475
- "data-slot": "card",
476
- className: require_toggle_row.cn("bg-card text-card-foreground flex flex-col rounded-[16px] border-0 shadow-[var(--shadow-card)] overflow-hidden has-data-[slot=card-footer]:bg-muted/50", className),
684
+ //#region src/components/ui/breadcrumb/breadcrumb.tsx
685
+ /**
686
+ * Root nav wrapper for a breadcrumb trail.
687
+ * Renders a semantic `<nav>` with `aria-label="breadcrumb"` so assistive
688
+ * technologies identify it as the site breadcrumb landmark.
689
+ */
690
+ const Breadcrumb = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
691
+ "data-slot": "breadcrumb",
692
+ "aria-label": "breadcrumb",
693
+ className: require_toggle_row.cn("", className),
694
+ ...props
695
+ });
696
+ /**
697
+ * Ordered list that holds `BreadcrumbItem` children.
698
+ * Flex-wraps so long trails reflow gracefully on narrow viewports.
699
+ */
700
+ const BreadcrumbList = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
701
+ "data-slot": "breadcrumb-list",
702
+ className: require_toggle_row.cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
703
+ ...props
704
+ });
705
+ /**
706
+ * A single step in the breadcrumb trail.
707
+ * Renders as an `<li>` with inline-flex layout so icon separators stay
708
+ * vertically centered next to link text.
709
+ */
710
+ const BreadcrumbItem = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
711
+ "data-slot": "breadcrumb-item",
712
+ className: require_toggle_row.cn("inline-flex items-center gap-1.5", className),
477
713
  ...props
478
714
  });
715
+ /**
716
+ * A navigable breadcrumb step.
717
+ *
718
+ * Supports `asChild` (Radix Slot) so consumers can swap in a router `<Link>`:
719
+ * ```tsx
720
+ * <BreadcrumbLink asChild>
721
+ * <Link href='/settings'>Settings</Link>
722
+ * </BreadcrumbLink>
723
+ * ```
724
+ *
725
+ * Inherits `text-muted-foreground` from `BreadcrumbList` and upgrades to
726
+ * `text-foreground` on hover with an `ease-out` transition.
727
+ */
728
+ const BreadcrumbLink = ({ asChild = false, className, children, ...props }) => {
729
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(asChild ? _radix_ui_react_slot.Slot : "a", {
730
+ "data-slot": "breadcrumb-link",
731
+ className: require_toggle_row.cn("transition-colors duration-150 ease-out hover:text-foreground motion-reduce:transition-none", className),
732
+ ...props,
733
+ children
734
+ });
735
+ };
736
+ /**
737
+ * The current page indicator — the last (non-navigable) step in the trail.
738
+ *
739
+ * Renders as a `<span>` with `aria-current="page"` so screen readers announce
740
+ * it as the current location. Not styled as a link; uses `text-foreground` to
741
+ * visually distinguish it from the ancestor links.
742
+ */
743
+ const BreadcrumbPage = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
744
+ "data-slot": "breadcrumb-page",
745
+ "aria-current": "page",
746
+ className: require_toggle_row.cn("font-normal text-foreground", className),
747
+ ...props,
748
+ children
749
+ });
750
+ /**
751
+ * Visual divider between breadcrumb steps.
752
+ *
753
+ * Hidden from assistive technologies via `aria-hidden`.
754
+ * Accepts custom `children` to replace the default chevron with any icon or character.
755
+ */
756
+ const BreadcrumbSeparator = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
757
+ "data-slot": "breadcrumb-separator",
758
+ "aria-hidden": "true",
759
+ className: require_toggle_row.cn("[&>svg]:size-3.5", className),
760
+ ...props,
761
+ children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
762
+ icon: _hugeicons_core_free_icons.ArrowRight01Icon,
763
+ size: 14,
764
+ className: "text-muted-foreground/60",
765
+ "aria-hidden": "true"
766
+ })
767
+ });
768
+ /**
769
+ * Collapsed-steps indicator for long breadcrumb trails.
770
+ *
771
+ * Renders a `MoreHorizontal` icon with a screen-reader-only "More" label.
772
+ * Hidden from the accessibility tree via `aria-hidden` — the surrounding
773
+ * visible crumbs provide sufficient context.
774
+ */
775
+ const BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
776
+ "data-slot": "breadcrumb-ellipsis",
777
+ "aria-hidden": "true",
778
+ className: require_toggle_row.cn("flex size-6 items-center justify-center", className),
779
+ ...props,
780
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
781
+ icon: _hugeicons_core_free_icons.MoreHorizontalIcon,
782
+ size: 14,
783
+ "aria-hidden": "true"
784
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
785
+ className: "sr-only",
786
+ children: "More"
787
+ })]
788
+ });
789
+
790
+ //#endregion
791
+ //#region src/components/ui/card/card.tsx
792
+ const Card = ({ className, interactive = false, selected = false, tray = "none", children, ...props }) => {
793
+ const { edge, shellClassName, content } = renderTrayLayout({
794
+ children,
795
+ isFooter: (el) => el.type === CardFooter,
796
+ isHeader: (el) => el.type === CardHeader,
797
+ tray
798
+ });
799
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
800
+ "data-slot": "card",
801
+ "data-selected": selected || void 0,
802
+ "data-tray": edge,
803
+ className: require_toggle_row.cn("text-card-foreground flex flex-col rounded-[16px] border-0 shadow-[var(--shadow-card)] overflow-hidden", shellClassName, interactive && "cursor-pointer transition-[box-shadow,transform] duration-150 ease-out motion-reduce:transition-none hover:shadow-[var(--shadow-elevated)] active:scale-[0.99]", selected && "shadow-[0_0_0_2px_var(--action),var(--shadow-card)]", className),
804
+ ...props,
805
+ children: content
806
+ });
807
+ };
479
808
  const CardHeader = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
480
809
  "data-slot": "card-header",
481
- className: require_toggle_row.cn("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-5 py-4 border-b bg-card has-data-[slot=card-action]:grid-cols-[1fr_auto]", className),
810
+ className: require_toggle_row.cn("@container/card-header relative flex flex-col gap-0.5 px-4 py-3.5 bg-card border-b border-[var(--border-divider)]", className),
482
811
  ...props
483
812
  });
484
- const CardTitle = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
813
+ const CardTitle = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
485
814
  "data-slot": "card-title",
486
- className: require_toggle_row.cn("text-sm leading-none font-semibold text-balance", className),
487
- ...props
815
+ className: require_toggle_row.cn("text-base leading-none font-semibold text-balance", className),
816
+ ...props,
817
+ children
488
818
  });
489
- const CardDescription = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
819
+ const CardDescription = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
490
820
  "data-slot": "card-description",
491
- className: require_toggle_row.cn("text-muted-foreground text-[13px] text-pretty", className),
821
+ className: require_toggle_row.cn("text-muted-foreground text-sm text-pretty", className),
492
822
  ...props
493
823
  });
494
824
  const CardContent = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
495
825
  "data-slot": "card-content",
496
- className: require_toggle_row.cn("px-5 py-3.5 bg-card", className),
826
+ className: require_toggle_row.cn("flex-1 px-4 py-3 bg-card", className),
497
827
  ...props
498
828
  });
499
829
  const CardFooter = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
500
830
  "data-slot": "card-footer",
501
- className: require_toggle_row.cn("flex items-center px-5 py-4 bg-muted/50", className),
831
+ className: require_toggle_row.cn("mt-auto flex items-center justify-end gap-2 px-4 py-3.5 border-t border-[var(--border-divider)] bg-muted", className),
502
832
  ...props
503
833
  });
504
834
 
@@ -529,14 +859,14 @@ const CheckIcon = ({ size = 14, strokeWidth = 3, className, ...props }) => /* @_
529
859
  const Checkbox = ({ className, ...props }) => {
530
860
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_checkbox.Root, {
531
861
  "data-slot": "checkbox",
532
- className: require_toggle_row.cn("group peer dark:bg-input/30 data-[state=checked]:bg-[var(--action)] data-[state=checked]:text-white dark:data-[state=checked]:bg-[var(--action)] data-[state=indeterminate]:bg-[var(--action)] data-[state=indeterminate]:text-white relative size-4 shrink-0 touch-manipulation rounded-[4px] border-0 shadow-[0_0_0_1px_rgba(31,41,55,0.20),0_1px_2px_0_rgba(0,0,0,0.06),0_0_1px_0_rgba(0,0,0,0.02)] dark:shadow-[0_0_0_1px_rgba(255,255,255,0.15),0_1px_2px_0_rgba(0,0,0,0.20),0_0_1px_0_rgba(0,0,0,0.06)] data-[state=checked]:shadow-[0_0_0_1px_var(--action),0px_1px_1px_0px_rgba(255,255,255,0.15)_inset,0px_2px_3px_0px_rgba(31,41,55,0.30),0px_1px_1px_0px_rgba(0,0,0,0.28)] dark:data-[state=checked]:shadow-[0px_1px_1px_0px_rgba(255,255,255,0.10)_inset,0px_2px_3px_0px_rgba(0,0,0,0.50),0px_1px_1px_0px_rgba(0,0,0,0.30)] data-[state=indeterminate]:shadow-[0_0_0_1px_var(--action),0px_1px_1px_0px_rgba(255,255,255,0.15)_inset,0px_2px_3px_0px_rgba(31,41,55,0.30),0px_1px_1px_0px_rgba(0,0,0,0.28)] dark:data-[state=indeterminate]:shadow-[0px_1px_1px_0px_rgba(255,255,255,0.10)_inset,0px_2px_3px_0px_rgba(0,0,0,0.50),0px_1px_1px_0px_rgba(0,0,0,0.30)] transition-[color,box-shadow,background-color] duration-200 ease outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:shadow-[0_0_0_1px_var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer before:absolute before:-inset-[12px] before:content-['']", className),
862
+ className: require_toggle_row.cn("group peer dark:bg-input/30 data-[state=checked]:bg-[var(--action)] data-[state=checked]:text-white dark:data-[state=checked]:bg-[var(--action)] data-[state=indeterminate]:bg-[var(--action)] data-[state=indeterminate]:text-white relative size-4 shrink-0 touch-manipulation rounded-[4px] border-0 shadow-[var(--shadow-control)] dark:shadow-[var(--shadow-control)] hover:data-[state=unchecked]:shadow-[var(--shadow-control-hover)] dark:hover:data-[state=unchecked]:shadow-[var(--shadow-control-hover)] data-[state=checked]:shadow-[var(--shadow-control-checked)] dark:data-[state=checked]:shadow-[var(--shadow-control-checked)] data-[state=indeterminate]:shadow-[var(--shadow-control-checked)] dark:data-[state=indeterminate]:shadow-[var(--shadow-control-checked)] transition-[color,box-shadow,background-color] duration-200 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:shadow-[0_0_0_1px_var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer after:absolute after:-inset-[14px] after:content-['']", className),
533
863
  ...props,
534
864
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_checkbox.Indicator, {
535
865
  "data-slot": "checkbox-indicator",
536
866
  className: "relative grid place-content-center text-current size-full",
537
867
  forceMount: true,
538
868
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
539
- className: "size-3.5 absolute inset-0 m-auto transition-[opacity,transform,filter] duration-200 opacity-0 scale-[0.25] blur-[4px] group-data-[state=indeterminate]:opacity-100 group-data-[state=indeterminate]:scale-100 group-data-[state=indeterminate]:blur-none",
869
+ className: "size-3.5 absolute inset-0 m-auto transition-[opacity,transform,filter] duration-200 motion-reduce:transition-none opacity-0 scale-[0.25] blur-[4px] group-data-[state=indeterminate]:opacity-100 group-data-[state=indeterminate]:scale-100 group-data-[state=indeterminate]:blur-none",
540
870
  viewBox: "0 0 24 24",
541
871
  fill: "none",
542
872
  stroke: "currentColor",
@@ -548,7 +878,7 @@ const Checkbox = ({ className, ...props }) => {
548
878
  strokeWidth: 3
549
879
  })
550
880
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
551
- className: "size-3.5 absolute inset-0 m-auto transition-[opacity,transform,filter] duration-200 opacity-0 scale-[0.25] blur-[4px] group-data-[state=checked]:opacity-100 group-data-[state=checked]:scale-100 group-data-[state=checked]:blur-none",
881
+ className: "size-3.5 absolute inset-0 m-auto transition-[opacity,transform,filter] duration-200 motion-reduce:transition-none opacity-0 scale-[0.25] blur-[4px] group-data-[state=checked]:opacity-100 group-data-[state=checked]:scale-100 group-data-[state=checked]:blur-none",
552
882
  viewBox: "0 0 24 24",
553
883
  fill: "none",
554
884
  stroke: "currentColor",
@@ -577,8 +907,9 @@ const CollapsibleTrigger = ({ className, ...props }) => {
577
907
  ...props
578
908
  });
579
909
  };
580
- const CollapsibleContent = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_collapsible.CollapsibleContent, {
910
+ const CollapsibleContent = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_collapsible.CollapsibleContent, {
581
911
  "data-slot": "collapsible-content",
912
+ className: require_toggle_row.cn("overflow-hidden", "data-[state=open]:animate-collapsible-down data-[state=closed]:animate-collapsible-up", "motion-reduce:animate-none", className),
582
913
  ...props
583
914
  });
584
915
 
@@ -599,22 +930,31 @@ const DialogOverlay = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx
599
930
  className: require_toggle_row.cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-[var(--overlay-md)] backdrop-blur-[2px] will-change-[opacity] duration-200 data-[state=open]:ease-out data-[state=closed]:ease-in motion-reduce:animate-none", className),
600
931
  ...props
601
932
  });
602
- const DialogContent = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogPortal, {
603
- "data-slot": "dialog-portal",
604
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogOverlay, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Content, {
605
- "data-slot": "dialog-content",
606
- className: require_toggle_row.cn("bg-card overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] rounded-[16px] border-0 shadow-none duration-200 data-[state=open]:ease-out data-[state=closed]:ease-in outline-none sm:max-w-md will-change-[opacity,transform] motion-reduce:animate-none", className),
607
- ...props,
608
- children
609
- })]
610
- });
933
+ const DialogContent = ({ className, children, tray = "auto", ...props }) => {
934
+ const { edge, shellClassName, content } = renderTrayLayout({
935
+ children,
936
+ isFooter: (el) => el.type === DialogFooter,
937
+ isHeader: (el) => el.type === DialogHeader,
938
+ tray
939
+ });
940
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogPortal, {
941
+ "data-slot": "dialog-portal",
942
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogOverlay, {}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Content, {
943
+ "data-slot": "dialog-content",
944
+ "data-tray": edge,
945
+ className: require_toggle_row.cn("overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] rounded-[16px] border-0 shadow-[var(--shadow-elevated)] duration-200 data-[state=open]:ease-out data-[state=closed]:ease-in outline-none sm:max-w-md will-change-[opacity,transform] motion-reduce:animate-none", shellClassName, className),
946
+ ...props,
947
+ children: content
948
+ })]
949
+ });
950
+ };
611
951
  const DialogHeader = ({ className, showCloseButton = true, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
612
952
  "data-slot": "dialog-header",
613
- className: require_toggle_row.cn("relative flex flex-col gap-1.5 px-5 pt-4 pb-4 border-b bg-card sm:text-left", className),
953
+ className: require_toggle_row.cn("relative flex flex-col gap-0.5 px-4 py-4 border-b border-[var(--border-hairline)] bg-card sm:text-left", className),
614
954
  ...props,
615
955
  children: [children, showCloseButton && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_dialog.Close, {
616
956
  "data-slot": "dialog-close",
617
- className: "absolute top-3 right-3 inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,background-color] duration-150 ease hover:opacity-100 hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50 focus:outline-hidden cursor-pointer touch-manipulation before:absolute before:-inset-[6px] before:content-[\"\"]",
957
+ className: "absolute top-1/2 right-2.5 -translate-y-1/2 inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,background-color] duration-150 ease-out motion-reduce:transition-none hover:opacity-100 hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50 focus:outline-hidden cursor-pointer touch-manipulation before:absolute before:-inset-[8px] before:content-[\"\"]",
618
958
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
619
959
  icon: _hugeicons_core_free_icons.Cancel01Icon,
620
960
  size: 14
@@ -626,12 +966,12 @@ const DialogHeader = ({ className, showCloseButton = true, children, ...props })
626
966
  });
627
967
  const DialogBody = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
628
968
  "data-slot": "dialog-body",
629
- className: require_toggle_row.cn("px-5 py-5 bg-card", className),
969
+ className: require_toggle_row.cn("px-4 py-[18px] bg-card", className),
630
970
  ...props
631
971
  });
632
972
  const DialogFooter = ({ className, showCloseButton = false, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
633
973
  "data-slot": "dialog-footer",
634
- className: require_toggle_row.cn("grid grid-cols-2 gap-2 px-5 py-4 bg-muted", className),
974
+ className: require_toggle_row.cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end px-3 py-3.5 border-t border-[var(--border-divider)] bg-muted", className),
635
975
  ...props,
636
976
  children: [children, showCloseButton && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Close, {
637
977
  asChild: true,
@@ -643,7 +983,7 @@ const DialogFooter = ({ className, showCloseButton = false, children, ...props }
643
983
  });
644
984
  const DialogTitle = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Title, {
645
985
  "data-slot": "dialog-title",
646
- className: require_toggle_row.cn("text-lg leading-none font-semibold text-balance", className),
986
+ className: require_toggle_row.cn("text-[17px] leading-none font-semibold text-balance", className),
647
987
  ...props
648
988
  });
649
989
  const DialogDescription = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Description, {
@@ -652,86 +992,6 @@ const DialogDescription = ({ className, ...props }) => /* @__PURE__ */ (0, react
652
992
  ...props
653
993
  });
654
994
 
655
- //#endregion
656
- //#region src/components/icons/animated-icon/animated-icon.tsx
657
- const AnimatedIcon = (0, react.forwardRef)(({ children, className, onMouseEnter, onMouseLeave, size = 28, ...props }, ref) => {
658
- const controls = (0, motion_react.useAnimation)();
659
- const isControlledRef = (0, react.useRef)(false);
660
- (0, react.useImperativeHandle)(ref, () => {
661
- isControlledRef.current = true;
662
- return {
663
- startAnimation: () => controls.start("animate"),
664
- stopAnimation: () => controls.start("normal")
665
- };
666
- });
667
- const handleMouseEnter = (0, react.useCallback)((e) => {
668
- if (isControlledRef.current) onMouseEnter?.(e);
669
- else controls.start("animate").catch(() => void 0);
670
- }, [controls, onMouseEnter]);
671
- const handleMouseLeave = (0, react.useCallback)((e) => {
672
- if (isControlledRef.current) onMouseLeave?.(e);
673
- else controls.start("normal").catch(() => void 0);
674
- }, [controls, onMouseLeave]);
675
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
676
- "aria-hidden": "true",
677
- className: require_toggle_row.cn("inline-flex items-center justify-center", className),
678
- onMouseEnter: handleMouseEnter,
679
- onMouseLeave: handleMouseLeave,
680
- ...props,
681
- children: children(controls, size)
682
- });
683
- });
684
- AnimatedIcon.displayName = "AnimatedIcon";
685
-
686
- //#endregion
687
- //#region src/components/icons/search/search.tsx
688
- const SearchIcon = (0, react.forwardRef)((props, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedIcon, {
689
- ref,
690
- ...props,
691
- children: (controls, size) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(motion_react.motion.svg, {
692
- animate: controls,
693
- fill: "none",
694
- height: size,
695
- stroke: "currentColor",
696
- strokeLinecap: "round",
697
- strokeLinejoin: "round",
698
- strokeWidth: "2",
699
- transition: {
700
- bounce: .3,
701
- duration: 1
702
- },
703
- variants: {
704
- animate: {
705
- x: [
706
- 0,
707
- 0,
708
- -3,
709
- 0
710
- ],
711
- y: [
712
- 0,
713
- -4,
714
- 0,
715
- 0
716
- ]
717
- },
718
- normal: {
719
- x: 0,
720
- y: 0
721
- }
722
- },
723
- viewBox: "0 0 24 24",
724
- width: size,
725
- xmlns: "http://www.w3.org/2000/svg",
726
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
727
- cx: "11",
728
- cy: "11",
729
- r: "8"
730
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m21 21-4.3-4.3" })]
731
- })
732
- }));
733
- SearchIcon.displayName = "SearchIcon";
734
-
735
995
  //#endregion
736
996
  //#region src/components/ui/command/command.tsx
737
997
  const Command = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command, {
@@ -739,23 +999,27 @@ const Command = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runti
739
999
  className: require_toggle_row.cn("bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", className),
740
1000
  ...props
741
1001
  });
742
- const CommandDialog = ({ title = "Command Palette", description = "Search for a command to run...", children, className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Dialog, {
1002
+ const CommandDialog = ({ title = "Command Palette", description = "Search for a command to run...", children, className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog, {
743
1003
  ...props,
744
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogHeader, {
745
- className: "sr-only",
746
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogTitle, { children: title }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogDescription, { children: description })]
747
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogContent, {
1004
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogContent, {
748
1005
  className: require_toggle_row.cn("overflow-hidden p-0", className),
749
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Command, {
1006
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogHeader, {
1007
+ className: "sr-only",
1008
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogTitle, { children: title }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogDescription, { children: description })]
1009
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Command, {
750
1010
  className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5",
751
1011
  children
752
- })
753
- })]
1012
+ })]
1013
+ })
754
1014
  });
755
1015
  const CommandInput = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
756
1016
  "data-slot": "command-input-wrapper",
757
1017
  className: "flex h-9 items-center gap-2 border-b px-3",
758
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(SearchIcon, { className: "size-4 shrink-0 opacity-50" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.Input, {
1018
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1019
+ icon: _hugeicons_core_free_icons.Search01Icon,
1020
+ size: 16,
1021
+ className: "shrink-0 text-muted-foreground/70"
1022
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.Input, {
759
1023
  "data-slot": "command-input",
760
1024
  className: require_toggle_row.cn("placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className),
761
1025
  ...props
@@ -763,7 +1027,7 @@ const CommandInput = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_
763
1027
  });
764
1028
  const CommandList = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.List, {
765
1029
  "data-slot": "command-list",
766
- className: require_toggle_row.cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto", className),
1030
+ className: require_toggle_row.cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto p-1", className),
767
1031
  ...props
768
1032
  });
769
1033
  const CommandEmpty = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.Empty, {
@@ -773,7 +1037,7 @@ const CommandEmpty = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx
773
1037
  });
774
1038
  const CommandGroup = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.Group, {
775
1039
  "data-slot": "command-group",
776
- className: require_toggle_row.cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className),
1040
+ className: require_toggle_row.cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className),
777
1041
  ...props
778
1042
  });
779
1043
  const CommandSeparator = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(cmdk.Command.Separator, {
@@ -792,6 +1056,95 @@ const CommandShortcut = ({ className, ...props }) => /* @__PURE__ */ (0, react_j
792
1056
  ...props
793
1057
  });
794
1058
 
1059
+ //#endregion
1060
+ //#region src/components/ui/popover/popover.tsx
1061
+ const Popover = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Root, {
1062
+ "data-slot": "popover",
1063
+ ...props
1064
+ });
1065
+ const PopoverTrigger = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Trigger, {
1066
+ "data-slot": "popover-trigger",
1067
+ ...props
1068
+ });
1069
+ const PopoverContent = ({ className, align = "center", sideOffset = 8, ...props }) => {
1070
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Content, {
1071
+ "data-slot": "popover-content",
1072
+ align,
1073
+ sideOffset,
1074
+ className: require_toggle_row.cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-xl border-0 p-4 shadow-[var(--shadow-elevated)] outline-hidden will-change-[opacity,transform] motion-reduce:animate-none", className),
1075
+ ...props
1076
+ }) });
1077
+ };
1078
+ const PopoverAnchor = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Anchor, {
1079
+ "data-slot": "popover-anchor",
1080
+ ...props
1081
+ });
1082
+
1083
+ //#endregion
1084
+ //#region src/components/ui/combobox/combobox.tsx
1085
+ /**
1086
+ * Searchable single-select Combobox.
1087
+ *
1088
+ * Composes `Popover`, `Button`, and `Command` from the droplet design system.
1089
+ * The trigger is a full-width `outline` Button with a rotating chevron that
1090
+ * signals open/closed state. Selecting an item closes the popover, fires
1091
+ * `onValueChange`, and shows a check mark next to the active selection.
1092
+ *
1093
+ * @example
1094
+ * ```tsx
1095
+ * const [chain, setChain] = useState('');
1096
+ * <Combobox
1097
+ * options={[{ value: 'eth', label: 'Ethereum' }, { value: 'sol', label: 'Solana' }]}
1098
+ * value={chain}
1099
+ * onValueChange={setChain}
1100
+ * placeholder="Select a chain"
1101
+ * />
1102
+ * ```
1103
+ */
1104
+ const Combobox = ({ options, value, onValueChange, placeholder = "Select…", searchPlaceholder = "Search…", emptyText = "No results.", className, disabled = false }) => {
1105
+ const [open, setOpen] = (0, react.useState)(false);
1106
+ const selectedLabel = options.find((opt) => opt.value === value)?.label;
1107
+ const handleSelect = (selectedValue) => {
1108
+ onValueChange(selectedValue);
1109
+ setOpen(false);
1110
+ };
1111
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Popover, {
1112
+ open,
1113
+ onOpenChange: setOpen,
1114
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PopoverTrigger, {
1115
+ asChild: true,
1116
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1117
+ type: "button",
1118
+ "data-slot": "combobox-trigger",
1119
+ "aria-expanded": open,
1120
+ "aria-haspopup": "listbox",
1121
+ disabled,
1122
+ className: require_toggle_row.cn("flex h-8 w-full touch-manipulation items-center justify-between gap-1.5 rounded-md border-0 bg-background px-3 text-[13px] whitespace-nowrap dark:bg-input/30", "shadow-[var(--shadow-input)] hover:shadow-[var(--shadow-input-hover)]", "transition-[color,box-shadow] duration-100 ease-out motion-reduce:transition-none", "outline-none focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo)]", "cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", className),
1123
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1124
+ className: require_toggle_row.cn("truncate", !selectedLabel && "text-muted-foreground/60"),
1125
+ children: selectedLabel ?? placeholder
1126
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1127
+ icon: _hugeicons_core_free_icons.ArrowDown01Icon,
1128
+ size: 16,
1129
+ className: require_toggle_row.cn("shrink-0 opacity-50 transition-transform duration-150 ease-out motion-reduce:transition-none", open && "rotate-180")
1130
+ })]
1131
+ })
1132
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PopoverContent, {
1133
+ className: "w-[var(--radix-popover-trigger-width)] p-0",
1134
+ align: "start",
1135
+ sideOffset: 4,
1136
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Command, {
1137
+ className: "rounded-[inherit]",
1138
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CommandInput, { placeholder: searchPlaceholder }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CommandList, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CommandEmpty, { children: emptyText }), options.map((opt) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CommandItem, {
1139
+ value: opt.value,
1140
+ onSelect: handleSelect,
1141
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon, { className: require_toggle_row.cn("shrink-0", value === opt.value ? "opacity-100" : "opacity-0") }), opt.label]
1142
+ }, opt.value))] })]
1143
+ })
1144
+ })]
1145
+ });
1146
+ };
1147
+
795
1148
  //#endregion
796
1149
  //#region src/components/ui/dropdown-menu/dropdown-menu.tsx
797
1150
  const DropdownMenu = _radix_ui_react_dropdown_menu.Root;
@@ -801,7 +1154,7 @@ const DropdownMenuSub = _radix_ui_react_dropdown_menu.Sub;
801
1154
  const DropdownMenuContent = (0, react.forwardRef)(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.Content, {
802
1155
  ref,
803
1156
  sideOffset,
804
- className: require_toggle_row.cn("z-50 min-w-32 overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className),
1157
+ className: require_toggle_row.cn("z-50 min-w-32 overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-[var(--shadow-elevated)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none", className),
805
1158
  ...props
806
1159
  }) }));
807
1160
  DropdownMenuContent.displayName = _radix_ui_react_dropdown_menu.Content.displayName;
@@ -818,7 +1171,7 @@ const DropdownMenuCheckboxItem = (0, react.forwardRef)(({ className, children, c
818
1171
  ...props,
819
1172
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
820
1173
  className: "absolute left-2 flex size-3.5 items-center justify-center",
821
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.ItemIndicator, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.CheckIcon, { className: "size-4" }) })
1174
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.ItemIndicator, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.CheckIcon, { className: "size-3.5" }) })
822
1175
  }), children]
823
1176
  }));
824
1177
  DropdownMenuCheckboxItem.displayName = _radix_ui_react_dropdown_menu.CheckboxItem.displayName;
@@ -835,6 +1188,7 @@ const DropdownMenuRadioItem = (0, react.forwardRef)(({ className, children, ...p
835
1188
  DropdownMenuRadioItem.displayName = _radix_ui_react_dropdown_menu.RadioItem.displayName;
836
1189
  const DropdownMenuLabel = (0, react.forwardRef)(({ className, inset, ...props }, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.Label, {
837
1190
  ref,
1191
+ "data-slot": "dropdown-menu-label",
838
1192
  className: require_toggle_row.cn("px-2 py-1.5 text-sm font-medium", inset && "pl-8", className),
839
1193
  ...props
840
1194
  }));
@@ -846,6 +1200,7 @@ const DropdownMenuSeparator = (0, react.forwardRef)(({ className, ...props }, re
846
1200
  }));
847
1201
  DropdownMenuSeparator.displayName = _radix_ui_react_dropdown_menu.Separator.displayName;
848
1202
  const DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1203
+ "aria-hidden": "true",
849
1204
  className: require_toggle_row.cn("ml-auto text-xs tracking-widest text-muted-foreground", className),
850
1205
  ...props
851
1206
  });
@@ -859,11 +1214,141 @@ const DropdownMenuSubTrigger = (0, react.forwardRef)(({ className, inset, childr
859
1214
  DropdownMenuSubTrigger.displayName = _radix_ui_react_dropdown_menu.SubTrigger.displayName;
860
1215
  const DropdownMenuSubContent = (0, react.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dropdown_menu.SubContent, {
861
1216
  ref,
862
- className: require_toggle_row.cn("z-50 min-w-32 overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className),
1217
+ className: require_toggle_row.cn("z-50 min-w-32 overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none", className),
863
1218
  ...props
864
1219
  }));
865
1220
  DropdownMenuSubContent.displayName = _radix_ui_react_dropdown_menu.SubContent.displayName;
866
1221
 
1222
+ //#endregion
1223
+ //#region src/components/ui/well/well.tsx
1224
+ const wellVariants = (0, class_variance_authority.cva)("rounded-xl", {
1225
+ defaultVariants: {
1226
+ gap: "sm",
1227
+ spacing: "default",
1228
+ variant: "inset"
1229
+ },
1230
+ variants: {
1231
+ gap: {
1232
+ default: "space-y-4",
1233
+ lg: "space-y-5",
1234
+ none: "",
1235
+ sm: "space-y-3"
1236
+ },
1237
+ spacing: {
1238
+ default: "p-4",
1239
+ lg: "p-5",
1240
+ none: "p-0",
1241
+ sm: "p-3"
1242
+ },
1243
+ variant: {
1244
+ default: "bg-muted/50",
1245
+ inset: "bg-muted/50 border border-border",
1246
+ outline: "border border-border"
1247
+ }
1248
+ }
1249
+ });
1250
+ const Well = ({ className, gap, spacing, variant, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1251
+ "data-slot": "well",
1252
+ "data-spacing": spacing ?? "default",
1253
+ className: require_toggle_row.cn(wellVariants({
1254
+ gap,
1255
+ spacing,
1256
+ variant
1257
+ }), className),
1258
+ ...props
1259
+ });
1260
+ const WellReveal = ({ children, className, open }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1261
+ className: "grid transition-[grid-template-rows] duration-[220ms] ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none",
1262
+ style: { gridTemplateRows: open ? "1fr" : "0fr" },
1263
+ "aria-hidden": !open,
1264
+ inert: !open,
1265
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1266
+ className: "overflow-hidden",
1267
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1268
+ className: require_toggle_row.cn("px-0.5 pb-0.5 [&>[data-slot=well]:not([data-spacing=none])]:p-[22px]", className),
1269
+ children
1270
+ })
1271
+ })
1272
+ });
1273
+
1274
+ //#endregion
1275
+ //#region src/components/ui/flush-card-stack/flush-card-stack.tsx
1276
+ const DETACH_GAP_PX = 12;
1277
+ /**
1278
+ * Declarative item marker for {@link FlushCardStack}. Renders nothing on its own;
1279
+ * the stack consumes its props.
1280
+ */
1281
+ const FlushCardStackItem = (_props) => null;
1282
+ const isStackItem = (child) => (0, react.isValidElement)(child) && child.type === FlushCardStackItem;
1283
+ const hasReveal = (item) => Boolean(item.props.children);
1284
+ const detaches = (item) => hasReveal(item) && Boolean(item.props.open);
1285
+ /**
1286
+ * A vertical stack of settings cards that fuse into one block by default and
1287
+ * detach with a spring gap when an item's reveal is opened.
1288
+ *
1289
+ * Composed from {@link Card} + {@link WellReveal} (+ `motion`); it encapsulates
1290
+ * the `-mt-px` / `rounded-[16px]` / gap math so consumers pass only per-item
1291
+ * `open` + content:
1292
+ *
1293
+ * ```tsx
1294
+ * <FlushCardStack>
1295
+ * <FlushCardStack.Item open={emailOn} header={<ToggleRow … />}>
1296
+ * <Well gap='sm'>{/* checkbox rows *\/}</Well>
1297
+ * </FlushCardStack.Item>
1298
+ * <FlushCardStack.Item header={<ToggleRow … />} />
1299
+ * </FlushCardStack>
1300
+ * ```
1301
+ *
1302
+ * Rule: a seam (12px spring gap + facing edges rounding to `rounded-[16px]`)
1303
+ * opens between two cards when EITHER side is an open reveal item — so an open
1304
+ * middle item floats free on both sides, while an open first/last item produces a
1305
+ * single inner split. Items with no reveal, or closed reveals, always fuse.
1306
+ */
1307
+ const FlushCardStack = ({ children, className }) => {
1308
+ const prefersReducedMotion = (0, motion_react.useReducedMotion)();
1309
+ const items = react.Children.toArray(children).filter(isStackItem);
1310
+ const lastIndex = items.length - 1;
1311
+ const gapTransition = prefersReducedMotion ? { duration: 0 } : {
1312
+ bounce: 0,
1313
+ duration: .4,
1314
+ type: "spring"
1315
+ };
1316
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1317
+ "data-slot": "flush-card-stack",
1318
+ className,
1319
+ children: items.map((item, index) => {
1320
+ const prev = items[index - 1];
1321
+ const next = items[index + 1];
1322
+ const isFirst = index === 0;
1323
+ const isLast = index === lastIndex;
1324
+ const splitAbove = !isFirst && (detaches(item) || detaches(prev));
1325
+ const splitBelow = !isLast && (detaches(item) || detaches(next));
1326
+ const roundTop = isFirst || splitAbove;
1327
+ const roundBottom = isLast || splitBelow;
1328
+ const gapPossible = !isLast && (hasReveal(item) || hasReveal(next));
1329
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
1330
+ "data-detached": detaches(item) || void 0,
1331
+ className: require_toggle_row.cn("gap-0 py-0 transition-[border-radius] duration-300", !roundTop && "rounded-t-none -mt-px", !roundBottom && "rounded-b-none", item.props.className),
1332
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1333
+ className: "px-5 py-4",
1334
+ children: item.props.header
1335
+ }), hasReveal(item) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WellReveal, {
1336
+ open: Boolean(item.props.open),
1337
+ children: item.props.children
1338
+ })]
1339
+ }), gapPossible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(motion_react.motion.div, {
1340
+ "aria-hidden": true,
1341
+ "data-slot": "flush-card-gap",
1342
+ "data-open": splitBelow || void 0,
1343
+ initial: false,
1344
+ animate: { height: splitBelow ? DETACH_GAP_PX : 0 },
1345
+ transition: gapTransition
1346
+ })] }, item.key ?? index);
1347
+ })
1348
+ });
1349
+ };
1350
+ FlushCardStack.Item = FlushCardStackItem;
1351
+
867
1352
  //#endregion
868
1353
  //#region src/components/icon-config/icon-config.tsx
869
1354
  const IconConfigContext = (0, react.createContext)({
@@ -907,6 +1392,76 @@ const Icon = (props) => {
907
1392
  });
908
1393
  };
909
1394
 
1395
+ //#endregion
1396
+ //#region src/components/ui/field/field.tsx
1397
+ /**
1398
+ * A generic labeled form-field wrapper.
1399
+ *
1400
+ * Wires a `<Label>`, an arbitrary form control, an optional description, and
1401
+ * an error message together with the correct `id`/`htmlFor`/`aria-describedby`
1402
+ * associations so callers don't have to hand-assemble these.
1403
+ *
1404
+ * When there is exactly one child element, `Field` uses `cloneElement` to
1405
+ * inject:
1406
+ * - `id` — links the label's `htmlFor` to the control
1407
+ * - `aria-describedby` — references the description and/or error paragraph ids
1408
+ * - `aria-invalid` — `true` when `error` is present
1409
+ *
1410
+ * @example
1411
+ * ```tsx
1412
+ * <Field label="Email" description="We'll never share your email." required>
1413
+ * <Input type="email" />
1414
+ * </Field>
1415
+ *
1416
+ * <Field label="Email" error="Enter a valid email address.">
1417
+ * <Input type="email" />
1418
+ * </Field>
1419
+ * ```
1420
+ */
1421
+ const Field = ({ label, description, error, required, htmlFor, children, className }) => {
1422
+ const generatedId = (0, react.useId)();
1423
+ const controlId = htmlFor ?? generatedId;
1424
+ const descriptionId = `${controlId}-description`;
1425
+ const errorId = `${controlId}-error`;
1426
+ const describedByParts = [];
1427
+ if (description) describedByParts.push(descriptionId);
1428
+ if (error) describedByParts.push(errorId);
1429
+ const ariaDescribedBy = describedByParts.length > 0 ? describedByParts.join(" ") : void 0;
1430
+ const childArray = react.Children.toArray(children);
1431
+ const singleChild = childArray.length === 1 && (0, react.isValidElement)(childArray[0]) ? childArray[0] : null;
1432
+ const enrichedChild = singleChild ? (0, react.cloneElement)(singleChild, {
1433
+ "aria-describedby": singleChild.props["aria-describedby"] ?? ariaDescribedBy,
1434
+ id: singleChild.props.id ?? controlId,
1435
+ ...error ? { "aria-invalid": true } : {}
1436
+ }) : null;
1437
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1438
+ className: require_toggle_row.cn("grid gap-1.5", className),
1439
+ children: [
1440
+ label && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_toggle_row.Label, {
1441
+ htmlFor: controlId,
1442
+ children: [label, required && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1443
+ "aria-hidden": true,
1444
+ className: "ml-0.5 text-[var(--text-danger)]",
1445
+ children: "*"
1446
+ })]
1447
+ }),
1448
+ enrichedChild ?? children,
1449
+ description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1450
+ id: descriptionId,
1451
+ className: "text-sm text-muted-foreground",
1452
+ children: description
1453
+ }),
1454
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1455
+ id: errorId,
1456
+ role: "alert",
1457
+ className: "text-sm text-[var(--text-danger)]",
1458
+ children: error
1459
+ })
1460
+ ]
1461
+ });
1462
+ };
1463
+ Field.displayName = "Field";
1464
+
910
1465
  //#endregion
911
1466
  //#region src/components/ui/kbd/kbd.tsx
912
1467
  const Kbd = ({ className, ...props }) => {
@@ -917,30 +1472,6 @@ const Kbd = ({ className, ...props }) => {
917
1472
  });
918
1473
  };
919
1474
 
920
- //#endregion
921
- //#region src/components/ui/popover/popover.tsx
922
- const Popover = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Root, {
923
- "data-slot": "popover",
924
- ...props
925
- });
926
- const PopoverTrigger = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Trigger, {
927
- "data-slot": "popover-trigger",
928
- ...props
929
- });
930
- const PopoverContent = ({ className, align = "center", sideOffset = 4, ...props }) => {
931
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Content, {
932
- "data-slot": "popover-content",
933
- align,
934
- sideOffset,
935
- className: require_toggle_row.cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-98 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-xl border-0 p-4 shadow-[var(--shadow-elevated)] outline-hidden will-change-[opacity,transform] motion-reduce:animate-none", className),
936
- ...props
937
- }) });
938
- };
939
- const PopoverAnchor = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_popover.Anchor, {
940
- "data-slot": "popover-anchor",
941
- ...props
942
- });
943
-
944
1475
  //#endregion
945
1476
  //#region src/components/ui/progress/progress.tsx
946
1477
  const progressVariants = (0, class_variance_authority.cva)("h-full w-full flex-1 transition-transform duration-500 ease-out motion-reduce:transition-none", {
@@ -954,44 +1485,257 @@ const progressVariants = (0, class_variance_authority.cva)("h-full w-full flex-1
954
1485
  warning: "bg-[var(--warning-default)]"
955
1486
  } }
956
1487
  });
957
- const Progress = ({ className, indeterminate = false, value, variant, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
958
- "data-slot": "progress",
959
- className: require_toggle_row.cn("bg-primary/20 relative h-2 w-full overflow-hidden rounded-full", className),
1488
+ const Progress = ({ "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className, indeterminate = false, value, variant, ...props }) => {
1489
+ const clamped = Math.min(100, Math.max(0, value ?? 0));
1490
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1491
+ "data-slot": "progress",
1492
+ className: require_toggle_row.cn("bg-primary/20 relative h-2 w-full overflow-hidden rounded-full", className),
1493
+ ...props,
1494
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("progress", {
1495
+ "aria-label": ariaLabel ?? "Progress",
1496
+ "aria-labelledby": ariaLabelledBy,
1497
+ className: "sr-only",
1498
+ max: 100,
1499
+ value: indeterminate ? void 0 : clamped
1500
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1501
+ "data-slot": "progress-indicator",
1502
+ className: require_toggle_row.cn(progressVariants({ variant }), indeterminate && "animate-progress-indeterminate motion-reduce:animate-none"),
1503
+ style: indeterminate ? void 0 : { transform: `translateX(-${100 - clamped}%)` }
1504
+ })]
1505
+ });
1506
+ };
1507
+
1508
+ //#endregion
1509
+ //#region src/components/ui/radio-group/radio-group.tsx
1510
+ const RadioGroup = ({ className, ...props }) => {
1511
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Root, {
1512
+ "data-slot": "radio-group",
1513
+ className: require_toggle_row.cn("grid gap-3", className),
1514
+ ...props
1515
+ });
1516
+ };
1517
+ const RadioGroupItem = ({ className, ...props }) => {
1518
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Item, {
1519
+ "data-slot": "radio-group-item",
1520
+ className: require_toggle_row.cn("text-[var(--action)] dark:bg-input/30 relative aspect-square size-4 shrink-0 touch-manipulation rounded-full border border-[rgba(31,41,55,0.30)] dark:border-[rgba(255,255,255,0.20)] hover:data-[state=unchecked]:border-[rgba(31,41,55,0.45)] dark:hover:data-[state=unchecked]:border-[rgba(255,255,255,0.35)] data-[state=checked]:border-[var(--action)] shadow-[var(--shadow-radio)] dark:shadow-[var(--shadow-radio)] transition-[color,box-shadow,border-color] duration-100 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-[var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer after:absolute after:-inset-[14px] after:content-['']", className),
1521
+ ...props,
1522
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Indicator, {
1523
+ "data-slot": "radio-group-indicator",
1524
+ className: "group/indicator relative flex items-center justify-center",
1525
+ forceMount: true,
1526
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "bg-[var(--action)] absolute top-1/2 left-1/2 size-2 rounded-full -translate-x-1/2 -translate-y-1/2 transition-[opacity,transform] duration-150 ease-out motion-reduce:transition-none group-data-[state=unchecked]/indicator:scale-0 group-data-[state=unchecked]/indicator:opacity-0" })
1527
+ })
1528
+ });
1529
+ };
1530
+ /**
1531
+ * Alias for `RadioGroupItem` for use in labeled-row patterns.
1532
+ *
1533
+ * A radio is inherently part of a group — it must always live inside a
1534
+ * `RadioGroup`. For a standalone on/off toggle, prefer `Checkbox` or `Switch`.
1535
+ * `Radio` is the labeled-usage alias that signals "I'm pairing this with a
1536
+ * `<Label>`" rather than constructing raw item markup.
1537
+ */
1538
+ const Radio = RadioGroupItem;
1539
+ /**
1540
+ * A convenience labeled-radio row for use inside a `RadioGroup`.
1541
+ *
1542
+ * Renders a `RadioGroupItem` paired with an associated `<Label>` (and an
1543
+ * optional description line) so callers don't have to wire up `id`/`htmlFor`
1544
+ * by hand. The `id` is stable across renders via `React.useId` unless
1545
+ * overridden.
1546
+ *
1547
+ * @example
1548
+ * ```tsx
1549
+ * <RadioGroup value={val} onValueChange={setVal}>
1550
+ * <RadioField value="a" label="Option A" description="First choice" />
1551
+ * <RadioField value="b" label="Option B" />
1552
+ * </RadioGroup>
1553
+ * ```
1554
+ */
1555
+ const RadioField = ({ value, label, description, disabled, id: idProp, className }) => {
1556
+ const generatedId = (0, react.useId)();
1557
+ const id = idProp ?? generatedId;
1558
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1559
+ className: require_toggle_row.cn("flex items-start gap-3", disabled && "opacity-50", className),
1560
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(RadioGroupItem, {
1561
+ value,
1562
+ id,
1563
+ disabled,
1564
+ className: "mt-0.5"
1565
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1566
+ className: "grid gap-0.5",
1567
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_toggle_row.Label, {
1568
+ htmlFor: id,
1569
+ className: require_toggle_row.cn("cursor-pointer transition-colors duration-100 ease-out motion-reduce:transition-none", disabled && "cursor-not-allowed"),
1570
+ children: label
1571
+ }), description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1572
+ className: "text-sm text-muted-foreground",
1573
+ children: description
1574
+ })]
1575
+ })]
1576
+ });
1577
+ };
1578
+
1579
+ //#endregion
1580
+ //#region src/components/ui/pagination/pagination.tsx
1581
+ /**
1582
+ * Root nav wrapper for a pagination control set.
1583
+ * Renders a semantic `<nav>` with the ARIA `navigation` landmark.
1584
+ */
1585
+ const Pagination = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
1586
+ "data-slot": "pagination",
1587
+ role: "navigation",
1588
+ "aria-label": "pagination",
1589
+ className: require_toggle_row.cn("mx-auto flex w-full justify-center", className),
1590
+ ...props
1591
+ });
1592
+ /**
1593
+ * Flex row that holds `PaginationItem` children.
1594
+ * Renders as a `<ul>` for correct list semantics inside the nav landmark.
1595
+ */
1596
+ const PaginationContent = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
1597
+ "data-slot": "pagination-content",
1598
+ className: require_toggle_row.cn("flex flex-row items-center gap-1", className),
1599
+ ...props
1600
+ });
1601
+ /**
1602
+ * A single `<li>` slot inside `PaginationContent`.
1603
+ * Acts as a structural wrapper — pair with `PaginationLink`, `PaginationPrevious`, or `PaginationNext`.
1604
+ */
1605
+ const PaginationItem = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
1606
+ "data-slot": "pagination-item",
1607
+ className: require_toggle_row.cn("", className),
1608
+ ...props
1609
+ });
1610
+ /**
1611
+ * An individual page link.
1612
+ * Applies `buttonVariants` — `outline` when active, `ghost` when inactive — so focus rings,
1613
+ * `ease-out` transitions, and `motion-reduce` suppression are all inherited from Button's CVA base.
1614
+ */
1615
+ const PaginationLink = ({ className, isActive = false, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
1616
+ "data-slot": "pagination-link",
1617
+ "aria-current": isActive ? "page" : void 0,
1618
+ className: require_toggle_row.cn(require_toggle_row.buttonVariants({
1619
+ size: "icon-sm",
1620
+ variant: isActive ? "outline" : "ghost"
1621
+ }), className),
1622
+ ...props,
1623
+ children
1624
+ });
1625
+ /**
1626
+ * Previous-page control.
1627
+ * Disabled when the consumer passes `aria-disabled="true"` or the native `disabled` attribute.
1628
+ * Touch target is expanded to 44 px via the pseudo-element already baked into `icon-sm`.
1629
+ */
1630
+ const PaginationPrevious = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1631
+ "data-slot": "pagination-previous",
1632
+ "aria-label": "Go to previous page",
1633
+ className: require_toggle_row.cn(require_toggle_row.buttonVariants({
1634
+ size: "icon-sm",
1635
+ variant: "ghost"
1636
+ }), "gap-1 pl-2.5", className),
960
1637
  ...props,
961
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("progress", {
962
- "aria-label": "Progress",
1638
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1639
+ icon: _hugeicons_core_free_icons.ArrowLeft01Icon,
1640
+ size: 14,
1641
+ "aria-hidden": "true"
1642
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
963
1643
  className: "sr-only",
964
- max: 100,
965
- value: indeterminate ? void 0 : value ?? 0
966
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
967
- "data-slot": "progress-indicator",
968
- className: require_toggle_row.cn(progressVariants({ variant }), indeterminate && "animate-progress-indeterminate motion-reduce:animate-none"),
969
- style: indeterminate ? void 0 : { transform: `translateX(-${100 - (value ?? 0)}%)` }
1644
+ children: children ?? "Previous"
970
1645
  })]
971
1646
  });
972
-
973
- //#endregion
974
- //#region src/components/ui/radio-group/radio-group.tsx
975
- const RadioGroup = ({ className, ...props }) => {
976
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Root, {
977
- "data-slot": "radio-group",
978
- className: require_toggle_row.cn("grid gap-3", className),
979
- ...props
980
- });
981
- };
982
- const RadioGroupItem = ({ className, ...props }) => {
983
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Item, {
984
- "data-slot": "radio-group-item",
985
- className: require_toggle_row.cn("text-[var(--action)] dark:bg-input/30 relative aspect-square size-4 shrink-0 touch-manipulation rounded-full border border-[rgba(31,41,55,0.30)] dark:border-[rgba(255,255,255,0.20)] data-[state=checked]:border-[var(--action)] shadow-[0_1px_2px_rgba(0,0,0,0.06),0_0_1px_rgba(31,41,55,0.08)] dark:shadow-[0_1px_2px_rgba(0,0,0,0.20),0_0_1px_rgba(0,0,0,0.15)] transition-[color,box-shadow,border-color] duration-100 ease-out outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-[var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer before:absolute before:-inset-[12px] before:content-['']", className),
986
- ...props,
987
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_radio_group.Indicator, {
988
- "data-slot": "radio-group-indicator",
989
- className: "group/indicator relative flex items-center justify-center",
990
- forceMount: true,
991
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "bg-[var(--action)] absolute top-1/2 left-1/2 size-2 rounded-full -translate-x-1/2 -translate-y-1/2 transition-[opacity,transform] duration-150 ease-out group-data-[state=unchecked]/indicator:scale-0 group-data-[state=unchecked]/indicator:opacity-0" })
1647
+ /**
1648
+ * Next-page control.
1649
+ * Touch target is expanded to 44 px via the pseudo-element already baked into `icon-sm`.
1650
+ */
1651
+ const PaginationNext = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1652
+ "data-slot": "pagination-next",
1653
+ "aria-label": "Go to next page",
1654
+ className: require_toggle_row.cn(require_toggle_row.buttonVariants({
1655
+ size: "icon-sm",
1656
+ variant: "ghost"
1657
+ }), "gap-1 pr-2.5", className),
1658
+ ...props,
1659
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1660
+ icon: _hugeicons_core_free_icons.ArrowRight01Icon,
1661
+ size: 14,
1662
+ "aria-hidden": "true"
1663
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1664
+ className: "sr-only",
1665
+ children: children ?? "Next"
1666
+ })]
1667
+ });
1668
+ /**
1669
+ * Ellipsis placeholder shown between non-contiguous page ranges.
1670
+ * Hidden from assistive technologies via `aria-hidden` — screen readers hear the surrounding page
1671
+ * numbers and can infer that pages are omitted.
1672
+ */
1673
+ const PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1674
+ "data-slot": "pagination-ellipsis",
1675
+ "aria-hidden": "true",
1676
+ className: require_toggle_row.cn("flex size-7 items-center justify-center text-muted-foreground", className),
1677
+ ...props,
1678
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1679
+ icon: _hugeicons_core_free_icons.MoreHorizontalIcon,
1680
+ size: 14
1681
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1682
+ className: "sr-only",
1683
+ children: "More pages"
1684
+ })]
1685
+ });
1686
+ /**
1687
+ * Pre-assembled cursor-based pagination bar.
1688
+ *
1689
+ * Renders a Previous button, an optional center label, and a Next button.
1690
+ * Each button is disabled automatically when there is no page in that direction.
1691
+ * Designed for dashboard tables and lists that use cursor/keyset pagination rather
1692
+ * than numbered pages — which is the dominant pattern in the Redcoast design system.
1693
+ *
1694
+ * @example
1695
+ * ```tsx
1696
+ * <CursorPagination
1697
+ * hasPrevious={!!cursor.before}
1698
+ * hasNext={!!cursor.after}
1699
+ * onPrevious={loadPrevious}
1700
+ * onNext={loadNext}
1701
+ * label={`${startIndex}–${endIndex} of ${total}`}
1702
+ * />
1703
+ * ```
1704
+ */
1705
+ const CursorPagination = ({ hasPrevious, hasNext, onPrevious, onNext, label, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1706
+ "data-slot": "cursor-pagination",
1707
+ className: require_toggle_row.cn("flex items-center justify-between gap-2", className),
1708
+ children: [
1709
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_toggle_row.Button, {
1710
+ variant: "ghost",
1711
+ size: "sm",
1712
+ disabled: !hasPrevious,
1713
+ onClick: onPrevious,
1714
+ "aria-label": "Go to previous page",
1715
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1716
+ icon: _hugeicons_core_free_icons.ArrowLeft01Icon,
1717
+ size: 14,
1718
+ "aria-hidden": "true"
1719
+ }), "Previous"]
1720
+ }),
1721
+ label !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1722
+ className: "text-sm text-muted-foreground tabular-nums",
1723
+ children: label
1724
+ }),
1725
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_toggle_row.Button, {
1726
+ variant: "ghost",
1727
+ size: "sm",
1728
+ disabled: !hasNext,
1729
+ onClick: onNext,
1730
+ "aria-label": "Go to next page",
1731
+ children: ["Next", /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1732
+ icon: _hugeicons_core_free_icons.ArrowRight01Icon,
1733
+ size: 14,
1734
+ "aria-hidden": "true"
1735
+ })]
992
1736
  })
993
- });
994
- };
1737
+ ]
1738
+ });
995
1739
 
996
1740
  //#endregion
997
1741
  //#region src/components/ui/scroll-area/scroll-area.tsx
@@ -1003,7 +1747,7 @@ const ScrollArea = ({ className, children, ...props }) => {
1003
1747
  children: [
1004
1748
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_scroll_area.Viewport, {
1005
1749
  "data-slot": "scroll-area-viewport",
1006
- className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
1750
+ className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] motion-reduce:transition-none outline-none focus-visible:ring-[3px]",
1007
1751
  children
1008
1752
  }),
1009
1753
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScrollBar, {}),
@@ -1015,7 +1759,7 @@ const ScrollBar = ({ className, orientation = "vertical", ...props }) => {
1015
1759
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_scroll_area.ScrollAreaScrollbar, {
1016
1760
  "data-slot": "scroll-area-scrollbar",
1017
1761
  orientation,
1018
- className: require_toggle_row.cn("flex touch-none touch-manipulation p-px transition-[background-color] select-none", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", className),
1762
+ className: require_toggle_row.cn("flex touch-none touch-manipulation p-px transition-[background-color] motion-reduce:transition-none select-none", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", className),
1019
1763
  ...props,
1020
1764
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_scroll_area.ScrollAreaThumb, {
1021
1765
  "data-slot": "scroll-area-thumb",
@@ -1030,14 +1774,14 @@ const SearchInput = ({ className, placeholder = "Search...", shortcut = "⌘K",
1030
1774
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1031
1775
  type: "button",
1032
1776
  "data-slot": "search-input",
1033
- className: require_toggle_row.cn("h-8 min-h-11 w-full touch-manipulation rounded-md border border-border bg-background dark:bg-input/30 md:min-h-0", "hover:border-foreground/20", "transition-[color,box-shadow,border-color] duration-100 ease-out", "outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50", "flex items-center gap-2 px-3", "text-sm text-muted-foreground/60 cursor-pointer", className),
1777
+ className: require_toggle_row.cn("h-8 w-full touch-manipulation rounded-md border-0 bg-background dark:bg-input/30 shadow-[var(--shadow-input)]", "hover:shadow-[var(--shadow-input-hover)]", "transition-[color,box-shadow] duration-100 ease-out motion-reduce:transition-none", "outline-none focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]", "flex items-center gap-2 px-2", "text-sm text-muted-foreground/60 cursor-pointer", className),
1034
1778
  onClick,
1035
1779
  ...props,
1036
1780
  children: [
1037
1781
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1038
1782
  icon: _hugeicons_core_free_icons.Search01Icon,
1039
- size: 14,
1040
- className: "shrink-0 text-muted-foreground"
1783
+ size: 16,
1784
+ className: "shrink-0 text-muted-foreground/70"
1041
1785
  }),
1042
1786
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1043
1787
  className: "flex-1 text-left",
@@ -1065,27 +1809,27 @@ const SelectValue = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)
1065
1809
  const SelectTrigger = ({ className, size = "default", children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_select.Trigger, {
1066
1810
  "data-slot": "select-trigger",
1067
1811
  "data-size": size,
1068
- className: require_toggle_row.cn("data-[placeholder]:text-muted-foreground/60 [&_svg:not([class*='text-'])]:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 flex w-fit touch-manipulation items-center justify-between gap-1.5 rounded-md border-0 bg-transparent px-3 py-2 text-[13px] whitespace-nowrap shadow-[var(--shadow-input)] hover:shadow-[var(--shadow-input-hover)] transition-[color,box-shadow] duration-100 ease-out outline-none focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_rgba(0,114,239,0.15)] aria-invalid:shadow-[0_0_0_1px_var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:text-[13px] data-[size=sm]:px-2.5 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1812
+ className: require_toggle_row.cn("data-[placeholder]:text-muted-foreground/60 [&_svg:not([class*='text-'])]:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 flex w-fit touch-manipulation items-center justify-between gap-1.5 rounded-md border-0 bg-transparent px-3 py-2 text-[13px] whitespace-nowrap shadow-[var(--shadow-input)] hover:shadow-[var(--shadow-input-hover)] transition-[color,box-shadow] duration-100 ease-out outline-none focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)] aria-invalid:shadow-[0_0_0_1px_var(--destructive)] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:text-[13px] data-[size=sm]:px-2.5 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[state=open]:[&>svg:last-of-type]:rotate-180", className),
1069
1813
  ...props,
1070
1814
  children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.Icon, {
1071
1815
  asChild: true,
1072
1816
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1073
1817
  icon: _hugeicons_core_free_icons.ArrowDown01Icon,
1074
1818
  size: 16,
1075
- className: "opacity-50"
1819
+ className: "opacity-50 transition-transform duration-150 ease-out motion-reduce:transition-none"
1076
1820
  })
1077
1821
  })]
1078
1822
  });
1079
1823
  const SelectContent = ({ className, children, position = "popper", align = "start", ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_select.Content, {
1080
1824
  "data-slot": "select-content",
1081
- className: require_toggle_row.cn("bg-popover text-popover-foreground will-change-[opacity,transform] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xl border-0 shadow-[var(--shadow-elevated)]", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
1825
+ className: require_toggle_row.cn("bg-popover text-popover-foreground will-change-[opacity,transform] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 motion-reduce:animate-none relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xl border-0 shadow-[var(--shadow-elevated)]", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
1082
1826
  position,
1083
1827
  align,
1084
1828
  ...props,
1085
1829
  children: [
1086
1830
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectScrollUpButton, {}),
1087
1831
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.Viewport, {
1088
- className: require_toggle_row.cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),
1832
+ className: require_toggle_row.cn("p-1", position === "popper" && "w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),
1089
1833
  children
1090
1834
  }),
1091
1835
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SelectScrollDownButton, {})
@@ -1098,14 +1842,14 @@ const SelectLabel = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_r
1098
1842
  });
1099
1843
  const SelectItem = ({ className, children, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_select.Item, {
1100
1844
  "data-slot": "select-item",
1101
- className: require_toggle_row.cn("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
1845
+ className: require_toggle_row.cn("data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[state=checked]:font-medium [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
1102
1846
  ...props,
1103
1847
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1104
1848
  "data-slot": "select-item-indicator",
1105
1849
  className: "absolute right-2 flex size-3.5 items-center justify-center",
1106
1850
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.ItemIndicator, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1107
1851
  icon: _hugeicons_core_free_icons.Tick01Icon,
1108
- size: 16
1852
+ size: 14
1109
1853
  }) })
1110
1854
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.ItemText, { children })]
1111
1855
  });
@@ -1120,7 +1864,8 @@ const SelectScrollUpButton = ({ className, ...props }) => /* @__PURE__ */ (0, re
1120
1864
  ...props,
1121
1865
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1122
1866
  icon: _hugeicons_core_free_icons.ArrowUp01Icon,
1123
- size: 16
1867
+ size: 16,
1868
+ "aria-hidden": true
1124
1869
  })
1125
1870
  });
1126
1871
  const SelectScrollDownButton = ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_select.ScrollDownButton, {
@@ -1129,7 +1874,8 @@ const SelectScrollDownButton = ({ className, ...props }) => /* @__PURE__ */ (0,
1129
1874
  ...props,
1130
1875
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1131
1876
  icon: _hugeicons_core_free_icons.ArrowDown01Icon,
1132
- size: 16
1877
+ size: 16,
1878
+ "aria-hidden": true
1133
1879
  })
1134
1880
  });
1135
1881
 
@@ -1138,7 +1884,7 @@ const SelectScrollDownButton = ({ className, ...props }) => /* @__PURE__ */ (0,
1138
1884
  const SelectableCard = ({ badge, className, description, icon, iconSize = 20, label, selected, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1139
1885
  "data-slot": "selectable-card",
1140
1886
  "data-selected": selected,
1141
- className: require_toggle_row.cn("group/card relative flex flex-col items-start gap-2.5 p-4 rounded-xl text-left transition-[box-shadow,background-color,scale] duration-150 touch-manipulation active:scale-[0.96] cursor-pointer w-full outline-none focus-visible:shadow-[0_0_0_1.5px_var(--action),0_0_0_4px_oklch(from_var(--action)_l_c_h_/_0.25)]", selected ? "bg-[var(--action)]/5 shadow-[0_0_0_1.5px_var(--action)]" : "shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.12)] hover:shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.20)]", className),
1887
+ className: require_toggle_row.cn("group/card relative flex flex-col items-start gap-2.5 p-4 rounded-xl text-left transition-[box-shadow,background-color,scale] duration-150 motion-reduce:transition-none touch-manipulation active:scale-[0.96] cursor-pointer w-full outline-none focus-visible:shadow-[0_0_0_1.5px_var(--action),0_0_0_4px_oklch(from_var(--action)_l_c_h_/_0.25)]", selected ? "bg-[var(--action)]/5 shadow-[0_0_0_1.5px_var(--action)]" : "shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.12)] hover:shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.20)]", className),
1142
1888
  ...props,
1143
1889
  children: [
1144
1890
  icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
@@ -1165,10 +1911,10 @@ const SelectableCard = ({ badge, className, description, icon, iconSize = 20, la
1165
1911
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1166
1912
  className: "absolute top-4 right-4",
1167
1913
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1168
- className: require_toggle_row.cn("relative size-4 shrink-0 rounded-[4px] transition-[color,box-shadow,background-color] duration-200 ease", selected ? "bg-[var(--action)] text-white shadow-[0_0_0_1px_var(--action),0px_1px_1px_0px_oklch(1_0_0_/_0.07)_inset,0px_2px_3px_0px_oklch(0.278_0.03_256.85_/_0.20),0px_1px_1px_0px_oklch(0_0_0_/_0.24)]" : "shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.20),0_1px_2px_0_oklch(0_0_0_/_0.06),0_0_1px_0_oklch(0_0_0_/_0.02)] group-hover/card:shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.30),0_1px_2px_0_oklch(0_0_0_/_0.06),0_0_1px_0_oklch(0_0_0_/_0.02)]"),
1914
+ className: require_toggle_row.cn("relative size-4 shrink-0 rounded-[4px] transition-[color,box-shadow,background-color] duration-200 ease-out motion-reduce:transition-none", selected ? "bg-[var(--action)] text-white shadow-[0_0_0_1px_var(--action),0px_1px_1px_0px_oklch(1_0_0_/_0.07)_inset,0px_2px_3px_0px_oklch(0.278_0.03_256.85_/_0.20),0px_1px_1px_0px_oklch(0_0_0_/_0.24)]" : "shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.20),0_1px_2px_0_oklch(0_0_0_/_0.06),0_0_1px_0_oklch(0_0_0_/_0.02)] group-hover/card:shadow-[0_0_0_1px_oklch(0.278_0.03_256.85_/_0.30),0_1px_2px_0_oklch(0_0_0_/_0.06),0_0_1px_0_oklch(0_0_0_/_0.02)]"),
1169
1915
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon, {
1170
1916
  size: 14,
1171
- className: require_toggle_row.cn("absolute inset-0 m-auto text-current transition-[opacity,transform,filter] duration-200", selected ? "opacity-100 scale-100 blur-none" : "opacity-0 scale-[0.25] blur-[4px]")
1917
+ className: require_toggle_row.cn("absolute inset-0 m-auto text-current transition-[opacity,transform,filter] duration-200 motion-reduce:transition-none", selected ? "opacity-100 scale-100 blur-none" : "opacity-0 scale-[0.25] blur-[4px]")
1172
1918
  })
1173
1919
  })
1174
1920
  })
@@ -1186,6 +1932,41 @@ const Separator = (0, react.forwardRef)(({ className, orientation = "horizontal"
1186
1932
  }));
1187
1933
  Separator.displayName = _radix_ui_react_separator.Root.displayName;
1188
1934
 
1935
+ //#endregion
1936
+ //#region src/components/ui/slider/slider.tsx
1937
+ /**
1938
+ * Controlled range slider built on a native `<input type="range">`.
1939
+ *
1940
+ * Zero-dependency — all styling is done with Tailwind arbitrary variants so
1941
+ * no Radix/Headless UI install is needed. The filled portion is rendered via an
1942
+ * inline CSS custom property so the gradient stays in sync with the value without
1943
+ * any JS animation loop.
1944
+ */
1945
+ const Slider = ({ value, onValueChange, min = 0, max = 100, step = 1, disabled = false, className }) => {
1946
+ const clamped = Math.min(max, Math.max(min, value));
1947
+ const range = max - min;
1948
+ const fillPercent = range === 0 ? 0 : (clamped - min) / range * 100;
1949
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1950
+ "data-slot": "slider",
1951
+ className: require_toggle_row.cn("relative flex w-full touch-manipulation items-center", className),
1952
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1953
+ type: "range",
1954
+ "data-slot": "slider-input",
1955
+ min,
1956
+ max,
1957
+ step,
1958
+ value: clamped,
1959
+ disabled,
1960
+ "aria-valuemin": min,
1961
+ "aria-valuemax": max,
1962
+ "aria-valuenow": clamped,
1963
+ onChange: (e) => onValueChange(Number(e.target.value)),
1964
+ className: require_toggle_row.cn("w-full appearance-none bg-transparent outline-none", "cursor-pointer disabled:cursor-not-allowed disabled:opacity-50", "[&::-webkit-slider-runnable-track]:h-1.5", "[&::-webkit-slider-runnable-track]:w-full", "[&::-webkit-slider-runnable-track]:rounded-full", "[&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--action)_var(--slider-fill,0%),var(--bg-accented)_var(--slider-fill,0%))]", "[&::-webkit-slider-runnable-track]:transition-[background-size] [&::-webkit-slider-runnable-track]:duration-150 [&::-webkit-slider-runnable-track]:ease-out", "[&::-webkit-slider-runnable-track]:motion-reduce:transition-none", "[&::-webkit-slider-thumb]:appearance-none", "[&::-webkit-slider-thumb]:size-4", "[&::-webkit-slider-thumb]:rounded-full", "[&::-webkit-slider-thumb]:bg-background", "[&::-webkit-slider-thumb]:border", "[&::-webkit-slider-thumb]:border-[var(--action)]", "[&::-webkit-slider-thumb]:shadow-[var(--shadow-control-thumb)]", "[&::-webkit-slider-thumb]:-mt-[5px]", "[&::-webkit-slider-thumb]:transition-[box-shadow] [&::-webkit-slider-thumb]:duration-150 [&::-webkit-slider-thumb]:ease-out", "[&::-webkit-slider-thumb]:motion-reduce:transition-none", "focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_3px_var(--ring-halo),var(--shadow-control-thumb)]", "[&::-moz-range-track]:h-1.5", "[&::-moz-range-track]:w-full", "[&::-moz-range-track]:rounded-full", "[&::-moz-range-track]:bg-[var(--bg-accented)]", "[&::-moz-range-progress]:h-1.5", "[&::-moz-range-progress]:rounded-full", "[&::-moz-range-progress]:bg-[var(--action)]", "[&::-moz-range-thumb]:size-4", "[&::-moz-range-thumb]:rounded-full", "[&::-moz-range-thumb]:border", "[&::-moz-range-thumb]:border-[var(--action)]", "[&::-moz-range-thumb]:bg-background", "[&::-moz-range-thumb]:shadow-[var(--shadow-control-thumb)]", "[&::-moz-range-thumb]:transition-[box-shadow] [&::-moz-range-thumb]:duration-150 [&::-moz-range-thumb]:ease-out", "[&::-moz-range-thumb]:motion-reduce:transition-none", "focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_3px_var(--ring-halo),var(--shadow-control-thumb)]"),
1965
+ style: { "--slider-fill": `${fillPercent}%` }
1966
+ })
1967
+ });
1968
+ };
1969
+
1189
1970
  //#endregion
1190
1971
  //#region src/components/ui/sheet/sheet.tsx
1191
1972
  const Sheet = ({ ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_dialog.Root, {
@@ -1217,7 +1998,7 @@ const SheetContent = ({ className, children, side = "right", showCloseButton = t
1217
1998
  className: require_toggle_row.cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 border-0 shadow-[var(--shadow-elevated)] [animation-timing-function:cubic-bezier(0.32,0.72,0,1)] data-[state=closed]:duration-150 data-[state=open]:duration-200 will-change-[opacity,transform] motion-reduce:animate-none", side === "right" && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 sm:max-w-sm rounded-l-xl rounded-r-md", side === "left" && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 sm:max-w-sm rounded-r-xl rounded-l-md", side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto rounded-b-md", side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto rounded-t-md", className),
1218
1999
  ...props,
1219
2000
  children: [children, showCloseButton && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_radix_ui_react_dialog.Close, {
1220
- className: "absolute top-3 right-3 inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,background-color] duration-150 ease hover:opacity-100 hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50 focus:outline-hidden disabled:pointer-events-none cursor-pointer touch-manipulation before:absolute before:-inset-[6px] before:content-['']",
2001
+ className: "absolute top-3 right-3 inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground opacity-70 transition-[opacity,background-color] duration-150 ease-out motion-reduce:transition-none hover:opacity-100 hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring/50 focus:outline-hidden disabled:pointer-events-none cursor-pointer touch-manipulation before:absolute before:-inset-2 before:content-['']",
1221
2002
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_hugeicons_react.HugeiconsIcon, {
1222
2003
  icon: _hugeicons_core_free_icons.Cancel01Icon,
1223
2004
  size: 14
@@ -1231,14 +2012,14 @@ const SheetContent = ({ className, children, side = "right", showCloseButton = t
1231
2012
  const SheetHeader = ({ className, ...props }) => {
1232
2013
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1233
2014
  "data-slot": "sheet-header",
1234
- className: require_toggle_row.cn("flex flex-col gap-1.5 p-4", className),
2015
+ className: require_toggle_row.cn("flex flex-col gap-0.5 px-4 py-3.5 border-b border-[var(--border-divider)]", className),
1235
2016
  ...props
1236
2017
  });
1237
2018
  };
1238
2019
  const SheetFooter = ({ className, ...props }) => {
1239
2020
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1240
2021
  "data-slot": "sheet-footer",
1241
- className: require_toggle_row.cn("mt-auto flex flex-col gap-2 p-4", className),
2022
+ className: require_toggle_row.cn("mt-auto flex flex-col gap-2 px-4 py-3.5 border-t border-[var(--border-divider)] bg-muted", className),
1242
2023
  ...props
1243
2024
  });
1244
2025
  };
@@ -1260,9 +2041,10 @@ const SheetDescription = ({ className, ...props }) => {
1260
2041
  //#endregion
1261
2042
  //#region src/components/ui/skeleton/skeleton.tsx
1262
2043
  const Skeleton = ({ className, ...props }) => {
1263
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2044
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("output", {
2045
+ "aria-label": "Loading",
1264
2046
  "data-slot": "skeleton",
1265
- className: require_toggle_row.cn("bg-accent animate-shimmer motion-reduce:animate-none rounded-md bg-[length:200%_100%] bg-gradient-to-r from-accent via-accent/50 to-accent", className),
2047
+ className: require_toggle_row.cn("block bg-accent animate-shimmer motion-reduce:animate-none rounded-md bg-[length:200%_100%] bg-gradient-to-r from-accent via-accent/50 to-accent dark:via-accent/70", className),
1266
2048
  ...props
1267
2049
  });
1268
2050
  };
@@ -1320,27 +2102,64 @@ const Toaster = ({ ...props }) => {
1320
2102
  };
1321
2103
 
1322
2104
  //#endregion
1323
- //#region src/components/ui/spinner/spinner.tsx
1324
- const Spinner = ({ className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("output", {
1325
- "aria-label": "Loading",
1326
- className: "inline-flex",
1327
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1328
- viewBox: "0 0 24 24",
1329
- fill: "none",
1330
- xmlns: "http://www.w3.org/2000/svg",
1331
- className: require_toggle_row.cn("size-4 animate-spin motion-reduce:animate-none", className),
1332
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
1333
- className: "opacity-25",
1334
- cx: "12",
1335
- cy: "12",
1336
- r: "10",
1337
- stroke: "currentColor",
1338
- strokeWidth: "4"
1339
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
1340
- className: "opacity-75",
1341
- fill: "currentColor",
1342
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
1343
- })]
2105
+ //#region src/components/ui/stepper/stepper.tsx
2106
+ /**
2107
+ * Horizontal step indicator that renders an ordered sequence of steps with
2108
+ * connector lines between them.
2109
+ *
2110
+ * - **COMPLETED** (index < currentStep): filled action-coloured circle + white checkmark.
2111
+ * - **CURRENT** (index === currentStep): action-coloured border + step number; label is font-medium.
2112
+ * - **UPCOMING** (index > currentStep): muted border + step number.
2113
+ *
2114
+ * Connector lines between adjacent steps are action-coloured when the segment
2115
+ * is completed (both endpoints are ≤ currentStep) and divider-coloured otherwise.
2116
+ *
2117
+ * @example
2118
+ * <Stepper steps={[{ label: 'Account' }, { label: 'Details' }, { label: 'Review' }]} currentStep={1} />
2119
+ */
2120
+ const Stepper = ({ steps, currentStep, className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
2121
+ "aria-label": "Progress",
2122
+ className: require_toggle_row.cn("flex w-full items-start", className),
2123
+ ...props,
2124
+ children: steps.map((step, index) => {
2125
+ const isCompleted = index < currentStep;
2126
+ const isCurrent = index === currentStep;
2127
+ const connectorCompleted = index > 0 && index <= currentStep;
2128
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
2129
+ className: require_toggle_row.cn("flex flex-1 items-start", index === steps.length - 1 && "flex-none"),
2130
+ "aria-current": isCurrent ? "step" : void 0,
2131
+ children: [
2132
+ index > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2133
+ "aria-hidden": "true",
2134
+ className: require_toggle_row.cn("mt-3.5 h-px flex-1 transition-colors duration-300 ease-out motion-reduce:transition-none", connectorCompleted ? "bg-[var(--action)]" : "bg-[var(--border-divider)]")
2135
+ }),
2136
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2137
+ className: "flex flex-col items-center gap-1.5",
2138
+ children: [
2139
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2140
+ "aria-hidden": "true",
2141
+ className: require_toggle_row.cn("flex size-7 shrink-0 items-center justify-center rounded-full text-xs font-semibold transition-[background-color,border-color,color] duration-300 ease-out motion-reduce:transition-none select-none", isCompleted && "bg-[var(--action)] text-white", isCurrent && "border-2 border-[var(--action)] text-[var(--action)]", !isCompleted && !isCurrent && "border border-[var(--border-default)] text-muted-foreground"),
2142
+ children: isCompleted ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon, {
2143
+ size: 13,
2144
+ strokeWidth: 3
2145
+ }) : String(index + 1)
2146
+ }),
2147
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2148
+ className: require_toggle_row.cn("max-w-[6rem] text-center text-xs leading-tight transition-colors duration-300 ease-out motion-reduce:transition-none", isCurrent ? "font-medium text-foreground" : "text-muted-foreground"),
2149
+ children: step.label
2150
+ }),
2151
+ step.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2152
+ className: "max-w-[6rem] text-center text-[10px] leading-tight text-muted-foreground",
2153
+ children: step.description
2154
+ })
2155
+ ]
2156
+ }),
2157
+ index < steps.length - 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2158
+ "aria-hidden": "true",
2159
+ className: require_toggle_row.cn("mt-3.5 h-px flex-1 transition-colors duration-300 ease-out motion-reduce:transition-none", index + 1 <= currentStep ? "bg-[var(--action)]" : "bg-[var(--border-divider)]")
2160
+ })
2161
+ ]
2162
+ }, step.label);
1344
2163
  })
1345
2164
  });
1346
2165
 
@@ -1360,7 +2179,7 @@ const Table = ({ className, ...props }) => {
1360
2179
  const TableHeader = ({ className, ...props }) => {
1361
2180
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", {
1362
2181
  "data-slot": "table-header",
1363
- className: require_toggle_row.cn("[&_tr]:border-b [&_tr]:border-[var(--border-divider)] [&_tr]:hover:bg-transparent bg-[var(--bg-accented)]/50 sticky top-0 z-10", className),
2182
+ className: require_toggle_row.cn("[&_tr]:border-b [&_tr]:border-[var(--border-divider)] [&_tr]:hover:bg-transparent bg-[var(--bg-accented)]/50 sticky top-0 z-20", className),
1364
2183
  ...props
1365
2184
  });
1366
2185
  };
@@ -1385,10 +2204,11 @@ const TableRow = ({ className, ...props }) => {
1385
2204
  ...props
1386
2205
  });
1387
2206
  };
1388
- const TableHead = ({ className, ...props }) => {
2207
+ const TableHead = ({ className, scope, ...props }) => {
1389
2208
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1390
2209
  "data-slot": "table-head",
1391
- className: require_toggle_row.cn("text-muted-foreground h-10 px-3 text-left align-middle text-xs font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className),
2210
+ scope: scope ?? "col",
2211
+ className: require_toggle_row.cn("text-muted-foreground h-10 px-3 text-left align-middle text-xs font-medium whitespace-nowrap tabular-nums [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className),
1392
2212
  ...props
1393
2213
  });
1394
2214
  };
@@ -1436,24 +2256,155 @@ const TabsList = ({ className, variant = "default", ...props }) => {
1436
2256
  const TabsTrigger = ({ className, ...props }) => {
1437
2257
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tabs.Trigger, {
1438
2258
  "data-slot": "tabs-trigger",
1439
- className: require_toggle_row.cn("focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap touch-manipulation transition-[color,background-color,border-color,box-shadow,opacity] duration-150 group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent", "data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground", "after:bg-foreground after:absolute after:opacity-0 after:transition-[opacity] group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100", className),
2259
+ className: require_toggle_row.cn("focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap touch-manipulation transition-[color,background-color,border-color,box-shadow,opacity] duration-150 motion-reduce:transition-none group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent", "data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground", "after:bg-foreground after:absolute after:opacity-0 after:transition-[opacity] after:motion-reduce:transition-none group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100", className),
1440
2260
  ...props
1441
2261
  });
1442
2262
  };
1443
2263
  const TabsContent = ({ className, ...props }) => {
1444
2264
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tabs.Content, {
1445
2265
  "data-slot": "tabs-content",
1446
- className: require_toggle_row.cn("flex-1 outline-none", className),
2266
+ className: require_toggle_row.cn("flex-1 outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:rounded-md", className),
1447
2267
  ...props
1448
2268
  });
1449
2269
  };
1450
2270
 
2271
+ //#endregion
2272
+ //#region src/components/ui/toggle-group/toggle-group.tsx
2273
+ const ToggleGroupContext = (0, react.createContext)(null);
2274
+ const useToggleGroupContext = () => {
2275
+ const ctx = (0, react.useContext)(ToggleGroupContext);
2276
+ if (!ctx) throw new Error("ToggleGroupItem must be used inside a ToggleGroup");
2277
+ return ctx;
2278
+ };
2279
+ /**
2280
+ * Segmented control container that manages single or multiple selection.
2281
+ * Renders a rounded pill-track styled with the muted background token.
2282
+ * Provides context and implements roving keyboard navigation across items.
2283
+ *
2284
+ * @example
2285
+ * // Single selection
2286
+ * <ToggleGroup type="single" value={view} onValueChange={setView}>
2287
+ * <ToggleGroupItem value="day">Day</ToggleGroupItem>
2288
+ * <ToggleGroupItem value="week">Week</ToggleGroupItem>
2289
+ * </ToggleGroup>
2290
+ *
2291
+ * @example
2292
+ * // Multiple selection
2293
+ * <ToggleGroup type="multiple" value={formats} onValueChange={setFormats}>
2294
+ * <ToggleGroupItem value="bold">B</ToggleGroupItem>
2295
+ * <ToggleGroupItem value="italic">I</ToggleGroupItem>
2296
+ * </ToggleGroup>
2297
+ */
2298
+ const ToggleGroup = ({ type, value, onValueChange, disabled = false, className, children, ...props }) => {
2299
+ const groupId = (0, react.useId)();
2300
+ const containerRef = (0, react.useRef)(null);
2301
+ const handleKeyDown = (0, react.useCallback)((e) => {
2302
+ const container = containerRef.current;
2303
+ if (!container) return;
2304
+ const items = Array.from(container.querySelectorAll("button[data-slot=\"toggle-group-item\"]:not([disabled])"));
2305
+ if (items.length === 0) return;
2306
+ const focused = document.activeElement;
2307
+ const idx = items.indexOf(focused);
2308
+ let next;
2309
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
2310
+ e.preventDefault();
2311
+ next = (idx + 1) % items.length;
2312
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
2313
+ e.preventDefault();
2314
+ next = (idx - 1 + items.length) % items.length;
2315
+ } else if (e.key === "Home") {
2316
+ e.preventDefault();
2317
+ next = 0;
2318
+ } else if (e.key === "End") {
2319
+ e.preventDefault();
2320
+ next = items.length - 1;
2321
+ } else return;
2322
+ items[next]?.focus();
2323
+ }, []);
2324
+ const contextValue = (0, react.useMemo)(() => type === "single" ? {
2325
+ disabled,
2326
+ groupId,
2327
+ onValueChange,
2328
+ type: "single",
2329
+ value
2330
+ } : {
2331
+ disabled,
2332
+ groupId,
2333
+ onValueChange,
2334
+ type: "multiple",
2335
+ value
2336
+ }, [
2337
+ disabled,
2338
+ groupId,
2339
+ onValueChange,
2340
+ type,
2341
+ value
2342
+ ]);
2343
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToggleGroupContext.Provider, {
2344
+ value: contextValue,
2345
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2346
+ ref: containerRef,
2347
+ "data-slot": "toggle-group",
2348
+ role: type === "single" ? "radiogroup" : "toolbar",
2349
+ onKeyDown: handleKeyDown,
2350
+ className: require_toggle_row.cn("inline-flex items-center rounded-lg bg-muted p-[3px] gap-0.5", disabled && "opacity-50 pointer-events-none", className),
2351
+ ...props,
2352
+ children
2353
+ })
2354
+ });
2355
+ };
2356
+ /**
2357
+ * An individual button within a ToggleGroup.
2358
+ * Reads context to determine selection state and fires the appropriate
2359
+ * onValueChange callback on click. Mirrors the elevated/pill styling of
2360
+ * the active tab trigger (bg-background + shadow) when selected.
2361
+ */
2362
+ const ToggleGroupItem = ({ value, disabled, className, children, onClick, ...props }) => {
2363
+ const ctx = useToggleGroupContext();
2364
+ const isDisabled = disabled ?? ctx.disabled;
2365
+ const isActive = ctx.type === "single" ? ctx.value === value : ctx.value.includes(value);
2366
+ const handleClick = (e) => {
2367
+ if (isDisabled) return;
2368
+ if (ctx.type === "single") {
2369
+ if (ctx.value !== value) ctx.onValueChange(value);
2370
+ } else {
2371
+ const next = ctx.value.includes(value) ? ctx.value.filter((v) => v !== value) : [...ctx.value, value];
2372
+ ctx.onValueChange(next);
2373
+ }
2374
+ onClick?.(e);
2375
+ };
2376
+ const tabIndex = isActive ? 0 : -1;
2377
+ const sharedButtonProps = {
2378
+ className: require_toggle_row.cn("relative inline-flex h-8 flex-1 items-center justify-center gap-1.5", "rounded-md px-3 text-sm font-medium whitespace-nowrap", "cursor-pointer", "text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground", "transition-[color,background-color,box-shadow] duration-150 ease-out motion-reduce:transition-none", "data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm", "dark:data-[state=on]:bg-input/30 dark:data-[state=on]:text-foreground dark:data-[state=on]:border dark:data-[state=on]:border-input", "focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50", "disabled:pointer-events-none disabled:opacity-50", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
2379
+ "data-slot": "toggle-group-item",
2380
+ "data-state": isActive ? "on" : "off",
2381
+ disabled: isDisabled,
2382
+ onClick: handleClick,
2383
+ tabIndex,
2384
+ type: "button"
2385
+ };
2386
+ if (ctx.type === "single") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2387
+ ...sharedButtonProps,
2388
+ role: "radio",
2389
+ "aria-checked": isActive,
2390
+ name: ctx.groupId,
2391
+ ...props,
2392
+ children
2393
+ });
2394
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2395
+ ...sharedButtonProps,
2396
+ "aria-pressed": isActive,
2397
+ ...props,
2398
+ children
2399
+ });
2400
+ };
2401
+
1451
2402
  //#endregion
1452
2403
  //#region src/components/ui/textarea/textarea.tsx
1453
2404
  const Textarea = ({ className, ...props }) => {
1454
2405
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
1455
2406
  "data-slot": "textarea",
1456
- className: require_toggle_row.cn("placeholder:text-muted-foreground/60 dark:bg-input/30 flex field-sizing-content min-h-16 w-full touch-manipulation rounded-md border-0 bg-background px-3 py-2 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_rgba(0,114,239,0.15)]", "aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)]", className),
2407
+ className: require_toggle_row.cn("placeholder:text-muted-foreground/60 dark:bg-input/30 flex field-sizing-content min-h-20 w-full touch-manipulation rounded-md border-0 bg-background px-3 py-2 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]", "aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)]", className),
1457
2408
  ...props
1458
2409
  });
1459
2410
  };
@@ -1463,65 +2414,14 @@ const Textarea = ({ className, ...props }) => {
1463
2414
  const TooltipProvider = _radix_ui_react_tooltip.Provider;
1464
2415
  const Tooltip = _radix_ui_react_tooltip.Root;
1465
2416
  const TooltipTrigger = _radix_ui_react_tooltip.Trigger;
1466
- const TooltipContent = (0, react.forwardRef)(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tooltip.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tooltip.Content, {
2417
+ const TooltipContent = (0, react.forwardRef)(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tooltip.Portal, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_tooltip.Content, {
1467
2418
  ref,
1468
2419
  sideOffset,
1469
- className: require_toggle_row.cn("z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className),
2420
+ className: require_toggle_row.cn("z-50 max-w-xs overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-balance text-primary-foreground animate-in fade-in-0 zoom-in-95 duration-150 ease-out data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-100 data-[state=closed]:ease-in data-[side=bottom]:slide-in-from-top-2 data-[side=bottom]:origin-top data-[side=left]:slide-in-from-right-2 data-[side=left]:origin-right data-[side=right]:slide-in-from-left-2 data-[side=right]:origin-left data-[side=top]:slide-in-from-bottom-2 data-[side=top]:origin-bottom motion-reduce:animate-none", className),
1470
2421
  ...props
1471
2422
  }) }));
1472
2423
  TooltipContent.displayName = _radix_ui_react_tooltip.Content.displayName;
1473
2424
 
1474
- //#endregion
1475
- //#region src/components/ui/well/well.tsx
1476
- const wellVariants = (0, class_variance_authority.cva)("rounded-2xl", {
1477
- defaultVariants: {
1478
- gap: "sm",
1479
- spacing: "default",
1480
- variant: "inset"
1481
- },
1482
- variants: {
1483
- gap: {
1484
- default: "space-y-4",
1485
- lg: "space-y-5",
1486
- none: "",
1487
- sm: "space-y-3"
1488
- },
1489
- spacing: {
1490
- default: "p-4",
1491
- lg: "p-5",
1492
- none: "p-0",
1493
- sm: "p-3"
1494
- },
1495
- variant: {
1496
- default: "bg-muted/50",
1497
- inset: "bg-muted/50 border border-border",
1498
- outline: "border border-border"
1499
- }
1500
- }
1501
- });
1502
- const Well = ({ className, gap, spacing, variant, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1503
- "data-slot": "well",
1504
- "data-spacing": spacing ?? "default",
1505
- className: require_toggle_row.cn(wellVariants({
1506
- gap,
1507
- spacing,
1508
- variant
1509
- }), className),
1510
- ...props
1511
- });
1512
- const WellReveal = ({ children, className, open }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1513
- className: "grid transition-[grid-template-rows] duration-[220ms] ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none",
1514
- style: { gridTemplateRows: open ? "1fr" : "0fr" },
1515
- "aria-hidden": !open,
1516
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1517
- className: "overflow-hidden",
1518
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1519
- className: require_toggle_row.cn("px-0.5 pb-0.5 [&>[data-slot=well]:not([data-spacing=none])]:p-[22px]", className),
1520
- children
1521
- })
1522
- })
1523
- });
1524
-
1525
2425
  //#endregion
1526
2426
  //#region src/components/asset-icon/asset-icon.tsx
1527
2427
  const aliases = {
@@ -2381,6 +3281,37 @@ const ToggleCard = ({ accordionKey, title, description, inputProps, allowExpand
2381
3281
  });
2382
3282
  };
2383
3283
 
3284
+ //#endregion
3285
+ //#region src/components/icons/animated-icon/animated-icon.tsx
3286
+ const AnimatedIcon = (0, react.forwardRef)(({ children, className, onMouseEnter, onMouseLeave, size = 28, ...props }, ref) => {
3287
+ const controls = (0, motion_react.useAnimation)();
3288
+ const isControlledRef = (0, react.useRef)(false);
3289
+ (0, react.useImperativeHandle)(ref, () => {
3290
+ isControlledRef.current = true;
3291
+ return {
3292
+ startAnimation: () => controls.start("animate"),
3293
+ stopAnimation: () => controls.start("normal")
3294
+ };
3295
+ });
3296
+ const handleMouseEnter = (0, react.useCallback)((e) => {
3297
+ if (isControlledRef.current) onMouseEnter?.(e);
3298
+ else controls.start("animate").catch(() => void 0);
3299
+ }, [controls, onMouseEnter]);
3300
+ const handleMouseLeave = (0, react.useCallback)((e) => {
3301
+ if (isControlledRef.current) onMouseLeave?.(e);
3302
+ else controls.start("normal").catch(() => void 0);
3303
+ }, [controls, onMouseLeave]);
3304
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3305
+ "aria-hidden": "true",
3306
+ className: require_toggle_row.cn("inline-flex items-center justify-center", className),
3307
+ onMouseEnter: handleMouseEnter,
3308
+ onMouseLeave: handleMouseLeave,
3309
+ ...props,
3310
+ children: children(controls, size)
3311
+ });
3312
+ });
3313
+ AnimatedIcon.displayName = "AnimatedIcon";
3314
+
2384
3315
  //#endregion
2385
3316
  //#region src/components/icons/arrow-up-right/arrow-up-right.tsx
2386
3317
  const ArrowUpRightIcon = (0, react.forwardRef)((props, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedIcon, {
@@ -3660,6 +4591,55 @@ const RefreshCWIcon = (0, react.forwardRef)((props, ref) => /* @__PURE__ */ (0,
3660
4591
  }));
3661
4592
  RefreshCWIcon.displayName = "RefreshCWIcon";
3662
4593
 
4594
+ //#endregion
4595
+ //#region src/components/icons/search/search.tsx
4596
+ const SearchIcon = (0, react.forwardRef)((props, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedIcon, {
4597
+ ref,
4598
+ ...props,
4599
+ children: (controls, size) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(motion_react.motion.svg, {
4600
+ animate: controls,
4601
+ fill: "none",
4602
+ height: size,
4603
+ stroke: "currentColor",
4604
+ strokeLinecap: "round",
4605
+ strokeLinejoin: "round",
4606
+ strokeWidth: "2",
4607
+ transition: {
4608
+ bounce: .3,
4609
+ duration: 1
4610
+ },
4611
+ variants: {
4612
+ animate: {
4613
+ x: [
4614
+ 0,
4615
+ 0,
4616
+ -3,
4617
+ 0
4618
+ ],
4619
+ y: [
4620
+ 0,
4621
+ -4,
4622
+ 0,
4623
+ 0
4624
+ ]
4625
+ },
4626
+ normal: {
4627
+ x: 0,
4628
+ y: 0
4629
+ }
4630
+ },
4631
+ viewBox: "0 0 24 24",
4632
+ width: size,
4633
+ xmlns: "http://www.w3.org/2000/svg",
4634
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
4635
+ cx: "11",
4636
+ cy: "11",
4637
+ r: "8"
4638
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m21 21-4.3-4.3" })]
4639
+ })
4640
+ }));
4641
+ SearchIcon.displayName = "SearchIcon";
4642
+
3663
4643
  //#endregion
3664
4644
  //#region src/components/icons/settings/settings.tsx
3665
4645
  const SettingsIcon = (0, react.forwardRef)((props, ref) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AnimatedIcon, {
@@ -3892,6 +4872,7 @@ exports.Accordion = Accordion;
3892
4872
  exports.AccordionContent = AccordionContent;
3893
4873
  exports.AccordionItem = AccordionItem;
3894
4874
  exports.AccordionTrigger = AccordionTrigger;
4875
+ exports.Alert = Alert;
3895
4876
  exports.AlertDialog = AlertDialog;
3896
4877
  exports.AlertDialogAction = AlertDialogAction;
3897
4878
  exports.AlertDialogCancel = AlertDialogCancel;
@@ -3908,9 +4889,19 @@ exports.ArrowUpRightIcon = ArrowUpRightIcon;
3908
4889
  exports.AskAIAction = AskAIAction;
3909
4890
  exports.AssetIcon = AssetIcon;
3910
4891
  exports.Avatar = Avatar;
4892
+ exports.AvatarBadge = AvatarBadge;
3911
4893
  exports.AvatarFallback = AvatarFallback;
4894
+ exports.AvatarGroup = AvatarGroup;
4895
+ exports.AvatarGroupCount = AvatarGroupCount;
3912
4896
  exports.AvatarImage = AvatarImage;
3913
4897
  exports.Badge = Badge;
4898
+ exports.Breadcrumb = Breadcrumb;
4899
+ exports.BreadcrumbEllipsis = BreadcrumbEllipsis;
4900
+ exports.BreadcrumbItem = BreadcrumbItem;
4901
+ exports.BreadcrumbLink = BreadcrumbLink;
4902
+ exports.BreadcrumbList = BreadcrumbList;
4903
+ exports.BreadcrumbPage = BreadcrumbPage;
4904
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
3914
4905
  exports.Button = require_toggle_row.Button;
3915
4906
  exports.Card = Card;
3916
4907
  exports.CardContent = CardContent;
@@ -3928,6 +4919,7 @@ exports.CodeBlock = CodeBlock;
3928
4919
  exports.Collapsible = Collapsible;
3929
4920
  exports.CollapsibleContent = CollapsibleContent;
3930
4921
  exports.CollapsibleTrigger = CollapsibleTrigger;
4922
+ exports.Combobox = Combobox;
3931
4923
  exports.Command = Command;
3932
4924
  exports.CommandDialog = CommandDialog;
3933
4925
  exports.CommandEmpty = CommandEmpty;
@@ -3941,6 +4933,7 @@ exports.CopyButton = CopyButton;
3941
4933
  exports.CopyCheckIcon = CopyCheckIcon;
3942
4934
  exports.CopyIcon = CopyIcon;
3943
4935
  exports.CursorLogo = CursorLogo;
4936
+ exports.CursorPagination = CursorPagination;
3944
4937
  exports.DangerZone = DangerZone;
3945
4938
  exports.Dialog = Dialog;
3946
4939
  exports.DialogBody = DialogBody;
@@ -3971,7 +4964,9 @@ exports.DropdownMenuSubContent = DropdownMenuSubContent;
3971
4964
  exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
3972
4965
  exports.DropdownMenuTrigger = DropdownMenuTrigger;
3973
4966
  exports.EmptyState = EmptyState;
4967
+ exports.Field = Field;
3974
4968
  exports.FingerprintIcon = FingerprintIcon;
4969
+ exports.FlushCardStack = FlushCardStack;
3975
4970
  exports.HomeIcon = HomeIcon;
3976
4971
  exports.Icon = Icon;
3977
4972
  exports.IconConfigProvider = IconConfigProvider;
@@ -3986,6 +4981,13 @@ exports.MetricCard = MetricCard;
3986
4981
  exports.MoonIcon = MoonIcon;
3987
4982
  exports.OpenAILogo = OpenAILogo;
3988
4983
  exports.PageSkeleton = PageSkeleton;
4984
+ exports.Pagination = Pagination;
4985
+ exports.PaginationContent = PaginationContent;
4986
+ exports.PaginationEllipsis = PaginationEllipsis;
4987
+ exports.PaginationItem = PaginationItem;
4988
+ exports.PaginationLink = PaginationLink;
4989
+ exports.PaginationNext = PaginationNext;
4990
+ exports.PaginationPrevious = PaginationPrevious;
3989
4991
  exports.PanelLeftCloseIcon = PanelLeftCloseIcon;
3990
4992
  exports.PanelLeftOpenIcon = PanelLeftOpenIcon;
3991
4993
  exports.PlusIcon = PlusIcon;
@@ -3995,6 +4997,8 @@ exports.PopoverContent = PopoverContent;
3995
4997
  exports.PopoverTrigger = PopoverTrigger;
3996
4998
  exports.ProductPageLayout = ProductPageLayout;
3997
4999
  exports.Progress = Progress;
5000
+ exports.Radio = Radio;
5001
+ exports.RadioField = RadioField;
3998
5002
  exports.RadioGroup = RadioGroup;
3999
5003
  exports.RadioGroupItem = RadioGroupItem;
4000
5004
  exports.RefreshCWIcon = RefreshCWIcon;
@@ -4026,9 +5030,11 @@ exports.SheetTitle = SheetTitle;
4026
5030
  exports.SheetTrigger = SheetTrigger;
4027
5031
  exports.ShieldCheckIcon = ShieldCheckIcon;
4028
5032
  exports.Skeleton = Skeleton;
4029
- exports.Spinner = Spinner;
5033
+ exports.Slider = Slider;
5034
+ exports.Spinner = require_toggle_row.Spinner;
4030
5035
  exports.StatCardSkeleton = StatCardSkeleton;
4031
5036
  exports.StatusBadge = StatusBadge;
5037
+ exports.Stepper = Stepper;
4032
5038
  exports.SunIcon = SunIcon;
4033
5039
  exports.Switch = require_toggle_row.Switch;
4034
5040
  exports.Table = Table;
@@ -4048,6 +5054,8 @@ exports.TerminalIcon = TerminalIcon;
4048
5054
  exports.Textarea = Textarea;
4049
5055
  exports.Toaster = Toaster;
4050
5056
  exports.ToggleCard = ToggleCard;
5057
+ exports.ToggleGroup = ToggleGroup;
5058
+ exports.ToggleGroupItem = ToggleGroupItem;
4051
5059
  exports.ToggleRow = require_toggle_row.ToggleRow;
4052
5060
  exports.Tooltip = Tooltip;
4053
5061
  exports.TooltipContent = TooltipContent;
@@ -4064,6 +5072,12 @@ exports.__toESM = __toESM;
4064
5072
  exports.badgeVariants = badgeVariants;
4065
5073
  exports.buttonVariants = require_toggle_row.buttonVariants;
4066
5074
  exports.cn = require_toggle_row.cn;
5075
+ Object.defineProperty(exports, 'toast', {
5076
+ enumerable: true,
5077
+ get: function () {
5078
+ return sonner.toast;
5079
+ }
5080
+ });
4067
5081
  exports.useIconConfig = useIconConfig;
4068
5082
  exports.useUnsavedChanges = useUnsavedChanges;
4069
5083
  exports.wellVariants = wellVariants;