@underverse-ui/underverse 2.0.29 → 2.0.31

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 (35) hide show
  1. package/api-reference.json +1 -1
  2. package/dist/{EmojiPicker-NV3GQYWI.js → EmojiPicker-ISJ6RXYG.js} +4 -4
  3. package/dist/{chunk-LK6YWBI6.js → chunk-2P7TSXEE.js} +82 -25
  4. package/dist/chunk-2P7TSXEE.js.map +1 -0
  5. package/dist/{chunk-5QWYO527.js → chunk-37MHVJMV.js} +846 -90
  6. package/dist/chunk-37MHVJMV.js.map +1 -0
  7. package/dist/{chunk-XTZTUDRE.js → chunk-57BKIC6J.js} +711 -800
  8. package/dist/chunk-57BKIC6J.js.map +1 -0
  9. package/dist/{chunk-LRIRY4DG.js → chunk-5W63IHIN.js} +11 -3
  10. package/dist/chunk-5W63IHIN.js.map +1 -0
  11. package/dist/{chunk-F7MX3XXK.js → chunk-S4UHFRL3.js} +3 -3
  12. package/dist/{chunk-A4GUPKHM.js → chunk-ZP7F4ZD7.js} +63 -43
  13. package/dist/chunk-ZP7F4ZD7.js.map +1 -0
  14. package/dist/index.cjs +2296 -1342
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +61 -2
  17. package/dist/index.d.ts +61 -2
  18. package/dist/index.js +94 -41
  19. package/dist/index.js.map +1 -1
  20. package/dist/{menu-bar-AHG64PEB.js → menu-bar-DPCNNUX5.js} +193 -47
  21. package/dist/menu-bar-DPCNNUX5.js.map +1 -0
  22. package/dist/ueditor.cjs +9407 -8506
  23. package/dist/ueditor.cjs.map +1 -1
  24. package/dist/ueditor.d.cts +10 -0
  25. package/dist/ueditor.d.ts +10 -0
  26. package/dist/ueditor.js +4 -4
  27. package/package.json +2 -1
  28. package/dist/chunk-5QWYO527.js.map +0 -1
  29. package/dist/chunk-A4GUPKHM.js.map +0 -1
  30. package/dist/chunk-LK6YWBI6.js.map +0 -1
  31. package/dist/chunk-LRIRY4DG.js.map +0 -1
  32. package/dist/chunk-XTZTUDRE.js.map +0 -1
  33. package/dist/menu-bar-AHG64PEB.js.map +0 -1
  34. /package/dist/{EmojiPicker-NV3GQYWI.js.map → EmojiPicker-ISJ6RXYG.js.map} +0 -0
  35. /package/dist/{chunk-F7MX3XXK.js.map → chunk-S4UHFRL3.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@underverse-ui/underverse",
3
- "version": "2.0.29",
3
+ "version": "2.0.31",
4
4
  "sourceEntry": "src/index.ts",
5
5
  "totalExports": 263,
6
6
  "exports": [
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  EmojiPicker,
4
4
  EmojiPicker_default
5
- } from "./chunk-F7MX3XXK.js";
6
- import "./chunk-LRIRY4DG.js";
5
+ } from "./chunk-S4UHFRL3.js";
6
+ import "./chunk-5W63IHIN.js";
7
7
  import "./chunk-4TYW5K4J.js";
8
- import "./chunk-A4GUPKHM.js";
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-NV3GQYWI.js.map
14
+ //# sourceMappingURL=EmojiPicker-ISJ6RXYG.js.map
@@ -1,17 +1,35 @@
1
1
  import {
2
2
  getPanelBorderRadiusClass,
3
3
  useUnderverseUIConfig
4
- } from "./chunk-5QWYO527.js";
4
+ } from "./chunk-37MHVJMV.js";
5
5
  import {
6
6
  cn,
7
7
  useGlobalI18n
8
- } from "./chunk-A4GUPKHM.js";
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 || !closeOnEsc) return;
76
- const handleEscape = (event) => {
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
- document.addEventListener("keydown", handleEscape);
82
- return () => document.removeEventListener("keydown", handleEscape);
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
- document.body.style.overflow = "hidden";
87
- } else {
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
- document.body.style.overflow = "unset";
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-all duration-200 ease-out",
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 typeof window !== "undefined" ? createPortal(modalContent, document.body) : null;
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-LK6YWBI6.js.map
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"]}