@alepha/ui 0.18.1 → 0.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/admin/{AdminApiKeys-C-6_Q-lH.js → AdminApiKeys-Dy_k-4Vd.js} +17 -38
  2. package/dist/admin/AdminApiKeys-Dy_k-4Vd.js.map +1 -0
  3. package/dist/admin/{AdminAudits-Bgbf04hO.js → AdminAudits-CKiFMSSU.js} +23 -19
  4. package/dist/admin/AdminAudits-CKiFMSSU.js.map +1 -0
  5. package/dist/admin/AdminDashboard-PhC_dZqo.js +67 -0
  6. package/dist/admin/AdminDashboard-PhC_dZqo.js.map +1 -0
  7. package/dist/admin/{AdminFiles-B9a7G3cY.js → AdminFiles-DFTjijGp.js} +3 -7
  8. package/dist/admin/AdminFiles-DFTjijGp.js.map +1 -0
  9. package/dist/admin/{AdminJobDashboard-DaTwf5OY.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
  10. package/dist/admin/{AdminJobDashboard-DaTwf5OY.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
  11. package/dist/admin/{AdminJobExecutions-B9cek5dl.js → AdminJobExecutions-D9E-CS-U.js} +24 -36
  12. package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +1 -0
  13. package/dist/admin/{AdminJobRegistry-DFgV3oqx.js → AdminJobRegistry-Ci9ue1zC.js} +10 -18
  14. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +1 -0
  15. package/dist/admin/AdminLayout-I6TlUMPc.js +61 -0
  16. package/dist/admin/AdminLayout-I6TlUMPc.js.map +1 -0
  17. package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
  18. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
  19. package/dist/admin/{AdminParameters-DHw9ATgl.js → AdminParameters-CqgvhRsb.js} +120 -105
  20. package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
  21. package/dist/admin/{AdminSessions-BhGJPI3z.js → AdminSessions-Bz5NRuoW.js} +48 -53
  22. package/dist/admin/AdminSessions-Bz5NRuoW.js.map +1 -0
  23. package/dist/admin/{AdminUserLayout-BdC4Te8m.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
  24. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
  25. package/dist/admin/{AdminUserProfile-DAt23fqY.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
  26. package/dist/admin/{AdminUserProfile-DAt23fqY.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
  27. package/dist/admin/{AdminUserSessions-1uzcx02z.js → AdminUserSessions-CT_YDim0.js} +33 -35
  28. package/dist/admin/AdminUserSessions-CT_YDim0.js.map +1 -0
  29. package/dist/admin/AdminUsers-D1UfGya9.js +206 -0
  30. package/dist/admin/AdminUsers-D1UfGya9.js.map +1 -0
  31. package/dist/admin/{AuthLayout-DFJvCvzw.js → AuthLayout-_frhdgOO.js} +2 -2
  32. package/dist/admin/{AuthLayout-DFJvCvzw.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
  33. package/dist/admin/{IconGoogle-CSQLPYwX.js → IconGoogle-Ch1m3Uzl.js} +1 -1
  34. package/dist/admin/{IconGoogle-CSQLPYwX.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
  35. package/dist/admin/Login-xtNmQtGh.js +275 -0
  36. package/dist/admin/Login-xtNmQtGh.js.map +1 -0
  37. package/dist/{auth/Profile-BMX_Ar_s.js → admin/Profile-_AtPUwAP.js} +31 -27
  38. package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
  39. package/dist/admin/{Register-Cs10l8vX.js → Register-JcCjHUUn.js} +199 -143
  40. package/dist/admin/Register-JcCjHUUn.js.map +1 -0
  41. package/dist/admin/{ResetPassword-BwDdfkGH.js → ResetPassword-CwGBPLJO.js} +7 -7
  42. package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
  43. package/dist/admin/{VerifyEmail-DfXHAiQl.js → VerifyEmail-hNxWejWf.js} +23 -8
  44. package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
  45. package/dist/admin/{core-2xoLiT0o.js → core-CYaRQ8O-.js} +2082 -688
  46. package/dist/admin/core-CYaRQ8O-.js.map +1 -0
  47. package/dist/admin/index.d.ts +112 -48
  48. package/dist/admin/index.d.ts.map +1 -1
  49. package/dist/admin/index.js +467 -69
  50. package/dist/admin/index.js.map +1 -1
  51. package/dist/auth/{AuthLayout-CAE1pX9s.js → AuthLayout-AvLlcLjS.js} +2 -2
  52. package/dist/auth/{AuthLayout-CAE1pX9s.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
  53. package/dist/auth/Login-BA1E8IZl.js +275 -0
  54. package/dist/auth/Login-BA1E8IZl.js.map +1 -0
  55. package/dist/{admin/Profile-B-c9pCPf.js → auth/Profile-YcWdeuFz.js} +31 -27
  56. package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
  57. package/dist/auth/{Register-6hi_cpfF.js → Register-CPhEO5MG.js} +198 -142
  58. package/dist/auth/Register-CPhEO5MG.js.map +1 -0
  59. package/dist/{demo/ResetPassword-DWN0lzr5.js → auth/ResetPassword-DCtGcneA.js} +7 -7
  60. package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
  61. package/dist/{demo/VerifyEmail-DZWL72K4.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
  62. package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
  63. package/dist/auth/{core-niW0sFLv.js → core-D5jIAVF2.js} +1385 -329
  64. package/dist/auth/core-D5jIAVF2.js.map +1 -0
  65. package/dist/auth/index.d.ts +105 -49
  66. package/dist/auth/index.d.ts.map +1 -1
  67. package/dist/auth/index.js +29 -26
  68. package/dist/auth/index.js.map +1 -1
  69. package/dist/core/index.d.ts +210 -74
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +2247 -834
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/demo/{AuthLayout-jLa0aKsI.js → AuthLayout-Brri4A-L.js} +2 -2
  74. package/dist/demo/{AuthLayout-jLa0aKsI.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
  75. package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
  76. package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
  77. package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
  78. package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
  79. package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
  80. package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
  81. package/dist/demo/{DemoDialog-4ItHLf9t.js → DemoDialog-CUWdLHim.js} +2 -2
  82. package/dist/demo/{DemoDialog-4ItHLf9t.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
  83. package/dist/demo/{DemoFlex-EtVq8QfX.js → DemoFlex-a8OhMMvq.js} +3 -3
  84. package/dist/demo/{DemoFlex-EtVq8QfX.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
  85. package/dist/demo/{DemoHeading-BS-vGfkI.js → DemoHeading-C13OVDfS.js} +3 -3
  86. package/dist/demo/{DemoHeading-BS-vGfkI.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
  87. package/dist/demo/{DemoHome-Clbn8AmS.js → DemoHome-D_De3UiT.js} +2 -2
  88. package/dist/demo/{DemoHome-Clbn8AmS.js.map → DemoHome-D_De3UiT.js.map} +1 -1
  89. package/dist/demo/{DemoJsonViewer-DkIX_ky2.js → DemoJsonViewer-B50s9aGM.js} +3 -3
  90. package/dist/demo/{DemoJsonViewer-DkIX_ky2.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
  91. package/dist/demo/{DemoLayout-C56xb5EE.js → DemoLayout-CHU8WTwO.js} +14 -5
  92. package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
  93. package/dist/demo/{DemoLogin-BZwpicOS.js → DemoLogin-BBlrWpml.js} +49 -32
  94. package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
  95. package/dist/demo/{DemoRegister-C7_qc4MJ.js → DemoRegister-BuNE3_-f.js} +49 -50
  96. package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
  97. package/dist/demo/{DemoResetPassword-BI1Ct4Dw.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
  98. package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
  99. package/dist/demo/{DemoSidebar-CcBo4ltC.js → DemoSidebar-Giy2HRBD.js} +3 -3
  100. package/dist/demo/{DemoSidebar-CcBo4ltC.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
  101. package/dist/demo/{DemoText-CzXuUn3g.js → DemoText-ubcw-vog.js} +3 -3
  102. package/dist/demo/{DemoText-CzXuUn3g.js.map → DemoText-ubcw-vog.js.map} +1 -1
  103. package/dist/demo/{DemoToast-BgHDhWrX.js → DemoToast-9die_dYT.js} +2 -2
  104. package/dist/demo/{DemoToast-BgHDhWrX.js.map → DemoToast-9die_dYT.js.map} +1 -1
  105. package/dist/demo/{DemoTypeForm-DDzWoMSV.js → DemoTypeForm-D_d6OVKL.js} +8 -4
  106. package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
  107. package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
  108. package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
  109. package/dist/demo/Login-C12N4oGs.js +275 -0
  110. package/dist/demo/Login-C12N4oGs.js.map +1 -0
  111. package/dist/demo/{Profile-CWqti7FB.js → Profile-DS5q4vOh.js} +31 -27
  112. package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
  113. package/dist/demo/{Register-a70LPgs2.js → Register-B4hLBeEv.js} +198 -142
  114. package/dist/demo/Register-B4hLBeEv.js.map +1 -0
  115. package/dist/{auth/ResetPassword-CqfTk1FI.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
  116. package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
  117. package/dist/demo/{Showcase-Dq3MISpd.js → Showcase-D6Fxt4X4.js} +64 -65
  118. package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
  119. package/dist/{auth/VerifyEmail-nWiSTMjF.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
  120. package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
  121. package/dist/demo/{auth-d6n3xbug.js → auth-ByVTreDl.js} +8 -8
  122. package/dist/demo/{auth-d6n3xbug.js.map → auth-ByVTreDl.js.map} +1 -1
  123. package/dist/demo/{core-RCUw1Q-a.js → core-DFgB3yU4.js} +2182 -756
  124. package/dist/demo/core-DFgB3yU4.js.map +1 -0
  125. package/dist/demo/index.d.ts +1 -0
  126. package/dist/demo/index.d.ts.map +1 -1
  127. package/dist/demo/index.js +24 -18
  128. package/dist/demo/index.js.map +1 -1
  129. package/package.json +7 -7
  130. package/src/admin/{AdminRouter.ts → AdminRouter.tsx} +150 -18
  131. package/src/admin/components/AdminDashboard.tsx +52 -0
  132. package/src/admin/components/AdminLayout.tsx +32 -40
  133. package/src/admin/components/audits/AdminAudits.tsx +22 -16
  134. package/src/admin/components/files/AdminFiles.tsx +1 -6
  135. package/src/admin/components/jobs/AdminJobExecutions.tsx +33 -39
  136. package/src/admin/components/jobs/AdminJobRegistry.tsx +9 -18
  137. package/src/admin/components/keys/AdminApiKeys.tsx +23 -41
  138. package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
  139. package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
  140. package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
  141. package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
  142. package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
  143. package/src/admin/components/parameters/ParameterTree.tsx +28 -184
  144. package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
  145. package/src/admin/components/sessions/AdminSessions.tsx +71 -71
  146. package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
  147. package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
  148. package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
  149. package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
  150. package/src/admin/components/users/AdminUserSessions.tsx +33 -31
  151. package/src/admin/components/users/AdminUsers.tsx +184 -72
  152. package/src/admin/index.ts +2 -2
  153. package/src/admin/primitives/$uiAdmin.ts +1 -1
  154. package/src/auth/components/Login.tsx +188 -121
  155. package/src/auth/components/Profile.tsx +1 -22
  156. package/src/auth/components/ProfileField.tsx +39 -0
  157. package/src/auth/components/Register.tsx +215 -158
  158. package/src/auth/components/ResetPassword.tsx +7 -11
  159. package/src/auth/components/VerifyEmail.tsx +35 -10
  160. package/src/auth/components/buttons/UserButton.tsx +20 -24
  161. package/src/auth/index.ts +1 -0
  162. package/src/core/atoms/alephaSidebarAtom.ts +1 -1
  163. package/src/core/atoms/alephaThemeListAtom.ts +14 -1
  164. package/src/core/atoms/alephaThemeOverridesAtom.ts +17 -0
  165. package/src/core/atoms/themes/editorial.ts +184 -0
  166. package/src/core/atoms/themes/monochrome.ts +197 -0
  167. package/src/core/atoms/themes/rosePine.ts +208 -0
  168. package/src/core/atoms/themes/softBrutalism.ts +221 -0
  169. package/src/core/atoms/themes/terminal.ts +186 -0
  170. package/src/core/components/Flex.tsx +101 -1
  171. package/src/core/components/Text.tsx +1 -1
  172. package/src/core/components/buttons/ActionButton.tsx +109 -87
  173. package/src/core/components/buttons/DarkModeButton.tsx +3 -3
  174. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  175. package/src/core/components/buttons/OmnibarButton.tsx +1 -2
  176. package/src/core/components/buttons/ThemeButton.tsx +40 -11
  177. package/src/core/components/buttons/ThemeExpertModal.tsx +184 -0
  178. package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -2
  179. package/src/core/components/data/DetailDrawer.tsx +102 -96
  180. package/src/core/components/data/DetailList.tsx +2 -1
  181. package/src/core/components/layout/AppBar.tsx +10 -0
  182. package/src/core/components/layout/Breadcrumb.tsx +3 -6
  183. package/src/core/components/layout/DashboardShell.tsx +28 -11
  184. package/src/core/components/layout/Sidebar.tsx +18 -235
  185. package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
  186. package/src/core/components/layout/SidebarItem.tsx +146 -0
  187. package/src/core/components/layout/index.ts +3 -1
  188. package/src/core/constants/ui.ts +5 -5
  189. package/src/core/form/components/Control.tsx +31 -29
  190. package/src/core/form/components/ControlArray.tsx +13 -39
  191. package/src/core/form/components/ControlDate.tsx +10 -21
  192. package/src/core/form/components/ControlNumber.tsx +4 -33
  193. package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
  194. package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
  195. package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
  196. package/src/core/form/components/ControlSelect.tsx +294 -92
  197. package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
  198. package/src/core/form/components/TypeForm.tsx +5 -2
  199. package/src/core/form/index.ts +8 -1
  200. package/src/core/form/utils/parseInput.ts +7 -3
  201. package/src/core/hooks/useTheme.ts +26 -3
  202. package/src/core/index.ts +9 -2
  203. package/src/core/interfaces/AlephaTheme.ts +2 -0
  204. package/src/core/json/components/JsonViewer.tsx +103 -319
  205. package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
  206. package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
  207. package/src/core/json/components/JsonViewerShared.ts +76 -0
  208. package/src/core/providers/ThemeProvider.ts +108 -8
  209. package/src/core/services/DialogService.tsx +24 -3
  210. package/src/core/styles.css +33 -20
  211. package/src/core/table/components/ColumnPicker.tsx +3 -3
  212. package/src/core/table/components/DataTable.tsx +233 -143
  213. package/src/core/table/components/DataTableFilters.tsx +6 -16
  214. package/src/core/table/components/DataTablePagination.tsx +58 -29
  215. package/src/core/table/components/DataTableToolbar.tsx +16 -7
  216. package/src/core/table/components/FilterPicker.tsx +3 -3
  217. package/src/core/table/index.ts +1 -0
  218. package/src/core/table/interfaces/types.ts +42 -9
  219. package/src/core/utils/icons.tsx +2 -2
  220. package/src/demo/DemoRouter.ts +8 -1
  221. package/src/demo/components/DemoLayout.tsx +12 -2
  222. package/src/demo/components/auth/DemoLogin.tsx +35 -28
  223. package/src/demo/components/auth/DemoRegister.tsx +35 -49
  224. package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
  225. package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
  226. package/src/demo/components/core/DemoButton.tsx +123 -103
  227. package/src/demo/components/core/DemoControlSelect.tsx +325 -0
  228. package/src/demo/components/core/DemoDataTable.tsx +255 -241
  229. package/src/demo/components/core/DemoTypeForm.tsx +7 -2
  230. package/src/demo/components/shared/MacWindow.tsx +5 -11
  231. package/src/demo/components/shared/Showcase.tsx +28 -42
  232. package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +0 -1
  233. package/dist/admin/AdminAudits-Bgbf04hO.js.map +0 -1
  234. package/dist/admin/AdminFiles-B9a7G3cY.js.map +0 -1
  235. package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +0 -1
  236. package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +0 -1
  237. package/dist/admin/AdminLayout-DHsvWxVB.js +0 -70
  238. package/dist/admin/AdminLayout-DHsvWxVB.js.map +0 -1
  239. package/dist/admin/AdminParameters-DHw9ATgl.js.map +0 -1
  240. package/dist/admin/AdminSessions-BhGJPI3z.js.map +0 -1
  241. package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +0 -1
  242. package/dist/admin/AdminUserSessions-1uzcx02z.js.map +0 -1
  243. package/dist/admin/AdminUsers-C85c3eiQ.js +0 -121
  244. package/dist/admin/AdminUsers-C85c3eiQ.js.map +0 -1
  245. package/dist/admin/Login-BGheURrg.js +0 -219
  246. package/dist/admin/Login-BGheURrg.js.map +0 -1
  247. package/dist/admin/Profile-B-c9pCPf.js.map +0 -1
  248. package/dist/admin/Register-Cs10l8vX.js.map +0 -1
  249. package/dist/admin/ResetPassword-BwDdfkGH.js.map +0 -1
  250. package/dist/admin/VerifyEmail-DfXHAiQl.js.map +0 -1
  251. package/dist/admin/auth-Dr0Cf8I7.js +0 -319
  252. package/dist/admin/auth-Dr0Cf8I7.js.map +0 -1
  253. package/dist/admin/core-2xoLiT0o.js.map +0 -1
  254. package/dist/auth/Login-Denw_UGy.js +0 -219
  255. package/dist/auth/Login-Denw_UGy.js.map +0 -1
  256. package/dist/auth/Profile-BMX_Ar_s.js.map +0 -1
  257. package/dist/auth/Register-6hi_cpfF.js.map +0 -1
  258. package/dist/auth/ResetPassword-CqfTk1FI.js.map +0 -1
  259. package/dist/auth/VerifyEmail-nWiSTMjF.js.map +0 -1
  260. package/dist/auth/core-niW0sFLv.js.map +0 -1
  261. package/dist/demo/DemoButton-BmaWZVwf.js +0 -178
  262. package/dist/demo/DemoButton-BmaWZVwf.js.map +0 -1
  263. package/dist/demo/DemoDataTable-Z9xyV221.js +0 -362
  264. package/dist/demo/DemoDataTable-Z9xyV221.js.map +0 -1
  265. package/dist/demo/DemoLayout-C56xb5EE.js.map +0 -1
  266. package/dist/demo/DemoLogin-BZwpicOS.js.map +0 -1
  267. package/dist/demo/DemoRegister-C7_qc4MJ.js.map +0 -1
  268. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +0 -1
  269. package/dist/demo/DemoTypeForm-DDzWoMSV.js.map +0 -1
  270. package/dist/demo/DemoVerifyEmail-C_Irdnov.js +0 -30
  271. package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +0 -1
  272. package/dist/demo/Login-hSOU3jZc.js +0 -219
  273. package/dist/demo/Login-hSOU3jZc.js.map +0 -1
  274. package/dist/demo/Profile-CWqti7FB.js.map +0 -1
  275. package/dist/demo/Register-a70LPgs2.js.map +0 -1
  276. package/dist/demo/ResetPassword-DWN0lzr5.js.map +0 -1
  277. package/dist/demo/Showcase-Dq3MISpd.js.map +0 -1
  278. package/dist/demo/VerifyEmail-DZWL72K4.js.map +0 -1
  279. package/dist/demo/core-RCUw1Q-a.js.map +0 -1
  280. package/src/demo/styles.css +0 -0
@@ -0,0 +1,206 @@
1
+ import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-CYaRQ8O-.js";
2
+ import { t } from "alepha";
3
+ import { useI18n } from "alepha/react/i18n";
4
+ import { Avatar, Badge } from "@mantine/core";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useState } from "react";
7
+ import { IconEye, IconTrash, IconUserOff, IconUserPlus } from "@tabler/icons-react";
8
+ import { useRouter } from "alepha/react/router";
9
+ import { useClient } from "alepha/react";
10
+
11
+ //#region ../../src/admin/components/users/AdminUsers.tsx
12
+ const filters = t.object({
13
+ query: t.optional(t.text()),
14
+ enabled: t.optional(t.boolean()),
15
+ emailVerified: t.optional(t.boolean())
16
+ });
17
+ const AdminUsers = (props) => {
18
+ const client = useClient();
19
+ const router = useRouter();
20
+ const { l } = useI18n();
21
+ const dialog = useDialog();
22
+ const toast = useToast();
23
+ const [refreshKey, setRefreshKey] = useState(0);
24
+ const refresh = () => setRefreshKey((k) => k + 1);
25
+ const handleToggleEnabled = async (user) => {
26
+ const enabled = !user.enabled;
27
+ if (!await dialog.confirm({
28
+ title: enabled ? "Enable user" : "Disable user",
29
+ message: enabled ? `Enable ${user.email || user.username || "this user"}?` : `Disable ${user.email || user.username || "this user"}? They will no longer be able to sign in.`
30
+ })) return;
31
+ await client.updateUser({
32
+ params: { id: user.id },
33
+ query: { userRealmName: props.userRealmName },
34
+ body: { enabled }
35
+ });
36
+ toast.success({ message: enabled ? "User enabled" : "User disabled" });
37
+ refresh();
38
+ };
39
+ const handleDelete = async (user) => {
40
+ if (!await dialog.confirm({
41
+ title: "Delete user",
42
+ message: `Permanently delete ${user.email || user.username || "this user"}? This action cannot be undone.`
43
+ })) return;
44
+ await client.deleteUser({
45
+ params: { id: user.id },
46
+ query: { userRealmName: props.userRealmName }
47
+ });
48
+ toast.success({ message: "User deleted" });
49
+ refresh();
50
+ };
51
+ const handleBulkDisable = async (items, clearSelection) => {
52
+ const enabledUsers = items.filter((u) => u.enabled);
53
+ if (enabledUsers.length === 0) {
54
+ toast.danger({ message: "No active users in selection" });
55
+ return;
56
+ }
57
+ if (!await dialog.confirm({
58
+ title: "Disable users",
59
+ message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`
60
+ })) return;
61
+ for (const user of enabledUsers) await client.updateUser({
62
+ params: { id: user.id },
63
+ query: { userRealmName: props.userRealmName },
64
+ body: { enabled: false }
65
+ });
66
+ toast.success({ message: `${enabledUsers.length} user(s) disabled` });
67
+ clearSelection();
68
+ refresh();
69
+ };
70
+ return /* @__PURE__ */ jsx(Flex$1, {
71
+ p: "md",
72
+ flex: 1,
73
+ direction: "column",
74
+ children: /* @__PURE__ */ jsx(DataTable, {
75
+ withCheckbox: true,
76
+ withExport: true,
77
+ checkboxActions: [{
78
+ intent: "danger",
79
+ label: "Disable selected",
80
+ icon: /* @__PURE__ */ jsx(IconUserOff, {}),
81
+ onClick: (ctx) => handleBulkDisable(ctx.selectedItems, ctx.clearSelection)
82
+ }],
83
+ submitOnInit: true,
84
+ defaultSize: 10,
85
+ defaultFilters: ["query"],
86
+ tableProps: {
87
+ horizontalSpacing: "xs",
88
+ verticalSpacing: "xs"
89
+ },
90
+ onFilterChange: (_key, _value, form) => form.submit(),
91
+ filters,
92
+ items: async (filters) => {
93
+ return await client.findUsers({ query: {
94
+ ...filters,
95
+ userRealmName: props.userRealmName
96
+ } });
97
+ },
98
+ columns: {
99
+ user: {
100
+ label: "User",
101
+ value: (item) => {
102
+ const name = `${item.firstName || ""} ${item.lastName || ""}`.trim() || item.username || "Anonymous";
103
+ return /* @__PURE__ */ jsx(ActionButton, {
104
+ variant: "transparent",
105
+ href: `/admin/users/${item.id}`,
106
+ children: /* @__PURE__ */ jsxs(Flex$1, {
107
+ gap: "xs",
108
+ centerY: true,
109
+ children: [/* @__PURE__ */ jsx(Avatar, {
110
+ size: "sm",
111
+ name
112
+ }), /* @__PURE__ */ jsxs(Flex$1, {
113
+ col: true,
114
+ children: [/* @__PURE__ */ jsx(Text$1, {
115
+ size: "sm",
116
+ bold: true,
117
+ children: name
118
+ }), /* @__PURE__ */ jsx(Text$1, {
119
+ size: "xs",
120
+ muted: true,
121
+ children: item.email || "—"
122
+ })]
123
+ })]
124
+ })
125
+ });
126
+ }
127
+ },
128
+ username: {
129
+ label: "Username",
130
+ defaultHidden: true,
131
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
132
+ size: "sm",
133
+ ff: "monospace",
134
+ children: item.username || "—"
135
+ })
136
+ },
137
+ roles: {
138
+ label: "Roles",
139
+ value: (item) => item.roles.length > 0 ? /* @__PURE__ */ jsx(Flex$1, {
140
+ gap: 4,
141
+ children: item.roles.map((role) => /* @__PURE__ */ jsx(Badge, {
142
+ size: "xs",
143
+ variant: "default",
144
+ children: role
145
+ }, role))
146
+ }) : /* @__PURE__ */ jsx(Text$1, {
147
+ size: "xs",
148
+ muted: true,
149
+ children: "No roles"
150
+ })
151
+ },
152
+ enabled: {
153
+ label: "Status",
154
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
155
+ size: "sm",
156
+ variant: "light",
157
+ color: item.enabled ? "green" : "red",
158
+ children: item.enabled ? "Active" : "Disabled"
159
+ })
160
+ },
161
+ emailVerified: {
162
+ label: "Email",
163
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
164
+ size: "sm",
165
+ variant: "light",
166
+ color: item.emailVerified ? "green" : "gray",
167
+ children: item.emailVerified ? "Verified" : "Unverified"
168
+ })
169
+ },
170
+ createdAt: {
171
+ label: "Joined",
172
+ sortable: true,
173
+ sortKey: "createdAt",
174
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
175
+ size: "xs",
176
+ muted: true,
177
+ children: l(item.createdAt, { date: "fromNow" })
178
+ })
179
+ }
180
+ },
181
+ rowActions: (item) => [
182
+ {
183
+ label: "View profile",
184
+ icon: IconEye,
185
+ onClick: () => router.push("adminUserProfile", { params: { userId: item.id } })
186
+ },
187
+ {
188
+ label: item.enabled ? "Disable user" : "Enable user",
189
+ icon: item.enabled ? IconUserOff : IconUserPlus,
190
+ color: item.enabled ? "red" : "green",
191
+ onClick: () => handleToggleEnabled(item)
192
+ },
193
+ {
194
+ label: "Delete user",
195
+ icon: IconTrash,
196
+ color: "red",
197
+ onClick: () => handleDelete(item)
198
+ }
199
+ ]
200
+ }, refreshKey)
201
+ });
202
+ };
203
+
204
+ //#endregion
205
+ export { AdminUsers as default };
206
+ //# sourceMappingURL=AdminUsers-D1UfGya9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUsers-D1UfGya9.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import {\n ActionButton,\n DataTable,\n Flex,\n Text,\n useDialog,\n useToast,\n} from \"@alepha/ui\";\nimport { Avatar, Badge } from \"@mantine/core\";\nimport {\n IconEye,\n IconTrash,\n IconUserOff,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.tsx\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst filters = t.object({\n query: t.optional(t.text()),\n enabled: t.optional(t.boolean()),\n emailVerified: t.optional(t.boolean()),\n});\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<AdminUserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = () => setRefreshKey((k) => k + 1);\n\n const handleToggleEnabled = async (user: UserEntity) => {\n const enabled = !user.enabled;\n const confirmed = await dialog.confirm({\n title: enabled ? \"Enable user\" : \"Disable user\",\n message: enabled\n ? `Enable ${user.email || user.username || \"this user\"}?`\n : `Disable ${user.email || user.username || \"this user\"}? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled },\n });\n toast.success({\n message: enabled ? \"User enabled\" : \"User disabled\",\n });\n refresh();\n };\n\n const handleDelete = async (user: UserEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Delete user\",\n message: `Permanently delete ${user.email || user.username || \"this user\"}? This action cannot be undone.`,\n });\n if (!confirmed) return;\n await client.deleteUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success({ message: \"User deleted\" });\n refresh();\n };\n\n const handleBulkDisable = async (\n items: UserEntity[],\n clearSelection: () => void,\n ) => {\n const enabledUsers = items.filter((u) => u.enabled);\n if (enabledUsers.length === 0) {\n toast.danger({ message: \"No active users in selection\" });\n return;\n }\n const confirmed = await dialog.confirm({\n title: \"Disable users\",\n message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n for (const user of enabledUsers) {\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled: false },\n });\n }\n toast.success({\n message: `${enabledUsers.length} user(s) disabled`,\n });\n clearSelection();\n refresh();\n };\n\n return (\n <Flex p={\"md\"} flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n withCheckbox\n withExport\n checkboxActions={[\n {\n intent: \"danger\",\n label: \"Disable selected\",\n icon: <IconUserOff />,\n onClick: (ctx) =>\n handleBulkDisable(ctx.selectedItems, ctx.clearSelection),\n },\n ]}\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n defaultFilters={[\"query\"]}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(_key, _value, form) => form.submit()}\n filters={filters}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<UserEntity>;\n }}\n columns={{\n user: {\n label: \"User\",\n value: (item) => {\n const name =\n `${item.firstName || \"\"} ${item.lastName || \"\"}`.trim() ||\n item.username ||\n \"Anonymous\";\n\n return (\n <ActionButton\n variant={\"transparent\"}\n href={`/admin/users/${item.id}`}\n >\n <Flex gap={\"xs\"} centerY>\n <Avatar size={\"sm\"} name={name} />\n <Flex col>\n <Text size={\"sm\"} bold>\n {name}\n </Text>\n <Text size=\"xs\" muted>\n {item.email || \"\\u2014\"}\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n },\n },\n username: {\n label: \"Username\",\n defaultHidden: true,\n value: (item) => (\n <Text size=\"sm\" ff=\"monospace\">\n {item.username || \"\\u2014\"}\n </Text>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) =>\n item.roles.length > 0 ? (\n <Flex gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text size=\"xs\" muted>\n No roles\n </Text>\n ),\n },\n enabled: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n emailVerified: {\n label: \"Email\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Joined\",\n sortable: true,\n sortKey: \"createdAt\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"View profile\",\n icon: IconEye,\n onClick: () =>\n router.push(\"adminUserProfile\", {\n params: { userId: item.id },\n }),\n },\n {\n label: item.enabled ? \"Disable user\" : \"Enable user\",\n icon: item.enabled ? IconUserOff : IconUserPlus,\n color: item.enabled ? \"red\" : \"green\",\n onClick: () => handleToggleEnabled(item),\n },\n {\n label: \"Delete user\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDelete(item),\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { y as AlephaMantineProvider } from "./core-2xoLiT0o.js";
1
+ import { y as AlephaMantineProvider } from "./core-CYaRQ8O-.js";
2
2
  import { Flex } from "@mantine/core";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { NestedView } from "alepha/react/router";
@@ -19,4 +19,4 @@ const AuthLayout = () => {
19
19
 
20
20
  //#endregion
21
21
  export { AuthLayout as default };
22
- //# sourceMappingURL=AuthLayout-DFJvCvzw.js.map
22
+ //# sourceMappingURL=AuthLayout-_frhdgOO.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout-DFJvCvzw.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAsB,SAAS;YAC9B,oBAAC;GAAK,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,eAAa;IACT;GACe"}
1
+ {"version":3,"file":"AuthLayout-_frhdgOO.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAsB,SAAS;YAC9B,oBAAC;GAAK,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,eAAa;IACT;GACe"}
@@ -53,4 +53,4 @@ const IconGoogle = () => {
53
53
 
54
54
  //#endregion
55
55
  export { IconGithub as n, IconGoogle as t };
56
- //# sourceMappingURL=IconGoogle-CSQLPYwX.js.map
56
+ //# sourceMappingURL=IconGoogle-Ch1m3Uzl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconGoogle-CSQLPYwX.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
1
+ {"version":3,"file":"IconGoogle-Ch1m3Uzl.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
@@ -0,0 +1,275 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
2
+ import { _ as ActionButton, a as Control, n as capitalize } from "./core-CYaRQ8O-.js";
3
+ import { n as IconGithub, t as IconGoogle } from "./IconGoogle-Ch1m3Uzl.js";
4
+ import { AlephaError, t } from "alepha";
5
+ import { FormValidationError, useForm } from "alepha/react/form";
6
+ import { useI18n } from "alepha/react/i18n";
7
+ import { Card, Flex, Image, Text, Title } from "@mantine/core";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { useMemo } from "react";
10
+ import { IconLock, IconPhoto, IconUser } from "@tabler/icons-react";
11
+ import { useRouter } from "alepha/react/router";
12
+ import { useAuth } from "alepha/react/auth";
13
+ import { HttpError } from "alepha/server";
14
+
15
+ //#region ../../src/auth/components/Login.tsx
16
+ var Login_exports = /* @__PURE__ */ __exportAll({ default: () => Login });
17
+ const Login = (props) => {
18
+ const auth = useAuth();
19
+ const router = useRouter();
20
+ const { tr } = useI18n();
21
+ const redirect = router.query.r || "/";
22
+ const credentialsProvider = props.realmConfig.authenticationMethods.find((it) => it.type === "CREDENTIALS");
23
+ const settings = props.realmConfig.settings;
24
+ const loginMethods = useMemo(() => {
25
+ const methods = [];
26
+ if (settings.username !== "none") methods.push("username");
27
+ if (settings.email !== "none") methods.push("email");
28
+ if (settings.phoneNumber !== "none") methods.push("phone");
29
+ return methods;
30
+ }, [settings]);
31
+ const identifierTitle = useMemo(() => {
32
+ if (loginMethods.length === 0) return tr("loginUsername");
33
+ if (loginMethods.length === 1) {
34
+ if (loginMethods[0] === "username") return tr("loginUsername");
35
+ if (loginMethods[0] === "email") return tr("loginEmail");
36
+ if (loginMethods[0] === "phone") return tr("loginPhone");
37
+ }
38
+ const labels = loginMethods.map((m) => {
39
+ if (m === "username") return tr("loginUsername").toLowerCase();
40
+ if (m === "email") return tr("loginEmail").toLowerCase();
41
+ if (m === "phone") return tr("loginPhone").toLowerCase();
42
+ return m;
43
+ });
44
+ return capitalize(`${labels.slice(0, -1).join(", ")} or ${labels[labels.length - 1]}`);
45
+ }, [loginMethods, tr]);
46
+ const form = useForm({
47
+ schema: t.object({
48
+ identifier: t.string({ minLength: 1 }),
49
+ password: t.string({ minLength: settings.passwordPolicy?.minLength || 6 })
50
+ }),
51
+ handler: async (data) => {
52
+ if (!credentialsProvider) throw new AlephaError("Credentials provider not configured");
53
+ try {
54
+ await auth.login(credentialsProvider.name, {
55
+ username: data.identifier,
56
+ password: data.password,
57
+ realm: props.realmConfig.realmName
58
+ });
59
+ await router.push(router.query.r || "/");
60
+ } catch (error) {
61
+ if (error instanceof HttpError && error.error === "InvalidCredentialsError") throw new FormValidationError({
62
+ message: "Invalid identifier or password",
63
+ path: "/password"
64
+ });
65
+ throw error;
66
+ }
67
+ }
68
+ });
69
+ const getAutoCompleteType = () => {
70
+ if (loginMethods.includes("email")) return "email";
71
+ if (loginMethods.includes("username")) return "username";
72
+ if (loginMethods.includes("phone")) return "tel";
73
+ return "username";
74
+ };
75
+ const externalLoginMethods = props.realmConfig.authenticationMethods.filter((method) => method.type !== "CREDENTIALS");
76
+ const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;
77
+ const realmQuery = props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : "";
78
+ const formContent = /* @__PURE__ */ jsxs(Flex, {
79
+ direction: "column",
80
+ gap: "md",
81
+ children: [
82
+ (settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Flex, {
83
+ direction: "column",
84
+ gap: "xs",
85
+ align: "center",
86
+ mb: "xs",
87
+ children: [
88
+ settings.logoUrl && /* @__PURE__ */ jsx(Image, {
89
+ src: settings.logoUrl,
90
+ alt: settings.displayName || props.realmConfig.realmName,
91
+ h: 48,
92
+ w: "auto",
93
+ fit: "contain"
94
+ }),
95
+ settings.displayName && /* @__PURE__ */ jsx(Title, {
96
+ order: 4,
97
+ ta: "center",
98
+ children: settings.displayName
99
+ }),
100
+ settings.description && /* @__PURE__ */ jsx(Text, {
101
+ size: "sm",
102
+ c: "dimmed",
103
+ ta: "center",
104
+ children: settings.description
105
+ })
106
+ ]
107
+ }),
108
+ credentialsProvider && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("form", {
109
+ ...form.props,
110
+ children: /* @__PURE__ */ jsxs(Flex, {
111
+ direction: "column",
112
+ flex: 1,
113
+ gap: "md",
114
+ children: [
115
+ /* @__PURE__ */ jsx(Control, {
116
+ label: identifierTitle,
117
+ input: form.input.identifier,
118
+ icon: IconUser,
119
+ text: { autoComplete: getAutoCompleteType() }
120
+ }),
121
+ /* @__PURE__ */ jsx(Control, {
122
+ label: tr("loginPassword"),
123
+ input: form.input.password,
124
+ icon: IconLock,
125
+ password: { autoComplete: "current-password" }
126
+ }),
127
+ /* @__PURE__ */ jsx(ActionButton, {
128
+ variant: "filled",
129
+ form,
130
+ children: tr("loginSignIn")
131
+ })
132
+ ]
133
+ })
134
+ }), settings.resetPasswordAllowed && /* @__PURE__ */ jsx(Text, {
135
+ size: "sm",
136
+ ta: "center",
137
+ children: /* @__PURE__ */ jsx(ActionButton, {
138
+ href: `${props.resetPasswordPath ?? "/auth/reset-password"}${realmQuery}`,
139
+ anchorProps: { inherit: true },
140
+ children: tr("loginForgotPassword")
141
+ })
142
+ })] }),
143
+ showOrDivider && /* @__PURE__ */ jsxs(Flex, {
144
+ align: "center",
145
+ justify: "center",
146
+ gap: "md",
147
+ children: [
148
+ /* @__PURE__ */ jsx(Flex, {
149
+ flex: 1,
150
+ h: "1px",
151
+ bg: "var(--alepha-border)"
152
+ }),
153
+ /* @__PURE__ */ jsx(Text, {
154
+ size: "xs",
155
+ c: "dimmed",
156
+ children: tr("loginOr")
157
+ }),
158
+ /* @__PURE__ */ jsx(Flex, {
159
+ flex: 1,
160
+ h: "1px",
161
+ bg: "var(--alepha-border)"
162
+ })
163
+ ]
164
+ }),
165
+ externalLoginMethods.length > 0 && /* @__PURE__ */ jsx(Flex, {
166
+ direction: "column",
167
+ gap: "sm",
168
+ children: externalLoginMethods.map((method) => /* @__PURE__ */ jsx(ActionButton, {
169
+ variant: "default",
170
+ leftSection: leftSection(method.name.toLowerCase()),
171
+ onClick: () => auth.login(method.name, {
172
+ redirect,
173
+ realm: props.realmConfig.realmName
174
+ }),
175
+ children: tr("loginContinueWith", { args: [capitalize(method.name)] })
176
+ }, method.type))
177
+ }),
178
+ settings.registrationAllowed && /* @__PURE__ */ jsxs(Text, {
179
+ size: "sm",
180
+ ta: "center",
181
+ children: [
182
+ tr("loginNoAccount"),
183
+ " ",
184
+ /* @__PURE__ */ jsx(ActionButton, {
185
+ href: `${props.registerPath ?? "/auth/register"}${realmQuery}`,
186
+ anchorProps: { inherit: true },
187
+ children: tr("loginSignUp")
188
+ })
189
+ ]
190
+ })
191
+ ]
192
+ });
193
+ if (props.variant === "split") return /* @__PURE__ */ jsx(Flex, {
194
+ flex: 1,
195
+ justify: "center",
196
+ align: "center",
197
+ children: /* @__PURE__ */ jsx(Card, {
198
+ withBorder: true,
199
+ p: 0,
200
+ w: 720,
201
+ bg: "var(--alepha-elevated)",
202
+ style: { overflow: "hidden" },
203
+ children: /* @__PURE__ */ jsxs(Flex, {
204
+ mih: 480,
205
+ children: [props.image ? /* @__PURE__ */ jsx(Flex, {
206
+ flex: 1,
207
+ style: {
208
+ backgroundImage: `url(${props.image})`,
209
+ backgroundSize: "cover",
210
+ backgroundPosition: "center"
211
+ }
212
+ }) : /* @__PURE__ */ jsx(Flex, {
213
+ flex: 1,
214
+ justify: "center",
215
+ align: "center",
216
+ bg: "var(--mantine-color-gray-light)",
217
+ style: { borderRight: "1px solid var(--mantine-color-default-border)" },
218
+ children: /* @__PURE__ */ jsx(Flex, {
219
+ justify: "center",
220
+ align: "center",
221
+ w: 120,
222
+ h: 80,
223
+ style: {
224
+ border: "2px dashed var(--mantine-color-default-border)",
225
+ borderRadius: "var(--mantine-radius-sm)"
226
+ },
227
+ children: /* @__PURE__ */ jsx(IconPhoto, {
228
+ size: 32,
229
+ style: { opacity: .3 }
230
+ })
231
+ })
232
+ }), /* @__PURE__ */ jsxs(Flex, {
233
+ flex: 1,
234
+ direction: "column",
235
+ gap: "md",
236
+ p: "xl",
237
+ justify: "center",
238
+ children: [formContent, /* @__PURE__ */ jsx(ActionButton, {
239
+ variant: "subtle",
240
+ href: "/",
241
+ children: tr("loginCancel")
242
+ })]
243
+ })]
244
+ })
245
+ })
246
+ });
247
+ return /* @__PURE__ */ jsx(Flex, {
248
+ flex: 1,
249
+ justify: "center",
250
+ align: "center",
251
+ children: /* @__PURE__ */ jsxs(Flex, {
252
+ direction: "column",
253
+ gap: "sm",
254
+ w: 360,
255
+ children: [/* @__PURE__ */ jsx(Card, {
256
+ withBorder: true,
257
+ p: "lg",
258
+ bg: "var(--alepha-elevated)",
259
+ children: formContent
260
+ }), /* @__PURE__ */ jsx(ActionButton, {
261
+ variant: "subtle",
262
+ href: "/",
263
+ children: tr("loginCancel")
264
+ })]
265
+ })
266
+ });
267
+ };
268
+ const leftSection = (name) => {
269
+ if (name === "google") return /* @__PURE__ */ jsx(IconGoogle, {});
270
+ if (name === "github") return /* @__PURE__ */ jsx(IconGithub, {});
271
+ };
272
+
273
+ //#endregion
274
+ export { Login_exports as t };
275
+ //# sourceMappingURL=Login-xtNmQtGh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Login-xtNmQtGh.js","names":[],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Image, Text, Title } from \"@mantine/core\";\nimport { IconLock, IconPhoto, IconUser } from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type { RealmConfig } from \"alepha/api/users\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { FormValidationError, useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface LoginProps {\n realmConfig: RealmConfig;\n registerPath?: string;\n resetPasswordPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.username !== \"none\") methods.push(\"username\");\n if (settings.email !== \"none\") methods.push(\"email\");\n if (settings.phoneNumber !== \"none\") methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n if (!credentialsProvider) {\n throw new AlephaError(\"Credentials provider not configured\");\n }\n\n try {\n await auth.login(credentialsProvider.name, {\n username: data.identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n await router.push(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n const getAutoCompleteType = () => {\n if (loginMethods.includes(\"email\")) {\n return \"email\";\n }\n if (loginMethods.includes(\"username\")) {\n return \"username\";\n }\n if (loginMethods.includes(\"phone\")) {\n return \"tel\";\n }\n return \"username\";\n };\n\n const externalLoginMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {/* Credentials login form */}\n {credentialsProvider && (\n <>\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Control\n label={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: getAutoCompleteType(),\n }}\n />\n <Control\n label={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Flex>\n </form>\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={`${props.resetPasswordPath ?? \"/auth/reset-password\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c={\"dimmed\"}>\n {tr(\"loginOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalLoginMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalLoginMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Registration link */}\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={`${props.registerPath ?? \"/auth/register\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
@@ -1,10 +1,39 @@
1
- import { i as ActionButton } from "./core-niW0sFLv.js";
1
+ import { _ as ActionButton } from "./core-CYaRQ8O-.js";
2
2
  import { Avatar, Badge, Card, Flex, Text, Title } from "@mantine/core";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { IconAt, IconCalendar, IconId, IconShield, IconUser } from "@tabler/icons-react";
5
5
  import { useRouter } from "alepha/react/router";
6
6
  import { useAuth } from "alepha/react/auth";
7
7
 
8
+ //#region ../../src/auth/components/ProfileField.tsx
9
+ const ProfileField = (props) => {
10
+ const { icon, label, children } = props;
11
+ return /* @__PURE__ */ jsxs(Flex, {
12
+ gap: "sm",
13
+ align: "flex-start",
14
+ children: [/* @__PURE__ */ jsx(Flex, {
15
+ c: "dimmed",
16
+ mt: 2,
17
+ children: icon
18
+ }), /* @__PURE__ */ jsxs(Flex, {
19
+ direction: "column",
20
+ gap: 2,
21
+ flex: 1,
22
+ children: [/* @__PURE__ */ jsx(Text, {
23
+ size: "xs",
24
+ c: "dimmed",
25
+ tt: "uppercase",
26
+ fw: 500,
27
+ children: label
28
+ }), /* @__PURE__ */ jsx(Text, {
29
+ size: "sm",
30
+ children
31
+ })]
32
+ })]
33
+ });
34
+ };
35
+
36
+ //#endregion
8
37
  //#region ../../src/auth/components/Profile.tsx
9
38
  const Profile = () => {
10
39
  const auth = useAuth();
@@ -124,32 +153,7 @@ const Profile = () => {
124
153
  })
125
154
  });
126
155
  };
127
- const ProfileField = ({ icon, label, children }) => {
128
- return /* @__PURE__ */ jsxs(Flex, {
129
- gap: "sm",
130
- align: "flex-start",
131
- children: [/* @__PURE__ */ jsx(Flex, {
132
- c: "dimmed",
133
- mt: 2,
134
- children: icon
135
- }), /* @__PURE__ */ jsxs(Flex, {
136
- direction: "column",
137
- gap: 2,
138
- flex: 1,
139
- children: [/* @__PURE__ */ jsx(Text, {
140
- size: "xs",
141
- c: "dimmed",
142
- tt: "uppercase",
143
- fw: 500,
144
- children: label
145
- }), /* @__PURE__ */ jsx(Text, {
146
- size: "sm",
147
- children
148
- })]
149
- })]
150
- });
151
- };
152
156
 
153
157
  //#endregion
154
158
  export { Profile as default };
155
- //# sourceMappingURL=Profile-BMX_Ar_s.js.map
159
+ //# sourceMappingURL=Profile-_AtPUwAP.js.map