@alepha/ui 0.15.1 → 0.15.3

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 (199) hide show
  1. package/dist/admin/AdminAudits-BU-p1g7A.js +3 -0
  2. package/dist/admin/{AdminAudits-DClGEVBj.js → AdminAudits-Oh7iAfQa.js} +5 -5
  3. package/dist/admin/AdminAudits-Oh7iAfQa.js.map +1 -0
  4. package/dist/admin/AdminFiles-Bg9feLFH.js +3 -0
  5. package/dist/admin/{AdminFiles-C76r1_Xz.js → AdminFiles-Cu8GHgQ3.js} +3 -3
  6. package/dist/admin/AdminFiles-Cu8GHgQ3.js.map +1 -0
  7. package/dist/admin/{AdminNotifications-Bsalygm5.js → AdminNotifications-CgYkBuG_.js} +3 -3
  8. package/dist/admin/AdminNotifications-CgYkBuG_.js.map +1 -0
  9. package/dist/admin/AdminNotifications-DmfGPqHe.js +3 -0
  10. package/dist/admin/{AdminParameters-CpmAWwqN.js → AdminParameters-Cl-R0nXt.js} +1 -1
  11. package/dist/admin/{AdminParameters-Bmxtnpv-.js → AdminParameters-hjNG_KXb.js} +4 -4
  12. package/dist/admin/AdminParameters-hjNG_KXb.js.map +1 -0
  13. package/dist/admin/{AdminSessions-DmK3R6pP.js → AdminSessions-Bey9cuy1.js} +4 -4
  14. package/dist/admin/AdminSessions-Bey9cuy1.js.map +1 -0
  15. package/dist/admin/AdminSessions-Cn4_jB04.js +3 -0
  16. package/dist/admin/{AdminUserAudits-BPMP1Qd2.js → AdminUserAudits-C7AN9jx7.js} +4 -4
  17. package/dist/admin/AdminUserAudits-C7AN9jx7.js.map +1 -0
  18. package/dist/admin/{AdminUserAudits-Brcenss9.js → AdminUserAudits-Cp_ERd2g.js} +1 -1
  19. package/dist/admin/{AdminUserCreate-CZjB6NKc.js → AdminUserCreate-BVIm4JdN.js} +5 -5
  20. package/dist/admin/AdminUserCreate-BVIm4JdN.js.map +1 -0
  21. package/dist/admin/{AdminUserCreate-Cx8bkYC2.js → AdminUserCreate-C1aInRDk.js} +1 -1
  22. package/dist/admin/{AdminUserDetails-8TYsqQBy.js → AdminUserDetails-Dcn3OwMC.js} +1 -1
  23. package/dist/admin/{AdminUserDetails-DuqCOBJK.js → AdminUserDetails-yM4x8JE6.js} +5 -5
  24. package/dist/admin/AdminUserDetails-yM4x8JE6.js.map +1 -0
  25. package/dist/admin/{AdminUserLayout-Dgk8s7Cd.js → AdminUserLayout-BnfBC1gD.js} +4 -4
  26. package/dist/admin/AdminUserLayout-BnfBC1gD.js.map +1 -0
  27. package/dist/admin/{AdminUserLayout-Bz2u_zQ4.js → AdminUserLayout-gb-nbggz.js} +1 -1
  28. package/dist/admin/{AdminUserSessions-DCpe8_T6.js → AdminUserSessions-kmkXG-xf.js} +4 -4
  29. package/dist/admin/AdminUserSessions-kmkXG-xf.js.map +1 -0
  30. package/dist/admin/AdminUserSessions-rvA0ztxn.js +3 -0
  31. package/dist/admin/{AdminUserSettings-qxDfowqh.js → AdminUserSettings-DZ9iWhJW.js} +5 -5
  32. package/dist/admin/AdminUserSettings-DZ9iWhJW.js.map +1 -0
  33. package/dist/admin/AdminUserSettings-Dg-wTRzN.js +3 -0
  34. package/dist/admin/{AdminUsers-ZlPsDz0T.js → AdminUsers-D6Y5K8Am.js} +5 -5
  35. package/dist/admin/AdminUsers-D6Y5K8Am.js.map +1 -0
  36. package/dist/admin/AdminUsers-RCaxccEW.js +3 -0
  37. package/dist/admin/index.d.ts +55 -36
  38. package/dist/admin/index.d.ts.map +1 -1
  39. package/dist/admin/index.js +54 -32
  40. package/dist/admin/index.js.map +1 -1
  41. package/dist/auth/{AuthLayout-CWzQ8rCe.js → AuthLayout-Dj5K4SIN.js} +2 -2
  42. package/dist/auth/AuthLayout-Dj5K4SIN.js.map +1 -0
  43. package/dist/auth/{Login-CyvKwy5e.js → Login-BBqTosqZ.js} +6 -6
  44. package/dist/auth/Login-BBqTosqZ.js.map +1 -0
  45. package/dist/auth/Login-CoU63mMR.js +4 -0
  46. package/dist/auth/Profile-Bxj8Nwom.js +150 -0
  47. package/dist/auth/Profile-Bxj8Nwom.js.map +1 -0
  48. package/dist/auth/Register-BV_oa_AK.js +4 -0
  49. package/dist/auth/{Register-C7Zp09Ks.js → Register-Ce675Crg.js} +8 -8
  50. package/dist/auth/Register-Ce675Crg.js.map +1 -0
  51. package/dist/auth/ResetPassword-D5wC8GAA.js +3 -0
  52. package/dist/auth/{ResetPassword-DYJSUC6B.js → ResetPassword-DWdt7c40.js} +5 -5
  53. package/dist/auth/ResetPassword-DWdt7c40.js.map +1 -0
  54. package/dist/auth/{VerifyEmail-CNXFIwWW.js → VerifyEmail-CI4JwByV.js} +4 -4
  55. package/dist/auth/VerifyEmail-CI4JwByV.js.map +1 -0
  56. package/dist/auth/VerifyEmail-DAfqVm5s.js +3 -0
  57. package/dist/auth/index.d.ts +36 -20
  58. package/dist/auth/index.d.ts.map +1 -1
  59. package/dist/auth/index.js +62 -17
  60. package/dist/auth/index.js.map +1 -1
  61. package/dist/core/index.d.ts +216 -71
  62. package/dist/core/index.d.ts.map +1 -1
  63. package/dist/core/index.js +733 -445
  64. package/dist/core/index.js.map +1 -1
  65. package/dist/demo/{DemoDataTable-DYbDYbs5.js → DemoDataTable-CguplbR7.js} +2 -2
  66. package/dist/demo/{DemoDataTable-DYbDYbs5.js.map → DemoDataTable-CguplbR7.js.map} +1 -1
  67. package/dist/demo/DemoJsonViewer-DIssGVlJ.js +4 -0
  68. package/dist/demo/{DemoJsonViewer-D_Hff1Q2.js → DemoJsonViewer-Dgdk3Txb.js} +3 -3
  69. package/dist/demo/{DemoJsonViewer-D_Hff1Q2.js.map → DemoJsonViewer-Dgdk3Txb.js.map} +1 -1
  70. package/dist/demo/{DemoLayout-DjIDm93B.js → DemoLayout-B20TEuhV.js} +2 -2
  71. package/dist/demo/DemoLayout-B20TEuhV.js.map +1 -0
  72. package/dist/demo/DemoLayout-DSRyf4qJ.js +3 -0
  73. package/dist/demo/{DemoLogin-BA_HiIRZ.js → DemoLogin-S-b15cmE.js} +7 -7
  74. package/dist/demo/DemoLogin-S-b15cmE.js.map +1 -0
  75. package/dist/demo/{DemoRegister-B6syaxP9.js → DemoRegister-B29MdAaZ.js} +9 -9
  76. package/dist/demo/DemoRegister-B29MdAaZ.js.map +1 -0
  77. package/dist/demo/{DemoResetPassword-BOcLG4GF.js → DemoResetPassword-CPTy88iK.js} +6 -6
  78. package/dist/demo/DemoResetPassword-CPTy88iK.js.map +1 -0
  79. package/dist/demo/{DemoSidebar-DpZXf7GO.js → DemoSidebar-MVmQKfMt.js} +2 -2
  80. package/dist/demo/{DemoSidebar-DpZXf7GO.js.map → DemoSidebar-MVmQKfMt.js.map} +1 -1
  81. package/dist/demo/{DemoTypeForm-BlLAcQqZ.js → DemoTypeForm-w-qtfRlC.js} +3 -3
  82. package/dist/demo/DemoTypeForm-w-qtfRlC.js.map +1 -0
  83. package/dist/demo/{DemoVerifyEmail-C-J7bXUQ.js → DemoVerifyEmail-C8FFJT5A.js} +5 -5
  84. package/dist/demo/DemoVerifyEmail-C8FFJT5A.js.map +1 -0
  85. package/dist/demo/{Showcase-HchhcsHV.js → Showcase-CQrMWars.js} +2 -2
  86. package/dist/demo/Showcase-CQrMWars.js.map +1 -0
  87. package/dist/demo/index.d.ts +25 -15
  88. package/dist/demo/index.d.ts.map +1 -1
  89. package/dist/demo/index.js +24 -14
  90. package/dist/demo/index.js.map +1 -1
  91. package/package.json +6 -6
  92. package/src/admin/AdminRouter.ts +4 -4
  93. package/src/admin/MainRouter.ts +1 -1
  94. package/src/admin/components/audits/AdminAudits.tsx +4 -4
  95. package/src/admin/components/files/AdminFiles.tsx +2 -2
  96. package/src/admin/components/jobs/AdminJobs.tsx +2 -2
  97. package/src/admin/components/notifications/AdminNotifications.tsx +2 -2
  98. package/src/admin/components/parameters/AdminParameters.tsx +1 -1
  99. package/src/admin/components/parameters/ParameterDetails.tsx +2 -2
  100. package/src/admin/components/parameters/ParameterHistory.tsx +1 -1
  101. package/src/admin/components/parameters/types.ts +9 -3
  102. package/src/admin/components/sessions/AdminSessions.tsx +3 -3
  103. package/src/admin/components/shared/AdminResourceHeader.tsx +1 -1
  104. package/src/admin/components/shared/AdminResourceTabs.tsx +1 -1
  105. package/src/admin/components/users/AdminUserAudits.tsx +3 -3
  106. package/src/admin/components/users/AdminUserCreate.tsx +4 -4
  107. package/src/admin/components/users/AdminUserDetails.tsx +4 -4
  108. package/src/admin/components/users/AdminUserLayout.tsx +3 -3
  109. package/src/admin/components/users/AdminUserSessions.tsx +3 -3
  110. package/src/admin/components/users/AdminUserSettings.tsx +4 -4
  111. package/src/admin/components/users/AdminUsers.tsx +4 -4
  112. package/src/admin/index.ts +27 -2
  113. package/src/auth/AuthI18n.ts +1 -1
  114. package/src/auth/AuthRouter.ts +14 -2
  115. package/src/auth/components/AuthLayout.tsx +1 -1
  116. package/src/auth/components/Login.tsx +5 -5
  117. package/src/auth/components/Profile.tsx +157 -0
  118. package/src/auth/components/Register.tsx +7 -7
  119. package/src/auth/components/ResetPassword.tsx +4 -4
  120. package/src/auth/components/VerifyEmail.tsx +3 -3
  121. package/src/auth/components/buttons/UserButton.tsx +35 -3
  122. package/src/auth/index.ts +25 -4
  123. package/src/core/UiRouter.ts +15 -0
  124. package/src/core/atoms/alephaSidebarAtom.ts +57 -0
  125. package/src/core/atoms/alephaThemeListAtom.ts +3 -1
  126. package/src/core/components/buttons/ActionButton.tsx +10 -10
  127. package/src/core/components/buttons/BurgerButton.tsx +5 -4
  128. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  129. package/src/core/components/buttons/OmnibarButton.tsx +20 -1
  130. package/src/core/components/buttons/ThemeButton.tsx +1 -1
  131. package/src/core/components/buttons/ToggleSidebarButton.tsx +33 -23
  132. package/src/core/components/form/Control.tsx +1 -1
  133. package/src/core/components/form/ControlArray.tsx +2 -2
  134. package/src/core/components/form/ControlDate.tsx +1 -1
  135. package/src/core/components/form/ControlNumber.tsx +2 -2
  136. package/src/core/components/form/ControlObject.tsx +1 -1
  137. package/src/core/components/form/ControlQueryBuilder.tsx +1 -1
  138. package/src/core/components/form/ControlSelect.tsx +1 -1
  139. package/src/core/components/form/TypeForm.tsx +2 -2
  140. package/src/core/components/layout/AdminShell.tsx +236 -30
  141. package/src/core/components/layout/AlephaMantineProvider.tsx +3 -3
  142. package/src/core/components/layout/AppBar.tsx +235 -18
  143. package/src/core/components/layout/Omnibar.tsx +4 -4
  144. package/src/core/components/layout/Sidebar.tsx +43 -82
  145. package/src/core/components/table/DataTable.tsx +2 -2
  146. package/src/core/components/table/DataTableFilters.tsx +1 -1
  147. package/src/core/components/table/types.ts +1 -1
  148. package/src/core/hooks/useDialog.ts +1 -1
  149. package/src/core/hooks/useTheme.ts +1 -1
  150. package/src/core/hooks/useToast.ts +1 -1
  151. package/src/core/index.ts +46 -9
  152. package/src/core/providers/ThemeProvider.ts +1 -1
  153. package/src/core/styles.css +58 -0
  154. package/src/core/utils/parseInput.ts +1 -1
  155. package/src/demo/DemoRouter.ts +1 -1
  156. package/src/demo/components/DemoLayout.tsx +1 -1
  157. package/src/demo/components/core/DemoTypeForm.tsx +1 -1
  158. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  159. package/src/demo/components/shared/Showcase.tsx +1 -1
  160. package/src/demo/index.ts +11 -1
  161. package/src/json/index.ts +13 -0
  162. package/dist/admin/AdminAudits-ColpiP4T.js +0 -3
  163. package/dist/admin/AdminAudits-DClGEVBj.js.map +0 -1
  164. package/dist/admin/AdminFiles-C5pqXN5B.js +0 -3
  165. package/dist/admin/AdminFiles-C76r1_Xz.js.map +0 -1
  166. package/dist/admin/AdminNotifications-BXixCBu9.js +0 -3
  167. package/dist/admin/AdminNotifications-Bsalygm5.js.map +0 -1
  168. package/dist/admin/AdminParameters-Bmxtnpv-.js.map +0 -1
  169. package/dist/admin/AdminSessions-CrkRvey3.js +0 -3
  170. package/dist/admin/AdminSessions-DmK3R6pP.js.map +0 -1
  171. package/dist/admin/AdminUserAudits-BPMP1Qd2.js.map +0 -1
  172. package/dist/admin/AdminUserCreate-CZjB6NKc.js.map +0 -1
  173. package/dist/admin/AdminUserDetails-DuqCOBJK.js.map +0 -1
  174. package/dist/admin/AdminUserLayout-Dgk8s7Cd.js.map +0 -1
  175. package/dist/admin/AdminUserSessions-DCpe8_T6.js.map +0 -1
  176. package/dist/admin/AdminUserSessions-beiJqY2D.js +0 -3
  177. package/dist/admin/AdminUserSettings-CxlInVnu.js +0 -3
  178. package/dist/admin/AdminUserSettings-qxDfowqh.js.map +0 -1
  179. package/dist/admin/AdminUsers-Bd0wMP8v.js +0 -3
  180. package/dist/admin/AdminUsers-ZlPsDz0T.js.map +0 -1
  181. package/dist/auth/AuthLayout-CWzQ8rCe.js.map +0 -1
  182. package/dist/auth/Login-CxOPyNFP.js +0 -4
  183. package/dist/auth/Login-CyvKwy5e.js.map +0 -1
  184. package/dist/auth/Register-C7Zp09Ks.js.map +0 -1
  185. package/dist/auth/Register-Cacr7YbA.js +0 -4
  186. package/dist/auth/ResetPassword-CMkx8Ibf.js +0 -3
  187. package/dist/auth/ResetPassword-DYJSUC6B.js.map +0 -1
  188. package/dist/auth/VerifyEmail-CNXFIwWW.js.map +0 -1
  189. package/dist/auth/VerifyEmail-DKyDlz96.js +0 -3
  190. package/dist/demo/DemoJsonViewer-DbWVDdz_.js +0 -4
  191. package/dist/demo/DemoLayout-DjIDm93B.js.map +0 -1
  192. package/dist/demo/DemoLayout-nNMajP_9.js +0 -3
  193. package/dist/demo/DemoLogin-BA_HiIRZ.js.map +0 -1
  194. package/dist/demo/DemoRegister-B6syaxP9.js.map +0 -1
  195. package/dist/demo/DemoResetPassword-BOcLG4GF.js.map +0 -1
  196. package/dist/demo/DemoTypeForm-BlLAcQqZ.js.map +0 -1
  197. package/dist/demo/DemoVerifyEmail-C-J7bXUQ.js.map +0 -1
  198. package/dist/demo/Showcase-HchhcsHV.js.map +0 -1
  199. package/src/core/RootRouter.ts +0 -9
