@alepha/ui 0.13.3 → 0.13.5

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 (79) hide show
  1. package/dist/admin/AdminFiles-B-0UcHVV.js +3 -0
  2. package/dist/admin/{AdminFiles-BjofP3OC.js → AdminFiles-B_jfB_Py.js} +4 -4
  3. package/dist/admin/{AdminFiles-BjofP3OC.js.map → AdminFiles-B_jfB_Py.js.map} +1 -1
  4. package/dist/admin/{AdminLayout-JakF7ESb.js → AdminLayout-BMtiXAzS.js} +37 -29
  5. package/dist/admin/AdminLayout-BMtiXAzS.js.map +1 -0
  6. package/dist/admin/AdminLayout-BNo3GoHR.js +3 -0
  7. package/dist/admin/{AdminNotifications-BPrxALdS.js → AdminNotifications-BFEjqpqx.js} +3 -3
  8. package/dist/admin/{AdminNotifications-BPrxALdS.js.map → AdminNotifications-BFEjqpqx.js.map} +1 -1
  9. package/dist/admin/AdminNotifications-DJs2ZjNj.js +3 -0
  10. package/dist/admin/{AdminSessions-CMmBtbSw.js → AdminSessions-D7DESfWK.js} +4 -4
  11. package/dist/admin/{AdminSessions-CMmBtbSw.js.map → AdminSessions-D7DESfWK.js.map} +1 -1
  12. package/dist/admin/AdminSessions-PS2M8iXi.js +3 -0
  13. package/dist/admin/{AdminUserCreate-Coa_yi6m.js → AdminUserCreate-Bhxsn92l.js} +3 -3
  14. package/dist/admin/{AdminUserCreate-Coa_yi6m.js.map → AdminUserCreate-Bhxsn92l.js.map} +1 -1
  15. package/dist/admin/{AdminUserCreate-DjiCcAk0.js → AdminUserCreate-CYI_xW5T.js} +1 -1
  16. package/dist/admin/{AdminUserDetails-BCFwOm9w.js → AdminUserDetails-C2y1Ig4n.js} +5 -5
  17. package/dist/admin/{AdminUserDetails-BCFwOm9w.js.map → AdminUserDetails-C2y1Ig4n.js.map} +1 -1
  18. package/dist/admin/{AdminUserDetails-C5yeJNa3.js → AdminUserDetails-Cmzx9HxH.js} +1 -1
  19. package/dist/admin/{AdminUserLayout-B8ga5QvP.js → AdminUserLayout-DGSf612u.js} +1 -1
  20. package/dist/admin/{AdminUserLayout-CR2OqV9Z.js → AdminUserLayout-sW6cjZL0.js} +3 -3
  21. package/dist/admin/{AdminUserLayout-CR2OqV9Z.js.map → AdminUserLayout-sW6cjZL0.js.map} +1 -1
  22. package/dist/admin/{AdminUserSessions-Bcf6-rjG.js → AdminUserSessions-CvN15wPe.js} +4 -4
  23. package/dist/admin/{AdminUserSessions-Bcf6-rjG.js.map → AdminUserSessions-CvN15wPe.js.map} +1 -1
  24. package/dist/admin/AdminUserSessions-D-aOcZgV.js +3 -0
  25. package/dist/admin/AdminUserSettings-CEMhIYrI.js +3 -0
  26. package/dist/admin/{AdminUserSettings-DRYVdW6S.js → AdminUserSettings-DvaaxgcV.js} +3 -3
  27. package/dist/admin/{AdminUserSettings-DRYVdW6S.js.map → AdminUserSettings-DvaaxgcV.js.map} +1 -1
  28. package/dist/admin/{AdminUsers-IN_2yHKt.js → AdminUsers-BR3C-jrg.js} +3 -3
  29. package/dist/admin/{AdminUsers-IN_2yHKt.js.map → AdminUsers-BR3C-jrg.js.map} +1 -1
  30. package/dist/admin/AdminUsers-CMW9vN09.js +3 -0
  31. package/dist/admin/index.d.ts +1169 -1163
  32. package/dist/admin/index.js +31 -29
  33. package/dist/admin/index.js.map +1 -1
  34. package/dist/auth/{AuthLayout-BSL8ZHgr.js → AuthLayout-CzwUKD9y.js} +2 -2
  35. package/dist/auth/{AuthLayout-BSL8ZHgr.js.map → AuthLayout-CzwUKD9y.js.map} +1 -1
  36. package/dist/auth/{IconGoogle-v_58os2T.js → IconGoogle-Cm5d8J3f.js} +3 -3
  37. package/dist/auth/{IconGoogle-v_58os2T.js.map → IconGoogle-Cm5d8J3f.js.map} +1 -1
  38. package/dist/auth/{Login-kBfaRgKG.js → Login-7HlBjDeV.js} +4 -4
  39. package/dist/auth/{Login-kBfaRgKG.js.map → Login-7HlBjDeV.js.map} +1 -1
  40. package/dist/auth/Login-C-e27DGb.js +4 -0
  41. package/dist/auth/{Register-BxJmOqpF.js → Register-CuQr3kgi.js} +3 -3
  42. package/dist/auth/{Register-BxJmOqpF.js.map → Register-CuQr3kgi.js.map} +1 -1
  43. package/dist/auth/Register-DbvXwgbG.js +4 -0
  44. package/dist/auth/{ResetPassword-BhyZ9ek4.js → ResetPassword-BzU-cdd4.js} +2 -2
  45. package/dist/auth/{ResetPassword-BhyZ9ek4.js.map → ResetPassword-BzU-cdd4.js.map} +1 -1
  46. package/dist/auth/ResetPassword-DSvrdpaA.js +3 -0
  47. package/dist/auth/VerifyEmail-Dc9ABKUw.js +3 -0
  48. package/dist/auth/{VerifyEmail-DeLct3oQ.js → VerifyEmail-R79sSej_.js} +2 -2
  49. package/dist/auth/{VerifyEmail-DeLct3oQ.js.map → VerifyEmail-R79sSej_.js.map} +1 -1
  50. package/dist/auth/index.d.ts +534 -534
  51. package/dist/auth/index.js +15 -14
  52. package/dist/auth/index.js.map +1 -1
  53. package/dist/core/index.d.ts +187 -187
  54. package/dist/core/index.js +51 -59
  55. package/dist/core/index.js.map +1 -1
  56. package/package.json +5 -4
  57. package/src/admin/AdminSidebar.ts +31 -0
  58. package/src/admin/components/AdminLayout.tsx +5 -26
  59. package/src/admin/index.ts +4 -1
  60. package/src/auth/components/Login.tsx +1 -1
  61. package/src/auth/components/buttons/UserButton.tsx +7 -1
  62. package/src/core/components/buttons/ActionButton.tsx +1 -0
  63. package/src/core/components/layout/Sidebar.tsx +0 -2
  64. package/src/core/hooks/useTheme.ts +2 -2
  65. package/src/core/providers/ThemeProvider.ts +11 -8
  66. package/src/core/themes/midnight.ts +1 -7
  67. package/styles.css +84 -0
  68. package/dist/admin/AdminFiles-DldZB7oo.js +0 -3
  69. package/dist/admin/AdminLayout-JakF7ESb.js.map +0 -1
  70. package/dist/admin/AdminLayout-qNsIyl30.js +0 -3
  71. package/dist/admin/AdminNotifications-DV-35Fi3.js +0 -3
  72. package/dist/admin/AdminSessions-Df2VYzlE.js +0 -3
  73. package/dist/admin/AdminUserSessions-A_5KkqTY.js +0 -3
  74. package/dist/admin/AdminUserSettings-DAsAhFjX.js +0 -3
  75. package/dist/admin/AdminUsers-Dd9a5UqO.js +0 -3
  76. package/dist/auth/Login-DDsyCNAA.js +0 -4
  77. package/dist/auth/Register-D10MnlQc.js +0 -4
  78. package/dist/auth/ResetPassword-llBG-STp.js +0 -3
  79. package/dist/auth/VerifyEmail-BvOG-IUC.js +0 -3
