@vritti/quantum-ui 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/Avatar.js +5 -5
  2. package/dist/Checkbox2.js +2 -2
  3. package/dist/ConfirmHost.js +109 -0
  4. package/dist/ConfirmHost.js.map +1 -0
  5. package/dist/Dialog.js +82 -64
  6. package/dist/Dialog.js.map +1 -1
  7. package/dist/DropdownMenu.js +2 -2
  8. package/dist/DropdownMenu.js.map +1 -1
  9. package/dist/Form.js +50 -26
  10. package/dist/Form.js.map +1 -1
  11. package/dist/Progress.js +2 -2
  12. package/dist/RadioGroup.js +2 -2
  13. package/dist/Sidebar.js +1 -1
  14. package/dist/Switch.js +2 -2
  15. package/dist/TabsSkeleton.js +1 -1
  16. package/dist/Toggle.js +1 -1
  17. package/dist/ViewTabs.js +1 -2
  18. package/dist/ViewTabs.js.map +1 -1
  19. package/dist/assets/quantum-ui.css +43 -5
  20. package/dist/cells.js +96 -64
  21. package/dist/cells.js.map +1 -1
  22. package/dist/components/ConfirmHost.js +2 -0
  23. package/dist/components/ConfirmHost.js.map +1 -0
  24. package/dist/components/Dialog.js +1 -1
  25. package/dist/components/RichTextEditor.js +1 -1
  26. package/dist/context/index.js +0 -1
  27. package/dist/context/index.js.map +1 -1
  28. package/dist/dropdown-menu.js +4 -3
  29. package/dist/dropdown-menu.js.map +1 -1
  30. package/dist/image-component.js +1 -1
  31. package/dist/index.js +3 -3
  32. package/dist/index12.js +3 -2
  33. package/dist/index12.js.map +1 -1
  34. package/dist/index13.js +3 -2
  35. package/dist/index13.js.map +1 -1
  36. package/dist/index14.js +7 -6
  37. package/dist/index14.js.map +1 -1
  38. package/dist/index15.js +1 -1
  39. package/dist/index16.js +1 -1
  40. package/dist/index18.js +1 -1
  41. package/dist/index20.js +1 -1
  42. package/dist/index21.js +1 -1
  43. package/dist/index23.js +1 -1
  44. package/dist/index25.js +3 -2534
  45. package/dist/index25.js.map +1 -1
  46. package/dist/index26.js +2526 -22
  47. package/dist/index26.js.map +1 -1
  48. package/dist/index27.js +32 -4
  49. package/dist/index27.js.map +1 -1
  50. package/dist/index28.js +4 -37
  51. package/dist/index28.js.map +1 -1
  52. package/dist/index29.js +1101 -287
  53. package/dist/index29.js.map +1 -1
  54. package/dist/index30.js +36 -8
  55. package/dist/index30.js.map +1 -1
  56. package/dist/index31.js +305 -25
  57. package/dist/index31.js.map +1 -1
  58. package/dist/index32.js +8 -60
  59. package/dist/index32.js.map +1 -1
  60. package/dist/index33.js +30 -11
  61. package/dist/index33.js.map +1 -1
  62. package/dist/index34.js +59 -35
  63. package/dist/index34.js.map +1 -1
  64. package/dist/index35.js +10 -36818
  65. package/dist/index35.js.map +1 -1
  66. package/dist/index36.js +36 -79
  67. package/dist/index36.js.map +1 -1
  68. package/dist/index37.js +36808 -184
  69. package/dist/index37.js.map +1 -1
  70. package/dist/index38.js +84 -0
  71. package/dist/index38.js.map +1 -0
  72. package/dist/index39.js +199 -0
  73. package/dist/index39.js.map +1 -0
  74. package/dist/index4.js +1 -1
  75. package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts +39 -0
  76. package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts.map +1 -0
  77. package/dist/lib/components/ConfirmHost/index.d.ts +2 -0
  78. package/dist/lib/components/ConfirmHost/index.d.ts.map +1 -0
  79. package/dist/lib/components/DataTable/components/DataTableImportDialog.d.ts.map +1 -1
  80. package/dist/lib/components/DataTable/components/DataTableViewTabs.d.ts.map +1 -1
  81. package/dist/lib/components/DataTable/components/DataTableViewsMenu.d.ts.map +1 -1
  82. package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
  83. package/dist/lib/components/Dialog/Dialog.d.ts +15 -17
  84. package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
  85. package/dist/lib/components/Dialog/index.d.ts +2 -2
  86. package/dist/lib/components/Dialog/index.d.ts.map +1 -1
  87. package/dist/lib/components/DropdownMenu/types.d.ts +2 -2
  88. package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
  89. package/dist/lib/components/Form/Form.d.ts.map +1 -1
  90. package/dist/lib/components/index.d.ts +1 -0
  91. package/dist/lib/components/index.d.ts.map +1 -1
  92. package/dist/lib/context/index.d.ts +0 -1
  93. package/dist/lib/context/index.d.ts.map +1 -1
  94. package/dist/lib/hooks/useConfirm.d.ts +3 -3
  95. package/dist/lib/hooks/useConfirm.d.ts.map +1 -1
  96. package/dist/trash-2.js +17 -3
  97. package/dist/trash-2.js.map +1 -1
  98. package/dist/useConfirm.js +3 -7
  99. package/dist/useConfirm.js.map +1 -1
  100. package/dist/utils/motion.js +2 -2
  101. package/dist/value.js +1 -1
  102. package/package.json +5 -1
  103. package/dist/Combination.js +0 -1129
  104. package/dist/Combination.js.map +0 -1
  105. package/dist/ConfirmContext.js +0 -77
  106. package/dist/ConfirmContext.js.map +0 -1
  107. package/dist/lib/context/ConfirmContext.d.ts +0 -26
  108. package/dist/lib/context/ConfirmContext.d.ts.map +0 -1
  109. package/dist/plus.js +0 -18
  110. package/dist/plus.js.map +0 -1
