@alepha/ui 0.18.3 → 0.19.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 (181) hide show
  1. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js → AdminApiKeys-C2ze85eD.js} +3 -4
  2. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js.map → AdminApiKeys-C2ze85eD.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-CKiFMSSU.js → AdminAudits-BIj81e4k.js} +3 -4
  4. package/dist/admin/{AdminAudits-CKiFMSSU.js.map → AdminAudits-BIj81e4k.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-PhC_dZqo.js → AdminDashboard-PMVzrwSu.js} +3 -4
  6. package/dist/admin/{AdminDashboard-PhC_dZqo.js.map → AdminDashboard-PMVzrwSu.js.map} +1 -1
  7. package/dist/admin/AdminFiles-Bq03BLt-.js +189 -0
  8. package/dist/admin/AdminFiles-Bq03BLt-.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D9E-CS-U.js → AdminJobs-D1_QGCDy.js} +401 -358
  10. package/dist/admin/AdminJobs-D1_QGCDy.js.map +1 -0
  11. package/dist/admin/{AdminLayout-I6TlUMPc.js → AdminLayout-BNiwiw2D.js} +8 -25
  12. package/dist/admin/AdminLayout-BNiwiw2D.js.map +1 -0
  13. package/dist/admin/{AdminNotifications-ZPHCYrv7.js → AdminNotifications-DSKQtUfn.js} +85 -124
  14. package/dist/admin/AdminNotifications-DSKQtUfn.js.map +1 -0
  15. package/dist/admin/{AdminParameters-CqgvhRsb.js → AdminParameters-CoB7EhyM.js} +3 -12
  16. package/dist/admin/{AdminParameters-CqgvhRsb.js.map → AdminParameters-CoB7EhyM.js.map} +1 -1
  17. package/dist/admin/{AdminSessions-Bz5NRuoW.js → AdminSessions-DFbFcrJQ.js} +3 -4
  18. package/dist/admin/{AdminSessions-Bz5NRuoW.js.map → AdminSessions-DFbFcrJQ.js.map} +1 -1
  19. package/dist/admin/{AdminUserLayout-lXT6I0Qq.js → AdminUserLayout-fSfi3KMm.js} +72 -111
  20. package/dist/admin/AdminUserLayout-fSfi3KMm.js.map +1 -0
  21. package/dist/admin/{AdminUserProfile-vFBLoJ3h.js → AdminUserProfile-_C-h8vUK.js} +7 -6
  22. package/dist/admin/AdminUserProfile-_C-h8vUK.js.map +1 -0
  23. package/dist/admin/{AdminUserSessions-CT_YDim0.js → AdminUserSessions-KpJHIeQo.js} +3 -4
  24. package/dist/admin/{AdminUserSessions-CT_YDim0.js.map → AdminUserSessions-KpJHIeQo.js.map} +1 -1
  25. package/dist/admin/{AdminUsers-D1UfGya9.js → AdminUsers-DcVrzdQP.js} +4 -4
  26. package/dist/admin/AdminUsers-DcVrzdQP.js.map +1 -0
  27. package/dist/admin/{AuthLayout-_frhdgOO.js → AuthLayout-CazfLzcf.js} +3 -4
  28. package/dist/admin/{AuthLayout-_frhdgOO.js.map → AuthLayout-CazfLzcf.js.map} +1 -1
  29. package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
  30. package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  31. package/dist/admin/{Login-xtNmQtGh.js → Login-CaMjUrDP.js} +5 -6
  32. package/dist/{auth/Login-BA1E8IZl.js.map → admin/Login-CaMjUrDP.js.map} +1 -1
  33. package/dist/admin/{Profile-_AtPUwAP.js → Profile-Ca4fZX15.js} +3 -5
  34. package/dist/{demo/Profile-DS5q4vOh.js.map → admin/Profile-Ca4fZX15.js.map} +1 -1
  35. package/dist/admin/{Register-JcCjHUUn.js → Register-C5DyKWPO.js} +5 -6
  36. package/dist/{demo/Register-B4hLBeEv.js.map → admin/Register-C5DyKWPO.js.map} +1 -1
  37. package/dist/admin/{ResetPassword-CwGBPLJO.js → ResetPassword-BA5sAgXo.js} +4 -5
  38. package/dist/{auth/ResetPassword-DCtGcneA.js.map → admin/ResetPassword-BA5sAgXo.js.map} +1 -1
  39. package/dist/admin/{VerifyEmail-hNxWejWf.js → VerifyEmail-DKNXROj_.js} +4 -5
  40. package/dist/{auth/VerifyEmail-DkH7NBfn.js.map → admin/VerifyEmail-DKNXROj_.js.map} +1 -1
  41. package/dist/admin/adminUserAtom-BLNc7XbT.js +11 -0
  42. package/dist/admin/adminUserAtom-BLNc7XbT.js.map +1 -0
  43. package/dist/admin/{core-CYaRQ8O-.js → core-CJCEx18C.js} +132 -86
  44. package/dist/admin/core-CJCEx18C.js.map +1 -0
  45. package/dist/admin/index.d.ts +80 -13
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +38 -68
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
  50. package/dist/{demo/AuthLayout-Brri4A-L.js → auth/AuthLayout-vXPcCVzp.js} +3 -4
  51. package/dist/auth/{AuthLayout-AvLlcLjS.js.map → AuthLayout-vXPcCVzp.js.map} +1 -1
  52. package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
  53. package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  54. package/dist/auth/{Login-BA1E8IZl.js → Login-Dg08QR20.js} +5 -6
  55. package/dist/{demo/Login-C12N4oGs.js.map → auth/Login-Dg08QR20.js.map} +1 -1
  56. package/dist/{demo/Profile-DS5q4vOh.js → auth/Profile-Bb5O1yeh.js} +3 -5
  57. package/dist/auth/{Profile-YcWdeuFz.js.map → Profile-Bb5O1yeh.js.map} +1 -1
  58. package/dist/auth/{Register-CPhEO5MG.js → Register-B2AN71NC.js} +5 -6
  59. package/dist/{admin/Register-JcCjHUUn.js.map → auth/Register-B2AN71NC.js.map} +1 -1
  60. package/dist/{demo/ResetPassword-D8g9ha1N.js → auth/ResetPassword-BLxwzbDj.js} +4 -5
  61. package/dist/{admin/ResetPassword-CwGBPLJO.js.map → auth/ResetPassword-BLxwzbDj.js.map} +1 -1
  62. package/dist/auth/{VerifyEmail-DkH7NBfn.js → VerifyEmail-CSDOk3Zm.js} +4 -5
  63. package/dist/{admin/VerifyEmail-hNxWejWf.js.map → auth/VerifyEmail-CSDOk3Zm.js.map} +1 -1
  64. package/dist/auth/{core-D5jIAVF2.js → core-DuGkjPiU.js} +23 -54
  65. package/dist/auth/core-DuGkjPiU.js.map +1 -0
  66. package/dist/auth/index.d.ts +20 -6
  67. package/dist/auth/index.d.ts.map +1 -1
  68. package/dist/auth/index.js +13 -18
  69. package/dist/auth/index.js.map +1 -1
  70. package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
  71. package/dist/core/index.d.ts +78 -20
  72. package/dist/core/index.d.ts.map +1 -1
  73. package/dist/core/index.js +130 -98
  74. package/dist/core/index.js.map +1 -1
  75. package/dist/{auth/AuthLayout-AvLlcLjS.js → demo/AuthLayout-DPsOOG4u.js} +3 -4
  76. package/dist/demo/{AuthLayout-Brri4A-L.js.map → AuthLayout-DPsOOG4u.js.map} +1 -1
  77. package/dist/demo/{DemoButton-wiCxZZ_L.js → DemoButton-wzcqGk4u.js} +4 -5
  78. package/dist/demo/{DemoButton-wiCxZZ_L.js.map → DemoButton-wzcqGk4u.js.map} +1 -1
  79. package/dist/demo/{DemoControlSelect-D7ILObVg.js → DemoControlSelect-CMWvQ6Gm.js} +4 -5
  80. package/dist/demo/{DemoControlSelect-D7ILObVg.js.map → DemoControlSelect-CMWvQ6Gm.js.map} +1 -1
  81. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js → DemoDataTable-CHsAP3e2.js} +4 -5
  82. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js.map → DemoDataTable-CHsAP3e2.js.map} +1 -1
  83. package/dist/demo/{DemoDialog-CUWdLHim.js → DemoDialog-Co2IePxX.js} +3 -4
  84. package/dist/demo/{DemoDialog-CUWdLHim.js.map → DemoDialog-Co2IePxX.js.map} +1 -1
  85. package/dist/demo/{DemoFlex-a8OhMMvq.js → DemoFlex-OEwQt5do.js} +4 -5
  86. package/dist/demo/{DemoFlex-a8OhMMvq.js.map → DemoFlex-OEwQt5do.js.map} +1 -1
  87. package/dist/demo/DemoHeading-Db-XkQIK.js +69 -0
  88. package/dist/demo/DemoHeading-Db-XkQIK.js.map +1 -0
  89. package/dist/demo/{DemoHome-D_De3UiT.js → DemoHome-Cyp29ygy.js} +4 -5
  90. package/dist/demo/{DemoHome-D_De3UiT.js.map → DemoHome-Cyp29ygy.js.map} +1 -1
  91. package/dist/demo/{DemoJsonViewer-B50s9aGM.js → DemoJsonViewer-DXtCeMzH.js} +4 -5
  92. package/dist/demo/{DemoJsonViewer-B50s9aGM.js.map → DemoJsonViewer-DXtCeMzH.js.map} +1 -1
  93. package/dist/demo/{DemoLayout-CHU8WTwO.js → DemoLayout-hh9VmZQP.js} +4 -5
  94. package/dist/demo/DemoLayout-hh9VmZQP.js.map +1 -0
  95. package/dist/demo/{DemoLogin-BBlrWpml.js → DemoLogin-DX7mnmkh.js} +15 -11
  96. package/dist/demo/{DemoLogin-BBlrWpml.js.map → DemoLogin-DX7mnmkh.js.map} +1 -1
  97. package/dist/demo/{DemoRegister-BuNE3_-f.js → DemoRegister-DVcZl04m.js} +15 -11
  98. package/dist/demo/{DemoRegister-BuNE3_-f.js.map → DemoRegister-DVcZl04m.js.map} +1 -1
  99. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js → DemoResetPassword-CPENlZH5.js} +15 -11
  100. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js.map → DemoResetPassword-CPENlZH5.js.map} +1 -1
  101. package/dist/demo/{DemoSidebar-Giy2HRBD.js → DemoSidebar-CGu7DZeM.js} +4 -5
  102. package/dist/demo/{DemoSidebar-Giy2HRBD.js.map → DemoSidebar-CGu7DZeM.js.map} +1 -1
  103. package/dist/demo/{DemoText-ubcw-vog.js → DemoText-DYUJ7bY_.js} +4 -5
  104. package/dist/demo/{DemoText-ubcw-vog.js.map → DemoText-DYUJ7bY_.js.map} +1 -1
  105. package/dist/demo/{DemoToast-9die_dYT.js → DemoToast-CgdnZNvx.js} +3 -4
  106. package/dist/demo/{DemoToast-9die_dYT.js.map → DemoToast-CgdnZNvx.js.map} +1 -1
  107. package/dist/demo/{DemoTypeForm-D_d6OVKL.js → DemoTypeForm-Pims-cGa.js} +4 -5
  108. package/dist/demo/{DemoTypeForm-D_d6OVKL.js.map → DemoTypeForm-Pims-cGa.js.map} +1 -1
  109. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js → DemoVerifyEmail-C7B3xxch.js} +10 -11
  110. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js.map → DemoVerifyEmail-C7B3xxch.js.map} +1 -1
  111. package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
  112. package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
  113. package/dist/demo/{Login-C12N4oGs.js → Login-pwMF4TUj.js} +5 -6
  114. package/dist/{admin/Login-xtNmQtGh.js.map → demo/Login-pwMF4TUj.js.map} +1 -1
  115. package/dist/{auth/Profile-YcWdeuFz.js → demo/Profile-BliZapZS.js} +3 -5
  116. package/dist/{admin/Profile-_AtPUwAP.js.map → demo/Profile-BliZapZS.js.map} +1 -1
  117. package/dist/demo/{Register-B4hLBeEv.js → Register-CiwAT7Hy.js} +5 -6
  118. package/dist/{auth/Register-CPhEO5MG.js.map → demo/Register-CiwAT7Hy.js.map} +1 -1
  119. package/dist/{auth/ResetPassword-DCtGcneA.js → demo/ResetPassword-l9Vg4JE-.js} +4 -5
  120. package/dist/demo/{ResetPassword-D8g9ha1N.js.map → ResetPassword-l9Vg4JE-.js.map} +1 -1
  121. package/dist/demo/{Showcase-D6Fxt4X4.js → Showcase-CX6bDgwe.js} +3 -5
  122. package/dist/demo/{Showcase-D6Fxt4X4.js.map → Showcase-CX6bDgwe.js.map} +1 -1
  123. package/dist/demo/{VerifyEmail-BjDo0cZA.js → VerifyEmail-CAB-OS7i.js} +4 -5
  124. package/dist/demo/{VerifyEmail-BjDo0cZA.js.map → VerifyEmail-CAB-OS7i.js.map} +1 -1
  125. package/dist/demo/{auth-ByVTreDl.js → auth-uegJAdKu.js} +18 -35
  126. package/dist/demo/{auth-ByVTreDl.js.map → auth-uegJAdKu.js.map} +1 -1
  127. package/dist/demo/{core-DFgB3yU4.js → core-B4LVHzPn.js} +132 -93
  128. package/dist/demo/core-B4LVHzPn.js.map +1 -0
  129. package/dist/demo/index.js +20 -23
  130. package/dist/demo/index.js.map +1 -1
  131. package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
  132. package/package.json +17 -20
  133. package/src/admin/AdminRouter.tsx +23 -38
  134. package/src/admin/atoms/adminUserAtom.ts +7 -0
  135. package/src/admin/components/AdminLayout.tsx +2 -14
  136. package/src/admin/components/files/AdminFiles.tsx +123 -1
  137. package/src/admin/components/jobs/{AdminJobExecutions.tsx → AdminJobs.tsx} +450 -317
  138. package/src/admin/components/notifications/AdminNotifications.tsx +11 -25
  139. package/src/admin/components/users/AdminUserLayout.tsx +84 -127
  140. package/src/admin/components/users/AdminUserProfile.tsx +5 -2
  141. package/src/admin/components/users/AdminUsers.tsx +1 -1
  142. package/src/core/components/Flex.tsx +24 -0
  143. package/src/core/components/Section.tsx +109 -0
  144. package/src/core/components/SectionHeader.tsx +106 -0
  145. package/src/core/components/buttons/ActionButton.tsx +1 -0
  146. package/src/core/components/dialogs/PromptDialog.tsx +1 -1
  147. package/src/core/components/layout/Breadcrumb.tsx +2 -2
  148. package/src/core/components/layout/DashboardShell.tsx +1 -1
  149. package/src/core/index.ts +4 -1
  150. package/src/core/services/DialogService.tsx +2 -2
  151. package/src/core/styles.css +2 -1
  152. package/src/core/table/components/DataTable.tsx +5 -2
  153. package/src/demo/DemoRouter.ts +1 -1
  154. package/src/demo/components/auth/DemoLogin.tsx +5 -0
  155. package/src/demo/components/auth/DemoRegister.tsx +5 -0
  156. package/src/demo/components/auth/DemoResetPassword.tsx +5 -0
  157. package/src/demo/components/core/DemoHeading.tsx +56 -3
  158. package/dist/admin/AdminFiles-DFTjijGp.js +0 -111
  159. package/dist/admin/AdminFiles-DFTjijGp.js.map +0 -1
  160. package/dist/admin/AdminJobDashboard-BL8gGPDp.js +0 -354
  161. package/dist/admin/AdminJobDashboard-BL8gGPDp.js.map +0 -1
  162. package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +0 -1
  163. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js +0 -270
  164. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +0 -1
  165. package/dist/admin/AdminLayout-I6TlUMPc.js.map +0 -1
  166. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +0 -1
  167. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +0 -1
  168. package/dist/admin/AdminUserProfile-vFBLoJ3h.js.map +0 -1
  169. package/dist/admin/AdminUsers-D1UfGya9.js.map +0 -1
  170. package/dist/admin/core-CYaRQ8O-.js.map +0 -1
  171. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  172. package/dist/auth/core-D5jIAVF2.js.map +0 -1
  173. package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
  174. package/dist/demo/DemoHeading-C13OVDfS.js +0 -18
  175. package/dist/demo/DemoHeading-C13OVDfS.js.map +0 -1
  176. package/dist/demo/DemoLayout-CHU8WTwO.js.map +0 -1
  177. package/dist/demo/core-DFgB3yU4.js.map +0 -1
  178. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  179. package/src/admin/components/jobs/AdminJobDashboard.tsx +0 -349
  180. package/src/admin/components/jobs/AdminJobRegistry.tsx +0 -301
  181. package/src/core/components/Heading.tsx +0 -19
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserProfile-_C-h8vUK.js","names":["Flex"],"sources":["../../src/admin/components/users/AdminUserProfile.tsx"],"sourcesContent":["import { DetailList, Flex } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { useStore } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { adminUserAtom } from \"../../atoms/adminUserAtom.ts\";\n\nconst AdminUserProfile = () => {\n const [user] = useStore(adminUserAtom);\n const { l } = useI18n();\n\n if (!user) return null;\n\n return (\n <DetailList\n items={[\n { label: \"ID\", value: user.id, copyable: user.id },\n { label: \"Username\", value: user.username },\n { label: \"Email\", value: user.email },\n {\n label: \"Email Verified\",\n value: user.emailVerified ? \"Yes\" : \"No\",\n },\n { label: \"Phone\", value: user.phoneNumber },\n { label: \"First Name\", value: user.firstName },\n { label: \"Last Name\", value: user.lastName },\n { label: \"Realm\", value: user.realm },\n {\n label: \"Roles\",\n value:\n user.roles.length > 0 ? (\n <Flex gap={4}>\n {user.roles.map((role) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : null,\n },\n {\n label: \"Created\",\n value: String(l(user.createdAt, { date: \"lll\" })),\n },\n {\n label: \"Updated\",\n value: String(l(user.updatedAt, { date: \"lll\" })),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserProfile;\n"],"mappings":";;;;;;;AAMA,MAAM,yBAAyB;CAC7B,MAAM,CAAC,QAAQ,SAAS,cAAc;CACtC,MAAM,EAAE,MAAM,SAAS;AAEvB,KAAI,CAAC,KAAM,QAAO;AAElB,QACE,oBAAC,YAAD,EACE,OAAO;EACL;GAAE,OAAO;GAAM,OAAO,KAAK;GAAI,UAAU,KAAK;GAAI;EAClD;GAAE,OAAO;GAAY,OAAO,KAAK;GAAU;EAC3C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OAAO,KAAK,gBAAgB,QAAQ;GACrC;EACD;GAAE,OAAO;GAAS,OAAO,KAAK;GAAa;EAC3C;GAAE,OAAO;GAAc,OAAO,KAAK;GAAW;EAC9C;GAAE,OAAO;GAAa,OAAO,KAAK;GAAU;EAC5C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OACE,KAAK,MAAM,SAAS,IAClB,oBAACA,QAAD;IAAM,KAAK;cACR,KAAK,MAAM,KAAK,SACf,oBAAC,OAAD;KAAkB,MAAK;KAAK,SAAQ;eACjC;KACK,EAFI,KAEJ,CACR;IACG,CAAA,GACL;GACP;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACF,EACD,CAAA"}
@@ -1,4 +1,4 @@
1
- import { b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-CYaRQ8O-.js";
1
+ import { c as Text$1, h as useDialog, r as DataTable, u as Flex$1, x as useToast } from "./core-CJCEx18C.js";
2
2
  import { t } from "alepha";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { Badge } from "@mantine/core";
@@ -7,7 +7,6 @@ import { useState } from "react";
7
7
  import { IconDeviceDesktop, IconDeviceMobile, IconDeviceTablet, IconTrash } from "@tabler/icons-react";
8
8
  import { useRouterState } from "alepha/react/router";
9
9
  import { useClient } from "alepha/react";
10
-
11
10
  //#region ../../src/admin/components/users/AdminUserSessions.tsx
12
11
  const emptyFilters = t.object({});
13
12
  const getDeviceIcon = (device) => {
@@ -101,7 +100,7 @@ const AdminUserSessions = (props) => {
101
100
  }]
102
101
  }, refreshKey);
