@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.
- package/dist/components/ui/accordion/accordion.stories.d.ts +19 -0
- package/dist/components/ui/accordion/accordion.stories.d.ts.map +1 -0
- package/dist/components/ui/alert/alert.d.ts +41 -0
- package/dist/components/ui/alert/alert.d.ts.map +1 -0
- package/dist/components/ui/alert/alert.stories.d.ts +26 -0
- package/dist/components/ui/alert/alert.stories.d.ts.map +1 -0
- package/dist/components/ui/alert/index.d.ts +3 -0
- package/dist/components/ui/alert/index.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog/alert-dialog.d.ts +4 -1
- package/dist/components/ui/alert-dialog/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.d.ts +11 -1
- package/dist/components/ui/badge/badge.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.stories.d.ts +3 -3
- package/dist/components/ui/badge/badge.stories.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts +73 -0
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts +19 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb/index.d.ts +3 -0
- package/dist/components/ui/breadcrumb/index.d.ts.map +1 -0
- package/dist/components/ui/button/button.d.ts +7 -3
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/button/button.stories.d.ts +6 -3
- package/dist/components/ui/button/button.stories.d.ts.map +1 -1
- package/dist/components/ui/card/card.d.ts +14 -3
- package/dist/components/ui/card/card.d.ts.map +1 -1
- package/dist/components/ui/card/card.stories.d.ts +8 -2
- package/dist/components/ui/card/card.stories.d.ts.map +1 -1
- package/dist/components/ui/check-icon/check-icon.stories.d.ts +26 -0
- package/dist/components/ui/check-icon/check-icon.stories.d.ts.map +1 -0
- package/dist/components/ui/checkbox/checkbox.stories.d.ts.map +1 -1
- package/dist/components/ui/collapsible/collapsible.d.ts +1 -1
- package/dist/components/ui/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/ui/collapsible/collapsible.stories.d.ts +1 -0
- package/dist/components/ui/collapsible/collapsible.stories.d.ts.map +1 -1
- package/dist/components/ui/combobox/combobox.d.ts +49 -0
- package/dist/components/ui/combobox/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox/combobox.stories.d.ts +24 -0
- package/dist/components/ui/combobox/combobox.stories.d.ts.map +1 -0
- package/dist/components/ui/combobox/index.d.ts +3 -0
- package/dist/components/ui/combobox/index.d.ts.map +1 -0
- package/dist/components/ui/command/command.d.ts.map +1 -1
- package/dist/components/ui/command/command.stories.d.ts +31 -0
- package/dist/components/ui/command/command.stories.d.ts.map +1 -0
- package/dist/components/ui/dialog/dialog.d.ts +5 -1
- package/dist/components/ui/dialog/dialog.d.ts.map +1 -1
- package/dist/components/ui/dialog/dialog.stories.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/field/field.d.ts +60 -0
- package/dist/components/ui/field/field.d.ts.map +1 -0
- package/dist/components/ui/field/field.stories.d.ts +40 -0
- package/dist/components/ui/field/field.stories.d.ts.map +1 -0
- package/dist/components/ui/field/index.d.ts +3 -0
- package/dist/components/ui/field/index.d.ts.map +1 -0
- package/dist/components/ui/flush-card-detach/flush-card-detach.stories.d.ts.map +1 -1
- package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts +57 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts.map +1 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts +24 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts.map +1 -0
- package/dist/components/ui/icon/icon.stories.d.ts +510 -0
- package/dist/components/ui/icon/icon.stories.d.ts.map +1 -0
- package/dist/components/ui/input/input.d.ts.map +1 -1
- package/dist/components/ui/kbd/kbd.d.ts +1 -1
- package/dist/components/ui/kbd/kbd.stories.d.ts +15 -0
- package/dist/components/ui/kbd/kbd.stories.d.ts.map +1 -0
- package/dist/components/ui/pagination/index.d.ts +3 -0
- package/dist/components/ui/pagination/index.d.ts.map +1 -0
- package/dist/components/ui/pagination/pagination.d.ts +82 -0
- package/dist/components/ui/pagination/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination/pagination.stories.d.ts +16 -0
- package/dist/components/ui/pagination/pagination.stories.d.ts.map +1 -0
- package/dist/components/ui/popover/popover.d.ts +1 -1
- package/dist/components/ui/popover/popover.d.ts.map +1 -1
- package/dist/components/ui/progress/progress.d.ts +7 -4
- package/dist/components/ui/progress/progress.d.ts.map +1 -1
- package/dist/components/ui/progress/progress.stories.d.ts +4 -1
- package/dist/components/ui/progress/progress.stories.d.ts.map +1 -1
- package/dist/components/ui/radio-group/index.d.ts +1 -1
- package/dist/components/ui/radio-group/index.d.ts.map +1 -1
- package/dist/components/ui/radio-group/radio-group.d.ts +45 -2
- package/dist/components/ui/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/ui/radio-group/radio-group.stories.d.ts +19 -0
- package/dist/components/ui/radio-group/radio-group.stories.d.ts.map +1 -1
- package/dist/components/ui/scroll-area/scroll-area.stories.d.ts +15 -0
- package/dist/components/ui/scroll-area/scroll-area.stories.d.ts.map +1 -0
- package/dist/components/ui/search-input/search-input.stories.d.ts +27 -0
- package/dist/components/ui/search-input/search-input.stories.d.ts.map +1 -0
- package/dist/components/ui/select/select.d.ts.map +1 -1
- package/dist/components/ui/skeleton/skeleton.d.ts +1 -1
- package/dist/components/ui/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/ui/skeleton/skeleton.stories.d.ts +1 -1
- package/dist/components/ui/slider/index.d.ts +3 -0
- package/dist/components/ui/slider/index.d.ts.map +1 -0
- package/dist/components/ui/slider/slider.d.ts +28 -0
- package/dist/components/ui/slider/slider.d.ts.map +1 -0
- package/dist/components/ui/slider/slider.stories.d.ts +40 -0
- package/dist/components/ui/slider/slider.stories.d.ts.map +1 -0
- package/dist/components/ui/sonner/sonner.stories.d.ts +10 -0
- package/dist/components/ui/sonner/sonner.stories.d.ts.map +1 -0
- package/dist/components/ui/spinner/spinner.d.ts +13 -2
- package/dist/components/ui/spinner/spinner.d.ts.map +1 -1
- package/dist/components/ui/spinner/spinner.stories.d.ts +1 -3
- package/dist/components/ui/spinner/spinner.stories.d.ts.map +1 -1
- package/dist/components/ui/stepper/index.d.ts +3 -0
- package/dist/components/ui/stepper/index.d.ts.map +1 -0
- package/dist/components/ui/stepper/stepper.d.ts +36 -0
- package/dist/components/ui/stepper/stepper.d.ts.map +1 -0
- package/dist/components/ui/stepper/stepper.stories.d.ts +21 -0
- package/dist/components/ui/stepper/stepper.stories.d.ts.map +1 -0
- package/dist/components/ui/switch/switch.d.ts.map +1 -1
- package/dist/components/ui/table/table.d.ts +1 -1
- package/dist/components/ui/table/table.d.ts.map +1 -1
- package/dist/components/ui/toggle-group/index.d.ts +3 -0
- package/dist/components/ui/toggle-group/index.d.ts.map +1 -0
- package/dist/components/ui/toggle-group/toggle-group.d.ts +62 -0
- package/dist/components/ui/toggle-group/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.d.ts +20 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.d.ts.map +1 -0
- package/dist/components/ui/tray/renderTrayLayout.d.ts +37 -0
- package/dist/components/ui/tray/renderTrayLayout.d.ts.map +1 -0
- package/dist/components/ui/tray/resolveTrayLayout.d.ts +35 -0
- package/dist/components/ui/tray/resolveTrayLayout.d.ts.map +1 -0
- package/dist/components/ui/well/well-reveal.stories.d.ts +27 -0
- package/dist/components/ui/well/well-reveal.stories.d.ts.map +1 -0
- package/dist/components/ui/well/well.d.ts +2 -2
- package/dist/components/ui/well/well.d.ts.map +1 -1
- package/dist/components/ui/well/well.stories.d.ts +2 -2
- package/dist/index.cjs +1320 -306
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +1292 -312
- package/dist/index.esm.js.map +1 -1
- package/dist/migration.cjs +1 -1
- package/dist/migration.esm.js +1 -1
- package/dist/{toggle-row-B7XCm0Z-.cjs → toggle-row-BafR1dY7.cjs} +93 -12
- package/dist/toggle-row-BafR1dY7.cjs.map +1 -0
- package/dist/{toggle-row-C-B8HtY0.esm.js → toggle-row-h0h1m_hc.esm.js} +88 -13
- package/dist/toggle-row-h0h1m_hc.esm.js.map +1 -0
- package/package.json +1 -1
- package/src/styles/globals.css +68 -23
- package/dist/toggle-row-B7XCm0Z-.cjs.map +0 -1
- 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-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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",
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
|
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-
|
|
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 = "
|
|
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: "
|
|
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
|
-
|
|
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/
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
|
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)("
|
|
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-
|
|
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)("
|
|
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-
|
|
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-
|
|
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-
|
|
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-[
|
|
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 }) =>
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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("
|
|
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-
|
|
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.
|
|
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:
|
|
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.
|
|
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)(
|
|
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
|
|
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-
|
|
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-
|
|
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 }) =>
|
|
958
|
-
|
|
959
|
-
|
|
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)(
|
|
962
|
-
|
|
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
|
-
|
|
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
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
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]
|
|
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
|
|
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:
|
|
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),
|
|
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" && "
|
|
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("
|
|
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:
|
|
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-
|
|
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-
|
|
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
|
|
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)("
|
|
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/
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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 =
|
|
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.
|
|
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;
|