package/dist/Avatar.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { c as createContextScope } from './index32.js';
4
- import { u as useCallbackRef } from './index30.js';
5
- import { u as useLayoutEffect2 } from './index27.js';
6
- import { P as Primitive } from './index28.js';
7
- import { r as requireShim } from './index37.js';
3
+ import { c as createContextScope } from './index34.js';
4
+ import { u as useCallbackRef } from './index32.js';
5
+ import { u as useLayoutEffect2 } from './index28.js';
6
+ import { P as Primitive } from './index30.js';
7
+ import { r as requireShim } from './index39.js';
8
8
  import { c as cn } from './utils.js';
9
9
 
10
10
  var shimExports = requireShim();
package/dist/Checkbox2.js CHANGED
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { u as useComposedRefs } from './index11.js';
4
4
  import { c as createContextScope } from './index19.js';
5
5
  import { P as Primitive, u as useControllableState, c as composeEventHandlers } from './index18.js';
6
- import { u as usePrevious } from './index33.js';
7
- import { u as useSize } from './index34.js';
6
+ import { u as usePrevious } from './index35.js';
7
+ import { u as useSize } from './index36.js';
8
8
  import { P as Presence } from './index21.js';
9
9
  import { c as cn } from './utils.js';
10
10
  import { C as Check } from './check.js';