@@ -1,13 +1,13 @@
1
- import { t as AdminFiles_default } from "./AdminFiles-BjofP3OC.js";
2
- import { t as AdminLayout_default } from "./AdminLayout-JakF7ESb.js";
3
- import { t as AdminNotifications_default } from "./AdminNotifications-BPrxALdS.js";
4
- import { t as AdminSessions_default } from "./AdminSessions-CMmBtbSw.js";
5
- import { t as AdminUserCreate_default } from "./AdminUserCreate-Coa_yi6m.js";
6
- import { t as AdminUserDetails_default } from "./AdminUserDetails-BCFwOm9w.js";
7
- import { t as AdminUserLayout_default } from "./AdminUserLayout-CR2OqV9Z.js";
8
- import { t as AdminUserSessions_default } from "./AdminUserSessions-Bcf6-rjG.js";
9
- import { t as AdminUserSettings_default } from "./AdminUserSettings-DRYVdW6S.js";
10
- import { t as AdminUsers_default } from "./AdminUsers-IN_2yHKt.js";
1
+ import { n as AdminSidebar, t as AdminLayout_default } from "./AdminLayout-BMtiXAzS.js";
2
+ import { t as AdminFiles_default } from "./AdminFiles-B_jfB_Py.js";
3
+ import { t as AdminNotifications_default } from "./AdminNotifications-BFEjqpqx.js";
4
+ import { t as AdminSessions_default } from "./AdminSessions-D7DESfWK.js";
5
+ import { t as AdminUserCreate_default } from "./AdminUserCreate-Bhxsn92l.js";
6
+ import { t as AdminUserDetails_default } from "./AdminUserDetails-C2y1Ig4n.js";
7
+ import { t as AdminUserLayout_default } from "./AdminUserLayout-sW6cjZL0.js";
8
+ import { t as AdminUserSessions_default } from "./AdminUserSessions-CvN15wPe.js";
9
+ import { t as AdminUserSettings_default } from "./AdminUserSettings-DvaaxgcV.js";
10
+ import { t as AdminUsers_default } from "./AdminUsers-BR3C-jrg.js";
11
11
  import { AlephaMantineProvider, AlephaUI, DataTable, Flex, Text } from "@alepha/ui";
12
12
  import { AlephaUIAuth, AuthRouter } from "@alepha/ui/auth";
13
13
  import { $inject, $module, t } from "alepha";
@@ -15,12 +15,12 @@ import { $page, ReactRouter, Redirection, useClient } from "@alepha/react";
15
15
  import { ReactAuth } from "@alepha/react/auth";
16
16
  import { IconBell, IconCheck, IconClock, IconDevices, IconFile, IconPlayerPlay, IconPlus, IconSettings, IconShieldCheck, IconUser, IconUsers, IconX } from "@tabler/icons-react";
17
17
  import { $client } from "alepha/server/links";
18
- import { useI18n } from "@alepha/react/i18n";
19
18
  import { Badge, Stack } from "@mantine/core";
20
19
  import { jsx, jsxs } from "react/jsx-runtime";
20
+ import { useI18n } from "@alepha/react/i18n";
21
21
  import { jobExecutions } from "alepha/api/jobs";
22
22
 