103
102
  };
104
-
105
103
  //#endregion
106
104
  export { AdminUserSessions as default };
107
- //# sourceMappingURL=AdminUserSessions-CT_YDim0.js.map
105
+
106
+ //# sourceMappingURL=AdminUserSessions-KpJHIeQo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminUserSessions-CT_YDim0.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { DataTable, Flex, Text, useDialog, useToast } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminSessionController, SessionEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst emptyFilters = t.object({});\n\nconst getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n};\n\nconst isExpired = (expiresAt: Date | string) =>\n new Date(expiresAt) < new Date();\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const userId = state.params.userId as string;\n const client = useClient<AdminSessionController>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleDeleteSession = async (session: SessionEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Revoke session\",\n message:\n \"Are you sure you want to revoke this session? The user will be signed out on this device.\",\n });\n if (!confirmed) return;\n await client.deleteSession({\n params: { id: session.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success(\"Session revoked\");\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <DataTable<SessionEntity, typeof emptyFilters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={emptyFilters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => ({\n style: {\n opacity: isExpired(item.expiresAt) ? 0.5 : 1,\n },\n })}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<SessionEntity>;\n }}\n columns={{\n device: {\n label: \"Device\",\n value: (item) => (\n <Flex gap={4} align=\"center\">\n {getDeviceIcon(item.userAgent?.device)}\n <Text size=\"xs\">\n {item.userAgent\n ? `${item.userAgent.browser} / ${item.userAgent.os}`\n : \"—\"}\n </Text>\n </Flex>\n ),\n },\n ip: {\n label: \"IP\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" muted>\n {item.ip || \"—\"}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"gray\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"Revoke session\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDeleteSession(item),\n visible: !isExpired(item.expiresAt),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,eAAe,EAAE,OAAO,EAAE,CAAC;AAEjC,MAAM,iBAAiB,WAAoB;AACzC,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;EACvC,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;EACvC,QACE,QAAO,oBAAC,qBAAkB,MAAM,KAAM;;;AAI5C,MAAM,aAAa,cACjB,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;AAElC,MAAM,qBAAqB,UAAkC;CAE3D,MAAM,SADQ,gBAAgB,CACT,OAAO;CAC5B,MAAM,SAAS,WAAmC;CAClD,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,WAAW;CAC1B,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,sBAAsB,OAAO,YAA2B;AAM5D,MAAI,CALc,MAAM,OAAO,QAAQ;GACrC,OAAO;GACP,SACE;GACH,CAAC,CACc;AAChB,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,QAAQ,IAAI;GAC1B,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,QAAM,QAAQ,kBAAkB;AAChC,iBAAe,MAAM,IAAI,EAAE;;AAG7B,QACE,oBAAC;EAEC;EACA,aAAa;EACb,SAAS;EACT,YAAY;GACV,mBAAmB;GACnB,iBAAiB;GAClB;EACD,eAAe,UAAU,EACvB,OAAO,EACL,SAAS,UAAU,KAAK,UAAU,GAAG,KAAM,GAC5C,EACF;EACD,OAAO,OAAO,YAAY;AAQxB,UAPiB,MAAM,OAAO,aAAa,EACzC,OAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACtB,EACF,CAAC;;EAGJ,SAAS;GACP,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,qBAACA;KAAK,KAAK;KAAG,OAAM;gBACjB,cAAc,KAAK,WAAW,OAAO,EACtC,oBAACC;MAAK,MAAK;gBACR,KAAK,YACF,GAAG,KAAK,UAAU,QAAQ,KAAK,KAAK,UAAU,OAC9C;OACC;MACF;IAEV;GACD,IAAI;IACF,OAAO;IACP,QAAQ,SACN,oBAACA;KAAK,MAAK;KAAK,IAAG;KAAY;eAC5B,KAAK,MAAM;MACP;IAEV;GACD,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,oBAAC;KACC,MAAK;KACL,SAAQ;KACR,OAAO,UAAU,KAAK,UAAU,GAAG,SAAS;eAE3C,UAAU,KAAK,UAAU,GAAG,YAAY;MACnC;IAEX;GACD,WAAW;IACT,OAAO;IACP,QAAQ,SACN,oBAACA;KAAK,MAAK;KAAK;eACb,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;MAClC;IAEV;GACF;EACD,aAAa,SAAS,CACpB;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,eAAe,oBAAoB,KAAK;GACxC,SAAS,CAAC,UAAU,KAAK,UAAU;GACpC,CACF;IA1EI,WA2EL"}
1
+ {"version":3,"file":"AdminUserSessions-KpJHIeQo.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { DataTable, Flex, Text, useDialog, useToast } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminSessionController, SessionEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst emptyFilters = t.object({});\n\nconst getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n};\n\nconst isExpired = (expiresAt: Date | string) =>\n new Date(expiresAt) < new Date();\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const userId = state.params.userId as string;\n const client = useClient<AdminSessionController>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleDeleteSession = async (session: SessionEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Revoke session\",\n message:\n \"Are you sure you want to revoke this session? The user will be signed out on this device.\",\n });\n if (!confirmed) return;\n await client.deleteSession({\n params: { id: session.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success(\"Session revoked\");\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <DataTable<SessionEntity, typeof emptyFilters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={emptyFilters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => ({\n style: {\n opacity: isExpired(item.expiresAt) ? 0.5 : 1,\n },\n })}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<SessionEntity>;\n }}\n columns={{\n device: {\n label: \"Device\",\n value: (item) => (\n <Flex gap={4} align=\"center\">\n {getDeviceIcon(item.userAgent?.device)}\n <Text size=\"xs\">\n {item.userAgent\n ? `${item.userAgent.browser} / ${item.userAgent.os}`\n : \"—\"}\n </Text>\n </Flex>\n ),\n },\n ip: {\n label: \"IP\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" muted>\n {item.ip || \"—\"}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"gray\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"Revoke session\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDeleteSession(item),\n visible: !isExpired(item.expiresAt),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;AAmBA,MAAM,eAAe,EAAE,OAAO,EAAE,CAAC;AAEjC,MAAM,iBAAiB,WAAoB;AACzC,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,QACE,QAAO,oBAAC,mBAAD,EAAmB,MAAM,IAAM,CAAA;;;AAI5C,MAAM,aAAa,cACjB,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;AAElC,MAAM,qBAAqB,UAAkC;CAE3D,MAAM,SADQ,gBAAgB,CACT,OAAO;CAC5B,MAAM,SAAS,WAAmC;CAClD,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,WAAW;CAC1B,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,sBAAsB,OAAO,YAA2B;AAM5D,MAAI,CALc,MAAM,OAAO,QAAQ;GACrC,OAAO;GACP,SACE;GACH,CAAC,CACc;AAChB,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,QAAQ,IAAI;GAC1B,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,QAAM,QAAQ,kBAAkB;AAChC,iBAAe,MAAM,IAAI,EAAE;;AAG7B,QACE,oBAAC,WAAD;EAEE,cAAA;EACA,aAAa;EACb,SAAS;EACT,YAAY;GACV,mBAAmB;GACnB,iBAAiB;GAClB;EACD,eAAe,UAAU,EACvB,OAAO,EACL,SAAS,UAAU,KAAK,UAAU,GAAG,KAAM,GAC5C,EACF;EACD,OAAO,OAAO,YAAY;AAQxB,UAPiB,MAAM,OAAO,aAAa,EACzC,OAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACtB,EACF,CAAC;;EAGJ,SAAS;GACP,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,qBAACA,QAAD;KAAM,KAAK;KAAG,OAAM;eAApB,CACG,cAAc,KAAK,WAAW,OAAO,EACtC,oBAACC,QAAD;MAAM,MAAK;gBACR,KAAK,YACF,GAAG,KAAK,UAAU,QAAQ,KAAK,KAAK,UAAU,OAC9C;MACC,CAAA,CACF;;IAEV;GACD,IAAI;IACF,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,IAAG;KAAY,OAAA;eAC5B,KAAK,MAAM;KACP,CAAA;IAEV;GACD,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,oBAAC,OAAD;KACE,MAAK;KACL,SAAQ;KACR,OAAO,UAAU,KAAK,UAAU,GAAG,SAAS;eAE3C,UAAU,KAAK,UAAU,GAAG,YAAY;KACnC,CAAA;IAEX;GACD,WAAW;IACT,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,OAAA;eACb,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;KAClC,CAAA;IAEV;GACF;EACD,aAAa,SAAS,CACpB;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,eAAe,oBAAoB,KAAK;GACxC,SAAS,CAAC,UAAU,KAAK,UAAU;GACpC,CACF;EACD,EA3EK,WA2EL"}
@@ -1,4 +1,4 @@
1
- import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-CYaRQ8O-.js";
1
+ import { c as Text$1, h as useDialog, r as DataTable, u as Flex$1, v as ActionButton, x as useToast } from "./core-CJCEx18C.js";
2
2
  import { t } from "alepha";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { Avatar, Badge } from "@mantine/core";
@@ -7,7 +7,6 @@ import { useState } from "react";
7
7
  import { IconEye, IconTrash, IconUserOff, IconUserPlus } from "@tabler/icons-react";
8
8
  import { useRouter } from "alepha/react/router";
9
9
  import { useClient } from "alepha/react";
10
-
11
10
  //#region ../../src/admin/components/users/AdminUsers.tsx
12
11
  const filters = t.object({
13
12
  query: t.optional(t.text()),
@@ -111,6 +110,7 @@ const AdminUsers = (props) => {
111
110
  name
112
111
  }), /* @__PURE__ */ jsxs(Flex$1, {
113
112
  col: true,
113
+ align: "start",
114
114
  children: [/* @__PURE__ */ jsx(Text$1, {
115
115
  size: "sm",
116
116
  bold: true,
@@ -200,7 +200,7 @@ const AdminUsers = (props) => {
200
200
  }, refreshKey)
201
201
  });
202
202
  };
203
-
204
203
  //#endregion
205
204
  export { AdminUsers as default };
206
- //# sourceMappingURL=AdminUsers-D1UfGya9.js.map
205
+
206
+ //# sourceMappingURL=AdminUsers-DcVrzdQP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUsers-DcVrzdQP.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import {\n ActionButton,\n DataTable,\n Flex,\n Text,\n useDialog,\n useToast,\n} from \"@alepha/ui\";\nimport { Avatar, Badge } from \"@mantine/core\";\nimport {\n IconEye,\n IconTrash,\n IconUserOff,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.tsx\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst filters = t.object({\n query: t.optional(t.text()),\n enabled: t.optional(t.boolean()),\n emailVerified: t.optional(t.boolean()),\n});\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<AdminUserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = () => setRefreshKey((k) => k + 1);\n\n const handleToggleEnabled = async (user: UserEntity) => {\n const enabled = !user.enabled;\n const confirmed = await dialog.confirm({\n title: enabled ? \"Enable user\" : \"Disable user\",\n message: enabled\n ? `Enable ${user.email || user.username || \"this user\"}?`\n : `Disable ${user.email || user.username || \"this user\"}? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled },\n });\n toast.success({\n message: enabled ? \"User enabled\" : \"User disabled\",\n });\n refresh();\n };\n\n const handleDelete = async (user: UserEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Delete user\",\n message: `Permanently delete ${user.email || user.username || \"this user\"}? This action cannot be undone.`,\n });\n if (!confirmed) return;\n await client.deleteUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success({ message: \"User deleted\" });\n refresh();\n };\n\n const handleBulkDisable = async (\n items: UserEntity[],\n clearSelection: () => void,\n ) => {\n const enabledUsers = items.filter((u) => u.enabled);\n if (enabledUsers.length === 0) {\n toast.danger({ message: \"No active users in selection\" });\n return;\n }\n const confirmed = await dialog.confirm({\n title: \"Disable users\",\n message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n for (const user of enabledUsers) {\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled: false },\n });\n }\n toast.success({\n message: `${enabledUsers.length} user(s) disabled`,\n });\n clearSelection();\n refresh();\n };\n\n return (\n <Flex p={\"md\"} flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n withCheckbox\n withExport\n checkboxActions={[\n {\n intent: \"danger\",\n label: \"Disable selected\",\n icon: <IconUserOff />,\n onClick: (ctx) =>\n handleBulkDisable(ctx.selectedItems, ctx.clearSelection),\n },\n ]}\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n defaultFilters={[\"query\"]}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(_key, _value, form) => form.submit()}\n filters={filters}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<UserEntity>;\n }}\n columns={{\n user: {\n label: \"User\",\n value: (item) => {\n const name =\n `${item.firstName || \"\"} ${item.lastName || \"\"}`.trim() ||\n item.username ||\n \"Anonymous\";\n\n return (\n <ActionButton\n variant={\"transparent\"}\n href={`/admin/users/${item.id}`}\n >\n <Flex gap={\"xs\"} centerY>\n <Avatar size={\"sm\"} name={name} />\n <Flex col align={\"start\"}>\n <Text size={\"sm\"} bold>\n {name}\n </Text>\n <Text size=\"xs\" muted>\n {item.email || \"\\u2014\"}\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n },\n },\n username: {\n label: \"Username\",\n defaultHidden: true,\n value: (item) => (\n <Text size=\"sm\" ff=\"monospace\">\n {item.username || \"\\u2014\"}\n </Text>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) =>\n item.roles.length > 0 ? (\n <Flex gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text size=\"xs\" muted>\n No roles\n </Text>\n ),\n },\n enabled: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n emailVerified: {\n label: \"Email\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Joined\",\n sortable: true,\n sortKey: \"createdAt\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"View profile\",\n icon: IconEye,\n onClick: () =>\n router.push(\"adminUserProfile\", {\n params: { userId: item.id },\n }),\n },\n {\n label: item.enabled ? \"Disable user\" : \"Enable user\",\n icon: item.enabled ? IconUserOff : IconUserPlus,\n color: item.enabled ? \"red\" : \"green\",\n onClick: () => handleToggleEnabled(item),\n },\n {\n label: \"Delete user\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDelete(item),\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- import { y as AlephaMantineProvider } from "./core-CYaRQ8O-.js";
1
+ import { b as AlephaMantineProvider } from "./core-CJCEx18C.js";
2
2
  import { Flex } from "@mantine/core";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { NestedView } from "alepha/react/router";
5
-
6
5
  //#region ../../src/auth/components/AuthLayout.tsx
7
6
  const AuthLayout = () => {
8
7
  return /* @__PURE__ */ jsx(AlephaMantineProvider, {
@@ -16,7 +15,7 @@ const AuthLayout = () => {
16
15
  })
17
16
  });
18
17
  };
19
-
20
18
  //#endregion
21
19
  export { AuthLayout as default };
22
- //# sourceMappingURL=AuthLayout-_frhdgOO.js.map
20
+
21
+ //# sourceMappingURL=AuthLayout-CazfLzcf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout-_frhdgOO.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAsB,SAAS;YAC9B,oBAAC;GAAK,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,eAAa;IACT;GACe"}
1
+ {"version":3,"file":"AuthLayout-CazfLzcf.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC,uBAAD;EAAuB,SAAS;YAC9B,oBAAC,MAAD;GAAM,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,YAAD,EAAc,CAAA;GACT,CAAA;EACe,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
-
3
2
  //#region ../../src/auth/components/icons/IconGithub.tsx
4
3
  const IconGithub = () => {
5
4
  return /* @__PURE__ */ jsx("svg", {
@@ -17,7 +16,6 @@ const IconGithub = () => {
17
16
  })
18
17
  });
19
18
  };
20
-
21
19
  //#endregion
22
20
  //#region ../../src/auth/components/icons/IconGoogle.tsx
23
21
  const IconGoogle = () => {
@@ -50,7 +48,7 @@ const IconGoogle = () => {
50
48
  ]
51
49
  });
52
50
  };
