@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,519 @@
1
+ import type { DetailListItem } from "@alepha/ui";
2
+ import {
3
+ ActionButton,
4
+ DataTable,
5
+ DetailList,
6
+ Flex,
7
+ Text,
8
+ useToast,
9
+ } from "@alepha/ui";
10
+ import { Badge, Code, Paper } from "@mantine/core";
11
+ import { IconRefresh } from "@tabler/icons-react";
12
+ import { type Page, t } from "alepha";
13
+ import type {
14
+ AdminNotificationController,
15
+ NotificationDetailResource,
16
+ NotificationResource,
17
+ } from "alepha/api/notifications";
18
+ import type { LogEntry } from "alepha/logger";
19
+ import { useClient } from "alepha/react";
20
+ import { useI18n } from "alepha/react/i18n";
21
+ import { useCallback, useEffect, useState } from "react";
22
+
23
+ // ─────────────────────────────────────────────────────────────────────────────
24
+
25
+ const formatDuration = (
26
+ start: Date | string,
27
+ end?: Date | string | null,
28
+ ): string => {
29
+ const startTime = new Date(start).getTime();
30
+ const endTime = end ? new Date(end).getTime() : Date.now();
31
+ const duration = endTime - startTime;
32
+
33
+ if (duration < 1000) return `${duration}ms`;
34
+ if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;
35
+ if (duration < 3600000)
36
+ return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;
37
+ return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;
38
+ };
39
+
40
+ // ─────────────────────────────────────────────────────────────────────────────
41
+
42
+ const notificationFilters = t.object({
43
+ status: t.optional(
44
+ t.enum([
45
+ "pending",
46
+ "scheduled",
47
+ "retrying",
48
+ "running",
49
+ "completed",
50
+ "failed",
51
+ "dead",
52
+ "cancelled",
53
+ ]),
54
+ ),
55
+ });
56
+
57
+ // ─────────────────────────────────────────────────────────────────────────────
58
+
59
+ const AdminNotifications = () => {
60
+ const client = useClient<AdminNotificationController>();
61
+ const { l } = useI18n();
62
+
63
+ return (
64
+ <Flex p="md" flex={1} direction="column" gap="md">
65
+ <DataTable<NotificationResource, typeof notificationFilters>
66
+ submitOnInit
67
+ defaultSize={20}
68
+ typeFormProps={{
69
+ skipSubmitButton: true,
70
+ columns: 3,
71
+ }}
72
+ tableProps={{
73
+ horizontalSpacing: "sm",
74
+ verticalSpacing: "sm",
75
+ }}
76
+ onFilterChange={(_key, _value, form) => form.submit()}
77
+ filters={notificationFilters}
78
+ defaultFilters={["status"]}
79
+ items={async (filters) => {
80
+ const response = await client.findNotifications({
81
+ query: { ...filters },
82
+ });
83
+ return response as Page<NotificationResource>;
84
+ }}
85
+ columns={{
86
+ status: {
87
+ label: "Status",
88
+ value: (item) => {
89
+ const color =
90
+ item.status === "completed"
91
+ ? "green"
92
+ : item.status === "running"
93
+ ? "blue"
94
+ : item.status === "failed" || item.status === "dead"
95
+ ? "red"
96
+ : item.status === "cancelled"
97
+ ? "yellow"
98
+ : "gray";
99
+ return (
100
+ <Badge size="sm" variant="light" color={color}>
101
+ {item.status}
102
+ </Badge>
103
+ );
104
+ },
105
+ },
106
+ template: {
107
+ label: "Template",
108
+ value: (item) => (
109
+ <Text size="sm" fw={500} ff="monospace">
110
+ {item.template ?? "\u2014"}
111
+ </Text>
112
+ ),
113
+ },
114
+ type: {
115
+ label: "Type",
116
+ value: (item) => (
117
+ <Badge
118
+ size="sm"
119
+ variant="light"
120
+ color={item.type === "email" ? "blue" : "teal"}
121
+ >
122
+ {item.type ?? "\u2014"}
123
+ </Badge>
124
+ ),
125
+ },
126
+ contact: {
127
+ label: "Contact",
128
+ value: (item) => (
129
+ <Text size="xs" c="dimmed" lineClamp={1}>
130
+ {item.contact ?? "\u2014"}
131
+ </Text>
132
+ ),
133
+ },
134
+ category: {
135
+ label: "Category",
136
+ defaultHidden: true,
137
+ value: (item) => (
138
+ <Text size="xs" c="dimmed">
139
+ {item.category ?? "\u2014"}
140
+ </Text>
141
+ ),
142
+ },
143
+ flags: {
144
+ label: "Flags",
145
+ defaultHidden: true,
146
+ value: (item) => (
147
+ <Flex gap={4}>
148
+ {item.critical && (
149
+ <Badge size="xs" variant="light" color="red">
150
+ critical
151
+ </Badge>
152
+ )}
153
+ {item.sensitive && (
154
+ <Badge size="xs" variant="light" color="orange">
155
+ sensitive
156
+ </Badge>
157
+ )}
158
+ {!item.critical && !item.sensitive && (
159
+ <Text size="xs" c="dimmed">
160
+ {"\u2014"}
161
+ </Text>
162
+ )}
163
+ </Flex>
164
+ ),
165
+ },
166
+ createdAt: {
167
+ label: "Created",
168
+ value: (item) => (
169
+ <Text size="xs" c="dimmed">
170
+ {l(item.createdAt, { date: "fromNow" })}
171
+ </Text>
172
+ ),
173
+ },
174
+ duration: {
175
+ label: "Duration",
176
+ defaultHidden: true,
177
+ value: (item) => (
178
+ <Text size="xs" c="dimmed" ff="monospace">
179
+ {item.startedAt &&
180
+ (item.completedAt || item.status === "running")
181
+ ? formatDuration(item.startedAt, item.completedAt)
182
+ : "\u2014"}
183
+ </Text>
184
+ ),
185
+ },
186
+ error: {
187
+ label: "Error",
188
+ defaultHidden: true,
189
+ value: (item) => (
190
+ <Text size="xs" c="dimmed" lineClamp={1}>
191
+ {item.error ?? "\u2014"}
192
+ </Text>
193
+ ),
194
+ },
195
+ }}
196
+ panel={{
197
+ can: (item) => Boolean(item.error),
198
+ render: (item) => (
199
+ <Flex direction="column" gap="sm" p="sm">
200
+ {item.error && (
201
+ <Flex direction="column" gap={2}>
202
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
203
+ Error
204
+ </Text>
205
+ <Paper p="xs" radius="sm" withBorder>
206
+ <Text
207
+ size="sm"
208
+ style={{
209
+ whiteSpace: "pre-wrap",
210
+ wordBreak: "break-word",
211
+ }}
212
+ >
213
+ {item.error}
214
+ </Text>
215
+ </Paper>
216
+ </Flex>
217
+ )}
218
+ </Flex>
219
+ ),
220
+ }}
221
+ drawer={(item) => <NotificationDetailContent item={item} />}
222
+ />
223
+ </Flex>
224
+ );
225
+ };
226
+
227
+ // ─────────────────────────────────────────────────────────────────────────────
228
+
229
+ const NotificationDetailContent = ({
230
+ item,
231
+ }: {
232
+ item: NotificationResource;
233
+ }) => {
234
+ const client = useClient<AdminNotificationController>();
235
+ const { l } = useI18n();
236
+ const toast = useToast();
237
+ const [detail, setDetail] = useState<NotificationDetailResource | null>(null);
238
+ const [loading, setLoading] = useState(false);
239
+
240
+ const loadDetail = useCallback(
241
+ async (id: string) => {
242
+ setDetail(null);
243
+ setLoading(true);
244
+ try {
245
+ const data = await client.getNotification({ params: { id } });
246
+ setDetail(data);
247
+ } catch {
248
+ toast.danger("Failed to load notification details");
249
+ } finally {
250
+ setLoading(false);
251
+ }
252
+ },
253
+ [client, toast],
254
+ );
255
+
256
+ useEffect(() => {
257
+ loadDetail(item.id);
258
+ }, [item.id, loadDetail]);
259
+
260
+ if (loading) {
261
+ return (
262
+ <Flex align="center" justify="center" py="xl">
263
+ <Text c="dimmed">Loading...</Text>
264
+ </Flex>
265
+ );
266
+ }
267
+
268
+ if (!detail) return null;
269
+
270
+ const rendered = detail.rendered as Record<string, unknown> | undefined;
271
+
272
+ const detailItems: DetailListItem[] = [
273
+ {
274
+ label: "ID",
275
+ value: (
276
+ <Text size="sm" ff="monospace">
277
+ {detail.id}
278
+ </Text>
279
+ ),
280
+ copyable: detail.id,
281
+ },
282
+ {
283
+ label: "Status",
284
+ value: (
285
+ <Text size="sm" tt="capitalize">
286
+ {detail.status}
287
+ </Text>
288
+ ),
289
+ },
290
+ {
291
+ label: "Template",
292
+ value: (
293
+ <Text size="sm" ff="monospace">
294
+ {detail.template}
295
+ </Text>
296
+ ),
297
+ },
298
+ {
299
+ label: "Type",
300
+ value: (
301
+ <Badge
302
+ size="sm"
303
+ variant="light"
304
+ color={detail.type === "email" ? "blue" : "teal"}
305
+ >
306
+ {detail.type}
307
+ </Badge>
308
+ ),
309
+ },
310
+ {
311
+ label: "Contact",
312
+ value: detail.contact,
313
+ },
314
+ {
315
+ label: "Category",
316
+ value: detail.category,
317
+ hidden: !detail.category,
318
+ },
319
+ {
320
+ label: "Critical",
321
+ value: detail.critical ? "Yes" : "No",
322
+ hidden: !detail.critical,
323
+ },
324
+ {
325
+ label: "Sensitive",
326
+ value: detail.sensitive ? "Yes" : "No",
327
+ hidden: !detail.sensitive,
328
+ },
329
+ {
330
+ label: "Created",
331
+ value: String(l(detail.createdAt, { date: "lll" })),
332
+ },
333
+ {
334
+ label: "Started",
335
+ value: detail.startedAt
336
+ ? String(l(detail.startedAt, { date: "lll" }))
337
+ : undefined,
338
+ hidden: !detail.startedAt,
339
+ },
340
+ {
341
+ label: "Duration",
342
+ value:
343
+ detail.startedAt &&
344
+ (detail.completedAt || detail.status === "running") ? (
345
+ <Text size="sm" ff="monospace">
346
+ {formatDuration(detail.startedAt, detail.completedAt)}
347
+ </Text>
348
+ ) : undefined,
349
+ hidden: !(
350
+ detail.startedAt &&
351
+ (detail.completedAt || detail.status === "running")
352
+ ),
353
+ },
354
+ ];
355
+
356
+ return (
357
+ <Flex direction="column" gap="md">
358
+ {/* Header */}
359
+ <Flex align="center" gap="sm">
360
+ <Text fw={600} ff="monospace">
361
+ {detail.template}
362
+ </Text>
363
+ <Badge
364
+ size="sm"
365
+ variant="light"
366
+ color={detail.type === "email" ? "blue" : "teal"}
367
+ >
368
+ {detail.type}
369
+ </Badge>
370
+ <Text size="sm" tt="capitalize" c="dimmed">
371
+ {detail.status}
372
+ </Text>
373
+ </Flex>
374
+
375
+ {/* Actions */}
376
+ <Flex gap="xs">
377
+ <ActionButton
378
+ tooltip="Refresh"
379
+ variant="light"
380
+ size="xs"
381
+ icon={IconRefresh}
382
+ onClick={() => loadDetail(item.id)}
383
+ />
384
+ </Flex>
385
+
386
+ {/* Details */}
387
+ <Paper p="sm" radius="md" withBorder>
388
+ <Text size="sm" fw={600} mb="xs">
389
+ Details
390
+ </Text>
391
+ <DetailList items={detailItems} columns={2} />
392
+ </Paper>
393
+
394
+ {/* Rendered Content */}
395
+ {rendered && (
396
+ <Paper p="sm" radius="md" withBorder>
397
+ <Text size="sm" fw={600} mb="xs">
398
+ Content
399
+ </Text>
400
+ {rendered.type === "email" && (
401
+ <Flex direction="column" gap="xs">
402
+ <Flex direction="column" gap={2}>
403
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
404
+ To
405
+ </Text>
406
+ <Text size="sm">{String(rendered.to ?? "")}</Text>
407
+ </Flex>
408
+ <Flex direction="column" gap={2}>
409
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
410
+ Subject
411
+ </Text>
412
+ <Text size="sm">{String(rendered.subject ?? "")}</Text>
413
+ </Flex>
414
+ <Flex direction="column" gap={2}>
415
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
416
+ Body
417
+ </Text>
418
+ <Paper p="xs" radius="sm" withBorder>
419
+ <Text
420
+ size="sm"
421
+ style={{
422
+ whiteSpace: "pre-wrap",
423
+ wordBreak: "break-word",
424
+ }}
425
+ >
426
+ {String(rendered.body ?? "")}
427
+ </Text>
428
+ </Paper>
429
+ </Flex>
430
+ </Flex>
431
+ )}
432
+ {rendered.type === "sms" && (
433
+ <Flex direction="column" gap="xs">
434
+ <Flex direction="column" gap={2}>
435
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
436
+ To
437
+ </Text>
438
+ <Text size="sm">{String(rendered.to ?? "")}</Text>
439
+ </Flex>
440
+ <Flex direction="column" gap={2}>
441
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
442
+ Message
443
+ </Text>
444
+ <Paper p="xs" radius="sm" withBorder>
445
+ <Text
446
+ size="sm"
447
+ style={{
448
+ whiteSpace: "pre-wrap",
449
+ wordBreak: "break-word",
450
+ }}
451
+ >
452
+ {String(rendered.message ?? "")}
453
+ </Text>
454
+ </Paper>
455
+ </Flex>
456
+ </Flex>
457
+ )}
458
+ </Paper>
459
+ )}
460
+
461
+ {/* Variables */}
462
+ {detail.variables && Object.keys(detail.variables).length > 0 && (
463
+ <Paper p="sm" radius="md" withBorder>
464
+ <Text size="sm" fw={600} mb="xs">
465
+ Variables
466
+ </Text>
467
+ <Code block>{JSON.stringify(detail.variables, null, 2)}</Code>
468
+ </Paper>
469
+ )}
470
+
471
+ {/* Error */}
472
+ {detail.error && (
473
+ <Paper p="sm" radius="md" withBorder>
474
+ <Text size="sm" fw={600} mb="xs">
475
+ Error
476
+ </Text>
477
+ <Paper p="xs" radius="sm" withBorder>
478
+ <Text
479
+ size="sm"
480
+ style={{
481
+ whiteSpace: "pre-wrap",
482
+ wordBreak: "break-word",
483
+ }}
484
+ >
485
+ {detail.error}
486
+ </Text>
487
+ </Paper>
488
+ </Paper>
489
+ )}
490
+
491
+ {/* Logs */}
492
+ {detail.logs && detail.logs.length > 0 && (
493
+ <Paper p="sm" radius="md" withBorder>
494
+ <Text size="sm" fw={600} mb="xs">
495
+ Logs ({detail.logs.length})
496
+ </Text>
497
+ <Flex
498
+ direction="column"
499
+ style={{ maxHeight: 300, overflowY: "auto" }}
500
+ >
501
+ {detail.logs.map((log: LogEntry, i: number) => (
502
+ <Flex key={i} gap="sm" py={2}>
503
+ <Badge size="xs" variant="default">
504
+ {log.level}
505
+ </Badge>
506
+ <Text size="xs" c="dimmed" ff="monospace">
507
+ {new Date(log.timestamp).toLocaleTimeString()}
508
+ </Text>
509
+ <Text size="xs">{log.message}</Text>
510
+ </Flex>
511
+ ))}
512
+ </Flex>
513
+ </Paper>
514
+ )}
515
+ </Flex>
516
+ );
517
+ };
518
+
519
+ export default AdminNotifications;