@@ -1,9 +1,9 @@
1
- import { ReactAuth } from "@alepha/react/auth";
2
1
  import { ActionMenuConfig, ActionMenuItem, ActionProps } from "@alepha/ui";
3
2
  import * as alepha1 from "alepha";
4
- import * as _alepha_react_router0 from "@alepha/react/router";
3
+ import { ReactAuth } from "alepha/react/auth";
4
+ import * as alepha_react_router0 from "alepha/react/router";
5
5
  import * as alepha_server_links0 from "alepha/server/links";
6
- import * as react_jsx_runtime1 from "react/jsx-runtime";
6
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
7
7
  import { ReactNode } from "react";
8
8
  import { RealmConfig, RealmController } from "alepha/api/users";
9
9
 
@@ -11,8 +11,8 @@ import { RealmConfig, RealmController } from "alepha/api/users";
11
11
  declare class AuthRouter {
12
12
  protected readonly realmClient: alepha_server_links0.HttpVirtualClient<RealmController>;
13
13
  protected readonly auth: ReactAuth;
14
- layout: _alepha_react_router0.PagePrimitive<_alepha_react_router0.PageConfigSchema, any, _alepha_react_router0.TPropsParentDefault>;
15
- login: _alepha_react_router0.PagePrimitive<{
14
+ layout: alepha_react_router0.PagePrimitive<alepha_react_router0.PageConfigSchema, any, alepha_react_router0.TPropsParentDefault>;
15
+ login: alepha_react_router0.PagePrimitive<{
16
16
  query: alepha1.TObject<{
17
17
  r: alepha1.TOptional<alepha1.TString>;
18
18
  realm: alepha1.TOptional<alepha1.TString>;
@@ -50,8 +50,8 @@ declare class AuthRouter {
50
50
  name: string;
51
51
  }[];
52
52
  };
53
- }, _alepha_react_router0.TPropsParentDefault>;
54
- register: _alepha_react_router0.PagePrimitive<{
53
+ }, alepha_react_router0.TPropsParentDefault>;
54
+ register: alepha_react_router0.PagePrimitive<{
55
55
  query: alepha1.TObject<{
56
56
  r: alepha1.TOptional<alepha1.TString>;
57
57
  realm: alepha1.TOptional<alepha1.TString>;
@@ -89,8 +89,8 @@ declare class AuthRouter {
89
89
  name: string;
90
90
  }[];
91
91
  };
92
- }, _alepha_react_router0.TPropsParentDefault>;
93
- resetPassword: _alepha_react_router0.PagePrimitive<{
92
+ }, alepha_react_router0.TPropsParentDefault>;
93
+ resetPassword: alepha_react_router0.PagePrimitive<{
94
94
  query: alepha1.TObject<{
95
95
  r: alepha1.TOptional<alepha1.TString>;
96
96
  realm: alepha1.TOptional<alepha1.TString>;
@@ -128,14 +128,15 @@ declare class AuthRouter {
128
128
  name: string;
129
129
  }[];
130
130
  };
131
- }, _alepha_react_router0.TPropsParentDefault>;
132
- verifyEmail: _alepha_react_router0.PagePrimitive<{
131
+ }, alepha_react_router0.TPropsParentDefault>;
132
+ verifyEmail: alepha_react_router0.PagePrimitive<{
133
133
  query: alepha1.TObject<{
134
134
  email: alepha1.TOptional<alepha1.TString>;
135
135
  token: alepha1.TOptional<alepha1.TString>;
136
136
  }>;
137
- }, any, _alepha_react_router0.TPropsParentDefault>;
138
- logout: _alepha_react_router0.PagePrimitive<_alepha_react_router0.PageConfigSchema, {}, _alepha_react_router0.TPropsParentDefault>;
137
+ }, any, alepha_react_router0.TPropsParentDefault>;
138
+ logout: alepha_react_router0.PagePrimitive<alepha_react_router0.PageConfigSchema, {}, alepha_react_router0.TPropsParentDefault>;
139
+ profile: alepha_react_router0.PagePrimitive<alepha_react_router0.PageConfigSchema, any, alepha_react_router0.TPropsParentDefault>;
139
140
  protected loadRealmConfig(realmName?: string): Promise<{
140
141
  realmName: string;
141
142
  settings: {
@@ -193,37 +194,52 @@ interface UserButtonProps extends Omit<ActionProps, "menu" | "icon" | "onClick">
193
194
  */
194
195
  icon?: ReactNode;
195
196
  }
196
- declare const UserButton: (props: UserButtonProps) => react_jsx_runtime1.JSX.Element;
197
+ declare const UserButton: (props: UserButtonProps) => react_jsx_runtime0.JSX.Element;
197
198
  //#endregion
198
199
  //#region ../../src/auth/components/Login.d.ts
199
200
  interface LoginProps {
200
201
  realmConfig: RealmConfig;
201
202
  }
202
- declare const Login: (props: LoginProps) => react_jsx_runtime1.JSX.Element;
203
+ declare const Login: (props: LoginProps) => react_jsx_runtime0.JSX.Element;
203
204
  //#endregion
204
205
  //#region ../../src/auth/components/Register.d.ts
205
206
  interface RegisterProps {
206
207
  realmConfig: RealmConfig;
207
208
  }
208
- declare const Register: (props: RegisterProps) => react_jsx_runtime1.JSX.Element;
209
+ declare const Register: (props: RegisterProps) => react_jsx_runtime0.JSX.Element;
209
210
  //#endregion
210
211
  //#region ../../src/auth/components/ResetPassword.d.ts
211
212
  interface ResetPasswordProps {
212
213
  realmConfig: RealmConfig;
213
214
  }
214
- declare const ResetPassword: (props: ResetPasswordProps) => react_jsx_runtime1.JSX.Element;
215
+ declare const ResetPassword: (props: ResetPasswordProps) => react_jsx_runtime0.JSX.Element;
215
216
  //#endregion
216
217
  //#region ../../src/auth/components/VerifyEmail.d.ts
217
218
  type VerifyEmailProps = {};
218
- declare const VerifyEmail: (_props: VerifyEmailProps) => react_jsx_runtime1.JSX.Element;
219
+ declare const VerifyEmail: (_props: VerifyEmailProps) => react_jsx_runtime0.JSX.Element;
219
220
  //#endregion
220
221
  //#region ../../src/auth/index.d.ts
221
222
  /**
222
- * Login UI Module
223
+ * | type | quality | stability |
224
+ * |------|---------|-----------|
225
+ * | frontend | rare | experimental |
226
+ *
227
+ * Authentication UI components.
228
+ *
229
+ * **Features:**
230
+ * - Login page component
231
+ * - Register page component
232
+ * - Reset password page component
233
+ * - Email verification page component
234
+ * - UserButton for user menu
223
235
  *
224
236
  * @module alepha.ui.auth
225
237
  */
226
238
  declare const AlephaUIAuth: alepha1.Service<alepha1.Module>;
239
+ /**
240
+ * Register Auth UI components and get the AuthRouter instance.
241
+ */
242
+ declare const $uiAuth: () => AuthRouter;
227
243
  //#endregion
228
- export { AlephaUIAuth, AuthRouter, Login, Register, ResetPassword, UserButton, type UserButtonProps, VerifyEmail };
244
+ export { $uiAuth, AlephaUIAuth, AuthRouter, Login, Register, ResetPassword, UserButton, type UserButtonProps, VerifyEmail };
229
245
  //# sourceMappingURL=index.d.ts.map
@@ -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/index.ts"],"mappings":";;;;;;;;;;cAuBa,UAAA;EAAA,mBACQ,WAAA,EAAW,oBAAA,CAAA,iBAAA,CAAA,eAAA;EAAA,mBACX,IAAA,EAAI,SAAA;EAEvB,MAAA,EAAM,qBAAA,CAAA,aAAA,CAFiB,qBAAA,CAEjB,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAYN,KAAA,wBAAK,aAAA;;2BAZC,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BN,QAAA,wBAAQ,aAAA;;2BAjBH,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCL,aAAA,wBAAa,aAAA;;2BAjBL,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCR,WAAA,wBAAW,aAAA;;+BAjBE,OAAA,CAAA,OAAA;;;;EA+Bb,MAAA,EAAM,qBAAA,CAAA,aAAA,CAdK,qBAAA,CAcL,gBAAA,MAAA,qBAAA,CAAA,mBAAA;EAAA,UAaU,eAAA,CAAgB,SAAA,YAAkB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCvGnC,eAAA,SACP,IAAA,CAAK,WAAA;;;;EAIb,SAAA,GAAY,cAAA;;;;EAKZ,WAAA;EDDqB;;;ECMrB,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA;EDJH;;;ECSvB,iBAAA;EDPM;;;ECYN,IAAA,GAAO,SAAA;AAAA;AAAA,cAGH,UAAA,GAAc,KAAA,EAAO,eAAA,KAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC1BzB,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;;;;;;ALQ7C;;cMCa,YAAA,EAAY,OAAA,CAAA,OAAA,CAGvB,OAAA,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/index.ts"],"mappings":";;;;;;;;;;cAwBa,UAAA;EAAA,mBACQ,WAAA,EAAW,oBAAA,CAAA,iBAAA,CAAA,eAAA;EAAA,mBACX,IAAA,EAAI,SAAA;EAEvB,MAAA,EAAM,oBAAA,CAAA,aAAA,CAFiB,oBAAA,CAEjB,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAaN,KAAA,uBAAK,aAAA;;2BAbC,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BN,QAAA,uBAAQ,aAAA;;2BAjBH,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCL,aAAA,uBAAa,aAAA;;2BAjBL,OAAA,CAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCR,WAAA,uBAAW,aAAA;;+BAjBE,OAAA,CAAA,OAAA;;;;EA+Bb,MAAA,EAAM,oBAAA,CAAA,aAAA,CAdK,oBAAA,CAcL,gBAAA,MAAA,oBAAA,CAAA,mBAAA;EAaN,OAAA,EAAO,oBAAA,CAAA,aAAA,CAbD,oBAAA,CAaC,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAAA,UAUS,eAAA,CAAgB,SAAA,YAAkB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UC5GnC,eAAA,SACP,IAAA,CAAK,WAAA;;;;EAIb,SAAA,GAAY,cAAA;;;;EAKZ,WAAA;EDPqB;;;ECYrB,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA;EDVH;;;ECevB,iBAAA;EDbM;;;ECkBN,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;;;;;ALS7C;;;;;;;;;;;;;;cMWa,YAAA,EAAY,OAAA,CAAA,OAAA,CAGvB,OAAA,CAHuB,MAAA;;;;cAUZ,OAAA,QAAO,UAAA"}
@@ -1,16 +1,17 @@
1
1
  import "./IconGoogle-DpSlPZ1u.js";
2
- import { t as Login_default } from "./Login-CyvKwy5e.js";
3
- import { t as Register_default } from "./Register-C7Zp09Ks.js";
4
- import { t as ResetPassword_default } from "./ResetPassword-DYJSUC6B.js";
5
- import { t as VerifyEmail_default } from "./VerifyEmail-CNXFIwWW.js";
6
- import { AlephaReactAuth, ReactAuth, useAuth } from "@alepha/react/auth";
7
- import { $dictionary, AlephaReactI18n } from "@alepha/react/i18n";
2
+ import { t as Login_default } from "./Login-BBqTosqZ.js";
3
+ import { t as Register_default } from "./Register-Ce675Crg.js";
4
+ import { t as ResetPassword_default } from "./ResetPassword-DWdt7c40.js";
5
+ import { t as VerifyEmail_default } from "./VerifyEmail-CI4JwByV.js";
8
6
  import { ActionButton, AlephaUI, ui } from "@alepha/ui";
9
- import { $inject, $module, AlephaError, t } from "alepha";
10
- import { $page, useRouter } from "@alepha/react/router";
11
- import { IconLogin2, IconLogout, IconLogout2, IconMailCheck, IconPasswordUser, IconUser, IconUserPlus } from "@tabler/icons-react";
7
+ import { $context, $inject, $module, AlephaError, t } from "alepha";
8
+ import { AlephaReactAuth, ReactAuth, useAuth } from "alepha/react/auth";
9
+ import { $dictionary, AlephaReactI18n } from "alepha/react/i18n";
10
+ import { IconLogin2, IconLogout, IconLogout2, IconMailCheck, IconPasswordUser, IconSettings, IconUser, IconUserPlus } from "@tabler/icons-react";
11
+ import { $page, ReactPageProvider, useRouter } from "alepha/react/router";
12
12
  import { $client } from "alepha/server/links";
13
13
  import { Avatar } from "@mantine/core";
14
+ import { useClient, useInject } from "alepha/react";
14
15
  import { jsx } from "react/jsx-runtime";
15
16
 
16
17
  //#region ../../src/auth/AuthI18n.ts
@@ -145,12 +146,13 @@ var AuthRouter = class {
145
146
  layout = $page({
146
147
  name: "AuthLayout",
147
148
  path: "/auth",
148
- lazy: () => import("./AuthLayout-CWzQ8rCe.js"),
149
+ lazy: () => import("./AuthLayout-Dj5K4SIN.js"),
149
150
  children: () => [
150
151
  this.login,
151
152
  this.register,
152
153
  this.resetPassword,
153
- this.verifyEmail
154
+ this.verifyEmail,
155
+ this.profile
154
156
  ]
155
157
  });
156
158
  login = $page({
@@ -160,7 +162,7 @@ var AuthRouter = class {
160
162
  path: "/login",
161
163
  schema: { query: realmQuerySchema },
162
164
  can: () => !this.auth.user,
163
- lazy: () => import("./Login-CxOPyNFP.js"),
165
+ lazy: () => import("./Login-CoU63mMR.js"),
164
166
  loader: async ({ query }) => {
165
167
  return { realmConfig: await this.loadRealmConfig(query.realm) };
166
168
  }
@@ -172,7 +174,7 @@ var AuthRouter = class {
172
174
  path: "/register",
173
175
  schema: { query: realmQuerySchema },
174
176
  can: () => !this.auth.user,
175
- lazy: () => import("./Register-Cacr7YbA.js"),
177
+ lazy: () => import("./Register-BV_oa_AK.js"),
176
178
  loader: async ({ query }) => {
177
179
  return { realmConfig: await this.loadRealmConfig(query.realm) };
178
180
  }
@@ -184,7 +186,7 @@ var AuthRouter = class {
184
186
  path: "/reset-password",
185
187
  schema: { query: realmQuerySchema },
186
188
  can: () => !this.auth.user,
187
- lazy: () => import("./ResetPassword-CMkx8Ibf.js"),
189
+ lazy: () => import("./ResetPassword-D5wC8GAA.js"),
188
190
  loader: async ({ query }) => {
189
191
  return { realmConfig: await this.loadRealmConfig(query.realm) };
190
192
  }
@@ -198,7 +200,7 @@ var AuthRouter = class {
198
200
  email: t.optional(t.string()),
199
201
  token: t.optional(t.string())
200
202
  }) },
201
- lazy: () => import("./VerifyEmail-DKyDlz96.js")
203
+ lazy: () => import("./VerifyEmail-DAfqVm5s.js")
202
204
  });
203
205
  logout = $page({
204
206
  icon: IconLogout2,
@@ -212,6 +214,15 @@ var AuthRouter = class {
212
214
  return {};
213
215
  }
214
216
  });
217
+ profile = $page({
218
+ name: "userProfile",
219
+ icon: IconUser,
220
+ label: "Profile",
221
+ description: "View your profile",
222
+ path: "/profile",
223
+ can: () => !!this.auth.user,
224
+ lazy: () => import("./Profile-Bxj8Nwom.js")
225
+ });
215
226
  async loadRealmConfig(realmName) {
216
227
  try {
217
228
  return await this.realmClient.getRealmConfig({ query: { realmName } });
@@ -227,7 +238,13 @@ var AuthRouter = class {
227
238
  const UserButton = (props) => {
228
239
  const { menuItems = [], logoutLabel = "Sign out", menuConfig, showLogoutDivider = menuItems.length > 0, icon, children, ...buttonProps } = props;
229
240
  buttonProps.variant ??= "subtle";
241
+ const adminUserCtrl = useClient();
242
+ const pages = useInject(ReactPageProvider);
230
243
  const auth = useAuth();
244
+ const isConnected = !!auth.user;
245
+ const isAdmin = isConnected && adminUserCtrl.findUsers.can();
246
+ const userPage = pages.getPages().find((it) => it.name === "userProfile");
247
+ const adminPage = pages.getPages().find((it) => it.name === "adminLayout");
231
248
  const authRouter = useRouter();
232
249
  if (!auth.user) return /* @__PURE__ */ jsx(ActionButton, {
233
250
  ...buttonProps,
@@ -240,6 +257,16 @@ const UserButton = (props) => {
240
257
  type: "label",
241
258
  label: auth.user.email
242
259
  });
260
+ if (userPage && isConnected) items.push({
261
+ label: "Profile",
262
+ icon: /* @__PURE__ */ jsx(IconUser, { size: ui.sizes.icon.md }),
263
+ href: authRouter.path("userProfile")
264
+ });
265
+ if (adminPage && isAdmin) items.push({
266
+ label: "Admin",
267
+ icon: /* @__PURE__ */ jsx(IconSettings, { size: ui.sizes.icon.md }),
268
+ href: authRouter.path("adminLayout")
269
+ });
243
270
  items.push(...menuItems);
244
271
  if (showLogoutDivider && items.length > 0) items.push({ type: "divider" });
245
272
  items.push({
@@ -271,7 +298,18 @@ var UserButton_default = UserButton;
271
298
  //#endregion
272
299
  //#region ../../src/auth/index.ts
273
300
  /**
274
- * Login UI Module
301
+ * | type | quality | stability |
302
+ * |------|---------|-----------|
303
+ * | frontend | rare | experimental |
304
+ *
305
+ * Authentication UI components.
306
+ *
307
+ * **Features:**
308
+ * - Login page component
309
+ * - Register page component
310
+ * - Reset password page component
311
+ * - Email verification page component
312
+ * - UserButton for user menu
275
313
  *
276
314
  * @module alepha.ui.auth
277
315
  */
@@ -285,7 +323,14 @@ const AlephaUIAuth = $module({
285
323
  AuthI18n
286
324
  ]
287
325
  });
326
+ /**
327
+ * Register Auth UI components and get the AuthRouter instance.
328
+ */
329
+ const $uiAuth = () => {
330
+ const { alepha } = $context();
331
+ return alepha.inject(AuthRouter);
332
+ };
288
333
 
289
334
  //#endregion
290
- export { AlephaUIAuth, AuthRouter, Login_default as Login, Register_default as Register, ResetPassword_default as ResetPassword, UserButton_default as UserButton, VerifyEmail_default as VerifyEmail };
335
+ export { $uiAuth, AlephaUIAuth, AuthRouter, Login_default as Login, Register_default as Register, ResetPassword_default as ResetPassword, UserButton_default as UserButton, VerifyEmail_default as VerifyEmail };
291
336
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/auth/AuthI18n.ts","../../src/auth/AuthRouter.ts","../../src/auth/components/buttons/UserButton.tsx","../../src/auth/index.ts"],"sourcesContent":["import { $dictionary } from \"@alepha/react/i18n\";\n\nexport class AuthI18n {\n en = $dictionary({\n name: \"alepha.ui.auth.en\",\n lazy: () => ({\n default: {\n loginSignIn: \"Sign in\",\n loginContinueWith: \"Continue with $1\",\n loginOr: \"OR\",\n loginCancel: \"Cancel\",\n loginForgotPassword: \"Forgot password?\",\n loginNoAccount: \"Don't have an account?\",\n loginSignUp: \"Sign up\",\n loginUsername: \"Username\",\n loginEmail: \"Email\",\n loginPhone: \"Phone number\",\n loginPassword: \"Password\",\n registerCreateAccount: \"Create account\",\n registerContinueWith: \"Continue with $1\",\n registerOr: \"OR\",\n registerCancel: \"Cancel\",\n registerHaveAccount: \"Already have an account?\",\n registerSignIn: \"Sign in\",\n registerUsername: \"Username\",\n registerEmail: \"Email\",\n registerPhone: \"Phone number\",\n registerPassword: \"Password\",\n registerConfirmPassword: \"Confirm password\",\n registerDisabled:\n \"Registration is not available. Please contact your administrator.\",\n registerBackToSignIn: \"Back to sign in\",\n registerVerifyTitle: \"Verify your account\",\n registerVerifyDescription:\n \"Please enter the verification code(s) sent to you.\",\n registerEmailCode: \"Email verification code\",\n registerPhoneCode: \"Phone verification code\",\n registerVerifySubmit: \"Complete Registration\",\n registerVerifyBack: \"Back to registration\",\n resetPasswordTitle: \"Reset password\",\n resetPasswordEmail: \"Email\",\n resetPasswordEnterEmail:\n \"Enter your email address to reset your password\",\n resetPasswordSendCode: \"Send verification code\",\n resetPasswordCodeSent: \"We've sent a verification code to your email.\",\n resetPasswordEnterCode: \"Enter the 6-digit code\",\n resetPasswordResendCode: \"Resend code\",\n resetPasswordEnterNewPassword: \"Create your new password\",\n resetPasswordNewPassword: \"New password\",\n resetPasswordConfirmPassword: \"Confirm password\",\n resetPasswordSetNewPassword: \"Set new password\",\n resetPasswordSuccess: \"Your password has been reset successfully.\",\n resetPasswordBackToSignIn: \"Back to sign in\",\n resetPasswordCancel: \"Cancel\",\n resetPasswordDisabled:\n \"Password reset is not available. Please contact your administrator.\",\n verifyEmailTitle: \"Email Verification\",\n verifyEmailVerifying: \"Verifying your email...\",\n verifyEmailPleaseWait:\n \"Please wait while we verify your email address.\",\n verifyEmailSuccess: \"Your email has been verified successfully.\",\n verifyEmailFailed:\n \"Failed to verify your email. The link may have expired or is invalid.\",\n verifyEmailMissingParams:\n \"Invalid verification link. Email and token are required.\",\n verifyEmailSignIn: \"Sign in to your account\",\n verifyEmailBackToSignIn: \"Back to sign in\",\n },\n }),\n });\n\n fr = $dictionary({\n lazy: () => ({\n default: {\n loginSignIn: \"Se connecter\",\n loginContinueWith: \"Continuer avec $1\",\n loginOr: \"OU\",\n loginCancel: \"Annuler\",\n loginForgotPassword: \"Mot de passe oublié ?\",\n loginNoAccount: \"Vous n'avez pas de compte ?\",\n loginSignUp: \"S'inscrire\",\n loginUsername: \"Nom d'utilisateur\",\n loginEmail: \"E-mail\",\n loginPhone: \"Numéro de téléphone\",\n loginPassword: \"Mot de passe\",\n registerCreateAccount: \"Créer un compte\",\n registerContinueWith: \"Continuer avec $1\",\n registerOr: \"OU\",\n registerCancel: \"Annuler\",\n registerHaveAccount: \"Vous avez déjà un compte ?\",\n registerSignIn: \"Se connecter\",\n registerUsername: \"Nom d'utilisateur\",\n registerEmail: \"E-mail\",\n registerPhone: \"Numéro de téléphone\",\n registerPassword: \"Mot de passe\",\n registerConfirmPassword: \"Confirmer le mot de passe\",\n registerDisabled:\n \"L'inscription n'est pas disponible. Veuillez contacter votre administrateur.\",\n registerBackToSignIn: \"Retour à la connexion\",\n registerVerifyTitle: \"Vérifiez votre compte\",\n registerVerifyDescription:\n \"Veuillez entrer le(s) code(s) de vérification qui vous ont été envoyés.\",\n registerEmailCode: \"Code de vérification par e-mail\",\n registerPhoneCode: \"Code de vérification par téléphone\",\n registerVerifySubmit: \"Terminer l'inscription\",\n registerVerifyBack: \"Retour à l'inscription\",\n resetPasswordTitle: \"Réinitialiser le mot de passe\",\n resetPasswordEmail: \"E-mail\",\n resetPasswordEnterEmail:\n \"Entrez votre adresse e-mail pour réinitialiser votre mot de passe\",\n resetPasswordSendCode: \"Envoyer le code de vérification\",\n resetPasswordCodeSent:\n \"Nous avons envoyé un code de vérification à votre e-mail.\",\n resetPasswordEnterCode: \"Entrez le code à 6 chiffres\",\n resetPasswordResendCode: \"Renvoyer le code\",\n resetPasswordEnterNewPassword: \"Créez votre nouveau mot de passe\",\n resetPasswordNewPassword: \"Nouveau mot de passe\",\n resetPasswordConfirmPassword: \"Confirmer le mot de passe\",\n resetPasswordSetNewPassword: \"Définir le nouveau mot de passe\",\n resetPasswordSuccess:\n \"Votre mot de passe a été réinitialisé avec succès.\",\n resetPasswordBackToSignIn: \"Retour à la connexion\",\n resetPasswordCancel: \"Annuler\",\n resetPasswordDisabled:\n \"La réinitialisation du mot de passe n'est pas disponible. Veuillez contacter votre administrateur.\",\n verifyEmailTitle: \"Vérification de l'e-mail\",\n verifyEmailVerifying: \"Vérification de votre e-mail...\",\n verifyEmailPleaseWait:\n \"Veuillez patienter pendant que nous vérifions votre adresse e-mail.\",\n verifyEmailSuccess: \"Votre e-mail a été vérifié avec succès.\",\n verifyEmailFailed:\n \"Échec de la vérification de votre e-mail. Le lien a peut-être expiré ou est invalide.\",\n verifyEmailMissingParams:\n \"Lien de vérification invalide. L'e-mail et le jeton sont requis.\",\n verifyEmailSignIn: \"Se connecter à votre compte\",\n verifyEmailBackToSignIn: \"Retour à la connexion\",\n },\n }),\n });\n}\n","import { ReactAuth } from \"@alepha/react/auth\";\nimport { $page } from \"@alepha/react/router\";\nimport {\n IconLogin2,\n IconLogout2,\n IconMailCheck,\n IconPasswordUser,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport type { RealmController } from \"alepha/api/users\";\nimport { $client } from \"alepha/server/links\";\n\n/**\n * Schema for realm query parameter used across auth pages.\n */\nconst realmQuerySchema = t.object({\n r: t.optional(t.string({ description: \"Redirect URL after authentication\" })),\n realm: t.optional(\n t.string({ description: \"User realm name for multi-tenant auth\" }),\n ),\n});\n\nexport class AuthRouter {\n protected readonly realmClient = $client<RealmController>();\n protected readonly auth = $inject(ReactAuth);\n\n layout = $page({\n name: \"AuthLayout\",\n path: \"/auth\",\n lazy: () => import(\"./components/AuthLayout.tsx\"),\n children: () => [\n this.login,\n this.register,\n this.resetPassword,\n this.verifyEmail,\n ],\n });\n\n login = $page({\n icon: IconLogin2,\n label: \"Sign In\",\n description: \"Sign in to your account\",\n path: \"/login\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/Login.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n register = $page({\n icon: IconUserPlus,\n label: \"Register\",\n description: \"Create a new account\",\n path: \"/register\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/Register.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n resetPassword = $page({\n icon: IconPasswordUser,\n label: \"Reset Password\",\n description: \"Reset your account password\",\n path: \"/reset-password\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/ResetPassword.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n verifyEmail = $page({\n icon: IconMailCheck,\n label: \"Verify Email\",\n description: \"Verify your email address\",\n path: \"/verify-email\",\n schema: {\n query: t.object({\n email: t.optional(t.string()),\n token: t.optional(t.string()),\n }),\n },\n lazy: () => import(\"./components/VerifyEmail.tsx\"),\n });\n\n logout = $page({\n icon: IconLogout2,\n label: \"Sign Out\",\n description: \"Sign out of your account\",\n can: () => !!this.auth.user,\n path: \"/logout\",\n component: () => null,\n loader: () => {\n this.auth.logout();\n return {};\n },\n });\n\n protected async loadRealmConfig(realmName?: string) {\n try {\n return await this.realmClient.getRealmConfig({\n query: { realmName },\n });\n } catch (e) {\n if (e instanceof AlephaError) {\n throw new AlephaError(\n \"Missing Realm Configuration - Did you forget to add '$realm()' to your application?\",\n e,\n );\n }\n throw e;\n }\n }\n}\n","import { useAuth } from \"@alepha/react/auth\";\nimport { useRouter } from \"@alepha/react/router\";\nimport {\n ActionButton,\n type ActionMenuConfig,\n type ActionMenuItem,\n type ActionProps,\n ui,\n} from \"@alepha/ui\";\nimport { Avatar } from \"@mantine/core\";\nimport { IconLogin2, IconLogout, IconUser } from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\nimport type { AuthRouter } from \"../../AuthRouter.ts\";\n\nexport interface UserButtonProps\n extends Omit<ActionProps, \"menu\" | \"icon\" | \"onClick\"> {\n /**\n * Additional menu items to display before the logout option\n */\n menuItems?: ActionMenuItem[];\n\n /**\n * Custom logout label (default: \"Sign out\")\n */\n logoutLabel?: string;\n\n /**\n * Menu configuration overrides\n */\n menuConfig?: Partial<Omit<ActionMenuConfig, \"items\">>;\n\n /**\n * Whether to show a divider before logout (default: true when menuItems provided)\n */\n showLogoutDivider?: boolean;\n\n /**\n * Custom icon to use instead of user avatar (default: IconUser)\n */\n icon?: ReactNode;\n}\n\nconst UserButton = (props: UserButtonProps) => {\n const {\n menuItems = [],\n logoutLabel = \"Sign out\",\n menuConfig,\n showLogoutDivider = menuItems.length > 0,\n icon,\n children,\n ...buttonProps\n } = props;\n\n buttonProps.variant ??= \"subtle\";\n\n const auth = useAuth<{\n username?: string;\n email?: string;\n picture?: string;\n }>();\n\n const authRouter = useRouter<AuthRouter>();\n\n if (!auth.user) {\n return (\n <ActionButton\n {...buttonProps}\n icon={IconLogin2}\n href={authRouter.path(\"login\")}\n />\n );\n }\n\n const userLabel = auth.user.username || auth.user.email;\n\n const items: ActionMenuItem[] = [];\n\n // Add user info label if available\n if (auth.user.email && auth.user.username) {\n items.push({\n type: \"label\",\n label: auth.user.email,\n });\n }\n\n // Add custom menu items\n items.push(...menuItems);\n\n // Add divider before logout if needed\n if (showLogoutDivider && items.length > 0) {\n items.push({ type: \"divider\" });\n }\n\n // Add logout item\n items.push({\n label: logoutLabel,\n icon: <IconLogout size={ui.sizes.icon.md} />,\n color: \"red\",\n onClick: () => auth.logout(),\n });\n\n // Use leftSection for Avatar (JSX element), icon prop for component types\n const hasAvatar = !icon && auth.user.picture;\n\n return (\n <ActionButton\n {...buttonProps}\n icon={hasAvatar ? undefined : (icon ?? IconUser)}\n leftSection={\n hasAvatar ? (\n <Avatar\n src={`/api/files/${auth.user.picture}`}\n size={24}\n radius=\"xl\"\n />\n ) : undefined\n }\n menu={{\n position: \"bottom-end\",\n width: 200,\n ...menuConfig,\n items,\n }}\n >\n {children ?? userLabel}\n </ActionButton>\n );\n};\n\nexport default UserButton;\n","import { AlephaReactAuth } from \"@alepha/react/auth\";\nimport { AlephaReactI18n } from \"@alepha/react/i18n\";\nimport { AlephaUI } from \"@alepha/ui\";\nimport { $module } from \"alepha\";\nimport { AuthI18n } from \"./AuthI18n.ts\";\nimport { AuthRouter } from \"./AuthRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./AuthRouter.ts\";\nexport type { UserButtonProps } from \"./components/buttons/UserButton.tsx\";\nexport { default as UserButton } from \"./components/buttons/UserButton.tsx\";\nexport { default as Login } from \"./components/Login.tsx\";\nexport { default as Register } from \"./components/Register.tsx\";\nexport { default as ResetPassword } from \"./components/ResetPassword.tsx\";\nexport { default as VerifyEmail } from \"./components/VerifyEmail.tsx\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Login UI Module\n *\n * @module alepha.ui.auth\n */\nexport const AlephaUIAuth = $module({\n name: \"alepha.ui.auth\",\n services: [AlephaUI, AlephaReactAuth, AlephaReactI18n, AuthRouter, AuthI18n],\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,IAAa,WAAb,MAAsB;CACpB,KAAK,YAAY;EACf,MAAM;EACN,aAAa,EACX,SAAS;GACP,aAAa;GACb,mBAAmB;GACnB,SAAS;GACT,aAAa;GACb,qBAAqB;GACrB,gBAAgB;GAChB,aAAa;GACb,eAAe;GACf,YAAY;GACZ,YAAY;GACZ,eAAe;GACf,uBAAuB;GACvB,sBAAsB;GACtB,YAAY;GACZ,gBAAgB;GAChB,qBAAqB;GACrB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,eAAe;GACf,kBAAkB;GAClB,yBAAyB;GACzB,kBACE;GACF,sBAAsB;GACtB,qBAAqB;GACrB,2BACE;GACF,mBAAmB;GACnB,mBAAmB;GACnB,sBAAsB;GACtB,oBAAoB;GACpB,oBAAoB;GACpB,oBAAoB;GACpB,yBACE;GACF,uBAAuB;GACvB,uBAAuB;GACvB,wBAAwB;GACxB,yBAAyB;GACzB,+BAA+B;GAC/B,0BAA0B;GAC1B,8BAA8B;GAC9B,6BAA6B;GAC7B,sBAAsB;GACtB,2BAA2B;GAC3B,qBAAqB;GACrB,uBACE;GACF,kBAAkB;GAClB,sBAAsB;GACtB,uBACE;GACF,oBAAoB;GACpB,mBACE;GACF,0BACE;GACF,mBAAmB;GACnB,yBAAyB;GAC1B,EACF;EACF,CAAC;CAEF,KAAK,YAAY,EACf,aAAa,EACX,SAAS;EACP,aAAa;EACb,mBAAmB;EACnB,SAAS;EACT,aAAa;EACb,qBAAqB;EACrB,gBAAgB;EAChB,aAAa;EACb,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,eAAe;EACf,uBAAuB;EACvB,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;EAChB,qBAAqB;EACrB,gBAAgB;EAChB,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,kBAAkB;EAClB,yBAAyB;EACzB,kBACE;EACF,sBAAsB;EACtB,qBAAqB;EACrB,2BACE;EACF,mBAAmB;EACnB,mBAAmB;EACnB,sBAAsB;EACtB,oBAAoB;EACpB,oBAAoB;EACpB,oBAAoB;EACpB,yBACE;EACF,uBAAuB;EACvB,uBACE;EACF,wBAAwB;EACxB,yBAAyB;EACzB,+BAA+B;EAC/B,0BAA0B;EAC1B,8BAA8B;EAC9B,6BAA6B;EAC7B,sBACE;EACF,2BAA2B;EAC3B,qBAAqB;EACrB,uBACE;EACF,kBAAkB;EAClB,sBAAsB;EACtB,uBACE;EACF,oBAAoB;EACpB,mBACE;EACF,0BACE;EACF,mBAAmB;EACnB,yBAAyB;EAC1B,EACF,GACF,CAAC;;;;;;;;AC1HJ,MAAM,mBAAmB,EAAE,OAAO;CAChC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,qCAAqC,CAAC,CAAC;CAC7E,OAAO,EAAE,SACP,EAAE,OAAO,EAAE,aAAa,yCAAyC,CAAC,CACnE;CACF,CAAC;AAEF,IAAa,aAAb,MAAwB;CACtB,AAAmB,cAAc,SAA0B;CAC3D,AAAmB,OAAO,QAAQ,UAAU;CAE5C,SAAS,MAAM;EACb,MAAM;EACN,MAAM;EACN,YAAY,OAAO;EACnB,gBAAgB;GACd,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACN;EACF,CAAC;CAEF,QAAQ,MAAM;EACZ,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,QAAQ,EACN,OAAO,kBACR;EACD,WAAW,CAAC,KAAK,KAAK;EACtB,YAAY,OAAO;EACnB,QAAQ,OAAO,EAAE,YAAY;AAC3B,UAAO,EACL,aAAa,MAAM,KAAK,gBAAgB,MAAM,MAAM,EACrD;;EAEJ,CAAC;CAEF,WAAW,MAAM;EACf,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,QAAQ,EACN,OAAO,kBACR;EACD,WAAW,CAAC,KAAK,KAAK;EACtB,YAAY,OAAO;EACnB,QAAQ,OAAO,EAAE,YAAY;AAC3B,UAAO,EACL,aAAa,MAAM,KAAK,gBAAgB,MAAM,MAAM,EACrD;;EAEJ,CAAC;CAEF,gBAAgB,MAAM;EACpB,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,QAAQ,EACN,OAAO,kBACR;EACD,WAAW,CAAC,KAAK,KAAK;EACtB,YAAY,OAAO;EACnB,QAAQ,OAAO,EAAE,YAAY;AAC3B,UAAO,EACL,aAAa,MAAM,KAAK,gBAAgB,MAAM,MAAM,EACrD;;EAEJ,CAAC;CAEF,cAAc,MAAM;EAClB,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,QAAQ,EACN,OAAO,EAAE,OAAO;GACd,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;GAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;GAC9B,CAAC,EACH;EACD,YAAY,OAAO;EACpB,CAAC;CAEF,SAAS,MAAM;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,WAAW,CAAC,CAAC,KAAK,KAAK;EACvB,MAAM;EACN,iBAAiB;EACjB,cAAc;AACZ,QAAK,KAAK,QAAQ;AAClB,UAAO,EAAE;;EAEZ,CAAC;CAEF,MAAgB,gBAAgB,WAAoB;AAClD,MAAI;AACF,UAAO,MAAM,KAAK,YAAY,eAAe,EAC3C,OAAO,EAAE,WAAW,EACrB,CAAC;WACK,GAAG;AACV,OAAI,aAAa,YACf,OAAM,IAAI,YACR,uFACA,EACD;AAEH,SAAM;;;;;;;ACvFZ,MAAM,cAAc,UAA2B;CAC7C,MAAM,EACJ,YAAY,EAAE,EACd,cAAc,YACd,YACA,oBAAoB,UAAU,SAAS,GACvC,MACA,UACA,GAAG,gBACD;AAEJ,aAAY,YAAY;CAExB,MAAM,OAAO,SAIT;CAEJ,MAAM,aAAa,WAAuB;AAE1C,KAAI,CAAC,KAAK,KACR,QACE,oBAAC;EACC,GAAI;EACJ,MAAM;EACN,MAAM,WAAW,KAAK,QAAQ;GAC9B;CAIN,MAAM,YAAY,KAAK,KAAK,YAAY,KAAK,KAAK;CAElD,MAAM,QAA0B,EAAE;AAGlC,KAAI,KAAK,KAAK,SAAS,KAAK,KAAK,SAC/B,OAAM,KAAK;EACT,MAAM;EACN,OAAO,KAAK,KAAK;EAClB,CAAC;AAIJ,OAAM,KAAK,GAAG,UAAU;AAGxB,KAAI,qBAAqB,MAAM,SAAS,EACtC,OAAM,KAAK,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAM,KAAK;EACT,OAAO;EACP,MAAM,oBAAC,cAAW,MAAM,GAAG,MAAM,KAAK,KAAM;EAC5C,OAAO;EACP,eAAe,KAAK,QAAQ;EAC7B,CAAC;CAGF,MAAM,YAAY,CAAC,QAAQ,KAAK,KAAK;AAErC,QACE,oBAAC;EACC,GAAI;EACJ,MAAM,YAAY,SAAa,QAAQ;EACvC,aACE,YACE,oBAAC;GACC,KAAK,cAAc,KAAK,KAAK;GAC7B,MAAM;GACN,QAAO;IACP,GACA;EAEN,MAAM;GACJ,UAAU;GACV,OAAO;GACP,GAAG;GACH;GACD;YAEA,YAAY;GACA;;AAInB,yBAAe;;;;;;;;;ACzGf,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,UAAU;EAAC;EAAU;EAAiB;EAAiB;EAAY;EAAS;CAC7E,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/auth/AuthI18n.ts","../../src/auth/AuthRouter.ts","../../src/auth/components/buttons/UserButton.tsx","../../src/auth/index.ts"],"sourcesContent":["import { $dictionary } from \"alepha/react/i18n\";\n\nexport class AuthI18n {\n en = $dictionary({\n name: \"alepha.ui.auth.en\",\n lazy: () => ({\n default: {\n loginSignIn: \"Sign in\",\n loginContinueWith: \"Continue with $1\",\n loginOr: \"OR\",\n loginCancel: \"Cancel\",\n loginForgotPassword: \"Forgot password?\",\n loginNoAccount: \"Don't have an account?\",\n loginSignUp: \"Sign up\",\n loginUsername: \"Username\",\n loginEmail: \"Email\",\n loginPhone: \"Phone number\",\n loginPassword: \"Password\",\n registerCreateAccount: \"Create account\",\n registerContinueWith: \"Continue with $1\",\n registerOr: \"OR\",\n registerCancel: \"Cancel\",\n registerHaveAccount: \"Already have an account?\",\n registerSignIn: \"Sign in\",\n registerUsername: \"Username\",\n registerEmail: \"Email\",\n registerPhone: \"Phone number\",\n registerPassword: \"Password\",\n registerConfirmPassword: \"Confirm password\",\n registerDisabled:\n \"Registration is not available. Please contact your administrator.\",\n registerBackToSignIn: \"Back to sign in\",\n registerVerifyTitle: \"Verify your account\",\n registerVerifyDescription:\n \"Please enter the verification code(s) sent to you.\",\n registerEmailCode: \"Email verification code\",\n registerPhoneCode: \"Phone verification code\",\n registerVerifySubmit: \"Complete Registration\",\n registerVerifyBack: \"Back to registration\",\n resetPasswordTitle: \"Reset password\",\n resetPasswordEmail: \"Email\",\n resetPasswordEnterEmail:\n \"Enter your email address to reset your password\",\n resetPasswordSendCode: \"Send verification code\",\n resetPasswordCodeSent: \"We've sent a verification code to your email.\",\n resetPasswordEnterCode: \"Enter the 6-digit code\",\n resetPasswordResendCode: \"Resend code\",\n resetPasswordEnterNewPassword: \"Create your new password\",\n resetPasswordNewPassword: \"New password\",\n resetPasswordConfirmPassword: \"Confirm password\",\n resetPasswordSetNewPassword: \"Set new password\",\n resetPasswordSuccess: \"Your password has been reset successfully.\",\n resetPasswordBackToSignIn: \"Back to sign in\",\n resetPasswordCancel: \"Cancel\",\n resetPasswordDisabled:\n \"Password reset is not available. Please contact your administrator.\",\n verifyEmailTitle: \"Email Verification\",\n verifyEmailVerifying: \"Verifying your email...\",\n verifyEmailPleaseWait:\n \"Please wait while we verify your email address.\",\n verifyEmailSuccess: \"Your email has been verified successfully.\",\n verifyEmailFailed:\n \"Failed to verify your email. The link may have expired or is invalid.\",\n verifyEmailMissingParams:\n \"Invalid verification link. Email and token are required.\",\n verifyEmailSignIn: \"Sign in to your account\",\n verifyEmailBackToSignIn: \"Back to sign in\",\n },\n }),\n });\n\n fr = $dictionary({\n lazy: () => ({\n default: {\n loginSignIn: \"Se connecter\",\n loginContinueWith: \"Continuer avec $1\",\n loginOr: \"OU\",\n loginCancel: \"Annuler\",\n loginForgotPassword: \"Mot de passe oublié ?\",\n loginNoAccount: \"Vous n'avez pas de compte ?\",\n loginSignUp: \"S'inscrire\",\n loginUsername: \"Nom d'utilisateur\",\n loginEmail: \"E-mail\",\n loginPhone: \"Numéro de téléphone\",\n loginPassword: \"Mot de passe\",\n registerCreateAccount: \"Créer un compte\",\n registerContinueWith: \"Continuer avec $1\",\n registerOr: \"OU\",\n registerCancel: \"Annuler\",\n registerHaveAccount: \"Vous avez déjà un compte ?\",\n registerSignIn: \"Se connecter\",\n registerUsername: \"Nom d'utilisateur\",\n registerEmail: \"E-mail\",\n registerPhone: \"Numéro de téléphone\",\n registerPassword: \"Mot de passe\",\n registerConfirmPassword: \"Confirmer le mot de passe\",\n registerDisabled:\n \"L'inscription n'est pas disponible. Veuillez contacter votre administrateur.\",\n registerBackToSignIn: \"Retour à la connexion\",\n registerVerifyTitle: \"Vérifiez votre compte\",\n registerVerifyDescription:\n \"Veuillez entrer le(s) code(s) de vérification qui vous ont été envoyés.\",\n registerEmailCode: \"Code de vérification par e-mail\",\n registerPhoneCode: \"Code de vérification par téléphone\",\n registerVerifySubmit: \"Terminer l'inscription\",\n registerVerifyBack: \"Retour à l'inscription\",\n resetPasswordTitle: \"Réinitialiser le mot de passe\",\n resetPasswordEmail: \"E-mail\",\n resetPasswordEnterEmail:\n \"Entrez votre adresse e-mail pour réinitialiser votre mot de passe\",\n resetPasswordSendCode: \"Envoyer le code de vérification\",\n resetPasswordCodeSent:\n \"Nous avons envoyé un code de vérification à votre e-mail.\",\n resetPasswordEnterCode: \"Entrez le code à 6 chiffres\",\n resetPasswordResendCode: \"Renvoyer le code\",\n resetPasswordEnterNewPassword: \"Créez votre nouveau mot de passe\",\n resetPasswordNewPassword: \"Nouveau mot de passe\",\n resetPasswordConfirmPassword: \"Confirmer le mot de passe\",\n resetPasswordSetNewPassword: \"Définir le nouveau mot de passe\",\n resetPasswordSuccess:\n \"Votre mot de passe a été réinitialisé avec succès.\",\n resetPasswordBackToSignIn: \"Retour à la connexion\",\n resetPasswordCancel: \"Annuler\",\n resetPasswordDisabled:\n \"La réinitialisation du mot de passe n'est pas disponible. Veuillez contacter votre administrateur.\",\n verifyEmailTitle: \"Vérification de l'e-mail\",\n verifyEmailVerifying: \"Vérification de votre e-mail...\",\n verifyEmailPleaseWait:\n \"Veuillez patienter pendant que nous vérifions votre adresse e-mail.\",\n verifyEmailSuccess: \"Votre e-mail a été vérifié avec succès.\",\n verifyEmailFailed:\n \"Échec de la vérification de votre e-mail. Le lien a peut-être expiré ou est invalide.\",\n verifyEmailMissingParams:\n \"Lien de vérification invalide. L'e-mail et le jeton sont requis.\",\n verifyEmailSignIn: \"Se connecter à votre compte\",\n verifyEmailBackToSignIn: \"Retour à la connexion\",\n },\n }),\n });\n}\n","import {\n IconLogin2,\n IconLogout2,\n IconMailCheck,\n IconPasswordUser,\n IconUser,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport type { RealmController } from \"alepha/api/users\";\nimport { ReactAuth } from \"alepha/react/auth\";\nimport { $page } from \"alepha/react/router\";\nimport { $client } from \"alepha/server/links\";\n\n/**\n * Schema for realm query parameter used across auth pages.\n */\nconst realmQuerySchema = t.object({\n r: t.optional(t.string({ description: \"Redirect URL after authentication\" })),\n realm: t.optional(\n t.string({ description: \"User realm name for multi-tenant auth\" }),\n ),\n});\n\nexport class AuthRouter {\n protected readonly realmClient = $client<RealmController>();\n protected readonly auth = $inject(ReactAuth);\n\n layout = $page({\n name: \"AuthLayout\",\n path: \"/auth\",\n lazy: () => import(\"./components/AuthLayout.tsx\"),\n children: () => [\n this.login,\n this.register,\n this.resetPassword,\n this.verifyEmail,\n this.profile,\n ],\n });\n\n login = $page({\n icon: IconLogin2,\n label: \"Sign In\",\n description: \"Sign in to your account\",\n path: \"/login\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/Login.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n register = $page({\n icon: IconUserPlus,\n label: \"Register\",\n description: \"Create a new account\",\n path: \"/register\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/Register.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n resetPassword = $page({\n icon: IconPasswordUser,\n label: \"Reset Password\",\n description: \"Reset your account password\",\n path: \"/reset-password\",\n schema: {\n query: realmQuerySchema,\n },\n can: () => !this.auth.user,\n lazy: () => import(\"./components/ResetPassword.tsx\"),\n loader: async ({ query }) => {\n return {\n realmConfig: await this.loadRealmConfig(query.realm),\n };\n },\n });\n\n verifyEmail = $page({\n icon: IconMailCheck,\n label: \"Verify Email\",\n description: \"Verify your email address\",\n path: \"/verify-email\",\n schema: {\n query: t.object({\n email: t.optional(t.string()),\n token: t.optional(t.string()),\n }),\n },\n lazy: () => import(\"./components/VerifyEmail.tsx\"),\n });\n\n logout = $page({\n icon: IconLogout2,\n label: \"Sign Out\",\n description: \"Sign out of your account\",\n can: () => !!this.auth.user,\n path: \"/logout\",\n component: () => null,\n loader: () => {\n this.auth.logout();\n return {};\n },\n });\n\n profile = $page({\n name: \"userProfile\",\n icon: IconUser,\n label: \"Profile\",\n description: \"View your profile\",\n path: \"/profile\",\n can: () => !!this.auth.user,\n lazy: () => import(\"./components/Profile.tsx\"),\n });\n\n protected async loadRealmConfig(realmName?: string) {\n try {\n return await this.realmClient.getRealmConfig({\n query: { realmName },\n });\n } catch (e) {\n if (e instanceof AlephaError) {\n throw new AlephaError(\n \"Missing Realm Configuration - Did you forget to add '$realm()' to your application?\",\n e,\n );\n }\n throw e;\n }\n }\n}\n","import {\n ActionButton,\n type ActionMenuConfig,\n type ActionMenuItem,\n type ActionProps,\n ui,\n} from \"@alepha/ui\";\nimport { Avatar } from \"@mantine/core\";\nimport {\n IconLogin2,\n IconLogout,\n IconSettings,\n IconUser,\n} from \"@tabler/icons-react\";\nimport type { AdminUserController } from \"alepha/api/users\";\nimport { useClient, useInject } from \"alepha/react\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { ReactPageProvider, useRouter } from \"alepha/react/router\";\nimport type { ReactNode } from \"react\";\nimport type { AuthRouter } from \"../../AuthRouter.ts\";\n\nexport interface UserButtonProps\n extends Omit<ActionProps, \"menu\" | \"icon\" | \"onClick\"> {\n /**\n * Additional menu items to display before the logout option\n */\n menuItems?: ActionMenuItem[];\n\n /**\n * Custom logout label (default: \"Sign out\")\n */\n logoutLabel?: string;\n\n /**\n * Menu configuration overrides\n */\n menuConfig?: Partial<Omit<ActionMenuConfig, \"items\">>;\n\n /**\n * Whether to show a divider before logout (default: true when menuItems provided)\n */\n showLogoutDivider?: boolean;\n\n /**\n * Custom icon to use instead of user avatar (default: IconUser)\n */\n icon?: ReactNode;\n}\n\nconst UserButton = (props: UserButtonProps) => {\n const {\n menuItems = [],\n logoutLabel = \"Sign out\",\n menuConfig,\n showLogoutDivider = menuItems.length > 0,\n icon,\n children,\n ...buttonProps\n } = props;\n\n buttonProps.variant ??= \"subtle\";\n\n const adminUserCtrl = useClient<AdminUserController>();\n const pages = useInject(ReactPageProvider);\n\n const auth = useAuth<{\n username?: string;\n email?: string;\n picture?: string;\n }>();\n\n const isConnected = !!auth.user;\n const isAdmin = isConnected && adminUserCtrl.findUsers.can();\n const userPage = pages.getPages().find((it) => it.name === \"userProfile\");\n const adminPage = pages.getPages().find((it) => it.name === \"adminLayout\");\n const authRouter = useRouter<AuthRouter>();\n\n if (!auth.user) {\n return (\n <ActionButton\n {...buttonProps}\n icon={IconLogin2}\n href={authRouter.path(\"login\")}\n />\n );\n }\n\n const userLabel = auth.user.username || auth.user.email;\n\n const items: ActionMenuItem[] = [];\n\n // Add user info label if available\n if (auth.user.email && auth.user.username) {\n items.push({\n type: \"label\",\n label: auth.user.email,\n });\n }\n\n // Add profile page link if available\n if (userPage && isConnected) {\n items.push({\n label: \"Profile\",\n icon: <IconUser size={ui.sizes.icon.md} />,\n href: authRouter.path(\"userProfile\"),\n });\n }\n\n // Add admin page link if available and user is admin\n if (adminPage && isAdmin) {\n items.push({\n label: \"Admin\",\n icon: <IconSettings size={ui.sizes.icon.md} />,\n href: authRouter.path(\"adminLayout\"),\n });\n }\n\n // Add custom menu items\n items.push(...menuItems);\n\n // Add divider before logout if needed\n if (showLogoutDivider && items.length > 0) {\n items.push({ type: \"divider\" });\n }\n\n // Add logout item\n items.push({\n label: logoutLabel,\n icon: <IconLogout size={ui.sizes.icon.md} />,\n color: \"red\",\n onClick: () => auth.logout(),\n });\n\n // Use leftSection for Avatar (JSX element), icon prop for component types\n const hasAvatar = !icon && auth.user.picture;\n\n return (\n <ActionButton\n {...buttonProps}\n icon={hasAvatar ? undefined : (icon ?? IconUser)}\n leftSection={\n hasAvatar ? (\n <Avatar\n src={`/api/files/${auth.user.picture}`}\n size={24}\n radius=\"xl\"\n />\n ) : undefined\n }\n menu={{\n position: \"bottom-end\",\n width: 200,\n ...menuConfig,\n items,\n }}\n >\n {children ?? userLabel}\n </ActionButton>\n );\n};\n\nexport default UserButton;\n","import { AlephaUI } from \"@alepha/ui\";\nimport { $context, $module } from \"alepha\";\nimport { AlephaReactAuth } from \"alepha/react/auth\";\nimport { AlephaReactI18n } from \"alepha/react/i18n\";\nimport { AuthI18n } from \"./AuthI18n.ts\";\nimport { AuthRouter } from \"./AuthRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./AuthRouter.ts\";\nexport type { UserButtonProps } from \"./components/buttons/UserButton.tsx\";\nexport { default as UserButton } from \"./components/buttons/UserButton.tsx\";\nexport { default as Login } from \"./components/Login.tsx\";\nexport { default as Register } from \"./components/Register.tsx\";\nexport { default as ResetPassword } from \"./components/ResetPassword.tsx\";\nexport { default as VerifyEmail } from \"./components/VerifyEmail.tsx\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | frontend | rare | experimental |\n *\n * Authentication UI components.\n *\n * **Features:**\n * - Login page component\n * - Register page component\n * - Reset password page component\n * - Email verification page component\n * - UserButton for user menu\n *\n * @module alepha.ui.auth\n */\nexport const AlephaUIAuth = $module({\n name: \"alepha.ui.auth\",\n services: [AlephaUI, AlephaReactAuth, AlephaReactI18n, AuthRouter, AuthI18n],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Register Auth UI components and get the AuthRouter instance.\n */\nexport const $uiAuth = () => {\n const { alepha } = $context();\n return alepha.inject(AuthRouter);\n};\n"],"mappings":"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"}