@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
@@ -1,31 +1,17 @@
1
1
  import { ActionButton, Flex, Text } from "@alepha/ui";
2
- import { Collapse, ScrollArea, TextInput, UnstyledButton } from "@mantine/core";
3
- import {
4
- IconChevronDown,
5
- IconChevronRight,
6
- IconFolder,
7
- IconFolderOpen,
8
- IconRefresh,
9
- IconSearch,
10
- IconSettings,
11
- } from "@tabler/icons-react";
12
- import type { ParameterTreeNode } from "alepha/api/parameters";
13
- import { memo, useCallback, useMemo, useState } from "react";
14
-
15
- export interface ParameterTreeProps {
16
- treeData: ParameterTreeNode[];
17
- selectedConfig: string | null;
18
- onSelect: (name: string) => void;
19
- onRefresh: () => void;
20
- }
2
+ import { ScrollArea, TextInput } from "@mantine/core";
3
+ import { IconRefresh, IconSearch } from "@tabler/icons-react";
4
+ import type { ParameterTreeNode as ParameterTreeNodeData } from "alepha/api/parameters";
5
+ import { useCallback, useMemo, useState } from "react";
6
+ import ParameterTreeNode from "./ParameterTreeNode.tsx";
21
7
 
22
8
  /**
23
9
  * Filters tree nodes by search query.
24
10
  */
25
11
  const filterTree = (
26
- nodes: ParameterTreeNode[],
12
+ nodes: ParameterTreeNodeData[],
27
13
  query: string,
28
- ): ParameterTreeNode[] => {
14
+ ): ParameterTreeNodeData[] => {
29
15
  if (!query.trim()) return nodes;
30
16
 
31
17
  const lowerQuery = query.toLowerCase();
@@ -45,163 +31,16 @@ const filterTree = (
45
31
 
46
32
  return null;
47
33
  })
48
- .filter((node): node is ParameterTreeNode => node !== null);
34
+ .filter((node): node is ParameterTreeNodeData => node !== null);
49
35
  };
50
36
 
