@aster-ui/prefixed 0.12.55 → 0.12.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/DatePicker.d.ts +3 -1
- package/dist/components/DatePicker.js +84 -82
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Dropdown.d.ts +5 -4
- package/dist/components/Dropdown.js +239 -233
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/InputNumber.d.ts +2 -0
- package/dist/components/InputNumber.js +92 -88
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Menu.d.ts +3 -1
- package/dist/components/Menu.js +49 -48
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Modal.d.ts +40 -18
- package/dist/components/Modal.js +180 -156
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/OTPInput.d.ts +2 -0
- package/dist/components/OTPInput.js +46 -44
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +3 -1
- package/dist/components/Pagination.js +104 -90
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Popconfirm.d.ts +3 -1
- package/dist/components/Popconfirm.js +63 -59
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Tabs.d.ts +3 -2
- package/dist/components/Tabs.js +74 -72
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/ThemeController.js +102 -88
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/ThemeProvider.js +17 -15
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/Transfer.d.ts +3 -1
- package/dist/components/Transfer.js +127 -120
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Upload.d.ts +3 -1
- package/dist/components/Upload.js +144 -142
- package/dist/components/Upload.js.map +1 -1
- package/dist/hooks/useTheme.js +8 -6
- package/dist/hooks/useTheme.js.map +1 -1
- package/package.json +2 -2
package/dist/components/Modal.js
CHANGED
|
@@ -1,63 +1,74 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { createRoot as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
children:
|
|
7
|
-
title:
|
|
8
|
-
footer:
|
|
9
|
-
open:
|
|
10
|
-
onOk:
|
|
11
|
-
onCancel:
|
|
12
|
-
okText:
|
|
13
|
-
cancelText:
|
|
14
|
-
maskClosable:
|
|
15
|
-
closable:
|
|
16
|
-
position:
|
|
17
|
-
align:
|
|
18
|
-
width:
|
|
19
|
-
centered:
|
|
20
|
-
onClose:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
import { jsxs as f, jsx as t, Fragment as Ce } from "react/jsx-runtime";
|
|
2
|
+
import B, { forwardRef as Me, useRef as k, useId as V, useImperativeHandle as Ne, useEffect as X } from "react";
|
|
3
|
+
import { createRoot as Te } from "react-dom/client";
|
|
4
|
+
import { useConfig as oe } from "./ConfigProvider.js";
|
|
5
|
+
const Be = "d-modal", Y = "d-modal-top", Z = "d-modal-middle", _ = "d-modal-bottom", $e = "d-modal-start", Le = "d-modal-end", Re = "d-modal-box", ee = "d-modal-action", Se = "d-modal-backdrop", x = "d-btn", W = "d-btn-primary", te = "d-btn-error", Ae = "d-alert", Ee = "d-alert-info", je = "d-alert-success", We = "d-alert-warning", Oe = "d-alert-error", ne = Me(function({
|
|
6
|
+
children: s,
|
|
7
|
+
title: d,
|
|
8
|
+
footer: l,
|
|
9
|
+
open: c = !1,
|
|
10
|
+
onOk: r,
|
|
11
|
+
onCancel: i,
|
|
12
|
+
okText: $,
|
|
13
|
+
cancelText: m,
|
|
14
|
+
maskClosable: b = !0,
|
|
15
|
+
closable: v = !0,
|
|
16
|
+
position: n,
|
|
17
|
+
align: w,
|
|
18
|
+
width: u,
|
|
19
|
+
centered: L,
|
|
20
|
+
onClose: R,
|
|
21
|
+
afterClose: a,
|
|
22
|
+
initialFocus: h,
|
|
23
|
+
alertDialog: O = !1,
|
|
24
|
+
confirmLoading: C,
|
|
25
|
+
okButtonProps: I,
|
|
26
|
+
cancelButtonProps: se,
|
|
27
|
+
closeIcon: le,
|
|
28
|
+
zIndex: z,
|
|
29
|
+
destroyOnClose: S = !1,
|
|
30
|
+
"data-testid": A,
|
|
31
|
+
className: re = "",
|
|
32
|
+
style: ae,
|
|
33
|
+
...de
|
|
34
|
+
}, ce) {
|
|
35
|
+
const { locale: D } = oe(), M = k(null), P = k(null), H = k(null), K = k(null), F = k(null), [ie, E] = B.useState(!1), [me, q] = B.useState(c || !S), G = V(), J = V(), j = C ?? ie, ue = $ ?? D.Modal?.okText ?? "OK", he = m ?? D.Modal?.cancelText ?? "Cancel";
|
|
36
|
+
Ne(ce, () => M.current, []);
|
|
37
|
+
const N = R || i;
|
|
38
|
+
X(() => {
|
|
28
39
|
const o = M.current;
|
|
29
|
-
o && (
|
|
30
|
-
switch (
|
|
40
|
+
o && (c ? (q(!0), o.open || (F.current = document.activeElement, o.showModal(), h && setTimeout(() => {
|
|
41
|
+
switch (h) {
|
|
31
42
|
case "ok":
|
|
32
|
-
|
|
43
|
+
P.current?.focus();
|
|
33
44
|
break;
|
|
34
45
|
case "cancel":
|
|
35
|
-
|
|
46
|
+
H.current?.focus();
|
|
36
47
|
break;
|
|
37
48
|
case "close":
|
|
38
|
-
|
|
49
|
+
K.current?.focus();
|
|
39
50
|
break;
|
|
40
51
|
}
|
|
41
|
-
}, 0)) : o.open && (o.close(),
|
|
42
|
-
}, [
|
|
52
|
+
}, 0))) : o.open && (o.close(), F.current?.focus(), a && setTimeout(a, 300), S && setTimeout(() => q(!1), 300)));
|
|
53
|
+
}, [c, h, a, S]), X(() => {
|
|
43
54
|
const o = M.current;
|
|
44
55
|
if (!o) return;
|
|
45
|
-
const
|
|
46
|
-
|
|
56
|
+
const T = () => {
|
|
57
|
+
N?.();
|
|
47
58
|
};
|
|
48
|
-
return o.addEventListener("close",
|
|
49
|
-
o.removeEventListener("close",
|
|
59
|
+
return o.addEventListener("close", T), () => {
|
|
60
|
+
o.removeEventListener("close", T);
|
|
50
61
|
};
|
|
51
|
-
}, [
|
|
52
|
-
const
|
|
53
|
-
top:
|
|
54
|
-
middle:
|
|
55
|
-
bottom:
|
|
56
|
-
},
|
|
62
|
+
}, [N]);
|
|
63
|
+
const Q = {
|
|
64
|
+
top: Y,
|
|
65
|
+
middle: Z,
|
|
66
|
+
bottom: _
|
|
67
|
+
}, pe = {
|
|
57
68
|
base: {
|
|
58
|
-
top:
|
|
59
|
-
middle:
|
|
60
|
-
bottom:
|
|
69
|
+
top: Y,
|
|
70
|
+
middle: Z,
|
|
71
|
+
bottom: _
|
|
61
72
|
},
|
|
62
73
|
sm: {
|
|
63
74
|
top: "sm:modal-top",
|
|
@@ -84,106 +95,118 @@ function u({
|
|
|
84
95
|
middle: "2xl:modal-middle",
|
|
85
96
|
bottom: "2xl:modal-bottom"
|
|
86
97
|
}
|
|
87
|
-
},
|
|
88
|
-
start:
|
|
89
|
-
end:
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
f && V[f],
|
|
105
|
-
J
|
|
106
|
-
].filter(Boolean).join(" "), Y = async () => {
|
|
107
|
-
if (a) {
|
|
108
|
-
L(!0);
|
|
98
|
+
}, fe = {
|
|
99
|
+
start: $e,
|
|
100
|
+
end: Le
|
|
101
|
+
}, be = [Be, ...(() => {
|
|
102
|
+
if (L)
|
|
103
|
+
return [Q.middle];
|
|
104
|
+
if (!n)
|
|
105
|
+
return [];
|
|
106
|
+
if (typeof n == "string")
|
|
107
|
+
return [Q[n]];
|
|
108
|
+
const o = [];
|
|
109
|
+
for (const [T, U] of Object.entries(n))
|
|
110
|
+
U && o.push(pe[T][U]);
|
|
111
|
+
return o;
|
|
112
|
+
})(), w && fe[w], re].filter(Boolean).join(" "), ve = async () => {
|
|
113
|
+
if (r) {
|
|
114
|
+
C === void 0 && E(!0);
|
|
109
115
|
try {
|
|
110
|
-
await
|
|
116
|
+
await r(), C === void 0 && E(!1);
|
|
111
117
|
} catch (o) {
|
|
112
|
-
throw
|
|
118
|
+
throw C === void 0 && E(!1), o;
|
|
113
119
|
}
|
|
114
120
|
}
|
|
115
|
-
},
|
|
116
|
-
|
|
117
|
-
},
|
|
118
|
-
|
|
121
|
+
}, we = () => {
|
|
122
|
+
b && N && N();
|
|
123
|
+
}, ke = u ? { width: typeof u == "number" ? `${u}px` : u, maxWidth: "90vw" } : {}, xe = {
|
|
124
|
+
...ae,
|
|
125
|
+
...z !== void 0 ? { zIndex: z } : {}
|
|
126
|
+
}, ye = !l && (r || i), ge = l != null, p = (o) => A ? `${A}-${o}` : void 0;
|
|
127
|
+
return me ? /* @__PURE__ */ f(
|
|
119
128
|
"dialog",
|
|
120
129
|
{
|
|
121
130
|
ref: M,
|
|
122
|
-
role:
|
|
131
|
+
role: O ? "alertdialog" : "dialog",
|
|
123
132
|
"aria-modal": "true",
|
|
124
|
-
className:
|
|
125
|
-
|
|
126
|
-
"
|
|
127
|
-
"
|
|
128
|
-
|
|
133
|
+
className: be,
|
|
134
|
+
style: xe,
|
|
135
|
+
"data-state": c ? "open" : "closed",
|
|
136
|
+
"data-testid": A,
|
|
137
|
+
"aria-labelledby": d ? G : void 0,
|
|
138
|
+
"aria-describedby": J,
|
|
139
|
+
...de,
|
|
129
140
|
children: [
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
|
|
132
|
-
/* @__PURE__ */ t("div", { id:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
a && /* @__PURE__ */ t(
|
|
141
|
+
/* @__PURE__ */ f("div", { className: Re, style: ke, children: [
|
|
142
|
+
d && /* @__PURE__ */ t("h3", { id: G, className: "text-lg font-bold mb-4", "data-testid": p("title"), children: d }),
|
|
143
|
+
/* @__PURE__ */ t("div", { id: J, className: "py-4", "data-testid": p("content"), children: s }),
|
|
144
|
+
ye && /* @__PURE__ */ f("div", { className: ee, children: [
|
|
145
|
+
i && /* @__PURE__ */ t(
|
|
136
146
|
"button",
|
|
137
147
|
{
|
|
138
|
-
ref:
|
|
139
|
-
className:
|
|
140
|
-
onClick:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
children:
|
|
148
|
+
ref: H,
|
|
149
|
+
className: x,
|
|
150
|
+
onClick: i,
|
|
151
|
+
"data-testid": p("cancel-button"),
|
|
152
|
+
...se,
|
|
153
|
+
children: he
|
|
154
|
+
}
|
|
155
|
+
),
|
|
156
|
+
r && /* @__PURE__ */ t(
|
|
157
|
+
"button",
|
|
158
|
+
{
|
|
159
|
+
ref: P,
|
|
160
|
+
className: `${x} ${W} ${j ? "loading" : ""}`,
|
|
161
|
+
onClick: ve,
|
|
162
|
+
disabled: j || I?.disabled,
|
|
163
|
+
"aria-busy": j || void 0,
|
|
164
|
+
"data-testid": p("ok-button"),
|
|
165
|
+
...I,
|
|
166
|
+
children: ue
|
|
144
167
|
}
|
|
145
168
|
)
|
|
146
169
|
] }),
|
|
147
|
-
|
|
170
|
+
ge && /* @__PURE__ */ t("div", { className: ee, children: l })
|
|
148
171
|
] }),
|
|
149
|
-
|
|
172
|
+
v && b && /* @__PURE__ */ t("form", { method: "dialog", className: Se, "data-testid": p("backdrop"), children: /* @__PURE__ */ t("button", { ref: K, onClick: we, "data-testid": p("close-button"), children: le || /* @__PURE__ */ t("span", { className: "sr-only", children: "Close modal" }) }) })
|
|
150
173
|
]
|
|
151
174
|
}
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
function
|
|
155
|
-
const
|
|
156
|
-
document.body.appendChild(
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
},
|
|
160
|
-
const [
|
|
161
|
-
|
|
162
|
-
},
|
|
175
|
+
) : null;
|
|
176
|
+
});
|
|
177
|
+
function y(e) {
|
|
178
|
+
const s = document.createElement("div");
|
|
179
|
+
document.body.appendChild(s);
|
|
180
|
+
const d = Te(s), l = () => {
|
|
181
|
+
d.unmount(), s.parentNode && s.parentNode.removeChild(s);
|
|
182
|
+
}, c = () => {
|
|
183
|
+
const { locale: r } = oe(), [i, $] = B.useState(!0), [m, b] = B.useState(!1), v = () => {
|
|
184
|
+
$(!1), setTimeout(l, 300);
|
|
185
|
+
}, n = async () => {
|
|
163
186
|
if (e.onOk) {
|
|
164
|
-
|
|
187
|
+
b(!0);
|
|
165
188
|
try {
|
|
166
|
-
await e.onOk(),
|
|
189
|
+
await e.onOk(), v();
|
|
167
190
|
} catch {
|
|
168
|
-
|
|
191
|
+
b(!1);
|
|
169
192
|
}
|
|
170
193
|
} else
|
|
171
|
-
|
|
172
|
-
},
|
|
173
|
-
e.onCancel?.(),
|
|
174
|
-
},
|
|
194
|
+
v();
|
|
195
|
+
}, w = () => {
|
|
196
|
+
e.onCancel?.(), v();
|
|
197
|
+
}, u = () => {
|
|
175
198
|
switch (e.type) {
|
|
176
199
|
case "success":
|
|
177
|
-
return
|
|
200
|
+
return je;
|
|
178
201
|
case "warning":
|
|
179
|
-
return
|
|
202
|
+
return We;
|
|
180
203
|
case "error":
|
|
181
|
-
return
|
|
204
|
+
return Oe;
|
|
182
205
|
case "info":
|
|
183
206
|
default:
|
|
184
|
-
return
|
|
207
|
+
return Ee;
|
|
185
208
|
}
|
|
186
|
-
},
|
|
209
|
+
}, L = () => {
|
|
187
210
|
switch (e.type) {
|
|
188
211
|
case "success":
|
|
189
212
|
return /* @__PURE__ */ t(
|
|
@@ -267,38 +290,38 @@ function k(e) {
|
|
|
267
290
|
}
|
|
268
291
|
);
|
|
269
292
|
}
|
|
270
|
-
},
|
|
271
|
-
return /* @__PURE__ */
|
|
272
|
-
|
|
293
|
+
}, R = e.type === "warning" || e.type === "error", a = e.okText ?? r.Modal?.okText ?? "OK", h = e.cancelText ?? r.Modal?.cancelText ?? "Cancel";
|
|
294
|
+
return /* @__PURE__ */ f(
|
|
295
|
+
ne,
|
|
273
296
|
{
|
|
274
|
-
open:
|
|
275
|
-
onOk: e.showCancel ? void 0 :
|
|
276
|
-
onCancel:
|
|
277
|
-
alertDialog:
|
|
278
|
-
title: e.type ? /* @__PURE__ */
|
|
279
|
-
|
|
297
|
+
open: i,
|
|
298
|
+
onOk: e.showCancel ? void 0 : n,
|
|
299
|
+
onCancel: w,
|
|
300
|
+
alertDialog: R,
|
|
301
|
+
title: e.type ? /* @__PURE__ */ f("div", { className: `${Ae} ${u()}`, children: [
|
|
302
|
+
L(),
|
|
280
303
|
/* @__PURE__ */ t("div", { children: e.title && /* @__PURE__ */ t("h3", { className: "font-bold", children: e.title }) })
|
|
281
304
|
] }) : e.title,
|
|
282
|
-
okText:
|
|
283
|
-
cancelText:
|
|
284
|
-
footer: e.showCancel ? /* @__PURE__ */
|
|
285
|
-
/* @__PURE__ */ t("button", { className:
|
|
305
|
+
okText: a,
|
|
306
|
+
cancelText: h,
|
|
307
|
+
footer: e.showCancel ? /* @__PURE__ */ f(Ce, { children: [
|
|
308
|
+
/* @__PURE__ */ t("button", { className: x, onClick: w, children: h }),
|
|
286
309
|
/* @__PURE__ */ t(
|
|
287
310
|
"button",
|
|
288
311
|
{
|
|
289
|
-
className: `${
|
|
290
|
-
onClick:
|
|
291
|
-
disabled:
|
|
292
|
-
children:
|
|
312
|
+
className: `${x} ${e.type === "error" ? te : W} ${m ? "loading" : ""}`,
|
|
313
|
+
onClick: n,
|
|
314
|
+
disabled: m,
|
|
315
|
+
children: a
|
|
293
316
|
}
|
|
294
317
|
)
|
|
295
318
|
] }) : /* @__PURE__ */ t(
|
|
296
319
|
"button",
|
|
297
320
|
{
|
|
298
|
-
className: `${
|
|
299
|
-
onClick:
|
|
300
|
-
disabled:
|
|
301
|
-
children:
|
|
321
|
+
className: `${x} ${e.type === "error" ? te : W} ${m ? "loading" : ""}`,
|
|
322
|
+
onClick: n,
|
|
323
|
+
disabled: m,
|
|
324
|
+
children: a
|
|
302
325
|
}
|
|
303
326
|
),
|
|
304
327
|
children: [
|
|
@@ -308,31 +331,32 @@ function k(e) {
|
|
|
308
331
|
}
|
|
309
332
|
);
|
|
310
333
|
};
|
|
311
|
-
return
|
|
334
|
+
return d.render(/* @__PURE__ */ t(c, {})), {
|
|
312
335
|
destroy: l
|
|
313
336
|
};
|
|
314
337
|
}
|
|
315
|
-
function
|
|
316
|
-
return
|
|
338
|
+
function Ie(e) {
|
|
339
|
+
return y({ ...e, showCancel: !0 });
|
|
317
340
|
}
|
|
318
|
-
function
|
|
319
|
-
return
|
|
341
|
+
function ze(e) {
|
|
342
|
+
return y({ ...e, type: "info", showCancel: !1 });
|
|
320
343
|
}
|
|
321
|
-
function
|
|
322
|
-
return
|
|
344
|
+
function De(e) {
|
|
345
|
+
return y({ ...e, type: "success", showCancel: !1 });
|
|
323
346
|
}
|
|
324
|
-
function
|
|
325
|
-
return
|
|
347
|
+
function Pe(e) {
|
|
348
|
+
return y({ ...e, type: "warning", showCancel: !1 });
|
|
326
349
|
}
|
|
327
|
-
function
|
|
328
|
-
return
|
|
350
|
+
function He(e) {
|
|
351
|
+
return y({ ...e, type: "error", showCancel: !1 });
|
|
329
352
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
353
|
+
const g = ne;
|
|
354
|
+
g.confirm = Ie;
|
|
355
|
+
g.info = ze;
|
|
356
|
+
g.success = De;
|
|
357
|
+
g.warning = Pe;
|
|
358
|
+
g.error = He;
|
|
335
359
|
export {
|
|
336
|
-
|
|
360
|
+
g as Modal
|
|
337
361
|
};
|
|
338
362
|
//# sourceMappingURL=Modal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId } from 'react'\nimport { createRoot } from 'react-dom/client'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nexport function Modal({\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText = 'OK',\n cancelText = 'Cancel',\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n initialFocus,\n alertDialog = false,\n className = '',\n ...rest\n}: ModalProps) {\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [loading, setLoading] = React.useState(false)\n const titleId = useId()\n const contentId = useId()\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n }\n }\n }, [open, initialFocus])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [\n dModal,\n ...getPositionClasses(),\n align && alignClasses[align],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n setLoading(true)\n try {\n await onOk()\n setLoading(false)\n } catch (error) {\n setLoading(false)\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n data-state={open ? 'open' : 'closed'}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\">\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\">\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button ref={cancelButtonRef} className={dBtn} onClick={onCancel}>\n {cancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n aria-busy={loading || undefined}\n >\n {okText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop}>\n <button ref={closeButtonRef} onClick={handleBackdropClick}>\n <span className=\"sr-only\">Close modal</span>\n </button>\n </form>\n )}\n </dialog>\n )\n}\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>\n {config.title && <h3 className=\"font-bold\">{config.title}</h3>}\n </div>\n </div>\n ) : (\n config.title\n )\n }\n okText={config.okText}\n cancelText={config.cancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {config.cancelText || 'Cancel'}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {config.okText || 'OK'}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {config.okText || 'OK'}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nModal.confirm = confirm\nModal.info = info\nModal.success = success\nModal.warning = warning\nModal.error = error\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","initialFocus","alertDialog","className","rest","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","loading","setLoading","React","titleId","useId","contentId","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.js","sources":["../../src/components/Modal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useId, forwardRef, useImperativeHandle } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dModal = 'd-modal'\nconst dModalTop = 'd-modal-top'\nconst dModalMiddle = 'd-modal-middle'\nconst dModalBottom = 'd-modal-bottom'\nconst dModalStart = 'd-modal-start'\nconst dModalEnd = 'd-modal-end'\nconst dModalBox = 'd-modal-box'\nconst dModalAction = 'd-modal-action'\nconst dModalBackdrop = 'd-modal-backdrop'\nconst dBtn = 'd-btn'\nconst dBtnPrimary = 'd-btn-primary'\nconst dBtnError = 'd-btn-error'\nconst dAlert = 'd-alert'\nconst dAlertInfo = 'd-alert-info'\nconst dAlertSuccess = 'd-alert-success'\nconst dAlertWarning = 'd-alert-warning'\nconst dAlertError = 'd-alert-error'\n\nexport type ModalPosition = 'top' | 'middle' | 'bottom'\nexport type ModalAlign = 'start' | 'end'\nexport type Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport type ResponsivePosition = Partial<Record<Breakpoint, ModalPosition>>\n\nexport interface ModalProps extends Omit<React.HTMLAttributes<HTMLDialogElement>, 'title'> {\n children: React.ReactNode\n title?: React.ReactNode\n footer?: React.ReactNode\n open?: boolean\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n maskClosable?: boolean\n closable?: boolean\n /** Modal position - can be a single value or responsive object */\n position?: ModalPosition | ResponsivePosition\n align?: ModalAlign\n /** Width of the modal box */\n width?: number | string\n /** Center the modal vertically */\n centered?: boolean\n /** Callback when modal is closed */\n onClose?: () => void\n /** Callback after modal close animation completes */\n afterClose?: () => void\n /** Where to place initial focus: 'ok', 'cancel', or 'close' button */\n initialFocus?: 'ok' | 'cancel' | 'close'\n /** Use alertdialog role for urgent messages */\n alertDialog?: boolean\n /** Show loading spinner on OK button */\n confirmLoading?: boolean\n /** Props for the OK button */\n okButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Props for the Cancel button */\n cancelButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement>\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** CSS z-index for the modal */\n zIndex?: number\n /** Destroy child components when modal is closed */\n destroyOnClose?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface ModalFuncProps {\n title?: React.ReactNode\n content?: React.ReactNode\n onOk?: () => void | Promise<void>\n onCancel?: () => void\n okText?: string\n cancelText?: string\n type?: 'info' | 'success' | 'warning' | 'error'\n}\n\nconst Modal = forwardRef<HTMLDialogElement, ModalProps>(function Modal(\n {\n children,\n title,\n footer,\n open = false,\n onOk,\n onCancel,\n okText,\n cancelText,\n maskClosable = true,\n closable = true,\n position,\n align,\n width,\n centered,\n onClose,\n afterClose,\n initialFocus,\n alertDialog = false,\n confirmLoading,\n okButtonProps,\n cancelButtonProps,\n closeIcon,\n zIndex,\n destroyOnClose = false,\n 'data-testid': testId,\n className = '',\n style,\n ...rest\n },\n ref\n) {\n const { locale } = useConfig()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const okButtonRef = useRef<HTMLButtonElement>(null)\n const cancelButtonRef = useRef<HTMLButtonElement>(null)\n const closeButtonRef = useRef<HTMLButtonElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n const [internalLoading, setInternalLoading] = React.useState(false)\n const [shouldRender, setShouldRender] = React.useState(open || !destroyOnClose)\n const titleId = useId()\n const contentId = useId()\n\n // Use external confirmLoading if provided, otherwise internal state\n const loading = confirmLoading ?? internalLoading\n\n // Resolve locale strings\n const resolvedOkText = okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n // Forward ref\n useImperativeHandle(ref, () => dialogRef.current!, [])\n\n // Handle close - use onClose if provided, otherwise onCancel\n const closeHandler = onClose || onCancel\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n if (open) {\n setShouldRender(true)\n if (!dialog.open) {\n // Save currently focused element for restoration\n previousActiveElement.current = document.activeElement as HTMLElement\n dialog.showModal()\n\n // Handle custom initial focus placement\n if (initialFocus) {\n setTimeout(() => {\n switch (initialFocus) {\n case 'ok':\n okButtonRef.current?.focus()\n break\n case 'cancel':\n cancelButtonRef.current?.focus()\n break\n case 'close':\n closeButtonRef.current?.focus()\n break\n }\n }, 0)\n }\n }\n } else {\n if (dialog.open) {\n dialog.close()\n // Restore focus to previously focused element\n previousActiveElement.current?.focus()\n // Call afterClose after animation\n if (afterClose) {\n setTimeout(afterClose, 300)\n }\n // Handle destroyOnClose\n if (destroyOnClose) {\n setTimeout(() => setShouldRender(false), 300)\n }\n }\n }\n }, [open, initialFocus, afterClose, destroyOnClose])\n\n useEffect(() => {\n const dialog = dialogRef.current\n if (!dialog) return\n\n const onDialogClose = () => {\n closeHandler?.()\n }\n\n dialog.addEventListener('close', onDialogClose)\n return () => {\n dialog.removeEventListener('close', onDialogClose)\n }\n }, [closeHandler])\n\n // Static class mappings for positions (no interpolation per qa.md)\n const positionClasses: Record<ModalPosition, string> = {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n }\n\n // Responsive position class mappings for each breakpoint\n const responsivePositionClasses: Record<Breakpoint, Record<ModalPosition, string>> = {\n base: {\n top: dModalTop,\n middle: dModalMiddle,\n bottom: dModalBottom,\n },\n sm: {\n top: 'sm:modal-top',\n middle: 'sm:modal-middle',\n bottom: 'sm:modal-bottom',\n },\n md: {\n top: 'md:modal-top',\n middle: 'md:modal-middle',\n bottom: 'md:modal-bottom',\n },\n lg: {\n top: 'lg:modal-top',\n middle: 'lg:modal-middle',\n bottom: 'lg:modal-bottom',\n },\n xl: {\n top: 'xl:modal-top',\n middle: 'xl:modal-middle',\n bottom: 'xl:modal-bottom',\n },\n '2xl': {\n top: '2xl:modal-top',\n middle: '2xl:modal-middle',\n bottom: '2xl:modal-bottom',\n },\n }\n\n const alignClasses: Record<ModalAlign, string> = {\n start: dModalStart,\n end: dModalEnd,\n }\n\n // Build position classes - handle both simple and responsive values\n const getPositionClasses = (): string[] => {\n // centered is an alias for position=\"middle\"\n if (centered) {\n return [positionClasses.middle]\n }\n\n if (!position) {\n return []\n }\n\n // Simple string position\n if (typeof position === 'string') {\n return [positionClasses[position]]\n }\n\n // Responsive object position\n const classes: string[] = []\n for (const [breakpoint, pos] of Object.entries(position) as [Breakpoint, ModalPosition][]) {\n if (pos) {\n classes.push(responsivePositionClasses[breakpoint][pos])\n }\n }\n return classes\n }\n\n const classes = [dModal, ...getPositionClasses(), align && alignClasses[align], className]\n .filter(Boolean)\n .join(' ')\n\n const handleOk = async () => {\n if (onOk) {\n if (confirmLoading === undefined) {\n setInternalLoading(true)\n }\n try {\n await onOk()\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n } catch (error) {\n if (confirmLoading === undefined) {\n setInternalLoading(false)\n }\n throw error\n }\n }\n }\n\n const handleBackdropClick = () => {\n if (maskClosable && closeHandler) {\n closeHandler()\n }\n }\n\n // Calculate modal-box style for custom width\n const modalBoxStyle: React.CSSProperties = width\n ? { width: typeof width === 'number' ? `${width}px` : width, maxWidth: '90vw' }\n : {}\n\n // Calculate dialog style for zIndex\n const dialogStyle: React.CSSProperties = {\n ...style,\n ...(zIndex !== undefined ? { zIndex } : {}),\n }\n\n // Render default footer if no custom footer provided and either onOk or onCancel exists\n const shouldRenderDefaultFooter = !footer && (onOk || onCancel)\n const shouldRenderCustomFooter = footer !== null && footer !== undefined\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n if (!shouldRender) {\n return null\n }\n\n return (\n <dialog\n ref={dialogRef}\n role={alertDialog ? 'alertdialog' : 'dialog'}\n aria-modal=\"true\"\n className={classes}\n style={dialogStyle}\n data-state={open ? 'open' : 'closed'}\n data-testid={testId}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={contentId}\n {...rest}\n >\n <div className={dModalBox} style={modalBoxStyle}>\n {title && (\n <h3 id={titleId} className=\"text-lg font-bold mb-4\" data-testid={getTestId('title')}>\n {title}\n </h3>\n )}\n <div id={contentId} className=\"py-4\" data-testid={getTestId('content')}>\n {children}\n </div>\n {shouldRenderDefaultFooter && (\n <div className={dModalAction}>\n {onCancel && (\n <button\n ref={cancelButtonRef}\n className={dBtn}\n onClick={onCancel}\n data-testid={getTestId('cancel-button')}\n {...cancelButtonProps}\n >\n {resolvedCancelText}\n </button>\n )}\n {onOk && (\n <button\n ref={okButtonRef}\n className={`${dBtn} ${dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading || okButtonProps?.disabled}\n aria-busy={loading || undefined}\n data-testid={getTestId('ok-button')}\n {...okButtonProps}\n >\n {resolvedOkText}\n </button>\n )}\n </div>\n )}\n {shouldRenderCustomFooter && <div className={dModalAction}>{footer}</div>}\n </div>\n {closable && maskClosable && (\n <form method=\"dialog\" className={dModalBackdrop} data-testid={getTestId('backdrop')}>\n <button ref={closeButtonRef} onClick={handleBackdropClick} data-testid={getTestId('close-button')}>\n {closeIcon || <span className=\"sr-only\">Close modal</span>}\n </button>\n </form>\n )}\n </dialog>\n )\n})\n\nfunction createModal(config: ModalFuncProps & { showCancel?: boolean }) {\n const div = document.createElement('div')\n document.body.appendChild(div)\n const root = createRoot(div)\n\n const destroy = () => {\n root.unmount()\n if (div.parentNode) {\n div.parentNode.removeChild(div)\n }\n }\n\n const ModalContent = () => {\n const { locale } = useConfig()\n const [open, setOpen] = React.useState(true)\n const [loading, setLoading] = React.useState(false)\n\n const handleClose = () => {\n setOpen(false)\n setTimeout(destroy, 300) // Wait for animation\n }\n\n const handleOk = async () => {\n if (config.onOk) {\n setLoading(true)\n try {\n await config.onOk()\n handleClose()\n } catch (error) {\n setLoading(false)\n }\n } else {\n handleClose()\n }\n }\n\n const handleCancel = () => {\n config.onCancel?.()\n handleClose()\n }\n\n const getAlertClass = () => {\n switch (config.type) {\n case 'success':\n return dAlertSuccess\n case 'warning':\n return dAlertWarning\n case 'error':\n return dAlertError\n case 'info':\n default:\n return dAlertInfo\n }\n }\n\n const getIcon = () => {\n switch (config.type) {\n case 'success':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'warning':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )\n case 'error':\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"stroke-current shrink-0 h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n )\n case 'info':\n default:\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className=\"stroke-current shrink-0 w-6 h-6\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n ></path>\n </svg>\n )\n }\n }\n\n // Use alertdialog role for warning/error types\n const isAlert = config.type === 'warning' || config.type === 'error'\n\n // Resolve locale strings\n const resolvedOkText = config.okText ?? locale.Modal?.okText ?? 'OK'\n const resolvedCancelText = config.cancelText ?? locale.Modal?.cancelText ?? 'Cancel'\n\n return (\n <Modal\n open={open}\n onOk={config.showCancel ? undefined : handleOk}\n onCancel={handleCancel}\n alertDialog={isAlert}\n title={\n config.type ? (\n <div className={`${dAlert} ${getAlertClass()}`}>\n {getIcon()}\n <div>{config.title && <h3 className=\"font-bold\">{config.title}</h3>}</div>\n </div>\n ) : (\n config.title\n )\n }\n okText={resolvedOkText}\n cancelText={resolvedCancelText}\n footer={\n config.showCancel ? (\n <>\n <button className={dBtn} onClick={handleCancel}>\n {resolvedCancelText}\n </button>\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n </>\n ) : (\n <button\n className={`${dBtn} ${config.type === 'error' ? dBtnError : dBtnPrimary} ${loading ? 'loading' : ''}`}\n onClick={handleOk}\n disabled={loading}\n >\n {resolvedOkText}\n </button>\n )\n }\n >\n {config.type && config.content && <div className=\"text-sm\">{config.content}</div>}\n {!config.type && config.content}\n </Modal>\n )\n }\n\n root.render(<ModalContent />)\n\n return {\n destroy,\n }\n}\n\nfunction confirm(config: ModalFuncProps) {\n return createModal({ ...config, showCancel: true })\n}\n\nfunction info(config: ModalFuncProps) {\n return createModal({ ...config, type: 'info', showCancel: false })\n}\n\nfunction success(config: ModalFuncProps) {\n return createModal({ ...config, type: 'success', showCancel: false })\n}\n\nfunction warning(config: ModalFuncProps) {\n return createModal({ ...config, type: 'warning', showCancel: false })\n}\n\nfunction error(config: ModalFuncProps) {\n return createModal({ ...config, type: 'error', showCancel: false })\n}\n\nconst ModalWithStatics = Modal as typeof Modal & {\n confirm: typeof confirm\n info: typeof info\n success: typeof success\n warning: typeof warning\n error: typeof error\n}\n\nModalWithStatics.confirm = confirm\nModalWithStatics.info = info\nModalWithStatics.success = success\nModalWithStatics.warning = warning\nModalWithStatics.error = error\n\nexport { ModalWithStatics as Modal }\n"],"names":["dModal","dModalTop","dModalMiddle","dModalBottom","dModalStart","dModalEnd","dModalBox","dModalAction","dModalBackdrop","dBtn","dBtnPrimary","dBtnError","dAlert","dAlertInfo","dAlertSuccess","dAlertWarning","dAlertError","Modal","forwardRef","children","title","footer","open","onOk","onCancel","okText","cancelText","maskClosable","closable","position","align","width","centered","onClose","afterClose","initialFocus","alertDialog","confirmLoading","okButtonProps","cancelButtonProps","closeIcon","zIndex","destroyOnClose","testId","className","style","rest","ref","locale","useConfig","dialogRef","useRef","okButtonRef","cancelButtonRef","closeButtonRef","previousActiveElement","internalLoading","setInternalLoading","React","shouldRender","setShouldRender","titleId","useId","contentId","loading","resolvedOkText","resolvedCancelText","useImperativeHandle","closeHandler","useEffect","dialog","onDialogClose","positionClasses","responsivePositionClasses","alignClasses","classes","breakpoint","pos","handleOk","error","handleBackdropClick","modalBoxStyle","dialogStyle","shouldRenderDefaultFooter","shouldRenderCustomFooter","getTestId","suffix","jsxs","jsx","createModal","config","div","root","createRoot","destroy","ModalContent","setOpen","setLoading","handleClose","handleCancel","getAlertClass","getIcon","isAlert","Fragment","confirm","info","success","warning","ModalWithStatics"],"mappings":"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"}
|