53
-
54
51
  //#endregion
55
52
  export { IconGithub as n, IconGoogle as t };
56
- //# sourceMappingURL=IconGoogle-CSQLPYwX.js.map
53
+
54
+ //# sourceMappingURL=IconGoogle-8Nkx6yax.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconGoogle-Ch1m3Uzl.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
1
+ {"version":3,"file":"IconGoogle-8Nkx6yax.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC,QAAD;GACE,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;GACN,CAAA;EACE,CAAA;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;YAJR;GAME,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IAAM,GAAE;IAAgB,MAAK;IAAS,CAAA;GAClC"}
@@ -1,6 +1,6 @@
1
- import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
2
- import { _ as ActionButton, a as Control, n as capitalize } from "./core-CYaRQ8O-.js";
3
- import { n as IconGithub, t as IconGoogle } from "./IconGoogle-Ch1m3Uzl.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
+ import { a as Control, n as capitalize, v as ActionButton } from "./core-CJCEx18C.js";
3
+ import { n as IconGithub, t as IconGoogle } from "./IconGoogle-8Nkx6yax.js";
4
4
  import { AlephaError, t } from "alepha";
5
5
  import { FormValidationError, useForm } from "alepha/react/form";
6
6
  import { useI18n } from "alepha/react/i18n";
