@alepha/ui 0.18.2 → 0.19.0

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 (257) hide show
  1. package/dist/admin/{AdminApiKeys-BJhIwfD6.js → AdminApiKeys-Bt1PjO6o.js} +3 -4
  2. package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Bt1PjO6o.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-C7c1CN4c.js} +3 -4
  4. package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-C7c1CN4c.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-C3RXpTp6.js} +3 -4
  6. package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-C3RXpTp6.js.map} +1 -1
  7. package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-31ivR6Wq.js} +3 -4
  8. package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-31ivR6Wq.js.map} +1 -1
  9. package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BABLe7hL.js} +73 -25
  10. package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +1 -0
  11. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D-G8RIlr.js} +3 -4
  12. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D-G8RIlr.js.map} +1 -1
  13. package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-oIS3K9NX.js} +3 -4
  14. package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-oIS3K9NX.js.map} +1 -1
  15. package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-BmZ9mtXh.js} +8 -25
  16. package/dist/admin/AdminLayout-BmZ9mtXh.js.map +1 -0
  17. package/dist/admin/AdminNotifications-DHdzksww.js +541 -0
  18. package/dist/admin/AdminNotifications-DHdzksww.js.map +1 -0
  19. package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CyZQSXnN.js} +118 -112
  20. package/dist/admin/AdminParameters-CyZQSXnN.js.map +1 -0
  21. package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions--xwELDSO.js} +3 -4
  22. package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions--xwELDSO.js.map} +1 -1
  23. package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-DvBTG5gd.js} +82 -115
  24. package/dist/admin/AdminUserLayout-DvBTG5gd.js.map +1 -0
  25. package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-CzsPBl6Z.js} +7 -6
  26. package/dist/admin/AdminUserProfile-CzsPBl6Z.js.map +1 -0
  27. package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-C-aUnhVN.js} +3 -4
  28. package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-C-aUnhVN.js.map} +1 -1
  29. package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-BYwei5sj.js} +4 -4
  30. package/dist/admin/AdminUsers-BYwei5sj.js.map +1 -0
  31. package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-CkPGLJku.js} +3 -4
  32. package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-CkPGLJku.js.map} +1 -1
  33. package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
  34. package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  35. package/dist/admin/Login-DSBqNsZc.js +274 -0
  36. package/dist/admin/Login-DSBqNsZc.js.map +1 -0
  37. package/dist/admin/{Profile-B2EcIDB9.js → Profile-CDRjJo0P.js} +31 -29
  38. package/dist/admin/Profile-CDRjJo0P.js.map +1 -0
  39. package/dist/admin/{Register-Z3fxRbUF.js → Register-4QGFOnfh.js} +201 -146
  40. package/dist/admin/Register-4QGFOnfh.js.map +1 -0
  41. package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-Gxc9L_mY.js} +9 -10
  42. package/dist/admin/ResetPassword-Gxc9L_mY.js.map +1 -0
  43. package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-D7G5NnaN.js} +25 -11
  44. package/dist/admin/VerifyEmail-D7G5NnaN.js.map +1 -0
  45. package/dist/admin/adminUserAtom-DCi4wf-v.js +11 -0
  46. package/dist/admin/adminUserAtom-DCi4wf-v.js.map +1 -0
  47. package/dist/admin/{core-BVO_TQxb.js → core-D1AbU50V.js} +662 -570
  48. package/dist/admin/core-D1AbU50V.js.map +1 -0
  49. package/dist/admin/index.d.ts +141 -53
  50. package/dist/admin/index.d.ts.map +1 -1
  51. package/dist/admin/index.js +67 -49
  52. package/dist/admin/index.js.map +1 -1
  53. package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
  54. package/dist/{demo/AuthLayout-DN-ClJQk.js → auth/AuthLayout-CfRKcTqP.js} +3 -4
  55. package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-CfRKcTqP.js.map} +1 -1
  56. package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
  57. package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  58. package/dist/auth/Login-DJyweoPS.js +274 -0
  59. package/dist/auth/Login-DJyweoPS.js.map +1 -0
  60. package/dist/auth/{Profile-BMpXJ0oi.js → Profile-Cy93pNTw.js} +31 -29
  61. package/dist/auth/Profile-Cy93pNTw.js.map +1 -0
  62. package/dist/auth/{Register-2gx8qll-.js → Register-CSqzzitW.js} +201 -146
  63. package/dist/auth/Register-CSqzzitW.js.map +1 -0
  64. package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-B61QPlQi.js} +9 -10
  65. package/dist/auth/ResetPassword-B61QPlQi.js.map +1 -0
  66. package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-CqBJ11id.js} +25 -11
  67. package/dist/auth/VerifyEmail-CqBJ11id.js.map +1 -0
  68. package/dist/auth/{core-DyfeVr5c.js → core-C6D3pazL.js} +403 -343
  69. package/dist/auth/core-C6D3pazL.js.map +1 -0
  70. package/dist/auth/index.d.ts +93 -54
  71. package/dist/auth/index.d.ts.map +1 -1
  72. package/dist/auth/index.js +30 -31
  73. package/dist/auth/index.js.map +1 -1
  74. package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
  75. package/dist/core/index.d.ts +123 -62
  76. package/dist/core/index.d.ts.map +1 -1
  77. package/dist/core/index.js +878 -776
  78. package/dist/core/index.js.map +1 -1
  79. package/dist/{auth/AuthLayout-C161NeF6.js → demo/AuthLayout-Dq5tSLSc.js} +3 -4
  80. package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Dq5tSLSc.js.map} +1 -1
  81. package/dist/demo/DemoButton-_Ws2w-J0.js +181 -0
  82. package/dist/demo/DemoButton-_Ws2w-J0.js.map +1 -0
  83. package/dist/demo/DemoControlSelect-ChP4ZOpQ.js +304 -0
  84. package/dist/demo/DemoControlSelect-ChP4ZOpQ.js.map +1 -0
  85. package/dist/demo/DemoDataTable-Hwf_UUni.js +361 -0
  86. package/dist/demo/DemoDataTable-Hwf_UUni.js.map +1 -0
  87. package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-B01OMVRd.js} +3 -4
  88. package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-B01OMVRd.js.map} +1 -1
  89. package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-870PEl0V.js} +4 -5
  90. package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-870PEl0V.js.map} +1 -1
  91. package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C1YR27fz.js} +4 -5
  92. package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C1YR27fz.js.map} +1 -1
  93. package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-DRbL2eGf.js} +4 -5
  94. package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-DRbL2eGf.js.map} +1 -1
  95. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-DoABiqBW.js} +4 -5
  96. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-DoABiqBW.js.map} +1 -1
  97. package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CN_PDCX2.js} +16 -8
  98. package/dist/demo/DemoLayout-CN_PDCX2.js.map +1 -0
  99. package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-B5x-ug3Q.js} +51 -35
  100. package/dist/demo/DemoLogin-B5x-ug3Q.js.map +1 -0
  101. package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-Q6sg2xuV.js} +51 -53
  102. package/dist/demo/DemoRegister-Q6sg2xuV.js.map +1 -0
  103. package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-DrqZfmEw.js} +14 -19
  104. package/dist/demo/DemoResetPassword-DrqZfmEw.js.map +1 -0
  105. package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-CfKS6w1o.js} +4 -5
  106. package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-CfKS6w1o.js.map} +1 -1
  107. package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-pT6Gi5b5.js} +4 -5
  108. package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-pT6Gi5b5.js.map} +1 -1
  109. package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-I13NBzQQ.js} +3 -4
  110. package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-I13NBzQQ.js.map} +1 -1
  111. package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-BqzcrtvN.js} +9 -6
  112. package/dist/demo/DemoTypeForm-BqzcrtvN.js.map +1 -0
  113. package/dist/demo/DemoVerifyEmail-HwD8xfQw.js +33 -0
  114. package/dist/demo/DemoVerifyEmail-HwD8xfQw.js.map +1 -0
  115. package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
  116. package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
  117. package/dist/demo/Login-CqG1iJbn.js +274 -0
  118. package/dist/demo/Login-CqG1iJbn.js.map +1 -0
  119. package/dist/demo/{Profile-BE_Y3co2.js → Profile-C0ojJCaG.js} +31 -29
  120. package/dist/demo/Profile-C0ojJCaG.js.map +1 -0
  121. package/dist/demo/{Register-fXHmBpr3.js → Register-KKZwr_lL.js} +201 -146
  122. package/dist/demo/Register-KKZwr_lL.js.map +1 -0
  123. package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-DMrLFEtr.js} +9 -10
  124. package/dist/demo/ResetPassword-DMrLFEtr.js.map +1 -0
  125. package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D49Wud2v.js} +65 -68
  126. package/dist/demo/Showcase-D49Wud2v.js.map +1 -0
  127. package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BFCAFz6T.js} +25 -11
  128. package/dist/demo/VerifyEmail-BFCAFz6T.js.map +1 -0
  129. package/dist/demo/{auth-Djd7SKiw.js → auth-D9qTZzCa.js} +18 -35
  130. package/dist/demo/{auth-Djd7SKiw.js.map → auth-D9qTZzCa.js.map} +1 -1
  131. package/dist/demo/{core-B7LNjM78.js → core-DRtQklr3.js} +752 -647
  132. package/dist/demo/core-DRtQklr3.js.map +1 -0
  133. package/dist/demo/index.d.ts +1 -0
  134. package/dist/demo/index.d.ts.map +1 -1
  135. package/dist/demo/index.js +25 -22
  136. package/dist/demo/index.js.map +1 -1
  137. package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
  138. package/package.json +19 -19
  139. package/src/admin/AdminRouter.tsx +42 -2
  140. package/src/admin/atoms/adminUserAtom.ts +7 -0
  141. package/src/admin/components/AdminLayout.tsx +2 -14
  142. package/src/admin/components/jobs/AdminJobDashboard.tsx +51 -20
  143. package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
  144. package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
  145. package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
  146. package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
  147. package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
  148. package/src/admin/components/parameters/ParameterTree.tsx +28 -184
  149. package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
  150. package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
  151. package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
  152. package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
  153. package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
  154. package/src/admin/components/users/AdminUserLayout.tsx +84 -127
  155. package/src/admin/components/users/AdminUserProfile.tsx +5 -2
  156. package/src/admin/components/users/AdminUsers.tsx +1 -1
  157. package/src/auth/components/Login.tsx +188 -121
  158. package/src/auth/components/Profile.tsx +1 -22
  159. package/src/auth/components/ProfileField.tsx +39 -0
  160. package/src/auth/components/Register.tsx +215 -158
  161. package/src/auth/components/ResetPassword.tsx +7 -11
  162. package/src/auth/components/VerifyEmail.tsx +35 -10
  163. package/src/auth/components/buttons/UserButton.tsx +19 -21
  164. package/src/auth/index.ts +1 -0
  165. package/src/core/components/Flex.tsx +34 -0
  166. package/src/core/components/buttons/ActionButton.tsx +105 -78
  167. package/src/core/components/data/DetailDrawer.tsx +102 -96
  168. package/src/core/components/data/DetailList.tsx +2 -1
  169. package/src/core/components/dialogs/PromptDialog.tsx +1 -1
  170. package/src/core/components/layout/Breadcrumb.tsx +4 -7
  171. package/src/core/components/layout/DashboardShell.tsx +18 -4
  172. package/src/core/components/layout/Sidebar.tsx +16 -241
  173. package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
  174. package/src/core/components/layout/SidebarItem.tsx +146 -0
  175. package/src/core/components/layout/index.ts +3 -1
  176. package/src/core/form/components/Control.tsx +31 -29
  177. package/src/core/form/components/ControlArray.tsx +13 -39
  178. package/src/core/form/components/ControlDate.tsx +10 -21
  179. package/src/core/form/components/ControlNumber.tsx +4 -33
  180. package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
  181. package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
  182. package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
  183. package/src/core/form/components/ControlSelect.tsx +294 -92
  184. package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
  185. package/src/core/form/components/TypeForm.tsx +5 -2
  186. package/src/core/form/index.ts +8 -1
  187. package/src/core/form/utils/parseInput.ts +7 -3
  188. package/src/core/index.ts +3 -1
  189. package/src/core/json/components/JsonViewer.tsx +103 -319
  190. package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
  191. package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
  192. package/src/core/json/components/JsonViewerShared.ts +76 -0
  193. package/src/core/services/DialogService.tsx +2 -2
  194. package/src/core/styles.css +13 -2
  195. package/src/core/table/components/ColumnPicker.tsx +3 -3
  196. package/src/core/table/components/DataTable.tsx +88 -29
  197. package/src/core/table/components/DataTableFilters.tsx +6 -11
  198. package/src/core/table/components/DataTablePagination.tsx +9 -3
  199. package/src/core/table/components/DataTableToolbar.tsx +7 -3
  200. package/src/core/table/components/FilterPicker.tsx +3 -3
  201. package/src/core/table/interfaces/types.ts +29 -0
  202. package/src/core/utils/icons.tsx +2 -2
  203. package/src/demo/DemoRouter.ts +8 -1
  204. package/src/demo/components/DemoLayout.tsx +12 -2
  205. package/src/demo/components/auth/DemoLogin.tsx +35 -28
  206. package/src/demo/components/auth/DemoRegister.tsx +35 -49
  207. package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
  208. package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
  209. package/src/demo/components/core/DemoButton.tsx +123 -103
  210. package/src/demo/components/core/DemoControlSelect.tsx +325 -0
  211. package/src/demo/components/core/DemoDataTable.tsx +255 -237
  212. package/src/demo/components/core/DemoTypeForm.tsx +7 -2
  213. package/src/demo/components/shared/MacWindow.tsx +5 -11
  214. package/src/demo/components/shared/Showcase.tsx +28 -42
  215. package/dist/admin/AdminJobDashboard-KIOkeMgE.js.map +0 -1
  216. package/dist/admin/AdminLayout-B1DXZHDn.js.map +0 -1
  217. package/dist/admin/AdminParameters-BspPeqp_.js.map +0 -1
  218. package/dist/admin/AdminUserLayout-DUbC6-BI.js.map +0 -1
  219. package/dist/admin/AdminUserProfile-DuTUnjdG.js.map +0 -1
  220. package/dist/admin/AdminUsers-CR9z0g_5.js.map +0 -1
  221. package/dist/admin/Login-DHbYJKwg.js +0 -219
  222. package/dist/admin/Login-DHbYJKwg.js.map +0 -1
  223. package/dist/admin/Profile-B2EcIDB9.js.map +0 -1
  224. package/dist/admin/Register-Z3fxRbUF.js.map +0 -1
  225. package/dist/admin/ResetPassword-_Y1qTTKh.js.map +0 -1
  226. package/dist/admin/VerifyEmail-Bg22bwcC.js.map +0 -1
  227. package/dist/admin/core-BVO_TQxb.js.map +0 -1
  228. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  229. package/dist/auth/Login-C7jIqf00.js +0 -219
  230. package/dist/auth/Login-C7jIqf00.js.map +0 -1
  231. package/dist/auth/Profile-BMpXJ0oi.js.map +0 -1
  232. package/dist/auth/Register-2gx8qll-.js.map +0 -1
  233. package/dist/auth/ResetPassword-DBxt9hKk.js.map +0 -1
  234. package/dist/auth/VerifyEmail-Z80Ubajk.js.map +0 -1
  235. package/dist/auth/core-DyfeVr5c.js.map +0 -1
  236. package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
  237. package/dist/demo/DemoButton-CGUyR9eM.js +0 -178
  238. package/dist/demo/DemoButton-CGUyR9eM.js.map +0 -1
  239. package/dist/demo/DemoDataTable-QFG-xXSx.js +0 -358
  240. package/dist/demo/DemoDataTable-QFG-xXSx.js.map +0 -1
  241. package/dist/demo/DemoLayout-Cy6xjn6P.js.map +0 -1
  242. package/dist/demo/DemoLogin-vqxgTu4P.js.map +0 -1
  243. package/dist/demo/DemoRegister-YHPvPg77.js.map +0 -1
  244. package/dist/demo/DemoResetPassword-mOW18Zlm.js.map +0 -1
  245. package/dist/demo/DemoTypeForm-C1dNkahD.js.map +0 -1
  246. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js +0 -30
  247. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js.map +0 -1
  248. package/dist/demo/Login-CoYf_P_F.js +0 -219
  249. package/dist/demo/Login-CoYf_P_F.js.map +0 -1
  250. package/dist/demo/Profile-BE_Y3co2.js.map +0 -1
  251. package/dist/demo/Register-fXHmBpr3.js.map +0 -1
  252. package/dist/demo/ResetPassword-CAPj8MO3.js.map +0 -1
  253. package/dist/demo/Showcase-BtEU0pY9.js.map +0 -1
  254. package/dist/demo/VerifyEmail-DFmdCdYs.js.map +0 -1
  255. package/dist/demo/core-B7LNjM78.js.map +0 -1
  256. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  257. package/src/demo/styles.css +0 -0