@@ -0,0 +1,109 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useSyncExternalStore, useMemo } from 'react';
3
+ import { A as Alert } from './Alert.js';
4
+ import { B as Button } from './Button.js';
5
+ import { D as Dialog } from './Dialog.js';
6
+ import { T as TriangleAlert } from './triangle-alert.js';
7
+ import { c as createLucideIcon } from './createLucideIcon.js';
8
+
9
+ /**
10
+ * @license lucide-react v0.562.0 - ISC
11
+ *
12
+ * This source code is licensed under the ISC license.
13
+ * See the LICENSE file in the root directory of this source tree.
14
+ */
15
+
16
+
17
+ const __iconNode = [
18
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
19
+ ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
20
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
21
+ ];
22
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode);
23
+
24
+ const DEFAULT_CONFIRM_OPTIONS = {
25
+ title: "Are you sure?",
26
+ description: "",
27
+ confirmLabel: "Confirm",
28
+ cancelLabel: "Cancel",
29
+ variant: "default"
30
+ };
31
+ function createConfirmStore() {
32
+ let state = { open: false, options: DEFAULT_CONFIRM_OPTIONS };
33
+ let resolver = null;
34
+ const listeners = /* @__PURE__ */ new Set();
35
+ const emit = () => {
36
+ for (const listener of listeners) listener();
37
+ };
38
+ const settle = (value) => {
39
+ resolver?.(value);
40
+ resolver = null;
41
+ state = { ...state, open: false };
42
+ emit();
43
+ };
44
+ return {
45
+ getSnapshot: () => state,
46
+ subscribe: (listener) => {
47
+ listeners.add(listener);
48
+ return () => {
49
+ listeners.delete(listener);
50
+ };
51
+ },
52
+ confirm: (options) => {
53
+ if (listeners.size === 0) {
54
+ return Promise.resolve(window.confirm(options?.description || options?.title || "Are you sure?"));
55
+ }
56
+ resolver?.(false);
57
+ return new Promise((resolve) => {
58
+ resolver = resolve;
59
+ state = { open: true, options: { ...DEFAULT_CONFIRM_OPTIONS, ...options } };
60
+ emit();
61
+ });
62
+ },
63
+ cancel: () => settle(false),
64
+ accept: () => settle(true)
65
+ };
66
+ }
67
+ function getConfirmStore() {
68
+ const g = globalThis;
69
+ if (!g.__quantumUiConfirmStore) g.__quantumUiConfirmStore = createConfirmStore();
70
+ return g.__quantumUiConfirmStore;
71
+ }
72
+ const ConfirmHost = () => {
73
+ const store = getConfirmStore();
74
+ const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
75
+ const { options } = state;
76
+ const handle = useMemo(
77
+ () => ({
78
+ isOpen: state.open,
79
+ open: () => {
80
+ },
81
+ close: store.cancel,
82
+ onOpenChange: (val) => {
83
+ if (!val) store.cancel();
84
+ }
85
+ }),
86
+ [state.open, store]
87
+ );
88
+ return /* @__PURE__ */ jsxs(
89
+ Dialog,
90
+ {
91
+ handle,
92
+ icon: options.variant === "destructive" ? TriangleAlert : CircleQuestionMark,
93
+ iconVariant: options.variant,
94
+ title: options.title,
95
+ description: options.description,
96
+ children: [
97
+ options.alert ? /* @__PURE__ */ jsx(Alert, { variant: options.alert.type, description: options.alert.text }) : null,
98
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
99
+ /* @__PURE__ */ jsx(Button, { variant: "outline", type: "button", onClick: store.cancel, children: options.cancelLabel }),
100
+ /* @__PURE__ */ jsx(Button, { variant: options.variant, type: "button", onClick: store.accept, children: options.confirmLabel })
101
+ ] })
102
+ ]
103
+ }
104
+ );
105
+ };
106
+ ConfirmHost.displayName = "ConfirmHost";
107
+
108
+ export { ConfirmHost as C, getConfirmStore as g };
109
+ //# sourceMappingURL=ConfirmHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmHost.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../lib/components/ConfirmHost/ConfirmHost.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","import { CircleHelp, TriangleAlert } from 'lucide-react';\nimport { useMemo, useSyncExternalStore } from 'react';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Alert } from '../Alert';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\n\nexport interface ConfirmAlert {\n type: 'default' | 'destructive' | 'warning' | 'success' | 'info';\n text: string;\n}\n\nexport interface ConfirmOptions {\n title?: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: 'default' | 'destructive';\n alert?: ConfirmAlert;\n}\n\ninterface ResolvedConfirmOptions {\n title: string;\n description: string;\n confirmLabel: string;\n cancelLabel: string;\n variant: 'default' | 'destructive';\n alert?: ConfirmAlert;\n}\n\nconst DEFAULT_CONFIRM_OPTIONS: ResolvedConfirmOptions = {\n title: 'Are you sure?',\n description: '',\n confirmLabel: 'Confirm',\n cancelLabel: 'Cancel',\n variant: 'default',\n};\n\nexport type ConfirmFn = (options?: ConfirmOptions) => Promise<boolean>;\n\ninterface ConfirmState {\n open: boolean;\n options: ResolvedConfirmOptions;\n}\n\ninterface ConfirmStore {\n getSnapshot: () => ConfirmState;\n subscribe: (listener: () => void) => () => void;\n confirm: ConfirmFn;\n cancel: () => void;\n accept: () => void;\n}\n\nfunction createConfirmStore(): ConfirmStore {\n let state: ConfirmState = { open: false, options: DEFAULT_CONFIRM_OPTIONS };\n let resolver: ((value: boolean) => void) | null = null;\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n const settle = (value: boolean) => {\n resolver?.(value);\n resolver = null;\n state = { ...state, open: false };\n emit();\n };\n return {\n getSnapshot: () => state,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n confirm: (options) => {\n if (listeners.size === 0) {\n return Promise.resolve(window.confirm(options?.description || options?.title || 'Are you sure?'));\n }\n resolver?.(false);\n return new Promise<boolean>((resolve) => {\n resolver = resolve;\n state = { open: true, options: { ...DEFAULT_CONFIRM_OPTIONS, ...options } };\n emit();\n });\n },\n cancel: () => settle(false),\n accept: () => settle(true),\n };\n}\n\nexport function getConfirmStore(): ConfirmStore {\n const g = globalThis as { __quantumUiConfirmStore?: ConfirmStore };\n if (!g.__quantumUiConfirmStore) g.__quantumUiConfirmStore = createConfirmStore();\n return g.__quantumUiConfirmStore;\n}\n\nexport const ConfirmHost = () => {\n const store = getConfirmStore();\n const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const { options } = state;\n\n const handle: DialogHandle = useMemo(\n () => ({\n isOpen: state.open,\n open: () => {},\n close: store.cancel,\n onOpenChange: (val: boolean) => {\n if (!val) store.cancel();\n },\n }),\n [state.open, store],\n );\n\n return (\n <Dialog\n handle={handle}\n icon={options.variant === 'destructive' ? TriangleAlert : CircleHelp}\n iconVariant={options.variant}\n title={options.title}\n description={options.description}\n >\n {options.alert ? <Alert variant={options.alert.type} description={options.alert.text} /> : null}\n <div className=\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\">\n <Button variant=\"outline\" type=\"button\" onClick={store.cancel}>\n {options.cancelLabel}\n </Button>\n <Button variant={options.variant} type=\"button\" onClick={store.accept}>\n {options.confirmLabel}\n </Button>\n </div>\n </Dialog>\n );\n};\nConfirmHost.displayName = 'ConfirmHost';\n"],"names":["CircleHelp"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/Dialog.js CHANGED
@@ -1,9 +1,7 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { B as Button } from './Button.js';
3
- import { F as Form } from './Form.js';
4
- import { R as Root, T as Trigger, C as Content, a as Close, b as Title, D as Description, P as Portal, O as Overlay } from './index29.js';
5
- import { forwardRef } from 'react';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { forwardRef, useRef, useEffect } from 'react';
6
3
  import { c as cn } from './utils.js';
4
+ import { R as Root, T as Trigger, C as Content, a as Close, b as Title, D as Description, P as Portal, O as Overlay } from './index31.js';
7
5
  import { X } from './x.js';
8
6
 
9
7
  function Dialog$1({ ...props }) {
@@ -62,17 +60,6 @@ function DialogHeader({ className, ...props }) {
62
60
  );
63
61
  }
64
62
  DialogHeader.displayName = "DialogHeader";
65
- function DialogFooter({ className, ...props }) {
66
- return /* @__PURE__ */ jsx(
67
- "div",
68
- {
69
- "data-slot": "dialog-footer",
70
- className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
71
- ...props
72
- }
73
- );
74
- }
75
- DialogFooter.displayName = "DialogFooter";
76
63
  const DialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