51
- interface TreeNodeProps {
52
- node: ParameterTreeNode;
53
- level: number;
54
- selectedConfig: string | null;
55
- onSelect: (name: string) => void;
56
- expandedNodes: Set<string>;
57
- onToggle: (path: string) => void;
58
- }
59
-
60
- /**
61
- * Memoized tree node to prevent unnecessary re-renders.
62
- */
63
- const TreeNode = memo(
64
- ({
65
- node,
66
- level,
67
- selectedConfig,
68
- onSelect,
69
- expandedNodes,
70
- onToggle,
71
- }: TreeNodeProps) => {
72
- const [isHovered, setIsHovered] = useState(false);
73
- const hasChildren = node.children.length > 0;
74
- const isExpanded = expandedNodes.has(node.path);
75
- const isSelected = selectedConfig === node.path;
76
- const isLeaf = !hasChildren;
77
-
78
- const handleClick = useCallback(() => {
79
- if (hasChildren) {
80
- onToggle(node.path);
81
- } else {
82
- onSelect(node.path);
83
- }
84
- }, [hasChildren, node.path, onToggle, onSelect]);
85
-
86
- const handleMouseEnter = useCallback(() => setIsHovered(true), []);
87
- const handleMouseLeave = useCallback(() => setIsHovered(false), []);
88
-
89
- return (
90
- <Flex>
91
- <UnstyledButton
92
- onClick={handleClick}
93
- onMouseEnter={handleMouseEnter}
94
- onMouseLeave={handleMouseLeave}
95
- w="100%"
96
- style={{ display: "block" }}
97
- >
98
- <Flex
99
- gap={6}
100
- wrap="nowrap"
101
- p="4px 8px"
102
- pl={8 + level * 16}
103
- style={{
104
- borderRadius: "var(--mantine-radius-sm)",
105
- backgroundColor:
106
- isSelected || isHovered
107
- ? "var(--mantine-color-default-hover)"
108
- : undefined,
109
- }}
110
- >
111
- {hasChildren ? (
112
- <>
113
- <Flex
114
- style={{
115
- display: "flex",
116
- alignItems: "center",
117
- justifyContent: "center",
118
- width: 16,
119
- }}
120
- >
121
- {isExpanded ? (
122
- <IconChevronDown
123
- size={14}
124
- color="var(--mantine-color-dimmed)"
125
- />
126
- ) : (
127
- <IconChevronRight
128
- size={14}
129
- color="var(--mantine-color-dimmed)"
130
- />
131
- )}
132
- </Flex>
133
- {isExpanded ? (
134
- <IconFolderOpen
135
- size={16}
136
- color="var(--mantine-color-dimmed)"
137
- style={{ flexShrink: 0 }}
138
- />
139
- ) : (
140
- <IconFolder
141
- size={16}
142
- color="var(--mantine-color-dimmed)"
143
- style={{ flexShrink: 0 }}
144
- />
145
- )}
146
- </>
147
- ) : (
148
- <>
149
- <Flex w={16} />
150
- <IconSettings
151
- size={16}
152
- color={
153
- isSelected
154
- ? "var(--mantine-color-blue-6)"
155
- : "var(--mantine-color-dimmed)"
156
- }
157
- style={{ flexShrink: 0 }}
158
- />
159
- </>
160
- )}
161
- <Text
162
- size="sm"
163
- fw={isSelected ? 600 : 400}
164
- c={isSelected ? undefined : isLeaf ? undefined : "dimmed"}
165
- style={{
166
- whiteSpace: "nowrap",
167
- overflow: "hidden",
168
- textOverflow: "ellipsis",
169
- }}
170
- >
171
- {node.name}
172
- </Text>
173
- </Flex>
174
- </UnstyledButton>
175
-
176
- {hasChildren && (
177
- <Collapse in={isExpanded}>
178
- {node.children.map((child: ParameterTreeNode) => (
179
- <TreeNode
180
- key={child.path}
181
- node={child}
182
- level={level + 1}
183
- selectedConfig={selectedConfig}
184
- onSelect={onSelect}
185
- expandedNodes={expandedNodes}
186
- onToggle={onToggle}
187
- />
188
- ))}
189
- </Collapse>
190
- )}
191
- </Flex>
192
- );
193
- },
194
- );
195
-
196
- TreeNode.displayName = "TreeNode";
197
-
198
37
  /**
199
38
  * Collects all folder paths to expand by default.
200
39
  */