@@ -42,14 +42,14 @@ export interface UserButtonProps
42
42
  menuConfig?: Partial<Omit<ActionMenuConfig, "items">>;
43
43
 
44
44
  /**
45
- * Whether to show a divider before logout (default: true when menuItems provided)
45
+ * Custom icon to use instead of user avatar (default: IconUser)
46
46
  */
47
- showLogoutDivider?: boolean;
47
+ icon?: ReactNode;
48
48
 
49
49
  /**
50
- * Custom icon to use instead of user avatar (default: IconUser)
50
+ * If true, the profile link will not be shown in the menu even if a userProfile page exists and the user is authenticated.
51
51
  */
52
- icon?: ReactNode;
52
+ skipProfile?: boolean;
53
53
  }
54
54
 
55
55
  const UserButton = (props: UserButtonProps) => {
@@ -58,8 +58,8 @@ const UserButton = (props: UserButtonProps) => {
58
58
  logoutLabel = "Sign out",
59
59
  loginLabel,
60
60
  menuConfig,
61
- showLogoutDivider = menuItems.length > 0,
62
61
  icon,
62
+ skipProfile = false,
63
63
  children,
64
64
  ...buttonProps
65
65
  } = props;
@@ -104,10 +104,10 @@ const UserButton = (props: UserButtonProps) => {
104
104
  }
105
105
 
106
106
  // Add profile page link if available
107
- if (userPage && isConnected) {
107
+ if (userPage && isConnected && !skipProfile) {
108
108
  items.push({
109
109
  label: "Profile",
110
- icon: <IconUser size={ui.sizes.icon.md} />,
110
+ icon: <IconUser size={ui.sizes.icon.sm} />,
111
111
  href: authRouter.path("userProfile"),
112
112
  });
113
113
  }
@@ -116,7 +116,7 @@ const UserButton = (props: UserButtonProps) => {
116
116
  if (adminPage && isAdmin) {
117
117
  items.push({
118
118
  label: "Admin",
119
- icon: <IconSettings size={ui.sizes.icon.md} />,
119
+ icon: <IconSettings size={ui.sizes.icon.sm} />,
120
120
  href: authRouter.path("adminLayout"),
121
121
  });
122
122
  }
@@ -125,14 +125,14 @@ const UserButton = (props: UserButtonProps) => {
125
125
  items.push(...menuItems);
126
126
 
127
127
  // Add divider before logout if needed
128
- if (showLogoutDivider && items.length > 0) {
128
+ if (items.length > 0) {
129
129
  items.push({ type: "divider" });
130
130
  }
131
131
 
132
132
  // Add logout item
133
133
  items.push({
134
134
  label: logoutLabel,
135
- icon: <IconLogout size={ui.sizes.icon.md} />,
135
+ icon: <IconLogout size={ui.sizes.icon.sm} />,
136
136
  color: "red",
137
137
  onClick: () => auth.logout(),
138
138
  });
@@ -146,23 +146,21 @@ const UserButton = (props: UserButtonProps) => {
146
146
  icon={
147
147
  hasAvatar ? undefined : icon === null ? undefined : (icon ?? IconUser)
148
148
  }
149
- leftSection={
150
- hasAvatar ? (
151
- <Avatar
152
- src={`/api/files/${auth.user.picture}`}
153
- size={24}
154
- radius="xl"
155
- />
156
- ) : undefined
157
- }
149
+ px={8}
158
150
  menu={{
159
- position: "bottom-end",
151
+ menuProps: {
152
+ withArrow: true,
153
+ arrowSize: 12,
154
+ },
155
+ position: "bottom",
160
156
  width: 200,
161
157
  ...menuConfig,
162
158
  items,
163
159
  }}
164
160
  >
165
- {children}
161
+ {hasAvatar ? (
162
+ <Avatar src={`/api/files/${auth.user.picture}`} size={24} radius="xl" />
163
+ ) : undefined}
166
164
  </ActionButton>
167
165
  );
168
166
  };
package/src/auth/index.ts CHANGED
@@ -13,6 +13,7 @@ export { default as UserButton } from "./components/buttons/UserButton.tsx";
13
13
  export { default as Login } from "./components/Login.tsx";
14
14
  export { default as Register } from "./components/Register.tsx";
15
15
  export { default as ResetPassword } from "./components/ResetPassword.tsx";
16
+ export type { VerifyEmailStep } from "./components/VerifyEmail.tsx";
16
17
  export { default as VerifyEmail } from "./components/VerifyEmail.tsx";
17
18
  export * from "./primitives/$uiAuth.ts";
18
19
 
@@ -2,9 +2,17 @@ import {
2
2
  Flex as MantineFlex,
3
3
  type FlexProps as MantineFlexProps,
4
4
  } from "@mantine/core";
5
+ import { FormModel } from "alepha/react/form";
6
+ import type { FormHTMLAttributes } from "react";
5
7
  import { forwardRef } from "react";
6
8
 
7
9
  export interface FlexProps extends MantineFlexProps {
10
+ /**
11
+ * Render as a `<form>` element.
12
+ * If `true`, renders as a plain form.
13
+ * If an object, spreads the form attributes (onSubmit, id, noValidate, etc.).
14
+ */
15
+ form?: boolean | FormHTMLAttributes<HTMLFormElement> | FormModel<any>;
8
16
  /**
9
17
  * flex: 1 — fill available space.
10
18
  */
@@ -69,6 +77,11 @@ export interface FlexProps extends MantineFlexProps {
69
77
  * Add a shadow to the container. The intensity will be determined by the current theme.
70
78
  */
71
79
  shadowed?: boolean | number | string;
80
+
81
+ /**
82
+ * Set overflow to "auto" to enable scrolling when content overflows the container.
83
+ */
84
+ overflow?: boolean;
72
85
  }
73
86
 
74
87
  const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
@@ -86,6 +99,8 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
86
99
  borderedTop,
87
100
  borderedBottom,
88
101
  shadowed,
102
+ overflow,
103
+ form,
89
104
  ...rest
90
105
  } = props;
91
106
 
@@ -145,6 +160,25 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
145
160
  `${rest.className ?? ""} shadow-${shadowed === true ? "md" : shadowed}`.trim();
146
161
  }
147
162
 
163
+ if (overflow) {
164
+ rest.className = `${rest.className ?? ""} overflow-auto`.trim();
165
+ }
166
+
167
+ if (form) {
168
+ let formProps: any = typeof form === "object" ? form : {};
169
+ if (formProps instanceof FormModel) {
170
+ formProps = formProps.props;
171
+ }
172
+ return (
173
+ <MantineFlex
174
+ ref={ref}
175
+ component={"form"}
176
+ {...(formProps as any)}
177
+ {...rest}
178
+ />
179
+ );
180
+ }
181
+
148
182
  return <MantineFlex ref={ref} {...rest} />;
149
183
  });
150
184
 
@@ -112,6 +112,9 @@ export interface ActionMenuConfig {
112
112
  export interface ActionCommonProps extends ButtonProps {
113
113
  children?: ReactNode;
114
114
 
115
+ /**
116
+ * If set, the button will show only the icon on smaller screens and reveal the text from the specified breakpoint and up.
117
+ */
115
118
  textVisibleFrom?: "xs" | "sm" | "md" | "lg" | "xl";
116
119
 
117
120
  /**
@@ -139,6 +142,9 @@ export interface ActionCommonProps extends ButtonProps {
139
142
  */
140
143
  icon?: ReactNode | ComponentType;
141
144
 
145
+ /**
146
+ * Size of the icon. Can be a number (pixels) or a string (e.g., "1em", "20px").
147
+ */
142
148
  iconSize?: number | string;
143
149
 
144
150
  /**
@@ -150,6 +156,11 @@ export interface ActionCommonProps extends ButtonProps {
150
156
  * Visual intent of the action button.
151
157
  */
152
158
  intent?: "primary" | "success" | "danger" | "warning" | "info" | "none";
159
+
160
+ /**
161
+ * Active state styling for navigation actions. When set, the button will apply active styles based on the current route.
162
+ */
163
+ variant?: ButtonProps["variant"] | "minimal";
153
164
  }
154
165
 
155
166
  export type ActionProps = ActionCommonProps &
@@ -163,85 +174,17 @@ export type ActionProps = ActionCommonProps &
163
174
 
164
175
  // ---------------------------------------------------------------------------------------------------------------------
165
176
 
166
- // Helper function to render menu items recursively
167
- const ActionMenuItem = (props: {
168
- item: ActionMenuItem;
169
- index: number;
170
- }): ReactNode => {
171
- const { item, index } = props;
172
-
173
- const router = useRouter();
174
- const action = useAction(
175
- {
176
- handler: async (e: any) => {
177
- await item.onClick?.();
178
- },
179
- },
180
- [item.onClick],
181
- );
182
-
183
- // Render divider
184
- if (item.type === "divider") {
185
- return <Menu.Divider key={index} />;
186
- }
187
-
188
- // Render label
189
- if (item.type === "label") {
190
- return <Menu.Label key={index}>{item.label}</Menu.Label>;
191
- }
192
-
193
- // Render submenu if it has children
194
- if (item.children && item.children.length > 0) {
195
- return (
196
- <Menu key={index} trigger="hover" position="right-start" offset={2}>
197
- <Menu.Target>
198
- <Menu.Item
199
- leftSection={item.icon}
200
- rightSection={<IconChevronRight size={14} />}
201
- >
202
- {item.label}
203
- </Menu.Item>
204
- </Menu.Target>
205
- <Menu.Dropdown>
206
- {item.children.map((child, childIndex) => (
207
- <ActionMenuItem item={child} index={childIndex} key={childIndex} />
208
- ))}
209
- </Menu.Dropdown>
210
- </Menu>
211
- );
212
- }
213
-
214
- const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
215
- if (props.item.onClick) {
216
- menuItemProps.onClick = action.run;
217
- } else if (props.item.href) {
218
- Object.assign(menuItemProps, router.anchor(props.item.href));
219
- }
220
-
221
- // render regular menu item
222
- return (
223
- <Menu.Item
224
- key={index}
225
- leftSection={
226
- item.icon ??
227
- (item.active ? (
228
- <IconCheck size={ui.sizes.icon.sm} />
229
- ) : (
230
- <Flex w={ui.sizes.icon.sm} />
231
- ))
232
- }
233
- onClick={item.onClick}
234
- color={item.color}
235
- {...menuItemProps}
236
- >
237
- {item.label}
238
- </Menu.Item>
239
- );
240
- };
177
+ // ---------------------------------------------------------------------------------------------------------------------
241
178
 
242
179
  const ActionButton = (_props: ActionProps) => {
243
180
  const theme = useMantineTheme();
244
181
  const props = { ..._props };
182
+
183
+ if (props.variant === "minimal") {
184
+ //props.variant = "default";
185
+ //props.bd = 0;
186
+ }
187
+
245
188
  const { tooltip, menu, icon, iconSize, ...restProps } = props;
246
189
 
247
190
  if (props.intent) {
@@ -298,7 +241,13 @@ const ActionButton = (_props: ActionProps) => {
298
241
  </ActionButton>
299
242
  </Flex>
300
243
  <Flex w={"100%"} hiddenFrom={textVisibleFrom}>
301
- <ActionButton px={"xs"} {...rest} tooltip={tooltip} menu={menu}>
244
+ <ActionButton
245
+ px={"xs"}
246
+ {...rest}
247
+ aria-label={typeof children === "string" ? children : undefined}
248
+ tooltip={tooltip}
249
+ menu={menu}
250
+ >
302
251
  {leftSection}
303
252
  </ActionButton>
304
253
  </Flex>
@@ -315,6 +264,7 @@ const ActionButton = (_props: ActionProps) => {
315
264
  </ActionHrefButton>
316
265
  );
317
266
  }
267
+
318
268
  return (
319
269
  <ActionNavigationButton {...restProps} href={restProps.href}>
320
270
  {restProps.children}
@@ -564,6 +514,7 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
564
514
  propsActive,
565
515
  routerGoOptions,
566
516
  onClick: propsOnClick,
517
+ anchorProps: buttonAnchorProps,
567
518
  anchor,
568
519
  ...buttonProps
569
520
  } = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
@@ -588,13 +539,13 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
588
539
  buttonProps.className = `${className} ${classNameActive}`.trim();
589
540
  }
590
541
 
591
- if (props.anchorProps || anchor) {
542
+ if (buttonAnchorProps || anchor) {
592
543
  return (
593
544
  <Anchor
594
545
  component={"a"}
595
546
  {...anchorProps}
596
547
  {...(buttonProps as AnchorProps)}
597
- {...props.anchorProps}
548
+ {...buttonAnchorProps}
598
549
  onClick={combinedOnClick}
599
550
  >
600
551
  {props.children}
@@ -639,3 +590,79 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
639
590
  };
640
591
 
641
592
  // ---------------------------------------------------------------------------------------------------------------------
593
+
594
+ // Helper function to render menu items recursively
595
+ const ActionMenuItem = (props: {
596
+ item: ActionMenuItem;
597
+ index: number;
598
+ }): ReactNode => {
599
+ const { item, index } = props;
600
+
601
+ const router = useRouter();
602
+ const action = useAction(
603
+ {
604
+ handler: async (e: any) => {
605
+ await item.onClick?.();
606
+ },
607
+ },
608
+ [item.onClick],
609
+ );
610
+
611
+ // Render divider
612
+ if (item.type === "divider") {
613
+ return <Menu.Divider key={index} />;
614
+ }
615
+
616
+ // Render label
617
+ if (item.type === "label") {
618
+ return <Menu.Label key={index}>{item.label}</Menu.Label>;
619
+ }
620
+
621
+ // Render submenu if it has children
622
+ if (item.children && item.children.length > 0) {
623
+ return (
624
+ <Menu key={index} trigger="hover" position="right-start" offset={2}>
625
+ <Menu.Target>
626
+ <Menu.Item
627
+ leftSection={item.icon}
628
+ rightSection={<IconChevronRight size={14} />}
629
+ >
630
+ {item.label}
631
+ </Menu.Item>
632
+ </Menu.Target>
633
+ <Menu.Dropdown>
634
+ {item.children.map((child, childIndex) => (
635
+ <ActionMenuItem item={child} index={childIndex} key={childIndex} />
636
+ ))}
637
+ </Menu.Dropdown>
638
+ </Menu>
639
+ );
640
+ }
641
+
642
+ const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
643
+ if (props.item.onClick) {
644
+ menuItemProps.onClick = action.run;
645
+ } else if (props.item.href) {
646
+ Object.assign(menuItemProps, router.anchor(props.item.href));
647
+ }
648
+
649
+ // render regular menu item
650
+ return (
651
+ <Menu.Item
652
+ key={index}
653
+ leftSection={
654
+ item.icon ??
655
+ (item.active ? (
656
+ <IconCheck size={ui.sizes.icon.sm} />
657
+ ) : (
658
+ <Flex w={ui.sizes.icon.sm} />
659
+ ))
660
+ }
661
+ onClick={item.onClick}
662
+ color={item.color}
663
+ {...menuItemProps}
664
+ >
665
+ {item.label}
666
+ </Menu.Item>
667
+ );
668
+ };
@@ -36,109 +36,115 @@ export interface DetailDrawerProps {
36
36
  defaultTab?: string;
37
37
  }
38
38
 
39
- const DetailDrawer = ({
40
- opened,
41
- onClose,
42
- title,
43
- subtitle,
44
- status,
45
- actions,
46
- tabs,
47
- children,
48
- loading,
49
- size = "xl",
50
- defaultTab,
51
- }: DetailDrawerProps) => (
52
- <Drawer
53
- opened={opened}
54
- onClose={onClose}
55
- position="right"
56
- size={size}
57
- withCloseButton={false}
58
- padding={0}
59
- >
60
- {/* Header */}
61
- <Flex
62
- p="md"
63
- justify="space-between"
64
- align="flex-start"
65
- style={{ borderBottom: "1px solid var(--mantine-color-default-border)" }}
39
+ const DetailDrawer = (props: DetailDrawerProps) => {
40
+ const {
41
+ opened,
42
+ onClose,
43
+ title,
44
+ subtitle,
45
+ status,
46
+ actions,
47
+ tabs,
48
+ children,
49
+ loading,
50
+ size = "xl",
51
+ defaultTab,
52
+ } = props;
53
+
54
+ return (
55
+ <Drawer
56
+ opened={opened}
57
+ onClose={onClose}
58
+ position="right"
59
+ size={size}
60
+ withCloseButton={false}
61
+ padding={0}
66
62
  >
67
- <Flex direction="column" gap={2} style={{ minWidth: 0, flex: 1 }}>
68
- <Flex gap="xs" align="center">
69
- {status && (
70
- <Flex
71
- w={8}
72
- h={8}
73
- style={{
74
- borderRadius: "50%",
75
- backgroundColor: status.active
76
- ? "var(--mantine-color-green-6)"
77
- : "var(--mantine-color-red-6)",
78
- flexShrink: 0,
79
- }}
80
- />
63
+ {/* Header */}
64
+ <Flex
65
+ p="md"
66
+ justify="space-between"
67
+ align="flex-start"
68
+ style={{
69
+ borderBottom: "1px solid var(--mantine-color-default-border)",
70
+ }}
71
+ >
72
+ <Flex direction="column" gap={2} style={{ minWidth: 0, flex: 1 }}>
73
+ <Flex gap="xs" align="center">
74
+ {status && (
75
+ <Flex
76
+ w={8}
77
+ h={8}
78
+ style={{
79
+ borderRadius: "50%",
80
+ backgroundColor: status.active
81
+ ? "var(--mantine-color-green-6)"
82
+ : "var(--mantine-color-red-6)",
83
+ flexShrink: 0,
84
+ }}
85
+ />
86
+ )}
87
+ <Text size="lg" fw={600} truncate>
88
+ {title}
89
+ </Text>
90
+ </Flex>
91
+ {subtitle && (
92
+ <Text size="sm" c="dimmed" truncate>
93
+ {subtitle}
94
+ </Text>
81
95
  )}
82
- <Text size="lg" fw={600} truncate>
83
- {title}
84
- </Text>
85
96
  </Flex>
86
- {subtitle && (
87
- <Text size="sm" c="dimmed" truncate>
88
- {subtitle}
89
- </Text>
90
- )}
91
- </Flex>
92
- <Flex gap="xs" align="center" style={{ flexShrink: 0 }}>
93
- {actions && actions.length > 0 && (
94
- <ActionButton
95
- variant="default"
96
- size="xs"
97
- menu={{
98
- items: actions,
99
- position: "bottom-end",
100
- width: 200,
101
- }}
102
- >
103
- Actions
97
+ <Flex gap="xs" align="center" style={{ flexShrink: 0 }}>
98
+ {actions && actions.length > 0 && (
99
+ <ActionButton
100
+ variant="default"
101
+ size="xs"
102
+ menu={{
103
+ items: actions,
104
+ position: "bottom-end",
105
+ width: 200,
106
+ }}
107
+ >
108
+ Actions
109
+ </ActionButton>
110
+ )}
111
+ <ActionButton variant="subtle" size="xs" c="dimmed" onClick={onClose}>
112
+ Close
104
113
  </ActionButton>
105
- )}
106
- <ActionButton variant="subtle" size="xs" c="dimmed" onClick={onClose}>
107
- Close
108
- </ActionButton>
114
+ </Flex>
109
115
  </Flex>
110
- </Flex>
111
116
 
112
- {/* Content */}
113
- {loading ? (
114
- <Flex flex={1} justify="center" align="center" py="xl">
115
- <Loader />
116
- </Flex>
117
- ) : tabs && tabs.length > 0 ? (
118
- <Tabs defaultValue={defaultTab || tabs[0].value}>
119
- <Tabs.List px="md">
117
+ {/* Content */}
118
+ {loading ? (
119
+ <Flex flex={1} justify="center" align="center" py="xl">
120
+ <Loader />
121
+ </Flex>
122
+ ) : tabs && tabs.length > 0 ? (
123
+ <Tabs defaultValue={defaultTab || tabs[0].value}>
124
+ <Tabs.List px="md">
125
+ {tabs.map((tab) => (
126
+ <Tabs.Tab
127
+ key={tab.value}
128
+ value={tab.value}
129
+ leftSection={tab.icon ? <tab.icon size={14} /> : undefined}
130
+ >
131
+ {tab.label}
132
+ </Tabs.Tab>
133
+ ))}
134
+ </Tabs.List>
120
135
  {tabs.map((tab) => (
121
- <Tabs.Tab
122
- key={tab.value}
123
- value={tab.value}
124
- leftSection={tab.icon ? <tab.icon size={14} /> : undefined}
125
- >
126
- {tab.label}
127
- </Tabs.Tab>
136
+ <Tabs.Panel key={tab.value} value={tab.value} p="md">
137
+ {tab.content}
138
+ </Tabs.Panel>
128
139
  ))}
129
- </Tabs.List>
130
- {tabs.map((tab) => (
131
- <Tabs.Panel key={tab.value} value={tab.value} p="md">
132
- {tab.content}
133
- </Tabs.Panel>
134
- ))}
135
- </Tabs>
136
- ) : (
137
- <Flex direction="column" p="md">
138
- {children}
139
- </Flex>
140
- )}
141
- </Drawer>
142
- );
140
+ </Tabs>
141
+ ) : (
142
+ <Flex direction="column" p="md">
143
+ {children}
144
+ </Flex>
145
+ )}
146
+ </Drawer>
147
+ );
148
+ };
143
149
 
144
150
  export default DetailDrawer;
@@ -14,7 +14,8 @@ export interface DetailListProps {
14
14
  columns?: number;
15
15
  }
16
16
 
17
- const DetailList = ({ items, columns = 1 }: DetailListProps) => {
17
+ const DetailList = (props: DetailListProps) => {
18
+ const { items, columns = 1 } = props;
18
19
  const visibleItems = items.filter((item) => !item.hidden);
19
20
 
20
21
  return (
@@ -36,7 +36,7 @@ const PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {
36
36
  required={options?.required}
37
37
  mb="md"
38
38
  />
39
- <Flex justify="flex-end">
39
+ <Flex justify="flex-end" gap={"xs"}>
40
40
  <Button variant="subtle" onClick={() => onSubmit(null)}>
41
41
  {options?.cancelLabel || "Cancel"}
42
42
  </Button>
@@ -34,12 +34,9 @@ export interface BreadcrumbProps extends FlexProps {
34
34
  * Pages should define a `label` in their `$page()` options for best results.
35
35
  * Falls back to the page name converted to Title Case.
36
36
  */
37
- const Breadcrumb = ({
38
- home = "Home",
39
- separator,
40
- size = "sm",
41
- ...groupProps
42
- }: BreadcrumbProps) => {
37
+ const Breadcrumbs = (props: BreadcrumbProps) => {
38
+ const { home = "Home", separator, size = "sm", ...groupProps } = props;
39
+
43
40
  const state = useRouterState();
44
41
  const router = useRouter();
45
42
 
@@ -88,4 +85,4 @@ const Breadcrumb = ({
88
85
  );
89
86
  };
90
87
 
91
- export default Breadcrumb;
88
+ export default Breadcrumbs;