@alepha/ui 0.16.2 → 0.17.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 (175) hide show
  1. package/dist/admin/{AdminApiKeys-CoTOTfgU.js → AdminApiKeys-CF_qOO3u.js} +20 -20
  2. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BmsxFbDa.js → AdminAudits-BQno3hZG.js} +7 -8
  4. package/dist/admin/AdminAudits-BQno3hZG.js.map +1 -0
  5. package/dist/admin/{AdminFiles-BBB8knca.js → AdminFiles-kvuUaASF.js} +3 -5
  6. package/dist/admin/{AdminFiles-BBB8knca.js.map → AdminFiles-kvuUaASF.js.map} +1 -1
  7. package/dist/admin/AdminJobDashboard-CrPxp0W1.js +485 -0
  8. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +1 -0
  9. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js +678 -0
  10. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +1 -0
  11. package/dist/admin/AdminJobRegistry-CNX5cpDx.js +301 -0
  12. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +1 -0
  13. package/dist/admin/{AdminLayout-CsjvpeD1.js → AdminLayout-e-ZP5nWw.js} +1 -1
  14. package/dist/admin/{AdminLayout-CsjvpeD1.js.map → AdminLayout-e-ZP5nWw.js.map} +1 -1
  15. package/dist/admin/{AdminNotifications-LwR6RKrx.js → AdminNotifications-DeHJFf6W.js} +3 -5
  16. package/dist/admin/{AdminNotifications-LwR6RKrx.js.map → AdminNotifications-DeHJFf6W.js.map} +1 -1
  17. package/dist/admin/{AdminParameters-B_83Vie9.js → AdminParameters-iQE8o7a7.js} +43 -36
  18. package/dist/admin/AdminParameters-iQE8o7a7.js.map +1 -0
  19. package/dist/admin/{AdminSessions-CWnPosdd.js → AdminSessions-oKJCbd7w.js} +5 -7
  20. package/dist/admin/AdminSessions-oKJCbd7w.js.map +1 -0
  21. package/dist/admin/{AdminUserAudits-nHv636E_.js → AdminUserAudits-BNCEle_E.js} +6 -8
  22. package/dist/admin/AdminUserAudits-BNCEle_E.js.map +1 -0
  23. package/dist/admin/{AdminUserCreate-CjYD3Kjc.js → AdminUserCreate-CgqeFwCt.js} +6 -7
  24. package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +1 -0
  25. package/dist/admin/{AdminUserDetails-Ccq-LsZ0.js → AdminUserDetails-DDe1A1GP.js} +30 -29
  26. package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +1 -0
  27. package/dist/admin/{AdminUserLayout-7s41DiF_.js → AdminUserLayout-HAlobhWf.js} +18 -16
  28. package/dist/admin/AdminUserLayout-HAlobhWf.js.map +1 -0
  29. package/dist/admin/{AdminUserSessions-Ds3ODq_d.js → AdminUserSessions-Bq1LnVLf.js} +5 -7
  30. package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +1 -0
  31. package/dist/admin/{AdminUserSettings-CGh4gROo.js → AdminUserSettings-BRsBZoxV.js} +10 -10
  32. package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +1 -0
  33. package/dist/admin/{AdminUsers-CvPiBzQK.js → AdminUsers-D71kIOSn.js} +6 -8
  34. package/dist/admin/AdminUsers-D71kIOSn.js.map +1 -0
  35. package/dist/admin/index.d.ts +7 -83
  36. package/dist/admin/index.d.ts.map +1 -1
  37. package/dist/admin/index.js +49 -70
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/auth/{Login-DS_OqA0G.js → Login-BS_FYTy0.js} +13 -8
  40. package/dist/auth/Login-BS_FYTy0.js.map +1 -0
  41. package/dist/auth/{Profile-Di7N7HZL.js → Profile-CjDsW378.js} +16 -10
  42. package/dist/auth/Profile-CjDsW378.js.map +1 -0
  43. package/dist/auth/{Register-BRR2_gux.js → Register-C5eqzAaD.js} +21 -12
  44. package/dist/auth/Register-C5eqzAaD.js.map +1 -0
  45. package/dist/auth/{ResetPassword-oQu72lod.js → ResetPassword-XifinVao.js} +14 -8
  46. package/dist/auth/ResetPassword-XifinVao.js.map +1 -0
  47. package/dist/auth/{VerifyEmail-DC6HPZjd.js → VerifyEmail-DTgbeJOO.js} +6 -4
  48. package/dist/auth/VerifyEmail-DTgbeJOO.js.map +1 -0
  49. package/dist/auth/index.d.ts +4 -0
  50. package/dist/auth/index.d.ts.map +1 -1
  51. package/dist/auth/index.js +15 -14
  52. package/dist/auth/index.js.map +1 -1
  53. package/dist/core/index.d.ts +37 -26
  54. package/dist/core/index.d.ts.map +1 -1
  55. package/dist/core/index.js +444 -193
  56. package/dist/core/index.js.map +1 -1
  57. package/dist/demo/DemoDataTable-lnBKWBf8.js +362 -0
  58. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +1 -0
  59. package/dist/demo/{DemoHome-DpRrPlBC.js → DemoHome-CUMZsYaH.js} +6 -7
  60. package/dist/demo/DemoHome-CUMZsYaH.js.map +1 -0
  61. package/dist/demo/{DemoJsonViewer-zeucGKHV.js → DemoJsonViewer-_uokbGaW.js} +17 -19
  62. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +1 -0
  63. package/dist/demo/{DemoLayout-PhgbAAiQ.js → DemoLayout-DHVoacE6.js} +2 -4
  64. package/dist/demo/{DemoLayout-PhgbAAiQ.js.map → DemoLayout-DHVoacE6.js.map} +1 -1
  65. package/dist/demo/{DemoLogin-DSzP0Lkv.js → DemoLogin-DjJ9314c.js} +22 -17
  66. package/dist/demo/DemoLogin-DjJ9314c.js.map +1 -0
  67. package/dist/demo/{DemoRegister-DavFBsCz.js → DemoRegister-DzkJ5M83.js} +34 -25
  68. package/dist/demo/DemoRegister-DzkJ5M83.js.map +1 -0
  69. package/dist/demo/{DemoResetPassword-BS2rIAQK.js → DemoResetPassword-DWh4_BpQ.js} +27 -21
  70. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +1 -0
  71. package/dist/demo/{DemoSidebar-zNkUmHRl.js → DemoSidebar-C1csnGhX.js} +2 -2
  72. package/dist/demo/{DemoSidebar-zNkUmHRl.js.map → DemoSidebar-C1csnGhX.js.map} +1 -1
  73. package/dist/demo/{DemoTypeForm-B9q7oT0b.js → DemoTypeForm-CWz6fJrJ.js} +2 -2
  74. package/dist/demo/{DemoTypeForm-B9q7oT0b.js.map → DemoTypeForm-CWz6fJrJ.js.map} +1 -1
  75. package/dist/demo/{DemoVerifyEmail-Bi4SdWz0.js → DemoVerifyEmail-DbU_tCj8.js} +13 -11
  76. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +1 -0
  77. package/dist/demo/{IconGoogle-CTeZyrek.js → IconGoogle-Ch1m3Uzl.js} +1 -1
  78. package/dist/demo/{IconGoogle-CTeZyrek.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
  79. package/dist/demo/{Showcase-C9btr_SJ.js → Showcase-BzoXNlCn.js} +10 -10
  80. package/dist/demo/Showcase-BzoXNlCn.js.map +1 -0
  81. package/dist/demo/index.d.ts +1 -68
  82. package/dist/demo/index.d.ts.map +1 -1
  83. package/dist/demo/index.js +11 -15
  84. package/dist/demo/index.js.map +1 -1
  85. package/dist/json/index.js +2 -2
  86. package/dist/json/index.js.map +1 -1
  87. package/package.json +9 -5
  88. package/src/admin/AdminRouter.ts +36 -5
  89. package/src/admin/components/audits/AdminAudits.tsx +5 -5
  90. package/src/admin/components/jobs/AdminJobDashboard.tsx +455 -0
  91. package/src/admin/components/jobs/AdminJobExecutions.tsx +693 -0
  92. package/src/admin/components/jobs/AdminJobRegistry.tsx +325 -0
  93. package/src/admin/components/keys/AdminApiKeys.tsx +28 -31
  94. package/src/admin/components/parameters/AdminParameters.tsx +3 -3
  95. package/src/admin/components/parameters/ParameterDetails.tsx +34 -29
  96. package/src/admin/components/parameters/ParameterEmptyState.tsx +5 -5
  97. package/src/admin/components/parameters/ParameterHistory.tsx +11 -19
  98. package/src/admin/components/parameters/ParameterTree.tsx +16 -18
  99. package/src/admin/components/sessions/AdminSessions.tsx +3 -3
  100. package/src/admin/components/shared/AdminResourceHeader.tsx +20 -16
  101. package/src/admin/components/users/AdminUserAudits.tsx +5 -5
  102. package/src/admin/components/users/AdminUserCreate.tsx +3 -3
  103. package/src/admin/components/users/AdminUserDetails.tsx +51 -53
  104. package/src/admin/components/users/AdminUserLayout.tsx +7 -7
  105. package/src/admin/components/users/AdminUserSessions.tsx +3 -3
  106. package/src/admin/components/users/AdminUserSettings.tsx +9 -9
  107. package/src/admin/components/users/AdminUsers.tsx +5 -5
  108. package/src/admin/components/verifications/AdminVerifications.tsx +3 -3
  109. package/src/admin/index.ts +0 -24
  110. package/src/auth/components/Login.tsx +13 -13
  111. package/src/auth/components/Profile.tsx +17 -26
  112. package/src/auth/components/Register.tsx +21 -31
  113. package/src/auth/components/ResetPassword.tsx +13 -22
  114. package/src/auth/components/VerifyEmail.tsx +5 -5
  115. package/src/auth/components/buttons/UserButton.tsx +14 -4
  116. package/src/core/components/buttons/ActionButton.tsx +9 -2
  117. package/src/core/components/data/ErrorViewer.tsx +15 -15
  118. package/src/core/components/dialogs/AlertDialog.tsx +3 -3
  119. package/src/core/components/dialogs/ConfirmDialog.tsx +3 -3
  120. package/src/core/components/dialogs/PromptDialog.tsx +3 -3
  121. package/src/core/components/form/Control.tsx +9 -0
  122. package/src/core/components/form/ControlArray.tsx +6 -7
  123. package/src/core/components/form/ControlObject.tsx +3 -3
  124. package/src/core/components/form/ControlQueryBuilder.tsx +20 -22
  125. package/src/core/components/form/ControlSelect.tsx +4 -0
  126. package/src/core/components/form/TypeForm.tsx +7 -0
  127. package/src/core/components/layout/Breadcrumb.tsx +6 -6
  128. package/src/core/components/layout/Omnibar.tsx +2 -1
  129. package/src/core/components/layout/Sidebar.tsx +5 -1
  130. package/src/core/components/table/ColumnPicker.tsx +47 -31
  131. package/src/core/components/table/DataTable.tsx +277 -201
  132. package/src/core/components/table/DataTableFilters.tsx +8 -0
  133. package/src/core/components/table/DataTableToolbar.tsx +98 -5
  134. package/src/core/components/table/FilterPicker.tsx +28 -26
  135. package/src/core/components/table/types.ts +52 -37
  136. package/src/core/components/table/useTableSelection.ts +83 -0
  137. package/src/core/styles.css +1 -0
  138. package/src/core/utils/parseInput.ts +1 -0
  139. package/src/demo/components/DemoHome.tsx +5 -5
  140. package/src/demo/components/core/DemoDataTable.tsx +209 -5
  141. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  142. package/src/demo/components/shared/MacWindow.tsx +7 -7
  143. package/src/demo/components/shared/Showcase.tsx +3 -3
  144. package/src/demo/index.ts +0 -11
  145. package/src/json/components/JsonViewer.tsx +3 -3
  146. package/dist/admin/AdminApiKeys-CoTOTfgU.js.map +0 -1
  147. package/dist/admin/AdminAudits-BmsxFbDa.js.map +0 -1
  148. package/dist/admin/AdminJobs-C604joTz.js +0 -698
  149. package/dist/admin/AdminJobs-C604joTz.js.map +0 -1
  150. package/dist/admin/AdminParameters-B_83Vie9.js.map +0 -1
  151. package/dist/admin/AdminSessions-CWnPosdd.js.map +0 -1
  152. package/dist/admin/AdminUserAudits-nHv636E_.js.map +0 -1
  153. package/dist/admin/AdminUserCreate-CjYD3Kjc.js.map +0 -1
  154. package/dist/admin/AdminUserDetails-Ccq-LsZ0.js.map +0 -1
  155. package/dist/admin/AdminUserLayout-7s41DiF_.js.map +0 -1
  156. package/dist/admin/AdminUserSessions-Ds3ODq_d.js.map +0 -1
  157. package/dist/admin/AdminUserSettings-CGh4gROo.js.map +0 -1
  158. package/dist/admin/AdminUsers-CvPiBzQK.js.map +0 -1
  159. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  160. package/dist/auth/Login-DS_OqA0G.js.map +0 -1
  161. package/dist/auth/Profile-Di7N7HZL.js.map +0 -1
  162. package/dist/auth/Register-BRR2_gux.js.map +0 -1
  163. package/dist/auth/ResetPassword-oQu72lod.js.map +0 -1
  164. package/dist/auth/VerifyEmail-DC6HPZjd.js.map +0 -1
  165. package/dist/demo/DemoDataTable-DCsJq8v5.js +0 -149
  166. package/dist/demo/DemoDataTable-DCsJq8v5.js.map +0 -1
  167. package/dist/demo/DemoHome-DpRrPlBC.js.map +0 -1
  168. package/dist/demo/DemoJsonViewer-zeucGKHV.js.map +0 -1
  169. package/dist/demo/DemoLogin-DSzP0Lkv.js.map +0 -1
  170. package/dist/demo/DemoRegister-DavFBsCz.js.map +0 -1
  171. package/dist/demo/DemoResetPassword-BS2rIAQK.js.map +0 -1
  172. package/dist/demo/DemoVerifyEmail-Bi4SdWz0.js.map +0 -1
  173. package/dist/demo/Showcase-C9btr_SJ.js.map +0 -1
  174. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  175. package/src/admin/components/jobs/AdminJobs.tsx +0 -772
@@ -2,7 +2,7 @@ import { ActionButton } from "@alepha/ui";
2
2
  import { useAuth } from "alepha/react/auth";
3
3
  import { IconAt, IconCalendar, IconId, IconShield, IconUser } from "@tabler/icons-react";
4
4
  import { useRouter } from "alepha/react/router";
5
- import { Avatar, Badge, Card, Flex, Group, Stack, Text, Title } from "@mantine/core";
5
+ import { Avatar, Badge, Card, Flex, Text, Title } from "@mantine/core";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
 
8
8
  //#region ../../src/auth/components/Profile.tsx
@@ -16,14 +16,16 @@ const Profile = () => {
16
16
  flex: 1,
17
17
  justify: "center",
18
18
  align: "center",
19
- children: /* @__PURE__ */ jsxs(Stack, {
19
+ children: /* @__PURE__ */ jsxs(Flex, {
20
+ direction: "column",
20
21
  gap: "md",
21
22
  w: 400,
22
23
  children: [/* @__PURE__ */ jsx(Card, {
23
24
  withBorder: true,
24
25
  p: "xl",
25
26
  bg: "var(--alepha-elevated)",
26
- children: /* @__PURE__ */ jsxs(Stack, {
27
+ children: /* @__PURE__ */ jsxs(Flex, {
28
+ direction: "column",
27
29
  gap: "lg",
28
30
  children: [
29
31
  /* @__PURE__ */ jsxs(Flex, {
@@ -36,7 +38,8 @@ const Profile = () => {
36
38
  radius: "xl",
37
39
  color: "blue",
38
40
  children: !picture && /* @__PURE__ */ jsx(IconUser, { size: 48 })
39
- }), /* @__PURE__ */ jsxs(Stack, {
41
+ }), /* @__PURE__ */ jsxs(Flex, {
42
+ direction: "column",
40
43
  gap: 4,
41
44
  align: "center",
42
45
  children: [/* @__PURE__ */ jsx(Title, {
@@ -49,7 +52,8 @@ const Profile = () => {
49
52
  })]
50
53
  })]
51
54
  }),
52
- /* @__PURE__ */ jsxs(Stack, {
55
+ /* @__PURE__ */ jsxs(Flex, {
56
+ direction: "column",
53
57
  gap: "sm",
54
58
  children: [
55
59
  email && /* @__PURE__ */ jsx(ProfileField, {
@@ -75,7 +79,7 @@ const Profile = () => {
75
79
  roles && roles.length > 0 && /* @__PURE__ */ jsx(ProfileField, {
76
80
  icon: /* @__PURE__ */ jsx(IconShield, { size: 18 }),
77
81
  label: "Roles",
78
- children: /* @__PURE__ */ jsx(Group, {
82
+ children: /* @__PURE__ */ jsx(Flex, {
79
83
  gap: "xs",
80
84
  children: roles.map((role) => /* @__PURE__ */ jsx(Badge, {
81
85
  size: "sm",
@@ -87,7 +91,7 @@ const Profile = () => {
87
91
  organizations && organizations.length > 0 && /* @__PURE__ */ jsx(ProfileField, {
88
92
  icon: /* @__PURE__ */ jsx(IconCalendar, { size: 18 }),
89
93
  label: "Organizations",
90
- children: /* @__PURE__ */ jsx(Group, {
94
+ children: /* @__PURE__ */ jsx(Flex, {
91
95
  gap: "xs",
92
96
  children: organizations.map((org) => /* @__PURE__ */ jsx(Badge, {
93
97
  size: "sm",
@@ -98,7 +102,8 @@ const Profile = () => {
98
102
  })
99
103
  ]
100
104
  }),
101
- /* @__PURE__ */ jsx(Stack, {
105
+ /* @__PURE__ */ jsx(Flex, {
106
+ direction: "column",
102
107
  gap: "sm",
103
108
  mt: "md",
104
109
  children: /* @__PURE__ */ jsx(ActionButton, {
@@ -127,7 +132,8 @@ const ProfileField = ({ icon, label, children }) => {
127
132
  c: "dimmed",
128
133
  mt: 2,
129
134
  children: icon
130
- }), /* @__PURE__ */ jsxs(Stack, {
135
+ }), /* @__PURE__ */ jsxs(Flex, {
136
+ direction: "column",
131
137
  gap: 2,
132
138
  flex: 1,
133
139
  children: [/* @__PURE__ */ jsx(Text, {
@@ -146,4 +152,4 @@ const ProfileField = ({ icon, label, children }) => {
146
152
 
147
153
  //#endregion
148
154
  export { Profile as default };
149
- //# sourceMappingURL=Profile-Di7N7HZL.js.map
155
+ //# sourceMappingURL=Profile-CjDsW378.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profile-CjDsW378.js","names":[],"sources":["../../src/auth/components/Profile.tsx"],"sourcesContent":["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\";\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\ninterface ProfileFieldProps {\n icon: React.ReactNode;\n label: string;\n children: React.ReactNode;\n}\n\nconst ProfileField = ({ icon, label, children }: ProfileFieldProps) => {\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 Profile;\n"],"mappings":";;;;;;;;AAaA,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;;AAUX,MAAM,gBAAgB,EAAE,MAAM,OAAO,eAAkC;AACrE,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"}
@@ -6,7 +6,7 @@ import { useAuth } from "alepha/react/auth";
6
6
  import { useI18n } from "alepha/react/i18n";
7
7
  import { IconAlertCircle, IconLock, IconMail, IconPhone, IconUser } from "@tabler/icons-react";
8
8
  import { useRouter } from "alepha/react/router";
9
- import { Alert, Card, Flex, Group, Image, PinInput, Stack, Text, Title } from "@mantine/core";
9
+ import { Alert, Card, Flex, Image, PinInput, Text, Title } from "@mantine/core";
10
10
  import { useClient } from "alepha/react";
11
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
12
  import { useForm } from "alepha/react/form";
@@ -116,14 +116,16 @@ const Register = (props) => {
116
116
  flex: 1,
117
117
  justify: "center",
118
118
  align: "center",
119
- children: /* @__PURE__ */ jsx(Stack, {
119
+ children: /* @__PURE__ */ jsx(Flex, {
120
+ direction: "column",
120
121
  gap: "sm",
121
122
  w: 360,
122
123
  children: /* @__PURE__ */ jsx(Card, {
123
124
  withBorder: true,
124
125
  p: "lg",
125
126
  bg: "var(--alepha-elevated)",
126
- children: /* @__PURE__ */ jsxs(Stack, {
127
+ children: /* @__PURE__ */ jsxs(Flex, {
128
+ direction: "column",
127
129
  gap: "md",
128
130
  children: [
129
131
  /* @__PURE__ */ jsx(Text, {
@@ -147,7 +149,8 @@ const Register = (props) => {
147
149
  children: verificationError
148
150
  })
149
151
  }),
150
- registrationState.intent.expectEmailVerification && /* @__PURE__ */ jsxs(Stack, {
152
+ registrationState.intent.expectEmailVerification && /* @__PURE__ */ jsxs(Flex, {
153
+ direction: "column",
151
154
  gap: "xs",
152
155
  children: [/* @__PURE__ */ jsx(Text, {
153
156
  size: "sm",
@@ -165,7 +168,8 @@ const Register = (props) => {
165
168
  })
166
169
  })]
167
170
  }),
168
- registrationState.intent.expectPhoneVerification && /* @__PURE__ */ jsxs(Stack, {
171
+ registrationState.intent.expectPhoneVerification && /* @__PURE__ */ jsxs(Flex, {
172
+ direction: "column",
169
173
  gap: "xs",
170
174
  children: [/* @__PURE__ */ jsx(Text, {
171
175
  size: "sm",
@@ -209,16 +213,19 @@ const Register = (props) => {
209
213
  flex: 1,
210
214
  justify: "center",
211
215
  align: "center",
212
- children: /* @__PURE__ */ jsxs(Stack, {
216
+ children: /* @__PURE__ */ jsxs(Flex, {
217
+ direction: "column",
213
218
  gap: "sm",
214
219
  w: 360,
215
220
  children: [/* @__PURE__ */ jsx(Card, {
216
221
  withBorder: true,
217
222
  p: "lg",
218
223
  bg: "var(--alepha-elevated)",
219
- children: /* @__PURE__ */ jsxs(Stack, {
224
+ children: /* @__PURE__ */ jsxs(Flex, {
225
+ direction: "column",
220
226
  gap: "md",
221
- children: [(settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Stack, {
227
+ children: [(settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Flex, {
228
+ direction: "column",
222
229
  gap: "xs",
223
230
  align: "center",
224
231
  mb: "xs",
@@ -256,7 +263,8 @@ const Register = (props) => {
256
263
  })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
257
264
  credentialsProvider && /* @__PURE__ */ jsx("form", {
258
265
  ...form.props,
259
- children: /* @__PURE__ */ jsxs(Stack, {
266
+ children: /* @__PURE__ */ jsxs(Flex, {
267
+ direction: "column",
260
268
  flex: 1,
261
269
  gap: "md",
262
270
  children: [
@@ -299,7 +307,7 @@ const Register = (props) => {
299
307
  ]
300
308
  })
301
309
  }),
302
- showOrDivider && /* @__PURE__ */ jsxs(Group, {
310
+ showOrDivider && /* @__PURE__ */ jsxs(Flex, {
303
311
  align: "center",
304
312
  justify: "center",
305
313
  gap: "md",
@@ -321,7 +329,8 @@ const Register = (props) => {
321
329
  })
322
330
  ]
323
331
  }),
324
- externalMethods.length > 0 && /* @__PURE__ */ jsx(Stack, {
332
+ externalMethods.length > 0 && /* @__PURE__ */ jsx(Flex, {
333
+ direction: "column",
325
334
  gap: "sm",
326
335
  children: externalMethods.map((method) => /* @__PURE__ */ jsx(ActionButton, {
327
336
  variant: "default",
@@ -363,4 +372,4 @@ const leftSection = (name) => {
363
372
 
364
373
  //#endregion
365
374
  export { Register_exports as n, Register as t };
366
- //# sourceMappingURL=Register-BRR2_gux.js.map
375
+ //# sourceMappingURL=Register-C5eqzAaD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Register-C5eqzAaD.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 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 type { AuthRouter } from \"../AuthRouter.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface RegisterProps {\n realmConfig: RealmConfig;\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<AuthRouter>();\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.usernameRequired) required.push(\"username\");\n if (settings.emailRequired) required.push(\"email\");\n if (settings.phoneRequired) 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\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 // Registration form phase UI\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 {/* Realm branding */}\n {(settings.logoUrl ||\n settings.displayName ||\n 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\n variant=\"light\"\n color=\"yellow\"\n icon={<IconAlertCircle />}\n >\n <Text size=\"sm\">{tr(\"registerDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={router.path(\"login\", {\n query: { realm: props.realmConfig.realmName },\n })}\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.usernameEnabled !== false &&\n form.input.username && (\n <Control\n title={tr(\"registerUsername\")}\n input={form.input.username}\n icon={<IconUser />}\n text={{\n autoComplete: \"username\",\n }}\n />\n )}\n {settings.emailEnabled !== false && form.input.email && (\n <Control\n title={tr(\"registerEmail\")}\n input={form.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n }}\n />\n )}\n {settings.phoneEnabled === true &&\n form.input.phoneNumber && (\n <Control\n title={tr(\"registerPhone\")}\n input={form.input.phoneNumber}\n icon={<IconPhone />}\n text={{\n autoComplete: \"tel\",\n }}\n />\n )}\n <Control\n title={tr(\"registerPassword\")}\n input={form.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <Control\n title={tr(\"registerConfirmPassword\")}\n input={form.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton\n form={form}\n color={\"blue\"}\n variant={\"filled\"}\n >\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={router.path(\"login\", {\n query: { realm: props.realmConfig.realmName },\n })}\n anchorProps={{ inherit: true }}\n >\n {tr(\"registerSignIn\")}\n </ActionButton>\n </Text>\n </>\n )}\n </Flex>\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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"}
@@ -4,7 +4,7 @@ import { AlephaError, t } from "alepha";
4
4
  import { useI18n } from "alepha/react/i18n";
5
5
  import { IconAlertCircle, IconCheck, IconInfoCircle, IconLock, IconMail } from "@tabler/icons-react";
6
6
  import { useRouter } from "alepha/react/router";
7
- import { Alert, Card, Flex, Image, PinInput, Stack, Text, Title } from "@mantine/core";
7
+ import { Alert, Card, Flex, Image, PinInput, Text, Title } from "@mantine/core";
8
8
  import { useClient } from "alepha/react";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useForm } from "alepha/react/form";
@@ -83,17 +83,20 @@ const ResetPassword = (props) => {
83
83
  flex: 1,
84
84
  justify: "center",
85
85
  align: "center",
86
- children: /* @__PURE__ */ jsxs(Stack, {
86
+ children: /* @__PURE__ */ jsxs(Flex, {
87
+ direction: "column",
87
88
  gap: "sm",
88
89
  w: 360,
89
90
  children: [/* @__PURE__ */ jsx(Card, {
90
91
  withBorder: true,
91
92
  p: "lg",
92
93
  bg: "var(--alepha-elevated)",
93
- children: /* @__PURE__ */ jsxs(Stack, {
94
+ children: /* @__PURE__ */ jsxs(Flex, {
95
+ direction: "column",
94
96
  gap: "md",
95
97
  children: [
96
- (settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Stack, {
98
+ (settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Flex, {
99
+ direction: "column",
97
100
  gap: "xs",
98
101
  align: "center",
99
102
  mb: "xs",
@@ -140,7 +143,8 @@ const ResetPassword = (props) => {
140
143
  children: tr("resetPasswordBackToSignIn")
141
144
  })] }) : resetState.step === "email" ? /* @__PURE__ */ jsx("form", {
142
145
  ...emailForm.props,
143
- children: /* @__PURE__ */ jsxs(Stack, {
146
+ children: /* @__PURE__ */ jsxs(Flex, {
147
+ direction: "column",
144
148
  flex: 1,
145
149
  gap: "md",
146
150
  children: [
@@ -172,7 +176,8 @@ const ResetPassword = (props) => {
172
176
  })
173
177
  ]
174
178
  })
175
- }) : resetState.step === "code" ? /* @__PURE__ */ jsxs(Stack, {
179
+ }) : resetState.step === "code" ? /* @__PURE__ */ jsxs(Flex, {
180
+ direction: "column",
176
181
  gap: "md",
177
182
  children: [
178
183
  /* @__PURE__ */ jsx(Text, {
@@ -216,7 +221,8 @@ const ResetPassword = (props) => {
216
221
  ]
217
222
  }) : resetState.step === "password" ? /* @__PURE__ */ jsx("form", {
218
223
  ...passwordForm.props,
219
- children: /* @__PURE__ */ jsxs(Stack, {
224
+ children: /* @__PURE__ */ jsxs(Flex, {
225
+ direction: "column",
220
226
  flex: 1,
221
227
  gap: "md",
222
228
  children: [
@@ -277,4 +283,4 @@ const ResetPassword = (props) => {
277
283
 
278
284
  //#endregion
279
285
  export { ResetPassword_exports as n, ResetPassword as t };
280
- //# sourceMappingURL=ResetPassword-oQu72lod.js.map
286
+ //# sourceMappingURL=ResetPassword-XifinVao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResetPassword-XifinVao.js","names":[],"sources":["../../src/auth/components/ResetPassword.tsx"],"sourcesContent":["import { ActionButton, Control } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Image, PinInput, Text, Title } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconInfoCircle,\n IconLock,\n IconMail,\n} from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type {\n PasswordResetIntentResponse,\n RealmConfig,\n UserController,\n} from \"alepha/api/users\";\nimport { resetPasswordRequestSchema } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\n\nexport interface ResetPasswordProps {\n realmConfig: RealmConfig;\n}\n\ntype Step = \"email\" | \"code\" | \"password\" | \"success\";\n\ninterface ResetState {\n step: Step;\n intent?: PasswordResetIntentResponse;\n email?: string;\n code?: string;\n}\n\nconst ResetPassword = (props: ResetPasswordProps) => {\n const router = useRouter<AuthRouter>();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const [resetState, setResetState] = useState<ResetState>({ step: \"email\" });\n const [error, setError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const redirect = router.query.r || \"/\";\n\n const settings = props.realmConfig.settings;\n const isResetPasswordAllowed = settings?.resetPasswordAllowed !== false;\n\n // Phase 1: Request password reset intent\n const emailForm = useForm({\n schema: resetPasswordRequestSchema,\n handler: async (data) => {\n setError(null);\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: data.email },\n });\n\n setResetState({\n step: \"code\",\n intent,\n email: data.email,\n });\n },\n });\n\n // Phase 2: Complete password reset\n const passwordForm = useForm(\n {\n schema: t.object({\n password: t.string({ minLength: 8 }),\n confirmPassword: t.string({ minLength: 8 }),\n }),\n handler: async (data) => {\n if (data.password !== data.confirmPassword) {\n throw new AlephaError(\"Passwords do not match\");\n }\n\n if (!resetState.intent || !resetState.code) {\n throw new AlephaError(\"Invalid reset state\");\n }\n\n await userCtrl.completePasswordReset({\n body: {\n intentId: resetState.intent.intentId,\n code: resetState.code,\n newPassword: data.password,\n },\n });\n\n setResetState({ step: \"success\" });\n },\n },\n [resetState.intent, resetState.code],\n );\n\n const handleCodeComplete = (value: string) => {\n if (value.length === 6) {\n setResetState((prev) => ({\n ...prev,\n step: \"password\",\n code: value,\n }));\n }\n };\n\n const handleResendCode = async () => {\n if (!resetState.email) return;\n\n setIsSubmitting(true);\n setError(null);\n\n try {\n const intent = await userCtrl.createPasswordResetIntent({\n query: { userRealmName: props.realmConfig.realmName },\n body: { email: resetState.email },\n });\n\n setResetState((prev) => ({\n ...prev,\n intent,\n }));\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to resend code\");\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl ||\n settings.displayName ||\n 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 {error && (\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error}</Text>\n </Alert>\n )}\n\n {!isResetPasswordAllowed ? (\n <>\n <Alert\n variant=\"light\"\n color=\"yellow\"\n icon={<IconAlertCircle />}\n >\n <Text size=\"sm\">{tr(\"resetPasswordDisabled\")}</Text>\n </Alert>\n <ActionButton\n href={router.path(\"login\", {\n query: { realm: props.realmConfig.realmName },\n })}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n ) : resetState.step === \"email\" ? (\n <form {...emailForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterEmail\")}\n </Text>\n <Control\n title={tr(\"resetPasswordEmail\")}\n input={emailForm.input.email}\n icon={<IconMail />}\n text={{\n autoComplete: \"email\",\n autoFocus: true,\n disabled: !isResetPasswordAllowed,\n }}\n />\n <ActionButton\n form={emailForm}\n disabled={!isResetPasswordAllowed}\n >\n {tr(\"resetPasswordSendCode\")}\n </ActionButton>\n </Flex>\n </form>\n ) : resetState.step === \"code\" ? (\n <Flex direction=\"column\" gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"blue\" icon={<IconInfoCircle />}>\n <Text size=\"sm\">{tr(\"resetPasswordCodeSent\")}</Text>\n </Alert>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"resetPasswordEnterCode\")}\n </Text>\n <Flex justify=\"center\">\n <PinInput\n length={6}\n type=\"number\"\n autoFocus\n oneTimeCode\n onComplete={handleCodeComplete}\n aria-label=\"Password reset verification code\"\n />\n </Flex>\n <ActionButton\n variant=\"subtle\"\n onClick={handleResendCode}\n loading={isSubmitting}\n >\n {tr(\"resetPasswordResendCode\")}\n </ActionButton>\n </Flex>\n ) : resetState.step === \"password\" ? (\n <form {...passwordForm.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"resetPasswordTitle\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\">\n {tr(\"resetPasswordEnterNewPassword\")}\n </Text>\n <Control\n title={tr(\"resetPasswordNewPassword\")}\n input={passwordForm.input.password}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n autoFocus: true,\n }}\n />\n <Control\n title={tr(\"resetPasswordConfirmPassword\")}\n input={passwordForm.input.confirmPassword}\n icon={<IconLock />}\n password={{\n autoComplete: \"new-password\",\n }}\n />\n <ActionButton form={passwordForm}>\n {tr(\"resetPasswordSetNewPassword\")}\n </ActionButton>\n </Flex>\n </form>\n ) : (\n <>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"resetPasswordSuccess\")}</Text>\n </Alert>\n <ActionButton\n href={router.path(\"login\", {\n query: { realm: props.realmConfig.realmName },\n })}\n >\n {tr(\"resetPasswordBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"resetPasswordCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default ResetPassword;\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { ActionButton } from "@alepha/ui";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { IconAlertCircle, IconCheck, IconMailCheck } from "@tabler/icons-react";
5
5
  import { useRouter, useRouterState } from "alepha/react/router";
6
- import { Alert, Card, Flex, Loader, Stack, Text } from "@mantine/core";
6
+ import { Alert, Card, Flex, Loader, Text } from "@mantine/core";
7
7
  import { useClient } from "alepha/react";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { useEffect, useState } from "react";
@@ -43,14 +43,16 @@ const VerifyEmail = (_props) => {
43
43
  flex: 1,
44
44
  justify: "center",
45
45
  align: "center",
46
- children: /* @__PURE__ */ jsx(Stack, {
46
+ children: /* @__PURE__ */ jsx(Flex, {
47
+ direction: "column",
47
48
  gap: "sm",
48
49
  w: 400,
49
50
  children: /* @__PURE__ */ jsx(Card, {
50
51
  withBorder: true,
51
52
  p: "lg",
52
53
  bg: "var(--alepha-elevated)",
53
- children: /* @__PURE__ */ jsxs(Stack, {
54
+ children: /* @__PURE__ */ jsxs(Flex, {
55
+ direction: "column",
54
56
  gap: "md",
55
57
  align: "center",
56
58
  children: [
@@ -130,4 +132,4 @@ const VerifyEmail = (_props) => {
130
132
 
131
133
  //#endregion
132
134
  export { VerifyEmail_exports as n, VerifyEmail as t };
133
- //# sourceMappingURL=VerifyEmail-DC6HPZjd.js.map
135
+ //# sourceMappingURL=VerifyEmail-DTgbeJOO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerifyEmail-DTgbeJOO.js","names":[],"sources":["../../src/auth/components/VerifyEmail.tsx"],"sourcesContent":["import { ActionButton } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Loader, Text } from \"@mantine/core\";\nimport { IconAlertCircle, IconCheck, IconMailCheck } from \"@tabler/icons-react\";\nimport type { UserController } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter, useRouterState } from \"alepha/react/router\";\nimport { useEffect, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\n\nexport type VerifyEmailProps = {};\n\ntype Step = \"verifying\" | \"success\" | \"error\";\n\nconst VerifyEmail = (_props: VerifyEmailProps) => {\n const router = useRouter<AuthRouter>();\n const state = useRouterState();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n\n const [step, setStep] = useState<Step>(\"verifying\");\n const [error, setError] = useState<string | null>(null);\n\n const email = state.query.email as string | undefined;\n const token = state.query.token as string | undefined;\n\n useEffect(() => {\n const verify = async () => {\n if (!email || !token) {\n setError(tr(\"verifyEmailMissingParams\"));\n setStep(\"error\");\n return;\n }\n\n try {\n await userCtrl.verifyEmail({\n body: { email, token },\n });\n setStep(\"success\");\n } catch (err) {\n setError(err instanceof Error ? err.message : tr(\"verifyEmailFailed\"));\n setStep(\"error\");\n }\n };\n\n verify();\n }, [email, token]);\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" gap=\"sm\" w={400}>\n <Card withBorder p=\"lg\" bg=\"var(--alepha-elevated)\">\n <Flex direction=\"column\" gap=\"md\" align=\"center\">\n {step === \"verifying\" && (\n <>\n <Loader size=\"lg\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailVerifying\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"verifyEmailPleaseWait\")}\n </Text>\n </>\n )}\n\n {step === \"success\" && (\n <>\n <IconMailCheck size={48} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"verifyEmailSuccess\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailSignIn\")}\n </ActionButton>\n </>\n )}\n\n {step === \"error\" && (\n <>\n <IconAlertCircle size={48} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error || tr(\"verifyEmailFailed\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n </Flex>\n </Flex>\n );\n};\n\nexport default VerifyEmail;\n"],"mappings":";;;;;;;;;;;;AAeA,MAAM,eAAe,WAA6B;CAChD,MAAM,SAAS,WAAuB;CACtC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,WAAW,WAA2B;CAC5C,MAAM,EAAE,OAAO,SAAyB;CAExC,MAAM,CAAC,MAAM,WAAW,SAAe,YAAY;CACnD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CAEvD,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,QAAQ,MAAM,MAAM;AAE1B,iBAAgB;EACd,MAAM,SAAS,YAAY;AACzB,OAAI,CAAC,SAAS,CAAC,OAAO;AACpB,aAAS,GAAG,2BAA2B,CAAC;AACxC,YAAQ,QAAQ;AAChB;;AAGF,OAAI;AACF,UAAM,SAAS,YAAY,EACzB,MAAM;KAAE;KAAO;KAAO,EACvB,CAAC;AACF,YAAQ,UAAU;YACX,KAAK;AACZ,aAAS,eAAe,QAAQ,IAAI,UAAU,GAAG,oBAAoB,CAAC;AACtE,YAAQ,QAAQ;;;AAIpB,UAAQ;IACP,CAAC,OAAO,MAAM,CAAC;AAElB,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,oBAAC;GAAK,WAAU;GAAS,KAAI;GAAK,GAAG;aACnC,oBAAC;IAAK;IAAW,GAAE;IAAK,IAAG;cACzB,qBAAC;KAAK,WAAU;KAAS,KAAI;KAAK,OAAM;;MACrC,SAAS,eACR;OACE,oBAAC,UAAO,MAAK,OAAO;OACpB,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,uBAAuB;SACtB;OACP,oBAAC;QAAK,MAAK;QAAK,GAAE;QAAS,IAAG;kBAC3B,GAAG,wBAAwB;SACvB;UACN;MAGJ,SAAS,aACR;OACE,oBAAC;QAAc,MAAM;QAAI,OAAM;SAAiC;OAChE,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAQ,MAAM,oBAAC,cAAY;kBACtD,oBAAC;SAAK,MAAK;mBAAM,GAAG,qBAAqB;UAAQ;SAC3C;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,oBAAoB;SACX;UACd;MAGJ,SAAS,WACR;OACE,oBAAC;QAAgB,MAAM;QAAI,OAAM;SAA+B;OAChE,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAM,MAAM,oBAAC,oBAAkB;kBAC1D,oBAAC;SAAK,MAAK;mBAAM,SAAS,GAAG,oBAAoB;UAAQ;SACnD;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,0BAA0B;SACjB;UACd;;MAEA;KACF;IACF;GACF"}
@@ -189,6 +189,10 @@ interface UserButtonProps extends Omit<ActionProps, "menu" | "icon" | "onClick">
189
189
  * Custom logout label (default: "Sign out")
190
190
  */
191
191
  logoutLabel?: string;
192
+ /**
193
+ * Custom label for the login button when user is not authenticated
194
+ */
195
+ loginLabel?: string;
192
196
  /**
193
197
  * Menu configuration overrides
194
198
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/auth/AuthRouter.ts","../../src/auth/components/buttons/UserButton.tsx","../../src/auth/components/Login.tsx","../../src/auth/components/Register.tsx","../../src/auth/components/ResetPassword.tsx","../../src/auth/components/VerifyEmail.tsx","../../src/auth/primitives/$uiAuth.ts","../../src/auth/index.ts"],"mappings":";;;;;;;;;;cAwBa,UAAA;EAAA,mBACQ,WAAA,EAAW,oBAAA,CAAA,iBAAA,CAAA,eAAA;EAAA,mBACX,IAAA,EAAI,SAAA;EAEvB,UAAA,EAAU,oBAAA,CAAA,aAAA,CAFa,oBAAA,CAEb,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAaV,KAAA,uBAAK,aAAA;;0BAbK,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCV,QAAA,uBAAQ,aAAA;;0BAnBH,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCL,aAAA,uBAAa,aAAA;;0BAnBL,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCR,WAAA,uBAAW,aAAA;;8BAnBE,MAAA,CAAA,OAAA;;;;EAiCb,MAAA,EAAM,oBAAA,CAAA,aAAA,CAdK,oBAAA,CAcL,gBAAA,MAAA,oBAAA,CAAA,mBAAA;EAYN,OAAA,EAAO,oBAAA,CAAA,aAAA,CAZD,oBAAA,CAYC,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAAA,UAUS,eAAA,CAAgB,SAAA,YAAkB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCjHnC,eAAA,SACP,IAAA,CAAK,WAAA;;;;EAIb,SAAA,GAAY,cAAA;;;;EAKZ,WAAA;EDPqB;;;ECYrB,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA;EDVH;;;ECevB,iBAAA;EDbU;;;ECkBV,IAAA,GAAO,SAAA;AAAA;AAAA,cAGH,UAAA,GAAc,KAAA,EAAO,eAAA,KAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCjCzB,UAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAGT,KAAA,GAAS,KAAA,EAAO,UAAA,KAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCgBf,aAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAcT,QAAA,GAAY,KAAA,EAAO,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UClBrB,kBAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAYT,aAAA,GAAiB,KAAA,EAAO,kBAAA,KAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KCnCpC,gBAAA;AAAA,cAIN,WAAA,GAAe,MAAA,EAAQ,gBAAA,KAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;cCThC,OAAA,QAAO,UAAA;;;;;ANkBpB;;;;;;;;;;;;;;cOYa,YAAA,EAAY,MAAA,CAAA,OAAA,CAGvB,MAAA,CAHuB,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/auth/AuthRouter.ts","../../src/auth/components/buttons/UserButton.tsx","../../src/auth/components/Login.tsx","../../src/auth/components/Register.tsx","../../src/auth/components/ResetPassword.tsx","../../src/auth/components/VerifyEmail.tsx","../../src/auth/primitives/$uiAuth.ts","../../src/auth/index.ts"],"mappings":";;;;;;;;;;cAwBa,UAAA;EAAA,mBACQ,WAAA,EAAW,oBAAA,CAAA,iBAAA,CAAA,eAAA;EAAA,mBACX,IAAA,EAAI,SAAA;EAEvB,UAAA,EAAU,oBAAA,CAAA,aAAA,CAFa,oBAAA,CAEb,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAaV,KAAA,uBAAK,aAAA;;0BAbK,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCV,QAAA,uBAAQ,aAAA;;0BAnBH,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCL,aAAA,uBAAa,aAAA;;0BAnBL,MAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCR,WAAA,uBAAW,aAAA;;8BAnBE,MAAA,CAAA,OAAA;;;;EAiCb,MAAA,EAAM,oBAAA,CAAA,aAAA,CAdK,oBAAA,CAcL,gBAAA,MAAA,oBAAA,CAAA,mBAAA;EAYN,OAAA,EAAO,oBAAA,CAAA,aAAA,CAZD,oBAAA,CAYC,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAAA,UAUS,eAAA,CAAgB,SAAA,YAAkB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCjHnC,eAAA,SACP,IAAA,CAAK,WAAA;;;;EAIb,SAAA,GAAY,cAAA;;;;EAKZ,WAAA;EDPqB;;;ECYrB,UAAA;EDVuB;;;ECevB,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA;EDbhB;;;ECkBV,iBAAA;;;;EAKA,IAAA,GAAO,SAAA;AAAA;AAAA,cAGH,UAAA,GAAc,KAAA,EAAO,eAAA,KAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCtCzB,UAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAGT,KAAA,GAAS,KAAA,EAAO,UAAA,KAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCMf,aAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAcT,QAAA,GAAY,KAAA,EAAO,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCjBrB,kBAAA;EACf,WAAA,EAAa,WAAA;AAAA;AAAA,cAYT,aAAA,GAAiB,KAAA,EAAO,kBAAA,KAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KC1BpC,gBAAA;AAAA,cAIN,WAAA,GAAe,MAAA,EAAQ,gBAAA,KAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;cCThC,OAAA,QAAO,UAAA;;;;;ANkBpB;;;;;;;;;;;;;;cOYa,YAAA,EAAY,MAAA,CAAA,OAAA,CAGvB,MAAA,CAHuB,MAAA"}
@@ -1,8 +1,8 @@
1
1
  import "./IconGoogle-Bm18QD2q.js";
2
- import { t as Login } from "./Login-DS_OqA0G.js";
3
- import { t as Register } from "./Register-BRR2_gux.js";
4
- import { t as ResetPassword } from "./ResetPassword-oQu72lod.js";
5
- import { t as VerifyEmail } from "./VerifyEmail-DC6HPZjd.js";
2
+ import { t as Login } from "./Login-BS_FYTy0.js";
3
+ import { t as Register } from "./Register-C5eqzAaD.js";
4
+ import { t as ResetPassword } from "./ResetPassword-XifinVao.js";
5
+ import { t as VerifyEmail } from "./VerifyEmail-DTgbeJOO.js";
6
6
  import { ActionButton, AlephaUI, ui } from "@alepha/ui";
7
7
  import { $context, $inject, $module, AlephaError, t } from "alepha";
8
8
  import { AlephaReactAuth, ReactAuth, useAuth } from "alepha/react/auth";
@@ -161,7 +161,7 @@ var AuthRouter = class {
161
161
  description: "Sign in to your account",
162
162
  path: "/login",
163
163
  schema: { query: realmQuerySchema },
164
- lazy: () => import("./Login-DS_OqA0G.js").then((n) => n.n),
164
+ lazy: () => import("./Login-BS_FYTy0.js").then((n) => n.n),
165
165
  loader: async ({ query, user }) => {
166
166
  if (user) throw new Redirection(query.r || "/");
167
167
  return { realmConfig: await this.loadRealmConfig(query.realm) };
@@ -173,7 +173,7 @@ var AuthRouter = class {
173
173
  description: "Create a new account",
174
174
  path: "/register",
175
175
  schema: { query: realmQuerySchema },
176
- lazy: () => import("./Register-BRR2_gux.js").then((n) => n.n),
176
+ lazy: () => import("./Register-C5eqzAaD.js").then((n) => n.n),
177
177
  loader: async ({ query, user }) => {
178
178
  if (user) throw new Redirection(query.r || "/");
179
179
  return { realmConfig: await this.loadRealmConfig(query.realm) };
@@ -185,7 +185,7 @@ var AuthRouter = class {
185
185
  description: "Reset your account password",
186
186
  path: "/reset-password",
187
187
  schema: { query: realmQuerySchema },
188
- lazy: () => import("./ResetPassword-oQu72lod.js").then((n) => n.n),
188
+ lazy: () => import("./ResetPassword-XifinVao.js").then((n) => n.n),
189
189
  loader: async ({ query, user }) => {
190
190
  if (user) throw new Redirection(query.r || "/");
191
191
  return { realmConfig: await this.loadRealmConfig(query.realm) };
@@ -200,7 +200,7 @@ var AuthRouter = class {
200
200
  email: t.optional(t.string()),
201
201
  token: t.optional(t.string())
202
202
  }) },
203
- lazy: () => import("./VerifyEmail-DC6HPZjd.js").then((n) => n.n)
203
+ lazy: () => import("./VerifyEmail-DTgbeJOO.js").then((n) => n.n)
204
204
  });
205
205
  logout = $page({
206
206
  icon: IconLogout2,
@@ -220,7 +220,7 @@ var AuthRouter = class {
220
220
  description: "View your profile",
221
221
  path: "/profile",
222
222
  can: () => !!this.auth.user,
223
- lazy: () => import("./Profile-Di7N7HZL.js")
223
+ lazy: () => import("./Profile-CjDsW378.js")
224
224
  });
225
225
  async loadRealmConfig(realmName) {
226
226
  try {
@@ -235,7 +235,7 @@ var AuthRouter = class {
235
235
  //#endregion
236
236
  //#region ../../src/auth/components/buttons/UserButton.tsx
237
237
  const UserButton = (props) => {
238
- const { menuItems = [], logoutLabel = "Sign out", menuConfig, showLogoutDivider = menuItems.length > 0, icon, children, ...buttonProps } = props;
238
+ const { menuItems = [], logoutLabel = "Sign out", loginLabel, menuConfig, showLogoutDivider = menuItems.length > 0, icon, children, ...buttonProps } = props;
239
239
  buttonProps.variant ??= "subtle";
240
240
  const adminUserCtrl = useClient();
241
241
  const pages = useInject(ReactPageProvider);
@@ -247,8 +247,9 @@ const UserButton = (props) => {
247
247
  const authRouter = useRouter();
248
248
  if (!auth.user) return /* @__PURE__ */ jsx(ActionButton, {
249
249
  ...buttonProps,
250
- icon: IconLogin2,
251
- href: authRouter.path("login")
250
+ icon: icon === null ? void 0 : icon ?? IconLogin2,
251
+ href: authRouter.path("login"),
252
+ children: loginLabel ?? children
252
253
  });
253
254
  const userLabel = auth.user.username || auth.user.email;
254
255
  const items = [];
@@ -274,10 +275,10 @@ const UserButton = (props) => {
274
275
  color: "red",
275
276
  onClick: () => auth.logout()
276
277
  });
277
- const hasAvatar = !icon && auth.user.picture;
278
+ const hasAvatar = icon === void 0 && auth.user.picture;
278
279
  return /* @__PURE__ */ jsx(ActionButton, {
279
280
  ...buttonProps,
280
- icon: hasAvatar ? void 0 : icon ?? IconUser,
281
+ icon: hasAvatar ? void 0 : icon === null ? void 0 : icon ?? IconUser,
281
282
  leftSection: hasAvatar ? /* @__PURE__ */ jsx(Avatar, {
282
283
  src: `/api/files/${auth.user.picture}`,
283
284
  size: 24,