@alepha/ui 0.12.0 → 0.12.1

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 (164) hide show
  1. package/README.md +2 -30
  2. package/dist/admin/AdminFiles-BM6_7_5A.cjs +4 -0
  3. package/dist/admin/AdminFiles-BaCIMeNt.js +4 -0
  4. package/dist/admin/AdminFiles-CllAxb1B.js +117 -0
  5. package/dist/admin/AdminFiles-CllAxb1B.js.map +1 -0
  6. package/dist/admin/AdminFiles-DC3T8uWZ.cjs +122 -0
  7. package/dist/admin/AdminFiles-DC3T8uWZ.cjs.map +1 -0
  8. package/dist/admin/AdminJobs-BXkFtlVo.js +125 -0
  9. package/dist/admin/AdminJobs-BXkFtlVo.js.map +1 -0
  10. package/dist/admin/AdminJobs-C428qrNQ.cjs +130 -0
  11. package/dist/admin/AdminJobs-C428qrNQ.cjs.map +1 -0
  12. package/dist/admin/AdminJobs-DCPPaJ4i.cjs +4 -0
  13. package/dist/admin/AdminJobs-yC6DarGO.js +4 -0
  14. package/dist/admin/AdminLayout-Bqo4cd33.cjs +4 -0
  15. package/dist/admin/AdminLayout-CQpxfko6.js +4 -0
  16. package/dist/admin/AdminLayout-CiLlywAQ.cjs +93 -0
  17. package/dist/admin/AdminLayout-CiLlywAQ.cjs.map +1 -0
  18. package/dist/admin/AdminLayout-CtkVYk-u.js +88 -0
  19. package/dist/admin/AdminLayout-CtkVYk-u.js.map +1 -0
  20. package/dist/admin/AdminNotifications-DNUeJ-PW.cjs +44 -0
  21. package/dist/admin/AdminNotifications-DNUeJ-PW.cjs.map +1 -0
  22. package/dist/admin/AdminNotifications-DaMu1AQ4.js +4 -0
  23. package/dist/admin/AdminNotifications-DnnulNNV.js +40 -0
  24. package/dist/admin/AdminNotifications-DnnulNNV.js.map +1 -0
  25. package/dist/admin/AdminNotifications-ihgbKVCx.cjs +4 -0
  26. package/dist/admin/AdminParameters-B3hvpLpu.js +40 -0
  27. package/dist/admin/AdminParameters-B3hvpLpu.js.map +1 -0
  28. package/dist/admin/AdminParameters-U4lU1rUF.cjs +4 -0
  29. package/dist/admin/AdminParameters-gdf7036N.cjs +44 -0
  30. package/dist/admin/AdminParameters-gdf7036N.cjs.map +1 -0
  31. package/dist/admin/AdminParameters-prMcCgxf.js +4 -0
  32. package/dist/admin/AdminSessions-BF_P4lHs.cjs +128 -0
  33. package/dist/admin/AdminSessions-BF_P4lHs.cjs.map +1 -0
  34. package/dist/admin/AdminSessions-CATIU61I.cjs +4 -0
  35. package/dist/admin/AdminSessions-DqOXOpYR.js +4 -0
  36. package/dist/admin/AdminSessions-Pjdz-iZx.js +123 -0
  37. package/dist/admin/AdminSessions-Pjdz-iZx.js.map +1 -0
  38. package/dist/admin/AdminUsers-BgTL-zSY.js +4 -0
  39. package/dist/admin/AdminUsers-C1HsrRxn.js +104 -0
  40. package/dist/admin/AdminUsers-C1HsrRxn.js.map +1 -0
  41. package/dist/admin/AdminUsers-HqvxwNGZ.cjs +4 -0
  42. package/dist/admin/AdminUsers-M2uEQbp5.cjs +109 -0
  43. package/dist/admin/AdminUsers-M2uEQbp5.cjs.map +1 -0
  44. package/dist/admin/AdminVerifications-BVssbtfU.cjs +44 -0
  45. package/dist/admin/AdminVerifications-BVssbtfU.cjs.map +1 -0
  46. package/dist/admin/AdminVerifications-Df6DRgNo.js +4 -0
  47. package/dist/admin/AdminVerifications-DxAtcYUR.cjs +4 -0
  48. package/dist/admin/AdminVerifications-VMpm30mS.js +40 -0
  49. package/dist/admin/AdminVerifications-VMpm30mS.js.map +1 -0
  50. package/dist/admin/core-CzO6aavT.js +2507 -0
  51. package/dist/admin/core-CzO6aavT.js.map +1 -0
  52. package/dist/{index.cjs → admin/core-aFtK4l9I.cjs} +287 -204
  53. package/dist/admin/core-aFtK4l9I.cjs.map +1 -0
  54. package/dist/admin/index.cjs +87 -0
  55. package/dist/admin/index.cjs.map +1 -0
  56. package/dist/admin/index.d.cts +1739 -0
  57. package/dist/admin/index.d.ts +1745 -0
  58. package/dist/admin/index.js +78 -0
  59. package/dist/admin/index.js.map +1 -0
  60. package/dist/auth/IconGoogle-B17BTQyD.cjs +69 -0
  61. package/dist/auth/IconGoogle-B17BTQyD.cjs.map +1 -0
  62. package/dist/auth/IconGoogle-Bfmuv9Rv.js +58 -0
  63. package/dist/auth/IconGoogle-Bfmuv9Rv.js.map +1 -0
  64. package/dist/auth/Login-BTBmbnWl.cjs +181 -0
  65. package/dist/auth/Login-BTBmbnWl.cjs.map +1 -0
  66. package/dist/auth/Login-BcQOtG3v.js +5 -0
  67. package/dist/auth/Login-Btmd70Um.cjs +5 -0
  68. package/dist/auth/Login-JeXFsUf5.js +176 -0
  69. package/dist/auth/Login-JeXFsUf5.js.map +1 -0
  70. package/dist/auth/Register-CPQnvXCZ.js +318 -0
  71. package/dist/auth/Register-CPQnvXCZ.js.map +1 -0
  72. package/dist/auth/Register-CbesZal3.cjs +5 -0
  73. package/dist/auth/Register-DpI_JdyO.js +5 -0
  74. package/dist/auth/Register-HP3rP71B.cjs +323 -0
  75. package/dist/auth/Register-HP3rP71B.cjs.map +1 -0
  76. package/dist/auth/ResetPassword-B-tkzV7g.cjs +248 -0
  77. package/dist/auth/ResetPassword-B-tkzV7g.cjs.map +1 -0
  78. package/dist/auth/ResetPassword-BlK3xEpU.js +4 -0
  79. package/dist/auth/ResetPassword-BzUjGG_-.js +243 -0
  80. package/dist/auth/ResetPassword-BzUjGG_-.js.map +1 -0
  81. package/dist/auth/ResetPassword-W3xjOnWy.cjs +4 -0
  82. package/dist/auth/chunk-DhGyd7sr.js +28 -0
  83. package/dist/auth/core-D1MHij1j.js +1795 -0
  84. package/dist/auth/core-D1MHij1j.js.map +1 -0
  85. package/dist/auth/core-rDZ9d92K.cjs +1824 -0
  86. package/dist/auth/core-rDZ9d92K.cjs.map +1 -0
  87. package/dist/auth/index.cjs +211 -0
  88. package/dist/auth/index.cjs.map +1 -0
  89. package/dist/auth/index.d.cts +6265 -0
  90. package/dist/auth/index.d.ts +6274 -0
  91. package/dist/auth/index.js +206 -0
  92. package/dist/auth/index.js.map +1 -0
  93. package/dist/core/index.cjs +2620 -0
  94. package/dist/core/index.cjs.map +1 -0
  95. package/dist/core/index.d.cts +2737 -0
  96. package/dist/core/index.d.ts +2743 -0
  97. package/dist/{index.js → core/index.js} +298 -126
  98. package/dist/core/index.js.map +1 -0
  99. package/package.json +32 -14
  100. package/src/admin/AdminRouter.ts +58 -0
  101. package/src/admin/components/AdminFiles.tsx +117 -0
  102. package/src/admin/components/AdminJobs.tsx +158 -0
  103. package/src/admin/components/AdminLayout.tsx +114 -0
  104. package/src/admin/components/AdminNotifications.tsx +20 -0
  105. package/src/admin/components/AdminParameters.tsx +24 -0
  106. package/src/admin/components/AdminSessions.tsx +159 -0
  107. package/src/admin/components/AdminUsers.tsx +137 -0
  108. package/src/admin/components/AdminVerifications.tsx +25 -0
  109. package/src/admin/index.ts +29 -0
  110. package/src/auth/AuthI18n.ts +118 -0
  111. package/src/auth/AuthRouter.ts +53 -0
  112. package/src/auth/components/Login.tsx +193 -0
  113. package/src/auth/components/Register.tsx +421 -0
  114. package/src/auth/components/ResetPassword.tsx +259 -0
  115. package/src/auth/components/buttons/UserButton.tsx +118 -0
  116. package/src/auth/components/icons/IconGithub.tsx +21 -0
  117. package/src/auth/components/icons/IconGoogle.tsx +30 -0
  118. package/src/auth/index.ts +27 -0
  119. package/src/{RootRouter.ts → core/RootRouter.ts} +2 -1
  120. package/src/{components → core/components}/buttons/ActionButton.tsx +49 -6
  121. package/src/core/components/buttons/ClipboardButton.tsx +56 -0
  122. package/src/{components → core/components}/buttons/DarkModeButton.tsx +7 -8
  123. package/src/{components → core/components}/buttons/LanguageButton.tsx +2 -2
  124. package/src/{components → core/components}/buttons/OmnibarButton.tsx +1 -1
  125. package/src/{components → core/components}/dialogs/AlertDialog.tsx +1 -1
  126. package/src/{components → core/components}/dialogs/ConfirmDialog.tsx +1 -1
  127. package/src/{components → core/components}/dialogs/PromptDialog.tsx +1 -1
  128. package/src/{components → core/components}/form/Control.tsx +1 -0
  129. package/src/{components → core/components}/layout/AdminShell.tsx +38 -7
  130. package/src/{components → core/components}/layout/AlephaMantineProvider.tsx +12 -8
  131. package/src/{components → core/components}/layout/AppBar.tsx +1 -1
  132. package/src/{components → core/components}/layout/Omnibar.tsx +1 -1
  133. package/src/{components → core/components}/layout/Sidebar.tsx +29 -26
  134. package/src/{components → core/components}/table/DataTable.tsx +1 -1
  135. package/src/{constants → core/constants}/ui.ts +9 -0
  136. package/src/{index.ts → core/index.ts} +3 -0
  137. package/src/{services → core/services}/DialogService.tsx +3 -3
  138. package/src/{services → core/services}/ToastService.tsx +3 -1
  139. package/src/{utils → core/utils}/extractSchemaFields.ts +2 -8
  140. package/src/{utils → core/utils}/icons.tsx +5 -15
  141. package/src/{utils → core/utils}/parseInput.ts +34 -26
  142. package/dist/AlephaMantineProvider-CGpgWDt8.cjs +0 -3
  143. package/dist/AlephaMantineProvider-D8cHYAge.js +0 -152
  144. package/dist/AlephaMantineProvider-D8cHYAge.js.map +0 -1
  145. package/dist/AlephaMantineProvider-DuvZFAuk.cjs +0 -175
  146. package/dist/AlephaMantineProvider-DuvZFAuk.cjs.map +0 -1
  147. package/dist/AlephaMantineProvider-twBqV4IO.js +0 -3
  148. package/dist/index.cjs.map +0 -1
  149. package/dist/index.d.cts +0 -821
  150. package/dist/index.d.cts.map +0 -1
  151. package/dist/index.d.ts +0 -821
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js.map +0 -1
  154. /package/src/{components → core/components}/buttons/BurgerButton.tsx +0 -0
  155. /package/src/{components → core/components}/buttons/ToggleSidebarButton.tsx +0 -0
  156. /package/src/{components → core/components}/data/JsonViewer.tsx +0 -0
  157. /package/src/{components → core/components}/form/ControlDate.tsx +0 -0
  158. /package/src/{components → core/components}/form/ControlNumber.tsx +0 -0
  159. /package/src/{components → core/components}/form/ControlQueryBuilder.tsx +0 -0
  160. /package/src/{components → core/components}/form/ControlSelect.tsx +0 -0
  161. /package/src/{components → core/components}/form/TypeForm.tsx +0 -0
  162. /package/src/{hooks → core/hooks}/useDialog.ts +0 -0
  163. /package/src/{hooks → core/hooks}/useToast.ts +0 -0
  164. /package/src/{utils → core/utils}/string.ts +0 -0