201
- const collectAllFolderPaths = (nodes: ParameterTreeNode[]): Set<string> => {
40
+ const collectAllFolderPaths = (nodes: ParameterTreeNodeData[]): Set<string> => {
202
41
  const paths = new Set<string>();
203
42
 
204
- const traverse = (nodeList: ParameterTreeNode[]) => {
43
+ const traverse = (nodeList: ParameterTreeNodeData[]) => {
205
44
  for (const node of nodeList) {
206
45
  if (node.children.length > 0) {
207
46
  paths.add(node.path);
@@ -214,21 +53,26 @@ const collectAllFolderPaths = (nodes: ParameterTreeNode[]): Set<string> => {
214
53
  return paths;
215
54
  };
216
55
 
217
- const ParameterTree = ({
218
- treeData,
219
- selectedConfig,
220
- onSelect,
221
- onRefresh,
222
- }: ParameterTreeProps) => {
56
+ interface Props {
57
+ treeData: ParameterTreeNodeData[];
58
+ selectedConfig: string | null;
59
+ onSelect: (name: string) => void;
60
+ onRefresh: () => void;
61
+ }
62
+
63
+ /**
64
+ * Parameter tree sidebar with search and refresh.
65
+ */
66
+ const ParameterTree = (props: Props) => {
223
67
  const [searchQuery, setSearchQuery] = useState("");
224
68
  const [expandedNodes, setExpandedNodes] = useState<Set<string>>(() =>
225
- collectAllFolderPaths(treeData),
69
+ collectAllFolderPaths(props.treeData),
226
70
  );
227
71
 
228
72
  // Filter tree by search query
229
73
  const filteredTreeData = useMemo(
230
- () => filterTree(treeData, searchQuery),
231
- [treeData, searchQuery],
74
+ () => filterTree(props.treeData, searchQuery),
75
+ [props.treeData, searchQuery],
232
76
  );
233
77
 
234
78
  const handleToggle = useCallback((path: string) => {
@@ -270,7 +114,7 @@ const ParameterTree = ({
270
114
  <ActionButton
271
115
  variant="subtle"
272
116
  size="compact-xs"
273
- onClick={onRefresh}
117
+ onClick={props.onRefresh}
274
118
  tooltip="Refresh"
275
119
  >
276
120
  <IconRefresh size={14} />
@@ -293,12 +137,12 @@ const ParameterTree = ({
293
137
  ) : (
294
138
  <Flex direction="column" gap={0} style={{ gap: 1 }}>
295
139
  {filteredTreeData.map((node) => (
296
- <TreeNode
140
+ <ParameterTreeNode
297
141
  key={node.path}
298
142
  node={node}
299
143
  level={0}
300
- selectedConfig={selectedConfig}
301
- onSelect={onSelect}
144
+ selectedConfig={props.selectedConfig}
145
+ onSelect={props.onSelect}
302
146
  expandedNodes={expandedNodes}
303
147
  onToggle={handleToggle}
304
148
  />
@@ -0,0 +1,151 @@
1
+ import { Flex, Text } from "@alepha/ui";
2
+ import { Collapse, UnstyledButton } from "@mantine/core";
3
+ import {
4
+ IconChevronDown,
5
+ IconChevronRight,
6
+ IconFolder,
7
+ IconFolderOpen,
8
+ IconSettings,
9
+ } from "@tabler/icons-react";
10
+ import type { ParameterTreeNode as ParameterTreeNodeData } from "alepha/api/parameters";
11
+ import { memo, useCallback, useState } from "react";
12
+
13
+ interface Props {
14
+ node: ParameterTreeNodeData;
15
+ level: number;
16
+ selectedConfig: string | null;
17
+ onSelect: (name: string) => void;
18
+ expandedNodes: Set<string>;
19
+ onToggle: (path: string) => void;
20
+ }
21
+
22
+ /**
23
+ * Memoized tree node to prevent unnecessary re-renders.
24
+ */
25
+ const ParameterTreeNode = memo((props: Props) => {
26
+ const [isHovered, setIsHovered] = useState(false);
27
+ const hasChildren = props.node.children.length > 0;
28
+ const isExpanded = props.expandedNodes.has(props.node.path);
29
+ const isSelected = props.selectedConfig === props.node.path;
30
+ const isLeaf = !hasChildren;
31
+
32
+ const handleClick = useCallback(() => {
33
+ if (hasChildren) {
34
+ props.onToggle(props.node.path);
35
+ } else {
36
+ props.onSelect(props.node.path);
37
+ }
38
+ }, [hasChildren, props.node.path, props.onToggle, props.onSelect]);
39
+
40
+ const handleMouseEnter = useCallback(() => setIsHovered(true), []);
41
+ const handleMouseLeave = useCallback(() => setIsHovered(false), []);
42
+
43
+ return (
44
+ <Flex>
45
+ <UnstyledButton
46
+ onClick={handleClick}
47
+ onMouseEnter={handleMouseEnter}
48
+ onMouseLeave={handleMouseLeave}
49
+ w="100%"
50
+ style={{ display: "block" }}
51
+ >
52
+ <Flex
53
+ gap={6}
54
+ wrap="nowrap"
55
+ p="4px 8px"
56
+ pl={8 + props.level * 16}
57
+ style={{
58
+ borderRadius: "var(--mantine-radius-sm)",
59
+ backgroundColor:
60
+ isSelected || isHovered
61
+ ? "var(--mantine-color-default-hover)"
62
+ : undefined,
63
+ }}
64
+ >
65
+ {hasChildren ? (
66
+ <>
67
+ <Flex
68
+ style={{
69
+ display: "flex",
70
+ alignItems: "center",
71
+ justifyContent: "center",
72
+ width: 16,
73
+ }}
74
+ >
75
+ {isExpanded ? (
76
+ <IconChevronDown
77
+ size={14}
78
+ color="var(--mantine-color-dimmed)"
79
+ />
80
+ ) : (
81
+ <IconChevronRight
82
+ size={14}
83
+ color="var(--mantine-color-dimmed)"
84
+ />
85
+ )}
86
+ </Flex>
87
+ {isExpanded ? (
88
+ <IconFolderOpen
89
+ size={16}
90
+ color="var(--mantine-color-dimmed)"
91
+ style={{ flexShrink: 0 }}
92
+ />
93
+ ) : (
94
+ <IconFolder
95
+ size={16}
96
+ color="var(--mantine-color-dimmed)"
97
+ style={{ flexShrink: 0 }}
98
+ />
99
+ )}
100
+ </>
101
+ ) : (
102
+ <>
103
+ <Flex w={16} />
104
+ <IconSettings
105
+ size={16}
106
+ color={
107
+ isSelected
108
+ ? "var(--mantine-color-blue-6)"
109
+ : "var(--mantine-color-dimmed)"
110
+ }
111
+ style={{ flexShrink: 0 }}
112
+ />
113
+ </>
114
+ )}
115
+ <Text
116
+ size="sm"
117
+ fw={isSelected ? 600 : 400}
118
+ c={isSelected ? undefined : isLeaf ? undefined : "dimmed"}
119
+ style={{
120
+ whiteSpace: "nowrap",
121
+ overflow: "hidden",
122
+ textOverflow: "ellipsis",
123
+ }}
124
+ >
125
+ {props.node.name}
126
+ </Text>
127
+ </Flex>
128
+ </UnstyledButton>
129
+
130
+ {hasChildren && (
131
+ <Collapse in={isExpanded}>
132
+ {props.node.children.map((child: ParameterTreeNodeData) => (
133
+ <ParameterTreeNode
134
+ key={child.path}
135
+ node={child}
136
+ level={props.level + 1}
137
+ selectedConfig={props.selectedConfig}
138
+ onSelect={props.onSelect}
139
+ expandedNodes={props.expandedNodes}
140
+ onToggle={props.onToggle}
141
+ />
142
+ ))}
143
+ </Collapse>
144
+ )}
145
+ </Flex>
146
+ );
147
+ });
148
+
149
+ ParameterTreeNode.displayName = "ParameterTreeNode";
150
+
151
+ export default ParameterTreeNode;
@@ -1,4 +1,12 @@
1
- import { ActionButton, DataTable, Flex, Text } from "@alepha/ui";
1
+ import {
2
+ ActionButton,
3
+ DataTable,
4
+ Flex,
5
+ Text,
6
+ useDialog,
7
+ useToast,
8
+ } from "@alepha/ui";
9
+ import { Badge } from "@mantine/core";
2
10
  import {
3
11
  IconDeviceDesktop,
4
12
  IconDeviceMobile,
@@ -15,53 +23,61 @@ import { useClient } from "alepha/react";
15
23
  import { useI18n } from "alepha/react/i18n";
16
24
  import { useRouter } from "alepha/react/router";
17
25
  import { useState } from "react";
18
- import type { AdminRouter } from "../../AdminRouter.ts";
26
+ import type { AdminRouter } from "../../AdminRouter.tsx";
19
27
 
20
28
  export interface AdminSessionsProps {
21
29
  userRealmName?: string;
22
30
  }
23
31
 
32
+ const filters = t.object({
33
+ userId: t.optional(
34
+ t.uuid({
35
+ $control: {
36
+ query: t.pick(sessions.schema, ["userId"]),
37
+ },
38
+ }),
39
+ ),
40
+ });
41
+
42
+ const getDeviceIcon = (device?: string) => {
43
+ switch (device) {
44
+ case "MOBILE":
45
+ return <IconDeviceMobile size={14} />;
46
+ case "TABLET":
47
+ return <IconDeviceTablet size={14} />;
48
+ default:
49
+ return <IconDeviceDesktop size={14} />;
50
+ }
51
+ };
52
+
53
+ const isExpired = (expiresAt: Date | string) =>
54
+ new Date(expiresAt) < new Date();
55
+
24
56
  const AdminSessions = (props: AdminSessionsProps) => {
25
57
  const client = useClient<AdminSessionController>();
26
58
  const router = useRouter<AdminRouter>();
27
59
  const { l } = useI18n();
60
+ const dialog = useDialog();
61
+ const toast = useToast();
28
62
  const [refreshKey, setRefreshKey] = useState(0);
29
63
 
30
- const filters = t.object({
31
- userId: t.optional(
32
- t.uuid({
33
- $control: {
34
- query: t.pick(sessions.schema, ["userId"]),
35
- },
36
- }),
37
- ),
38
- });
39
-
40
- const getDeviceIcon = (device?: string) => {
41
- switch (device) {
42
- case "MOBILE":
43
- return <IconDeviceMobile size={14} />;
44
- case "TABLET":
45
- return <IconDeviceTablet size={14} />;
46
- default:
47
- return <IconDeviceDesktop size={14} />;
48
- }
49
- };
50
-
51
- const isExpired = (expiresAt: Date | string) => {
52
- return new Date(expiresAt) < new Date();
53
- };
54
-
55
- const handleDelete = async (sessionId: string) => {
64
+ const handleDelete = async (session: SessionEntity) => {
65
+ const confirmed = await dialog.confirm({
66
+ title: "Revoke session",
67
+ message:
68
+ "Are you sure you want to revoke this session? The user will be signed out.",
69
+ });
70
+ if (!confirmed) return;
56
71
  await client.deleteSession({
57
- params: { id: sessionId },
72
+ params: { id: session.id },
58
73
  query: { userRealmName: props.userRealmName },
59
74
  });
75
+ toast.success("Session revoked");
60
76
  setRefreshKey((k) => k + 1);
61
77
  };
62
78
 
63
79
  return (
64
- <Flex flex={1} direction="column">
80
+ <Flex p="md" flex={1} direction="column">
65
81
  <DataTable<SessionEntity, typeof filters>
66
82
  key={refreshKey}
67
83
  submitOnInit
@@ -74,20 +90,13 @@ const AdminSessions = (props: AdminSessionsProps) => {
74
90
  horizontalSpacing: "xs",
75
91
  verticalSpacing: "xs",
76
92
  }}
77
- onFilterChange={(key, _value, form) => {
78
- if (key === "userId") {
79
- return form.submit();
80
- }
81
- }}
93
+ onFilterChange={(_key, _value, form) => form.submit()}
82
94
  filters={filters}
83
- tableTrProps={(item) => {
84
- if (isExpired(item.expiresAt)) {
85
- return {
86
- opacity: 0.5,
87
- };
88
- }
89
- return {};
90
- }}
95
+ tableTrProps={(item) => ({
96
+ style: {
97
+ opacity: isExpired(item.expiresAt) ? 0.5 : 1,
98
+ },
99
+ })}
91
100
  items={async (filters) => {
92
101
  const response = await client.findSessions({
93
102
  query: {
@@ -95,7 +104,6 @@ const AdminSessions = (props: AdminSessionsProps) => {
95
104
  userRealmName: props.userRealmName,
96
105
  },
97
106
  });
98
-
99
107
  return response as Page<SessionEntity>;
100
108
  }}
101
109
  columns={{
@@ -117,7 +125,6 @@ const AdminSessions = (props: AdminSessionsProps) => {
117
125
  },
118
126
  userAgent: {
119
127
  label: "Device",
120
- fit: true,
121
128
  value: (item) => (
122
129
  <Flex gap={4} align="center">
123
130
  {item.userAgent ? (
@@ -128,8 +135,8 @@ const AdminSessions = (props: AdminSessionsProps) => {
128
135
  </Text>
129
136
  </>
130
137
  ) : (
131
- <Text size="xs" c="dimmed">
132
- -
138
+ <Text size="xs" muted>
139
+
133
140
  </Text>
134
141
  )}
135
142
  </Flex>
@@ -137,49 +144,42 @@ const AdminSessions = (props: AdminSessionsProps) => {
137
144
  },
138
145
  ip: {
139
146
  label: "IP",
140
- fit: true,
141
147
  value: (item) => (
142
- <Text size="xs" ff="monospace" c="dimmed">
143
- {item.ip || "-"}
148
+ <Text size="xs" ff="monospace" muted>
149
+ {item.ip || ""}
144
150
  </Text>
145
151
  ),
146
152
  },
147
153
  expiresAt: {
148
154
  label: "Status",
149
- fit: true,
150
155
  value: (item) => (
151
- <Text
152
- size="xs"
153
- c={isExpired(item.expiresAt) ? "dimmed" : undefined}
156
+ <Badge
157
+ size="sm"
158
+ variant="light"
159
+ color={isExpired(item.expiresAt) ? "gray" : "green"}
154
160
  >
155
161
  {isExpired(item.expiresAt) ? "Expired" : "Active"}
156
- </Text>
162
+ </Badge>
157
163
  ),
158
164
  },
159
165
  createdAt: {
160
166
  label: "Created",
161
- fit: true,
162
167
  value: (item) => (
163
- <Text size="xs" c="dimmed">
168
+ <Text size="xs" muted>
164
169
  {l(item.createdAt, { date: "fromNow" })}
165
170
  </Text>
166
171
  ),
167
172
  },
168
- actions: {
169
- label: "",
170
- fit: true,
171
- value: (item) => (
172
- <ActionButton
173
- size="xs"
174
- variant="subtle"
175
- color="red"
176
- onClick={() => handleDelete(item.id)}
177
- >
178
- <IconTrash size={14} />
179
- </ActionButton>
180
- ),
181
- },
182
173
  }}
174
+ rowActions={(item) => [
175
+ {
176
+ label: "Revoke session",
177
+ icon: IconTrash,
178
+ color: "red",
179
+ onClick: () => handleDelete(item),
180
+ visible: !isExpired(item.expiresAt),
181
+ },
182
+ ]}
183
183
  />
184
184
  </Flex>
185
185
  );
@@ -14,8 +14,8 @@ import {
14
14
  IconChevronLeft,
15
15
  IconExternalLink,
16
16
  } from "@tabler/icons-react";
17
- import { useRouter } from "alepha/react/router";
18
17
  import type { ComponentType, ReactNode } from "react";
18
+ import AdminResourceHeaderMenuItem from "./AdminResourceHeaderMenuItem.tsx";
19
19
 
20
20
  export interface AdminResourceAction {
21
21
  label: string;
@@ -107,29 +107,6 @@ export interface AdminResourceHeaderProps {
107
107
  loading?: boolean;
108
108
  }
109
109
 
110
- const ActionMenuItem = (props: { action: AdminResourceAction }) => {
111
- const { action } = props;
112
- const router = useRouter();
113
-
114
- const menuItemProps: Record<string, unknown> = {};
115
- if (action.href) {
116
- Object.assign(menuItemProps, router.anchor(action.href));
117
- } else if (action.onClick) {
118
- menuItemProps.onClick = action.onClick;
119
- }
120
-
121
- return (
122
- <Menu.Item
123
- leftSection={action.icon ? <action.icon size={16} /> : undefined}
124
- color={action.color}
125
- disabled={action.disabled}
126
- {...menuItemProps}
127
- >
128
- {action.label}
129
- </Menu.Item>
130
- );
131
- };
132
-
133
110
  const AdminResourceHeader = (props: AdminResourceHeaderProps) => {
134
111
  const {
135
112
  backHref,
@@ -271,7 +248,7 @@ const AdminResourceHeader = (props: AdminResourceHeaderProps) => {
271
248
  </Menu.Target>
272
249
  <Menu.Dropdown>
273
250
  {menuActions.map((action, index) => (
274
- <ActionMenuItem key={index} action={action} />
251
+ <AdminResourceHeaderMenuItem key={index} action={action} />
275
252
  ))}
276
253
  </Menu.Dropdown>
277
254
  </Menu>