23
- //#region src/admin/AdminRouter.ts
23
+ //#region ../../src/admin/AdminRouter.ts
24
24
  var AdminRouter = class {
25
25
  router = $inject(ReactRouter);
26
26
  authRouter = $inject(AuthRouter);
@@ -33,7 +33,7 @@ var AdminRouter = class {
33
33
  name: "AdminLayout",
34
34
  path: "/admin",
35
35
  label: "Admin",
36
- lazy: () => import("./AdminLayout-qNsIyl30.js"),
36
+ lazy: () => import("./AdminLayout-BNo3GoHR.js"),
37
37
  resolve: ({ user, url }) => {
38
38
  if (!user) throw new Redirection(this.router.path(this.authRouter.login.name, { query: { r: url.pathname } }));
39
39
  return {};
@@ -45,7 +45,7 @@ var AdminRouter = class {
45
45
  path: "/users",
46
46
  label: "Users",
47
47
  description: "Manage application users and their roles.",
48
- lazy: () => import("./AdminUsers-Dd9a5UqO.js"),
48
+ lazy: () => import("./AdminUsers-CMW9vN09.js"),
49
49
  can: () => this.userCtrl.findUsers.can()
50
50
  });
51
51
  adminUserCreate = $page({
@@ -54,7 +54,7 @@ var AdminRouter = class {
54
54
  path: "/users/create",
55
55
  label: "Create User",
56
56
  description: "Create a new user account.",
57
- lazy: () => import("./AdminUserCreate-DjiCcAk0.js"),
57
+ lazy: () => import("./AdminUserCreate-CYI_xW5T.js"),
58
58
  can: () => this.userCtrl.createUser.can()
59
59
  });
60
60
  adminUserLayout = $page({
@@ -62,26 +62,26 @@ var AdminRouter = class {
62
62
  parent: this.layout,
63
63
  path: "/users/:userId",
64
64
  label: "User",
65
- lazy: () => import("./AdminUserLayout-B8ga5QvP.js"),
65
+ lazy: () => import("./AdminUserLayout-DGSf612u.js"),
66
66
  can: () => this.userCtrl.getUser.can()
67
67
  });
68
68
  adminUserDetails = $page({
69
69
  parent: this.adminUserLayout,
70
70
  path: "/details",
71
71
  label: "Details",
72
- lazy: () => import("./AdminUserDetails-C5yeJNa3.js")
72
+ lazy: () => import("./AdminUserDetails-Cmzx9HxH.js")
73
73
  });
74
74
  adminUserSessions = $page({
75
75
  parent: this.adminUserLayout,
76
76
  path: "/sessions",
77
77
  label: "Sessions",
78
- lazy: () => import("./AdminUserSessions-A_5KkqTY.js")
78
+ lazy: () => import("./AdminUserSessions-D-aOcZgV.js")
79
79
  });
80
80
  adminUserSettings = $page({
81
81
  parent: this.adminUserLayout,
82
82
  path: "/settings",
83
83
  label: "Settings",
84
- lazy: () => import("./AdminUserSettings-DAsAhFjX.js")
84
+ lazy: () => import("./AdminUserSettings-CEMhIYrI.js")
85
85
  });
86
86
  adminSessions = $page({
87
87
  icon: IconDevices,
@@ -89,7 +89,7 @@ var AdminRouter = class {
89
89
  path: "/sessions",
90
90
  label: "Sessions",
91
91
  description: "View and manage all active sessions.",
92
- lazy: () => import("./AdminSessions-Df2VYzlE.js"),
92
+ lazy: () => import("./AdminSessions-PS2M8iXi.js"),
93
93
  can: () => this.sessionCtrl.findSessions.can()
94
94
  });
95
95
  adminNotifications = $page({
@@ -98,7 +98,7 @@ var AdminRouter = class {
98
98
  path: "/notifications",
99
99
  label: "Notifications",
100
100
  description: "View notification history and status.",
101
- lazy: () => import("./AdminNotifications-DV-35Fi3.js"),
101
+ lazy: () => import("./AdminNotifications-DJs2ZjNj.js"),
102
102
  can: () => this.notificationCtrl.findNotifications.can()
103
103
  });
104
104
  adminFiles = $page({
@@ -107,13 +107,13 @@ var AdminRouter = class {
107
107
  path: "/files",
108
108
  label: "Files",
109
109
  description: "Manage uploaded files and storage.",
110
- lazy: () => import("./AdminFiles-DldZB7oo.js"),
110
+ lazy: () => import("./AdminFiles-B-0UcHVV.js"),
111
111
  can: () => this.fileCtrl.findFiles.can()
112
112
  });
113
113
  };
114
114
 
115
115
  //#endregion
116
- //#region src/admin/MainRouter.ts
116
+ //#region ../../src/admin/MainRouter.ts
117
117
  /**
118
118
  * Main application router that combines Auth and Admin routers.
119
119
  *
@@ -132,7 +132,7 @@ var MainRouter = class {
132
132
  };
133
133
 
134
134
  //#endregion
135
- //#region src/admin/components/AdminJobs.tsx
135
+ //#region ../../src/admin/components/AdminJobs.tsx
136
136
  const AdminJobs = () => {
137
137
  const client = useClient();
138
138
  const { l } = useI18n();
@@ -246,7 +246,7 @@ const AdminJobs = () => {
246
246
  var AdminJobs_default = AdminJobs;
247
247
 
248
248
  //#endregion
249
- //#region src/admin/components/AdminParameters.tsx
249
+ //#region ../../src/admin/components/AdminParameters.tsx
250
250
  const AdminParameters = () => {
251
251
  return /* @__PURE__ */ jsx(Flex, {
252
252
  flex: 1,
@@ -279,7 +279,7 @@ const AdminParameters = () => {
279
279
  var AdminParameters_default = AdminParameters;
280
280
 
281
281
  //#endregion
282
- //#region src/admin/components/AdminVerifications.tsx
282
+ //#region ../../src/admin/components/AdminVerifications.tsx
283
283
  const AdminVerifications = () => {
284
284
  return /* @__PURE__ */ jsx(Flex, {
285
285
  flex: 1,
@@ -312,7 +312,7 @@ const AdminVerifications = () => {
312
312
  var AdminVerifications_default = AdminVerifications;
313
313
 
314
314
  //#endregion
315
- //#region src/admin/index.ts
315
+ //#region ../../src/admin/index.ts
316
316
  /**
317
317
  * Admin panel UI Module
318
318
  *
@@ -324,13 +324,15 @@ const AlephaUIAdmin = $module({
324
324
  AlephaUI,
325
325
  AlephaUIAuth,
326
326
  AdminRouter,
327
- MainRouter
327
+ MainRouter,
328
+ AdminSidebar
328
329
  ],
329
330
  register: (alepha) => {
330
331
  alepha.with(AdminRouter);
332
+ alepha.with(AdminSidebar);
331
333
  }
332
334
  });
333
335
 
334
336
  //#endregion
335
- export { AdminFiles_default as AdminFiles, AdminJobs_default as AdminJobs, AdminLayout_default as AdminLayout, AdminNotifications_default as AdminNotifications, AdminParameters_default as AdminParameters, AdminRouter, AdminSessions_default as AdminSessions, AdminUserCreate_default as AdminUserCreate, AdminUserDetails_default as AdminUserDetails, AdminUserLayout_default as AdminUserLayout, AdminUserSessions_default as AdminUserSessions, AdminUserSettings_default as AdminUserSettings, AdminUsers_default as AdminUsers, AdminVerifications_default as AdminVerifications, AlephaUIAdmin, MainRouter };
337
+ export { AdminFiles_default as AdminFiles, AdminJobs_default as AdminJobs, AdminLayout_default as AdminLayout, AdminNotifications_default as AdminNotifications, AdminParameters_default as AdminParameters, AdminRouter, AdminSessions_default as AdminSessions, AdminSidebar, AdminUserCreate_default as AdminUserCreate, AdminUserDetails_default as AdminUserDetails, AdminUserLayout_default as AdminUserLayout, AdminUserSessions_default as AdminUserSessions, AdminUserSettings_default as AdminUserSettings, AdminUsers_default as AdminUsers, AdminVerifications_default as AdminVerifications, AlephaUIAdmin, MainRouter };
336
338
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["filters"],"sources":["../../src/admin/AdminRouter.ts","../../src/admin/MainRouter.ts","../../src/admin/components/AdminJobs.tsx","../../src/admin/components/AdminParameters.tsx","../../src/admin/components/AdminVerifications.tsx","../../src/admin/index.ts"],"sourcesContent":["import { $page, ReactRouter, Redirection } from \"@alepha/react\";\nimport { ReactAuth } from \"@alepha/react/auth\";\nimport { AuthRouter } from \"@alepha/ui/auth\";\nimport {\n IconBell,\n IconDevices,\n IconFile,\n IconPlus,\n IconUser,\n IconUsers,\n} from \"@tabler/icons-react\";\nimport { $inject } from \"alepha\";\nimport type { FileController } from \"alepha/api/files\";\nimport type { NotificationController } from \"alepha/api/notifications\";\nimport type { SessionController, UserController } from \"alepha/api/users\";\nimport { $client } from \"alepha/server/links\";\n\nexport class AdminRouter {\n protected readonly router = $inject(ReactRouter);\n protected readonly authRouter = $inject(AuthRouter);\n protected readonly auth = $inject(ReactAuth);\n protected readonly userCtrl = $client<UserController>();\n protected readonly sessionCtrl = $client<SessionController>();\n protected readonly notificationCtrl = $client<NotificationController>();\n protected readonly fileCtrl = $client<FileController>();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Layout\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly layout = $page({\n name: \"AdminLayout\",\n path: \"/admin\",\n label: \"Admin\",\n lazy: () => import(\"./components/AdminLayout.tsx\"),\n resolve: ({ user, url }) => {\n if (!user) {\n throw new Redirection(\n this.router.path(this.authRouter.login.name, {\n query: {\n r: url.pathname,\n },\n }),\n );\n }\n return {};\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Users\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminUsers = $page({\n icon: IconUsers,\n parent: this.layout,\n path: \"/users\",\n label: \"Users\",\n description: \"Manage application users and their roles.\",\n lazy: () => import(\"./components/AdminUsers.tsx\"),\n can: () => this.userCtrl.findUsers.can(),\n });\n\n public readonly adminUserCreate = $page({\n icon: IconPlus,\n parent: this.layout,\n path: \"/users/create\",\n label: \"Create User\",\n description: \"Create a new user account.\",\n lazy: () => import(\"./components/AdminUserCreate.tsx\"),\n can: () => this.userCtrl.createUser.can(),\n });\n\n public readonly adminUserLayout = $page({\n icon: IconUser,\n parent: this.layout,\n path: \"/users/:userId\",\n label: \"User\",\n lazy: () => import(\"./components/AdminUserLayout.tsx\"),\n can: () => this.userCtrl.getUser.can(),\n });\n\n public readonly adminUserDetails = $page({\n parent: this.adminUserLayout,\n path: \"/details\",\n label: \"Details\",\n lazy: () => import(\"./components/AdminUserDetails.tsx\"),\n });\n\n public readonly adminUserSessions = $page({\n parent: this.adminUserLayout,\n path: \"/sessions\",\n label: \"Sessions\",\n lazy: () => import(\"./components/AdminUserSessions.tsx\"),\n });\n\n public readonly adminUserSettings = $page({\n parent: this.adminUserLayout,\n path: \"/settings\",\n label: \"Settings\",\n lazy: () => import(\"./components/AdminUserSettings.tsx\"),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Sessions\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminSessions = $page({\n icon: IconDevices,\n parent: this.layout,\n path: \"/sessions\",\n label: \"Sessions\",\n description: \"View and manage all active sessions.\",\n lazy: () => import(\"./components/AdminSessions.tsx\"),\n can: () => this.sessionCtrl.findSessions.can(),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Notifications\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminNotifications = $page({\n icon: IconBell,\n parent: this.layout,\n path: \"/notifications\",\n label: \"Notifications\",\n description: \"View notification history and status.\",\n lazy: () => import(\"./components/AdminNotifications.tsx\"),\n can: () => this.notificationCtrl.findNotifications.can(),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Files\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminFiles = $page({\n icon: IconFile,\n parent: this.layout,\n path: \"/files\",\n label: \"Files\",\n description: \"Manage uploaded files and storage.\",\n lazy: () => import(\"./components/AdminFiles.tsx\"),\n can: () => this.fileCtrl.findFiles.can(),\n });\n}\n","import { $page } from \"@alepha/react\";\nimport { AlephaMantineProvider } from \"@alepha/ui\";\nimport { AuthRouter } from \"@alepha/ui/auth\";\nimport { $inject } from \"alepha\";\nimport { AdminRouter } from \"./AdminRouter.ts\";\n\n/**\n * Main application router that combines Auth and Admin routers.\n *\n * We assume that the main application router will always have Admin and Auth routers.\n *\n * This is basically a convenience class to avoid having to inject these routers everywhere.\n * Code is lightweight enough that we can just copy it if needed.\n */\nexport class MainRouter {\n auth = $inject(AuthRouter);\n admin = $inject(AdminRouter);\n\n layout = $page({\n component: AlephaMantineProvider,\n children: () => [this.auth.layout, this.admin.layout],\n });\n}\n","import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconCheck,\n IconClock,\n IconPlayerPlay,\n IconX,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type JobController,\n type JobExecutionEntity,\n jobExecutions,\n} from \"alepha/api/jobs\";\n\nconst AdminJobs = () => {\n const client = useClient<JobController>();\n const { l } = useI18n();\n\n const filters = t.object({\n job: t.optional(\n t.string({\n $control: {\n query: t.pick(jobExecutions.schema, [\"job\"]),\n },\n }),\n ),\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n });\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return \"green\";\n case \"FAILED\":\n return \"red\";\n case \"STARTED\":\n return \"blue\";\n default:\n return \"gray\";\n }\n };\n\n const getStatusIcon = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return <IconCheck size={12} />;\n case \"FAILED\":\n return <IconX size={12} />;\n case \"STARTED\":\n return <IconPlayerPlay size={12} />;\n default:\n return <IconClock size={12} />;\n }\n };\n\n const formatDuration = (\n start: Date | string,\n end?: Date | string | null,\n ): string => {\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const duration = endTime - startTime;\n\n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<JobExecutionEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"job\" || key === \"status\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.getJobExecutions({\n query: filters,\n });\n\n return response as Page<JobExecutionEntity>;\n }}\n columns={{\n job: {\n label: \"Job\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.job}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={getStatusColor(item.status)}\n leftSection={getStatusIcon(item.status)}\n >\n {item.status}\n </Badge>\n ),\n },\n duration: {\n label: \"Duration\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {formatDuration(item.createdAt, item.finishedAt)}\n </Text>\n ),\n },\n error: {\n label: \"Error\",\n value: (item) =>\n item.error ? (\n <Text size=\"xs\" c=\"red\" lineClamp={1}>\n {item.error}\n </Text>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n createdAt: {\n label: \"Started\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminJobs;\n","import { Flex, Text } from \"@alepha/ui\";\nimport { Stack } from \"@mantine/core\";\nimport { IconSettings } from \"@tabler/icons-react\";\n\nconst AdminParameters = () => {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Stack align=\"center\" gap=\"xs\">\n <IconSettings\n size={48}\n stroke={1.5}\n color=\"var(--mantine-color-dimmed)\"\n />\n <Text c=\"dimmed\">Parameter Management</Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={400}>\n Application parameters and configuration settings. Define parameters\n using the $config primitive to manage dynamic application settings.\n </Text>\n </Stack>\n </Flex>\n );\n};\n\nexport default AdminParameters;\n","import { Flex, Text } from \"@alepha/ui\";\nimport { Stack } from \"@mantine/core\";\nimport { IconShieldCheck } from \"@tabler/icons-react\";\n\nconst AdminVerifications = () => {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Stack align=\"center\" gap=\"xs\">\n <IconShieldCheck\n size={48}\n stroke={1.5}\n color=\"var(--mantine-color-dimmed)\"\n />\n <Text c=\"dimmed\">Verification Management</Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={400}>\n Verifications are automatically managed by the system. Email and SMS\n verification codes are generated and validated through the\n verification API endpoints.\n </Text>\n </Stack>\n </Flex>\n );\n};\n\nexport default AdminVerifications;\n","import { AlephaUI } from \"@alepha/ui\";\nimport { AlephaUIAuth } from \"@alepha/ui/auth\";\nimport { $module } from \"alepha\";\nimport { AdminRouter } from \"./AdminRouter.ts\";\nimport { MainRouter } from \"./MainRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { AdminRouter } from \"./AdminRouter.ts\";\nexport { default as AdminFiles } from \"./components/AdminFiles.tsx\";\nexport { default as AdminJobs } from \"./components/AdminJobs.tsx\";\nexport { default as AdminLayout } from \"./components/AdminLayout.tsx\";\nexport { default as AdminNotifications } from \"./components/AdminNotifications.tsx\";\nexport { default as AdminParameters } from \"./components/AdminParameters.tsx\";\nexport { default as AdminSessions } from \"./components/AdminSessions.tsx\";\nexport { default as AdminUserCreate } from \"./components/AdminUserCreate.tsx\";\nexport { default as AdminUserDetails } from \"./components/AdminUserDetails.tsx\";\nexport { default as AdminUserLayout } from \"./components/AdminUserLayout.tsx\";\nexport { default as AdminUserSessions } from \"./components/AdminUserSessions.tsx\";\nexport { default as AdminUserSettings } from \"./components/AdminUserSettings.tsx\";\nexport { default as AdminUsers } from \"./components/AdminUsers.tsx\";\nexport { default as AdminVerifications } from \"./components/AdminVerifications.tsx\";\nexport { MainRouter } from \"./MainRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Admin panel UI Module\n *\n * @module alepha.ui.admin\n */\nexport const AlephaUIAdmin = $module({\n name: \"alepha.ui.admin\",\n services: [AlephaUI, AlephaUIAuth, AdminRouter, MainRouter],\n register: (alepha) => {\n alepha.with(AdminRouter);\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiBA,IAAa,cAAb,MAAyB;CACvB,AAAmB,SAAS,QAAQ,YAAY;CAChD,AAAmB,aAAa,QAAQ,WAAW;CACnD,AAAmB,OAAO,QAAQ,UAAU;CAC5C,AAAmB,WAAW,SAAyB;CACvD,AAAmB,cAAc,SAA4B;CAC7D,AAAmB,mBAAmB,SAAiC;CACvE,AAAmB,WAAW,SAAyB;CAMvD,AAAgB,SAAS,MAAM;EAC7B,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACnB,UAAU,EAAE,MAAM,UAAU;AAC1B,OAAI,CAAC,KACH,OAAM,IAAI,YACR,KAAK,OAAO,KAAK,KAAK,WAAW,MAAM,MAAM,EAC3C,OAAO,EACL,GAAG,IAAI,UACR,EACF,CAAC,CACH;AAEH,UAAO,EAAE;;EAEZ,CAAC;CAMF,AAAgB,aAAa,MAAM;EACjC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY,OAAO;EACnB,WAAW,KAAK,SAAS,UAAU,KAAK;EACzC,CAAC;CAEF,AAAgB,kBAAkB,MAAM;EACtC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY,OAAO;EACnB,WAAW,KAAK,SAAS,WAAW,KAAK;EAC1C,CAAC;CAEF,AAAgB,kBAAkB,MAAM;EACtC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACnB,WAAW,KAAK,SAAS,QAAQ,KAAK;EACvC,CAAC;CAEF,AAAgB,mBAAmB,MAAM;EACvC,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,AAAgB,oBAAoB,MAAM;EACxC,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,AAAgB,oBAAoB,MAAM;EACxC,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAMF,AAAgB,gBAAgB,MAAM;EACpC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY,OAAO;EACnB,WAAW,KAAK,YAAY,aAAa,KAAK;EAC/C,CAAC;CAMF,AAAgB,qBAAqB,MAAM;EACzC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY,OAAO;EACnB,WAAW,KAAK,iBAAiB,kBAAkB,KAAK;EACzD,CAAC;CAMF,AAAgB,aAAa,MAAM;EACjC,MAAM;EACN,QAAQ,KAAK;EACb,MAAM;EACN,OAAO;EACP,aAAa;EACb,YAAY,OAAO;EACnB,WAAW,KAAK,SAAS,UAAU,KAAK;EACzC,CAAC;;;;;;;;;;;;;ACjIJ,IAAa,aAAb,MAAwB;CACtB,OAAO,QAAQ,WAAW;CAC1B,QAAQ,QAAQ,YAAY;CAE5B,SAAS,MAAM;EACb,WAAW;EACX,gBAAgB,CAAC,KAAK,KAAK,QAAQ,KAAK,MAAM,OAAO;EACtD,CAAC;;;;;ACJJ,MAAM,kBAAkB;CACtB,MAAM,SAAS,WAA0B;CACzC,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO;EACvB,KAAK,EAAE,SACL,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,cAAc,QAAQ,CAAC,MAAM,CAAC,EAC7C,EACF,CAAC,CACH;EACD,QAAQ,EAAE,SAAS,EAAE,KAAK;GAAC;GAAW;GAAU;GAAY,CAAC,CAAC;EAC/D,CAAC;CAEF,MAAM,kBAAkB,WAAmB;AACzC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO;GACT,KAAK,SACH,QAAO;GACT,KAAK,UACH,QAAO;GACT,QACE,QAAO;;;CAIb,MAAM,iBAAiB,WAAmB;AACxC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO,oBAAC,aAAU,MAAM,KAAM;GAChC,KAAK,SACH,QAAO,oBAAC,SAAM,MAAM,KAAM;GAC5B,KAAK,UACH,QAAO,oBAAC,kBAAe,MAAM,KAAM;GACrC,QACE,QAAO,oBAAC,aAAU,MAAM,KAAM;;;CAIpC,MAAM,kBACJ,OACA,QACW;EACX,MAAM,YAAY,IAAI,KAAK,MAAM,CAAC,SAAS;EAE3C,MAAM,YADU,MAAM,IAAI,KAAK,IAAI,CAAC,SAAS,GAAG,KAAK,KAAK,IAC/B;AAE3B,MAAI,WAAW,IAAM,QAAO,GAAG,SAAS;AACxC,MAAI,WAAW,IAAO,QAAO,IAAI,WAAW,KAAM,QAAQ,EAAE,CAAC;AAC7D,SAAO,GAAG,KAAK,MAAM,WAAW,IAAM,CAAC,IAAI,KAAK,MAAO,WAAW,MAAS,IAAK,CAAC;;AAGnF,QACE,oBAAC;EAAK,MAAM;YACV,oBAAC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,SAAS,QAAQ,SAC3B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,iBAAiB,EAC7C,OAAOA,WACR,CAAC;;GAIJ,SAAS;IACP,KAAK;KACH,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAI;gBACjB,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,eAAe,KAAK,OAAO;MAClC,aAAa,cAAc,KAAK,OAAO;gBAEtC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;MAAS,IAAG;gBAC3B,eAAe,KAAK,WAAW,KAAK,WAAW;OAC3C;KAEV;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,KAAK,QACH,oBAAC;MAAK,MAAK;MAAK,GAAE;MAAM,WAAW;gBAChC,KAAK;OACD,GAEP,oBAAC;MAAK,MAAK;MAAK,GAAE;gBAAS;OAEpB;KAEZ;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,wBAAe;;;;ACzJf,MAAM,wBAAwB;AAC5B,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,qBAAC;GAAM,OAAM;GAAS,KAAI;;IACxB,oBAAC;KACC,MAAM;KACN,QAAQ;KACR,OAAM;MACN;IACF,oBAAC;KAAK,GAAE;eAAS;MAA2B;IAC5C,oBAAC;KAAK,MAAK;KAAK,GAAE;KAAS,IAAG;KAAS,KAAK;eAAK;MAG1C;;IACD;GACH;;AAIX,8BAAe;;;;ACnBf,MAAM,2BAA2B;AAC/B,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,qBAAC;GAAM,OAAM;GAAS,KAAI;;IACxB,oBAAC;KACC,MAAM;KACN,QAAQ;KACR,OAAM;MACN;IACF,oBAAC;KAAK,GAAE;eAAS;MAA8B;IAC/C,oBAAC;KAAK,MAAK;KAAK,GAAE;KAAS,IAAG;KAAS,KAAK;eAAK;MAI1C;;IACD;GACH;;AAIX,iCAAe;;;;;;;;;ACOf,MAAa,gBAAgB,QAAQ;CACnC,MAAM;CACN,UAAU;EAAC;EAAU;EAAc;EAAa;EAAW;CAC3D,WAAW,WAAW;AACpB,SAAO,KAAK,YAAY;;CAE3B,CAAC"}
1
+ {"version":3,"file":"index.js","names":["filters"],"sources":["../../src/admin/AdminRouter.ts","../../src/admin/MainRouter.ts","../../src/admin/components/AdminJobs.tsx","../../src/admin/components/AdminParameters.tsx","../../src/admin/components/AdminVerifications.tsx","../../src/admin/index.ts"],"sourcesContent":["import { $page, ReactRouter, Redirection } from \"@alepha/react\";\nimport { ReactAuth } from \"@alepha/react/auth\";\nimport { AuthRouter } from \"@alepha/ui/auth\";\nimport {\n IconBell,\n IconDevices,\n IconFile,\n IconPlus,\n IconUser,\n IconUsers,\n} from \"@tabler/icons-react\";\nimport { $inject } from \"alepha\";\nimport type { FileController } from \"alepha/api/files\";\nimport type { NotificationController } from \"alepha/api/notifications\";\nimport type { SessionController, UserController } from \"alepha/api/users\";\nimport { $client } from \"alepha/server/links\";\n\nexport class AdminRouter {\n protected readonly router = $inject(ReactRouter);\n protected readonly authRouter = $inject(AuthRouter);\n protected readonly auth = $inject(ReactAuth);\n protected readonly userCtrl = $client<UserController>();\n protected readonly sessionCtrl = $client<SessionController>();\n protected readonly notificationCtrl = $client<NotificationController>();\n protected readonly fileCtrl = $client<FileController>();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Layout\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly layout = $page({\n name: \"AdminLayout\",\n path: \"/admin\",\n label: \"Admin\",\n lazy: () => import(\"./components/AdminLayout.tsx\"),\n resolve: ({ user, url }) => {\n if (!user) {\n throw new Redirection(\n this.router.path(this.authRouter.login.name, {\n query: {\n r: url.pathname,\n },\n }),\n );\n }\n return {};\n },\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Users\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminUsers = $page({\n icon: IconUsers,\n parent: this.layout,\n path: \"/users\",\n label: \"Users\",\n description: \"Manage application users and their roles.\",\n lazy: () => import(\"./components/AdminUsers.tsx\"),\n can: () => this.userCtrl.findUsers.can(),\n });\n\n public readonly adminUserCreate = $page({\n icon: IconPlus,\n parent: this.layout,\n path: \"/users/create\",\n label: \"Create User\",\n description: \"Create a new user account.\",\n lazy: () => import(\"./components/AdminUserCreate.tsx\"),\n can: () => this.userCtrl.createUser.can(),\n });\n\n public readonly adminUserLayout = $page({\n icon: IconUser,\n parent: this.layout,\n path: \"/users/:userId\",\n label: \"User\",\n lazy: () => import(\"./components/AdminUserLayout.tsx\"),\n can: () => this.userCtrl.getUser.can(),\n });\n\n public readonly adminUserDetails = $page({\n parent: this.adminUserLayout,\n path: \"/details\",\n label: \"Details\",\n lazy: () => import(\"./components/AdminUserDetails.tsx\"),\n });\n\n public readonly adminUserSessions = $page({\n parent: this.adminUserLayout,\n path: \"/sessions\",\n label: \"Sessions\",\n lazy: () => import(\"./components/AdminUserSessions.tsx\"),\n });\n\n public readonly adminUserSettings = $page({\n parent: this.adminUserLayout,\n path: \"/settings\",\n label: \"Settings\",\n lazy: () => import(\"./components/AdminUserSettings.tsx\"),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Sessions\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminSessions = $page({\n icon: IconDevices,\n parent: this.layout,\n path: \"/sessions\",\n label: \"Sessions\",\n description: \"View and manage all active sessions.\",\n lazy: () => import(\"./components/AdminSessions.tsx\"),\n can: () => this.sessionCtrl.findSessions.can(),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Notifications\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminNotifications = $page({\n icon: IconBell,\n parent: this.layout,\n path: \"/notifications\",\n label: \"Notifications\",\n description: \"View notification history and status.\",\n lazy: () => import(\"./components/AdminNotifications.tsx\"),\n can: () => this.notificationCtrl.findNotifications.can(),\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Files\n // ─────────────────────────────────────────────────────────────────────────────\n\n public readonly adminFiles = $page({\n icon: IconFile,\n parent: this.layout,\n path: \"/files\",\n label: \"Files\",\n description: \"Manage uploaded files and storage.\",\n lazy: () => import(\"./components/AdminFiles.tsx\"),\n can: () => this.fileCtrl.findFiles.can(),\n });\n}\n","import { $page } from \"@alepha/react\";\nimport { AlephaMantineProvider } from \"@alepha/ui\";\nimport { AuthRouter } from \"@alepha/ui/auth\";\nimport { $inject } from \"alepha\";\nimport { AdminRouter } from \"./AdminRouter.ts\";\n\n/**\n * Main application router that combines Auth and Admin routers.\n *\n * We assume that the main application router will always have Admin and Auth routers.\n *\n * This is basically a convenience class to avoid having to inject these routers everywhere.\n * Code is lightweight enough that we can just copy it if needed.\n */\nexport class MainRouter {\n auth = $inject(AuthRouter);\n admin = $inject(AdminRouter);\n\n layout = $page({\n component: AlephaMantineProvider,\n children: () => [this.auth.layout, this.admin.layout],\n });\n}\n","import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconCheck,\n IconClock,\n IconPlayerPlay,\n IconX,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type JobController,\n type JobExecutionEntity,\n jobExecutions,\n} from \"alepha/api/jobs\";\n\nconst AdminJobs = () => {\n const client = useClient<JobController>();\n const { l } = useI18n();\n\n const filters = t.object({\n job: t.optional(\n t.string({\n $control: {\n query: t.pick(jobExecutions.schema, [\"job\"]),\n },\n }),\n ),\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n });\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return \"green\";\n case \"FAILED\":\n return \"red\";\n case \"STARTED\":\n return \"blue\";\n default:\n return \"gray\";\n }\n };\n\n const getStatusIcon = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return <IconCheck size={12} />;\n case \"FAILED\":\n return <IconX size={12} />;\n case \"STARTED\":\n return <IconPlayerPlay size={12} />;\n default:\n return <IconClock size={12} />;\n }\n };\n\n const formatDuration = (\n start: Date | string,\n end?: Date | string | null,\n ): string => {\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const duration = endTime - startTime;\n\n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<JobExecutionEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"job\" || key === \"status\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.getJobExecutions({\n query: filters,\n });\n\n return response as Page<JobExecutionEntity>;\n }}\n columns={{\n job: {\n label: \"Job\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.job}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={getStatusColor(item.status)}\n leftSection={getStatusIcon(item.status)}\n >\n {item.status}\n </Badge>\n ),\n },\n duration: {\n label: \"Duration\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {formatDuration(item.createdAt, item.finishedAt)}\n </Text>\n ),\n },\n error: {\n label: \"Error\",\n value: (item) =>\n item.error ? (\n <Text size=\"xs\" c=\"red\" lineClamp={1}>\n {item.error}\n </Text>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n createdAt: {\n label: \"Started\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminJobs;\n","import { Flex, Text } from \"@alepha/ui\";\nimport { Stack } from \"@mantine/core\";\nimport { IconSettings } from \"@tabler/icons-react\";\n\nconst AdminParameters = () => {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Stack align=\"center\" gap=\"xs\">\n <IconSettings\n size={48}\n stroke={1.5}\n color=\"var(--mantine-color-dimmed)\"\n />\n <Text c=\"dimmed\">Parameter Management</Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={400}>\n Application parameters and configuration settings. Define parameters\n using the $config primitive to manage dynamic application settings.\n </Text>\n </Stack>\n </Flex>\n );\n};\n\nexport default AdminParameters;\n","import { Flex, Text } from \"@alepha/ui\";\nimport { Stack } from \"@mantine/core\";\nimport { IconShieldCheck } from \"@tabler/icons-react\";\n\nconst AdminVerifications = () => {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Stack align=\"center\" gap=\"xs\">\n <IconShieldCheck\n size={48}\n stroke={1.5}\n color=\"var(--mantine-color-dimmed)\"\n />\n <Text c=\"dimmed\">Verification Management</Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={400}>\n Verifications are automatically managed by the system. Email and SMS\n verification codes are generated and validated through the\n verification API endpoints.\n </Text>\n </Stack>\n </Flex>\n );\n};\n\nexport default AdminVerifications;\n","import { AlephaUI } from \"@alepha/ui\";\nimport { AlephaUIAuth } from \"@alepha/ui/auth\";\nimport { $module } from \"alepha\";\nimport { AdminRouter } from \"./AdminRouter.ts\";\nimport { AdminSidebar } from \"./AdminSidebar.ts\";\nimport { MainRouter } from \"./MainRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { AdminRouter } from \"./AdminRouter.ts\";\nexport { AdminSidebar } from \"./AdminSidebar.ts\";\nexport { default as AdminFiles } from \"./components/AdminFiles.tsx\";\nexport { default as AdminJobs } from \"./components/AdminJobs.tsx\";\nexport { default as AdminLayout } from \"./components/AdminLayout.tsx\";\nexport { default as AdminNotifications } from \"./components/AdminNotifications.tsx\";\nexport { default as AdminParameters } from \"./components/AdminParameters.tsx\";\nexport { default as AdminSessions } from \"./components/AdminSessions.tsx\";\nexport { default as AdminUserCreate } from \"./components/AdminUserCreate.tsx\";\nexport { default as AdminUserDetails } from \"./components/AdminUserDetails.tsx\";\nexport { default as AdminUserLayout } from \"./components/AdminUserLayout.tsx\";\nexport { default as AdminUserSessions } from \"./components/AdminUserSessions.tsx\";\nexport { default as AdminUserSettings } from \"./components/AdminUserSettings.tsx\";\nexport { default as AdminUsers } from \"./components/AdminUsers.tsx\";\nexport { default as AdminVerifications } from \"./components/AdminVerifications.tsx\";\nexport { MainRouter } from \"./MainRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Admin panel UI Module\n *\n * @module alepha.ui.admin\n */\nexport const AlephaUIAdmin = $module({\n name: \"alepha.ui.admin\",\n services: [AlephaUI, AlephaUIAuth, AdminRouter, MainRouter, AdminSidebar],\n register: (alepha) => {\n alepha.with(AdminRouter);\n alepha.with(AdminSidebar);\n },\n});\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { NestedView } from "@alepha/react";
2
2
  import { Flex } from "@mantine/core";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
 
5
- //#region src/auth/components/AuthLayout.tsx
5
+ //#region ../../src/auth/components/AuthLayout.tsx
6
6
  const AuthLayout = () => {
7
7
  return /* @__PURE__ */ jsx(Flex, {
8
8
  flex: 1,
@@ -16,4 +16,4 @@ var AuthLayout_default = AuthLayout;
16
16
 
17
17
  //#endregion
18
18
  export { AuthLayout_default as default };
19
- //# sourceMappingURL=AuthLayout-BSL8ZHgr.js.map
19
+ //# sourceMappingURL=AuthLayout-CzwUKD9y.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout-BSL8ZHgr.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { NestedView } from \"@alepha/react\";\nimport { Flex } from \"@mantine/core\";\n\nconst AuthLayout = () => {\n return (\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;AAGA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAK,MAAM;EAAG,OAAO;EAAU,GAAG;EAAS,SAAS;YACnD,oBAAC,eAAa;GACT;;AAIX,yBAAe"}
1
+ {"version":3,"file":"AuthLayout-CzwUKD9y.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { NestedView } from \"@alepha/react\";\nimport { Flex } from \"@mantine/core\";\n\nconst AuthLayout = () => {\n return (\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;AAGA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAK,MAAM;EAAG,OAAO;EAAU,GAAG;EAAS,SAAS;YACnD,oBAAC,eAAa;GACT;;AAIX,yBAAe"}
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
 
3
- //#region src/auth/components/icons/IconGithub.tsx
3
+ //#region ../../src/auth/components/icons/IconGithub.tsx
4
4
  const IconGithub = () => {
5
5
  return /* @__PURE__ */ jsx("svg", {
6
6
  width: "24",
@@ -20,7 +20,7 @@ const IconGithub = () => {
20
20
  var IconGithub_default = IconGithub;
21
21
 
22
22
  //#endregion
23
- //#region src/auth/components/icons/IconGoogle.tsx
23
+ //#region ../../src/auth/components/icons/IconGoogle.tsx
24
24
  const IconGoogle = () => {
25
25
  return /* @__PURE__ */ jsxs("svg", {
26
26
  xmlns: "http://www.w3.org/2000/svg",
@@ -55,4 +55,4 @@ var IconGoogle_default = IconGoogle;
55
55
 
56
56
  //#endregion
57
57
  export { IconGithub_default as n, IconGoogle_default as t };
58
- //# sourceMappingURL=IconGoogle-v_58os2T.js.map
58
+ //# sourceMappingURL=IconGoogle-Cm5d8J3f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconGoogle-v_58os2T.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;AAIV,yBAAe;;;;ACpBf,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC;;AAIV,yBAAe"}
1
+ {"version":3,"file":"IconGoogle-Cm5d8J3f.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;AAIV,yBAAe;;;;ACpBf,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC;;AAIV,yBAAe"}
@@ -1,4 +1,4 @@
1
- import { n as IconGithub_default, t as IconGoogle_default } from "./IconGoogle-v_58os2T.js";
1
+ import { n as IconGithub_default, t as IconGoogle_default } from "./IconGoogle-Cm5d8J3f.js";
2
2
  import { useAuth } from "@alepha/react/auth";
3
3
  import { useI18n } from "@alepha/react/i18n";
4
4
  import { ActionButton, Control, capitalize } from "@alepha/ui";
@@ -11,7 +11,7 @@ import { FormValidationError, useForm } from "@alepha/react/form";
11
11
  import { HttpError } from "alepha/server";
12
12
  import { useMemo } from "react";
13
13
 
14
- //#region src/auth/components/Login.tsx
14
+ //#region ../../src/auth/components/Login.tsx
15
15
  const Login = (props) => {
16
16
  const auth = useAuth();
17
17
  const router = useRouter();
@@ -160,7 +160,7 @@ const Login = (props) => {
160
160
  })
161
161
  }), /* @__PURE__ */ jsx(ActionButton, {
162
162
  variant: "subtle",
163
- href: redirect,
163
+ href: "/",
164
164
  children: tr("loginCancel")
165
165
  })]
166
166
  })
@@ -174,4 +174,4 @@ const leftSection = (name) => {
174
174
 
175
175
  //#endregion
176
176
  export { Login_default as t };
177
- //# sourceMappingURL=Login-kBfaRgKG.js.map
177
+ //# sourceMappingURL=Login-7HlBjDeV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Login-kBfaRgKG.js","names":["IconGoogle","IconGithub"],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { useRouter } from \"@alepha/react\";\nimport { useAuth } from \"@alepha/react/auth\";\nimport { FormValidationError, useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Group, Stack, Text } from \"@mantine/core\";\nimport { IconLock, IconUser } from \"@tabler/icons-react\";\nimport { t } from \"alepha\";\nimport type { UserRealmConfig } from \"alepha/api/users\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } 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 LoginProps {\n realmConfig: UserRealmConfig;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter<AuthRouter>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const hasUsernamePassword = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.usernameEnabled !== false) methods.push(\"username\");\n if (settings.emailEnabled !== false) methods.push(\"email\");\n if (settings.phoneEnabled === true) methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n try {\n await auth.login(\"credentials\", {\n username: data.identifier,\n password: data.password,\n });\n await router.go(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack gap={\"md\"}>\n {hasUsernamePassword && (\n <>\n <form {...form.props}>\n <Stack flex={1} gap={\"md\"}>\n <Control\n title={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: loginMethods.includes(\"email\")\n ? \"email\"\n : \"username\",\n }}\n />\n <Control\n title={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton color={\"blue\"} variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Stack>\n </form>\n <Stack gap=\"xs\">\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={router.path(\"resetPassword\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n <Group align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n <Text size=\"xs\">{tr(\"loginOr\")}</Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n </Group>\n </Stack>\n </>\n )}\n <Stack gap={\"sm\"}>\n {props.realmConfig.authenticationMethods.map(\n (method) =>\n method.type !== \"CREDENTIALS\" && (\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 })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ),\n )}\n </Stack>\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={router.path(\"register\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Stack>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Stack>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Login-7HlBjDeV.js","names":["IconGoogle","IconGithub"],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { useRouter } from \"@alepha/react\";\nimport { useAuth } from \"@alepha/react/auth\";\nimport { FormValidationError, useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Group, Stack, Text } from \"@mantine/core\";\nimport { IconLock, IconUser } from \"@tabler/icons-react\";\nimport { t } from \"alepha\";\nimport type { UserRealmConfig } from \"alepha/api/users\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } 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 LoginProps {\n realmConfig: UserRealmConfig;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter<AuthRouter>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const hasUsernamePassword = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.usernameEnabled !== false) methods.push(\"username\");\n if (settings.emailEnabled !== false) methods.push(\"email\");\n if (settings.phoneEnabled === true) methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n try {\n await auth.login(\"credentials\", {\n username: data.identifier,\n password: data.password,\n });\n await router.go(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack gap={\"md\"}>\n {hasUsernamePassword && (\n <>\n <form {...form.props}>\n <Stack flex={1} gap={\"md\"}>\n <Control\n title={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: loginMethods.includes(\"email\")\n ? \"email\"\n : \"username\",\n }}\n />\n <Control\n title={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton color={\"blue\"} variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Stack>\n </form>\n <Stack gap=\"xs\">\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={router.path(\"resetPassword\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n <Group align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n <Text size=\"xs\">{tr(\"loginOr\")}</Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n </Group>\n </Stack>\n </>\n )}\n <Stack gap={\"sm\"}>\n {props.realmConfig.authenticationMethods.map(\n (method) =>\n method.type !== \"CREDENTIALS\" && (\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 })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ),\n )}\n </Stack>\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={router.path(\"register\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Stack>\n </Card>\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Stack>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import "./IconGoogle-Cm5d8J3f.js";
2
+ import { t as Login_default } from "./Login-7HlBjDeV.js";
3
+
4
+ export { Login_default as default };
@@ -1,4 +1,4 @@
1
- import { n as IconGithub_default, t as IconGoogle_default } from "./IconGoogle-v_58os2T.js";
1
+ import { n as IconGithub_default, t as IconGoogle_default } from "./IconGoogle-Cm5d8J3f.js";
2
2
  import { useAuth } from "@alepha/react/auth";
3
3
  import { useI18n } from "@alepha/react/i18n";
4
4
  import { ActionButton, Control, capitalize } from "@alepha/ui";
@@ -10,7 +10,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { useForm } from "@alepha/react/form";
11
11
  import { useMemo, useState } from "react";
12
12
 
13
- //#region src/auth/components/Register.tsx
13
+ //#region ../../src/auth/components/Register.tsx
14
14
  const Register = (props) => {
15
15
  const auth = useAuth();
16
16
  const userCtrl = useClient();
@@ -318,4 +318,4 @@ const leftSection = (name) => {
318
318
 
319
319
  //#endregion
320
320
  export { Register_default as t };
321
- //# sourceMappingURL=Register-BxJmOqpF.js.map
321
+ //# sourceMappingURL=Register-CuQr3kgi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Register-BxJmOqpF.js","names":["IconGoogle","IconGithub"],"sources":["../../src/auth/components/Register.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useAuth } from \"@alepha/react/auth\";\nimport { useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Group, PinInput, Stack, Text } 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 RegistrationIntentResponse,\n UserController,\n UserRealmConfig,\n} from \"alepha/api/users\";\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: UserRealmConfig;\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 hasUsernamePassword = 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(t.text()),\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 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) {\n await auth.login(\"credentials\", {\n username: identifier,\n password: data.password,\n });\n }\n\n await router.go(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) {\n await auth.login(\"credentials\", {\n username: registrationState.credentials.identifier,\n password: registrationState.credentials.password,\n });\n }\n\n await router.go(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 <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack 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 <Stack 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 </Stack>\n )}\n\n {registrationState.intent.expectPhoneVerification && (\n <Stack 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 </Stack>\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 </Stack>\n </Card>\n </Stack>\n </Flex>\n );\n }\n\n // Registration form phase UI\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack gap={\"md\"}>\n {!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 href={router.path(\"login\")}>\n {tr(\"registerBackToSignIn\")}\n </ActionButton>\n </>\n ) : hasUsernamePassword ? (\n <>\n <form {...form.props}>\n <Stack 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 form={form} color={\"blue\"} variant={\"filled\"}>\n {tr(\"registerCreateAccount\")}\n </ActionButton>\n </Stack>\n </form>\n <Group align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n <Text size=\"xs\">{tr(\"registerOr\")}</Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n </Group>\n </>\n ) : null}\n {isRegistrationAllowed && (\n <>\n <Stack gap={\"sm\"}>\n {props.realmConfig.authenticationMethods.map(\n (method) =>\n method.type !== \"CREDENTIALS\" && (\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 })\n }\n >\n {tr(\"registerContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ),\n )}\n </Stack>\n {props.realmConfig.authenticationMethods.length > 0 && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"registerHaveAccount\")}{\" \"}\n <ActionButton\n href={router.path(\"login\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"registerSignIn\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n </Stack>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Stack>\n </Flex>\n );\n};\n\nexport default Register;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Register-CuQr3kgi.js","names":["IconGoogle","IconGithub"],"sources":["../../src/auth/components/Register.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useAuth } from \"@alepha/react/auth\";\nimport { useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Group, PinInput, Stack, Text } 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 RegistrationIntentResponse,\n UserController,\n UserRealmConfig,\n} from \"alepha/api/users\";\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: UserRealmConfig;\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 hasUsernamePassword = 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(t.text()),\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 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) {\n await auth.login(\"credentials\", {\n username: identifier,\n password: data.password,\n });\n }\n\n await router.go(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) {\n await auth.login(\"credentials\", {\n username: registrationState.credentials.identifier,\n password: registrationState.credentials.password,\n });\n }\n\n await router.go(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 <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack 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 <Stack 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 </Stack>\n )}\n\n {registrationState.intent.expectPhoneVerification && (\n <Stack 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 </Stack>\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 </Stack>\n </Card>\n </Stack>\n </Flex>\n );\n }\n\n // Registration form phase UI\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Stack gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n <Stack gap={\"md\"}>\n {!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 href={router.path(\"login\")}>\n {tr(\"registerBackToSignIn\")}\n </ActionButton>\n </>\n ) : hasUsernamePassword ? (\n <>\n <form {...form.props}>\n <Stack 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 form={form} color={\"blue\"} variant={\"filled\"}>\n {tr(\"registerCreateAccount\")}\n </ActionButton>\n </Stack>\n </form>\n <Group align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n <Text size=\"xs\">{tr(\"registerOr\")}</Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-text-muted)\"} />\n </Group>\n </>\n ) : null}\n {isRegistrationAllowed && (\n <>\n <Stack gap={\"sm\"}>\n {props.realmConfig.authenticationMethods.map(\n (method) =>\n method.type !== \"CREDENTIALS\" && (\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 })\n }\n >\n {tr(\"registerContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ),\n )}\n </Stack>\n {props.realmConfig.authenticationMethods.length > 0 && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"registerHaveAccount\")}{\" \"}\n <ActionButton\n href={router.path(\"login\")}\n anchorProps={{ inherit: true }}\n >\n {tr(\"registerSignIn\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n </Stack>\n </Card>\n <ActionButton variant={\"subtle\"} href={redirect}>\n {tr(\"registerCancel\")}\n </ActionButton>\n </Stack>\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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"}
@@ -0,0 +1,4 @@
1
+ import "./IconGoogle-Cm5d8J3f.js";
2
+ import { t as Register_default } from "./Register-CuQr3kgi.js";
3
+
4
+ export { Register_default as default };
@@ -9,7 +9,7 @@ import { useForm } from "@alepha/react/form";
9
9
  import { useState } from "react";
10
10
  import { resetPasswordRequestSchema } from "alepha/api/users";
11
11
 
12
- //#region src/auth/components/ResetPassword.tsx
12
+ //#region ../../src/auth/components/ResetPassword.tsx
13
13
  const ResetPassword = (props) => {
14
14
  const router = useRouter();
15
15
  const userCtrl = useClient();
@@ -240,4 +240,4 @@ var ResetPassword_default = ResetPassword;
240
240
 
241
241
  //#endregion
242
242
  export { ResetPassword_default as t };
243
- //# sourceMappingURL=ResetPassword-BhyZ9ek4.js.map
243
+ //# sourceMappingURL=ResetPassword-BzU-cdd4.js.map