@@ -0,0 +1,243 @@
1
+ import { i as ActionButton_default, n as Control_default } from "./core-D1MHij1j.js";
2
+ import { useI18n } from "@alepha/react/i18n";
3
+ import { useForm } from "@alepha/react/form";
4
+ import { AlephaError, t } from "alepha";
5
+ import { useClient, useRouter } from "@alepha/react";
6
+ import { Alert, Card, Flex, PinInput, Stack, Text } from "@mantine/core";
7
+ import { IconAlertCircle, IconCheck, IconInfoCircle, IconLock, IconMail } from "@tabler/icons-react";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { useState } from "react";
10
+ import { resetPasswordRequestSchema } from "alepha/api/users";
11
+
12
+ //#region src/auth/components/ResetPassword.tsx
13
+ const ResetPassword = (props) => {
14
+ const router = useRouter();
15
+ const userCtrl = useClient();
16
+ const { tr } = useI18n();
17
+ const [resetState, setResetState] = useState({ step: "email" });
18
+ const [error, setError] = useState(null);
19
+ const [isSubmitting, setIsSubmitting] = useState(false);
20
+ const redirect = router.query.redirect || "/";
21
+ const isResetPasswordAllowed = props.realmConfig.settings?.resetPasswordAllowed !== false;
22
+ const emailForm = useForm({
23
+ schema: resetPasswordRequestSchema,
24
+ handler: async (data) => {
25
+ setError(null);
26
+ setResetState({
27
+ step: "code",
28
+ intent: await userCtrl.createPasswordResetIntent({ body: { email: data.email } }),
29
+ email: data.email
30
+ });
31
+ }
32
+ });
33
+ const passwordForm = useForm({
34
+ schema: t.object({
35
+ password: t.string({ minLength: 8 }),
36
+ confirmPassword: t.string({ minLength: 8 })
37
+ }),
38
+ handler: async (data) => {
39
+ if (data.password !== data.confirmPassword) throw new AlephaError("Passwords do not match");
40
+ if (!resetState.intent || !resetState.code) throw new AlephaError("Invalid reset state");
41
+ await userCtrl.completePasswordReset({ body: {
42
+ intentId: resetState.intent.intentId,
43
+ code: resetState.code,
44
+ newPassword: data.password
45
+ } });
46
+ setResetState({ step: "success" });
47
+ }
48
+ }, [resetState.intent, resetState.code]);
49
+ const handleCodeComplete = (value) => {
50
+ if (value.length === 6) setResetState((prev) => ({
51
+ ...prev,
52
+ step: "password",
53
+ code: value
54
+ }));
55
+ };
56
+ const handleResendCode = async () => {
57
+ if (!resetState.email) return;
58
+ setIsSubmitting(true);
59
+ setError(null);
60
+ try {
61
+ const intent = await userCtrl.createPasswordResetIntent({ body: { email: resetState.email } });
62
+ setResetState((prev) => ({
63
+ ...prev,
64
+ intent
65
+ }));
66
+ } catch (err) {
67
+ setError(err instanceof Error ? err.message : "Failed to resend code");
68
+ } finally {
69
+ setIsSubmitting(false);
70
+ }
71
+ };
72
+ return /* @__PURE__ */ jsx(Flex, {
73
+ flex: 1,
74
+ justify: "center",
75
+ align: "center",
76
+ children: /* @__PURE__ */ jsxs(Stack, {
77
+ gap: "sm",
78
+ w: 360,
79
+ children: [/* @__PURE__ */ jsx(Card, {
80
+ withBorder: true,
81
+ p: "lg",
82
+ bg: "var(--alepha-elevated)",
83
+ children: /* @__PURE__ */ jsxs(Stack, {
84
+ gap: "md",
85
+ children: [error && /* @__PURE__ */ jsx(Alert, {
86
+ variant: "light",
87
+ color: "red",
88
+ icon: /* @__PURE__ */ jsx(IconAlertCircle, {}),
89
+ children: /* @__PURE__ */ jsx(Text, {
90
+ size: "sm",
91
+ children: error
92
+ })
93
+ }), !isResetPasswordAllowed ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Alert, {
94
+ variant: "light",
95
+ color: "yellow",
96
+ icon: /* @__PURE__ */ jsx(IconAlertCircle, {}),
97
+ children: /* @__PURE__ */ jsx(Text, {
98
+ size: "sm",
99
+ children: tr("resetPasswordDisabled")
100
+ })
101
+ }), /* @__PURE__ */ jsx(ActionButton_default, {
102
+ href: router.path("login"),
103
+ children: tr("resetPasswordBackToSignIn")
104
+ })] }) : resetState.step === "email" ? /* @__PURE__ */ jsx("form", {
105
+ ...emailForm.props,
106
+ children: /* @__PURE__ */ jsxs(Stack, {
107
+ flex: 1,
108
+ gap: "md",
109
+ children: [
110
+ /* @__PURE__ */ jsx(Text, {
111
+ size: "lg",
112
+ fw: 500,
113
+ ta: "center",
114
+ children: tr("resetPasswordTitle")
115
+ }),
116
+ /* @__PURE__ */ jsx(Text, {
117
+ size: "sm",
118
+ c: "dimmed",
119
+ children: tr("resetPasswordEnterEmail")
120
+ }),
121
+ /* @__PURE__ */ jsx(Control_default, {
122
+ title: tr("resetPasswordEmail"),
123
+ input: emailForm.input.email,
124
+ icon: /* @__PURE__ */ jsx(IconMail, {}),
125
+ text: {
126
+ autoComplete: "email",
127
+ autoFocus: true,
128
+ disabled: !isResetPasswordAllowed
129
+ }
130
+ }),
131
+ /* @__PURE__ */ jsx(ActionButton_default, {
132
+ form: emailForm,
133
+ disabled: !isResetPasswordAllowed,
134
+ children: tr("resetPasswordSendCode")
135
+ })
136
+ ]
137
+ })
138
+ }) : resetState.step === "code" ? /* @__PURE__ */ jsxs(Stack, {
139
+ gap: "md",
140
+ children: [
141
+ /* @__PURE__ */ jsx(Text, {
142
+ size: "lg",
143
+ fw: 500,
144
+ ta: "center",
145
+ children: tr("resetPasswordTitle")
146
+ }),
147
+ /* @__PURE__ */ jsx(Alert, {
148
+ variant: "light",
149
+ color: "blue",
150
+ icon: /* @__PURE__ */ jsx(IconInfoCircle, {}),
151
+ children: /* @__PURE__ */ jsx(Text, {
152
+ size: "sm",
153
+ children: tr("resetPasswordCodeSent")
154
+ })
155
+ }),
156
+ /* @__PURE__ */ jsx(Text, {
157
+ size: "sm",
158
+ c: "dimmed",
159
+ ta: "center",
160
+ children: tr("resetPasswordEnterCode")
161
+ }),
162
+ /* @__PURE__ */ jsx(Flex, {
163
+ justify: "center",
164
+ children: /* @__PURE__ */ jsx(PinInput, {
165
+ length: 6,
166
+ type: "number",
167
+ autoFocus: true,
168
+ oneTimeCode: true,
169
+ onComplete: handleCodeComplete,
170
+ "aria-label": "Password reset verification code"
171
+ })
172
+ }),
173
+ /* @__PURE__ */ jsx(ActionButton_default, {
174
+ variant: "subtle",
175
+ onClick: handleResendCode,
176
+ loading: isSubmitting,
177
+ children: tr("resetPasswordResendCode")
178
+ })
179
+ ]
180
+ }) : resetState.step === "password" ? /* @__PURE__ */ jsx("form", {
181
+ ...passwordForm.props,
182
+ children: /* @__PURE__ */ jsxs(Stack, {
183
+ flex: 1,
184
+ gap: "md",
185
+ children: [
186
+ /* @__PURE__ */ jsx(Text, {
187
+ size: "lg",
188
+ fw: 500,
189
+ ta: "center",
190
+ children: tr("resetPasswordTitle")
191
+ }),
192
+ /* @__PURE__ */ jsx(Text, {
193
+ size: "sm",
194
+ c: "dimmed",
195
+ children: tr("resetPasswordEnterNewPassword")
196
+ }),
197
+ /* @__PURE__ */ jsx(Control_default, {
198
+ title: tr("resetPasswordNewPassword"),
199
+ input: passwordForm.input.password,
200
+ icon: /* @__PURE__ */ jsx(IconLock, {}),
201
+ password: {
202
+ autoComplete: "new-password",
203
+ autoFocus: true
204
+ }
205
+ }),
206
+ /* @__PURE__ */ jsx(Control_default, {
207
+ title: tr("resetPasswordConfirmPassword"),
208
+ input: passwordForm.input.confirmPassword,
209
+ icon: /* @__PURE__ */ jsx(IconLock, {}),
210
+ password: { autoComplete: "new-password" }
211
+ }),
212
+ /* @__PURE__ */ jsx(ActionButton_default, {
213
+ form: passwordForm,
214
+ children: tr("resetPasswordSetNewPassword")
215
+ })
216
+ ]
217
+ })
218
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Alert, {
219
+ variant: "light",
220
+ color: "green",
221
+ icon: /* @__PURE__ */ jsx(IconCheck, {}),
222
+ children: /* @__PURE__ */ jsx(Text, {
223
+ size: "sm",
224
+ children: tr("resetPasswordSuccess")
225
+ })
226
+ }), /* @__PURE__ */ jsx(ActionButton_default, {
227
+ href: router.path("login"),
228
+ children: tr("resetPasswordBackToSignIn")
229
+ })] })]
230
+ })
231
+ }), /* @__PURE__ */ jsx(ActionButton_default, {
232
+ variant: "subtle",
233
+ href: redirect,
234
+ children: tr("resetPasswordCancel")
235
+ })]
236
+ })
237
+ });
238
+ };
239
+ var ResetPassword_default = ResetPassword;
240
+
241
+ //#endregion
242
+ export { ResetPassword_default as t };
243
+ //# sourceMappingURL=ResetPassword-BzUjGG_-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResetPassword-BzUjGG_-.js","names":["ActionButton","Control"],"sources":["../../src/auth/components/ResetPassword.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control } from \"@alepha/ui\";\nimport { Alert, Card, Flex, PinInput, Stack, Text } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconInfoCircle,\n IconLock,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type {\n PasswordResetIntentResponse,\n UserController,\n UserRealmConfig,\n} from \"alepha/api/users\";\nimport { resetPasswordRequestSchema } from \"alepha/api/users\";\nimport { useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\n\nexport interface ResetPasswordProps {\n realmConfig: UserRealmConfig;\n}\n\ntype Step = \"email\" | \"code\" | \"password\" | \"success\";\n\ninterface ResetState {\n step: Step;\n intent?: PasswordResetIntentResponse;\n email?: string;\n code?: string;\n}\n\nconst ResetPassword = (props: ResetPasswordProps) => {\n const router = useRouter<AuthRouter>();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const [resetState, setResetState] = useState<ResetState>({ step: \"email\" });\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const redirect = router.query.redirect || \"/\";\n\n const isResetPasswordAllowed =\n props.realmConfig.settings?.resetPasswordAllowed !== false;\n\n // Phase 1: Request password reset intent\n const emailForm = useForm({\n schema: resetPasswordRequestSchema,\n handler: async (data) => {\n setError(null);\n const intent = await userCtrl.createPasswordResetIntent({\n body: { email: data.email },\n });\n\n setResetState({\n step: \"code\",\n intent,\n email: data.email,\n });\n },\n });\n\n // Phase 2: Complete password reset\n const passwordForm = useForm(\n {\n schema: t.object({\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n }),\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new AlephaError(\"Passwords do not match\");\n }\n\n if (!resetState.intent || !resetState.code) {\n throw new AlephaError(\"Invalid reset state\");\n }\n\n await userCtrl.completePasswordReset({\n body: {\n intentId: resetState.intent.intentId,\n code: resetState.code,\n newPassword: data.password,\n },\n });\n\n setResetState({ step: \"success\" });\n },\n },\n [resetState.intent, resetState.code],\n );\n\n const handleCodeComplete = (value: string) => {\n if (value.length === 6) {\n setResetState((prev) => ({\n ...prev,\n step: \"password\",\n code: value,\n }));\n }\n };\n\n const handleResendCode = async () => {\n if (!resetState.email) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const intent = await userCtrl.createPasswordResetIntent({\n body: { email: resetState.email },\n });\n\n setResetState((prev) => ({\n ...prev,\n intent,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to resend code\");\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack gap={\"md\"}>\n {error && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error}</Text>\n </Alert>\n )}\n\n {!isResetPasswordAllowed ? (\n <>\n <Alert\n variant=\"light\"\n color=\"yellow\"\n icon={<IconAlertCircle />}\n >\n <Text size=\"sm\">{tr(\"resetPasswordDisabled\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")}>\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n ) : resetState.step === \"email\" ? (\n <form {...emailForm.props}>\n <Stack flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterEmail\")}\n </Text>\n <Control\n title={tr(\"resetPasswordEmail\")}\n input={emailForm.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n autoFocus: true,\n disabled: !isResetPasswordAllowed,\n }}\n />\n <ActionButton\n form={emailForm}\n disabled={!isResetPasswordAllowed}\n >\n {tr(\"resetPasswordSendCode\")}\n </ActionButton>\n </Stack>\n </form>\n ) : resetState.step === \"code\" ? (\n <Stack gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"blue\" icon={<IconInfoCircle />}>\n <Text size=\"sm\">{tr(\"resetPasswordCodeSent\")}</Text>\n </Alert>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"resetPasswordEnterCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n type=\"number\"\n autoFocus\n oneTimeCode\n onComplete={handleCodeComplete}\n aria-label=\"Password reset verification code\"\n />\n </Flex>\n <ActionButton\n variant=\"subtle\"\n onClick={handleResendCode}\n loading={isSubmitting}\n >\n {tr(\"resetPasswordResendCode\")}\n </ActionButton>\n </Stack>\n ) : resetState.step === \"password\" ? (\n <form {...passwordForm.props}>\n <Stack flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterNewPassword\")}\n </Text>\n <Control\n title={tr(\"resetPasswordNewPassword\")}\n input={passwordForm.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n autoFocus: true,\n }}\n />\n <Control\n title={tr(\"resetPasswordConfirmPassword\")}\n input={passwordForm.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={passwordForm}>\n {tr(\"resetPasswordSetNewPassword\")}\n </ActionButton>\n </Stack>\n </form>\n ) : (\n <>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"resetPasswordSuccess\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")}>\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Stack>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"resetPasswordCancel\")}\n </ActionButton>\n </Stack>\n </Flex>\n );\n};\n\nexport default ResetPassword;\n"],"mappings":";;;;;;;;;;;;AAoCA,MAAM,iBAAiB,UAA8B;CACnD,MAAM,SAAS,WAAuB;CACtC,MAAM,WAAW,WAA2B;CAC5C,MAAM,EAAE,OAAO,SAAyB;CACxC,MAAM,CAAC,YAAY,iBAAiB,SAAqB,EAAE,MAAM,SAAS,CAAC;CAC3E,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CACvD,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CACvD,MAAM,WAAW,OAAO,MAAM,YAAY;CAE1C,MAAM,yBACJ,MAAM,YAAY,UAAU,yBAAyB;CAGvD,MAAM,YAAY,QAAQ;EACxB,QAAQ;EACR,SAAS,OAAO,SAAS;AACvB,YAAS,KAAK;AAKd,iBAAc;IACZ,MAAM;IACN,QANa,MAAM,SAAS,0BAA0B,EACtD,MAAM,EAAE,OAAO,KAAK,OAAO,EAC5B,CAAC;IAKA,OAAO,KAAK;IACb,CAAC;;EAEL,CAAC;CAGF,MAAM,eAAe,QACnB;EACE,QAAQ,EAAE,OAAO;GACf,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC;GACpC,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC;GAC5C,CAAC;EACF,SAAS,OAAO,SAAS;AACvB,OAAI,KAAK,aAAa,KAAK,gBACzB,OAAM,IAAI,YAAY,yBAAyB;AAGjD,OAAI,CAAC,WAAW,UAAU,CAAC,WAAW,KACpC,OAAM,IAAI,YAAY,sBAAsB;AAG9C,SAAM,SAAS,sBAAsB,EACnC,MAAM;IACJ,UAAU,WAAW,OAAO;IAC5B,MAAM,WAAW;IACjB,aAAa,KAAK;IACnB,EACF,CAAC;AAEF,iBAAc,EAAE,MAAM,WAAW,CAAC;;EAErC,EACD,CAAC,WAAW,QAAQ,WAAW,KAAK,CACrC;CAED,MAAM,sBAAsB,UAAkB;AAC5C,MAAI,MAAM,WAAW,EACnB,gBAAe,UAAU;GACvB,GAAG;GACH,MAAM;GACN,MAAM;GACP,EAAE;;CAIP,MAAM,mBAAmB,YAAY;AACnC,MAAI,CAAC,WAAW,MAAO;AAEvB,kBAAgB,KAAK;AACrB,WAAS,KAAK;AAEd,MAAI;GACF,MAAM,SAAS,MAAM,SAAS,0BAA0B,EACtD,MAAM,EAAE,OAAO,WAAW,OAAO,EAClC,CAAC;AAEF,kBAAe,UAAU;IACvB,GAAG;IACH;IACD,EAAE;WACI,KAAK;AACZ,YAAS,eAAe,QAAQ,IAAI,UAAU,wBAAwB;YAC9D;AACR,mBAAgB,MAAM;;;AAI1B,QACE,oBAAC;EAAK,MAAM;EAAG,SAAS;EAAU,OAAO;YACvC,qBAAC;GAAM,KAAK;GAAM,GAAG;cACnB,oBAAC;IAAK;IAAW,GAAG;IAAM,IAAI;cAC5B,qBAAC;KAAM,KAAK;gBACT,SACC,oBAAC;MAAM,SAAQ;MAAQ,OAAM;MAAM,MAAM,oBAAC,oBAAkB;gBAC1D,oBAAC;OAAK,MAAK;iBAAM;QAAa;OACxB,EAGT,CAAC,yBACA,4CACE,oBAAC;MACC,SAAQ;MACR,OAAM;MACN,MAAM,oBAAC,oBAAkB;gBAEzB,oBAAC;OAAK,MAAK;iBAAM,GAAG,wBAAwB;QAAQ;OAC9C,EACR,oBAACA;MAAa,MAAM,OAAO,KAAK,QAAQ;gBACrC,GAAG,4BAA4B;OACnB,IACd,GACD,WAAW,SAAS,UACtB,oBAAC;MAAK,GAAI,UAAU;gBAClB,qBAAC;OAAM,MAAM;OAAG,KAAK;;QACnB,oBAAC;SAAK,MAAK;SAAK,IAAI;SAAK,IAAG;mBACzB,GAAG,qBAAqB;UACpB;QACP,oBAAC;SAAK,MAAK;SAAK,GAAE;mBACf,GAAG,0BAA0B;UACzB;QACP,oBAACC;SACC,OAAO,GAAG,qBAAqB;SAC/B,OAAO,UAAU,MAAM;SACvB,MAAM,oBAAC,aAAW;SAClB,MAAM;UACJ,cAAc;UACd,WAAW;UACX,UAAU,CAAC;UACZ;UACD;QACF,oBAACD;SACC,MAAM;SACN,UAAU,CAAC;mBAEV,GAAG,wBAAwB;UACf;;QACT;OACH,GACL,WAAW,SAAS,SACtB,qBAAC;MAAM,KAAK;;OACV,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,qBAAqB;SACpB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAO,MAAM,oBAAC,mBAAiB;kBAC1D,oBAAC;SAAK,MAAK;mBAAM,GAAG,wBAAwB;UAAQ;SAC9C;OACR,oBAAC;QAAK,MAAK;QAAK,GAAE;QAAS,IAAG;kBAC3B,GAAG,yBAAyB;SACxB;OACP,oBAAC;QAAK,SAAQ;kBACZ,oBAAC;SACC,QAAQ;SACR,MAAK;SACL;SACA;SACA,YAAY;SACZ,cAAW;UACX;SACG;OACP,oBAACA;QACC,SAAQ;QACR,SAAS;QACT,SAAS;kBAER,GAAG,0BAA0B;SACjB;;OACT,GACN,WAAW,SAAS,aACtB,oBAAC;MAAK,GAAI,aAAa;gBACrB,qBAAC;OAAM,MAAM;OAAG,KAAK;;QACnB,oBAAC;SAAK,MAAK;SAAK,IAAI;SAAK,IAAG;mBACzB,GAAG,qBAAqB;UACpB;QACP,oBAAC;SAAK,MAAK;SAAK,GAAE;mBACf,GAAG,gCAAgC;UAC/B;QACP,oBAACC;SACC,OAAO,GAAG,2BAA2B;SACrC,OAAO,aAAa,MAAM;SAC1B,MAAM,oBAAC,aAAW;SAClB,UAAU;UACR,cAAc;UACd,WAAW;UACZ;UACD;QACF,oBAACA;SACC,OAAO,GAAG,+BAA+B;SACzC,OAAO,aAAa,MAAM;SAC1B,MAAM,oBAAC,aAAW;SAClB,UAAU,EACR,cAAc,gBACf;UACD;QACF,oBAACD;SAAa,MAAM;mBACjB,GAAG,8BAA8B;UACrB;;QACT;OACH,GAEP,4CACE,oBAAC;MAAM,SAAQ;MAAQ,OAAM;MAAQ,MAAM,oBAAC,cAAY;gBACtD,oBAAC;OAAK,MAAK;iBAAM,GAAG,uBAAuB;QAAQ;OAC7C,EACR,oBAACA;MAAa,MAAM,OAAO,KAAK,QAAQ;gBACrC,GAAG,4BAA4B;OACnB,IACd;MAEC;KACH,EACP,oBAACA;IAAa,SAAS;IAAU,MAAM;cACpC,GAAG,sBAAsB;KACb;IACT;GACH;;AAIX,4BAAe"}
@@ -0,0 +1,4 @@
1
+ require('./core-rDZ9d92K.cjs');
2
+ const require_ResetPassword = require('./ResetPassword-B-tkzV7g.cjs');
3
+
4
+ exports.default = require_ResetPassword.ResetPassword_default;
@@ -0,0 +1,28 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) {
13
+ __defProp(to, key, {
14
+ get: ((k) => from[k]).bind(null, key),
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ }
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
25
+ }) : target, mod));
26
+
27
+ //#endregion
28
+ export { };