@@ -11,7 +11,6 @@ import { IconLock, IconPhoto, IconUser } from "@tabler/icons-react";
11
11
  import { useRouter } from "alepha/react/router";
12
12
  import { useAuth } from "alepha/react/auth";
13
13
  import { HttpError } from "alepha/server";
14
-
15
14
  //#region ../../src/auth/components/Login.tsx
16
15
  var Login_exports = /* @__PURE__ */ __exportAll({ default: () => Login });
17
16
  const Login = (props) => {
@@ -269,7 +268,7 @@ const leftSection = (name) => {
269
268
  if (name === "google") return /* @__PURE__ */ jsx(IconGoogle, {});
270
269
  if (name === "github") return /* @__PURE__ */ jsx(IconGithub, {});
271
270
  };
272
-
273
271
  //#endregion
274
272
  export { Login_exports as t };
275
- //# sourceMappingURL=Login-xtNmQtGh.js.map
273
+
274
+ //# sourceMappingURL=Login-CaMjUrDP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Login-BA1E8IZl.js","names":[],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Image, Text, Title } from \"@mantine/core\";\nimport { IconLock, IconPhoto, IconUser } from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type { RealmConfig } from \"alepha/api/users\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { FormValidationError, useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface LoginProps {\n realmConfig: RealmConfig;\n registerPath?: string;\n resetPasswordPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.username !== \"none\") methods.push(\"username\");\n if (settings.email !== \"none\") methods.push(\"email\");\n if (settings.phoneNumber !== \"none\") methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n if (!credentialsProvider) {\n throw new AlephaError(\"Credentials provider not configured\");\n }\n\n try {\n await auth.login(credentialsProvider.name, {\n username: data.identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n await router.push(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n const getAutoCompleteType = () => {\n if (loginMethods.includes(\"email\")) {\n return \"email\";\n }\n if (loginMethods.includes(\"username\")) {\n return \"username\";\n }\n if (loginMethods.includes(\"phone\")) {\n return \"tel\";\n }\n return \"username\";\n };\n\n const externalLoginMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {/* Credentials login form */}\n {credentialsProvider && (\n <>\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Control\n label={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: getAutoCompleteType(),\n }}\n />\n <Control\n label={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Flex>\n </form>\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={`${props.resetPasswordPath ?? \"/auth/reset-password\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c={\"dimmed\"}>\n {tr(\"loginOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalLoginMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalLoginMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Registration link */}\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={`${props.registerPath ?? \"/auth/register\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Login-CaMjUrDP.js","names":[],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Image, Text, Title } from \"@mantine/core\";\nimport { IconLock, IconPhoto, IconUser } from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type { RealmConfig } from \"alepha/api/users\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { FormValidationError, useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface LoginProps {\n realmConfig: RealmConfig;\n registerPath?: string;\n resetPasswordPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.username !== \"none\") methods.push(\"username\");\n if (settings.email !== \"none\") methods.push(\"email\");\n if (settings.phoneNumber !== \"none\") methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n if (!credentialsProvider) {\n throw new AlephaError(\"Credentials provider not configured\");\n }\n\n try {\n await auth.login(credentialsProvider.name, {\n username: data.identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n await router.push(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n const getAutoCompleteType = () => {\n if (loginMethods.includes(\"email\")) {\n return \"email\";\n }\n if (loginMethods.includes(\"username\")) {\n return \"username\";\n }\n if (loginMethods.includes(\"phone\")) {\n return \"tel\";\n }\n return \"username\";\n };\n\n const externalLoginMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {/* Credentials login form */}\n {credentialsProvider && (\n <>\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Control\n label={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: getAutoCompleteType(),\n }}\n />\n <Control\n label={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Flex>\n </form>\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={`${props.resetPasswordPath ?? \"/auth/reset-password\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c={\"dimmed\"}>\n {tr(\"loginOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalLoginMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalLoginMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Registration link */}\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={`${props.registerPath ?? \"/auth/register\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { _ as ActionButton } from "./core-CYaRQ8O-.js";
1
+ import { v as ActionButton } from "./core-CJCEx18C.js";
2
2
  import { Avatar, Badge, Card, Flex, Text, Title } from "@mantine/core";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { IconAt, IconCalendar, IconId, IconShield, IconUser } from "@tabler/icons-react";
5
5
  import { useRouter } from "alepha/react/router";
6
6
  import { useAuth } from "alepha/react/auth";
7
-
8
7
  //#region ../../src/auth/components/ProfileField.tsx
9
8
  const ProfileField = (props) => {
10
9
  const { icon, label, children } = props;
@@ -32,7 +31,6 @@ const ProfileField = (props) => {
32
31
  })]
33
32
  });
34
33
  };
35
-
36
34
  //#endregion
37
35
  //#region ../../src/auth/components/Profile.tsx
38
36
  const Profile = () => {
@@ -153,7 +151,7 @@ const Profile = () => {
153
151
  })
154
152
  });
155
153
  };
156
-
157
154
  //#endregion
158
155
  export { Profile as default };