77
64
  Title,
78
65
  {
@@ -94,68 +81,99 @@ const DialogDescription = forwardRef(({ className, ...props }, ref) => /* @__PUR
94
81
  ));
95
82
  DialogDescription.displayName = Description.displayName;
96
83
 
84
+ function DialogActions({ children, className }) {
85
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col-reverse gap-2 border-t px-6 pt-4 pb-6 sm:flex-row sm:justify-end", className), children });
86
+ }
87
+ DialogActions.displayName = "DialogActions";
88
+ const OPEN_DIALOG_SELECTOR = '[data-state="open"][role="dialog"], [data-state="open"][role="alertdialog"]';
89
+ function ensurePointerEventsWatchdog() {
90
+ const g = globalThis;
91
+ if (g.__quantumUiPointerWatchdog || typeof document === "undefined") return;
92
+ g.__quantumUiPointerWatchdog = true;
93
+ const fix = () => {
94
+ if (document.body.style.pointerEvents === "none" && !document.querySelector(OPEN_DIALOG_SELECTOR)) {
95
+ document.body.style.pointerEvents = "";
96
+ }
97
+ };
98
+ new MutationObserver(fix).observe(document.body, { attributes: true, attributeFilter: ["style"] });
99
+ }
100
+ function isTopmostDialog(el) {
101
+ if (!el || typeof document === "undefined") return true;
102
+ const open = document.querySelectorAll(OPEN_DIALOG_SELECTOR);
103
+ return open.length === 0 || open[open.length - 1] === el;
104
+ }
105
+ function ensureEscapeManager() {
106
+ const g = globalThis;
107
+ if (g.__quantumUiEscapeMgr || typeof document === "undefined") return;
108
+ g.__quantumUiEscapeMgr = true;
109
+ document.addEventListener(
110
+ "keydown",
111
+ (e) => {
112
+ if (e.key !== "Escape") return;
113
+ const confirmStore = globalThis.__quantumUiConfirmStore;
114
+ if (!confirmStore?.getSnapshot().open) return;
115
+ e.preventDefault();
116
+ e.stopImmediatePropagation();
117
+ confirmStore.cancel();
118
+ },
119
+ true
120
+ );
121
+ }
97
122
  function Dialog({
98
123
  handle,
99
124
  anchor,
100
125
  content,
101
126
  trigger,
127
+ icon: Icon,
128
+ iconVariant = "default",
102
129
  title,
103
130
  description,
104
131
  badgeSlot,
105
132
  children,
106
- footer,
107
- className,
108
- mode = "default",
109
- form,
110
- mutation,
111
- onFormSubmit,
112
- transformSubmit,
113
- submitLabel,
114
- cancelLabel,
115
- fieldMapping
133
+ className
116
134
  }) {
117
- const renderBody = () => {
118
- if (content) return content(handle.close);
119
- if (mode === "form" && form) {
120
- return /* @__PURE__ */ jsxs(
121
- Form,
122
- {
123
- form,
124
- mutation,
125
- onSubmit: onFormSubmit,
126
- transformSubmit,
127
- fieldMapping,
128
- className: "space-y-4",
129
- children: [
130
- children,
131
- /* @__PURE__ */ jsx(DialogFooter, { children: footer ?? /* @__PURE__ */ jsxs(Fragment, { children: [
132
- /* @__PURE__ */ jsx(Button, { variant: "outline", type: "button", onClick: handle.close, children: cancelLabel ?? "Cancel" }),
133
- /* @__PURE__ */ jsx(Button, { type: "submit", children: submitLabel ?? "Save" })
134
- ] }) })
135
- ]
136
- }
137
- );
138
- }
139
- return /* @__PURE__ */ jsxs(Fragment, { children: [
140
- children,
141
- footer && /* @__PURE__ */ jsx(DialogFooter, { children: footer })
142
- ] });
143
- };
135
+ const contentRef = useRef(null);
136
+ useEffect(() => {
137
+ ensurePointerEventsWatchdog();
138
+ ensureEscapeManager();
139
+ }, []);
144
140
  return /* @__PURE__ */ jsxs(Dialog$1, { open: handle.isOpen, onOpenChange: handle.onOpenChange, children: [
145
141
  anchor ? anchor(handle.open) : trigger && /* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: trigger }),
146
- /* @__PURE__ */ jsxs(DialogContent, { className, children: [
147
- (title || description) && /* @__PURE__ */ jsxs(DialogHeader, { children: [
148
- title && /* @__PURE__ */ jsx(DialogTitle, { children: badgeSlot ? /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
149
- /* @__PURE__ */ jsx("span", { children: title }),
150
- badgeSlot
151
- ] }) : title }),
152
- description && /* @__PURE__ */ jsx(DialogDescription, { children: description })
153
- ] }),
154
- renderBody()
155
- ] })
142
+ /* @__PURE__ */ jsxs(
143
+ DialogContent,
144
+ {
145
+ ref: contentRef,
146
+ className: cn("flex max-h-[95vh] flex-col gap-0 p-0", className),
147
+ onInteractOutside: (e) => {
148
+ if (!isTopmostDialog(contentRef.current)) e.preventDefault();
149
+ },
150
+ children: [
151
+ /* @__PURE__ */ jsxs(DialogHeader, { className: "shrink-0 border-b px-6 pt-6 pb-4", children: [
152
+ /* @__PURE__ */ jsx(DialogTitle, { children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
153
+ /* @__PURE__ */ jsx(
154
+ "span",
155
+ {
156
+ className: cn(
157
+ "flex size-8 shrink-0 items-center justify-center rounded-lg",
158
+ iconVariant === "destructive" && "bg-destructive/10 text-destructive",
159
+ iconVariant === "warning" && "bg-warning/10 text-warning",
160
+ (!iconVariant || iconVariant === "default") && "bg-primary/10 text-primary"
161
+ ),
162
+ children: /* @__PURE__ */ jsx(Icon, { className: "size-4" })
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsx("span", { children: title }),
166
+ badgeSlot
167
+ ] }) }),
168
+ /* @__PURE__ */ jsx(DialogDescription, { children: description })
169
+ ] }),
170
+ content ? content(handle.close) : /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 py-4", children })
171
+ ]
172
+ }
173
+ )
156
174
  ] });
