@alepha/ui 0.17.2 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/dist/admin/{AdminApiKeys-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
  2. package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
  4. package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
  5. package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
  6. package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
  7. package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
  8. package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
  10. package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
  11. package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
  12. package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
  13. package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
  14. package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
  15. package/dist/admin/{AdminParameters-DCGbpt2c.js → AdminParameters-DHw9ATgl.js} +53 -53
  16. package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
  17. package/dist/admin/{AdminSessions-DyhW6RZv.js → AdminSessions-BhGJPI3z.js} +11 -18
  18. package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
  19. package/dist/admin/{AdminUserLayout-CrBj4UuI.js → AdminUserLayout-BdC4Te8m.js} +112 -151
  20. package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
  21. package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
  22. package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
  23. package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
  24. package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
  25. package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
  26. package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
  27. package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
  28. package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
  29. package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
  30. package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
  31. package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
  32. package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
  33. package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
  34. package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
  35. package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
  36. package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
  37. package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
  38. package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
  39. package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
  40. package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
  41. package/dist/admin/auth-Dr0Cf8I7.js +319 -0
  42. package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
  43. package/dist/admin/core-2xoLiT0o.js +4031 -0
  44. package/dist/admin/core-2xoLiT0o.js.map +1 -0
  45. package/dist/admin/index.d.ts +739 -13
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +79 -111
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
  50. package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
  51. package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
  52. package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
  53. package/dist/auth/Login-Denw_UGy.js.map +1 -0
  54. package/dist/auth/Profile-BMX_Ar_s.js +155 -0
  55. package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
  56. package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
  57. package/dist/auth/Register-6hi_cpfF.js.map +1 -0
  58. package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
  59. package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
  60. package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
  61. package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
  62. package/dist/auth/core-niW0sFLv.js +2264 -0
  63. package/dist/auth/core-niW0sFLv.js.map +1 -0
  64. package/dist/auth/index.d.ts +336 -8
  65. package/dist/auth/index.d.ts.map +1 -1
  66. package/dist/auth/index.js +18 -22
  67. package/dist/auth/index.js.map +1 -1
  68. package/dist/core/index.d.ts +1033 -843
  69. package/dist/core/index.d.ts.map +1 -1
  70. package/dist/core/index.js +1626 -1354
  71. package/dist/core/index.js.map +1 -1
  72. package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
  73. package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
  74. package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
  75. package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
  76. package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
  77. package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
  78. package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
  79. package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
  80. package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
  81. package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
  82. package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
  83. package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
  84. package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
  85. package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
  86. package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
  87. package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
  88. package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
  89. package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
  90. package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
  91. package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
  92. package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
  93. package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
  94. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
  95. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
  96. package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
  97. package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
  98. package/dist/demo/DemoText-CzXuUn3g.js +124 -0
  99. package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
  100. package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
  101. package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
  102. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
  103. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
  104. package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
  105. package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
  106. package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
  107. package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
  108. package/dist/demo/Login-hSOU3jZc.js +219 -0
  109. package/dist/demo/Login-hSOU3jZc.js.map +1 -0
  110. package/dist/demo/Profile-CWqti7FB.js +155 -0
  111. package/dist/demo/Profile-CWqti7FB.js.map +1 -0
  112. package/dist/demo/Register-a70LPgs2.js +375 -0
  113. package/dist/demo/Register-a70LPgs2.js.map +1 -0
  114. package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
  115. package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
  116. package/dist/demo/Showcase-Dq3MISpd.js +232 -0
  117. package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
  118. package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
  119. package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
  120. package/dist/demo/auth-d6n3xbug.js +257 -0
  121. package/dist/demo/auth-d6n3xbug.js.map +1 -0
  122. package/dist/demo/core-RCUw1Q-a.js +4217 -0
  123. package/dist/demo/core-RCUw1Q-a.js.map +1 -0
  124. package/dist/demo/index.d.ts +17 -6
  125. package/dist/demo/index.d.ts.map +1 -1
  126. package/dist/demo/index.js +92 -24
  127. package/dist/demo/index.js.map +1 -1
  128. package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
  129. package/package.json +16 -20
  130. package/src/admin/AdminRouter.ts +10 -39
  131. package/src/admin/components/AdminLayout.tsx +42 -10
  132. package/src/admin/components/audits/AdminAudits.tsx +10 -64
  133. package/src/admin/components/files/AdminFiles.tsx +2 -3
  134. package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
  135. package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
  136. package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
  137. package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
  138. package/src/admin/components/parameters/AdminParameters.tsx +4 -4
  139. package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
  140. package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
  141. package/src/admin/components/parameters/ParameterTree.tsx +2 -8
  142. package/src/admin/components/parameters/types.ts +3 -3
  143. package/src/admin/components/sessions/AdminSessions.tsx +8 -16
  144. package/src/admin/components/users/AdminUserLayout.tsx +113 -150
  145. package/src/admin/components/users/AdminUserProfile.tsx +50 -0
  146. package/src/admin/components/users/AdminUserSessions.tsx +106 -126
  147. package/src/admin/components/users/AdminUsers.tsx +46 -62
  148. package/src/admin/index.ts +0 -4
  149. package/src/auth/components/buttons/UserButton.tsx +1 -1
  150. package/src/auth/index.ts +0 -4
  151. package/src/core/UiRouter.ts +1 -1
  152. package/src/core/atoms/alephaSidebarAtom.ts +7 -31
  153. package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
  154. package/src/core/components/Flex.tsx +63 -0
  155. package/src/core/components/Heading.tsx +19 -0
  156. package/src/core/components/Text.tsx +140 -0
  157. package/src/core/components/buttons/ActionButton.tsx +12 -1
  158. package/src/core/components/buttons/BurgerButton.tsx +3 -3
  159. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  160. package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
  161. package/src/core/components/data/DetailDrawer.tsx +144 -0
  162. package/src/core/components/data/DetailList.tsx +64 -0
  163. package/src/core/components/data/StatCards.tsx +50 -0
  164. package/src/core/components/layout/AppBar.tsx +11 -10
  165. package/src/core/components/layout/Breadcrumb.tsx +8 -8
  166. package/src/core/components/layout/Container.tsx +15 -0
  167. package/src/core/components/layout/DashboardShell.tsx +23 -238
  168. package/src/core/components/layout/Omnibar.tsx +1 -2
  169. package/src/core/components/layout/Sidebar.tsx +103 -71
  170. package/src/core/components/layout/index.ts +65 -0
  171. package/src/core/{components/form → form/components}/Control.tsx +32 -14
  172. package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
  173. package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
  174. package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
  175. package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
  176. package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
  177. package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
  178. package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
  179. package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
  180. package/src/core/form/factories/dialogForm.tsx +31 -0
  181. package/src/core/form/index.ts +23 -0
  182. package/src/core/{utils → form/utils}/parseInput.ts +2 -4
  183. package/src/core/index.ts +43 -51
  184. package/src/core/interfaces/AlephaIntent.ts +6 -0
  185. package/src/core/interfaces/AlephaTheme.ts +0 -1
  186. package/src/core/json/factories/dialogJson.tsx +24 -0
  187. package/src/core/json/index.ts +2 -0
  188. package/src/core/primitives/$ui.ts +17 -0
  189. package/src/core/services/DialogService.tsx +1 -48
  190. package/src/core/styles.css +1 -8
  191. package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
  192. package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
  193. package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
  194. package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
  195. package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
  196. package/src/core/table/index.ts +12 -0
  197. package/src/core/{components/table → table/interfaces}/types.ts +2 -2
  198. package/src/demo/DemoRouter.ts +87 -6
  199. package/src/demo/components/DemoHome.tsx +6 -10
  200. package/src/demo/components/DemoLayout.tsx +38 -8
  201. package/src/demo/components/auth/DemoLogin.tsx +1 -1
  202. package/src/demo/components/auth/DemoRegister.tsx +1 -1
  203. package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
  204. package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
  205. package/src/demo/components/core/DemoButton.tsx +160 -0
  206. package/src/demo/components/core/DemoFlex.tsx +101 -0
  207. package/src/demo/components/core/DemoHeading.tsx +13 -0
  208. package/src/demo/components/core/DemoText.tsx +110 -0
  209. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  210. package/src/demo/components/layout/DemoDialog.tsx +103 -0
  211. package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
  212. package/src/demo/components/layout/DemoToast.tsx +96 -0
  213. package/src/demo/components/shared/MacWindow.tsx +149 -74
  214. package/src/demo/components/shared/Showcase.tsx +4 -8
  215. package/src/demo/index.ts +1 -4
  216. package/src/demo/primitives/$uiDemo.ts +10 -0
  217. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
  218. package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
  219. package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
  220. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
  221. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
  222. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
  223. package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
  224. package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
  225. package/dist/admin/AdminParameters-DCGbpt2c.js.map +0 -1
  226. package/dist/admin/AdminSessions-DyhW6RZv.js.map +0 -1
  227. package/dist/admin/AdminUserAudits-D1GcREEE.js +0 -177
  228. package/dist/admin/AdminUserAudits-D1GcREEE.js.map +0 -1
  229. package/dist/admin/AdminUserCreate-DR8LA0tv.js +0 -104
  230. package/dist/admin/AdminUserCreate-DR8LA0tv.js.map +0 -1
  231. package/dist/admin/AdminUserDetails-CDkZNHQD.js +0 -477
  232. package/dist/admin/AdminUserDetails-CDkZNHQD.js.map +0 -1
  233. package/dist/admin/AdminUserLayout-CrBj4UuI.js.map +0 -1
  234. package/dist/admin/AdminUserSessions-srgFHrqy.js +0 -129
  235. package/dist/admin/AdminUserSessions-srgFHrqy.js.map +0 -1
  236. package/dist/admin/AdminUserSettings-BFuxl-xT.js +0 -167
  237. package/dist/admin/AdminUserSettings-BFuxl-xT.js.map +0 -1
  238. package/dist/admin/AdminUsers-D1pDpiwK.js +0 -118
  239. package/dist/admin/AdminUsers-D1pDpiwK.js.map +0 -1
  240. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
  241. package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
  242. package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
  243. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
  244. package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
  245. package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
  246. package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
  247. package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
  248. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
  249. package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
  250. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
  251. package/dist/demo/Showcase-BzoXNlCn.js +0 -185
  252. package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
  253. package/dist/json/index.d.ts +0 -57
  254. package/dist/json/index.d.ts.map +0 -1
  255. package/dist/json/index.js +0 -325
  256. package/dist/json/index.js.map +0 -1
  257. package/src/admin/components/users/AdminUserAudits.tsx +0 -184
  258. package/src/admin/components/users/AdminUserCreate.tsx +0 -85
  259. package/src/admin/components/users/AdminUserDetails.tsx +0 -431
  260. package/src/admin/components/users/AdminUserSettings.tsx +0 -171
  261. package/src/core/components/data/ErrorViewer.tsx +0 -171
  262. package/src/json/extensions/DialogService.tsx +0 -31
  263. package/src/json/index.ts +0 -18
  264. package/src/json/styles.css +0 -1
  265. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
  266. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
  267. /package/src/{json → core/json}/components/JsonViewer.css +0 -0
  268. /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
  269. /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
  270. /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
@@ -1,31 +1,51 @@
1
- import { DataTable, Text } from "@alepha/ui";
2
- import { Badge, Flex } from "@mantine/core";
3
- import { IconCheck, IconUsersPlus, IconX } from "@tabler/icons-react";
1
+ import { DataTable, Flex, Text, useDialog, useToast } from "@alepha/ui";
2
+ import { Badge } from "@mantine/core";
4
3
  import { type Page, t } from "alepha";
5
- import {
6
- type AdminUserController,
7
- type UserEntity,
8
- users,
9
- } from "alepha/api/users";
4
+ import type { AdminUserController, UserEntity } from "alepha/api/users";
10
5
  import { useClient } from "alepha/react";
11
6
  import { useI18n } from "alepha/react/i18n";
12
7
  import { useRouter } from "alepha/react/router";
8
+ import { useState } from "react";
13
9
  import type { AdminRouter } from "../../AdminRouter.ts";
14
10
 
15
11
  export interface AdminUsersProps {
16
12
  userRealmName?: string;
17
13
  }
18
14
 
15
+ const createUserSchema = t.object({
16
+ username: t.optional(
17
+ t.shortText({
18
+ minLength: 3,
19
+ maxLength: 50,
20
+ pattern: "^[a-zA-Z0-9._-]+$",
21
+ }),
22
+ ),
23
+ email: t.optional(t.email()),
24
+ phoneNumber: t.optional(t.e164()),
25
+ firstName: t.optional(t.string()),
26
+ lastName: t.optional(t.string()),
27
+ roles: t.optional(t.array(t.string())),
28
+ enabled: t.optional(t.boolean()),
29
+ password: t.optional(t.string({ minLength: 8 })),
30
+ });
31
+
19
32
  const AdminUsers = (props: AdminUsersProps) => {
20
33
  const client = useClient<AdminUserController>();
21
34
  const router = useRouter<AdminRouter>();
22
35
  const { l } = useI18n();
36
+ const dialog = useDialog();
37
+ const toast = useToast();
38
+ const [refreshKey, setRefreshKey] = useState(0);
23
39
 
24
40
  const filters = t.object({
25
41
  query: t.optional(
26
42
  t.string({
27
43
  $control: {
28
- query: t.omit(users.schema, ["id", "version"]),
44
+ query: t.object({
45
+ email: t.optional(t.email()),
46
+ enabled: t.optional(t.boolean()),
47
+ emailVerified: t.optional(t.boolean()),
48
+ }),
29
49
  },
30
50
  }),
31
51
  ),
@@ -34,14 +54,8 @@ const AdminUsers = (props: AdminUsersProps) => {
34
54
  return (
35
55
  <Flex flex={1} direction="column">
36
56
  <DataTable<UserEntity, typeof filters>
57
+ key={refreshKey}
37
58
  submitOnInit
38
- actions={[
39
- {
40
- icon: IconUsersPlus,
41
- href: router.path("adminUserCreate"),
42
- label: "Create User",
43
- },
44
- ]}
45
59
  defaultSize={10}
46
60
  typeFormProps={{
47
61
  skipSubmitButton: true,
@@ -53,27 +67,22 @@ const AdminUsers = (props: AdminUsersProps) => {
53
67
  striped: false,
54
68
  highlightOnHover: true,
55
69
  }}
56
- onFilterChange={(key, value, form) => {
70
+ onFilterChange={(key, _value, form) => {
57
71
  if (key === "query") {
58
72
  return form.submit();
59
73
  }
60
74
  }}
61
75
  filters={filters}
62
- tableTrProps={(item) => {
63
- const baseProps: Record<string, any> = {
64
- style: { cursor: "pointer" },
65
- onClick: () =>
66
- router.push("adminUserDetails", {
67
- params: { userId: item.id },
68
- }),
69
- };
70
-
71
- if (!item.enabled) {
72
- baseProps.opacity = 0.5;
73
- }
74
-
75
- return baseProps;
76
- }}
76
+ tableTrProps={(item) => ({
77
+ style: {
78
+ cursor: "pointer",
79
+ opacity: item.enabled ? 1 : 0.5,
80
+ },
81
+ onClick: () =>
82
+ router.push("adminUserProfile", {
83
+ params: { userId: item.id },
84
+ }),
85
+ })}
77
86
  items={async (filters) => {
78
87
  const response = await client.findUsers({
79
88
  query: {
@@ -81,7 +90,6 @@ const AdminUsers = (props: AdminUsersProps) => {
81
90
  userRealmName: props.userRealmName,
82
91
  },
83
92
  });
84
-
85
93
  return response as Page<UserEntity>;
86
94
  }}
87
95
  columns={{
@@ -89,40 +97,20 @@ const AdminUsers = (props: AdminUsersProps) => {
89
97
  label: "Username",
90
98
  value: (item) => (
91
99
  <Text size="sm" fw={500}>
92
- {item.username || "-"}
100
+ {item.username || "\u2014"}
93
101
  </Text>
94
102
  ),
95
103
  },
96
104
  email: {
97
105
  label: "Email",
98
- value: (item) => (
99
- <Flex gap="xs">
100
- <Text size="sm">{item.email || "-"}</Text>
101
- {item.email && (
102
- <Badge
103
- size="xs"
104
- variant="light"
105
- color={item.emailVerified ? "green" : "gray"}
106
- leftSection={
107
- item.emailVerified ? (
108
- <IconCheck size={10} />
109
- ) : (
110
- <IconX size={10} />
111
- )
112
- }
113
- >
114
- {item.emailVerified ? "Verified" : "Unverified"}
115
- </Badge>
116
- )}
117
- </Flex>
118
- ),
106
+ value: (item) => <Text size="sm">{item.email || "\u2014"}</Text>,
119
107
  },
120
108
  roles: {
121
109
  label: "Roles",
122
110
  value: (item) => (
123
111
  <Flex gap={4}>
124
112
  {item.roles.map((role: string) => (
125
- <Badge key={role} size="xs" variant="outline">
113
+ <Badge key={role} size="xs" variant="default">
126
114
  {role}
127
115
  </Badge>
128
116
  ))}
@@ -133,13 +121,9 @@ const AdminUsers = (props: AdminUsersProps) => {
133
121
  label: "Status",
134
122
  fit: true,
135
123
  value: (item) => (
136
- <Badge
137
- size="sm"
138
- variant="light"
139
- color={item.enabled ? "green" : "red"}
140
- >
124
+ <Text size="sm" c="dimmed">
141
125
  {item.enabled ? "Active" : "Disabled"}
142
- </Badge>
126
+ </Text>
143
127
  ),
144
128
  },
145
129
  createdAt: {
@@ -11,10 +11,6 @@ export * from "./primitives/$uiAdmin.ts";
11
11
  // ---------------------------------------------------------------------------------------------------------------------
12
12
 
13
13
  /**
14
- * | Stability | Since | Runtime |
15
- * |-----------|-------|---------|
16
- * | 2 - beta | 0.12.0 | node, bun, workerd, browser|
17
- *
18
14
  * Admin panel UI components.
19
15
  *
20
16
  * **Features:**
@@ -164,7 +164,7 @@ const UserButton = (props: UserButtonProps) => {
164
164
  items,
165
165
  }}
166
166
  >
167
- {children ?? userLabel}
167
+ {children}
168
168
  </ActionButton>
169
169
  );
170
170
  };
package/src/auth/index.ts CHANGED
@@ -19,10 +19,6 @@ export * from "./primitives/$uiAuth.ts";
19
19
  // ---------------------------------------------------------------------------------------------------------------------
20
20
 
21
21
  /**
22
- * | Stability | Since | Runtime |
23
- * |-----------|-------|---------|
24
- * | 2 - beta | 0.12.0 | node, bun, workerd, browser|
25
- *
26
22
  * Authentication UI components.
27
23
  *
28
24
  * **Features:**
@@ -1,5 +1,5 @@
1
+ import { AlephaMantineProvider } from "@alepha/ui";
1
2
  import { $page } from "alepha/react/router";
2
- import AlephaMantineProvider from "./components/layout/AlephaMantineProvider.tsx";
3
3
 
4
4
  /**
5
5
  * UI Router defining the root page with AlephaMantineProvider.
@@ -4,53 +4,29 @@ export const alephaSidebarAtom = $atom({
4
4
  name: "alepha.ui.sidebar",
5
5
  schema: t.object({
6
6
  /**
7
- * Whether the sidebar is opened or closed (mobile).
7
+ * Whether the sidebar drawer is closed (mobile).
8
8
  */
9
- opened: t.boolean(),
9
+ closed: t.boolean(),
10
10
  /**
11
- * Whether the sidebar is collapsed (narrow) or expanded (wide).
11
+ * Whether the sidebar is collapsed (desktop icon-only mode).
12
12
  */
13
13
  collapsed: t.boolean(),
14
14
  /**
15
- * Current width of the sidebar when expanded (can be changed by resizing).
15
+ * Width of the sidebar when expanded.
16
16
  * @default 300
17
17
  */
18
- width: t.number(),
19
- /**
20
- * Default width used when expanding from collapsed state or on hover.
21
- * @default 300
22
- */
23
- defaultWidth: t.number(),
18
+ expandedWidth: t.number(),
24
19
  /**
25
20
  * Width of the sidebar when collapsed.
26
21
  * @default 78
27
22
  */
28
23
  collapsedWidth: t.number(),
29
- /**
30
- * Maximum width when resizing.
31
- * @default 500
32
- */
33
- maxWidth: t.number(),
34
- /**
35
- * Minimum width before auto-collapse triggers.
36
- * @default 150
37
- */
38
- collapseThreshold: t.number(),
39
- /**
40
- * Delay in ms before sidebar expands on hover when collapsed.
41
- * @default 300
42
- */
43
- hoverDelay: t.number(),
44
24
  }),
45
25
  default: {
46
- opened: false,
26
+ closed: true,
47
27
  collapsed: false,
48
- width: 300,
49
- defaultWidth: 300,
28
+ expandedWidth: 300,
50
29
  collapsedWidth: 78,
51
- maxWidth: 500,
52
- collapseThreshold: 240,
53
- hoverDelay: 300,
54
30
  },
55
31
  });
56
32
 
@@ -13,9 +13,9 @@ import { useEvents } from "alepha/react";
13
13
  import { FormValidationError } from "alepha/react/form";
14
14
  import { NestedView } from "alepha/react/router";
15
15
  import type { ReactNode } from "react";
16
- import { useTheme } from "../../hooks/useTheme.ts";
17
- import { useToast } from "../../hooks/useToast.ts";
18
- import Omnibar, { type OmnibarProps } from "./Omnibar.tsx";
16
+ import { useTheme } from "../hooks/useTheme.ts";
17
+ import { useToast } from "../hooks/useToast.ts";
18
+ import Omnibar, { type OmnibarProps } from "./layout/Omnibar.tsx";
19
19
 
20
20
  export interface AlephaMantineProviderProps {
21
21
  children?: ReactNode;
@@ -72,7 +72,6 @@ const AlephaMantineProvider = (props: AlephaMantineProviderProps) => {
72
72
  {...props.mantine}
73
73
  defaultColorScheme={defaultColorScheme}
74
74
  theme={{
75
- cursorType: "pointer",
76
75
  // Spread all theme properties from the selected theme
77
76
  ...theme,
78
77
  // User overrides take precedence
@@ -0,0 +1,63 @@
1
+ import {
2
+ Flex as MantineFlex,
3
+ type FlexProps as MantineFlexProps,
4
+ } from "@mantine/core";
5
+ import { forwardRef } from "react";
6
+
7
+ export interface FlexProps extends MantineFlexProps {
8
+ /**
9
+ * flex: 1 — fill available space.
10
+ */
11
+ fill?: boolean;
12
+
13
+ /**
14
+ * Shorthand for align="center" + justify="center".
15
+ */
16
+ center?: boolean;
17
+
18
+ /**
19
+ * Shorthand for justify="center".
20
+ */
21
+ centerX?: boolean;
22
+
23
+ /**
24
+ * Shorthand for align="center".
25
+ */
26
+ centerY?: boolean;
27
+
28
+ /**
29
+ * Shorthand for direction="column".
30
+ */
31
+ col?: boolean;
32
+ }
33
+
34
+ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
35
+ const { fill, center, centerX, centerY, col, ...rest } = props;
36
+
37
+ if (fill) {
38
+ rest.flex ??= 1;
39
+ }
40
+
41
+ if (col) {
42
+ rest.direction ??= "column";
43
+ }
44
+
45
+ if (center) {
46
+ rest.align ??= "center";
47
+ rest.justify ??= "center";
48
+ }
49
+
50
+ if (centerX) {
51
+ rest.justify ??= "center";
52
+ }
53
+
54
+ if (centerY) {
55
+ rest.align ??= "center";
56
+ }
57
+
58
+ return <MantineFlex ref={ref} {...rest} />;
59
+ });
60
+
61
+ Flex.displayName = "Flex";
62
+
63
+ export default Flex;
@@ -0,0 +1,19 @@
1
+ import type { ReactNode } from "react";
2
+ import type { AlephaIntent } from "../interfaces/AlephaIntent.ts";
3
+
4
+ export type HeadingProps = {
5
+ title: string | ReactNode;
6
+ description?: string | ReactNode;
7
+ icon?: ReactNode;
8
+ intent?: AlephaIntent;
9
+ loading?: boolean;
10
+ ellipsis?: boolean;
11
+ fill?: boolean;
12
+ tag?: string | ReactNode;
13
+ };
14
+
15
+ const Heading = (props: HeadingProps) => {
16
+ return <h1>Heading</h1>;
17
+ };
18
+
19
+ export default Heading;
@@ -0,0 +1,140 @@
1
+ import {
2
+ Text as MantineText,
3
+ type TextProps as MantineTextProps,
4
+ } from "@mantine/core";
5
+ import { forwardRef, type ReactNode } from "react";
6
+ import type { AlephaIntent } from "../interfaces/AlephaIntent.ts";
7
+
8
+ export interface TextProps extends MantineTextProps {
9
+ children?: ReactNode;
10
+
11
+ /**
12
+ * Semantic color intent for the text.
13
+ */
14
+ intent?: AlephaIntent;
15
+
16
+ /**
17
+ * Shorthand for fw={700}.
18
+ */
19
+ bold?: boolean;
20
+
21
+ /**
22
+ * Shorthand for fs="italic".
23
+ */
24
+ italic?: boolean;
25
+
26
+ /**
27
+ * Shorthand for fw={300}.
28
+ */
29
+ light?: boolean;
30
+
31
+ /**
32
+ * Shorthand for c="dimmed".
33
+ */
34
+ muted?: boolean;
35
+
36
+ /**
37
+ * Shorthand for size="sm".
38
+ */
39
+ small?: boolean;
40
+
41
+ /**
42
+ * Shorthand for tt="uppercase".
43
+ */
44
+ uppercase?: boolean;
45
+
46
+ /**
47
+ * Shorthand for tt="capitalize".
48
+ */
49
+ capitalize?: boolean;
50
+
51
+ /**
52
+ * Shorthand for ta="center".
53
+ */
54
+ center?: boolean;
55
+
56
+ /**
57
+ * Shorthand for ff="monospace".
58
+ */
59
+ monospace?: boolean;
60
+
61
+ /**
62
+ * Text with title styles (larger font size, bolder weight).
63
+ */
64
+ title?: boolean;
65
+ }
66
+
67
+ const INTENT_COLORS: Record<AlephaIntent, string> = {
68
+ primary: "blue",
69
+ info: "cyan",
70
+ success: "green",
71
+ warning: "yellow",
72
+ danger: "red",
73
+ };
74
+
75
+ const Text = forwardRef<HTMLParagraphElement, TextProps>((props, ref) => {
76
+ const {
77
+ intent,
78
+ bold,
79
+ italic,
80
+ light,
81
+ muted,
82
+ small,
83
+ uppercase,
84
+ capitalize,
85
+ center,
86
+ monospace,
87
+ title,
88
+ ...rest
89
+ } = props;
90
+
91
+ if (intent) {
92
+ rest.c ??= INTENT_COLORS[intent];
93
+ }
94
+
95
+ if (bold) {
96
+ rest.fw ??= 700;
97
+ }
98
+
99
+ if (light) {
100
+ rest.fw ??= 300;
101
+ }
102
+
103
+ if (italic) {
104
+ rest.fs ??= "italic";
105
+ }
106
+
107
+ if (muted) {
108
+ rest.c ??= "dimmed";
109
+ }
110
+
111
+ if (small) {
112
+ rest.size ??= "sm";
113
+ }
114
+
115
+ if (uppercase) {
116
+ rest.tt ??= "uppercase";
117
+ }
118
+
119
+ if (capitalize) {
120
+ rest.tt ??= "capitalize";
121
+ }
122
+
123
+ if (center) {
124
+ rest.ta ??= "center";
125
+ }
126
+
127
+ if (monospace) {
128
+ rest.ff ??= "monospace";
129
+ }
130
+
131
+ if (title) {
132
+ rest.size ??= "xl";
133
+ }
134
+
135
+ return <MantineText ref={ref} {...rest} />;
136
+ });
137
+
138
+ Text.displayName = "Text";
139
+
140
+ export default Text;
@@ -328,6 +328,7 @@ const ActionButton = (_props: ActionProps) => {
328
328
 
329
329
  delete (restProps as any).classNameActive;
330
330
  delete (restProps as any).variantActive;
331
+ delete (restProps as any).propsActive;
331
332
 
332
333
  if ("action" in restProps && restProps.action) {
333
334
  return (
@@ -550,8 +551,10 @@ export interface ActionNavigationButtonProps extends ButtonProps {
550
551
  routerGoOptions?: RouterPushOptions;
551
552
  classNameActive?: string;
552
553
  variantActive?: ButtonProps["variant"];
554
+ propsActive?: ButtonProps;
553
555
  target?: string;
554
556
  anchorProps?: AnchorProps;
557
+ anchor?: boolean;
555
558
  }
556
559
 
557
560
  /**
@@ -562,8 +565,10 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
562
565
  active: options,
563
566
  classNameActive,
564
567
  variantActive,
568
+ propsActive,
565
569
  routerGoOptions,
566
570
  onClick: propsOnClick,
571
+ anchor,
567
572
  ...buttonProps
568
573
  } = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
569
574
  const router = useRouter();
@@ -572,6 +577,10 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
572
577
  );
573
578
  const anchorProps = router.anchor(props.href, routerGoOptions);
574
579
 
580
+ if (propsActive && isActive) {
581
+ Object.assign(buttonProps, propsActive);
582
+ }
583
+
575
584
  // Combine passed onClick with router's onClick
576
585
  const combinedOnClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
577
586
  propsOnClick?.(e as any);
@@ -583,11 +592,12 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
583
592
  buttonProps.className = `${className} ${classNameActive}`.trim();
584
593
  }
585
594
 
586
- if (props.anchorProps) {
595
+ if (props.anchorProps || anchor) {
587
596
  return (
588
597
  <Anchor
589
598
  component={"a"}
590
599
  {...anchorProps}
600
+ {...(buttonProps as AnchorProps)}
591
601
  {...props.anchorProps}
592
602
  onClick={combinedOnClick}
593
603
  >
@@ -619,6 +629,7 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
619
629
  active: options,
620
630
  classNameActive,
621
631
  variantActive,
632
+ propsActive,
622
633
  routerGoOptions,
623
634
  target,
624
635
  ...buttonProps
@@ -9,9 +9,9 @@ const BurgerButton = (props: BurgerButtonProps) => {
9
9
 
10
10
  return (
11
11
  <Burger
12
- opened={sidebar.opened}
13
- onClick={() => setSidebar({ ...sidebar, opened: !sidebar.opened })}
14
- hiddenFrom="sm"
12
+ opened={!sidebar.closed}
13
+ onClick={() => setSidebar({ ...sidebar, closed: !sidebar.closed })}
14
+ hiddenFrom="md"
15
15
  size="sm"
16
16
  {...props}
17
17
  />
@@ -6,7 +6,7 @@ const LanguageButton = (props: Partial<ActionProps>) => {
6
6
  const i18n = useI18n();
7
7
  return (
8
8
  <ActionButton
9
- variant={"default"}
9
+ variant={"subtle"}
10
10
  icon={IconLanguage}
11
11
  menu={{
12
12
  items: i18n.languages.map((lang) => ({
@@ -18,16 +18,13 @@ const ToggleSidebarButton = (props: Props) => {
18
18
  ? IconLayoutSidebarRightCollapse
19
19
  : IconLayoutSidebarLeftCollapse
20
20
  }
21
- visibleFrom={"sm"}
21
+ visibleFrom={"md"}
22
22
  variant={"subtle"}
23
23
  size={"md"}
24
24
  onClick={() => {
25
- const expanding = sidebar.collapsed;
26
25
  setSidebar({
27
26
  ...sidebar,
28
27
  collapsed: !sidebar.collapsed,
29
- // Reset width to defaultWidth when expanding
30
- width: expanding ? sidebar.defaultWidth : sidebar.width,
31
28
  });
32
29
  }}
33
30
  tooltip={{