@turinhub/atomix-common-ui 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +50 -17
  2. package/dist/AuthPanel-C_2JBE7t.cjs +2 -0
  3. package/dist/AuthPanel-C_2JBE7t.cjs.map +1 -0
  4. package/dist/AuthPanel-D2HFX8eN.js +656 -0
  5. package/dist/AuthPanel-D2HFX8eN.js.map +1 -0
  6. package/dist/PDFSidebar-BBtucLK6.js +232 -0
  7. package/dist/PDFSidebar-BBtucLK6.js.map +1 -0
  8. package/dist/PDFSidebar-Di0D-yPS.cjs +2 -0
  9. package/dist/PDFSidebar-Di0D-yPS.cjs.map +1 -0
  10. package/dist/auth.cjs +2 -0
  11. package/dist/auth.cjs.map +1 -0
  12. package/dist/auth.d.ts +11 -0
  13. package/dist/auth.d.ts.map +1 -0
  14. package/dist/auth.js +9 -0
  15. package/dist/auth.js.map +1 -0
  16. package/dist/component-types.cjs +2 -0
  17. package/dist/component-types.cjs.map +1 -0
  18. package/dist/component-types.d.ts +2 -0
  19. package/dist/component-types.d.ts.map +1 -0
  20. package/dist/component-types.js +2 -0
  21. package/dist/component-types.js.map +1 -0
  22. package/dist/components/AuthLoginPanel.d.ts +55 -0
  23. package/dist/components/AuthLoginPanel.d.ts.map +1 -0
  24. package/dist/components/AuthPageShell.d.ts +11 -0
  25. package/dist/components/AuthPageShell.d.ts.map +1 -0
  26. package/dist/components/AuthPanel.d.ts +20 -0
  27. package/dist/components/AuthPanel.d.ts.map +1 -0
  28. package/dist/components/AuthRegisterPanel.d.ts +34 -0
  29. package/dist/components/AuthRegisterPanel.d.ts.map +1 -0
  30. package/dist/components/AuthVisualCarousel.d.ts +20 -0
  31. package/dist/components/AuthVisualCarousel.d.ts.map +1 -0
  32. package/dist/components/DataTable.d.ts +2 -2
  33. package/dist/components/DataTable.d.ts.map +1 -1
  34. package/dist/components/ImageReader.d.ts +44 -0
  35. package/dist/components/ImageReader.d.ts.map +1 -0
  36. package/dist/components/MarkdownReader.d.ts +26 -0
  37. package/dist/components/MarkdownReader.d.ts.map +1 -0
  38. package/dist/components/PDFReader.d.ts +2 -2
  39. package/dist/components/PDFReader.d.ts.map +1 -1
  40. package/dist/components/PDFSidebar.d.ts +1 -1
  41. package/dist/components/PDFSidebar.d.ts.map +1 -1
  42. package/dist/components/SimplePDFReader.d.ts +1 -1
  43. package/dist/components/VideoReader.d.ts +39 -0
  44. package/dist/components/VideoReader.d.ts.map +1 -0
  45. package/dist/components/media-utils.d.ts +9 -0
  46. package/dist/components/media-utils.d.ts.map +1 -0
  47. package/dist/data-table.cjs +2 -0
  48. package/dist/data-table.cjs.map +1 -0
  49. package/dist/data-table.d.ts +3 -0
  50. package/dist/data-table.d.ts.map +1 -0
  51. package/dist/data-table.js +169 -0
  52. package/dist/data-table.js.map +1 -0
  53. package/dist/delete-confirm-dialog.cjs +2 -0
  54. package/dist/delete-confirm-dialog.cjs.map +1 -0
  55. package/dist/delete-confirm-dialog.d.ts +3 -0
  56. package/dist/delete-confirm-dialog.d.ts.map +1 -0
  57. package/dist/delete-confirm-dialog.js +109 -0
  58. package/dist/delete-confirm-dialog.js.map +1 -0
  59. package/dist/file-upload.cjs +2 -0
  60. package/dist/file-upload.cjs.map +1 -0
  61. package/dist/file-upload.d.ts +3 -0
  62. package/dist/file-upload.d.ts.map +1 -0
  63. package/dist/file-upload.js +354 -0
  64. package/dist/file-upload.js.map +1 -0
  65. package/dist/image-reader.cjs +2 -0
  66. package/dist/image-reader.cjs.map +1 -0
  67. package/dist/image-reader.d.ts +3 -0
  68. package/dist/image-reader.d.ts.map +1 -0
  69. package/dist/image-reader.js +214 -0
  70. package/dist/image-reader.js.map +1 -0
  71. package/dist/index.cjs +2 -0
  72. package/dist/index.cjs.map +1 -0
  73. package/dist/index.d.ts +10 -20
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +8 -12
  76. package/dist/index.js.map +1 -1
  77. package/dist/jsx-runtime-B4hRZ52C.js +283 -0
  78. package/dist/jsx-runtime-B4hRZ52C.js.map +1 -0
  79. package/dist/jsx-runtime-BB_1_6y_.cjs +23 -0
  80. package/dist/jsx-runtime-BB_1_6y_.cjs.map +1 -0
  81. package/dist/markdown-reader.cjs +2 -0
  82. package/dist/markdown-reader.cjs.map +1 -0
  83. package/dist/markdown-reader.d.ts +3 -0
  84. package/dist/markdown-reader.d.ts.map +1 -0
  85. package/dist/markdown-reader.js +145 -0
  86. package/dist/markdown-reader.js.map +1 -0
  87. package/dist/media-utils-5UPuocc1.js +23 -0
  88. package/dist/media-utils-5UPuocc1.js.map +1 -0
  89. package/dist/media-utils-X1dDYP9W.cjs +2 -0
  90. package/dist/media-utils-X1dDYP9W.cjs.map +1 -0
  91. package/dist/pdf-reader.cjs +2 -0
  92. package/dist/pdf-reader.cjs.map +1 -0
  93. package/dist/pdf-reader.d.ts +3 -0
  94. package/dist/pdf-reader.d.ts.map +1 -0
  95. package/dist/pdf-reader.js +427 -0
  96. package/dist/pdf-reader.js.map +1 -0
  97. package/dist/pdf-sidebar.cjs +2 -0
  98. package/dist/pdf-sidebar.cjs.map +1 -0
  99. package/dist/pdf-sidebar.d.ts +3 -0
  100. package/dist/pdf-sidebar.d.ts.map +1 -0
  101. package/dist/pdf-sidebar.js +5 -0
  102. package/dist/pdf-sidebar.js.map +1 -0
  103. package/dist/simple-pdf-reader.cjs +2 -0
  104. package/dist/simple-pdf-reader.cjs.map +1 -0
  105. package/dist/simple-pdf-reader.d.ts +3 -0
  106. package/dist/simple-pdf-reader.d.ts.map +1 -0
  107. package/dist/simple-pdf-reader.js +268 -0
  108. package/dist/simple-pdf-reader.js.map +1 -0
  109. package/dist/table-header.cjs +2 -0
  110. package/dist/table-header.cjs.map +1 -0
  111. package/dist/table-header.d.ts +3 -0
  112. package/dist/table-header.d.ts.map +1 -0
  113. package/dist/table-header.js +63 -0
  114. package/dist/table-header.js.map +1 -0
  115. package/dist/table-pagination.cjs +2 -0
  116. package/dist/table-pagination.cjs.map +1 -0
  117. package/dist/table-pagination.d.ts +3 -0
  118. package/dist/table-pagination.d.ts.map +1 -0
  119. package/dist/table-pagination.js +172 -0
  120. package/dist/table-pagination.js.map +1 -0
  121. package/dist/theme-switcher-content.cjs +2 -0
  122. package/dist/theme-switcher-content.cjs.map +1 -0
  123. package/dist/theme-switcher-content.d.ts +3 -0
  124. package/dist/theme-switcher-content.d.ts.map +1 -0
  125. package/dist/theme-switcher-content.js +103 -0
  126. package/dist/theme-switcher-content.js.map +1 -0
  127. package/dist/theme-switcher.cjs +2 -0
  128. package/dist/theme-switcher.cjs.map +1 -0
  129. package/dist/theme-switcher.d.ts +3 -0
  130. package/dist/theme-switcher.d.ts.map +1 -0
  131. package/dist/theme-switcher.js +140 -0
  132. package/dist/theme-switcher.js.map +1 -0
  133. package/dist/types/component-types.d.ts +1 -0
  134. package/dist/types/component-types.d.ts.map +1 -1
  135. package/dist/utils-B6yFEsav.js +9 -0
  136. package/dist/utils-B6yFEsav.js.map +1 -0
  137. package/dist/utils-IjLH3w2e.cjs +2 -0
  138. package/dist/utils-IjLH3w2e.cjs.map +1 -0
  139. package/dist/utils.cjs +2 -0
  140. package/dist/utils.cjs.map +1 -0
  141. package/dist/utils.d.ts +2 -0
  142. package/dist/utils.d.ts.map +1 -0
  143. package/dist/utils.js +5 -0
  144. package/dist/utils.js.map +1 -0
  145. package/dist/video-reader.cjs +2 -0
  146. package/dist/video-reader.cjs.map +1 -0
  147. package/dist/video-reader.d.ts +3 -0
  148. package/dist/video-reader.d.ts.map +1 -0
  149. package/dist/video-reader.js +158 -0
  150. package/dist/video-reader.js.map +1 -0
  151. package/package.json +191 -3
  152. package/dist/index-DJdfLA8M.js +0 -2140
  153. package/dist/index-DJdfLA8M.js.map +0 -1
  154. package/dist/index-DUxYhmkV.js +0 -18821
  155. package/dist/index-DUxYhmkV.js.map +0 -1
  156. package/dist/index-miejqTjn.cjs +0 -13
  157. package/dist/index-miejqTjn.cjs.map +0 -1
  158. package/dist/index-tIca-Q_M.cjs +0 -23
  159. package/dist/index-tIca-Q_M.cjs.map +0 -1
  160. package/dist/index.c.js +0 -2
  161. package/dist/index.c.js.map +0 -1