157
175
  }
158
176
  Dialog.displayName = "Dialog";
159
177
 
160
- export { Dialog as D };
178
+ export { Dialog as D, DialogActions as a };
161
179
  //# sourceMappingURL=Dialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../shadcn/shadcnDialog/dialog.tsx","../lib/components/Dialog/Dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type * as React from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../utils';\n\n// Dialog root wrapper with data-slot attribute\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\n// Dialog trigger wrapper with data-slot attribute\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\n// Dialog portal pass-through\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\n// Dialog close wrapper with data-slot attribute\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nconst DialogOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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 sm:rounded-lg',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n// Dialog header layout container\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\n// Dialog footer layout container\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import type { UseMutationResult } from '@tanstack/react-query';\nimport type React from 'react';\nimport type { FieldValues, UseFormReturn } from 'react-hook-form';\nimport {\n Dialog as ShadcnDialog,\n DialogContent as ShadcnDialogContent,\n DialogDescription as ShadcnDialogDescription,\n DialogFooter as ShadcnDialogFooter,\n DialogHeader as ShadcnDialogHeader,\n DialogTitle as ShadcnDialogTitle,\n DialogTrigger as ShadcnDialogTrigger,\n} from '../../../shadcn/shadcnDialog';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport type { FieldMapping } from '../../utils/formHelpers';\nimport { Button } from '../Button';\nimport { Form, type FormProps } from '../Form';\n\nexport interface DialogProps<\n TFieldValues extends FieldValues = FieldValues,\n TContext = unknown,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = unknown,\n> {\n // Handle from useDialog() — controls open state and cleanup\n handle: DialogHandle;\n // anchor — render prop that receives open(); button renders outside DialogTrigger\n anchor?: (open: () => void) => React.ReactNode;\n // content — render prop that receives close()\n content?: (close: () => void) => React.ReactNode;\n // trigger — legacy ReactNode trigger (wrapped in DialogTrigger automatically)\n trigger?: React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n // Optional badge-style slot rendered inline with the title in the header.\n // Use for short status indicators tied to the dialog's subject (e.g. \"Draft\", \"Derived unit\").\n badgeSlot?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n // Form mode — wraps children+footer in a Form component\n mode?: 'default' | 'form';\n form?: UseFormReturn<TFieldValues, TContext, TTransformedValues>;\n mutation?: UseMutationResult<TMutationData, TMutationError, TMutationVariables, unknown>;\n onFormSubmit?: FormProps<TFieldValues, TContext, TTransformedValues>['onSubmit'];\n transformSubmit?: FormProps<\n TFieldValues,\n TContext,\n TTransformedValues,\n TMutationData,\n TMutationError,\n TMutationVariables\n >['transformSubmit'];\n submitLabel?: string;\n cancelLabel?: string;\n fieldMapping?: FieldMapping;\n}\n\n// Composite dialog — controlled by a useDialog() handle\nexport function Dialog<\n TFieldValues extends FieldValues = FieldValues,\n TContext = unknown,\n TTransformedValues extends FieldValues | undefined = TFieldValues,\n TMutationData = unknown,\n TMutationError = Error,\n TMutationVariables = unknown,\n>({\n handle,\n anchor,\n content,\n trigger,\n title,\n description,\n badgeSlot,\n children,\n footer,\n className,\n mode = 'default',\n form,\n mutation,\n onFormSubmit,\n transformSubmit,\n submitLabel,\n cancelLabel,\n fieldMapping,\n}: DialogProps<TFieldValues, TContext, TTransformedValues, TMutationData, TMutationError, TMutationVariables>) {\n // Render the body+footer content — shared between default and form modes\n const renderBody = () => {\n if (content) return content(handle.close);\n\n if (mode === 'form' && form) {\n return (\n <Form\n form={form}\n mutation={mutation}\n onSubmit={onFormSubmit}\n transformSubmit={transformSubmit}\n fieldMapping={fieldMapping}\n className=\"space-y-4\"\n >\n {children}\n <ShadcnDialogFooter>\n {footer ?? (\n <>\n <Button variant=\"outline\" type=\"button\" onClick={handle.close}>\n {cancelLabel ?? 'Cancel'}\n </Button>\n <Button type=\"submit\">{submitLabel ?? 'Save'}</Button>\n </>\n )}\n </ShadcnDialogFooter>\n </Form>\n );\n }\n\n return (\n <>\n {children}\n {footer && <ShadcnDialogFooter>{footer}</ShadcnDialogFooter>}\n </>\n );\n };\n\n return (\n <ShadcnDialog open={handle.isOpen} onOpenChange={handle.onOpenChange}>\n {anchor ? anchor(handle.open) : trigger && <ShadcnDialogTrigger asChild>{trigger}</ShadcnDialogTrigger>}\n <ShadcnDialogContent className={className}>\n {(title || description) && (\n <ShadcnDialogHeader>\n {title && (\n <ShadcnDialogTitle>\n {badgeSlot ? (\n <span className=\"flex items-center gap-2\">\n <span>{title}</span>\n {badgeSlot}\n </span>\n ) : (\n title\n )}\n </ShadcnDialogTitle>\n )}\n {description && <ShadcnDialogDescription>{description}</ShadcnDialogDescription>}\n </ShadcnDialogHeader>\n )}\n {renderBody()}\n </ShadcnDialogContent>\n </ShadcnDialog>\n );\n}\n\nDialog.displayName = 'Dialog';\n"],"names":["Dialog","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","ShadcnDialogFooter","ShadcnDialog","ShadcnDialogTrigger","ShadcnDialogContent","ShadcnDialogHeader","ShadcnDialogTitle","ShadcnDialogDescription"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","sources":["../shadcn/shadcnDialog/dialog.tsx","../lib/components/Dialog/Dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport type * as React from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../utils';\n\n// Dialog root wrapper with data-slot attribute\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\n// Dialog trigger wrapper with data-slot attribute\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\n// Dialog portal pass-through\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\n// Dialog close wrapper with data-slot attribute\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nconst DialogOverlay = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 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 sm:rounded-lg',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n// Dialog header layout container\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\nDialogHeader.displayName = 'DialogHeader';\n\n// Dialog footer layout container\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport {\n Dialog as ShadcnDialog,\n DialogContent as ShadcnDialogContent,\n DialogDescription as ShadcnDialogDescription,\n DialogHeader as ShadcnDialogHeader,\n DialogTitle as ShadcnDialogTitle,\n DialogTrigger as ShadcnDialogTrigger,\n} from '../../../shadcn/shadcnDialog';\nimport { cn } from '../../../shadcn/utils';\nimport type { DialogHandle } from '../../hooks/useDialog';\n\nexport interface DialogActionsProps {\n children: React.ReactNode;\n className?: string;\n}\n\n// Standard dialog/form action bar — a top divider with right-aligned buttons that stack on mobile.\n// Use to wrap a form's submit/cancel buttons so every dialog shares the same footer layout.\nexport function DialogActions({ children, className }: DialogActionsProps) {\n return (\n <div className={cn('flex flex-col-reverse gap-2 border-t px-6 pt-4 pb-6 sm:flex-row sm:justify-end', className)}>\n {children}\n </div>\n );\n}\n\nDialogActions.displayName = 'DialogActions';\n\nconst OPEN_DIALOG_SELECTOR = '[data-state=\"open\"][role=\"dialog\"], [data-state=\"open\"][role=\"alertdialog\"]';\n\nfunction ensurePointerEventsWatchdog() {\n const g = globalThis as { __quantumUiPointerWatchdog?: boolean };\n if (g.__quantumUiPointerWatchdog || typeof document === 'undefined') return;\n g.__quantumUiPointerWatchdog = true;\n const fix = () => {\n if (document.body.style.pointerEvents === 'none' && !document.querySelector(OPEN_DIALOG_SELECTOR)) {\n document.body.style.pointerEvents = '';\n }\n };\n new MutationObserver(fix).observe(document.body, { attributes: true, attributeFilter: ['style'] });\n}\n\nfunction isTopmostDialog(el: HTMLElement | null) {\n if (!el || typeof document === 'undefined') return true;\n const open = document.querySelectorAll(OPEN_DIALOG_SELECTOR);\n return open.length === 0 || open[open.length - 1] === el;\n}\n\nfunction ensureEscapeManager() {\n const g = globalThis as { __quantumUiEscapeMgr?: boolean };\n if (g.__quantumUiEscapeMgr || typeof document === 'undefined') return;\n g.__quantumUiEscapeMgr = true;\n document.addEventListener(\n 'keydown',\n (e) => {\n if (e.key !== 'Escape') return;\n const confirmStore = (globalThis as { __quantumUiConfirmStore?: { getSnapshot: () => { open: boolean }; cancel: () => void } })\n .__quantumUiConfirmStore;\n if (!confirmStore?.getSnapshot().open) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n confirmStore.cancel();\n },\n true,\n );\n}\n\nexport interface DialogProps {\n // Handle from useDialog() — controls open state and cleanup\n handle: DialogHandle;\n // anchor — render prop that receives open(); button renders outside DialogTrigger\n anchor?: (open: () => void) => React.ReactNode;\n // content — render prop that receives close()\n content?: (close: () => void) => React.ReactNode;\n // trigger — legacy ReactNode trigger (wrapped in DialogTrigger automatically)\n trigger?: React.ReactNode;\n // Required header icon — rendered as a badge before the title to standardize dialog headers.\n icon: LucideIcon;\n // Colour of the header icon badge. Use 'destructive' for delete dialogs, 'warning' for cautions.\n iconVariant?: 'default' | 'destructive' | 'warning';\n title: React.ReactNode;\n description: React.ReactNode;\n // Optional badge-style slot rendered inline with the title in the header.\n // Use for short status indicators tied to the dialog's subject (e.g. \"Draft\", \"Derived unit\").\n badgeSlot?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n// Composite dialog — controlled by a useDialog() handle\nexport function Dialog({\n handle,\n anchor,\n content,\n trigger,\n icon: Icon,\n iconVariant = 'default',\n title,\n description,\n badgeSlot,\n children,\n className,\n}: DialogProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n ensurePointerEventsWatchdog();\n ensureEscapeManager();\n }, []);\n\n return (\n <ShadcnDialog open={handle.isOpen} onOpenChange={handle.onOpenChange}>\n {anchor ? anchor(handle.open) : trigger && <ShadcnDialogTrigger asChild>{trigger}</ShadcnDialogTrigger>}\n <ShadcnDialogContent\n ref={contentRef}\n className={cn('flex max-h-[95vh] flex-col gap-0 p-0', className)}\n onInteractOutside={(e) => {\n if (!isTopmostDialog(contentRef.current)) e.preventDefault();\n }}\n >\n <ShadcnDialogHeader className=\"shrink-0 border-b px-6 pt-6 pb-4\">\n <ShadcnDialogTitle>\n <span className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-lg',\n iconVariant === 'destructive' && 'bg-destructive/10 text-destructive',\n iconVariant === 'warning' && 'bg-warning/10 text-warning',\n (!iconVariant || iconVariant === 'default') && 'bg-primary/10 text-primary',\n )}\n >\n <Icon className=\"size-4\" />\n </span>\n <span>{title}</span>\n {badgeSlot}\n </span>\n </ShadcnDialogTitle>\n <ShadcnDialogDescription>{description}</ShadcnDialogDescription>\n </ShadcnDialogHeader>\n {content ? (\n content(handle.close)\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain px-6 py-4\">{children}</div>\n )}\n </ShadcnDialogContent>\n </ShadcnDialog>\n );\n}\n\nDialog.displayName = 'Dialog';\n"],"names":["Dialog","DialogPrimitive.Root","DialogPrimitive.Trigger","DialogPrimitive.Portal","DialogPrimitive.Overlay","DialogPrimitive.Content","DialogPrimitive.Close","DialogPrimitive.Title","DialogPrimitive.Description","ShadcnDialog","ShadcnDialogTrigger","ShadcnDialogContent","ShadcnDialogHeader","ShadcnDialogTitle","ShadcnDialogDescription"],"mappings":"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"}