159
- //# sourceMappingURL=Profile-_AtPUwAP.js.map
156
+
157
+ //# sourceMappingURL=Profile-Ca4fZX15.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Profile-DS5q4vOh.js","names":[],"sources":["../../src/auth/components/ProfileField.tsx","../../src/auth/components/Profile.tsx"],"sourcesContent":["import { Flex, Text } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\n\nexport interface ProfileFieldProps {\n /**\n * Icon to display\n */\n icon: ReactNode;\n\n /**\n * Field label\n */\n label: string;\n\n /**\n * Field content\n */\n children: ReactNode;\n}\n\nconst ProfileField = (props: ProfileFieldProps) => {\n const { icon, label, children } = props;\n\n return (\n <Flex gap=\"sm\" align=\"flex-start\">\n <Flex c=\"dimmed\" mt={2}>\n {icon}\n </Flex>\n <Flex direction=\"column\" gap={2} flex={1}>\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={500}>\n {label}\n </Text>\n <Text size=\"sm\">{children}</Text>\n </Flex>\n </Flex>\n );\n};\n\nexport default ProfileField;\n","import { ActionButton } from \"@alepha/ui\";\nimport { Avatar, Badge, Card, Flex, Text, Title } from \"@mantine/core\";\nimport {\n IconAt,\n IconCalendar,\n IconId,\n IconShield,\n IconUser,\n} from \"@tabler/icons-react\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\nimport ProfileField from \"./ProfileField.tsx\";\n\nconst Profile = () => {\n const auth = useAuth();\n const router = useRouter<AuthRouter>();\n\n if (!auth.user) {\n return null;\n }\n\n const { id, name, email, username, picture, roles, organizations } =\n auth.user;\n\n const displayName = name || username || email || \"User\";\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" gap=\"md\" w={400}>\n <Card withBorder p=\"xl\" bg=\"var(--alepha-elevated)\">\n <Flex direction=\"column\" gap=\"lg\">\n {/* Avatar and name */}\n <Flex direction=\"column\" align=\"center\" gap=\"md\">\n <Avatar\n src={picture ? `/api/files/${picture}` : undefined}\n size={96}\n radius=\"xl\"\n color=\"blue\"\n >\n {!picture && <IconUser size={48} />}\n </Avatar>\n <Flex direction=\"column\" gap={4} align=\"center\">\n <Title order={3}>{displayName}</Title>\n {email && username && (\n <Text size=\"sm\" c=\"dimmed\">\n @{username}\n </Text>\n )}\n </Flex>\n </Flex>\n\n {/* User details */}\n <Flex direction=\"column\" gap=\"sm\">\n {email && (\n <ProfileField icon={<IconAt size={18} />} label=\"Email\">\n {email}\n </ProfileField>\n )}\n\n {username && (\n <ProfileField icon={<IconUser size={18} />} label=\"Username\">\n {username}\n </ProfileField>\n )}\n\n {id && (\n <ProfileField icon={<IconId size={18} />} label=\"User ID\">\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {id}\n </Text>\n </ProfileField>\n )}\n\n {/* Roles */}\n {roles && roles.length > 0 && (\n <ProfileField icon={<IconShield size={18} />} label=\"Roles\">\n <Flex gap=\"xs\">\n {roles.map((role) => (\n <Badge key={role} size=\"sm\" variant=\"light\">\n {role}\n </Badge>\n ))}\n </Flex>\n </ProfileField>\n )}\n\n {/* Organizations */}\n {organizations && organizations.length > 0 && (\n <ProfileField\n icon={<IconCalendar size={18} />}\n label=\"Organizations\"\n >\n <Flex gap=\"xs\">\n {organizations.map((org) => (\n <Badge key={org} size=\"sm\" variant=\"outline\">\n {org}\n </Badge>\n ))}\n </Flex>\n </ProfileField>\n )}\n </Flex>\n\n {/* Actions */}\n <Flex direction=\"column\" gap=\"sm\" mt=\"md\">\n <ActionButton\n variant=\"light\"\n color=\"red\"\n onClick={() => auth.logout()}\n fullWidth\n >\n Sign out\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n\n <ActionButton variant=\"subtle\" href=\"/\">\n Back to home\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Profile;\n"],"mappings":";;;;;;;;AAoBA,MAAM,gBAAgB,UAA6B;CACjD,MAAM,EAAE,MAAM,OAAO,aAAa;AAElC,QACE,qBAAC;EAAK,KAAI;EAAK,OAAM;aACnB,oBAAC;GAAK,GAAE;GAAS,IAAI;aAClB;IACI,EACP,qBAAC;GAAK,WAAU;GAAS,KAAK;GAAG,MAAM;cACrC,oBAAC;IAAK,MAAK;IAAK,GAAE;IAAS,IAAG;IAAY,IAAI;cAC3C;KACI,EACP,oBAAC;IAAK,MAAK;IAAM;KAAgB;IAC5B;GACF;;;;;ACpBX,MAAM,gBAAgB;CACpB,MAAM,OAAO,SAAS;AACP,YAAuB;AAEtC,KAAI,CAAC,KAAK,KACR,QAAO;CAGT,MAAM,EAAE,IAAI,MAAM,OAAO,UAAU,SAAS,OAAO,kBACjD,KAAK;CAEP,MAAM,cAAc,QAAQ,YAAY,SAAS;AAEjD,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,qBAAC;GAAK,WAAU;GAAS,KAAI;GAAK,GAAG;cACnC,oBAAC;IAAK;IAAW,GAAE;IAAK,IAAG;cACzB,qBAAC;KAAK,WAAU;KAAS,KAAI;;MAE3B,qBAAC;OAAK,WAAU;OAAS,OAAM;OAAS,KAAI;kBAC1C,oBAAC;QACC,KAAK,UAAU,cAAc,YAAY;QACzC,MAAM;QACN,QAAO;QACP,OAAM;kBAEL,CAAC,WAAW,oBAAC,YAAS,MAAM,KAAM;SAC5B,EACT,qBAAC;QAAK,WAAU;QAAS,KAAK;QAAG,OAAM;mBACrC,oBAAC;SAAM,OAAO;mBAAI;UAAoB,EACrC,SAAS,YACR,qBAAC;SAAK,MAAK;SAAK,GAAE;oBAAS,KACvB;UACG;SAEJ;QACF;MAGP,qBAAC;OAAK,WAAU;OAAS,KAAI;;QAC1B,SACC,oBAAC;SAAa,MAAM,oBAAC,UAAO,MAAM,KAAM;SAAE,OAAM;mBAC7C;UACY;QAGhB,YACC,oBAAC;SAAa,MAAM,oBAAC,YAAS,MAAM,KAAM;SAAE,OAAM;mBAC/C;UACY;QAGhB,MACC,oBAAC;SAAa,MAAM,oBAAC,UAAO,MAAM,KAAM;SAAE,OAAM;mBAC9C,oBAAC;UAAK,MAAK;UAAK,GAAE;UAAS,IAAG;oBAC3B;WACI;UACM;QAIhB,SAAS,MAAM,SAAS,KACvB,oBAAC;SAAa,MAAM,oBAAC,cAAW,MAAM,KAAM;SAAE,OAAM;mBAClD,oBAAC;UAAK,KAAI;oBACP,MAAM,KAAK,SACV,oBAAC;WAAiB,MAAK;WAAK,SAAQ;qBACjC;aADS,KAEJ,CACR;WACG;UACM;QAIhB,iBAAiB,cAAc,SAAS,KACvC,oBAAC;SACC,MAAM,oBAAC,gBAAa,MAAM,KAAM;SAChC,OAAM;mBAEN,oBAAC;UAAK,KAAI;oBACP,cAAc,KAAK,QAClB,oBAAC;WAAgB,MAAK;WAAK,SAAQ;qBAChC;aADS,IAEJ,CACR;WACG;UACM;;QAEZ;MAGP,oBAAC;OAAK,WAAU;OAAS,KAAI;OAAK,IAAG;iBACnC,oBAAC;QACC,SAAQ;QACR,OAAM;QACN,eAAe,KAAK,QAAQ;QAC5B;kBACD;SAEc;QACV;;MACF;KACF,EAEP,oBAAC;IAAa,SAAQ;IAAS,MAAK;cAAI;KAEzB;IACV;GACF"}
1
+ {"version":3,"file":"Profile-Ca4fZX15.js","names":[],"sources":["../../src/auth/components/ProfileField.tsx","../../src/auth/components/Profile.tsx"],"sourcesContent":["import { Flex, Text } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\n\nexport interface ProfileFieldProps {\n /**\n * Icon to display\n */\n icon: ReactNode;\n\n /**\n * Field label\n */\n label: string;\n\n /**\n * Field content\n */\n children: ReactNode;\n}\n\nconst ProfileField = (props: ProfileFieldProps) => {\n const { icon, label, children } = props;\n\n return (\n <Flex gap=\"sm\" align=\"flex-start\">\n <Flex c=\"dimmed\" mt={2}>\n {icon}\n </Flex>\n <Flex direction=\"column\" gap={2} flex={1}>\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={500}>\n {label}\n </Text>\n <Text size=\"sm\">{children}</Text>\n </Flex>\n </Flex>\n );\n};\n\nexport default ProfileField;\n","import { ActionButton } from \"@alepha/ui\";\nimport { Avatar, Badge, Card, Flex, Text, Title } from \"@mantine/core\";\nimport {\n IconAt,\n IconCalendar,\n IconId,\n IconShield,\n IconUser,\n} from \"@tabler/icons-react\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\nimport ProfileField from \"./ProfileField.tsx\";\n\nconst Profile = () => {\n const auth = useAuth();\n const router = useRouter<AuthRouter>();\n\n if (!auth.user) {\n return null;\n }\n\n const { id, name, email, username, picture, roles, organizations } =\n auth.user;\n\n const displayName = name || username || email || \"User\";\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" gap=\"md\" w={400}>\n <Card withBorder p=\"xl\" bg=\"var(--alepha-elevated)\">\n <Flex direction=\"column\" gap=\"lg\">\n {/* Avatar and name */}\n <Flex direction=\"column\" align=\"center\" gap=\"md\">\n <Avatar\n src={picture ? `/api/files/${picture}` : undefined}\n size={96}\n radius=\"xl\"\n color=\"blue\"\n >\n {!picture && <IconUser size={48} />}\n </Avatar>\n <Flex direction=\"column\" gap={4} align=\"center\">\n <Title order={3}>{displayName}</Title>\n {email && username && (\n <Text size=\"sm\" c=\"dimmed\">\n @{username}\n </Text>\n )}\n </Flex>\n </Flex>\n\n {/* User details */}\n <Flex direction=\"column\" gap=\"sm\">\n {email && (\n <ProfileField icon={<IconAt size={18} />} label=\"Email\">\n {email}\n </ProfileField>\n )}\n\n {username && (\n <ProfileField icon={<IconUser size={18} />} label=\"Username\">\n {username}\n </ProfileField>\n )}\n\n {id && (\n <ProfileField icon={<IconId size={18} />} label=\"User ID\">\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {id}\n </Text>\n </ProfileField>\n )}\n\n {/* Roles */}\n {roles && roles.length > 0 && (\n <ProfileField icon={<IconShield size={18} />} label=\"Roles\">\n <Flex gap=\"xs\">\n {roles.map((role) => (\n <Badge key={role} size=\"sm\" variant=\"light\">\n {role}\n </Badge>\n ))}\n </Flex>\n </ProfileField>\n )}\n\n {/* Organizations */}\n {organizations && organizations.length > 0 && (\n <ProfileField\n icon={<IconCalendar size={18} />}\n label=\"Organizations\"\n >\n <Flex gap=\"xs\">\n {organizations.map((org) => (\n <Badge key={org} size=\"sm\" variant=\"outline\">\n {org}\n </Badge>\n ))}\n </Flex>\n </ProfileField>\n )}\n </Flex>\n\n {/* Actions */}\n <Flex direction=\"column\" gap=\"sm\" mt=\"md\">\n <ActionButton\n variant=\"light\"\n color=\"red\"\n onClick={() => auth.logout()}\n fullWidth\n >\n Sign out\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n\n <ActionButton variant=\"subtle\" href=\"/\">\n Back to home\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Profile;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
2
- import { _ as ActionButton, a as Control, n as capitalize } from "./core-CYaRQ8O-.js";
3
- import { n as IconGithub, t as IconGoogle } from "./IconGoogle-Ch1m3Uzl.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
+ import { a as Control, n as capitalize, v as ActionButton } from "./core-CJCEx18C.js";
3
+ import { n as IconGithub, t as IconGoogle } from "./IconGoogle-8Nkx6yax.js";
4
4
  import { TypeBoxError, t } from "alepha";
5
5
  import { useForm } from "alepha/react/form";
6
6
  import { useI18n } from "alepha/react/i18n";
@@ -11,7 +11,6 @@ import { IconAlertCircle, IconLock, IconMail, IconPhone, IconPhoto, IconUser } f
11
11
  import { useRouter } from "alepha/react/router";
12
12
  import { useClient } from "alepha/react";
13
13
  import { useAuth } from "alepha/react/auth";
14
-
15
14
  //#region ../../src/auth/components/Register.tsx
16
15
  var Register_exports = /* @__PURE__ */ __exportAll({ default: () => Register });
17
16
  const Register = (props) => {
@@ -425,7 +424,7 @@ const leftSection = (name) => {
425
424
  if (name === "google") return /* @__PURE__ */ jsx(IconGoogle, {});
426
425
  if (name === "github") return /* @__PURE__ */ jsx(IconGithub, {});
427
426
  };
428
-
429
427
  //#endregion
430
428
  export { Register_exports as t };
431
- //# sourceMappingURL=Register-JcCjHUUn.js.map
429
+
430
+ //# sourceMappingURL=Register-C5DyKWPO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Register-B4hLBeEv.js","names":[],"sources":["../../src/auth/components/Register.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Image, PinInput, Text, Title } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconLock,\n IconMail,\n IconPhone,\n IconPhoto,\n IconUser,\n} from \"@tabler/icons-react\";\nimport { TypeBoxError, t } from \"alepha\";\nimport type {\n RealmConfig,\n RegistrationIntentResponse,\n UserController,\n} from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useMemo, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface RegisterProps {\n realmConfig: RealmConfig;\n loginPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\ntype RegistrationPhase = \"form\" | \"verification\";\n\ninterface RegistrationState {\n phase: RegistrationPhase;\n intent?: RegistrationIntentResponse;\n credentials?: {\n identifier: string;\n password: string;\n };\n}\n\nconst Register = (props: RegisterProps) => {\n const auth = useAuth();\n const userCtrl = useClient<UserController>();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const [registrationState, setRegistrationState] = useState<RegistrationState>(\n {\n phase: \"form\",\n },\n );\n const [emailCode, setEmailCode] = useState(\"\");\n const [phoneCode, setPhoneCode] = useState(\"\");\n const [verificationError, setVerificationError] = useState<string | null>(\n null,\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings || {};\n const isRegistrationAllowed = settings.registrationAllowed !== false;\n\n const registerSchema = useMemo(() => {\n const registerSchema = t.object({\n username: t.optional(\n t.text({\n trim: true,\n pattern: settings.usernameRegExp,\n }),\n ),\n email: t.optional(t.email()),\n phoneNumber: t.optional(t.e164()),\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n });\n\n const required = registerSchema.required as string[];\n\n if (settings.username === \"required\") required.push(\"username\");\n if (settings.email === \"required\") required.push(\"email\");\n if (settings.phoneNumber === \"required\") required.push(\"phoneNumber\");\n\n return registerSchema;\n }, []);\n\n const form = useForm({\n schema: registerSchema,\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new TypeBoxError({\n message: \"Passwords do not match\",\n instancePath: \"/confirmPassword\",\n keyword: \"not\",\n schemaPath: \"\",\n params: {},\n });\n }\n\n // Phase 1: Create registration intent\n const intent = await userCtrl.createRegistrationIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: {\n username: data.username,\n email: data.email,\n phoneNumber: data.phoneNumber,\n password: data.password,\n },\n });\n\n const identifier = data.username ?? data.email ?? data.phoneNumber;\n\n // Check if verification is needed\n if (\n intent.expectEmailVerification ||\n intent.expectPhoneVerification ||\n intent.expectCaptcha\n ) {\n // Move to verification phase\n setRegistrationState({\n phase: \"verification\",\n intent,\n credentials: identifier\n ? { identifier, password: data.password }\n : undefined,\n });\n return;\n }\n\n // No verification needed - complete registration immediately\n await userCtrl.createUserFromIntent({\n body: { intentId: intent.intentId },\n });\n\n // Auto-login after registration\n if (identifier && credentialsProvider) {\n await auth.login(credentialsProvider.name, {\n username: identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n }\n\n await router.push(router.query.r || \"/\");\n },\n });\n\n const handleVerificationSubmit = async () => {\n if (!registrationState.intent) return;\n\n setIsSubmitting(true);\n setVerificationError(null);\n\n try {\n // Phase 2: Complete registration with verification codes\n await userCtrl.createUserFromIntent({\n body: {\n intentId: registrationState.intent.intentId,\n emailCode: registrationState.intent.expectEmailVerification\n ? emailCode\n : undefined,\n phoneCode: registrationState.intent.expectPhoneVerification\n ? phoneCode\n : undefined,\n },\n });\n\n // Auto-login after registration\n if (registrationState.credentials && credentialsProvider) {\n await auth.login(credentialsProvider.name, {\n username: registrationState.credentials.identifier,\n password: registrationState.credentials.password,\n realm: props.realmConfig.realmName,\n });\n }\n\n await router.push(router.query.r || \"/\");\n } catch (error) {\n setVerificationError(\n error instanceof Error ? error.message : \"Verification failed\",\n );\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const canSubmitVerification = () => {\n if (!registrationState.intent) return false;\n\n if (\n registrationState.intent.expectEmailVerification &&\n emailCode.length !== 6\n ) {\n return false;\n }\n\n if (\n registrationState.intent.expectPhoneVerification &&\n phoneCode.length !== 6\n ) {\n return false;\n }\n\n return true;\n };\n\n // Verification phase UI (always card layout)\n if (registrationState.phase === \"verification\" && registrationState.intent) {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Flex direction=\"column\" gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"registerVerifyTitle\") ?? \"Verify your account\"}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"registerVerifyDescription\") ??\n \"Please enter the verification code(s) sent to you.\"}\n </Text>\n\n {verificationError && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{verificationError}</Text>\n </Alert>\n )}\n\n {registrationState.intent.expectEmailVerification && (\n <Flex direction=\"column\" gap={\"xs\"}>\n <Text size=\"sm\" fw={500}>\n {tr(\"registerEmailCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n value={emailCode}\n onChange={setEmailCode}\n type=\"number\"\n oneTimeCode\n aria-label=\"Email verification code\"\n />\n </Flex>\n </Flex>\n )}\n\n {registrationState.intent.expectPhoneVerification && (\n <Flex direction=\"column\" gap={\"xs\"}>\n <Text size=\"sm\" fw={500}>\n {tr(\"registerPhoneCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n value={phoneCode}\n onChange={setPhoneCode}\n type=\"number\"\n oneTimeCode\n aria-label=\"Phone verification code\"\n />\n </Flex>\n </Flex>\n )}\n\n <ActionButton\n color={\"blue\"}\n onClick={handleVerificationSubmit}\n loading={isSubmitting}\n disabled={!canSubmitVerification()}\n >\n {tr(\"registerVerifySubmit\")}\n </ActionButton>\n\n <ActionButton\n variant=\"subtle\"\n onClick={() =>\n setRegistrationState({ phase: \"form\", intent: undefined })\n }\n >\n {tr(\"registerVerifyBack\") ?? \"Back to registration\"}\n </ActionButton>\n </Flex>\n </Card>\n </Flex>\n </Flex>\n );\n }\n\n // External login methods\n const externalMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {!isRegistrationAllowed ? (\n <>\n <Alert variant=\"light\" color=\"yellow\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{tr(\"registerDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${realmQuery}`}\n >\n {tr(\"registerBackToSignIn\")}\n </ActionButton>\n </>\n ) : (\n <>\n {/* Credentials registration form */}\n {credentialsProvider && (\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n {settings.username !== \"none\" && form.input.username && (\n <Control\n label={tr(\"registerUsername\")}\n input={form.input.username}\n icon={<IconUser />}\n text={{\n autoComplete: \"username\",\n }}\n />\n )}\n {settings.email !== \"none\" && form.input.email && (\n <Control\n label={tr(\"registerEmail\")}\n input={form.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n }}\n />\n )}\n {settings.phoneNumber !== \"none\" && form.input.phoneNumber && (\n <Control\n label={tr(\"registerPhone\")}\n input={form.input.phoneNumber}\n icon={<IconPhone />}\n text={{\n autoComplete: \"tel\",\n }}\n />\n )}\n <Control\n label={tr(\"registerPassword\")}\n input={form.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <Control\n label={tr(\"registerConfirmPassword\")}\n input={form.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={form} color={\"blue\"} variant={\"filled\"}>\n {tr(\"registerCreateAccount\")}\n </ActionButton>\n </Flex>\n </form>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c=\"dimmed\">\n {tr(\"registerOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"registerContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Sign in link */}\n <Text size=\"sm\" ta=\"center\">\n {tr(\"registerHaveAccount\")}{\" \"}\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"registerSignIn\")}\n </ActionButton>\n </Text>\n </>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n // Default card variant\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Register;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Register-C5DyKWPO.js","names":[],"sources":["../../src/auth/components/Register.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Image, PinInput, Text, Title } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconLock,\n IconMail,\n IconPhone,\n IconPhoto,\n IconUser,\n} from \"@tabler/icons-react\";\nimport { TypeBoxError, t } from \"alepha\";\nimport type {\n RealmConfig,\n RegistrationIntentResponse,\n UserController,\n} from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useMemo, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface RegisterProps {\n realmConfig: RealmConfig;\n loginPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\ntype RegistrationPhase = \"form\" | \"verification\";\n\ninterface RegistrationState {\n phase: RegistrationPhase;\n intent?: RegistrationIntentResponse;\n credentials?: {\n identifier: string;\n password: string;\n };\n}\n\nconst Register = (props: RegisterProps) => {\n const auth = useAuth();\n const userCtrl = useClient<UserController>();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const [registrationState, setRegistrationState] = useState<RegistrationState>(\n {\n phase: \"form\",\n },\n );\n const [emailCode, setEmailCode] = useState(\"\");\n const [phoneCode, setPhoneCode] = useState(\"\");\n const [verificationError, setVerificationError] = useState<string | null>(\n null,\n );\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings || {};\n const isRegistrationAllowed = settings.registrationAllowed !== false;\n\n const registerSchema = useMemo(() => {\n const registerSchema = t.object({\n username: t.optional(\n t.text({\n trim: true,\n pattern: settings.usernameRegExp,\n }),\n ),\n email: t.optional(t.email()),\n phoneNumber: t.optional(t.e164()),\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n });\n\n const required = registerSchema.required as string[];\n\n if (settings.username === \"required\") required.push(\"username\");\n if (settings.email === \"required\") required.push(\"email\");\n if (settings.phoneNumber === \"required\") required.push(\"phoneNumber\");\n\n return registerSchema;\n }, []);\n\n const form = useForm({\n schema: registerSchema,\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new TypeBoxError({\n message: \"Passwords do not match\",\n instancePath: \"/confirmPassword\",\n keyword: \"not\",\n schemaPath: \"\",\n params: {},\n });\n }\n\n // Phase 1: Create registration intent\n const intent = await userCtrl.createRegistrationIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: {\n username: data.username,\n email: data.email,\n phoneNumber: data.phoneNumber,\n password: data.password,\n },\n });\n\n const identifier = data.username ?? data.email ?? data.phoneNumber;\n\n // Check if verification is needed\n if (\n intent.expectEmailVerification ||\n intent.expectPhoneVerification ||\n intent.expectCaptcha\n ) {\n // Move to verification phase\n setRegistrationState({\n phase: \"verification\",\n intent,\n credentials: identifier\n ? { identifier, password: data.password }\n : undefined,\n });\n return;\n }\n\n // No verification needed - complete registration immediately\n await userCtrl.createUserFromIntent({\n body: { intentId: intent.intentId },\n });\n\n // Auto-login after registration\n if (identifier && credentialsProvider) {\n await auth.login(credentialsProvider.name, {\n username: identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n }\n\n await router.push(router.query.r || \"/\");\n },\n });\n\n const handleVerificationSubmit = async () => {\n if (!registrationState.intent) return;\n\n setIsSubmitting(true);\n setVerificationError(null);\n\n try {\n // Phase 2: Complete registration with verification codes\n await userCtrl.createUserFromIntent({\n body: {\n intentId: registrationState.intent.intentId,\n emailCode: registrationState.intent.expectEmailVerification\n ? emailCode\n : undefined,\n phoneCode: registrationState.intent.expectPhoneVerification\n ? phoneCode\n : undefined,\n },\n });\n\n // Auto-login after registration\n if (registrationState.credentials && credentialsProvider) {\n await auth.login(credentialsProvider.name, {\n username: registrationState.credentials.identifier,\n password: registrationState.credentials.password,\n realm: props.realmConfig.realmName,\n });\n }\n\n await router.push(router.query.r || \"/\");\n } catch (error) {\n setVerificationError(\n error instanceof Error ? error.message : \"Verification failed\",\n );\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const canSubmitVerification = () => {\n if (!registrationState.intent) return false;\n\n if (\n registrationState.intent.expectEmailVerification &&\n emailCode.length !== 6\n ) {\n return false;\n }\n\n if (\n registrationState.intent.expectPhoneVerification &&\n phoneCode.length !== 6\n ) {\n return false;\n }\n\n return true;\n };\n\n // Verification phase UI (always card layout)\n if (registrationState.phase === \"verification\" && registrationState.intent) {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Flex direction=\"column\" gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"registerVerifyTitle\") ?? \"Verify your account\"}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"registerVerifyDescription\") ??\n \"Please enter the verification code(s) sent to you.\"}\n </Text>\n\n {verificationError && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{verificationError}</Text>\n </Alert>\n )}\n\n {registrationState.intent.expectEmailVerification && (\n <Flex direction=\"column\" gap={\"xs\"}>\n <Text size=\"sm\" fw={500}>\n {tr(\"registerEmailCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n value={emailCode}\n onChange={setEmailCode}\n type=\"number\"\n oneTimeCode\n aria-label=\"Email verification code\"\n />\n </Flex>\n </Flex>\n )}\n\n {registrationState.intent.expectPhoneVerification && (\n <Flex direction=\"column\" gap={\"xs\"}>\n <Text size=\"sm\" fw={500}>\n {tr(\"registerPhoneCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n value={phoneCode}\n onChange={setPhoneCode}\n type=\"number\"\n oneTimeCode\n aria-label=\"Phone verification code\"\n />\n </Flex>\n </Flex>\n )}\n\n <ActionButton\n color={\"blue\"}\n onClick={handleVerificationSubmit}\n loading={isSubmitting}\n disabled={!canSubmitVerification()}\n >\n {tr(\"registerVerifySubmit\")}\n </ActionButton>\n\n <ActionButton\n variant=\"subtle\"\n onClick={() =>\n setRegistrationState({ phase: \"form\", intent: undefined })\n }\n >\n {tr(\"registerVerifyBack\") ?? \"Back to registration\"}\n </ActionButton>\n </Flex>\n </Card>\n </Flex>\n </Flex>\n );\n }\n\n // External login methods\n const externalMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {!isRegistrationAllowed ? (\n <>\n <Alert variant=\"light\" color=\"yellow\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{tr(\"registerDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${realmQuery}`}\n >\n {tr(\"registerBackToSignIn\")}\n </ActionButton>\n </>\n ) : (\n <>\n {/* Credentials registration form */}\n {credentialsProvider && (\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n {settings.username !== \"none\" && form.input.username && (\n <Control\n label={tr(\"registerUsername\")}\n input={form.input.username}\n icon={<IconUser />}\n text={{\n autoComplete: \"username\",\n }}\n />\n )}\n {settings.email !== \"none\" && form.input.email && (\n <Control\n label={tr(\"registerEmail\")}\n input={form.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n }}\n />\n )}\n {settings.phoneNumber !== \"none\" && form.input.phoneNumber && (\n <Control\n label={tr(\"registerPhone\")}\n input={form.input.phoneNumber}\n icon={<IconPhone />}\n text={{\n autoComplete: \"tel\",\n }}\n />\n )}\n <Control\n label={tr(\"registerPassword\")}\n input={form.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <Control\n label={tr(\"registerConfirmPassword\")}\n input={form.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={form} color={\"blue\"} variant={\"filled\"}>\n {tr(\"registerCreateAccount\")}\n </ActionButton>\n </Flex>\n </form>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c=\"dimmed\">\n {tr(\"registerOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"registerContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Sign in link */}\n <Text size=\"sm\" ta=\"center\">\n {tr(\"registerHaveAccount\")}{\" \"}\n <ActionButton\n href={`${props.loginPath ?? \"/auth/login\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"registerSignIn\")}\n </ActionButton>\n </Text>\n </>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n // Default card variant\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Register;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;AA4CA,MAAM,YAAY,UAAyB;CACzC,MAAM,OAAO,SAAS;CACtB,MAAM,WAAW,WAA2B;CAC5C,MAAM,SAAS,WAAW;CAC1B,MAAM,EAAE,OAAO,SAAyB;CACxC,MAAM,WAAW,OAAO,MAAM,KAAK;CAEnC,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,EACE,OAAO,QACR,CACF;CACD,MAAM,CAAC,WAAW,gBAAgB,SAAS,GAAG;CAC9C,MAAM,CAAC,WAAW,gBAAgB,SAAS,GAAG;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,KACD;CACD,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CAEvD,MAAM,sBAAsB,MAAM,YAAY,sBAAsB,MACjE,OAAO,GAAG,SAAS,cACrB;CAED,MAAM,WAAW,MAAM,YAAY,YAAY,EAAE;CACjD,MAAM,wBAAwB,SAAS,wBAAwB;CAyB/D,MAAM,OAAO,QAAQ;EACnB,QAxBqB,cAAc;GACnC,MAAM,iBAAiB,EAAE,OAAO;IAC9B,UAAU,EAAE,SACV,EAAE,KAAK;KACL,MAAM;KACN,SAAS,SAAS;KACnB,CAAC,CACH;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;IACjC,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC;IACpC,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC;IAC5C,CAAC;GAEF,MAAM,WAAW,eAAe;AAEhC,OAAI,SAAS,aAAa,WAAY,UAAS,KAAK,WAAW;AAC/D,OAAI,SAAS,UAAU,WAAY,UAAS,KAAK,QAAQ;AACzD,OAAI,SAAS,gBAAgB,WAAY,UAAS,KAAK,cAAc;AAErE,UAAO;KACN,EAAE,CAAC;EAIJ,SAAS,OAAO,SAAS;AACvB,OAAI,KAAK,aAAa,KAAK,gBACzB,OAAM,IAAI,aAAa;IACrB,SAAS;IACT,cAAc;IACd,SAAS;IACT,YAAY;IACZ,QAAQ,EAAE;IACX,CAAC;GAIJ,MAAM,SAAS,MAAM,SAAS,yBAAyB;IACrD,OAAO,EAAE,eAAe,MAAM,YAAY,WAAW;IACrD,MAAM;KACJ,UAAU,KAAK;KACf,OAAO,KAAK;KACZ,aAAa,KAAK;KAClB,UAAU,KAAK;KAChB;IACF,CAAC;GAEF,MAAM,aAAa,KAAK,YAAY,KAAK,SAAS,KAAK;AAGvD,OACE,OAAO,2BACP,OAAO,2BACP,OAAO,eACP;AAEA,yBAAqB;KACnB,OAAO;KACP;KACA,aAAa,aACT;MAAE;MAAY,UAAU,KAAK;MAAU,GACvC,KAAA;KACL,CAAC;AACF;;AAIF,SAAM,SAAS,qBAAqB,EAClC,MAAM,EAAE,UAAU,OAAO,UAAU,EACpC,CAAC;AAGF,OAAI,cAAc,oBAChB,OAAM,KAAK,MAAM,oBAAoB,MAAM;IACzC,UAAU;IACV,UAAU,KAAK;IACf,OAAO,MAAM,YAAY;IAC1B,CAAC;AAGJ,SAAM,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI;;EAE3C,CAAC;CAEF,MAAM,2BAA2B,YAAY;AAC3C,MAAI,CAAC,kBAAkB,OAAQ;AAE/B,kBAAgB,KAAK;AACrB,uBAAqB,KAAK;AAE1B,MAAI;AAEF,SAAM,SAAS,qBAAqB,EAClC,MAAM;IACJ,UAAU,kBAAkB,OAAO;IACnC,WAAW,kBAAkB,OAAO,0BAChC,YACA,KAAA;IACJ,WAAW,kBAAkB,OAAO,0BAChC,YACA,KAAA;IACL,EACF,CAAC;AAGF,OAAI,kBAAkB,eAAe,oBACnC,OAAM,KAAK,MAAM,oBAAoB,MAAM;IACzC,UAAU,kBAAkB,YAAY;IACxC,UAAU,kBAAkB,YAAY;IACxC,OAAO,MAAM,YAAY;IAC1B,CAAC;AAGJ,SAAM,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI;WACjC,OAAO;AACd,wBACE,iBAAiB,QAAQ,MAAM,UAAU,sBAC1C;YACO;AACR,mBAAgB,MAAM;;;CAI1B,MAAM,8BAA8B;AAClC,MAAI,CAAC,kBAAkB,OAAQ,QAAO;AAEtC,MACE,kBAAkB,OAAO,2BACzB,UAAU,WAAW,EAErB,QAAO;AAGT,MACE,kBAAkB,OAAO,2BACzB,UAAU,WAAW,EAErB,QAAO;AAGT,SAAO;;AAIT,KAAI,kBAAkB,UAAU,kBAAkB,kBAAkB,OAClE,QACE,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAS;EAAU,OAAO;YACvC,oBAAC,MAAD;GAAM,WAAU;GAAS,KAAK;GAAM,GAAG;aACrC,oBAAC,MAAD;IAAM,YAAA;IAAW,GAAG;IAAM,IAAI;cAC5B,qBAAC,MAAD;KAAM,WAAU;KAAS,KAAK;eAA9B;MACE,oBAAC,MAAD;OAAM,MAAK;OAAK,IAAI;OAAK,IAAG;iBACzB,GAAG,sBAAsB,IAAI;OACzB,CAAA;MACP,oBAAC,MAAD;OAAM,MAAK;OAAK,GAAE;OAAS,IAAG;iBAC3B,GAAG,4BAA4B,IAC9B;OACG,CAAA;MAEN,qBACC,oBAAC,OAAD;OAAO,SAAQ;OAAQ,OAAM;OAAM,MAAM,oBAAC,iBAAD,EAAmB,CAAA;iBAC1D,oBAAC,MAAD;QAAM,MAAK;kBAAM;QAAyB,CAAA;OACpC,CAAA;MAGT,kBAAkB,OAAO,2BACxB,qBAAC,MAAD;OAAM,WAAU;OAAS,KAAK;iBAA9B,CACE,oBAAC,MAAD;QAAM,MAAK;QAAK,IAAI;kBACjB,GAAG,oBAAoB;QACnB,CAAA,EACP,oBAAC,MAAD;QAAM,SAAQ;kBACZ,oBAAC,UAAD;SACE,QAAQ;SACR,OAAO;SACP,UAAU;SACV,MAAK;SACL,aAAA;SACA,cAAW;SACX,CAAA;QACG,CAAA,CACF;;MAGR,kBAAkB,OAAO,2BACxB,qBAAC,MAAD;OAAM,WAAU;OAAS,KAAK;iBAA9B,CACE,oBAAC,MAAD;QAAM,MAAK;QAAK,IAAI;kBACjB,GAAG,oBAAoB;QACnB,CAAA,EACP,oBAAC,MAAD;QAAM,SAAQ;kBACZ,oBAAC,UAAD;SACE,QAAQ;SACR,OAAO;SACP,UAAU;SACV,MAAK;SACL,aAAA;SACA,cAAW;SACX,CAAA;QACG,CAAA,CACF;;MAGT,oBAAC,cAAD;OACE,OAAO;OACP,SAAS;OACT,SAAS;OACT,UAAU,CAAC,uBAAuB;iBAEjC,GAAG,uBAAuB;OACd,CAAA;MAEf,oBAAC,cAAD;OACE,SAAQ;OACR,eACE,qBAAqB;QAAE,OAAO;QAAQ,QAAQ,KAAA;QAAW,CAAC;iBAG3D,GAAG,qBAAqB,IAAI;OAChB,CAAA;MACV;;IACF,CAAA;GACF,CAAA;EACF,CAAA;CAKX,MAAM,kBAAkB,MAAM,YAAY,sBAAsB,QAC7D,WAAW,OAAO,SAAS,cAC7B;CAED,MAAM,gBAAgB,uBAAuB,gBAAgB,SAAS;CAEtE,MAAM,aAAa,MAAM,YAAY,YACjC,UAAU,mBAAmB,MAAM,YAAY,UAAU,KACzD;CAEJ,MAAM,cACJ,qBAAC,MAAD;EAAM,WAAU;EAAS,KAAK;YAA9B,EAEI,SAAS,WAAW,SAAS,eAAe,SAAS,gBACrD,qBAAC,MAAD;GAAM,WAAU;GAAS,KAAK;GAAM,OAAM;GAAS,IAAG;aAAtD;IACG,SAAS,WACR,oBAAC,OAAD;KACE,KAAK,SAAS;KACd,KAAK,SAAS,eAAe,MAAM,YAAY;KAC/C,GAAG;KACH,GAAE;KACF,KAAI;KACJ,CAAA;IAEH,SAAS,eACR,oBAAC,OAAD;KAAO,OAAO;KAAG,IAAG;eACjB,SAAS;KACJ,CAAA;IAET,SAAS,eACR,oBAAC,MAAD;KAAM,MAAK;KAAK,GAAE;KAAS,IAAG;eAC3B,SAAS;KACL,CAAA;IAEJ;MAGR,CAAC,wBACA,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAO,SAAQ;GAAQ,OAAM;GAAS,MAAM,oBAAC,iBAAD,EAAmB,CAAA;aAC7D,oBAAC,MAAD;IAAM,MAAK;cAAM,GAAG,mBAAmB;IAAQ,CAAA;GACzC,CAAA,EACR,oBAAC,cAAD;GACE,MAAM,GAAG,MAAM,aAAa,gBAAgB;aAE3C,GAAG,uBAAuB;GACd,CAAA,CACd,EAAA,CAAA,GAEH,qBAAA,UAAA,EAAA,UAAA;GAEG,uBACC,oBAAC,QAAD;IAAM,GAAI,KAAK;cACb,qBAAC,MAAD;KAAM,WAAU;KAAS,MAAM;KAAG,KAAK;eAAvC;MACG,SAAS,aAAa,UAAU,KAAK,MAAM,YAC1C,oBAAC,SAAD;OACE,OAAO,GAAG,mBAAmB;OAC7B,OAAO,KAAK,MAAM;OAClB,MAAM,oBAAC,UAAD,EAAY,CAAA;OAClB,MAAM,EACJ,cAAc,YACf;OACD,CAAA;MAEH,SAAS,UAAU,UAAU,KAAK,MAAM,SACvC,oBAAC,SAAD;OACE,OAAO,GAAG,gBAAgB;OAC1B,OAAO,KAAK,MAAM;OAClB,MAAM,oBAAC,UAAD,EAAY,CAAA;OAClB,MAAM,EACJ,cAAc,SACf;OACD,CAAA;MAEH,SAAS,gBAAgB,UAAU,KAAK,MAAM,eAC7C,oBAAC,SAAD;OACE,OAAO,GAAG,gBAAgB;OAC1B,OAAO,KAAK,MAAM;OAClB,MAAM,oBAAC,WAAD,EAAa,CAAA;OACnB,MAAM,EACJ,cAAc,OACf;OACD,CAAA;MAEJ,oBAAC,SAAD;OACE,OAAO,GAAG,mBAAmB;OAC7B,OAAO,KAAK,MAAM;OAClB,MAAM,oBAAC,UAAD,EAAY,CAAA;OAClB,UAAU,EACR,cAAc,gBACf;OACD,CAAA;MACF,oBAAC,SAAD;OACE,OAAO,GAAG,0BAA0B;OACpC,OAAO,KAAK,MAAM;OAClB,MAAM,oBAAC,UAAD,EAAY,CAAA;OAClB,UAAU,EACR,cAAc,gBACf;OACD,CAAA;MACF,oBAAC,cAAD;OAAoB;OAAM,OAAO;OAAQ,SAAS;iBAC/C,GAAG,wBAAwB;OACf,CAAA;MACV;;IACF,CAAA;GAIR,iBACC,qBAAC,MAAD;IAAM,OAAM;IAAS,SAAQ;IAAS,KAAK;cAA3C;KACE,oBAAC,MAAD;MAAM,MAAM;MAAG,GAAG;MAAO,IAAI;MAA0B,CAAA;KACvD,oBAAC,MAAD;MAAM,MAAK;MAAK,GAAE;gBACf,GAAG,aAAa;MACZ,CAAA;KACP,oBAAC,MAAD;MAAM,MAAM;MAAG,GAAG;MAAO,IAAI;MAA0B,CAAA;KAClD;;GAIR,gBAAgB,SAAS,KACxB,oBAAC,MAAD;IAAM,WAAU;IAAS,KAAK;cAC3B,gBAAgB,KAAK,WACpB,oBAAC,cAAD;KACE,SAAS;KAET,aAAa,YAAY,OAAO,KAAK,aAAa,CAAC;KACnD,eACE,KAAK,MAAM,OAAO,MAAM;MACtB;MACA,OAAO,MAAM,YAAY;MAC1B,CAAC;eAGH,GAAG,wBAAwB,EAC1B,MAAM,CAAC,WAAW,OAAO,KAAK,CAAC,EAChC,CAAC;KACW,EAZR,OAAO,KAYC,CACf;IACG,CAAA;GAIT,qBAAC,MAAD;IAAM,MAAK;IAAK,IAAG;cAAnB;KACG,GAAG,sBAAsB;KAAE;KAC5B,oBAAC,cAAD;MACE,MAAM,GAAG,MAAM,aAAa,gBAAgB;MAC5C,aAAa,EAAE,SAAS,MAAM;gBAE7B,GAAG,iBAAiB;MACR,CAAA;KACV;;GACN,EAAA,CAAA,CAEA;;AAGT,KAAI,MAAM,YAAY,QACpB,QACE,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAS;EAAU,OAAO;YACvC,oBAAC,MAAD;GACE,YAAA;GACA,GAAG;GACH,GAAG;GACH,IAAI;GACJ,OAAO,EAAE,UAAU,UAAU;aAE7B,qBAAC,MAAD;IAAM,KAAK;cAAX,CACG,MAAM,QACL,oBAAC,MAAD;KACE,MAAM;KACN,OAAO;MACL,iBAAiB,OAAO,MAAM,MAAM;MACpC,gBAAgB;MAChB,oBAAoB;MACrB;KACD,CAAA,GAEF,oBAAC,MAAD;KACE,MAAM;KACN,SAAQ;KACR,OAAM;KACN,IAAG;KACH,OAAO,EACL,aAAa,iDACd;eAED,oBAAC,MAAD;MACE,SAAQ;MACR,OAAM;MACN,GAAG;MACH,GAAG;MACH,OAAO;OACL,QAAQ;OACR,cAAc;OACf;gBAED,oBAAC,WAAD;OAAW,MAAM;OAAI,OAAO,EAAE,SAAS,IAAK;OAAI,CAAA;MAC3C,CAAA;KACF,CAAA,EAET,qBAAC,MAAD;KACE,MAAM;KACN,WAAU;KACV,KAAK;KACL,GAAG;KACH,SAAS;eALX,CAOG,aACD,oBAAC,cAAD;MAAc,SAAS;MAAU,MAAM;gBACpC,GAAG,iBAAiB;MACR,CAAA,CACV;OACF;;GACF,CAAA;EACF,CAAA;AAKX,QACE,oBAAC,MAAD;EAAM,MAAM;EAAG,SAAS;EAAU,OAAO;YACvC,qBAAC,MAAD;GAAM,WAAU;GAAS,KAAK;GAAM,GAAG;aAAvC,CACE,oBAAC,MAAD;IAAM,YAAA;IAAW,GAAG;IAAM,IAAI;cAC3B;IACI,CAAA,EACP,oBAAC,cAAD;IAAc,SAAS;IAAU,MAAM;cACpC,GAAG,iBAAiB;IACR,CAAA,CACV;;EACF,CAAA;;AAMX,MAAM,eAAe,SAAiB;AACpC,KAAI,SAAS,SACX,QAAO,oBAAC,YAAD,EAAc,CAAA;AAGvB,KAAI,SAAS,SACX,QAAO,oBAAC,YAAD,EAAc,CAAA"}
@@ -1,5 +1,5 @@
1
- import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
2
- import { _ as ActionButton, a as Control } from "./core-CYaRQ8O-.js";
1
+ import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
+ import { a as Control, v as ActionButton } from "./core-CJCEx18C.js";
3
3
  import { AlephaError, t } from "alepha";
4
4
  import { useForm } from "alepha/react/form";
5
5
  import { useI18n } from "alepha/react/i18n";
@@ -10,7 +10,6 @@ import { IconAlertCircle, IconCheck, IconInfoCircle, IconLock, IconMail } from "
10
10
  import { useRouter } from "alepha/react/router";
11
11
  import { useClient } from "alepha/react";
12
12
  import { resetPasswordRequestSchema } from "alepha/api/users";
13
-
14
13
  //#region ../../src/auth/components/ResetPassword.tsx
15
14
  var ResetPassword_exports = /* @__PURE__ */ __exportAll({ default: () => ResetPassword });
16
15
  const ResetPassword = (props) => {
@@ -280,7 +279,7 @@ const ResetPassword = (props) => {
280
279
  })
281
280
  });
282
281
  };
283
-
284
282
  //#endregion
285
283
  export { ResetPassword_exports as t };
286
- //# sourceMappingURL=ResetPassword-CwGBPLJO.js.map
284
+
285
+ //# sourceMappingURL=ResetPassword-BA5sAgXo.js.map