@underverse-ui/underverse 2.0.28 → 2.0.30
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/api-reference.json +1 -1
- package/dist/{EmojiPicker-NV3GQYWI.js → EmojiPicker-ISJ6RXYG.js} +4 -4
- package/dist/{chunk-Y4X6CAZY.js → chunk-2P7TSXEE.js} +82 -25
- package/dist/chunk-2P7TSXEE.js.map +1 -0
- package/dist/{chunk-KTOXCD6J.js → chunk-37MHVJMV.js} +1078 -90
- package/dist/chunk-37MHVJMV.js.map +1 -0
- package/dist/{chunk-QYFXYDBK.js → chunk-57BKIC6J.js} +1306 -888
- package/dist/chunk-57BKIC6J.js.map +1 -0
- package/dist/{chunk-LRIRY4DG.js → chunk-5W63IHIN.js} +11 -3
- package/dist/chunk-5W63IHIN.js.map +1 -0
- package/dist/{chunk-F7MX3XXK.js → chunk-S4UHFRL3.js} +3 -3
- package/dist/{chunk-A4GUPKHM.js → chunk-ZP7F4ZD7.js} +63 -43
- package/dist/chunk-ZP7F4ZD7.js.map +1 -0
- package/dist/index.cjs +3275 -1628
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +55 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/{menu-bar-CFIWMBAA.js → menu-bar-DPCNNUX5.js} +227 -54
- package/dist/menu-bar-DPCNNUX5.js.map +1 -0
- package/dist/ueditor.cjs +9803 -8169
- package/dist/ueditor.cjs.map +1 -1
- package/dist/ueditor.d.cts +10 -0
- package/dist/ueditor.d.ts +10 -0
- package/dist/ueditor.js +4 -4
- package/package.json +2 -1
- package/dist/chunk-A4GUPKHM.js.map +0 -1
- package/dist/chunk-KTOXCD6J.js.map +0 -1
- package/dist/chunk-LRIRY4DG.js.map +0 -1
- package/dist/chunk-QYFXYDBK.js.map +0 -1
- package/dist/chunk-Y4X6CAZY.js.map +0 -1
- package/dist/menu-bar-CFIWMBAA.js.map +0 -1
- /package/dist/{EmojiPicker-NV3GQYWI.js.map → EmojiPicker-ISJ6RXYG.js.map} +0 -0
- /package/dist/{chunk-F7MX3XXK.js.map → chunk-S4UHFRL3.js.map} +0 -0
package/api-reference.json
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
EmojiPicker,
|
|
4
4
|
EmojiPicker_default
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-S4UHFRL3.js";
|
|
6
|
+
import "./chunk-5W63IHIN.js";
|
|
7
7
|
import "./chunk-4TYW5K4J.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-ZP7F4ZD7.js";
|
|
9
9
|
import "./chunk-NSBPE2FW.js";
|
|
10
10
|
export {
|
|
11
11
|
EmojiPicker,
|
|
12
12
|
EmojiPicker_default as default
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=EmojiPicker-
|
|
14
|
+
//# sourceMappingURL=EmojiPicker-ISJ6RXYG.js.map
|
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getPanelBorderRadiusClass,
|
|
3
3
|
useUnderverseUIConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-37MHVJMV.js";
|
|
5
5
|
import {
|
|
6
6
|
cn,
|
|
7
7
|
useGlobalI18n
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZP7F4ZD7.js";
|
|
9
9
|
|
|
10
10
|
// src/components/Modal.tsx
|
|
11
11
|
import * as React from "react";
|
|
12
12
|
import { createPortal } from "react-dom";
|
|
13
13
|
import { X } from "lucide-react";
|
|
14
14
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
var bodyScrollLocks = /* @__PURE__ */ new WeakMap();
|
|
16
|
+
function lockBodyScroll(body) {
|
|
17
|
+
const current = bodyScrollLocks.get(body);
|
|
18
|
+
if (current) {
|
|
19
|
+
current.count += 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
bodyScrollLocks.set(body, { count: 1, overflow: body.style.overflow });
|
|
23
|
+
body.style.overflow = "hidden";
|
|
24
|
+
}
|
|
25
|
+
function unlockBodyScroll(body) {
|
|
26
|
+
const current = bodyScrollLocks.get(body);
|
|
27
|
+
if (!current) return;
|
|
28
|
+
current.count -= 1;
|
|
29
|
+
if (current.count > 0) return;
|
|
30
|
+
body.style.overflow = current.overflow;
|
|
31
|
+
bodyScrollLocks.delete(body);
|
|
32
|
+
}
|
|
15
33
|
var sizeStyles = {
|
|
16
34
|
sm: "max-w-md",
|
|
17
35
|
md: "max-w-2xl",
|
|
@@ -36,7 +54,9 @@ var Modal = ({
|
|
|
36
54
|
fullWidth = false,
|
|
37
55
|
width,
|
|
38
56
|
height,
|
|
39
|
-
borderMode
|
|
57
|
+
borderMode,
|
|
58
|
+
portalContainer,
|
|
59
|
+
ariaLabel
|
|
40
60
|
}) => {
|
|
41
61
|
const gi18n = useGlobalI18n();
|
|
42
62
|
const globalConfig = useUnderverseUIConfig();
|
|
@@ -46,6 +66,11 @@ var Modal = ({
|
|
|
46
66
|
const [isAnimating, setIsAnimating] = React.useState(true);
|
|
47
67
|
const mouseDownTarget = React.useRef(null);
|
|
48
68
|
const modalContentRef = React.useRef(null);
|
|
69
|
+
const titleId = React.useId();
|
|
70
|
+
const descriptionId = React.useId();
|
|
71
|
+
const resolvedPortalContainer = portalContainer ?? (typeof document !== "undefined" ? document.body : null);
|
|
72
|
+
const portalDocument = resolvedPortalContainer?.ownerDocument ?? null;
|
|
73
|
+
const portalWindow = portalDocument?.defaultView ?? null;
|
|
49
74
|
React.useEffect(() => {
|
|
50
75
|
setIsMounted(true);
|
|
51
76
|
return () => setIsMounted(false);
|
|
@@ -57,7 +82,7 @@ var Modal = ({
|
|
|
57
82
|
animationRef.current = true;
|
|
58
83
|
setIsVisible(true);
|
|
59
84
|
setIsAnimating(true);
|
|
60
|
-
requestAnimationFrame(() => {
|
|
85
|
+
portalWindow?.requestAnimationFrame(() => {
|
|
61
86
|
setIsAnimating(false);
|
|
62
87
|
});
|
|
63
88
|
} else {
|
|
@@ -70,27 +95,54 @@ var Modal = ({
|
|
|
70
95
|
return () => clearTimeout(hideTimer);
|
|
71
96
|
}
|
|
72
97
|
}
|
|
73
|
-
}, [isOpen, isVisible]);
|
|
98
|
+
}, [isOpen, isVisible, portalWindow]);
|
|
74
99
|
React.useEffect(() => {
|
|
75
|
-
if (!isOpen
|
|
76
|
-
const
|
|
77
|
-
if (event.key === "Escape") {
|
|
100
|
+
if (!isOpen) return;
|
|
101
|
+
const handleKeyDown = (event) => {
|
|
102
|
+
if (event.key === "Escape" && closeOnEsc) {
|
|
103
|
+
event.preventDefault();
|
|
78
104
|
onClose();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (event.key !== "Tab") return;
|
|
108
|
+
const modal = modalContentRef.current;
|
|
109
|
+
if (!modal) return;
|
|
110
|
+
const focusable = Array.from(modal.querySelectorAll(
|
|
111
|
+
'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'
|
|
112
|
+
)).filter((element) => !element.hasAttribute("hidden"));
|
|
113
|
+
if (focusable.length === 0) {
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
modal.focus();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const first = focusable[0];
|
|
119
|
+
const last = focusable[focusable.length - 1];
|
|
120
|
+
if (event.shiftKey && portalDocument?.activeElement === first) {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
last.focus();
|
|
123
|
+
} else if (!event.shiftKey && portalDocument?.activeElement === last) {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
first.focus();
|
|
79
126
|
}
|
|
80
127
|
};
|
|
81
|
-
|
|
82
|
-
return () =>
|
|
83
|
-
}, [isOpen, closeOnEsc, onClose]);
|
|
128
|
+
portalDocument?.addEventListener("keydown", handleKeyDown);
|
|
129
|
+
return () => portalDocument?.removeEventListener("keydown", handleKeyDown);
|
|
130
|
+
}, [isOpen, closeOnEsc, onClose, portalDocument]);
|
|
84
131
|
React.useEffect(() => {
|
|
85
|
-
if (isOpen)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
document.body.style.overflow = "unset";
|
|
89
|
-
}
|
|
132
|
+
if (!isOpen || !portalDocument) return;
|
|
133
|
+
const previousFocus = portalDocument.activeElement;
|
|
134
|
+
const frameId = portalWindow?.requestAnimationFrame(() => modalContentRef.current?.focus());
|
|
90
135
|
return () => {
|
|
91
|
-
|
|
136
|
+
if (frameId !== void 0) portalWindow?.cancelAnimationFrame(frameId);
|
|
137
|
+
if (previousFocus?.isConnected) previousFocus.focus();
|
|
92
138
|
};
|
|
93
|
-
}, [isOpen]);
|
|
139
|
+
}, [isOpen, portalDocument, portalWindow]);
|
|
140
|
+
React.useEffect(() => {
|
|
141
|
+
const body = portalDocument?.body;
|
|
142
|
+
if (!isOpen || !body) return;
|
|
143
|
+
lockBodyScroll(body);
|
|
144
|
+
return () => unlockBodyScroll(body);
|
|
145
|
+
}, [isOpen, portalDocument]);
|
|
94
146
|
const isInsidePortal = (element) => {
|
|
95
147
|
if (!element) return false;
|
|
96
148
|
let current = element;
|
|
@@ -145,10 +197,16 @@ var Modal = ({
|
|
|
145
197
|
"div",
|
|
146
198
|
{
|
|
147
199
|
ref: modalContentRef,
|
|
200
|
+
role: "dialog",
|
|
201
|
+
"aria-modal": "true",
|
|
202
|
+
"aria-labelledby": title ? titleId : void 0,
|
|
203
|
+
"aria-describedby": description ? descriptionId : void 0,
|
|
204
|
+
"aria-label": title ? void 0 : ariaLabel ?? "Dialog",
|
|
205
|
+
tabIndex: -1,
|
|
148
206
|
className: cn(
|
|
149
207
|
"relative w-full border border-border/40 bg-card text-card-foreground shadow-xl",
|
|
150
208
|
resolvedBorderMode ? getPanelBorderRadiusClass(resolvedBorderMode) : "rounded-2xl md:rounded-3xl",
|
|
151
|
-
"transition-
|
|
209
|
+
"transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none",
|
|
152
210
|
maxWidthClass,
|
|
153
211
|
fullWidth && "mx-0",
|
|
154
212
|
className
|
|
@@ -156,8 +214,6 @@ var Modal = ({
|
|
|
156
214
|
style: {
|
|
157
215
|
opacity: isOpen && !isAnimating ? 1 : 0,
|
|
158
216
|
transform: isOpen && !isAnimating ? "scale(1)" : "scale(0.9)",
|
|
159
|
-
// Thêm dòng này để tạo hiệu ứng nảy
|
|
160
|
-
transition: "all 300ms cubic-bezier(0.34, 1.76, 0.64, 1)",
|
|
161
217
|
width,
|
|
162
218
|
height
|
|
163
219
|
},
|
|
@@ -165,12 +221,13 @@ var Modal = ({
|
|
|
165
221
|
children: [
|
|
166
222
|
(title || description || showCloseButton) && /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between p-6 pb-0", children: [
|
|
167
223
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
168
|
-
title && /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold leading-none tracking-tight", children: title }),
|
|
169
|
-
description && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description })
|
|
224
|
+
title && /* @__PURE__ */ jsx("h2", { id: titleId, className: "text-lg font-semibold leading-none tracking-tight text-balance", children: title }),
|
|
225
|
+
description && /* @__PURE__ */ jsx("p", { id: descriptionId, className: "text-sm text-muted-foreground", children: description })
|
|
170
226
|
] }),
|
|
171
227
|
showCloseButton && /* @__PURE__ */ jsx(
|
|
172
228
|
"button",
|
|
173
229
|
{
|
|
230
|
+
type: "button",
|
|
174
231
|
onClick: onClose,
|
|
175
232
|
"aria-label": gi18n.closeModal ?? "Close modal",
|
|
176
233
|
className: cn(
|
|
@@ -189,11 +246,11 @@ var Modal = ({
|
|
|
189
246
|
]
|
|
190
247
|
}
|
|
191
248
|
);
|
|
192
|
-
return
|
|
249
|
+
return resolvedPortalContainer ? createPortal(modalContent, resolvedPortalContainer) : null;
|
|
193
250
|
};
|
|
194
251
|
var Modal_default = Modal;
|
|
195
252
|
|
|
196
253
|
export {
|
|
197
254
|
Modal_default
|
|
198
255
|
};
|
|
199
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-2P7TSXEE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Modal.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../utils/cn\";\nimport { X } from \"lucide-react\";\nimport { useGlobalI18n } from \"../contexts/GlobalI18nContext\";\nimport { getBorderRadiusClass, getPanelBorderRadiusClass, type BorderMode } from \"../utils/radius\";\nimport { useUnderverseUIConfig } from \"../contexts/UnderverseConfigContext\";\n\n/** Public props for the `Modal` component. */\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n title?: string;\n description?: string;\n className?: string;\n contentClassName?: string;\n overlayClassName?: string;\n showCloseButton?: boolean;\n closeOnOverlayClick?: boolean;\n closeOnEsc?: boolean;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n noPadding?: boolean;\n fullWidth?: boolean;\n width?: string | number;\n height?: string | number;\n borderMode?: BorderMode;\n /** Optional portal target, useful for iframe or isolated document realms. */\n portalContainer?: HTMLElement | null;\n ariaLabel?: string;\n}\n\nconst bodyScrollLocks = new WeakMap<HTMLElement, { count: number; overflow: string }>();\n\nfunction lockBodyScroll(body: HTMLElement) {\n const current = bodyScrollLocks.get(body);\n if (current) {\n current.count += 1;\n return;\n }\n bodyScrollLocks.set(body, { count: 1, overflow: body.style.overflow });\n body.style.overflow = \"hidden\";\n}\n\nfunction unlockBodyScroll(body: HTMLElement) {\n const current = bodyScrollLocks.get(body);\n if (!current) return;\n current.count -= 1;\n if (current.count > 0) return;\n body.style.overflow = current.overflow;\n bodyScrollLocks.delete(body);\n}\n\nconst sizeStyles = {\n sm: \"max-w-md\",\n md: \"max-w-2xl\",\n lg: \"max-w-4xl\",\n xl: \"max-w-6xl\",\n full: \"max-w-full\",\n};\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n children,\n title,\n description,\n className,\n contentClassName,\n overlayClassName,\n showCloseButton = true,\n closeOnOverlayClick = true,\n closeOnEsc = true,\n size = \"md\",\n noPadding = false,\n fullWidth = false,\n width,\n height,\n borderMode,\n portalContainer,\n ariaLabel,\n}) => {\n const gi18n = useGlobalI18n();\n const globalConfig = useUnderverseUIConfig();\n const resolvedBorderMode = borderMode ?? globalConfig.borderMode;\n const [isMounted, setIsMounted] = React.useState(false);\n const [isVisible, setIsVisible] = React.useState(false);\n const [isAnimating, setIsAnimating] = React.useState(true);\n // Track if mousedown started outside modal content\n const mouseDownTarget = React.useRef<EventTarget | null>(null);\n const modalContentRef = React.useRef<HTMLDivElement>(null);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const resolvedPortalContainer = portalContainer ?? (typeof document !== \"undefined\" ? document.body : null);\n const portalDocument = resolvedPortalContainer?.ownerDocument ?? null;\n const portalWindow = portalDocument?.defaultView ?? null;\n\n React.useEffect(() => {\n setIsMounted(true);\n return () => setIsMounted(false);\n }, []);\n\n // Ref to prevent double animation trigger in React StrictMode\n const animationRef = React.useRef(false);\n\n // Animation handling\n React.useEffect(() => {\n if (isOpen) {\n if (animationRef.current) return; // Prevent double animation in StrictMode\n animationRef.current = true;\n setIsVisible(true);\n setIsAnimating(true);\n // Start animation on next frame\n portalWindow?.requestAnimationFrame(() => {\n setIsAnimating(false);\n });\n } else {\n animationRef.current = false;\n if (isVisible) {\n setIsAnimating(true);\n // Hide after animation completes\n const hideTimer = setTimeout(() => {\n setIsVisible(false);\n }, 200);\n return () => clearTimeout(hideTimer);\n }\n }\n }, [isOpen, isVisible, portalWindow]);\n\n // Handle escape key\n React.useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && closeOnEsc) {\n event.preventDefault();\n onClose();\n return;\n }\n if (event.key !== \"Tab\") return;\n\n const modal = modalContentRef.current;\n if (!modal) return;\n const focusable = Array.from(modal.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n )).filter((element) => !element.hasAttribute(\"hidden\"));\n if (focusable.length === 0) {\n event.preventDefault();\n modal.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (event.shiftKey && portalDocument?.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && portalDocument?.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n portalDocument?.addEventListener(\"keydown\", handleKeyDown);\n return () => portalDocument?.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, closeOnEsc, onClose, portalDocument]);\n\n React.useEffect(() => {\n if (!isOpen || !portalDocument) return;\n const previousFocus = portalDocument.activeElement as HTMLElement | null;\n const frameId = portalWindow?.requestAnimationFrame(() => modalContentRef.current?.focus());\n return () => {\n if (frameId !== undefined) portalWindow?.cancelAnimationFrame(frameId);\n if (previousFocus?.isConnected) previousFocus.focus();\n };\n }, [isOpen, portalDocument, portalWindow]);\n\n // Prevent body scroll when modal is open\n React.useEffect(() => {\n const body = portalDocument?.body;\n if (!isOpen || !body) return;\n lockBodyScroll(body);\n return () => unlockBodyScroll(body);\n }, [isOpen, portalDocument]);\n\n // Check if an element is inside a portal (datepicker, popover, dropdown, etc.)\n const isInsidePortal = (element: Node | null): boolean => {\n if (!element) return false;\n let current = element as HTMLElement | null;\n while (current) {\n // Check for common portal indicators (data attributes, z-index patterns)\n if (\n current.hasAttribute?.(\"data-datepicker\") ||\n current.hasAttribute?.(\"data-popover\") ||\n current.hasAttribute?.(\"data-dropdown\") ||\n current.hasAttribute?.(\"data-dropdown-menu\") ||\n current.hasAttribute?.(\"data-radix-popper-content-wrapper\") ||\n current.hasAttribute?.(\"data-radix-portal\") ||\n current.hasAttribute?.(\"data-tippy-root\") ||\n current.getAttribute?.(\"role\") === \"listbox\" ||\n current.getAttribute?.(\"role\") === \"dialog\" ||\n current.classList?.contains(\"datepicker-portal\") ||\n current.classList?.contains(\"popover-portal\") ||\n current.classList?.contains(\"tippy-box\") ||\n current.classList?.contains(\"tippy-content\")\n ) {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n };\n\n const handleOverlayMouseDown = (event: React.MouseEvent) => {\n // Store the mousedown target\n mouseDownTarget.current = event.target;\n };\n\n const handleOverlayMouseUp = (event: React.MouseEvent) => {\n // Check if both mousedown and mouseup occurred outside modal content\n const modalContent = modalContentRef.current;\n const mouseDownTarget_ = mouseDownTarget.current as Node;\n const mouseUpTarget = event.target as Node;\n\n // Don't close if clicking inside a portal element (datepicker, popover, etc.)\n if (isInsidePortal(mouseDownTarget_) || isInsidePortal(mouseUpTarget)) {\n mouseDownTarget.current = null;\n return;\n }\n\n const mouseDownOutside = modalContent && !modalContent.contains(mouseDownTarget_);\n const mouseUpOutside = modalContent && !modalContent.contains(mouseUpTarget);\n\n if (closeOnOverlayClick && mouseDownOutside && mouseUpOutside) {\n onClose();\n }\n mouseDownTarget.current = null;\n };\n\n if (!isMounted || (!isOpen && !isVisible)) {\n return null;\n }\n\n const maxWidthClass = width ? \"max-w-none\" : fullWidth ? \"max-w-full\" : sizeStyles[size];\n\n const modalContent = (\n <div\n className={cn(\"fixed inset-0 z-[9999] flex items-center justify-center p-4 md:p-6\", overlayClassName)}\n style={{ overscrollBehavior: \"contain\" }}\n onMouseDown={handleOverlayMouseDown}\n onMouseUp={handleOverlayMouseUp}\n >\n {/* Overlay */}\n <div\n className=\"absolute inset-0 bg-background/80 backdrop-blur-sm transition-opacity duration-200 ease-out\"\n style={{\n opacity: isOpen && !isAnimating ? 1 : 0,\n }}\n />\n\n {/* Modal */}\n <div\n ref={modalContentRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n aria-label={title ? undefined : ariaLabel ?? \"Dialog\"}\n tabIndex={-1}\n className={cn(\n \"relative w-full border border-border/40 bg-card text-card-foreground shadow-xl\",\n resolvedBorderMode ? getPanelBorderRadiusClass(resolvedBorderMode) : \"rounded-2xl md:rounded-3xl\",\n \"transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n maxWidthClass,\n fullWidth && \"mx-0\",\n className,\n )}\n style={{\n opacity: isOpen && !isAnimating ? 1 : 0,\n transform: isOpen && !isAnimating ? \"scale(1)\" : \"scale(0.9)\",\n width,\n height,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n {(title || description || showCloseButton) && (\n <div className=\"flex items-start justify-between p-6 pb-0\">\n <div className=\"space-y-1.5\">\n {title && <h2 id={titleId} className=\"text-lg font-semibold leading-none tracking-tight text-balance\">{title}</h2>}\n {description && <p id={descriptionId} className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={gi18n.closeModal ?? \"Close modal\"}\n className={cn(\n \"rounded-lg opacity-70 ring-offset-background transition-opacity\",\n \"hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n \"disabled:pointer-events-none \",\n )}\n >\n <X className=\"h-4 w-4 cursor-pointer\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className={cn(\"p-6\", noPadding && \"p-0\", contentClassName)}>{children}</div>\n </div>\n </div>\n );\n\n return resolvedPortalContainer ? createPortal(modalContent, resolvedPortalContainer) : null;\n};\n\nexport default Modal;\n"],"mappings":"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","names":["modalContent"]}
|