@@ -163,11 +163,11 @@ const DropdownMenu = ({
163
163
  Dialog,
164
164
  {
165
165
  handle,
166
+ icon: item.icon,
166
167
  title: item.dialog.title,
167
168
  description: item.dialog.description,
168
169
  badgeSlot: item.dialog.badgeSlot,
169
- content: item.dialog.content,
170
- footer: item.dialog.footer
170
+ content: item.dialog.content
171
171
  },
172
172
  item.id
173
173
  );
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type React from 'react';\nimport { Fragment, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (item: MenuItem, index: number, onDialogSelect?: (id: string) => void): React.ReactNode => {\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' ? 'text-destructive focus:text-destructive' : undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n {item.shortcut && <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox': {\n const Icon = item.icon;\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {item.label}\n </DropdownMenuCheckboxItem>\n );\n }\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub': {\n const Icon = item.icon;\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n }\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n/**\n * DropdownMenu - A flexible, data-driven dropdown menu component\n *\n * This component provides a declarative API for building dropdown menus without\n * manually composing primitive components. It supports all dropdown menu features\n * including items, checkboxes, radio groups, submenus, separators, labels, and groups.\n *\n * @example\n * ```tsx\n * import { DropdownMenu } from '@vritti/quantum-ui/DropdownMenu';\n * import { Settings, User, LogOut } from 'lucide-react';\n *\n * function UserMenu() {\n * const [showStatus, setShowStatus] = useState(true);\n *\n * return (\n * <DropdownMenu\n * trigger={{ label: 'Menu', variant: 'outline' }}\n * items={[\n * { type: 'label', id: 'account-label', label: 'My Account' },\n * { type: 'item', id: 'profile', label: 'Profile', icon: User, shortcut: '⌘P' },\n * { type: 'item', id: 'settings', label: 'Settings', icon: Settings },\n * { type: 'separator' },\n * {\n * type: 'checkbox',\n * id: 'status',\n * label: 'Show Status',\n * checked: showStatus,\n * onCheckedChange: setShowStatus,\n * },\n * { type: 'separator' },\n * {\n * type: 'item',\n * id: 'logout',\n * label: 'Log out',\n * icon: LogOut,\n * variant: 'destructive',\n * },\n * ]}\n * align=\"end\"\n * />\n * );\n * }\n * ```\n */\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(items);\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {items.map((item, index) => renderMenuItem(item, index, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n footer={item.dialog.footer}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type React from 'react';\nimport { Fragment, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (item: MenuItem, index: number, onDialogSelect?: (id: string) => void): React.ReactNode => {\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' ? 'text-destructive focus:text-destructive' : undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n {item.shortcut && <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox': {\n const Icon = item.icon;\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {item.label}\n </DropdownMenuCheckboxItem>\n );\n }\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub': {\n const Icon = item.icon;\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n }\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n/**\n * DropdownMenu - A flexible, data-driven dropdown menu component\n *\n * This component provides a declarative API for building dropdown menus without\n * manually composing primitive components. It supports all dropdown menu features\n * including items, checkboxes, radio groups, submenus, separators, labels, and groups.\n *\n * @example\n * ```tsx\n * import { DropdownMenu } from '@vritti/quantum-ui/DropdownMenu';\n * import { Settings, User, LogOut } from 'lucide-react';\n *\n * function UserMenu() {\n * const [showStatus, setShowStatus] = useState(true);\n *\n * return (\n * <DropdownMenu\n * trigger={{ label: 'Menu', variant: 'outline' }}\n * items={[\n * { type: 'label', id: 'account-label', label: 'My Account' },\n * { type: 'item', id: 'profile', label: 'Profile', icon: User, shortcut: '⌘P' },\n * { type: 'item', id: 'settings', label: 'Settings', icon: Settings },\n * { type: 'separator' },\n * {\n * type: 'checkbox',\n * id: 'status',\n * label: 'Show Status',\n * checked: showStatus,\n * onCheckedChange: setShowStatus,\n * },\n * { type: 'separator' },\n * {\n * type: 'item',\n * id: 'logout',\n * label: 'Log out',\n * icon: LogOut,\n * variant: 'destructive',\n * },\n * ]}\n * align=\"end\"\n * />\n * );\n * }\n * ```\n */\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(items);\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {items.map((item, index) => renderMenuItem(item, index, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n icon={item.icon}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
package/dist/Form.js CHANGED
@@ -1,5 +1,5 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useCallback, Children, isValidElement, Fragment, cloneElement } from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useCallback, Children, isValidElement, Fragment as Fragment$1, cloneElement } from 'react';
3
3
  import { F as FormProvider, C as Controller } from './index.esm.js';
4
4
  import { c as cn } from './utils.js';
5
5
  import { axios } from './utils/axios.js';
@@ -55,7 +55,7 @@ function processChildren(children, control, isSubmitting, setValue, onCancel, re
55
55
  return child;
56
56
  }
57
57
  const childProps = child.props;
58
- const isFragment = child.type === Fragment;
58
+ const isFragment = child.type === Fragment$1;
59
59
  if (!isFragment && childProps.name && typeof childProps.name === "string") {
60
60
  const name = childProps.name;
61
61
  return /* @__PURE__ */ jsx(
@@ -183,29 +183,53 @@ function Form({
183
183
  );
184
184
  const handleSubmit = form.handleSubmit(wrappedOnSubmit);
185
185
  const processedChildren = processChildren(children, form.control, isSubmitting, form.setValue, onCancel, form.reset);
186
- return /* @__PURE__ */ jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: cn("space-y-4", className), ...props, children: [
187
- rootErrorPosition === "top" && form.formState.errors.root && /* @__PURE__ */ jsx(
188
- Alert,
189
- {
190
- variant: "destructive",
191
- title: form.formState.errors.root.type || "Error",
192
- description: form.formState.errors.root.message,
193
- action: rootErrorAction,
194
- className: cn("mb-4", rootErrorClassName)
195
- }
196
- ),
197
- processedChildren,
198
- rootErrorPosition === "bottom" && form.formState.errors.root && /* @__PURE__ */ jsx(
199
- Alert,
200
- {
201
- variant: "destructive",
202
- title: form.formState.errors.root.type || "Error",
203
- description: form.formState.errors.root.message,
204
- action: rootErrorAction,
205
- className: cn("mt-4", rootErrorClassName)
206
- }
207
- )
208
- ] }) });
186
+ const childArray = Children.toArray(processedChildren);
187
+ const actionsIndex = childArray.findIndex(
188
+ (child) => isValidElement(child) && child.type?.displayName === "DialogActions"
189
+ );
190
+ const hasActions = actionsIndex !== -1;
191
+ const bodyChildren = hasActions ? childArray.filter((_, index) => index !== actionsIndex) : processedChildren;
192
+ const actions = hasActions ? childArray[actionsIndex] : null;
193
+ const topError = rootErrorPosition === "top" && form.formState.errors.root ? /* @__PURE__ */ jsx(
194
+ Alert,
195
+ {
196
+ variant: "destructive",
197
+ title: form.formState.errors.root.type || "Error",
198
+ description: form.formState.errors.root.message,
199
+ action: rootErrorAction,
200
+ className: cn("mb-4", rootErrorClassName)
201
+ }
202
+ ) : null;
203
+ const bottomError = rootErrorPosition === "bottom" && form.formState.errors.root ? /* @__PURE__ */ jsx(
204
+ Alert,
205
+ {
206
+ variant: "destructive",
207
+ title: form.formState.errors.root.type || "Error",
208
+ description: form.formState.errors.root.message,
209
+ action: rootErrorAction,
210
+ className: cn("mt-4", rootErrorClassName)
211
+ }
212
+ ) : null;
213
+ return /* @__PURE__ */ jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsx(
214
+ "form",
215
+ {
216
+ onSubmit: handleSubmit,
217
+ className: cn(hasActions ? "flex min-h-0 flex-1 flex-col" : "space-y-4", className),
218
+ ...props,
219
+ children: hasActions ? /* @__PURE__ */ jsxs(Fragment, { children: [
220
+ /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-contain px-6 py-4 [scrollbar-gutter:stable]", children: [
221
+ topError,
222
+ bodyChildren,
223
+ bottomError
224
+ ] }),
225
+ actions
226
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
227
+ topError,
228
+ processedChildren,
229
+ bottomError
230
+ ] })
231
+ }
232
+ ) });
209
233
  }
210
234
  Form.displayName = "Form";
211
235