@@ -0,0 +1,656 @@
1
+ import { j as e } from "./jsx-runtime-B4hRZ52C.js";
2
+ import { c as v } from "./utils-B6yFEsav.js";
3
+ import { useState as n, useMemo as fe, useEffect as re } from "react";
4
+ import { Layers3 as ie, MessageCircle as oe, Loader2 as W, ArrowRight as te, UserRound as de, LockKeyhole as ae } from "lucide-react";
5
+ const be = (s) => /^1[3-9]\d{9}$/.test(s) ? void 0 : "请输入正确的手机号", se = (s, c) => s instanceof Error && s.message ? s.message : typeof s == "string" && s ? s : c, ge = (s) => s.replace(/\D/g, "").slice(0, 11), je = (s) => s.length <= 3 ? s : s.length <= 7 ? `${s.slice(0, 3)} ${s.slice(3)}` : `${s.slice(0, 3)} ${s.slice(3, 7)} ${s.slice(7)}`;
6
+ function we({
7
+ components: s,
8
+ title: c = "欢迎登录",
9
+ description: p = "使用账号密码或手机号验证码进入系统",
10
+ brandIcon: f,
11
+ defaultMethod: d = "password",
12
+ enabledMethods: m = ["password", "sms"],
13
+ error: A,
14
+ extraActions: k,
15
+ footer: u,
16
+ socialProviders: b,
17
+ className: j,
18
+ smsCountdownSeconds: w = 60,
19
+ validatePhone: x = be,
20
+ validatePassword: h,
21
+ onPasswordLogin: N,
22
+ onSendSmsCode: F,
23
+ onSmsLogin: $
24
+ }) {
25
+ const [q, t] = n(
26
+ m.includes(d) ? d : m[0]
27
+ ), [r, X] = n(""), [Y, Z] = n(), [_, K] = n(), [R, g] = n(), [T, U] = n(!1), [V, H] = n(!1), [O, E] = n(!1), [D, G] = n(0), I = fe(
28
+ () => m.filter(
29
+ (a, o, C) => C.indexOf(a) === o
30
+ ),
31
+ [m]
32
+ ), z = I.length > 1, S = R || A;
33
+ if (re(() => {
34
+ if (D <= 0) return;
35
+ const a = setTimeout(() => G((o) => o - 1), 1e3);
36
+ return () => clearTimeout(a);
37
+ }, [D]), !s)
38
+ return /* @__PURE__ */ e.jsx("div", { className: "p-4 text-center text-destructive", children: "错误:请通过 components prop 注入 UI 组件" });
39
+ const { Button: M, Input: L, Label: B, Tabs: l, TabsList: i, TabsTrigger: y, TabsContent: J } = s, P = async (a) => {
40
+ a.preventDefault();
41
+ const o = new FormData(a.currentTarget), C = {
42
+ username: String(o.get("username") || "").trim(),
43
+ password: String(o.get("password") || "")
44
+ }, Q = !C.username || !C.password ? "请输入账号和密码" : h == null ? void 0 : h(C);
45
+ if (Q) {
46
+ g(Q);
47
+ return;
48
+ }
49
+ try {
50
+ U(!0), g(void 0), await (N == null ? void 0 : N(C));
51
+ } catch (ee) {
52
+ g(se(ee, "登录失败,请稍后重试"));
53
+ } finally {
54
+ U(!1);
55
+ }
56
+ }, me = async () => {
57
+ const a = x(r);
58
+ if (a) {
59
+ g(a);
60
+ return;
61
+ }
62
+ try {
63
+ E(!0), g(void 0);
64
+ const o = await (F == null ? void 0 : F(r));
65
+ Z(o == null ? void 0 : o.smsId), K(o == null ? void 0 : o.smsType), G(w);
66
+ } catch (o) {
67
+ g(se(o, "发送验证码失败,请稍后重试"));
68
+ } finally {
69
+ E(!1);
70
+ }
71
+ }, ue = async (a) => {
72
+ a.preventDefault();
73
+ const o = new FormData(a.currentTarget), C = String(o.get("code") || "").trim(), Q = x(r);
74
+ if (Q) {
75
+ g(Q);
76
+ return;
77
+ }
78
+ if (!C) {
79
+ g("请输入验证码");
80
+ return;
81
+ }
82
+ try {
83
+ H(!0), g(void 0), await ($ == null ? void 0 : $({ phone: r, code: C, smsId: Y, smsType: _ }));
84
+ } catch (ee) {
85
+ g(se(ee, "验证码错误或已过期"));
86
+ } finally {
87
+ H(!1);
88
+ }
89
+ }, he = () => /* @__PURE__ */ e.jsxs("div", { className: "mb-7", children: [
90
+ /* @__PURE__ */ e.jsx("div", { className: "mb-4 flex h-11 w-11 items-center justify-center rounded-lg bg-primary text-primary-foreground shadow-sm", children: f || /* @__PURE__ */ e.jsx(ie, { className: "h-5 w-5" }) }),
91
+ /* @__PURE__ */ e.jsx("h1", { className: "text-2xl font-semibold", children: c }),
92
+ p && /* @__PURE__ */ e.jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: p })
93
+ ] }), xe = () => b != null && b.length ? /* @__PURE__ */ e.jsx("div", { className: "mb-6 grid gap-2", children: b.map((a) => /* @__PURE__ */ e.jsxs(
94
+ M,
95
+ {
96
+ type: "button",
97
+ variant: "outline",
98
+ className: "h-10 w-full",
99
+ disabled: a.disabled,
100
+ onClick: a.onClick,
101
+ children: [
102
+ a.icon && /* @__PURE__ */ e.jsx("span", { className: "mr-2 inline-flex h-4 w-4 items-center justify-center", children: a.icon }),
103
+ a.label
104
+ ]
105
+ },
106
+ a.id
107
+ )) }) : null, le = () => /* @__PURE__ */ e.jsx("form", { className: "flex flex-col", onSubmit: P, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-4", children: [
108
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
109
+ /* @__PURE__ */ e.jsx(B, { htmlFor: "auth-username", children: "用户名" }),
110
+ /* @__PURE__ */ e.jsxs("div", { className: "relative", children: [
111
+ /* @__PURE__ */ e.jsx(de, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
112
+ /* @__PURE__ */ e.jsx(
113
+ L,
114
+ {
115
+ id: "auth-username",
116
+ name: "username",
117
+ className: "bg-background/80 pl-9 backdrop-blur",
118
+ placeholder: "请输入用户名",
119
+ autoComplete: "username",
120
+ required: !0
121
+ }
122
+ )
123
+ ] })
124
+ ] }),
125
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
126
+ /* @__PURE__ */ e.jsx(B, { htmlFor: "auth-password", children: "密码" }),
127
+ /* @__PURE__ */ e.jsxs("div", { className: "relative", children: [
128
+ /* @__PURE__ */ e.jsx(ae, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
129
+ /* @__PURE__ */ e.jsx(
130
+ L,
131
+ {
132
+ id: "auth-password",
133
+ name: "password",
134
+ className: "bg-background/80 pl-9 backdrop-blur",
135
+ type: "password",
136
+ placeholder: "请输入密码",
137
+ autoComplete: "current-password",
138
+ required: !0
139
+ }
140
+ )
141
+ ] })
142
+ ] }),
143
+ /* @__PURE__ */ e.jsx(
144
+ M,
145
+ {
146
+ type: "submit",
147
+ className: "mt-4 h-11 w-full",
148
+ disabled: T,
149
+ children: T ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
150
+ /* @__PURE__ */ e.jsx(W, { className: "mr-2 h-4 w-4 animate-spin" }),
151
+ "登录中..."
152
+ ] }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
153
+ "登录",
154
+ /* @__PURE__ */ e.jsx(te, { className: "ml-2 h-4 w-4" })
155
+ ] })
156
+ }
157
+ )
158
+ ] }) }), ne = () => /* @__PURE__ */ e.jsx("form", { className: "flex flex-col", onSubmit: ue, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-4", children: [
159
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
160
+ /* @__PURE__ */ e.jsx(B, { htmlFor: "auth-phone", children: "手机号" }),
161
+ /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
162
+ /* @__PURE__ */ e.jsxs("div", { className: "relative w-full", children: [
163
+ /* @__PURE__ */ e.jsx(oe, { className: "pointer-events-none absolute left-3 top-1/2 z-10 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
164
+ /* @__PURE__ */ e.jsx(
165
+ L,
166
+ {
167
+ id: "auth-phone",
168
+ name: "phone",
169
+ className: "bg-background/80 pl-9 backdrop-blur",
170
+ placeholder: "请输入手机号",
171
+ value: je(r),
172
+ onChange: (a) => X(ge(a.target.value)),
173
+ required: !0,
174
+ maxLength: 13,
175
+ inputMode: "numeric"
176
+ }
177
+ )
178
+ ] }),
179
+ /* @__PURE__ */ e.jsx(
180
+ M,
181
+ {
182
+ type: "button",
183
+ variant: "outline",
184
+ className: "h-10 w-28 shrink-0 bg-background/70 backdrop-blur hover:bg-background/90",
185
+ onClick: me,
186
+ disabled: !r || O || D > 0,
187
+ children: O ? /* @__PURE__ */ e.jsx(W, { className: "h-4 w-4 animate-spin" }) : D > 0 ? `${D}秒` : "发送验证码"
188
+ }
189
+ )
190
+ ] })
191
+ ] }),
192
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
193
+ /* @__PURE__ */ e.jsx(B, { htmlFor: "auth-code", children: "验证码" }),
194
+ /* @__PURE__ */ e.jsx(
195
+ L,
196
+ {
197
+ id: "auth-code",
198
+ name: "code",
199
+ className: "bg-background/80 backdrop-blur",
200
+ placeholder: "请输入验证码",
201
+ inputMode: "numeric",
202
+ autoComplete: "one-time-code",
203
+ required: !0
204
+ }
205
+ )
206
+ ] }),
207
+ /* @__PURE__ */ e.jsx(M, { type: "submit", className: "mt-4 h-11 w-full", disabled: V, children: V ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
208
+ /* @__PURE__ */ e.jsx(W, { className: "mr-2 h-4 w-4 animate-spin" }),
209
+ "验证中..."
210
+ ] }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
211
+ "验证并登录",
212
+ /* @__PURE__ */ e.jsx(te, { className: "ml-2 h-4 w-4" })
213
+ ] }) })
214
+ ] }) }), pe = () => z ? /* @__PURE__ */ e.jsxs(
215
+ l,
216
+ {
217
+ value: q,
218
+ onValueChange: (a) => t(a),
219
+ className: "w-full",
220
+ children: [
221
+ /* @__PURE__ */ e.jsxs(i, { className: "mb-6 grid h-11 w-full grid-cols-2 bg-background/60 backdrop-blur", children: [
222
+ I.includes("password") && /* @__PURE__ */ e.jsx(y, { value: "password", children: "账号密码登录" }),
223
+ I.includes("sms") && /* @__PURE__ */ e.jsx(y, { value: "sms", children: "手机号登录" })
224
+ ] }),
225
+ /* @__PURE__ */ e.jsx(J, { value: "password", children: le() }),
226
+ /* @__PURE__ */ e.jsx(J, { value: "sms", children: ne() })
227
+ ]
228
+ }
229
+ ) : I[0] === "sms" ? ne() : le();
230
+ return /* @__PURE__ */ e.jsxs(
231
+ "div",
232
+ {
233
+ className: v(
234
+ "w-full max-w-[calc(100vw-2rem)] rounded-lg border border-white/45 bg-background/60 p-5 shadow-2xl shadow-slate-950/25 backdrop-blur-md supports-[backdrop-filter]:bg-background/50 md:p-8",
235
+ j
236
+ ),
237
+ children: [
238
+ he(),
239
+ xe(),
240
+ pe(),
241
+ k && /* @__PURE__ */ e.jsx("div", { className: "mt-5", children: k }),
242
+ S && /* @__PURE__ */ e.jsx("div", { className: "mt-4 border-l-2 border-red-600 px-4 text-sm text-red-600 dark:border-red-400 dark:text-red-400", children: S }),
243
+ u && /* @__PURE__ */ e.jsx("div", { className: "mt-6 text-sm text-muted-foreground", children: u })
244
+ ]
245
+ }
246
+ );
247
+ }
248
+ const Ne = (s) => /^1[3-9]\d{9}$/.test(s) ? void 0 : "请输入正确的手机号", ce = (s, c) => s instanceof Error && s.message ? s.message : typeof s == "string" && s ? s : c, ye = (s) => s.replace(/\D/g, "").slice(0, 11), ve = (s) => s.length <= 3 ? s : s.length <= 7 ? `${s.slice(0, 3)} ${s.slice(3)}` : `${s.slice(0, 3)} ${s.slice(3, 7)} ${s.slice(7)}`;
249
+ function ke({
250
+ components: s,
251
+ title: c = "创建账号",
252
+ description: p = "填写账号信息并完成手机号验证",
253
+ brandIcon: f,
254
+ requirePhoneVerification: d = !0,
255
+ requireTermsAccepted: m = !1,
256
+ termsLabel: A = "我已阅读并同意服务条款",
257
+ error: k,
258
+ extraActions: u,
259
+ footer: b,
260
+ socialProviders: j,
261
+ className: w,
262
+ smsCountdownSeconds: x = 60,
263
+ validatePhone: h = Ne,
264
+ validatePassword: N,
265
+ validateRegister: F,
266
+ onSendSmsCode: $,
267
+ onRegister: q
268
+ }) {
269
+ const [t, r] = n(""), [X, Y] = n(), [Z, _] = n(), [K, R] = n(!1), [g, T] = n(), [U, V] = n(!1), [H, O] = n(!1), [E, D] = n(0), G = g || k;
270
+ if (re(() => {
271
+ if (E <= 0) return;
272
+ const l = setTimeout(() => D((i) => i - 1), 1e3);
273
+ return () => clearTimeout(l);
274
+ }, [E]), !s)
275
+ return /* @__PURE__ */ e.jsx("div", { className: "p-4 text-center text-destructive", children: "错误:请通过 components prop 注入 UI 组件" });
276
+ const { Button: I, Input: z, Label: S } = s, M = async () => {
277
+ const l = h(t);
278
+ if (l) {
279
+ T(l);
280
+ return;
281
+ }
282
+ try {
283
+ O(!0), T(void 0);
284
+ const i = await ($ == null ? void 0 : $(t));
285
+ Y(i == null ? void 0 : i.smsId), _(i == null ? void 0 : i.smsType), D(x);
286
+ } catch (i) {
287
+ T(ce(i, "发送验证码失败,请稍后重试"));
288
+ } finally {
289
+ O(!1);
290
+ }
291
+ }, L = async (l) => {
292
+ l.preventDefault();
293
+ const i = new FormData(l.currentTarget), y = {
294
+ username: String(i.get("username") || "").trim(),
295
+ password: String(i.get("password") || ""),
296
+ confirmPassword: String(i.get("confirmPassword") || ""),
297
+ phone: t,
298
+ code: String(i.get("code") || "").trim(),
299
+ smsId: X,
300
+ smsType: Z,
301
+ termsAccepted: K
302
+ }, J = !y.username && "请输入用户名" || !y.password && "请输入密码" || y.password !== y.confirmPassword && "两次输入的密码不一致" || d && h(t) || d && !y.code && "请输入验证码" || m && !K && "请先同意服务条款" || (N == null ? void 0 : N(y)) || (F == null ? void 0 : F(y));
303
+ if (J) {
304
+ T(J);
305
+ return;
306
+ }
307
+ try {
308
+ V(!0), T(void 0), await (q == null ? void 0 : q(y));
309
+ } catch (P) {
310
+ T(ce(P, "注册失败,请稍后重试"));
311
+ } finally {
312
+ V(!1);
313
+ }
314
+ }, B = () => j != null && j.length ? /* @__PURE__ */ e.jsx("div", { className: "mb-6 grid gap-2", children: j.map((l) => /* @__PURE__ */ e.jsxs(
315
+ I,
316
+ {
317
+ type: "button",
318
+ variant: "outline",
319
+ className: "h-10 w-full",
320
+ disabled: l.disabled,
321
+ onClick: l.onClick,
322
+ children: [
323
+ l.icon && /* @__PURE__ */ e.jsx("span", { className: "mr-2 inline-flex h-4 w-4 items-center justify-center", children: l.icon }),
324
+ l.label
325
+ ]
326
+ },
327
+ l.id
328
+ )) }) : null;
329
+ return /* @__PURE__ */ e.jsxs(
330
+ "div",
331
+ {
332
+ className: v(
333
+ "w-full max-w-[calc(100vw-2rem)] rounded-lg border border-white/45 bg-background/60 p-5 shadow-2xl shadow-slate-950/25 backdrop-blur-md supports-[backdrop-filter]:bg-background/50 md:p-8",
334
+ w
335
+ ),
336
+ children: [
337
+ /* @__PURE__ */ e.jsxs("div", { className: "mb-7", children: [
338
+ /* @__PURE__ */ e.jsx("div", { className: "mb-4 flex h-11 w-11 items-center justify-center rounded-lg bg-primary text-primary-foreground shadow-sm", children: f || /* @__PURE__ */ e.jsx(ie, { className: "h-5 w-5" }) }),
339
+ /* @__PURE__ */ e.jsx("h1", { className: "text-2xl font-semibold", children: c }),
340
+ p && /* @__PURE__ */ e.jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: p })
341
+ ] }),
342
+ B(),
343
+ /* @__PURE__ */ e.jsx("form", { className: "flex flex-col", onSubmit: L, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-4", children: [
344
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
345
+ /* @__PURE__ */ e.jsx(S, { htmlFor: "auth-register-username", children: "用户名" }),
346
+ /* @__PURE__ */ e.jsxs("div", { className: "relative", children: [
347
+ /* @__PURE__ */ e.jsx(de, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
348
+ /* @__PURE__ */ e.jsx(
349
+ z,
350
+ {
351
+ id: "auth-register-username",
352
+ name: "username",
353
+ className: "bg-background/80 pl-9 backdrop-blur",
354
+ placeholder: "请输入用户名",
355
+ autoComplete: "username",
356
+ required: !0
357
+ }
358
+ )
359
+ ] })
360
+ ] }),
361
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
362
+ /* @__PURE__ */ e.jsx(S, { htmlFor: "auth-register-password", children: "密码" }),
363
+ /* @__PURE__ */ e.jsxs("div", { className: "relative", children: [
364
+ /* @__PURE__ */ e.jsx(ae, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
365
+ /* @__PURE__ */ e.jsx(
366
+ z,
367
+ {
368
+ id: "auth-register-password",
369
+ name: "password",
370
+ className: "bg-background/80 pl-9 backdrop-blur",
371
+ type: "password",
372
+ placeholder: "请输入密码",
373
+ autoComplete: "new-password",
374
+ required: !0
375
+ }
376
+ )
377
+ ] })
378
+ ] }),
379
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
380
+ /* @__PURE__ */ e.jsx(S, { htmlFor: "auth-register-confirm-password", children: "确认密码" }),
381
+ /* @__PURE__ */ e.jsxs("div", { className: "relative", children: [
382
+ /* @__PURE__ */ e.jsx(ae, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
383
+ /* @__PURE__ */ e.jsx(
384
+ z,
385
+ {
386
+ id: "auth-register-confirm-password",
387
+ name: "confirmPassword",
388
+ className: "bg-background/80 pl-9 backdrop-blur",
389
+ type: "password",
390
+ placeholder: "请再次输入密码",
391
+ autoComplete: "new-password",
392
+ required: !0
393
+ }
394
+ )
395
+ ] })
396
+ ] }),
397
+ d && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
398
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
399
+ /* @__PURE__ */ e.jsx(S, { htmlFor: "auth-register-phone", children: "手机号" }),
400
+ /* @__PURE__ */ e.jsxs("div", { className: "flex gap-2", children: [
401
+ /* @__PURE__ */ e.jsxs("div", { className: "relative w-full", children: [
402
+ /* @__PURE__ */ e.jsx(oe, { className: "pointer-events-none absolute left-3 top-1/2 z-10 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
403
+ /* @__PURE__ */ e.jsx(
404
+ z,
405
+ {
406
+ id: "auth-register-phone",
407
+ name: "phone",
408
+ className: "bg-background/80 pl-9 backdrop-blur",
409
+ placeholder: "请输入手机号",
410
+ value: ve(t),
411
+ onChange: (l) => r(ye(l.target.value)),
412
+ required: !0,
413
+ maxLength: 13,
414
+ inputMode: "numeric"
415
+ }
416
+ )
417
+ ] }),
418
+ /* @__PURE__ */ e.jsx(
419
+ I,
420
+ {
421
+ type: "button",
422
+ variant: "outline",
423
+ className: "h-10 w-28 shrink-0 bg-background/70 backdrop-blur hover:bg-background/90",
424
+ onClick: M,
425
+ disabled: !t || H || E > 0,
426
+ children: H ? /* @__PURE__ */ e.jsx(W, { className: "h-4 w-4 animate-spin" }) : E > 0 ? `${E}秒` : "发送验证码"
427
+ }
428
+ )
429
+ ] })
430
+ ] }),
431
+ /* @__PURE__ */ e.jsxs("div", { className: "space-y-2", children: [
432
+ /* @__PURE__ */ e.jsx(S, { htmlFor: "auth-register-code", children: "验证码" }),
433
+ /* @__PURE__ */ e.jsx(
434
+ z,
435
+ {
436
+ id: "auth-register-code",
437
+ name: "code",
438
+ className: "bg-background/80 backdrop-blur",
439
+ placeholder: "请输入验证码",
440
+ inputMode: "numeric",
441
+ autoComplete: "one-time-code",
442
+ required: !0
443
+ }
444
+ )
445
+ ] })
446
+ ] }),
447
+ m && /* @__PURE__ */ e.jsxs("label", { className: "flex items-start gap-2 text-sm text-muted-foreground", children: [
448
+ /* @__PURE__ */ e.jsx(
449
+ "input",
450
+ {
451
+ type: "checkbox",
452
+ className: "mt-0.5 h-4 w-4 rounded border-input",
453
+ checked: K,
454
+ onChange: (l) => R(l.target.checked)
455
+ }
456
+ ),
457
+ /* @__PURE__ */ e.jsx("span", { children: A })
458
+ ] }),
459
+ /* @__PURE__ */ e.jsx(
460
+ I,
461
+ {
462
+ type: "submit",
463
+ className: "mt-4 h-11 w-full",
464
+ disabled: U,
465
+ children: U ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
466
+ /* @__PURE__ */ e.jsx(W, { className: "mr-2 h-4 w-4 animate-spin" }),
467
+ "注册中..."
468
+ ] }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
469
+ "创建账号",
470
+ /* @__PURE__ */ e.jsx(te, { className: "ml-2 h-4 w-4" })
471
+ ] })
472
+ }
473
+ )
474
+ ] }) }),
475
+ u && /* @__PURE__ */ e.jsx("div", { className: "mt-5", children: u }),
476
+ G && /* @__PURE__ */ e.jsx("div", { className: "mt-4 border-l-2 border-red-600 px-4 text-sm text-red-600 dark:border-red-400 dark:text-red-400", children: G }),
477
+ b && /* @__PURE__ */ e.jsx("div", { className: "mt-6 text-sm text-muted-foreground", children: b })
478
+ ]
479
+ }
480
+ );
481
+ }
482
+ function Ee({
483
+ children: s,
484
+ visual: c,
485
+ overlay: p,
486
+ className: f,
487
+ contentClassName: d,
488
+ panelClassName: m
489
+ }) {
490
+ return /* @__PURE__ */ e.jsx("div", { className: v("min-h-screen", f), children: /* @__PURE__ */ e.jsxs("main", { className: "relative flex min-h-screen w-full overflow-hidden", children: [
491
+ c && /* @__PURE__ */ e.jsx("div", { className: "absolute inset-0", children: c }),
492
+ p ?? /* @__PURE__ */ e.jsx("div", { className: "absolute inset-0 z-10 bg-black/35" }),
493
+ /* @__PURE__ */ e.jsx(
494
+ "div",
495
+ {
496
+ className: v(
497
+ "relative z-20 flex min-h-screen w-full items-center justify-center px-4 py-6 sm:px-6 lg:p-12 xl:p-16",
498
+ d
499
+ ),
500
+ children: /* @__PURE__ */ e.jsx("div", { className: v("w-full min-w-0 max-w-[420px]", m), children: s })
501
+ }
502
+ )
503
+ ] }) });
504
+ }
505
+ function De({
506
+ items: s,
507
+ intervalMs: c = 5e3,
508
+ showIndicators: p = !0,
509
+ showText: f = !0,
510
+ className: d,
511
+ imageClassName: m,
512
+ contentClassName: A,
513
+ ariaLabel: k = "认证页视觉轮播"
514
+ }) {
515
+ const [u, b] = n(0), [j, w] = n(!1), x = s.length > 0, h = x ? s[u] : void 0, N = (t) => {
516
+ x && b((t + s.length) % s.length);
517
+ }, F = () => N(u + 1), $ = () => N(u - 1);
518
+ re(() => {
519
+ if (!x || j || c <= 0 || s.length < 2) return;
520
+ const t = setTimeout(() => {
521
+ b((r) => (r + 1) % s.length);
522
+ }, c);
523
+ return () => clearTimeout(t);
524
+ }, [x, c, j, s.length, u]);
525
+ const q = (t) => {
526
+ t.key === "ArrowLeft" && (t.preventDefault(), $()), t.key === "ArrowRight" && (t.preventDefault(), F());
527
+ };
528
+ return x ? /* @__PURE__ */ e.jsxs(
529
+ "div",
530
+ {
531
+ className: v(
532
+ "relative h-full min-h-[360px] w-full overflow-hidden bg-slate-950 outline-none",
533
+ d
534
+ ),
535
+ tabIndex: 0,
536
+ "aria-label": k,
537
+ role: "region",
538
+ onKeyDown: q,
539
+ onMouseEnter: () => w(!0),
540
+ onMouseLeave: () => w(!1),
541
+ onFocus: () => w(!0),
542
+ onBlur: () => w(!1),
543
+ children: [
544
+ s.map((t, r) => /* @__PURE__ */ e.jsx(
545
+ "img",
546
+ {
547
+ src: t.image,
548
+ alt: t.alt,
549
+ className: v(
550
+ "absolute inset-0 h-full w-full object-cover transition-opacity duration-700 ease-out",
551
+ r === u ? "opacity-100" : "opacity-0",
552
+ m
553
+ ),
554
+ "aria-hidden": r !== u
555
+ },
556
+ `${t.image}-${r}`
557
+ )),
558
+ /* @__PURE__ */ e.jsx("div", { className: "absolute inset-0 bg-gradient-to-r from-slate-950/80 via-slate-950/30 to-slate-950/10" }),
559
+ /* @__PURE__ */ e.jsx("div", { className: "absolute inset-x-0 bottom-0 bg-gradient-to-t from-slate-950/78 via-slate-950/30 to-transparent pb-16 pt-24" }),
560
+ (f || p) && /* @__PURE__ */ e.jsxs(
561
+ "div",
562
+ {
563
+ className: v(
564
+ "absolute inset-x-5 bottom-6 text-white sm:inset-x-8 sm:bottom-8 lg:inset-x-12 lg:bottom-10",
565
+ A
566
+ ),
567
+ children: [
568
+ f && h && /* @__PURE__ */ e.jsxs("div", { className: "max-w-[min(28rem,calc(100vw-2.5rem))]", children: [
569
+ h.eyebrow && /* @__PURE__ */ e.jsx("p", { className: "mb-2 text-[0.68rem] font-medium uppercase tracking-normal text-cyan-100/80 sm:text-xs", children: h.eyebrow }),
570
+ h.title && /* @__PURE__ */ e.jsx("h2", { className: "text-xl font-semibold leading-tight sm:text-2xl lg:text-3xl", children: h.title }),
571
+ h.description && /* @__PURE__ */ e.jsx("p", { className: "mt-2 line-clamp-3 text-sm leading-6 text-slate-100/80 sm:text-base", children: h.description })
572
+ ] }),
573
+ p && s.length > 1 && /* @__PURE__ */ e.jsx("div", { className: "mt-5 flex items-center gap-2", children: s.map((t, r) => /* @__PURE__ */ e.jsx(
574
+ "button",
575
+ {
576
+ type: "button",
577
+ className: v(
578
+ "h-1.5 rounded-full transition-all",
579
+ r === u ? "w-8 bg-white" : "w-3 bg-white/40 hover:bg-white/70"
580
+ ),
581
+ "aria-label": `切换到第 ${r + 1} 张轮播图`,
582
+ "aria-current": r === u,
583
+ onClick: () => N(r)
584
+ },
585
+ `${t.image}-indicator-${r}`
586
+ )) })
587
+ ]
588
+ }
589
+ )
590
+ ]
591
+ }
592
+ ) : /* @__PURE__ */ e.jsx(
593
+ "div",
594
+ {
595
+ className: v(
596
+ "relative h-full min-h-[360px] w-full overflow-hidden bg-slate-950",
597
+ d
598
+ ),
599
+ "aria-label": k,
600
+ role: "region"
601
+ }
602
+ );
603
+ }
604
+ function Ie({
605
+ components: s,
606
+ mode: c,
607
+ defaultMode: p = "login",
608
+ onModeChange: f,
609
+ loginProps: d,
610
+ registerProps: m,
611
+ loginLabel: A = "已有账号?登录",
612
+ registerLabel: k = "没有账号?注册"
613
+ }) {
614
+ const [u, b] = n(p), j = c ?? u, w = (x) => {
615
+ c || b(x), f == null || f(x);
616
+ };
617
+ return j === "register" ? /* @__PURE__ */ e.jsx(
618
+ ke,
619
+ {
620
+ ...m,
621
+ components: s,
622
+ footer: (m == null ? void 0 : m.footer) ?? /* @__PURE__ */ e.jsx(
623
+ "button",
624
+ {
625
+ type: "button",
626
+ className: "text-primary underline-offset-4 hover:underline",
627
+ onClick: () => w("login"),
628
+ children: A
629
+ }
630
+ )
631
+ }
632
+ ) : /* @__PURE__ */ e.jsx(
633
+ we,
634
+ {
635
+ ...d,
636
+ components: s,
637
+ footer: (d == null ? void 0 : d.footer) ?? /* @__PURE__ */ e.jsx(
638
+ "button",
639
+ {
640
+ type: "button",
641
+ className: "text-primary underline-offset-4 hover:underline",
642
+ onClick: () => w("register"),
643
+ children: k
644
+ }
645
+ )
646
+ }
647
+ );
648
+ }
649
+ export {
650
+ we as A,
651
+ Ee as a,
652
+ Ie as b,
653
+ ke as c,
654
+ De as d
655
+ };
656
+ //# sourceMappingURL=AuthPanel-D2HFX8eN.js.map