@alepha/ui 0.17.2 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/dist/admin/{AdminApiKeys-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
  2. package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
  4. package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
  5. package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
  6. package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
  7. package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
  8. package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
  10. package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
  11. package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
  12. package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
  13. package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
  14. package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
  15. package/dist/admin/{AdminParameters-DCGbpt2c.js → AdminParameters-DHw9ATgl.js} +53 -53
  16. package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
  17. package/dist/admin/{AdminSessions-DyhW6RZv.js → AdminSessions-BhGJPI3z.js} +11 -18
  18. package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
  19. package/dist/admin/{AdminUserLayout-CrBj4UuI.js → AdminUserLayout-BdC4Te8m.js} +112 -151
  20. package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
  21. package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
  22. package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
  23. package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
  24. package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
  25. package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
  26. package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
  27. package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
  28. package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
  29. package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
  30. package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
  31. package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
  32. package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
  33. package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
  34. package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
  35. package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
  36. package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
  37. package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
  38. package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
  39. package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
  40. package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
  41. package/dist/admin/auth-Dr0Cf8I7.js +319 -0
  42. package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
  43. package/dist/admin/core-2xoLiT0o.js +4031 -0
  44. package/dist/admin/core-2xoLiT0o.js.map +1 -0
  45. package/dist/admin/index.d.ts +739 -13
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +79 -111
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
  50. package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
  51. package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
  52. package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
  53. package/dist/auth/Login-Denw_UGy.js.map +1 -0
  54. package/dist/auth/Profile-BMX_Ar_s.js +155 -0
  55. package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
  56. package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
  57. package/dist/auth/Register-6hi_cpfF.js.map +1 -0
  58. package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
  59. package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
  60. package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
  61. package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
  62. package/dist/auth/core-niW0sFLv.js +2264 -0
  63. package/dist/auth/core-niW0sFLv.js.map +1 -0
  64. package/dist/auth/index.d.ts +336 -8
  65. package/dist/auth/index.d.ts.map +1 -1
  66. package/dist/auth/index.js +18 -22
  67. package/dist/auth/index.js.map +1 -1
  68. package/dist/core/index.d.ts +1033 -843
  69. package/dist/core/index.d.ts.map +1 -1
  70. package/dist/core/index.js +1626 -1354
  71. package/dist/core/index.js.map +1 -1
  72. package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
  73. package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
  74. package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
  75. package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
  76. package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
  77. package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
  78. package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
  79. package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
  80. package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
  81. package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
  82. package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
  83. package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
  84. package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
  85. package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
  86. package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
  87. package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
  88. package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
  89. package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
  90. package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
  91. package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
  92. package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
  93. package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
  94. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
  95. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
  96. package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
  97. package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
  98. package/dist/demo/DemoText-CzXuUn3g.js +124 -0
  99. package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
  100. package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
  101. package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
  102. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
  103. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
  104. package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
  105. package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
  106. package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
  107. package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
  108. package/dist/demo/Login-hSOU3jZc.js +219 -0
  109. package/dist/demo/Login-hSOU3jZc.js.map +1 -0
  110. package/dist/demo/Profile-CWqti7FB.js +155 -0
  111. package/dist/demo/Profile-CWqti7FB.js.map +1 -0
  112. package/dist/demo/Register-a70LPgs2.js +375 -0
  113. package/dist/demo/Register-a70LPgs2.js.map +1 -0
  114. package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
  115. package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
  116. package/dist/demo/Showcase-Dq3MISpd.js +232 -0
  117. package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
  118. package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
  119. package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
  120. package/dist/demo/auth-d6n3xbug.js +257 -0
  121. package/dist/demo/auth-d6n3xbug.js.map +1 -0
  122. package/dist/demo/core-RCUw1Q-a.js +4217 -0
  123. package/dist/demo/core-RCUw1Q-a.js.map +1 -0
  124. package/dist/demo/index.d.ts +17 -6
  125. package/dist/demo/index.d.ts.map +1 -1
  126. package/dist/demo/index.js +92 -24
  127. package/dist/demo/index.js.map +1 -1
  128. package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
  129. package/package.json +16 -20
  130. package/src/admin/AdminRouter.ts +10 -39
  131. package/src/admin/components/AdminLayout.tsx +42 -10
  132. package/src/admin/components/audits/AdminAudits.tsx +10 -64
  133. package/src/admin/components/files/AdminFiles.tsx +2 -3
  134. package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
  135. package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
  136. package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
  137. package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
  138. package/src/admin/components/parameters/AdminParameters.tsx +4 -4
  139. package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
  140. package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
  141. package/src/admin/components/parameters/ParameterTree.tsx +2 -8
  142. package/src/admin/components/parameters/types.ts +3 -3
  143. package/src/admin/components/sessions/AdminSessions.tsx +8 -16
  144. package/src/admin/components/users/AdminUserLayout.tsx +113 -150
  145. package/src/admin/components/users/AdminUserProfile.tsx +50 -0
  146. package/src/admin/components/users/AdminUserSessions.tsx +106 -126
  147. package/src/admin/components/users/AdminUsers.tsx +46 -62
  148. package/src/admin/index.ts +0 -4
  149. package/src/auth/components/buttons/UserButton.tsx +1 -1
  150. package/src/auth/index.ts +0 -4
  151. package/src/core/UiRouter.ts +1 -1
  152. package/src/core/atoms/alephaSidebarAtom.ts +7 -31
  153. package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
  154. package/src/core/components/Flex.tsx +63 -0
  155. package/src/core/components/Heading.tsx +19 -0
  156. package/src/core/components/Text.tsx +140 -0
  157. package/src/core/components/buttons/ActionButton.tsx +12 -1
  158. package/src/core/components/buttons/BurgerButton.tsx +3 -3
  159. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  160. package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
  161. package/src/core/components/data/DetailDrawer.tsx +144 -0
  162. package/src/core/components/data/DetailList.tsx +64 -0
  163. package/src/core/components/data/StatCards.tsx +50 -0
  164. package/src/core/components/layout/AppBar.tsx +11 -10
  165. package/src/core/components/layout/Breadcrumb.tsx +8 -8
  166. package/src/core/components/layout/Container.tsx +15 -0
  167. package/src/core/components/layout/DashboardShell.tsx +23 -238
  168. package/src/core/components/layout/Omnibar.tsx +1 -2
  169. package/src/core/components/layout/Sidebar.tsx +103 -71
  170. package/src/core/components/layout/index.ts +65 -0
  171. package/src/core/{components/form → form/components}/Control.tsx +32 -14
  172. package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
  173. package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
  174. package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
  175. package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
  176. package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
  177. package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
  178. package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
  179. package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
  180. package/src/core/form/factories/dialogForm.tsx +31 -0
  181. package/src/core/form/index.ts +23 -0
  182. package/src/core/{utils → form/utils}/parseInput.ts +2 -4
  183. package/src/core/index.ts +43 -51
  184. package/src/core/interfaces/AlephaIntent.ts +6 -0
  185. package/src/core/interfaces/AlephaTheme.ts +0 -1
  186. package/src/core/json/factories/dialogJson.tsx +24 -0
  187. package/src/core/json/index.ts +2 -0
  188. package/src/core/primitives/$ui.ts +17 -0
  189. package/src/core/services/DialogService.tsx +1 -48
  190. package/src/core/styles.css +1 -8
  191. package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
  192. package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
  193. package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
  194. package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
  195. package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
  196. package/src/core/table/index.ts +12 -0
  197. package/src/core/{components/table → table/interfaces}/types.ts +2 -2
  198. package/src/demo/DemoRouter.ts +87 -6
  199. package/src/demo/components/DemoHome.tsx +6 -10
  200. package/src/demo/components/DemoLayout.tsx +38 -8
  201. package/src/demo/components/auth/DemoLogin.tsx +1 -1
  202. package/src/demo/components/auth/DemoRegister.tsx +1 -1
  203. package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
  204. package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
  205. package/src/demo/components/core/DemoButton.tsx +160 -0
  206. package/src/demo/components/core/DemoFlex.tsx +101 -0
  207. package/src/demo/components/core/DemoHeading.tsx +13 -0
  208. package/src/demo/components/core/DemoText.tsx +110 -0
  209. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  210. package/src/demo/components/layout/DemoDialog.tsx +103 -0
  211. package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
  212. package/src/demo/components/layout/DemoToast.tsx +96 -0
  213. package/src/demo/components/shared/MacWindow.tsx +149 -74
  214. package/src/demo/components/shared/Showcase.tsx +4 -8
  215. package/src/demo/index.ts +1 -4
  216. package/src/demo/primitives/$uiDemo.ts +10 -0
  217. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
  218. package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
  219. package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
  220. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
  221. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
  222. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
  223. package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
  224. package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
  225. package/dist/admin/AdminParameters-DCGbpt2c.js.map +0 -1
  226. package/dist/admin/AdminSessions-DyhW6RZv.js.map +0 -1
  227. package/dist/admin/AdminUserAudits-D1GcREEE.js +0 -177
  228. package/dist/admin/AdminUserAudits-D1GcREEE.js.map +0 -1
  229. package/dist/admin/AdminUserCreate-DR8LA0tv.js +0 -104
  230. package/dist/admin/AdminUserCreate-DR8LA0tv.js.map +0 -1
  231. package/dist/admin/AdminUserDetails-CDkZNHQD.js +0 -477
  232. package/dist/admin/AdminUserDetails-CDkZNHQD.js.map +0 -1
  233. package/dist/admin/AdminUserLayout-CrBj4UuI.js.map +0 -1
  234. package/dist/admin/AdminUserSessions-srgFHrqy.js +0 -129
  235. package/dist/admin/AdminUserSessions-srgFHrqy.js.map +0 -1
  236. package/dist/admin/AdminUserSettings-BFuxl-xT.js +0 -167
  237. package/dist/admin/AdminUserSettings-BFuxl-xT.js.map +0 -1
  238. package/dist/admin/AdminUsers-D1pDpiwK.js +0 -118
  239. package/dist/admin/AdminUsers-D1pDpiwK.js.map +0 -1
  240. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
  241. package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
  242. package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
  243. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
  244. package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
  245. package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
  246. package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
  247. package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
  248. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
  249. package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
  250. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
  251. package/dist/demo/Showcase-BzoXNlCn.js +0 -185
  252. package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
  253. package/dist/json/index.d.ts +0 -57
  254. package/dist/json/index.d.ts.map +0 -1
  255. package/dist/json/index.js +0 -325
  256. package/dist/json/index.js.map +0 -1
  257. package/src/admin/components/users/AdminUserAudits.tsx +0 -184
  258. package/src/admin/components/users/AdminUserCreate.tsx +0 -85
  259. package/src/admin/components/users/AdminUserDetails.tsx +0 -431
  260. package/src/admin/components/users/AdminUserSettings.tsx +0 -171
  261. package/src/core/components/data/ErrorViewer.tsx +0 -171
  262. package/src/json/extensions/DialogService.tsx +0 -31
  263. package/src/json/index.ts +0 -18
  264. package/src/json/styles.css +0 -1
  265. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
  266. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
  267. /package/src/{json → core/json}/components/JsonViewer.css +0 -0
  268. /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
  269. /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
  270. /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
@@ -1,11 +1,10 @@
1
+ import { renderIcon, ui } from "@alepha/ui";
1
2
  import { Spotlight, type SpotlightActionData } from "@mantine/spotlight";
2
3
  import { IconSearch } from "@tabler/icons-react";
3
4
  import { useStore } from "alepha/react";
4
5
  import { useRouter } from "alepha/react/router";
5
6
  import { currentUserAtom } from "alepha/security";
6
7
  import { type ReactNode, useMemo } from "react";
7
- import { ui } from "../../constants/ui.ts";
8
- import { renderIcon } from "../../helpers/renderIcon.tsx";
9
8
 
10
9
  export interface OmnibarProps {
11
10
  shortcut?: string | string[];
@@ -1,9 +1,16 @@
1
1
  import {
2
+ ActionButton,
3
+ type ActionMenuConfig,
4
+ type ActionMenuItem,
5
+ type ActionProps,
2
6
  Flex,
3
- type FlexProps,
4
- type MantineBreakpoint,
7
+ OmnibarButton,
8
+ renderIcon,
9
+ SidebarCollapseButton,
5
10
  Text,
6
- } from "@mantine/core";
11
+ ui,
12
+ } from "@alepha/ui";
13
+ import type { FlexProps, MantineBreakpoint } from "@mantine/core";
7
14
  import {
8
15
  IconChevronDown,
9
16
  IconChevronRight,
@@ -19,11 +26,6 @@ import {
19
26
  useMemo,
20
27
  useState,
21
28
  } from "react";
22
- import { ui } from "../../constants/ui.ts";
23
- import { renderIcon } from "../../helpers/renderIcon.tsx";
24
- import ActionButton, { type ActionProps } from "../buttons/ActionButton.tsx";
25
- import OmnibarButton from "../buttons/OmnibarButton.tsx";
26
- import ToggleSidebarButton from "../buttons/ToggleSidebarButton.tsx";
27
29
 
28
30
  export interface SidebarProps {
29
31
  items?: SidebarNode[];
@@ -37,12 +39,6 @@ export interface SidebarProps {
37
39
  paths?: string[];
38
40
  };
39
41
 
40
- /**
41
- * Whether the sidebar expands on hover when collapsed.
42
- * @default true
43
- */
44
- expandOnHover?: boolean;
45
-
46
42
  /**
47
43
  * Automatically populate the menu from the router's pages.
48
44
  */
@@ -57,7 +53,11 @@ export const Sidebar = (props: SidebarProps) => {
57
53
  const router = useRouter();
58
54
  const { onItemClick } = props;
59
55
 
60
- const divider = (key: string | number, fill?: boolean) => {
56
+ const divider = (
57
+ key: string | number,
58
+ fill?: boolean,
59
+ collapsed?: boolean,
60
+ ) => {
61
61
  return (
62
62
  <Flex
63
63
  key={key}
@@ -65,41 +65,40 @@ export const Sidebar = (props: SidebarProps) => {
65
65
  bg={"var(--mantine-color-default-border)"}
66
66
  my={"xs"}
67
67
  mx={
68
- fill
69
- ? "calc(-1 * var(--mantine-spacing-md))"
70
- : props.collapsed
71
- ? 0
72
- : "sm"
68
+ fill ? "calc(-1 * var(--mantine-spacing-md))" : collapsed ? 0 : "sm"
73
69
  }
74
70
  />
75
71
  );
76
72
  };
77
73
 
78
- const renderNode = (item: SidebarNode, key: number | string) => {
74
+ const renderNode = (
75
+ item: SidebarNode,
76
+ key: number | string,
77
+ collapsed: boolean,
78
+ ) => {
79
79
  if ("type" in item) {
80
80
  // Hide spacers when collapsed
81
81
  if (item.type === "spacer") {
82
- if (props.collapsed) return null;
82
+ if (collapsed) return null;
83
83
  return <Flex key={key} h={16} />;
84
84
  }
85
85
 
86
86
  if (item.type === "divider") {
87
- return divider(key, item.fill);
87
+ return divider(key, item.fill, collapsed);
88
88
  }
89
89
 
90
90
  if (item.type === "search") {
91
91
  return (
92
92
  <Flex key={key} mb="xs">
93
- <OmnibarButton collapsed={props.collapsed} />
93
+ <OmnibarButton collapsed={collapsed} />
94
94
  </Flex>
95
95
  );
96
96
  }
97
97
 
98
98
  if (item.type === "toggle") {
99
- return <ToggleSidebarButton key={key} />;
99
+ return <SidebarCollapseButton key={key} />;
100
100
  }
101
101
 
102
- // Replace sections with dividers when collapsed
103
102
  // Replace sections with dividers when collapsed
104
103
  if (item.type === "section") {
105
104
  // Hide section if all children are hidden
@@ -110,16 +109,17 @@ export const Sidebar = (props: SidebarProps) => {
110
109
  if (!hasVisibleChild) return null;
111
110
  }
112
111
 
113
- if (props.collapsed) {
112
+ if (collapsed) {
114
113
  return (
115
114
  <Fragment key={key}>
116
- {divider(`${key}-d`)}
115
+ {divider(`${key}-d`, undefined, collapsed)}
117
116
  {item.children?.map((child, index) =>
118
- renderNode(child, `s${key}-${index}`),
117
+ renderNode(child, `s${key}-${index}`, collapsed),
119
118
  )}
120
119
  </Fragment>
121
120
  );
122
121
  }
122
+
123
123
  return (
124
124
  <Fragment key={key}>
125
125
  <Flex mt={"md"} align={"center"} gap={"xs"}>
@@ -129,7 +129,7 @@ export const Sidebar = (props: SidebarProps) => {
129
129
  </Text>
130
130
  </Flex>
131
131
  {item.children?.map((child, index) =>
132
- renderNode(child, `s${key}-${index}`),
132
+ renderNode(child, `s${key}-${index}`, collapsed),
133
133
  )}
134
134
  </Fragment>
135
135
  );
@@ -155,7 +155,7 @@ export const Sidebar = (props: SidebarProps) => {
155
155
  }
156
156
  }
157
157
 
158
- if (props.collapsed) {
158
+ if (collapsed) {
159
159
  return (
160
160
  <SidebarCollapsedItem
161
161
  key={key}
@@ -208,37 +208,43 @@ export const Sidebar = (props: SidebarProps) => {
208
208
  [props.items, props.autoPopulateMenu],
209
209
  );
210
210
 
211
- return (
212
- <Flex
213
- flex={1}
214
- py={padding}
215
- direction={"column"}
216
- className="alepha-sidebar-scroll"
217
- {...props.flexProps}
218
- >
211
+ const renderSidebar = (collapsed: boolean) => (
212
+ <Flex flex={1} py={padding} direction={"column"} {...props.flexProps}>
219
213
  <Flex gap={gap} px={padding} direction={"column"}>
220
214
  {menu
221
215
  .filter((it) => it.position === "top")
222
- .map((item, index) => renderNode(item, index))}
216
+ .map((item, index) => renderNode(item, index, collapsed))}
223
217
  </Flex>
224
- <Flex
225
- gap={gap}
226
- px={padding}
227
- direction={"column"}
228
- flex={1}
229
- className="alepha-sidebar-scroll"
230
- >
218
+ <Flex gap={gap} px={padding} direction={"column"} flex={1}>
231
219
  {menu
232
220
  .filter((it) => !it.position)
233
- .map((item, index) => renderNode(item, index))}
221
+ .map((item, index) => renderNode(item, index, collapsed))}
234
222
  </Flex>
235
223
  <Flex gap={gap} px={padding} direction={"column"}>
236
224
  {menu
237
225
  .filter((it) => it.position === "bottom")
238
- .map((item, index) => renderNode(item, index))}
226
+ .map((item, index) => renderNode(item, index, collapsed))}
239
227
  </Flex>
240
228
  </Flex>
241
229
  );
230
+
231
+ // When collapsed, render both versions and use CSS breakpoints:
232
+ // - Desktop (>=md): show collapsed (icon-only) sidebar
233
+ // - Mobile (<md): show expanded sidebar (drawer with labels)
234
+ if (props.collapsed) {
235
+ return (
236
+ <>
237
+ <Flex flex={1} direction={"column"} visibleFrom="md">
238
+ {renderSidebar(true)}
239
+ </Flex>
240
+ <Flex flex={1} direction={"column"} hiddenFrom="md">
241
+ {renderSidebar(false)}
242
+ </Flex>
243
+ </>
244
+ );
245
+ }
246
+
247
+ return renderSidebar(false);
242
248
  };
243
249
 
244
250
  // ---------------------------------------------------------------------------------------------------------------------
@@ -310,14 +316,18 @@ export const SidebarItem = (props: SidebarItemProps) => {
310
316
  props.theme.button?.size ??
311
317
  (level === 0 ? "sm" : "xs")
312
318
  }
313
- tooltip={
314
- item.description
315
- ? { label: item.description, position: "right" }
316
- : undefined
317
- }
318
- color={"gray"}
319
- variant={"subtle"}
320
- variantActive={"default"}
319
+ // tooltip={
320
+ // item.description
321
+ // ? { label: item.description, position: "right" }
322
+ // : undefined
323
+ // }
324
+ bd={0}
325
+ fw={"normal"}
326
+ variant={"default"}
327
+ propsActive={{
328
+ variant: "outline",
329
+ fw: "bold",
330
+ }}
321
331
  radius={props.item.theme?.radius ?? props.theme.button?.radius ?? "md"}
322
332
  onClick={handleItemClick}
323
333
  leftSection={
@@ -376,21 +386,38 @@ export const SidebarItem = (props: SidebarItemProps) => {
376
386
 
377
387
  // ---------------------------------------------------------------------------------------------------------------------
378
388
 
379
- export interface SidebarItemProps {
380
- item: SidebarMenuItem;
381
- level: number;
382
- onItemClick?: (item: SidebarMenuItem) => void;
383
- theme: SidebarTheme;
384
- }
385
-
386
389
  const SidebarCollapsedItem = (props: SidebarItemProps) => {
387
390
  const { item, level } = props;
391
+ const router = useRouter();
388
392
 
389
393
  const handleItemClick = () => {
390
394
  props.onItemClick?.(item);
391
395
  item.onClick?.();
392
396
  };
393
397
 
398
+ const hasChildren = item.children && item.children.length > 0;
399
+
400
+ const menu: ActionMenuConfig | undefined = hasChildren
401
+ ? {
402
+ on: "hover",
403
+ position: "right",
404
+ items: item
405
+ .children!.filter((child) => !child.can || child.can())
406
+ .map(
407
+ (child): ActionMenuItem => ({
408
+ label: child.label as string,
409
+ icon: renderIcon(child.icon, ui.sizes.icon.sm),
410
+ href: child.href,
411
+ active: child.href
412
+ ? router.isActive(child.href, {
413
+ startWith: child.activeStartsWith,
414
+ })
415
+ : undefined,
416
+ }),
417
+ ),
418
+ }
419
+ : undefined;
420
+
394
421
  return (
395
422
  <ActionButton
396
423
  size={
@@ -400,19 +427,24 @@ const SidebarCollapsedItem = (props: SidebarItemProps) => {
400
427
  }
401
428
  variant={"subtle"}
402
429
  variantActive={"default"}
403
- tooltip={{
404
- label: item.label,
405
- position: "right",
406
- }}
430
+ tooltip={
431
+ hasChildren
432
+ ? undefined
433
+ : {
434
+ label: item.label,
435
+ position: "right",
436
+ }
437
+ }
407
438
  radius={props.item.theme?.radius ?? props.theme.button?.radius ?? "md"}
408
- onClick={handleItemClick}
439
+ onClick={hasChildren ? undefined : handleItemClick}
409
440
  icon={
410
441
  renderIcon(item.icon, ui.sizes.icon.sm) ?? (
411
442
  <IconSquareRounded size={ui.sizes.icon.sm} />
412
443
  )
413
444
  }
414
- href={props.item.href as any}
415
- target={props.item.target}
445
+ href={hasChildren ? undefined : (props.item.href as any)}
446
+ target={hasChildren ? undefined : props.item.target}
447
+ menu={menu}
416
448
  {...props.item.actionProps}
417
449
  />
418
450
  );
@@ -0,0 +1,65 @@
1
+ import { $module } from "alepha";
2
+
3
+ // ---------------------------------------------------------------------------------------------------------------------
4
+
5
+ export type { AlephaMantineProviderProps } from "../AlephaMantineProvider.tsx";
6
+ export { default as AlephaMantineProvider } from "../AlephaMantineProvider.tsx";
7
+ export type {
8
+ AppBarBack,
9
+ AppBarBurger,
10
+ AppBarDark,
11
+ AppBarDivider,
12
+ AppBarElement,
13
+ AppBarItem,
14
+ AppBarLang,
15
+ AppBarLogo,
16
+ AppBarProps,
17
+ AppBarSearch,
18
+ AppBarSpacer,
19
+ } from "./AppBar.tsx";
20
+ export { default as AppBar } from "./AppBar.tsx";
21
+ export type { BreadcrumbProps } from "./Breadcrumb.tsx";
22
+ export { default as Breadcrumbs } from "./Breadcrumb.tsx";
23
+ export type { ContainerProps } from "./Container.tsx";
24
+ export { default as Container } from "./Container.tsx";
25
+ export {
26
+ type DashboardShellProps,
27
+ type DashboardShellProps as AdminShellProps,
28
+ default as DashboardShell,
29
+ default as AdminShell,
30
+ } from "./DashboardShell.tsx";
31
+ export type { OmnibarProps } from "./Omnibar.tsx";
32
+ export { default as Omnibar } from "./Omnibar.tsx";
33
+ export type {
34
+ SidebarAbstractItem,
35
+ SidebarButtonTheme,
36
+ SidebarDivider,
37
+ SidebarElement,
38
+ SidebarItemProps,
39
+ SidebarMenuItem,
40
+ SidebarNode,
41
+ SidebarProps,
42
+ SidebarSearch,
43
+ SidebarSection,
44
+ SidebarSpacer,
45
+ SidebarTheme,
46
+ } from "./Sidebar.tsx";
47
+ export { Sidebar } from "./Sidebar.tsx";
48
+
49
+ // ---------------------------------------------------------------------------------------------------------------------
50
+
51
+ /**
52
+ * Layout components for building application shells.
53
+ *
54
+ * **Features:**
55
+ * - DashboardShell with resizable sidebar
56
+ * - AppBar with configurable elements
57
+ * - Sidebar navigation with sections and menu items
58
+ * - Breadcrumb navigation
59
+ * - Omnibar (command palette)
60
+ *
61
+ * @module alepha.ui.layout
62
+ */
63
+ export const AlephaUILayout = $module({
64
+ name: "alepha.ui.layout",
65
+ });
@@ -21,10 +21,7 @@ import type {
21
21
  } from "@mantine/dates";
22
22
  import { useFormState } from "alepha/react/form";
23
23
  import type { ComponentType } from "react";
24
- import {
25
- type GenericControlProps,
26
- parseInput,
27
- } from "../../utils/parseInput.ts";
24
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
28
25
  import ControlArray, { type ControlArrayProps } from "./ControlArray.tsx";
29
26
  import ControlDate from "./ControlDate.tsx";
30
27
  import ControlNumber, { type ControlNumberProps } from "./ControlNumber.tsx";
@@ -268,19 +265,40 @@ const Control = (_props: ControlProps) => {
268
265
  "type" in props.input.schema &&
269
266
  props.input.schema.type === "boolean"
270
267
  ) {
271
- const switchProps = typeof props.switch === "object" ? props.switch : {};
268
+ if (props.switch) {
269
+ const switchProps = typeof props.switch === "object" ? props.switch : {};
270
+ return (
271
+ <Switch
272
+ {...inputProps}
273
+ size={props.size}
274
+ id={id}
275
+ color={"blue"}
276
+ defaultChecked={props.input.props.defaultValue}
277
+ onChange={(event) => {
278
+ props.input.set(event.currentTarget.checked);
279
+ }}
280
+ {...switchProps}
281
+ />
282
+ );
283
+ }
284
+
285
+ const opts: ControlSelectProps = {
286
+ input: props.input,
287
+ select: {
288
+ data: [
289
+ { value: "true", label: "Yes" },
290
+ { value: "false", label: "No" },
291
+ ],
292
+ },
293
+ };
272
294
 
273
295
  return (
274
- <Switch
275
- {...inputProps}
296
+ <ControlSelect
276
297
  size={props.size}
277
- id={id}
278
- color={"blue"}
279
- defaultChecked={props.input.props.defaultValue}
280
- onChange={(event) => {
281
- props.input.set(event.currentTarget.checked);
282
- }}
283
- {...switchProps}
298
+ title={props.title}
299
+ description={props.description}
300
+ icon={icon}
301
+ {...opts}
284
302
  />
285
303
  );
286
304
  }
@@ -1,3 +1,4 @@
1
+ import { ui } from "@alepha/ui";
1
2
  import {
2
3
  ActionIcon,
3
4
  Fieldset,
@@ -11,11 +12,7 @@ import type { TObject, TSchema } from "alepha";
11
12
  import { useAlepha } from "alepha/react";
12
13
  import type { BaseInputField } from "alepha/react/form";
13
14
  import { useCallback, useEffect, useRef, useState } from "react";
14
- import { ui } from "../../constants/ui.ts";
15
- import {
16
- type GenericControlProps,
17
- parseInput,
18
- } from "../../utils/parseInput.ts";
15
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
19
16
  import Control, { type ControlProps } from "./Control.tsx";
20
17
 
21
18
  /**
@@ -7,10 +7,7 @@ import {
7
7
  type TimeInputProps,
8
8
  } from "@mantine/dates";
9
9
  import { useFormState } from "alepha/react/form";
10
- import {
11
- type GenericControlProps,
12
- parseInput,
13
- } from "../../utils/parseInput.ts";
10
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
14
11
 
15
12
  export interface ControlDateProps extends GenericControlProps {
16
13
  date?: boolean | DateInputProps;
@@ -8,10 +8,7 @@ import {
8
8
  import { useEvents } from "alepha/react";
9
9
  import { useFormState } from "alepha/react/form";
10
10
  import { useRef, useState } from "react";
11
- import {
12
- type GenericControlProps,
13
- parseInput,
14
- } from "../../utils/parseInput.ts";
11
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
15
12
 
16
13
  export interface ControlNumberProps extends GenericControlProps {
17
14
  numberInputProps?: Partial<NumberInputProps>;
@@ -1,10 +1,7 @@
1
1
  import { Fieldset, Flex, Grid, Text } from "@mantine/core";
2
2
  import type { TObject } from "alepha";
3
3
  import type { BaseInputField, ObjectInputField } from "alepha/react/form";
4
- import {
5
- type GenericControlProps,
6
- parseInput,
7
- } from "../../utils/parseInput.ts";
4
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
8
5
  import Control, { type ControlProps } from "./Control.tsx";
9
6
 
10
7
  export interface ControlObjectProps extends GenericControlProps {
@@ -1,3 +1,10 @@
1
+ import {
2
+ ActionButton,
3
+ extractSchemaFields,
4
+ OPERATOR_INFO,
5
+ type SchemaField,
6
+ ui,
7
+ } from "@alepha/ui";
1
8
  import {
2
9
  ActionIcon,
3
10
  Badge,
@@ -13,13 +20,6 @@ import type { TObject } from "alepha";
13
20
  import { parseQueryString } from "alepha/orm";
14
21
  import { useEvents } from "alepha/react";
15
22
  import { useRef, useState } from "react";
16
- import { ui } from "../../constants/ui.ts";
17
- import {
18
- extractSchemaFields,
19
- OPERATOR_INFO,
20
- type SchemaField,
21
- } from "../../utils/extractSchemaFields.ts";
22
- import ActionButton from "../buttons/ActionButton.tsx";
23
23
 
24
24
  export interface ControlQueryBuilderProps
25
25
  extends Omit<TextInputProps, "value" | "onChange"> {
@@ -14,10 +14,7 @@ import {
14
14
  } from "@mantine/core";
15
15
  import { useFormState } from "alepha/react/form";
16
16
  import { useEffect, useState } from "react";
17
- import {
18
- type GenericControlProps,
19
- parseInput,
20
- } from "../../utils/parseInput.ts";
17
+ import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
21
18
 
22
19
  export type SelectValueLabel =
23
20
  | string
@@ -192,6 +189,7 @@ const ControlSelect = (props: ControlSelectProps) => {
192
189
  size={props.size}
193
190
  id={id}
194
191
  leftSection={icon}
192
+ rightSection={null}
195
193
  data={data}
196
194
  {...props.input.props}
197
195
  {...selectProps}