@alepha/ui 0.15.1 → 0.15.2

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 (193) hide show
  1. package/dist/admin/AdminAudits-BlGGKLof.js +3 -0
  2. package/dist/admin/{AdminAudits-DClGEVBj.js → AdminAudits-C0DPYw0W.js} +4 -4
  3. package/dist/admin/AdminAudits-C0DPYw0W.js.map +1 -0
  4. package/dist/admin/AdminFiles-Bg9feLFH.js +3 -0
  5. package/dist/admin/{AdminFiles-C76r1_Xz.js → AdminFiles-Cu8GHgQ3.js} +3 -3
  6. package/dist/admin/AdminFiles-Cu8GHgQ3.js.map +1 -0
  7. package/dist/admin/{AdminNotifications-Bsalygm5.js → AdminNotifications-CgYkBuG_.js} +3 -3
  8. package/dist/admin/AdminNotifications-CgYkBuG_.js.map +1 -0
  9. package/dist/admin/AdminNotifications-DmfGPqHe.js +3 -0
  10. package/dist/admin/{AdminParameters-CpmAWwqN.js → AdminParameters-Cl-R0nXt.js} +1 -1
  11. package/dist/admin/{AdminParameters-Bmxtnpv-.js → AdminParameters-hjNG_KXb.js} +4 -4
  12. package/dist/admin/AdminParameters-hjNG_KXb.js.map +1 -0
  13. package/dist/admin/{AdminSessions-DmK3R6pP.js → AdminSessions-Bey9cuy1.js} +4 -4
  14. package/dist/admin/AdminSessions-Bey9cuy1.js.map +1 -0
  15. package/dist/admin/AdminSessions-Cn4_jB04.js +3 -0
  16. package/dist/admin/{AdminUserAudits-BPMP1Qd2.js → AdminUserAudits-C7AN9jx7.js} +4 -4
  17. package/dist/admin/AdminUserAudits-C7AN9jx7.js.map +1 -0
  18. package/dist/admin/{AdminUserAudits-Brcenss9.js → AdminUserAudits-Cp_ERd2g.js} +1 -1
  19. package/dist/admin/{AdminUserCreate-Cx8bkYC2.js → AdminUserCreate-Chr-7hLk.js} +1 -1
  20. package/dist/admin/{AdminUserCreate-CZjB6NKc.js → AdminUserCreate-DiXi1EWB.js} +4 -4
  21. package/dist/admin/AdminUserCreate-DiXi1EWB.js.map +1 -0
  22. package/dist/admin/{AdminUserDetails-8TYsqQBy.js → AdminUserDetails-Dcn3OwMC.js} +1 -1
  23. package/dist/admin/{AdminUserDetails-DuqCOBJK.js → AdminUserDetails-yM4x8JE6.js} +5 -5
  24. package/dist/admin/AdminUserDetails-yM4x8JE6.js.map +1 -0
  25. package/dist/admin/{AdminUserLayout-Bz2u_zQ4.js → AdminUserLayout-CfeQHH6e.js} +1 -1
  26. package/dist/admin/{AdminUserLayout-Dgk8s7Cd.js → AdminUserLayout-D9bqGt6T.js} +3 -3
  27. package/dist/admin/AdminUserLayout-D9bqGt6T.js.map +1 -0
  28. package/dist/admin/{AdminUserSessions-DCpe8_T6.js → AdminUserSessions-kmkXG-xf.js} +4 -4
  29. package/dist/admin/AdminUserSessions-kmkXG-xf.js.map +1 -0
  30. package/dist/admin/AdminUserSessions-rvA0ztxn.js +3 -0
  31. package/dist/admin/{AdminUserSettings-qxDfowqh.js → AdminUserSettings-BnzRAcqV.js} +4 -4
  32. package/dist/admin/AdminUserSettings-BnzRAcqV.js.map +1 -0
  33. package/dist/admin/AdminUserSettings-CXs-jtRv.js +3 -0
  34. package/dist/admin/{AdminUsers-ZlPsDz0T.js → AdminUsers-CYkcUWCg.js} +4 -4
  35. package/dist/admin/AdminUsers-CYkcUWCg.js.map +1 -0
  36. package/dist/admin/AdminUsers-DdFXzrEn.js +3 -0
  37. package/dist/admin/index.d.ts +33 -18
  38. package/dist/admin/index.d.ts.map +1 -1
  39. package/dist/admin/index.js +44 -29
  40. package/dist/admin/index.js.map +1 -1
  41. package/dist/auth/{AuthLayout-CWzQ8rCe.js → AuthLayout-Dj5K4SIN.js} +2 -2
  42. package/dist/auth/AuthLayout-Dj5K4SIN.js.map +1 -0
  43. package/dist/auth/{Login-CyvKwy5e.js → Login-BAFVcX_J.js} +5 -5
  44. package/dist/auth/Login-BAFVcX_J.js.map +1 -0
  45. package/dist/auth/Login-C5PUsp8I.js +4 -0
  46. package/dist/auth/{Register-C7Zp09Ks.js → Register-CZRXEcWy.js} +6 -6
  47. package/dist/auth/Register-CZRXEcWy.js.map +1 -0
  48. package/dist/auth/Register-DMTs5ep_.js +4 -0
  49. package/dist/auth/ResetPassword-D-mhMtmx.js +3 -0
  50. package/dist/auth/{ResetPassword-DYJSUC6B.js → ResetPassword-DTYNsBIj.js} +5 -5
  51. package/dist/auth/ResetPassword-DTYNsBIj.js.map +1 -0
  52. package/dist/auth/VerifyEmail-BsrCmncc.js +3 -0
  53. package/dist/auth/{VerifyEmail-CNXFIwWW.js → VerifyEmail-DolENWGn.js} +4 -4
  54. package/dist/auth/VerifyEmail-DolENWGn.js.map +1 -0
  55. package/dist/auth/index.d.ts +30 -19
  56. package/dist/auth/index.d.ts.map +1 -1
  57. package/dist/auth/index.js +24 -13
  58. package/dist/auth/index.js.map +1 -1
  59. package/dist/core/index.d.ts +115 -52
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +302 -87
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/demo/{DemoDataTable-DYbDYbs5.js → DemoDataTable-CguplbR7.js} +2 -2
  64. package/dist/demo/{DemoDataTable-DYbDYbs5.js.map → DemoDataTable-CguplbR7.js.map} +1 -1
  65. package/dist/demo/DemoJsonViewer-DIssGVlJ.js +4 -0
  66. package/dist/demo/{DemoJsonViewer-D_Hff1Q2.js → DemoJsonViewer-Dgdk3Txb.js} +3 -3
  67. package/dist/demo/{DemoJsonViewer-D_Hff1Q2.js.map → DemoJsonViewer-Dgdk3Txb.js.map} +1 -1
  68. package/dist/demo/{DemoLayout-DjIDm93B.js → DemoLayout-B20TEuhV.js} +2 -2
  69. package/dist/demo/DemoLayout-B20TEuhV.js.map +1 -0
  70. package/dist/demo/DemoLayout-DSRyf4qJ.js +3 -0
  71. package/dist/demo/{DemoLogin-BA_HiIRZ.js → DemoLogin-mtkN6340.js} +6 -6
  72. package/dist/demo/DemoLogin-mtkN6340.js.map +1 -0
  73. package/dist/demo/{DemoRegister-B6syaxP9.js → DemoRegister-C0MW7anp.js} +7 -7
  74. package/dist/demo/DemoRegister-C0MW7anp.js.map +1 -0
  75. package/dist/demo/{DemoResetPassword-BOcLG4GF.js → DemoResetPassword-CPTy88iK.js} +6 -6
  76. package/dist/demo/DemoResetPassword-CPTy88iK.js.map +1 -0
  77. package/dist/demo/{DemoSidebar-DpZXf7GO.js → DemoSidebar-MVmQKfMt.js} +2 -2
  78. package/dist/demo/{DemoSidebar-DpZXf7GO.js.map → DemoSidebar-MVmQKfMt.js.map} +1 -1
  79. package/dist/demo/{DemoTypeForm-BlLAcQqZ.js → DemoTypeForm-w-qtfRlC.js} +3 -3
  80. package/dist/demo/DemoTypeForm-w-qtfRlC.js.map +1 -0
  81. package/dist/demo/{DemoVerifyEmail-C-J7bXUQ.js → DemoVerifyEmail-C8FFJT5A.js} +5 -5
  82. package/dist/demo/DemoVerifyEmail-C8FFJT5A.js.map +1 -0
  83. package/dist/demo/{Showcase-HchhcsHV.js → Showcase-CQrMWars.js} +2 -2
  84. package/dist/demo/Showcase-CQrMWars.js.map +1 -0
  85. package/dist/demo/index.d.ts +25 -15
  86. package/dist/demo/index.d.ts.map +1 -1
  87. package/dist/demo/index.js +24 -14
  88. package/dist/demo/index.js.map +1 -1
  89. package/package.json +5 -6
  90. package/src/admin/AdminRouter.ts +2 -2
  91. package/src/admin/MainRouter.ts +1 -1
  92. package/src/admin/components/audits/AdminAudits.tsx +3 -3
  93. package/src/admin/components/files/AdminFiles.tsx +2 -2
  94. package/src/admin/components/jobs/AdminJobs.tsx +2 -2
  95. package/src/admin/components/notifications/AdminNotifications.tsx +2 -2
  96. package/src/admin/components/parameters/AdminParameters.tsx +1 -1
  97. package/src/admin/components/parameters/ParameterDetails.tsx +2 -2
  98. package/src/admin/components/parameters/ParameterHistory.tsx +1 -1
  99. package/src/admin/components/parameters/types.ts +9 -3
  100. package/src/admin/components/sessions/AdminSessions.tsx +3 -3
  101. package/src/admin/components/shared/AdminResourceHeader.tsx +1 -1
  102. package/src/admin/components/shared/AdminResourceTabs.tsx +1 -1
  103. package/src/admin/components/users/AdminUserAudits.tsx +3 -3
  104. package/src/admin/components/users/AdminUserCreate.tsx +3 -3
  105. package/src/admin/components/users/AdminUserDetails.tsx +4 -4
  106. package/src/admin/components/users/AdminUserLayout.tsx +2 -2
  107. package/src/admin/components/users/AdminUserSessions.tsx +3 -3
  108. package/src/admin/components/users/AdminUserSettings.tsx +3 -3
  109. package/src/admin/components/users/AdminUsers.tsx +3 -3
  110. package/src/admin/index.ts +16 -1
  111. package/src/auth/AuthI18n.ts +1 -1
  112. package/src/auth/AuthRouter.ts +2 -2
  113. package/src/auth/components/AuthLayout.tsx +1 -1
  114. package/src/auth/components/Login.tsx +4 -4
  115. package/src/auth/components/Register.tsx +5 -5
  116. package/src/auth/components/ResetPassword.tsx +4 -4
  117. package/src/auth/components/VerifyEmail.tsx +3 -3
  118. package/src/auth/components/buttons/UserButton.tsx +2 -2
  119. package/src/auth/index.ts +14 -3
  120. package/src/core/RootRouter.ts +1 -1
  121. package/src/core/atoms/alephaSidebarAtom.ts +57 -0
  122. package/src/core/components/buttons/ActionButton.tsx +9 -9
  123. package/src/core/components/buttons/BurgerButton.tsx +5 -4
  124. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  125. package/src/core/components/buttons/OmnibarButton.tsx +20 -1
  126. package/src/core/components/buttons/ThemeButton.tsx +1 -1
  127. package/src/core/components/buttons/ToggleSidebarButton.tsx +33 -23
  128. package/src/core/components/form/Control.tsx +1 -1
  129. package/src/core/components/form/ControlArray.tsx +2 -2
  130. package/src/core/components/form/ControlDate.tsx +1 -1
  131. package/src/core/components/form/ControlNumber.tsx +2 -2
  132. package/src/core/components/form/ControlObject.tsx +1 -1
  133. package/src/core/components/form/ControlQueryBuilder.tsx +1 -1
  134. package/src/core/components/form/ControlSelect.tsx +1 -1
  135. package/src/core/components/form/TypeForm.tsx +2 -2
  136. package/src/core/components/layout/AdminShell.tsx +205 -27
  137. package/src/core/components/layout/AlephaMantineProvider.tsx +3 -3
  138. package/src/core/components/layout/Omnibar.tsx +2 -2
  139. package/src/core/components/layout/Sidebar.tsx +42 -77
  140. package/src/core/components/table/DataTable.tsx +2 -2
  141. package/src/core/components/table/DataTableFilters.tsx +1 -1
  142. package/src/core/components/table/types.ts +1 -1
  143. package/src/core/hooks/useDialog.ts +1 -1
  144. package/src/core/hooks/useTheme.ts +1 -1
  145. package/src/core/hooks/useToast.ts +1 -1
  146. package/src/core/index.ts +57 -6
  147. package/src/core/providers/ThemeProvider.ts +1 -1
  148. package/src/core/styles.css +58 -0
  149. package/src/core/utils/parseInput.ts +1 -1
  150. package/src/demo/DemoRouter.ts +1 -1
  151. package/src/demo/components/DemoLayout.tsx +1 -1
  152. package/src/demo/components/core/DemoTypeForm.tsx +1 -1
  153. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  154. package/src/demo/components/shared/Showcase.tsx +1 -1
  155. package/src/demo/index.ts +11 -1
  156. package/src/json/index.ts +13 -0
  157. package/dist/admin/AdminAudits-ColpiP4T.js +0 -3
  158. package/dist/admin/AdminAudits-DClGEVBj.js.map +0 -1
  159. package/dist/admin/AdminFiles-C5pqXN5B.js +0 -3
  160. package/dist/admin/AdminFiles-C76r1_Xz.js.map +0 -1
  161. package/dist/admin/AdminNotifications-BXixCBu9.js +0 -3
  162. package/dist/admin/AdminNotifications-Bsalygm5.js.map +0 -1
  163. package/dist/admin/AdminParameters-Bmxtnpv-.js.map +0 -1
  164. package/dist/admin/AdminSessions-CrkRvey3.js +0 -3
  165. package/dist/admin/AdminSessions-DmK3R6pP.js.map +0 -1
  166. package/dist/admin/AdminUserAudits-BPMP1Qd2.js.map +0 -1
  167. package/dist/admin/AdminUserCreate-CZjB6NKc.js.map +0 -1
  168. package/dist/admin/AdminUserDetails-DuqCOBJK.js.map +0 -1
  169. package/dist/admin/AdminUserLayout-Dgk8s7Cd.js.map +0 -1
  170. package/dist/admin/AdminUserSessions-DCpe8_T6.js.map +0 -1
  171. package/dist/admin/AdminUserSessions-beiJqY2D.js +0 -3
  172. package/dist/admin/AdminUserSettings-CxlInVnu.js +0 -3
  173. package/dist/admin/AdminUserSettings-qxDfowqh.js.map +0 -1
  174. package/dist/admin/AdminUsers-Bd0wMP8v.js +0 -3
  175. package/dist/admin/AdminUsers-ZlPsDz0T.js.map +0 -1
  176. package/dist/auth/AuthLayout-CWzQ8rCe.js.map +0 -1
  177. package/dist/auth/Login-CxOPyNFP.js +0 -4
  178. package/dist/auth/Login-CyvKwy5e.js.map +0 -1
  179. package/dist/auth/Register-C7Zp09Ks.js.map +0 -1
  180. package/dist/auth/Register-Cacr7YbA.js +0 -4
  181. package/dist/auth/ResetPassword-CMkx8Ibf.js +0 -3
  182. package/dist/auth/ResetPassword-DYJSUC6B.js.map +0 -1
  183. package/dist/auth/VerifyEmail-CNXFIwWW.js.map +0 -1
  184. package/dist/auth/VerifyEmail-DKyDlz96.js +0 -3
  185. package/dist/demo/DemoJsonViewer-DbWVDdz_.js +0 -4
  186. package/dist/demo/DemoLayout-DjIDm93B.js.map +0 -1
  187. package/dist/demo/DemoLayout-nNMajP_9.js +0 -3
  188. package/dist/demo/DemoLogin-BA_HiIRZ.js.map +0 -1
  189. package/dist/demo/DemoRegister-B6syaxP9.js.map +0 -1
  190. package/dist/demo/DemoResetPassword-BOcLG4GF.js.map +0 -1
  191. package/dist/demo/DemoTypeForm-BlLAcQqZ.js.map +0 -1
  192. package/dist/demo/DemoVerifyEmail-C-J7bXUQ.js.map +0 -1
  193. package/dist/demo/Showcase-HchhcsHV.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ui","Omnibar","AlephaMantineProvider","Text","Text","Text","Text","AlertDialog","ConfirmDialog","PromptDialog","Flex","ErrorViewer","Flex","ActionButton","Flex","ActionButton","ActionButton","ActionButton","Flex","Text","ActionButton","Flex","Control","Text","Control","Text","Text","ActionButton","Flex","Flex","ControlQueryBuilder","Flex","ControlObject","ControlArray","ControlNumber","ControlSelect","ControlDate","Control","Flex","ActionButton","BurgerButton","DarkModeButton","OmnibarButton","LanguageButton","Flex","Flex","ActionButton","Flex","OmnibarButton","ToggleSidebarButton","Text","ActionButton","AppBar","Flex","TypeForm","Flex","ActionButton","Text","ActionButton","Text","Flex","FilterPicker","ColumnPicker","ActionButton","Flex","Text","DataTableToolbar","DataTableFilters","DataTablePagination"],"sources":["../../src/core/atoms/alephaThemeAtom.ts","../../src/core/atoms/themes/default.ts","../../src/core/atoms/themes/midnight.ts","../../src/core/atoms/alephaThemeListAtom.ts","../../src/core/providers/ThemeProvider.ts","../../src/core/hooks/useTheme.ts","../../src/core/services/ToastService.tsx","../../src/core/hooks/useToast.ts","../../src/core/constants/ui.ts","../../src/core/helpers/isComponentType.ts","../../src/core/helpers/renderIcon.tsx","../../src/core/components/layout/Omnibar.tsx","../../src/core/components/layout/AlephaMantineProvider.tsx","../../src/core/RootRouter.ts","../../src/core/components/data/ErrorViewer.tsx","../../src/core/components/dialogs/AlertDialog.tsx","../../src/core/components/dialogs/ConfirmDialog.tsx","../../src/core/components/dialogs/PromptDialog.tsx","../../src/core/services/DialogService.tsx","../../src/core/components/buttons/ActionButton.tsx","../../src/core/components/buttons/BurgerButton.tsx","../../src/core/components/buttons/ClipboardButton.tsx","../../src/core/components/buttons/DarkModeButton.tsx","../../src/core/components/buttons/LanguageButton.tsx","../../src/core/components/buttons/OmnibarButton.tsx","../../src/core/components/buttons/ThemeButton.tsx","../../src/core/utils/icons.tsx","../../src/core/utils/string.ts","../../src/core/utils/parseInput.ts","../../src/core/components/form/ControlArray.tsx","../../src/core/components/form/ControlDate.tsx","../../src/core/components/form/ControlNumber.tsx","../../src/core/components/form/ControlObject.tsx","../../src/core/utils/extractSchemaFields.ts","../../src/core/components/form/ControlQueryBuilder.tsx","../../src/core/components/form/ControlSelect.tsx","../../src/core/components/form/Control.tsx","../../src/core/components/form/TypeForm.tsx","../../src/core/components/layout/AppBar.tsx","../../src/core/components/buttons/ToggleSidebarButton.tsx","../../src/core/components/layout/Sidebar.tsx","../../src/core/components/layout/AdminShell.tsx","../../src/core/components/table/DataTableFilters.tsx","../../src/core/components/table/DataTablePagination.tsx","../../src/core/components/table/ColumnPicker.tsx","../../src/core/components/table/FilterPicker.tsx","../../src/core/components/table/DataTableToolbar.tsx","../../src/core/components/table/DataTable.tsx","../../src/core/hooks/useDialog.ts","../../src/core/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\nexport const alephaThemeAtom = $atom({\n name: \"alepha.ui.theme\",\n schema: t.object({\n index: t.integer(),\n }),\n default: {\n index: 0,\n },\n});\n\nexport type CurrentAlephaTheme = Static<typeof alephaThemeAtom.schema>;\n","import type { AlephaTheme } from \"../../interfaces/AlephaTheme.ts\";\n\nexport const defaultTheme: AlephaTheme = {\n name: \"Default\",\n description: \"Default Alepha Theme\",\n};\n","import type { AlephaTheme } from \"../../interfaces/AlephaTheme.ts\";\n\nexport const midnightTheme: AlephaTheme = {\n name: \"Midnight\",\n description: \"Clean, developer-focused design\",\n primaryColor: \"pink\",\n primaryShade: { light: 7, dark: 8 },\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n fontFamilyMonospace:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n headings: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif',\n fontWeight: \"600\",\n textWrap: \"wrap\",\n sizes: {\n h1: { fontSize: \"2rem\", lineHeight: \"1.25\" },\n h2: { fontSize: \"1.5rem\", lineHeight: \"1.3\" },\n h3: { fontSize: \"1.25rem\", lineHeight: \"1.4\" },\n h4: { fontSize: \"1rem\", lineHeight: \"1.5\" },\n h5: { fontSize: \"0.875rem\", lineHeight: \"1.5\" },\n h6: { fontSize: \"0.75rem\", lineHeight: \"1.5\" },\n },\n },\n radius: {\n xs: \"3px\",\n sm: \"6px\",\n md: \"6px\",\n lg: \"8px\",\n xl: \"12px\",\n },\n defaultRadius: \"sm\",\n colors: {\n dark: [\n \"#d0d7de\",\n \"#8b949e\",\n \"#6e7681\",\n \"#484f58\",\n \"#30363d\",\n \"#21262d\",\n \"#161b22\",\n \"#151b23\",\n \"#0d1117\",\n \"#010409\",\n ],\n gray: [\n \"#f6f8fa\",\n \"#eaeef2\",\n \"#d0d7de\",\n \"#afb8c1\",\n \"#8c959f\",\n \"#6e7781\",\n \"#57606a\",\n \"#424a53\",\n \"#32383f\",\n \"#24292f\",\n ],\n blue: [\n \"#ddf4ff\",\n \"#b6e3ff\",\n \"#80ccff\",\n \"#54aeff\",\n \"#218bff\",\n \"#0969da\",\n \"#0550ae\",\n \"#033d8b\",\n \"#0a3069\",\n \"#002155\",\n ],\n green: [\n \"#dafbe1\",\n \"#aceebb\",\n \"#6fdd8b\",\n \"#4ac26b\",\n \"#2da44e\",\n \"#1a7f37\",\n \"#116329\",\n \"#044f1e\",\n \"#003d16\",\n \"#002d11\",\n ],\n red: [\n \"#ffebe9\",\n \"#ffcecb\",\n \"#ffaba8\",\n \"#ff8182\",\n \"#fa4549\",\n \"#cf222e\",\n \"#a40e26\",\n \"#82071e\",\n \"#660018\",\n \"#4c0014\",\n ],\n },\n};\n","import { $atom, t } from \"alepha\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\nimport { defaultTheme } from \"./themes/default.ts\";\nimport { midnightTheme } from \"./themes/midnight.ts\";\n\nexport const alephaThemeListAtom = $atom({\n name: \"alepha.ui.themeList\",\n schema: t.array(t.json<AlephaTheme>()), // TODO: translate to proper schema\n default: [defaultTheme, midnightTheme],\n});\n","import { $head } from \"@alepha/react/head\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport { $cookie } from \"alepha/server/cookies\";\nimport { alephaThemeAtom } from \"../atoms/alephaThemeAtom.ts\";\nimport { alephaThemeListAtom } from \"../atoms/alephaThemeListAtom.ts\";\nimport { defaultTheme } from \"../atoms/themes/default.ts\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\n\nexport class ThemeProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly cookie = $cookie({\n name: \"theme\",\n schema: alephaThemeAtom.schema,\n ttl: [1, \"year\"],\n });\n\n protected readonly head = $head(() => {\n const theme = this.getTheme();\n if (!theme || !theme.name) {\n return {};\n }\n return {\n htmlAttributes: {\n \"data-theme\": theme.name,\n },\n };\n });\n\n public setTheme(index: number) {\n const newTheme = this.alepha.store.get(alephaThemeListAtom)[\n index\n ] as AlephaTheme;\n\n if (!newTheme) {\n throw new AlephaError(`Theme with index ${index} not found`);\n }\n\n this.cookie.set({ index });\n this.alepha.store.set(alephaThemeAtom, { index });\n\n if (typeof document === \"undefined\") {\n return;\n }\n\n document.documentElement.removeAttribute(\"data-theme\");\n\n if (newTheme.name) {\n document.documentElement.setAttribute(\"data-theme\", newTheme.name);\n }\n }\n\n public getTheme() {\n const index = this.getThemeIndex();\n const list = this.alepha.store.get(\n alephaThemeListAtom,\n ) as Array<AlephaTheme>;\n return list[index] || list[0] || defaultTheme;\n }\n\n protected getThemeIndex() {\n // TODO: make a safe cookie getter, today it crash when Cookie Server is called inside vite pre-render\n try {\n return (\n this.cookie.get()?.index ??\n this.alepha.store.get(alephaThemeAtom)?.index ??\n 0\n );\n } catch {\n return this.alepha.store.get(alephaThemeAtom)?.index ?? 0;\n }\n }\n}\n","import { useInject, useStore } from \"@alepha/react\";\nimport {\n alephaThemeAtom,\n type CurrentAlephaTheme,\n} from \"../atoms/alephaThemeAtom.ts\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\nimport { ThemeProvider } from \"../providers/ThemeProvider.ts\";\n\n/**\n * Hook to get and set the current theme.\n *\n * Returns a tuple with the current theme and a function to set the theme.\n *\n * ```tsx\n * const [theme, setTheme] = useTheme();\n * ```\n */\nexport const useTheme = (): [\n AlephaTheme,\n (theme: CurrentAlephaTheme) => void,\n] => {\n useStore(alephaThemeAtom);\n\n const themeProvider = useInject(ThemeProvider);\n const theme = themeProvider.getTheme();\n const setTheme = (theme: CurrentAlephaTheme) => {\n themeProvider.setTheme(theme.index);\n };\n\n return [theme, setTheme] as const;\n};\n","import type { NotificationData } from \"@mantine/notifications\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from \"@tabler/icons-react\";\n\nexport interface ToastServiceOptions {\n default?: Partial<NotificationData>;\n}\n\nexport class ToastService {\n protected readonly raw = notifications;\n\n public readonly options: ToastServiceOptions = {\n default: {\n radius: \"md\",\n withBorder: true,\n withCloseButton: true,\n autoClose: 5000,\n position: \"top-center\",\n },\n };\n\n public show(options: NotificationData) {\n notifications.show({\n ...this.options.default,\n ...options,\n });\n }\n\n public info(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"blue\",\n icon: <IconInfoCircle size={20} />,\n title: \"Info\",\n message: \"Information notification\",\n ...options,\n });\n }\n\n public success(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"green\",\n icon: <IconCheck size={16} />,\n title: \"Success\",\n message: \"Operation completed successfully\",\n ...options,\n });\n }\n\n public warning(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"yellow\",\n icon: <IconAlertTriangle size={20} />,\n title: \"Warning\",\n message: \"Please review this warning\",\n ...options,\n });\n }\n\n public danger(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"red\",\n icon: <IconX size={20} />,\n title: \"Error\",\n message: \"An error occurred\",\n ...options,\n });\n }\n}\n","import { useInject } from \"@alepha/react\";\nimport { ToastService } from \"../services/ToastService.tsx\";\n\n/**\n * Use this hook to access the Toast Service for showing notifications.\n *\n * @example\n * ```tsx\n * const toast = useToast();\n * toast.success({ message: \"Operation completed successfully!\" });\n * toast.error({ title: \"Error\", message: \"Something went wrong\" });\n * ```\n */\nexport const useToast = (): ToastService => {\n return useInject(ToastService);\n};\n","export const ui = {\n colors: {\n transparent: \"transparent\",\n background: \"var(--alepha-background)\",\n surface: \"var(--alepha-surface)\",\n elevated: \"var(--alepha-elevated)\",\n border: \"var(--alepha-border)\",\n },\n sizes: {\n icon: {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n },\n },\n};\n","import { type ComponentType, isValidElement } from \"react\";\n\nexport function isComponentType(param: any): param is ComponentType<any> {\n if (isValidElement(param)) return false;\n return (\n typeof param === \"function\" ||\n (typeof param === \"object\" && param !== null && \"$$typeof\" in param)\n );\n}\n","import { ui } from \"@alepha/ui\";\nimport { type ComponentType, isValidElement, type ReactNode } from \"react\";\nimport { isComponentType } from \"./isComponentType.ts\";\n\nexport const renderIcon = (icon: ReactNode | ComponentType): ReactNode => {\n if (!icon) return null;\n if (isValidElement(icon)) return icon;\n if (isComponentType(icon)) {\n const IconComponent = icon;\n return <IconComponent size={ui.sizes.icon.md} />;\n }\n return icon as ReactNode;\n};\n","import { useStore } from \"@alepha/react\";\nimport { useRouter } from \"@alepha/react/router\";\nimport { Spotlight, type SpotlightActionData } from \"@mantine/spotlight\";\nimport { IconSearch } from \"@tabler/icons-react\";\nimport { type ReactNode, useMemo } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport { renderIcon } from \"../../helpers/renderIcon.tsx\";\n\nexport interface OmnibarProps {\n shortcut?: string | string[];\n searchPlaceholder?: string;\n nothingFound?: ReactNode;\n}\n\nconst Omnibar = (props: OmnibarProps) => {\n const shortcut = props.shortcut ?? \"mod+K\";\n const searchPlaceholder = props.searchPlaceholder ?? \"Search...\";\n const nothingFound = props.nothingFound ?? \"Nothing found...\";\n const router = useRouter();\n\n // watch user to re-render on permission changes\n const [user] = useStore(\"alepha.server.request.user\");\n\n const actions: SpotlightActionData[] = useMemo(\n () =>\n router.concretePages\n .filter((page) => {\n if (page.can && !page.can()) return false;\n\n return true;\n })\n .map((page) => ({\n id: page.name,\n label: page.label ?? page.name,\n description: page.description,\n onClick: () => {\n if (page.staticName) {\n return router.go(page.staticName, { params: page.params });\n }\n return router.go(page.name);\n },\n leftSection: renderIcon(page.icon),\n })),\n [user],\n );\n\n return (\n <Spotlight\n actions={actions}\n shortcut={shortcut}\n limit={10}\n searchProps={{\n leftSection: <IconSearch size={ui.sizes.icon.md} />,\n placeholder: searchPlaceholder,\n }}\n nothingFound={nothingFound}\n />\n );\n};\n\nexport default Omnibar;\n","import { useEvents } from \"@alepha/react\";\nimport { FormValidationError } from \"@alepha/react/form\";\nimport { NestedView } from \"@alepha/react/router\";\nimport {\n ColorSchemeScript,\n type ColorSchemeScriptProps,\n MantineProvider,\n type MantineProviderProps,\n} from \"@mantine/core\";\nimport { ModalsProvider, type ModalsProviderProps } from \"@mantine/modals\";\nimport { Notifications, type NotificationsProps } from \"@mantine/notifications\";\nimport type { NavigationProgressProps } from \"@mantine/nprogress\";\nimport { NavigationProgress, nprogress } from \"@mantine/nprogress\";\nimport { TypeBoxError } from \"alepha\";\nimport type { ReactNode } from \"react\";\nimport { useTheme } from \"../../hooks/useTheme.ts\";\nimport { useToast } from \"../../hooks/useToast.ts\";\nimport Omnibar, { type OmnibarProps } from \"./Omnibar.tsx\";\n\nexport interface AlephaMantineProviderProps {\n children?: ReactNode;\n mantine?: MantineProviderProps;\n colorSchemeScript?: ColorSchemeScriptProps;\n navigationProgress?: NavigationProgressProps;\n notifications?: NotificationsProps;\n modals?: ModalsProviderProps;\n omnibar?: OmnibarProps | false;\n}\n\nconst AlephaMantineProvider = (props: AlephaMantineProviderProps) => {\n const toast = useToast();\n const [theme] = useTheme();\n\n useEvents(\n {\n \"react:transition:begin\": () => {\n nprogress.start();\n },\n \"react:transition:end\": () => {\n nprogress.complete();\n },\n \"react:action:error\": ({ error }) => {\n if (\n error instanceof FormValidationError ||\n error instanceof TypeBoxError\n ) {\n // Validation errors are handled by the form component\n return;\n }\n\n toast.danger({\n title: error.name || \"Error\",\n message:\n error.message ?? \"An error occurred while processing your action.\",\n });\n },\n },\n [],\n );\n\n const defaultColorScheme =\n props.mantine?.defaultColorScheme ?? theme.defaultColorScheme;\n\n return (\n <>\n <ColorSchemeScript\n defaultColorScheme={defaultColorScheme}\n {...props.colorSchemeScript}\n />\n <MantineProvider\n {...props.mantine}\n defaultColorScheme={defaultColorScheme}\n theme={{\n // Spread all theme properties from the selected theme\n ...theme,\n // User overrides take precedence\n ...props.mantine?.theme,\n }}\n >\n <Notifications {...props.notifications} />\n <NavigationProgress {...props.navigationProgress} />\n <ModalsProvider {...props.modals}>\n {props.omnibar !== false && <Omnibar {...props.omnibar} />}\n {props.children ?? <NestedView />}\n </ModalsProvider>\n </MantineProvider>\n </>\n );\n};\n\nexport default AlephaMantineProvider;\n","import { $page } from \"@alepha/react/router\";\nimport AlephaMantineProvider from \"./components/layout/AlephaMantineProvider.tsx\";\n\nexport class RootRouter {\n public readonly root = $page({\n path: \"/\",\n component: AlephaMantineProvider,\n });\n}\n","import {\n ActionIcon,\n Box,\n Collapse,\n CopyButton,\n type MantineSize,\n Text,\n Tooltip,\n} from \"@mantine/core\";\nimport {\n IconCheck,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\n\ninterface ErrorViewerProps {\n error: Error | unknown;\n showStack?: boolean;\n copyable?: boolean;\n size?: MantineSize;\n}\n\nconst getSizeConfig = (size: MantineSize = \"sm\") => {\n const configs = {\n xs: { text: \"xs\", icon: 12, gap: 2 },\n sm: { text: \"sm\", icon: 14, gap: 4 },\n md: { text: \"md\", icon: 16, gap: 6 },\n lg: { text: \"lg\", icon: 18, gap: 8 },\n xl: { text: \"xl\", icon: 20, gap: 10 },\n };\n return configs[size] || configs.sm;\n};\n\nconst parseStackTrace = (stack: string): string[] => {\n return stack\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n};\n\nexport const ErrorViewer = ({\n error,\n showStack = true,\n copyable = true,\n size = \"sm\",\n}: ErrorViewerProps) => {\n const [stackExpanded, setStackExpanded] = useState(false);\n const sizeConfig = getSizeConfig(size);\n const copyIconSize = sizeConfig.icon + 2;\n\n const isError = error instanceof Error;\n const errorName = isError ? error.name : \"Error\";\n const errorMessage = isError ? error.message : String(error);\n const errorStack = isError ? error.stack : undefined;\n const stackLines = errorStack ? parseStackTrace(errorStack) : [];\n\n const getCopyContent = () => {\n if (isError) {\n return `${errorName}: ${errorMessage}${errorStack ? `\\n\\n${errorStack}` : \"\"}`;\n }\n return String(error);\n };\n\n return (\n <Box pos=\"relative\" w=\"100%\">\n {copyable && (\n <Box pos=\"absolute\" top={0} right={0} style={{ zIndex: 1 }}>\n <CopyButton value={getCopyContent()}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? \"Copied\" : \"Copy Error\"}>\n <ActionIcon\n color={copied ? \"teal\" : \"gray\"}\n variant=\"subtle\"\n onClick={copy}\n size={size}\n >\n {copied ? (\n <IconCheck size={copyIconSize} />\n ) : (\n <IconCopy size={copyIconSize} />\n )}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n </Box>\n )}\n <Box pt={copyable ? 30 : 0}>\n <Box\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: sizeConfig.gap,\n }}\n >\n <Text\n component=\"span\"\n c=\"red\"\n ff=\"monospace\"\n fw={600}\n size={sizeConfig.text}\n >\n {errorName}:\n </Text>\n <Text\n component=\"span\"\n ff=\"monospace\"\n size={sizeConfig.text}\n style={{ wordBreak: \"break-word\" }}\n >\n {errorMessage}\n </Text>\n </Box>\n\n {showStack && stackLines.length > 1 && (\n <Box mt=\"sm\">\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n cursor: \"pointer\",\n }}\n onClick={() => setStackExpanded(!stackExpanded)}\n >\n <ActionIcon size=\"xs\" variant=\"transparent\" c=\"dimmed\">\n {stackExpanded ? (\n <IconChevronDown size={sizeConfig.icon} />\n ) : (\n <IconChevronRight size={sizeConfig.icon} />\n )}\n </ActionIcon>\n <Text c=\"dimmed\" size={sizeConfig.text} fw={500}>\n Stack Trace ({stackLines.length - 1} frames)\n </Text>\n </Box>\n\n <Collapse in={stackExpanded}>\n <Box\n mt=\"xs\"\n pl=\"md\"\n style={{\n borderLeft: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n {stackLines.slice(1).map((line, index) => (\n <Text\n key={index}\n ff=\"monospace\"\n size=\"xs\"\n c=\"dimmed\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-all\",\n }}\n >\n {line}\n </Text>\n ))}\n </Box>\n </Collapse>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n\nexport default ErrorViewer;\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { AlertDialogProps } from \"../../services/DialogService.tsx\";\n\nconst AlertDialog = ({ options, onClose }: AlertDialogProps) => (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button onClick={onClose}>{options?.okLabel || \"OK\"}</Button>\n </Group>\n </>\n);\n\nexport default AlertDialog;\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { ConfirmDialogProps } from \"../../services/DialogService.tsx\";\n\nconst ConfirmDialog = ({ options, onConfirm }: ConfirmDialogProps) => (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onConfirm(false)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n color={options?.confirmColor || \"blue\"}\n onClick={() => onConfirm(true)}\n >\n {options?.confirmLabel || \"Confirm\"}\n </Button>\n </Group>\n </>\n);\n\nexport default ConfirmDialog;\n","import { Button, Group, Text, TextInput } from \"@mantine/core\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PromptDialogProps } from \"../../services/DialogService.tsx\";\n\nconst PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {\n const [value, setValue] = useState(options?.defaultValue || \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n // autofocus the input when the dialog opens\n inputRef.current?.focus();\n }, []);\n\n const handleSubmit = () => {\n if (!options?.required || value.trim()) {\n onSubmit(value);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\") {\n handleSubmit();\n }\n };\n\n return (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <TextInput\n ref={inputRef}\n label={options?.label}\n placeholder={options?.placeholder}\n value={value}\n onChange={(event) => setValue(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n required={options?.required}\n mb=\"md\"\n />\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onSubmit(null)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={options?.required && !value.trim()}\n >\n {options?.submitLabel || \"OK\"}\n </Button>\n </Group>\n </>\n );\n};\n\nexport default PromptDialog;\n","import { Flex, type ModalProps } from \"@mantine/core\";\nimport { modals } from \"@mantine/modals\";\nimport type { ReactNode } from \"react\";\nimport ErrorViewer from \"../components/data/ErrorViewer.tsx\";\nimport AlertDialog from \"../components/dialogs/AlertDialog.tsx\";\nimport ConfirmDialog from \"../components/dialogs/ConfirmDialog.tsx\";\nimport PromptDialog from \"../components/dialogs/PromptDialog.tsx\";\nimport { ui } from \"../constants/ui.ts\";\n\n// Base interfaces\nexport interface BaseDialogOptions extends Partial<ModalProps> {\n title?: ReactNode;\n message?: ReactNode;\n content?: any; // weird typing for mantine modals content\n}\n\nexport interface AlertDialogOptions extends BaseDialogOptions {\n okLabel?: string;\n}\n\nexport interface ConfirmDialogOptions extends BaseDialogOptions {\n confirmLabel?: string;\n cancelLabel?: string;\n confirmColor?: string;\n}\n\nexport interface PromptDialogOptions extends BaseDialogOptions {\n placeholder?: string;\n defaultValue?: string;\n label?: string;\n required?: boolean;\n submitLabel?: string;\n cancelLabel?: string;\n}\n\n// Component prop interfaces\nexport interface AlertDialogProps {\n options?: AlertDialogOptions;\n onClose: () => void;\n}\n\nexport interface ConfirmDialogProps {\n options?: ConfirmDialogOptions;\n onConfirm: (confirmed: boolean) => void;\n}\n\nexport interface PromptDialogProps {\n options?: PromptDialogOptions;\n onSubmit: (value: string | null) => void;\n}\n\nexport interface DialogServiceOptions {\n default?: Partial<BaseDialogOptions>;\n}\n\nexport class DialogService {\n public readonly options: DialogServiceOptions = {\n default: {\n centered: true,\n withCloseButton: true,\n size: \"md\",\n overlayProps: {\n backgroundOpacity: 0.55,\n blur: 3,\n },\n transitionProps: {\n transition: \"pop\",\n duration: 200,\n },\n },\n };\n\n /**\n * Show an alert dialog with a message\n */\n public alert(options?: AlertDialogOptions): Promise<void> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Alert\",\n content: (\n <AlertDialog\n options={options}\n onClose={() => {\n this.close(modalId);\n resolve();\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a confirmation dialog that returns a promise\n */\n public confirm(options?: ConfirmDialogOptions): Promise<boolean> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Confirm\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <ConfirmDialog\n options={options}\n onConfirm={(confirmed) => {\n this.close(modalId);\n resolve(confirmed);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a prompt dialog to get user input\n */\n public prompt(options?: PromptDialogOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Input\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <PromptDialog\n options={options}\n onSubmit={(value) => {\n this.close(modalId);\n resolve(value);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Open a custom dialog with provided content\n */\n public open(options?: BaseDialogOptions): string {\n return modals.open({\n ...this.options.default,\n ...options,\n children: options?.content || options?.message,\n });\n }\n\n /**\n * Close the currently open dialog or a specific dialog by ID\n */\n public close(modalId?: string): void {\n if (modalId) {\n modals.close(modalId);\n } else {\n modals.closeAll();\n }\n }\n\n /**\n * Show an error viewer dialog\n */\n public error(\n error: Error | unknown,\n options?: BaseDialogOptions & { showStack?: boolean },\n ): void {\n this.open({\n size: \"lg\",\n title: options?.title || \"Error\",\n ...options,\n content: (\n <Flex bdrs={\"md\"} w={\"100%\"} flex={1} p={\"sm\"} bg={ui.colors.surface}>\n <ErrorViewer\n size={\"xs\"}\n error={error}\n showStack={options?.showStack ?? true}\n />\n </Flex>\n ),\n });\n }\n\n /**\n * Show a form dialog for structured input\n */\n public form(options?: BaseDialogOptions): Promise<any> {\n // Implementation to be added\n return Promise.resolve(null);\n }\n\n /**\n * Show a loading/progress dialog with optional progress percentage\n */\n public loading(options?: BaseDialogOptions & { progress?: number }): void {\n // Implementation to be added\n }\n\n /**\n * Show an image viewer/gallery dialog\n */\n public image(src: string | string[], options?: BaseDialogOptions): void {\n // Implementation to be added\n }\n}\n","import { type UseActionReturn, useAction } from \"@alepha/react\";\nimport { type FormModel, useFormState } from \"@alepha/react/form\";\nimport {\n type RouterGoOptions,\n type UseActiveOptions,\n useActive,\n useRouter,\n} from \"@alepha/react/router\";\nimport {\n Anchor,\n type AnchorProps,\n Button,\n type ButtonProps,\n Flex,\n Menu,\n type MenuItemProps,\n type MenuProps,\n type MenuTargetProps,\n ThemeIcon,\n type ThemeIconProps,\n Tooltip,\n type TooltipProps,\n useMantineTheme,\n} from \"@mantine/core\";\nimport { IconCheck, IconChevronRight } from \"@tabler/icons-react\";\nimport {\n type ButtonHTMLAttributes,\n Children,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport { isComponentType } from \"../../helpers/isComponentType.ts\";\n\nexport interface ActionMenuItem {\n /**\n * Menu item type\n */\n type?: \"item\" | \"divider\" | \"label\";\n\n /**\n * Label text for the menu item\n */\n label?: string | ReactNode;\n\n /**\n * Icon element to display before the label\n */\n icon?: ReactNode;\n\n /**\n * Click handler for menu items\n */\n onClick?: () => void;\n\n /**\n * Href for navigation menu items\n */\n href?: string;\n\n /**\n * Color for the menu item (e.g., \"red\" for danger actions)\n */\n color?: string;\n\n /**\n * Nested submenu items\n */\n children?: ActionMenuItem[];\n\n /**\n * Whether the menu item is active\n */\n active?: boolean;\n}\n\nexport interface ActionMenuConfig {\n /**\n * Array of menu items to display\n */\n items: ActionMenuItem[];\n\n /**\n * Menu position relative to the button\n */\n position?:\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"left\"\n | \"right\";\n\n /**\n * Menu width\n */\n width?: number | string;\n\n /**\n * Menu shadow\n */\n shadow?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n on?: \"hover\" | \"click\";\n\n targetProps?: MenuTargetProps;\n\n menuProps?: MenuProps;\n}\n\nexport interface ActionCommonProps extends ButtonProps {\n children?: ReactNode;\n\n textVisibleFrom?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n /**\n * Tooltip to display on hover. Can be a string for simple tooltips\n * or a TooltipProps object for advanced configuration.\n */\n tooltip?: string | number | TooltipProps;\n\n /**\n * Menu configuration. When provided, the action will display a dropdown menu.\n */\n menu?: ActionMenuConfig;\n\n /**\n * If set, a confirmation dialog will be shown before performing the action.\n * If `true`, a default title and message will be used.\n * If a string, it will be used as the message with a default title.\n * If an object, it can contain `title` and `message` properties to customize the dialog.\n */\n confirm?: boolean | string | { title?: string; message: string };\n\n /**\n * Icon to display on the left side of the button.\n * If no children are provided, the button will be styled as an icon-only button.\n */\n icon?: ReactNode | ComponentType;\n\n /**\n * Additional props to pass to the ThemeIcon wrapping the icon.\n */\n themeIconProps?: ThemeIconProps;\n\n /**\n * Visual intent of the action button.\n */\n intent?: \"primary\" | \"success\" | \"danger\" | \"warning\" | \"info\" | \"none\";\n}\n\nexport type ActionProps = ActionCommonProps &\n (\n | ActionNavigationButtonProps\n | ActionClickButtonProps\n | ActionSubmitButtonProps\n | ActionHookButtonProps\n | {}\n );\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Helper function to render menu items recursively\nconst ActionMenuItem = (props: {\n item: ActionMenuItem;\n index: number;\n}): ReactNode => {\n const { item, index } = props;\n\n const router = useRouter();\n const action = useAction(\n {\n handler: async (e: any) => {\n await item.onClick?.();\n },\n },\n [item.onClick],\n );\n\n // Render divider\n if (item.type === \"divider\") {\n return <Menu.Divider key={index} />;\n }\n\n // Render label\n if (item.type === \"label\") {\n return <Menu.Label key={index}>{item.label}</Menu.Label>;\n }\n\n // Render submenu if it has children\n if (item.children && item.children.length > 0) {\n return (\n <Menu key={index} trigger=\"hover\" position=\"right-start\" offset={2}>\n <Menu.Target>\n <Menu.Item\n leftSection={item.icon}\n rightSection={<IconChevronRight size={14} />}\n >\n {item.label}\n </Menu.Item>\n </Menu.Target>\n <Menu.Dropdown>\n {item.children.map((child, childIndex) => (\n <ActionMenuItem item={child} index={childIndex} key={childIndex} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};\n if (props.item.onClick) {\n menuItemProps.onClick = action.run;\n } else if (props.item.href) {\n Object.assign(menuItemProps, router.anchor(props.item.href));\n }\n\n // render regular menu item\n return (\n <Menu.Item\n key={index}\n leftSection={item.icon}\n onClick={item.onClick}\n color={item.color}\n rightSection={\n item.active ? (\n <ThemeIcon size={\"xs\"} variant={\"transparent\"}>\n <IconCheck />\n </ThemeIcon>\n ) : undefined\n }\n {...menuItemProps}\n >\n {item.label}\n </Menu.Item>\n );\n};\n\nconst ActionButton = (_props: ActionProps) => {\n const theme = useMantineTheme();\n const props = { ..._props };\n const { tooltip, menu, icon, ...restProps } = props;\n\n if (props.variant === \"subtle\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"gray\";\n }\n\n if (props.intent) {\n if (props.intent === \"none\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"gray\";\n } else if (props.intent === \"primary\") {\n restProps.c ??= \"white\";\n restProps.color ??= theme.primaryColor;\n } else if (props.intent === \"success\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"green\";\n } else if (props.intent === \"danger\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"red\";\n } else if (props.intent === \"warning\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"yellow\";\n } else if (props.intent === \"info\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"blue\";\n }\n }\n\n if (props.icon) {\n const icon = isComponentType(props.icon) ? (\n <props.icon size={ui.sizes.icon.md} />\n ) : (\n <ThemeIcon\n w={24} // TODO: make size configurable\n variant={\"transparent\"}\n size={\"sm\"}\n c={\"var(--mantine-color-text)\"}\n {...props.themeIconProps}\n >\n {props.icon as ReactNode}\n </ThemeIcon>\n );\n\n if (!props.children) {\n restProps.children = Children.only(icon);\n restProps.px ??= \"xs\";\n } else {\n restProps.leftSection = icon;\n }\n }\n\n if (props.leftSection && !props.children) {\n restProps.px ??= \"xs\";\n }\n\n if (props.textVisibleFrom) {\n const { children, textVisibleFrom, leftSection, ...rest } = restProps;\n return (\n <>\n <Flex w={\"100%\"} visibleFrom={textVisibleFrom}>\n <ActionButton\n flex={1}\n {...rest}\n leftSection={leftSection}\n tooltip={tooltip}\n menu={menu}\n >\n {children}\n </ActionButton>\n </Flex>\n <Flex w={\"100%\"} hiddenFrom={textVisibleFrom}>\n <ActionButton px={\"xs\"} {...rest} tooltip={tooltip} menu={menu}>\n {leftSection}\n </ActionButton>\n </Flex>\n </>\n );\n }\n\n const renderAction = () => {\n if (\"href\" in restProps && restProps.href) {\n if (restProps.href.startsWith(\"http\") || restProps.target) {\n return (\n <ActionHrefButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionHrefButton>\n );\n }\n return (\n <ActionNavigationButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionNavigationButton>\n );\n }\n\n delete (restProps as any).classNameActive;\n delete (restProps as any).variantActive;\n\n if (\"action\" in restProps && restProps.action) {\n return (\n <ActionHookButton {...restProps} action={restProps.action}>\n {restProps.children}\n </ActionHookButton>\n );\n }\n\n if (\"onClick\" in restProps && restProps.onClick) {\n return (\n <ActionClickButton {...restProps} onClick={restProps.onClick}>\n {restProps.children}\n </ActionClickButton>\n );\n }\n\n if (\"form\" in restProps && restProps.form) {\n if (restProps.type === \"reset\") {\n return (\n <ActionResetButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionResetButton>\n );\n }\n return (\n <ActionSubmitButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionSubmitButton>\n );\n }\n\n return <Button {...(restProps as any)}>{restProps.children}</Button>;\n };\n\n let actionElement = renderAction();\n\n // wrap with Menu if provided\n if (menu) {\n actionElement = (\n <Menu\n position={menu.position || \"bottom-start\"}\n width={menu.width || 200}\n shadow={menu.shadow || \"md\"}\n trigger={menu.on === \"hover\" ? \"hover\" : \"click\"}\n {...menu.menuProps}\n >\n <Menu.Target {...menu.targetProps}>{actionElement}</Menu.Target>\n <Menu.Dropdown>\n {menu.items.map((item, index) => (\n <ActionMenuItem item={item} index={index} key={index} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n // Wrap with Tooltip if provided\n if (tooltip) {\n // openDelay: 1000 -> like HTML title attribute\n const defaultTooltipProps: Partial<TooltipProps> = {\n openDelay: 1000,\n };\n const tooltipProps: TooltipProps =\n typeof tooltip === \"string\" || typeof tooltip === \"number\"\n ? {\n ...defaultTooltipProps,\n label: tooltip,\n children: actionElement,\n }\n : { ...defaultTooltipProps, ...tooltip, children: actionElement };\n\n return <Tooltip {...tooltipProps} />;\n }\n\n return actionElement;\n};\n\nexport default ActionButton;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Submit\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionSubmitButtonProps extends ButtonProps {\n form: FormModel<any>;\n type?: \"submit\" | \"reset\";\n}\n\n/**\n * Action button that submits a form with loading and disabled state handling.\n */\nconst ActionSubmitButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button\n {...buttonProps}\n loading={state.loading}\n disabled={state.loading}\n type={\"submit\"}\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionResetButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button {...buttonProps} disabled={state.loading} type={\"reset\"}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action with useAction Hook\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionHookButtonProps extends ButtonProps {\n action: UseActionReturn<any[], any>;\n}\n\n/**\n * Action button that integrates with useAction hook return value.\n * Automatically handles loading state and executes the action on click.\n *\n * @example\n * ```tsx\n * const saveAction = useAction({\n * handler: async (data) => {\n * await api.save(data);\n * }\n * }, []);\n *\n * <ActionButton action={saveAction}>\n * Save\n * </ActionButton>\n * ```\n */\nconst ActionHookButton = (props: ActionHookButtonProps) => {\n const { action, ...buttonProps } = props;\n\n return (\n <Button\n {...buttonProps}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={() => action.run()}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Click\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionClickButtonProps extends ButtonProps {\n onClick: (e: any) => any;\n}\n\n/**\n * Basic action button that handles click events with loading and error handling.\n *\n * @example\n * ```tsx\n * <ActionButton onClick={() => api.doSomething()}>\n * Do Something\n * </ActionButton>\n * ```\n */\nconst ActionClickButton = (props: ActionClickButtonProps) => {\n const action = useAction(\n {\n handler: async (e: any) => {\n await props.onClick(e);\n },\n },\n [props.onClick],\n );\n\n return (\n <Button\n {...props}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={action.run}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Navigation\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionNavigationButtonProps extends ButtonProps {\n href: string;\n active?: Partial<UseActiveOptions> | false;\n routerGoOptions?: RouterGoOptions;\n classNameActive?: string;\n variantActive?: ButtonProps[\"variant\"];\n target?: string;\n anchorProps?: AnchorProps;\n}\n\n/**\n * Action for navigation with active state support.\n */\nconst ActionNavigationButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n ...buttonProps\n } = props;\n const router = useRouter();\n const { isPending, isActive } = useActive(\n options ? { href: props.href, ...options } : { href: props.href },\n );\n const anchorProps = router.anchor(props.href, routerGoOptions);\n\n const className = buttonProps.className || \"\";\n if (isActive && options !== false && classNameActive) {\n buttonProps.className = `${className} ${classNameActive}`.trim();\n }\n\n if (props.anchorProps) {\n return (\n <Anchor component={\"a\"} {...anchorProps} {...props.anchorProps}>\n {props.children}\n </Anchor>\n );\n }\n\n return (\n <Button\n component={\"a\"}\n loading={isPending}\n {...buttonProps}\n {...anchorProps}\n variant={\n isActive && options !== false\n ? (variantActive ?? \"filled\")\n : (buttonProps.variant ?? \"subtle\")\n }\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionHrefButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n target,\n ...buttonProps\n } = props;\n\n return (\n <Button component={\"a\"} target={target} {...buttonProps}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n","import { useStore } from \"@alepha/react\";\nimport { Burger, type BurgerProps } from \"@mantine/core\";\n\nexport interface BurgerButtonProps extends BurgerProps {}\n\nconst BurgerButton = (props: BurgerButtonProps) => {\n const [opened, setOpened] = useStore(\"alepha.ui.sidebar.opened\");\n\n return (\n <Burger\n opened={opened}\n onClick={() => setOpened(!opened)}\n hiddenFrom=\"sm\"\n size=\"sm\"\n {...props}\n />\n );\n};\n\nexport default BurgerButton;\n","import { CopyButton, Tooltip } from \"@mantine/core\";\nimport { IconCheck, IconCopy } from \"@tabler/icons-react\";\nimport ActionButton, { type ActionCommonProps } from \"./ActionButton.tsx\";\n\nexport interface ClipboardButtonProps\n extends Omit<ActionCommonProps, \"onClick\" | \"icon\"> {\n /**\n * The value to copy to the clipboard\n */\n value: string;\n\n /**\n * Timeout in ms to show the \"Copied\" state (default: 2000)\n */\n timeout?: number;\n\n /**\n * Label to show in tooltip when not copied (default: \"Copy\")\n */\n copyLabel?: string;\n\n /**\n * Label to show in tooltip when copied (default: \"Copied\")\n */\n copiedLabel?: string;\n}\n\nconst ClipboardButton = (props: ClipboardButtonProps) => {\n const {\n value,\n timeout = 2000,\n copyLabel = \"Copy\",\n copiedLabel = \"Copied\",\n children,\n ...buttonProps\n } = props;\n\n return (\n <CopyButton value={value} timeout={timeout}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? copiedLabel : copyLabel} openDelay={500}>\n <ActionButton\n color={copied ? \"teal\" : undefined}\n onClick={copy}\n icon={copied ? IconCheck : IconCopy}\n {...buttonProps}\n >\n {children}\n </ActionButton>\n </Tooltip>\n )}\n </CopyButton>\n );\n};\n\nexport default ClipboardButton;\n","import {\n Flex,\n type MantineBreakpoint,\n SegmentedControl,\n type SegmentedControlProps,\n useComputedColorScheme,\n useMantineColorScheme,\n} from \"@mantine/core\";\nimport { IconMoon, IconSun } from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface DarkModeButtonProps {\n mode?: \"minimal\" | \"segmented\";\n size?: MantineBreakpoint;\n variant?:\n | \"filled\"\n | \"light\"\n | \"outline\"\n | \"default\"\n | \"subtle\"\n | \"transparent\";\n\n fullWidth?: boolean;\n\n segmentedProps?: Partial<SegmentedControlProps>;\n actionProps?: Partial<ActionProps>;\n}\n\nconst DarkModeButton = (props: DarkModeButtonProps) => {\n const { setColorScheme } = useMantineColorScheme();\n const computedColorScheme = useComputedColorScheme(\"light\");\n const [colorScheme, setColorScheme2] = useState(\"default\");\n const mode = props.mode ?? \"minimal\";\n\n useEffect(() => {\n setColorScheme2(computedColorScheme);\n }, [computedColorScheme]);\n\n const toggleColorScheme = () => {\n setColorScheme(computedColorScheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n if (mode === \"segmented\") {\n return (\n <SegmentedControl\n value={colorScheme}\n onChange={(value) => setColorScheme(value as \"light\" | \"dark\")}\n data={[\n {\n value: \"light\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconSun size={16} />\n </Flex>\n ),\n },\n {\n value: \"dark\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconMoon size={16} />\n </Flex>\n ),\n },\n ]}\n w={props.fullWidth ? \"100%\" : undefined}\n {...props.segmentedProps}\n />\n );\n }\n\n return (\n <ActionButton\n onClick={toggleColorScheme}\n variant={props.variant ?? \"subtle\"}\n size={props.size ?? \"sm\"}\n aria-label=\"Toggle color scheme\"\n px={\"xs\"}\n fullWidth={props.fullWidth ?? false}\n icon={\n colorScheme === \"dark\"\n ? IconSun\n : colorScheme === \"light\"\n ? IconMoon\n : IconSun\n }\n {...props.actionProps}\n />\n );\n};\n\nexport default DarkModeButton;\n","import { useI18n } from \"@alepha/react/i18n\";\nimport { IconLanguage } from \"@tabler/icons-react\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface LanguageButtonProps {\n languages?: string[];\n actionProps?: ActionProps;\n}\n\nconst LanguageButton = (props: LanguageButtonProps) => {\n const i18n = useI18n();\n return (\n <ActionButton\n variant={\"default\"}\n icon={IconLanguage}\n menu={{\n items: i18n.languages.map((lang) => ({\n label: i18n.tr(lang),\n onClick: () => i18n.setLang(lang),\n active: i18n.lang === lang,\n })),\n }}\n {...props.actionProps}\n />\n );\n};\n\nexport default LanguageButton;\n","import { Flex, Kbd, Text } from \"@mantine/core\";\nimport { spotlight } from \"@mantine/spotlight\";\nimport { IconSearch } from \"@tabler/icons-react\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface OmnibarButtonProps {\n actionProps?: ActionProps;\n collapsed?: boolean;\n}\n\nconst OmnibarButton = (props: OmnibarButtonProps) => {\n return (\n <ActionButton\n variant={\"default\"}\n onClick={spotlight.open}\n justify={\"space-between\"}\n rightSection={\n <Kbd visibleFrom={\"sm\"} size={\"sm\"}>\n ⌘+K\n </Kbd>\n }\n radius={\"md\"}\n {...props.actionProps}\n >\n <Flex align={\"center\"} gap={\"xs\"}>\n <IconSearch size={16} color={\"gray\"} />\n <Flex visibleFrom={\"sm\"} miw={192}>\n <Text size={\"xs\"} c={\"dimmed\"}>\n Search...\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n};\n\nexport default OmnibarButton;\n","import { useStore } from \"@alepha/react\";\nimport { IconPalette } from \"@tabler/icons-react\";\nimport { alephaThemeListAtom } from \"../../atoms/alephaThemeListAtom.ts\";\nimport { useTheme } from \"../../hooks/useTheme.ts\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface ThemeButtonProps {\n actionProps?: Partial<ActionProps>;\n}\n\nconst ThemeButton = (props: ThemeButtonProps) => {\n const [theme, setTheme] = useTheme();\n const themeList = useStore(alephaThemeListAtom)[0];\n\n return (\n <ActionButton\n variant=\"subtle\"\n icon={IconPalette}\n menu={{\n items: themeList.map((it, index) => ({\n label: it.name,\n onClick: () =>\n setTheme({\n index,\n }),\n active: theme.name === it.name,\n })),\n }}\n {...props.actionProps}\n />\n );\n};\n\nexport default ThemeButton;\n","import {\n IconAt,\n IconCalendar,\n IconClock,\n IconColorPicker,\n IconFile,\n IconHash,\n IconKey,\n IconLetterCase,\n IconLink,\n IconList,\n IconMail,\n IconPalette,\n IconPhone,\n IconSelector,\n IconToggleLeft,\n} from \"@tabler/icons-react\";\nimport type { ReactElement } from \"react\";\nimport { ui } from \"../constants/ui.ts\";\n\nexport type IconSize = keyof typeof ui.sizes.icon;\n\n/**\n * Get the default icon for an input based on its type, format, or name.\n */\nexport const getDefaultIcon = (params: {\n type?: string;\n format?: string;\n name?: string;\n isEnum?: boolean;\n isArray?: boolean;\n size?: IconSize;\n}): ReactElement => {\n const { type, format, name, isEnum, isArray, size = \"sm\" } = params;\n const iconSize = ui.sizes.icon[size];\n\n // Format-based icons (highest priority)\n if (format) {\n switch (format) {\n case \"email\":\n return <IconMail size={iconSize} />;\n case \"url\":\n case \"uri\":\n return <IconLink size={iconSize} />;\n case \"tel\":\n case \"phone\":\n return <IconPhone size={iconSize} />;\n case \"date\":\n return <IconCalendar size={iconSize} />;\n case \"date-time\":\n return <IconCalendar size={iconSize} />;\n case \"time\":\n return <IconClock size={iconSize} />;\n case \"color\":\n return <IconColorPicker size={iconSize} />;\n case \"uuid\":\n return <IconKey size={iconSize} />;\n }\n }\n\n // Name-based icons (medium priority)\n if (name) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes(\"password\") || nameLower.includes(\"secret\")) {\n return <IconKey size={iconSize} />;\n }\n if (nameLower.includes(\"email\") || nameLower.includes(\"mail\")) {\n return <IconMail size={iconSize} />;\n }\n if (nameLower.includes(\"url\") || nameLower.includes(\"link\")) {\n return <IconLink size={iconSize} />;\n }\n if (nameLower.includes(\"phone\") || nameLower.includes(\"tel\")) {\n return <IconPhone size={iconSize} />;\n }\n if (nameLower.includes(\"color\")) {\n return <IconPalette size={iconSize} />;\n }\n if (nameLower.includes(\"file\") || nameLower.includes(\"upload\")) {\n return <IconFile size={iconSize} />;\n }\n if (nameLower.includes(\"date\")) {\n return <IconCalendar size={iconSize} />;\n }\n if (nameLower.includes(\"time\")) {\n return <IconClock size={iconSize} />;\n }\n }\n\n // Type-based icons (lowest priority)\n if (isEnum || isArray) {\n return <IconSelector size={iconSize} />;\n }\n\n if (type) {\n switch (type) {\n case \"boolean\":\n return <IconToggleLeft size={iconSize} />;\n case \"number\":\n case \"integer\":\n return <IconHash size={iconSize} />;\n case \"array\":\n return <IconList size={iconSize} />;\n case \"string\":\n return <IconLetterCase size={iconSize} />;\n }\n }\n\n // Default icon\n return <IconAt size={iconSize} />;\n};\n","/**\n * Capitalizes the first letter of a string.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n */\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Converts a path or identifier string into a pretty display name.\n * Removes slashes and capitalizes the first letter.\n *\n * @example\n * prettyName(\"/userName\") // \"UserName\"\n * prettyName(\"email\") // \"Email\"\n */\nexport const prettyName = (name: string): string => {\n return capitalize(name.replaceAll(\"/\", \"\"));\n};\n","import type { BaseInputField } from \"@alepha/react/form\";\nimport { type TObject, TypeBoxError } from \"alepha\";\nimport {\n createElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { ControlProps } from \"../components/form/Control.tsx\";\nimport { ui } from \"../constants/ui.ts\";\nimport { getDefaultIcon } from \"./icons.tsx\";\nimport { prettyName } from \"./string.ts\";\n\nexport const parseInput = (\n props: GenericControlProps,\n form: {\n error?: Error;\n },\n): ControlInput => {\n const disabled = false; // form.loading;\n const id = props.input.props.id;\n const label =\n props.title ??\n (\"title\" in props.input.schema &&\n typeof props.input.schema.title === \"string\"\n ? props.input.schema.title\n : undefined) ??\n prettyName(props.input.path);\n const description =\n props.description ??\n (\"description\" in props.input.schema &&\n typeof props.input.schema.description === \"string\"\n ? props.input.schema.description\n : undefined);\n const error =\n form.error && form.error instanceof TypeBoxError\n ? form.error.value.message\n : undefined;\n\n // Auto-generate icon if not provided\n const icon = !props.icon\n ? getDefaultIcon({\n type:\n props.input.schema && \"type\" in props.input.schema\n ? String(props.input.schema.type)\n : undefined,\n format:\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined,\n name: props.input.props.name,\n isEnum:\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Boolean(props.input.schema.enum),\n isArray:\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\",\n })\n : isValidElement(props.icon)\n ? props.icon\n : createElement(props.icon, { size: ui.sizes.icon.md });\n\n const format =\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined;\n\n const required = props.input.required;\n const schema = props.input.schema as TObject & { $control?: ControlProps };\n\n const inputProps: InputProps = {\n label,\n description,\n error,\n required,\n disabled,\n };\n\n if (\"minLength\" in schema && typeof schema.minLength === \"number\") {\n inputProps.minLength = schema.minLength;\n }\n if (\"maxLength\" in schema && typeof schema.maxLength === \"number\") {\n inputProps.maxLength = schema.maxLength;\n }\n if (\"minimum\" in schema && typeof schema.minimum === \"number\") {\n inputProps.minimum = schema.minimum;\n }\n if (\"maximum\" in schema && typeof schema.maximum === \"number\") {\n inputProps.maximum = schema.maximum;\n }\n\n return {\n id,\n icon,\n format,\n schema: props.input.schema as TObject & { $control?: ControlProps },\n inputProps,\n };\n};\n\nexport interface GenericControlProps {\n input: BaseInputField;\n title?: string;\n description?: string;\n icon?: ReactElement | ((props: { size: number }) => ReactNode);\n}\n\nexport interface ControlInput {\n id?: string;\n icon: ReactElement;\n format?: string;\n schema: TObject & { $control?: ControlProps };\n inputProps: InputProps;\n}\n\nexport interface InputProps {\n label: string;\n description?: string;\n error?: string;\n required: boolean;\n disabled: boolean;\n\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n}\n","import { useEvents } from \"@alepha/react\";\nimport type { BaseInputField } from \"@alepha/react/form\";\nimport {\n ActionIcon,\n Fieldset,\n Flex,\n Grid,\n Stack,\n Text,\n UnstyledButton,\n} from \"@mantine/core\";\nimport { IconGripVertical, IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport type { TObject, TSchema } from \"alepha\";\nimport { useRef, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface ControlArrayProps extends GenericControlProps {\n /**\n * Minimum number of items allowed.\n * @default 0\n */\n min?: number;\n\n /**\n * Maximum number of items allowed.\n * @default Infinity\n */\n max?: number;\n\n /**\n * Label for the add button.\n * @default \"Add item\"\n */\n addLabel?: string;\n\n /**\n * Number of columns for object item fields.\n * @default 1\n */\n columns?: number;\n\n /**\n * Variant for the container.\n * - \"fieldset\": Uses Mantine Fieldset with legend\n * - \"plain\": No container, just renders items\n * @default \"fieldset\"\n */\n variant?: \"fieldset\" | \"plain\";\n\n /**\n * Per-field control props override for object items.\n * Keys are field names from the item schema.\n */\n controlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n\n /**\n * Control props for primitive items.\n */\n itemControlProps?: Partial<Omit<ControlProps, \"input\">>;\n\n /**\n * Show drag handle for reordering.\n * @default false\n */\n sortable?: boolean;\n}\n\n/**\n * ControlArray component for editing arrays of schema items.\n *\n * Features:\n * - Dynamic add/remove of items\n * - Supports arrays of objects with nested fields\n * - Supports arrays of primitives\n * - Grid layout for object items\n * - Min/max constraints\n *\n * @example\n * ```tsx\n * // For a schema like:\n * // t.object({\n * // contacts: t.array(t.object({\n * // name: t.text(),\n * // email: t.text({ format: \"email\" }),\n * // }))\n * // })\n *\n * <ControlArray\n * input={form.input.contacts}\n * columns={2}\n * addLabel=\"Add contact\"\n * controlProps={{\n * email: { text: { placeholder: \"email@example.com\" } }\n * }}\n * />\n * ```\n */\nconst ControlArray = (props: ControlArrayProps) => {\n const { inputProps } = parseInput(props, {});\n const idCounter = useRef(0);\n\n // Initialize items with unique keys for React\n const [items, setItems] = useState<Array<{ key: number; value: any }>>(() => {\n const defaultValue = props.input?.props?.defaultValue;\n if (Array.isArray(defaultValue)) {\n return defaultValue.map((value) => ({\n key: idCounter.current++,\n value,\n }));\n }\n return [];\n });\n\n // Listen for form reset events\n useEvents(\n {\n \"form:reset\": (event) => {\n if (event.id === props.input?.form?.id) {\n const defaultValue = props.input?.props?.defaultValue;\n if (Array.isArray(defaultValue)) {\n idCounter.current = 0;\n setItems(\n defaultValue.map((value) => ({\n key: idCounter.current++,\n value,\n })),\n );\n } else {\n setItems([]);\n }\n }\n },\n },\n [props.input],\n );\n\n if (!props.input?.props) {\n return null;\n }\n\n const schema = props.input.schema;\n if (!schema || !(\"items\" in schema)) {\n return null;\n }\n\n const itemSchema = (schema as any).items as TSchema;\n const isObjectItem = itemSchema && \"properties\" in itemSchema;\n const { min = 0, max = Number.POSITIVE_INFINITY, columns = 1 } = props;\n\n const updateFormValue = (newItems: Array<{ key: number; value: any }>) => {\n props.input.set(newItems.map((item) => item.value));\n };\n\n const handleAdd = () => {\n if (items.length >= max) return;\n\n // Create default value based on item schema\n let newValue: any;\n if (isObjectItem) {\n newValue = {};\n // Initialize with default values from schema if available\n const objSchema = itemSchema as TObject;\n for (const [key, propSchema] of Object.entries(objSchema.properties)) {\n if (\"default\" in propSchema) {\n newValue[key] = propSchema.default;\n }\n }\n } else {\n newValue = \"\";\n }\n\n const newItems = [...items, { key: idCounter.current++, value: newValue }];\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleRemove = (index: number) => {\n if (items.length <= min) return;\n const newItems = items.filter((_, i) => i !== index);\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleItemChange = (index: number, value: any) => {\n const newItems = [...items];\n newItems[index] = { ...newItems[index], value };\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleFieldChange = (index: number, field: string, value: any) => {\n const newItems = [...items];\n newItems[index] = {\n ...newItems[index],\n value: { ...newItems[index].value, [field]: value },\n };\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const colSpan = 12 / columns;\n const fieldNames = isObjectItem\n ? Object.keys((itemSchema as TObject).properties)\n : [];\n\n const renderItems = () => (\n <Stack gap=\"sm\">\n {items.map((item, index) => (\n <Flex\n key={item.key}\n gap=\"sm\"\n align=\"flex-start\"\n p=\"xs\"\n bg={ui.colors.surface}\n style={{ borderRadius: \"var(--mantine-radius-sm)\" }}\n >\n {props.sortable && (\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n style={{ cursor: \"grab\" }}\n >\n <IconGripVertical size={16} />\n </ActionIcon>\n )}\n\n {isObjectItem ? (\n <Grid style={{ flex: 1 }} gutter=\"sm\">\n {fieldNames.map((fieldName) => {\n const fieldSchema = (itemSchema as TObject).properties[\n fieldName\n ];\n const fieldControlProps = props.controlProps?.[fieldName] ?? {};\n\n // Create a virtual InputField for the nested property\n const virtualInput: BaseInputField = {\n schema: fieldSchema,\n props: {\n id: `${props.input.props.id}-${item.key}-${fieldName}`,\n name: `${props.input.props.name}[${index}].${fieldName}`,\n defaultValue: item.value?.[fieldName],\n },\n path: `${props.input.path}/${index}/${fieldName}`,\n required:\n (itemSchema as TObject).required?.includes(fieldName) ??\n false,\n form: props.input.form,\n set: (value: any) =>\n handleFieldChange(index, fieldName, value),\n };\n\n return (\n <Grid.Col key={fieldName} span={colSpan}>\n <Control input={virtualInput} {...fieldControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n ) : (\n <Flex style={{ flex: 1 }}>\n <Control\n input={\n {\n schema: itemSchema,\n props: {\n id: `${props.input.props.id}-${item.key}`,\n name: `${props.input.props.name}[${index}]`,\n defaultValue: item.value,\n },\n path: `${props.input.path}/${index}`,\n required: false,\n form: props.input.form,\n set: (value: any) => handleItemChange(index, value),\n } as BaseInputField\n }\n {...props.itemControlProps}\n />\n </Flex>\n )}\n\n <ActionIcon\n variant=\"subtle\"\n color=\"red\"\n onClick={() => handleRemove(index)}\n disabled={items.length <= min}\n >\n <IconTrash size={16} />\n </ActionIcon>\n </Flex>\n ))}\n\n <UnstyledButton\n onClick={handleAdd}\n disabled={items.length >= max}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"8px 12px\",\n borderRadius: \"var(--mantine-radius-sm)\",\n border: \"1px dashed var(--mantine-color-dimmed)\",\n color: \"var(--mantine-color-dimmed)\",\n fontSize: \"var(--mantine-font-size-sm)\",\n cursor: items.length >= max ? \"not-allowed\" : \"pointer\",\n opacity: items.length >= max ? 0.5 : 1,\n transition: \"all 150ms ease\",\n }}\n onMouseEnter={(e) => {\n if (items.length < max) {\n e.currentTarget.style.borderColor =\n \"var(--mantine-color-blue-filled)\";\n e.currentTarget.style.color = \"var(--mantine-color-blue-filled)\";\n e.currentTarget.style.background =\n \"var(--mantine-color-blue-light)\";\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"var(--mantine-color-dimmed)\";\n e.currentTarget.style.color = \"var(--mantine-color-dimmed)\";\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <IconPlus size={14} />\n {props.addLabel ?? \"Add\"}\n </UnstyledButton>\n </Stack>\n );\n\n if (props.variant === \"plain\") {\n return (\n <Stack gap=\"xs\">\n {inputProps.label && (\n <Text size=\"sm\" fw={500}>\n {inputProps.label}\n </Text>\n )}\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderItems()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n );\n }\n\n return (\n <Fieldset legend={inputProps.label}>\n <Stack gap=\"xs\">\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderItems()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n </Fieldset>\n );\n};\n\nexport default ControlArray;\n","import { useFormState } from \"@alepha/react/form\";\nimport {\n DateInput,\n type DateInputProps,\n DateTimePicker,\n type DateTimePickerProps,\n TimeInput,\n type TimeInputProps,\n} from \"@mantine/dates\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport interface ControlDateProps extends GenericControlProps {\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n}\n\n/**\n * ControlDate component for handling date, datetime, and time inputs.\n *\n * Features:\n * - DateInput for date format\n * - DateTimePicker for date-time format\n * - TimeInput for time format\n *\n * Automatically detects date formats from schema and renders appropriate picker.\n */\nconst ControlDate = (props: ControlDateProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon, format } = parseInput(props, form);\n if (!props.input?.props) {\n return null;\n }\n\n // region <DateTimePicker/>\n if (props.datetime || format === \"date-time\") {\n const dateTimePickerProps =\n typeof props.datetime === \"object\" ? props.datetime : {};\n return (\n <DateTimePicker\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(value ? new Date(value).toISOString() : undefined);\n }}\n {...dateTimePickerProps}\n />\n );\n }\n //endregion\n\n // region <DateInput/>\n if (props.date || format === \"date\") {\n const dateInputProps = typeof props.date === \"object\" ? props.date : {};\n return (\n <DateInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(\n value ? new Date(value).toISOString().slice(0, 10) : undefined,\n );\n }}\n {...dateInputProps}\n />\n );\n }\n //endregion\n\n // region <TimeInput/>\n if (props.time || format === \"time\") {\n const timeInputProps = typeof props.time === \"object\" ? props.time : {};\n return (\n <TimeInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={props.input.props.defaultValue}\n onChange={(event) => {\n props.input.set(event.currentTarget.value);\n }}\n {...timeInputProps}\n />\n );\n }\n //endregion\n\n // Fallback - shouldn't happen\n return null;\n};\n\nexport default ControlDate;\n","import { useEvents } from \"@alepha/react\";\nimport { useFormState } from \"@alepha/react/form\";\nimport {\n Input,\n NumberInput,\n type NumberInputProps,\n Slider,\n type SliderProps,\n} from \"@mantine/core\";\nimport { useRef, useState } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport interface ControlNumberProps extends GenericControlProps {\n numberInputProps?: Partial<NumberInputProps>;\n sliderProps?: Partial<SliderProps>;\n}\n\n/**\n *\n */\nconst ControlNumber = (props: ControlNumberProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon } = parseInput(props, form);\n const ref = useRef<HTMLInputElement | null>(null);\n\n // HTML Reset doesn't trigger on <NumberInput /> so we handle it manually\n\n const [value, setValue] = useState<number | undefined>(\n props.input.props.defaultValue,\n );\n\n useEvents(\n {\n \"form:reset\": (event) => {\n if (event.id === props.input?.form.id && ref.current) {\n setValue(props.input.props.defaultValue);\n }\n },\n },\n [props.input],\n );\n\n if (!props.input?.props) {\n return null;\n }\n\n const { type, ...inputPropsWithoutType } = props.input.props;\n\n if (props.sliderProps) {\n const min = props.sliderProps.min ?? inputProps.minimum ?? 0;\n const max = props.sliderProps.max ?? inputProps.maximum ?? 100;\n return (\n <Input.Wrapper {...inputProps}>\n <div\n style={{\n height: 32,\n padding: 8,\n }}\n >\n <Slider\n {...inputProps}\n ref={ref}\n id={id}\n {...inputPropsWithoutType}\n {...props.sliderProps}\n value={value}\n min={min}\n max={max}\n label={() => value}\n onChange={(val) => {\n setValue(val);\n props.input.set(val);\n }}\n />\n </div>\n </Input.Wrapper>\n );\n }\n\n return (\n <NumberInput\n {...inputProps}\n ref={ref}\n id={id}\n leftSection={icon}\n {...inputPropsWithoutType}\n {...props.numberInputProps}\n value={value ?? \"\"}\n onChange={(val) => {\n const newValue = val !== null ? Number(val) : undefined;\n setValue(newValue);\n props.input.set(newValue);\n }}\n />\n );\n};\n\nexport default ControlNumber;\n","import type { BaseInputField, ObjectInputField } from \"@alepha/react/form\";\nimport { Fieldset, Grid, Stack, Text } from \"@mantine/core\";\nimport type { TObject } from \"alepha\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface ControlObjectProps extends GenericControlProps {\n /**\n * Number of columns for the grid layout.\n * @default 1\n */\n columns?: number;\n\n /**\n * Variant for the container.\n * - \"fieldset\": Uses Mantine Fieldset with legend\n * - \"plain\": No container, just renders fields\n * @default \"fieldset\"\n */\n variant?: \"fieldset\" | \"plain\";\n\n /**\n * Per-field control props override.\n * Keys are field names from the schema.\n */\n controlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n}\n\n/**\n * ControlObject component for editing nested object schemas.\n *\n * Features:\n * - Renders all properties of an object schema\n * - Supports grid layout with configurable columns\n * - Per-field customization via controlProps\n * - Recursive support for deeply nested objects\n *\n * The form system provides nested InputFields under the `.items` property.\n * For example: form.input.address.items.street\n *\n * @example\n * ```tsx\n * // For a schema like:\n * // t.object({\n * // address: t.object({\n * // street: t.text(),\n * // city: t.text(),\n * // zip: t.text(),\n * // })\n * // })\n *\n * <ControlObject\n * input={form.input.address}\n * columns={2}\n * controlProps={{\n * zip: { text: { maxLength: 10 } }\n * }}\n * />\n * ```\n */\nconst ControlObject = (props: ControlObjectProps) => {\n const { inputProps } = parseInput(props, {});\n\n if (!props.input?.props) {\n return null;\n }\n\n const schema = props.input.schema as TObject;\n if (!schema?.properties) {\n return null;\n }\n\n const fieldNames = Object.keys(schema.properties);\n const columns = props.columns ?? 1;\n const colSpan = 12 / columns;\n\n // The form system provides nested InputFields under .items\n const objectInput = props.input as ObjectInputField<TObject>;\n const nestedItems = objectInput.items as Record<string, BaseInputField>;\n\n const renderFields = () => (\n <Grid>\n {fieldNames.map((fieldName) => {\n const fieldControlProps = props.controlProps?.[fieldName] ?? {};\n\n // Access nested InputField from .items\n const field = nestedItems?.[fieldName];\n if (!field) {\n return null;\n }\n\n return (\n <Grid.Col key={fieldName} span={colSpan}>\n <Control input={field} {...fieldControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n );\n\n if (props.variant === \"plain\") {\n return renderFields();\n }\n\n return (\n <Fieldset legend={inputProps.label}>\n <Stack gap=\"xs\">\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderFields()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n </Fieldset>\n );\n};\n\nexport default ControlObject;\n","import type { TObject, TProperties, TSchema } from \"alepha\";\n\nexport interface SchemaField {\n name: string;\n path: string;\n type: string;\n enum?: readonly any[];\n format?: string;\n description?: string;\n nested?: SchemaField[];\n}\n\n/**\n * Extract field information from a TypeBox schema for query building.\n * Supports nested objects and provides field metadata for autocomplete.\n */\nexport function extractSchemaFields(\n schema: TObject | TProperties,\n prefix = \"\",\n): SchemaField[] {\n const fields: SchemaField[] = [];\n\n // Safety check\n if (!schema || typeof schema !== \"object\") {\n return fields;\n }\n\n // Handle TObject wrapper\n const properties =\n \"properties\" in schema ? schema.properties : (schema as TProperties);\n\n // Safety check for properties\n if (!properties || typeof properties !== \"object\") {\n return fields;\n }\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip if value is not an object (type guard)\n if (typeof value !== \"object\" || value === null) {\n continue;\n }\n\n const fieldSchema = value as TSchema & {\n format?: string;\n enum?: readonly any[];\n description?: string;\n };\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Determine the display type - use format for datetime-related fields\n const format = \"format\" in fieldSchema ? fieldSchema.format : undefined;\n const baseType =\n \"type\" in fieldSchema ? (fieldSchema.type as string) : \"object\";\n\n let displayType = baseType;\n if (format === \"date-time\") {\n displayType = \"datetime\";\n } else if (format === \"date\") {\n displayType = \"date\";\n } else if (format === \"time\") {\n displayType = \"time\";\n } else if (format === \"duration\") {\n displayType = \"duration\";\n }\n\n const field: SchemaField = {\n name: key,\n path,\n type: displayType,\n format,\n description:\n \"description\" in fieldSchema ? fieldSchema.description : undefined,\n };\n\n // Handle enum\n if (\"enum\" in fieldSchema && fieldSchema.enum) {\n field.enum = fieldSchema.enum;\n field.type = \"enum\";\n }\n\n // Handle nested objects\n if (\n \"type\" in fieldSchema &&\n fieldSchema.type === \"object\" &&\n \"properties\" in fieldSchema &&\n typeof fieldSchema.properties === \"object\"\n ) {\n field.nested = extractSchemaFields(\n fieldSchema.properties as TProperties,\n path,\n );\n }\n\n fields.push(field);\n\n // Also add nested fields to the flat list for autocomplete\n if (field.nested) {\n fields.push(...field.nested);\n }\n }\n\n return fields;\n}\n\n/**\n * Get suggested operators based on field type\n */\nexport function getOperatorsForField(field: SchemaField): string[] {\n const allOperators = [\"=\", \"!=\"];\n\n if (field.enum) {\n // Enum fields: equality and IN array\n return [...allOperators, \"in\"];\n }\n\n switch (field.type) {\n case \"string\":\n case \"text\":\n // String fields: equality and null checks (wildcards supported in = operator)\n return [...allOperators, \"null\"];\n\n case \"number\":\n case \"integer\":\n // Numeric fields: all comparison operators\n return [...allOperators, \">\", \">=\", \"<\", \"<=\"];\n\n case \"boolean\":\n // Boolean fields: only equality\n return allOperators;\n\n case \"datetime\":\n case \"date\":\n // Date fields: all comparison operators\n return [...allOperators, \">\", \">=\", \"<\", \"<=\"];\n\n default:\n return [...allOperators, \"null\"];\n }\n}\n\n/**\n * Get operator symbol and description\n */\nexport const OPERATOR_INFO: Record<\n string,\n { symbol: string; label: string; example: string }\n> = {\n eq: { symbol: \"=\", label: \"equals\", example: \"name=John\" },\n ne: { symbol: \"!=\", label: \"not equals\", example: \"status!=archived\" },\n gt: { symbol: \">\", label: \"greater than\", example: \"age>18\" },\n gte: { symbol: \">=\", label: \"greater or equal\", example: \"age>=18\" },\n lt: { symbol: \"<\", label: \"less than\", example: \"age<65\" },\n lte: { symbol: \"<=\", label: \"less or equal\", example: \"age<=65\" },\n null: { symbol: \"=null\", label: \"is null\", example: \"deletedAt=null\" },\n notNull: {\n symbol: \"!=null\",\n label: \"is not null\",\n example: \"email!=null\",\n },\n in: {\n symbol: \"[...]\",\n label: \"in array\",\n example: \"status=[active,pending]\",\n },\n};\n","import { useEvents } from \"@alepha/react\";\nimport {\n ActionIcon,\n Badge,\n Divider,\n Flex,\n Group,\n Popover,\n Stack,\n Text,\n TextInput,\n type TextInputProps,\n} from \"@mantine/core\";\nimport { IconFilter, IconInfoTriangle, IconX } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { parseQueryString } from \"alepha/orm\";\nimport { useRef, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport {\n extractSchemaFields,\n OPERATOR_INFO,\n type SchemaField,\n} from \"../../utils/extractSchemaFields.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\n\nexport interface ControlQueryBuilderProps\n extends Omit<TextInputProps, \"value\" | \"onChange\"> {\n schema?: TObject;\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n}\n\n/**\n * Query builder with text input and help popover.\n * Generates query strings for parseQueryString syntax.\n */\nconst ControlQueryBuilder = ({\n schema,\n value = \"\",\n onChange,\n placeholder = \"Enter query or click for assistance...\",\n ...textInputProps\n}: ControlQueryBuilderProps) => {\n const [helpOpened, setHelpOpened] = useState(false);\n const [textValue, setTextValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const fields = schema ? extractSchemaFields(schema) : [];\n const [error, setError] = useState<string | null>(null);\n\n const isValid = (value: string) => {\n try {\n parseQueryString(value.trim());\n } catch (e) {\n setError((e as Error).message);\n return false;\n }\n setError(null);\n return true;\n };\n\n const handleTextChange = (newValue: string) => {\n setTextValue(newValue);\n if (isValid(newValue)) {\n onChange?.(newValue);\n }\n };\n\n const handleClear = () => {\n setTextValue(\"\");\n onChange?.(\"\");\n isValid(\"\");\n };\n\n const handleInsert = (text: string) => {\n const newValue = textValue ? `${textValue}${text} ` : `${text} `;\n setTextValue(newValue);\n if (isValid(newValue)) {\n onChange?.(newValue);\n }\n // Refocus the input after inserting\n setTimeout(() => {\n inputRef.current?.focus();\n // set cursor to end\n const length = inputRef.current?.value.length || 0;\n inputRef.current?.setSelectionRange(length, length);\n }, 0);\n };\n\n useEvents(\n {\n \"form:change\": (event) => {\n if (event.id === inputRef.current?.form?.id) {\n if (event.path === (textInputProps as any)[\"data-path\"]) {\n setTextValue(event.value ?? \"\");\n }\n }\n },\n },\n [],\n );\n\n return (\n <Popover\n width={800}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={helpOpened}\n onChange={setHelpOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <TextInput\n ref={inputRef}\n placeholder={placeholder}\n value={textValue}\n onChange={(e) => handleTextChange(e.currentTarget.value)}\n onFocus={() => setHelpOpened(true)}\n leftSection={\n error ? <IconInfoTriangle size={16} /> : <IconFilter size={16} />\n }\n rightSection={\n textValue && (\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n onClick={handleClear}\n >\n <IconX size={14} />\n </ActionIcon>\n )\n }\n {...textInputProps}\n />\n </Popover.Target>\n <Popover.Dropdown\n bg={\"transparent\"}\n p={\"xs\"}\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <QueryHelp fields={fields} onInsert={handleInsert} />\n </Popover.Dropdown>\n </Popover>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Query Help Component\n// ---------------------------------------------------------------------------------------------------------------------\n\ninterface QueryHelpProps {\n fields: SchemaField[];\n onInsert: (text: string) => void;\n}\n\nfunction QueryHelp({ fields, onInsert }: QueryHelpProps) {\n return (\n <Group\n gap=\"md\"\n align=\"flex-start\"\n wrap=\"nowrap\"\n bg={ui.colors.surface}\n p={\"sm\"}\n bdrs={\"sm\"}\n >\n {/* Left Column: Operators */}\n <Stack gap=\"md\" style={{ flex: 1 }}>\n {/* Available Operators */}\n <Stack gap=\"xs\">\n <Text size=\"sm\" fw={600}>\n Operators\n </Text>\n <Stack gap={4}>\n {Object.entries(OPERATOR_INFO).map(([key, info]) => (\n <Group key={key} gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(info.symbol)}\n >\n {info.symbol}\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\" style={{ flex: 1 }}>\n {info.label}\n </Text>\n </Group>\n ))}\n </Stack>\n </Stack>\n\n <Divider />\n\n {/* Logic Operators */}\n <Stack gap=\"xs\">\n <Text size=\"sm\" fw={600}>\n Logic\n </Text>\n <Stack gap={4}>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(\"&\")}\n >\n &\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\">\n AND\n </Text>\n </Group>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(\"|\")}\n >\n |\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\">\n OR\n </Text>\n </Group>\n </Stack>\n </Stack>\n </Stack>\n\n {/* Divider */}\n {fields.length > 0 && <Divider orientation=\"vertical\" />}\n\n {/* Right Column: Fields */}\n {fields.length > 0 && (\n <Flex direction={\"column\"} gap=\"xs\" style={{ flex: 2 }}>\n <Text size=\"sm\" fw={600}>\n Fields\n </Text>\n <Flex\n direction={\"column\"}\n gap={4}\n style={{ maxHeight: 300, overflowY: \"auto\" }}\n >\n {fields.map((field) => (\n <Flex key={field.path} gap=\"xs\" wrap=\"nowrap\" align=\"flex-start\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"end\"}\n miw={120}\n onClick={() => onInsert(field.path)}\n >\n {field.path}\n </ActionButton>\n <Flex\n mt={3}\n direction={\"column\"}\n gap={2}\n style={{ flex: 1, minWidth: 0 }}\n >\n <Text size=\"xs\" c=\"dimmed\" lineClamp={1}>\n {field.description || field.type}\n </Text>\n {field.enum && (\n <Group gap={0} wrap=\"wrap\">\n {field.enum.map((enumValue) => (\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n key={enumValue}\n onClick={() => onInsert(enumValue)}\n >\n {enumValue}\n </ActionButton>\n ))}\n </Group>\n )}\n </Flex>\n <Badge size=\"xs\" variant=\"light\" style={{ flexShrink: 0 }}>\n {field.type}\n </Badge>\n </Flex>\n ))}\n </Flex>\n </Flex>\n )}\n </Group>\n );\n}\n\nexport default ControlQueryBuilder;\n","import { useFormState } from \"@alepha/react/form\";\nimport {\n Autocomplete,\n type AutocompleteProps,\n Flex,\n Input,\n MultiSelect,\n type MultiSelectProps,\n SegmentedControl,\n type SegmentedControlProps,\n Select,\n type SelectProps,\n TagsInput,\n type TagsInputProps,\n} from \"@mantine/core\";\nimport { useEffect, useState } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport type SelectValueLabel =\n | string\n | { value: string; label: string; icon?: string };\n\nexport interface ControlSelectProps extends GenericControlProps {\n select?: boolean | SelectProps;\n multi?: boolean | MultiSelectProps;\n tags?: boolean | TagsInputProps;\n autocomplete?: boolean | AutocompleteProps;\n segmented?: boolean | Partial<SegmentedControlProps>;\n\n loader?: () => Promise<SelectValueLabel[]>;\n}\n\n/**\n * ControlSelect component for handling Select, MultiSelect, and TagsInput.\n *\n * Features:\n * - Basic Select with enum support\n * - MultiSelect for array of enums\n * - TagsInput for array of strings (no enum)\n * - Future: Lazy loading\n * - Future: Searchable/filterable options\n * - Future: Custom option rendering\n *\n * Automatically detects enum values and array types from schema.\n */\nconst ControlSelect = (props: ControlSelectProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon } = parseInput(props, form);\n\n // Detect if schema is an array type\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n // For arrays, check if items have enum (MultiSelect) or not (TagsInput)\n let itemsEnum: string[] | undefined;\n if (isArray && \"items\" in props.input.schema && props.input.schema.items) {\n const items: any = props.input.schema.items;\n if (\"enum\" in items && Array.isArray(items.enum)) {\n itemsEnum = items.enum;\n }\n }\n\n // Extract enum values from schema (for non-array select)\n const enumValues =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Array.isArray(props.input.schema.enum)\n ? props.input.schema.enum\n : [];\n\n const [data, setData] = useState<SelectValueLabel[]>([]);\n\n useEffect(() => {\n if (!props.input?.props) {\n return;\n }\n\n if (props.loader) {\n props.loader().then(setData);\n } else {\n setData(enumValues);\n }\n }, [props.input, props.loader]);\n\n if (!props.input?.props) {\n return null;\n }\n\n if (props.segmented) {\n const segmentedControlProps: Partial<SegmentedControlProps> =\n typeof props.segmented === \"object\" ? props.segmented : {};\n\n return (\n <Input.Wrapper {...inputProps}>\n <Flex>\n <SegmentedControl\n disabled={inputProps.disabled}\n defaultValue={String(props.input.props.defaultValue)}\n {...segmentedControlProps}\n onChange={(value) => {\n props.input.set(value);\n }}\n data={data.slice(0, 10)}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n\n if (props.autocomplete) {\n const autocompleteProps =\n typeof props.autocomplete === \"object\" ? props.autocomplete : {};\n\n return (\n <Autocomplete\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...autocompleteProps}\n />\n );\n }\n\n // region <TagsInput/> - for array of strings without enum\n if ((isArray && !itemsEnum) || props.tags) {\n const tagsInputProps = typeof props.tags === \"object\" ? props.tags : {};\n return (\n <TagsInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...tagsInputProps}\n />\n );\n }\n // endregion\n\n // region <MultiSelect/> - for array of enums\n if ((isArray && itemsEnum) || props.multi) {\n const data =\n itemsEnum?.map((value: string) => ({\n value,\n label: value,\n })) || [];\n\n const multiSelectProps = typeof props.multi === \"object\" ? props.multi : {};\n\n return (\n <MultiSelect\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...multiSelectProps}\n />\n );\n }\n // endregion\n\n // region <Select/> - for single enum value\n const selectProps = typeof props.select === \"object\" ? props.select : {};\n\n return (\n <Select\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...selectProps}\n />\n );\n // endregion\n};\n\nexport default ControlSelect;\n","import { useFormState } from \"@alepha/react/form\";\nimport {\n ColorInput,\n type ColorInputProps,\n FileInput,\n type FileInputProps,\n Flex,\n Input,\n PasswordInput,\n type PasswordInputProps,\n Switch,\n type SwitchProps,\n Textarea,\n type TextareaProps,\n TextInput,\n type TextInputProps,\n} from \"@mantine/core\";\nimport type {\n DateInputProps,\n DateTimePickerProps,\n TimeInputProps,\n} from \"@mantine/dates\";\nimport type { ComponentType } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport ControlArray, { type ControlArrayProps } from \"./ControlArray.tsx\";\nimport ControlDate from \"./ControlDate.tsx\";\nimport ControlNumber, { type ControlNumberProps } from \"./ControlNumber.tsx\";\nimport ControlObject, { type ControlObjectProps } from \"./ControlObject.tsx\";\nimport ControlQueryBuilder from \"./ControlQueryBuilder.tsx\";\nimport ControlSelect, { type ControlSelectProps } from \"./ControlSelect.tsx\";\n\nexport interface ControlProps extends GenericControlProps {\n text?: TextInputProps;\n area?: boolean | TextareaProps;\n select?: boolean | Partial<ControlSelectProps>;\n password?: boolean | PasswordInputProps;\n switch?: boolean | SwitchProps;\n number?: boolean | Partial<ControlNumberProps>;\n file?: boolean | FileInputProps;\n color?: boolean | ColorInputProps;\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n query?: any; // Enable query builder mode with schema-aware autocomplete\n object?: boolean | Partial<Omit<ControlObjectProps, \"input\">>; // Nested object editing\n array?: boolean | Partial<Omit<ControlArrayProps, \"input\">>; // Array of items editing\n custom?: ComponentType<CustomControlProps>;\n\n slider?: boolean;\n segmented?: boolean;\n}\n\n/**\n * Generic form control that renders the appropriate input based on the schema and props.\n *\n * Supports:\n * - TextInput (with format detection: email, url, tel)\n * - Textarea\n * - NumberInput (for number/integer types)\n * - FileInput\n * - ColorInput (for color format)\n * - Select (for enum types)\n * - Autocomplete\n * - PasswordInput\n * - Switch (for boolean types)\n * - SegmentedControl (for enum types)\n * - DateInput (for date format)\n * - DateTimePicker (for date-time format)\n * - TimeInput (for time format)\n * - QueryBuilder (for building type-safe queries with autocomplete)\n * - ControlObject (for nested object schemas)\n * - ControlArray (for arrays of objects)\n * - Custom component\n *\n * Automatically handles labels, descriptions, error messages, required state, and default icons.\n */\nconst Control = (_props: ControlProps) => {\n const form = useFormState(_props.input, [\"error\"]);\n\n // Early return if input is not properly initialized\n if (!_props.input?.props) {\n return null;\n }\n\n const { inputProps, id, icon, format, schema } = parseInput(_props, form);\n\n const props = {\n ..._props,\n ...schema.$control,\n };\n\n //region <QueryBuilder/>\n if (props.query) {\n return (\n <ControlQueryBuilder\n {...props.input.props}\n {...inputProps}\n schema={props.query}\n value={props.input.props.value}\n onChange={(value) => {\n props.input.set(value);\n }}\n />\n );\n }\n //endregion\n\n //region <Custom/>\n if (props.custom) {\n const Custom = props.custom;\n return (\n <Input.Wrapper {...inputProps}>\n <Flex flex={1} mt={\"calc(var(--mantine-spacing-xs) / 2)\"}>\n <Custom\n defaultValue={props.input.props.defaultValue}\n onChange={(value) => {\n props.input.set(value);\n }}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n //endregion\n\n //region <ControlObject/>\n // Handle nested objects with properties\n const isObject =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"object\" &&\n \"properties\" in props.input.schema;\n\n if (props.object || isObject) {\n const controlObjectProps =\n typeof props.object === \"object\" ? props.object : {};\n return (\n <ControlObject\n input={props.input}\n title={props.title}\n description={props.description}\n {...controlObjectProps}\n />\n );\n }\n //endregion\n\n //region <ControlArray/>\n // Handle arrays of objects (arrays of primitives are handled by ControlSelect)\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n const isArrayOfObjects =\n isArray &&\n \"items\" in props.input.schema &&\n props.input.schema.items &&\n typeof props.input.schema.items === \"object\" &&\n \"properties\" in props.input.schema.items;\n\n if (props.array || isArrayOfObjects) {\n const controlArrayProps =\n typeof props.array === \"object\" ? props.array : {};\n return (\n <ControlArray\n input={props.input}\n title={props.title}\n description={props.description}\n {...controlArrayProps}\n />\n );\n }\n //endregion\n\n //region <NumberInput/>\n if (\n props.number ||\n (props.input.schema &&\n \"type\" in props.input.schema &&\n (props.input.schema.type === \"number\" ||\n props.input.schema.type === \"integer\"))\n ) {\n const controlNumberProps =\n typeof props.number === \"object\" ? props.number : {};\n if (props.slider) {\n controlNumberProps.sliderProps ??= {};\n }\n return (\n <ControlNumber\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...controlNumberProps}\n />\n );\n }\n //endregion\n\n //region <FileInput/>\n if (props.file) {\n const fileInputProps = typeof props.file === \"object\" ? props.file : {};\n return (\n <FileInput\n {...inputProps}\n id={id}\n leftSection={icon}\n onChange={(file) => {\n props.input.set(file);\n }}\n {...fileInputProps}\n />\n );\n }\n //endregion\n\n //region <ColorInput/>\n if (props.color || format === \"color\") {\n const colorInputProps = typeof props.color === \"object\" ? props.color : {};\n return (\n <ColorInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...colorInputProps}\n />\n );\n }\n //endregion\n\n //region <ControlSelect/>\n // Handle: single enum, array of enum, array of strings, or explicit select/multi/tags props\n // Note: arrays of objects are handled by ControlArray above, this handles primitive arrays\n const isEnum =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n props.input.schema.enum;\n\n if (isEnum || (isArray && !isArrayOfObjects) || props.select) {\n const opts = typeof props.select === \"object\" ? props.select : {};\n if (props.segmented) {\n opts.segmented ??= {};\n }\n return (\n <ControlSelect\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...opts}\n />\n );\n }\n //endregion\n\n //region <Switch/>\n if (\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"boolean\"\n ) {\n if (props.switch) {\n const switchProps = typeof props.switch === \"object\" ? props.switch : {};\n\n return (\n <Switch\n {...inputProps}\n id={id}\n color={\"blue\"}\n defaultChecked={props.input.props.defaultValue}\n onChange={(event) => {\n props.input.set(event.currentTarget.checked);\n }}\n {...switchProps}\n />\n );\n }\n\n // by default, render as <Select/> with Yes/No/Empty options\n const selectProps: Partial<ControlSelectProps> = {\n loader: async () => [\n { value: \"true\", label: \"Yes\" },\n { value: \"false\", label: \"No\" },\n { value: \"\", label: \"\" },\n ],\n ...props.input.props,\n };\n\n return (\n <ControlSelect\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...selectProps}\n />\n );\n }\n //endregion\n\n //region <PasswordInput/>\n if (props.password || props.input.props.name?.includes(\"password\")) {\n const passwordInputProps =\n typeof props.password === \"object\" ? props.password : {};\n return (\n <PasswordInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...passwordInputProps}\n />\n );\n }\n //endregion\n\n //region <Textarea/>\n if (props.area) {\n const textAreaProps = typeof props.area === \"object\" ? props.area : {};\n return (\n <Textarea\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...textAreaProps}\n />\n );\n }\n //endregion\n\n //region <ControlDate/>\n // Handle: date, date-time, and time formats\n if (\n props.date ||\n props.datetime ||\n props.time ||\n format === \"date\" ||\n format === \"date-time\" ||\n format === \"time\"\n ) {\n return (\n <ControlDate\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n date={props.date}\n datetime={props.datetime}\n time={props.time}\n />\n );\n }\n //endregion\n\n //region <TextInput/> with format detection\n const textInputProps = typeof props.text === \"object\" ? props.text : {};\n\n // Detect HTML5 input type from format\n const getInputType = (): string | undefined => {\n switch (format) {\n case \"email\":\n return \"email\";\n case \"url\":\n case \"uri\":\n return \"url\";\n case \"tel\":\n case \"phone\":\n return \"tel\";\n default:\n return undefined;\n }\n };\n\n return (\n <TextInput\n {...inputProps}\n id={id}\n leftSection={icon}\n type={getInputType()}\n {...props.input.props}\n {...textInputProps}\n inputWrapperOrder={[\"label\", \"input\", \"description\", \"error\"]}\n />\n );\n //endregion\n};\n\nexport default Control;\n\nexport type CustomControlProps = {\n defaultValue: any;\n onChange: (value: any) => void;\n};\n","import type { FormModel } from \"@alepha/react/form\";\nimport { Card, Flex, type FlexProps, Grid } from \"@mantine/core\";\nimport type { TObject } from \"alepha\";\nimport type { ReactNode } from \"react\";\nimport ActionButton, {\n type ActionSubmitButtonProps,\n} from \"../buttons/ActionButton.tsx\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface TypeFormProps<T extends TObject> {\n form: FormModel<T>;\n columns?:\n | number\n | {\n base?: number;\n xs?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n };\n schema?: TObject;\n children?: (input: FormModel<T>[\"input\"]) => ReactNode;\n\n /**\n * Control props applied to all fields.\n */\n controlProps?: Partial<Omit<ControlProps, \"input\">>;\n\n /**\n * Per-field control props override.\n * Keys are field names from the schema.\n */\n fieldControlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n skipFormElement?: boolean;\n skipSubmitButton?: boolean;\n submitButtonProps?: Partial<Omit<ActionSubmitButtonProps, \"form\">>;\n resetButtonProps?: Partial<Omit<ActionSubmitButtonProps, \"form\">>;\n\n fill?: boolean;\n flexProps?: FlexProps;\n}\n\n/**\n * TypeForm component that automatically renders all form inputs based on schema.\n * Uses the Control component to render individual fields and Mantine Grid for responsive layout.\n *\n * Supports all field types including:\n * - Primitive types (string, number, boolean, etc.)\n * - Enum types (rendered as Select)\n * - Arrays of primitives (rendered as MultiSelect/TagsInput)\n * - Arrays of objects (rendered as ControlArray)\n * - Nested objects (rendered as ControlObject)\n *\n * @example\n * ```tsx\n * import { t } from \"alepha\";\n * import { useForm } from \"@alepha/react/form\";\n * import { TypeForm } from \"@alepha/ui\";\n *\n * const form = useForm({\n * schema: t.object({\n * username: t.text(),\n * email: t.text(),\n * age: t.integer(),\n * subscribe: t.boolean(),\n * address: t.object({\n * street: t.text(),\n * city: t.text(),\n * }),\n * tags: t.array(t.text()),\n * contacts: t.array(t.object({\n * name: t.text(),\n * email: t.text(),\n * })),\n * }),\n * handler: (values) => {\n * console.log(values);\n * },\n * });\n *\n * return <TypeForm form={form} columns={2} />;\n * ```\n */\nconst TypeForm = <T extends TObject>(props: TypeFormProps<T>) => {\n const {\n form,\n columns = 3,\n children,\n controlProps,\n fieldControlProps,\n skipFormElement = false,\n skipSubmitButton = false,\n submitButtonProps,\n fill = true,\n } = props;\n\n const schema = props.schema || form.options.schema;\n if (!schema?.properties) {\n return null;\n }\n\n const fieldNames = Object.keys(schema.properties);\n\n // Filter to only include valid InputFields\n // All types are now supported: primitives, enums, arrays, objects\n const supportedFields = fieldNames;\n\n // Handle column configuration with defaults: xs=1, sm=2, lg=3\n const colSpan =\n typeof columns === \"number\"\n ? {\n xs: 12,\n sm: 6,\n lg: 12 / columns,\n }\n : {\n base: columns.base ? 12 / columns.base : undefined,\n xs: columns.xs ? 12 / columns.xs : 12,\n sm: columns.sm ? 12 / columns.sm : 6,\n md: columns.md ? 12 / columns.md : undefined,\n lg: columns.lg ? 12 / columns.lg : 4,\n xl: columns.xl ? 12 / columns.xl : undefined,\n };\n\n const renderFields = () => {\n if (children) {\n return <>{children(form.input)}</>;\n }\n\n return (\n <Grid>\n {supportedFields.map((fieldName) => {\n const field = form.input[fieldName as keyof typeof form.input];\n const fieldSchema: any = schema.properties[fieldName];\n\n // Type guard to ensure field has the expected structure\n if (!field || !fieldSchema) {\n return null;\n }\n\n // Determine if this is a complex type (object or array of objects)\n // that should span full width\n const isObject =\n fieldSchema &&\n \"type\" in fieldSchema &&\n fieldSchema.type === \"object\";\n\n const isArrayOfObjects =\n fieldSchema &&\n \"type\" in fieldSchema &&\n fieldSchema.type === \"array\" &&\n \"items\" in fieldSchema &&\n fieldSchema.items &&\n \"properties\" in fieldSchema.items;\n\n // Complex types span full width, primitives use grid columns\n const span = isObject || isArrayOfObjects ? 12 : colSpan;\n\n // Merge control props: base controlProps + field-specific overrides\n const mergedControlProps = {\n ...controlProps,\n ...fieldControlProps?.[fieldName],\n };\n\n return (\n <Grid.Col key={fieldName} span={span}>\n <Control input={field} {...mergedControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n );\n };\n\n const content = (\n <Flex\n direction={\"column\"}\n gap={\"sm\"}\n flex={fill ? 1 : undefined}\n {...props.flexProps}\n >\n <Flex direction={\"column\"} gap={\"sm\"} flex={1}>\n {renderFields()}\n </Flex>\n {!skipSubmitButton && (\n <Card w={\"100%\"} withBorder>\n <Flex gap={\"sm\"} flex={1}>\n <Flex></Flex>\n <Flex flex={1}></Flex>\n <Flex gap={\"sm\"}>\n <ActionButton variant={\"subtle\"} type={\"reset\"}>\n Reset\n </ActionButton>\n <ActionButton\n intent={\"primary\"}\n form={form}\n {...submitButtonProps}\n >\n {submitButtonProps?.children ?? \"Submit\"}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n )}\n </Flex>\n );\n\n if (skipFormElement) {\n return content;\n }\n\n return (\n <Flex\n component={\"form\"}\n flex={fill ? 1 : undefined}\n {...form.props}\n {...props.flexProps}\n >\n {content}\n </Flex>\n );\n};\n\nexport default TypeForm;\n","import { Divider, Flex, type FlexProps } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport BurgerButton from \"../buttons/BurgerButton.tsx\";\nimport DarkModeButton, {\n type DarkModeButtonProps,\n} from \"../buttons/DarkModeButton.tsx\";\nimport LanguageButton, {\n type LanguageButtonProps,\n} from \"../buttons/LanguageButton.tsx\";\nimport OmnibarButton, {\n type OmnibarButtonProps,\n} from \"../buttons/OmnibarButton.tsx\";\n\nexport type AppBarItem =\n | AppBarElement\n | AppBarBurger\n | AppBarDark\n | AppBarSearch\n | AppBarLang\n | AppBarSpacer\n | AppBarDivider;\n\nexport interface AppBarElement {\n position: \"left\" | \"center\" | \"right\";\n element: ReactNode;\n}\n\nexport interface AppBarBurger {\n position: \"left\" | \"center\" | \"right\";\n type: \"burger\";\n}\n\nexport interface AppBarDark {\n position: \"left\" | \"center\" | \"right\";\n type: \"dark\";\n props?: DarkModeButtonProps;\n}\n\nexport interface AppBarSearch {\n position: \"left\" | \"center\" | \"right\";\n type: \"search\";\n props?: OmnibarButtonProps;\n}\n\nexport interface AppBarLang {\n position: \"left\" | \"center\" | \"right\";\n type: \"lang\";\n props?: LanguageButtonProps;\n}\n\nexport interface AppBarSpacer {\n position: \"left\" | \"center\" | \"right\";\n type: \"spacer\";\n}\n\nexport interface AppBarDivider {\n position: \"left\" | \"center\" | \"right\";\n type: \"divider\";\n}\n\nexport interface AppBarProps {\n flexProps?: FlexProps;\n items?: AppBarItem[];\n}\n\nconst AppBar = (props: AppBarProps) => {\n const { items = [] } = props;\n\n const renderItem = (item: AppBarItem, index: number) => {\n if (\"type\" in item) {\n if (item.type === \"burger\") {\n return <BurgerButton key={index} />;\n }\n if (item.type === \"dark\") {\n return <DarkModeButton key={index} {...item.props} />;\n }\n if (item.type === \"search\") {\n return <OmnibarButton key={index} {...item.props} />;\n }\n if (item.type === \"lang\") {\n return <LanguageButton key={index} {...item.props} />;\n }\n if (item.type === \"spacer\") {\n return <Flex key={index} w={16} />;\n }\n if (item.type === \"divider\") {\n return <Divider key={index} orientation=\"vertical\" />;\n }\n }\n if (\"element\" in item) {\n return item.element;\n }\n return null;\n };\n\n const leftItems = items.filter((item) => item.position === \"left\");\n const centerItems = items.filter((item) => item.position === \"center\");\n const rightItems = items.filter((item) => item.position === \"right\");\n\n return (\n <Flex\n h=\"100%\"\n align=\"center\"\n px=\"md\"\n justify=\"space-between\"\n {...props.flexProps}\n >\n <Flex flex={1}>\n {leftItems.map((item, index) => (\n <Flex key={index} ml={index === 0 ? 0 : \"md\"} align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n <Flex>\n {centerItems.map((item, index) => (\n <Flex key={index} mx=\"md\" align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n <Flex flex={1} align={\"center\"} justify={\"end\"}>\n {rightItems.map((item, index) => (\n <Flex key={index} ml={index === 0 ? 0 : \"md\"} align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n </Flex>\n );\n};\n\nexport default AppBar;\n","import { useStore } from \"@alepha/react\";\nimport { Flex } from \"@mantine/core\";\nimport {\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarRightCollapse,\n} from \"@tabler/icons-react\";\nimport ActionButton from \"./ActionButton.tsx\";\n\nconst ToggleSidebarButton = () => {\n const [collapsed, setCollapsed] = useStore(\"alepha.ui.sidebar.collapsed\");\n\n return (\n <Flex>\n <ActionButton\n icon={\n collapsed ? (\n <IconLayoutSidebarRightCollapse />\n ) : (\n <IconLayoutSidebarLeftCollapse />\n )\n }\n variant={\"subtle\"}\n size={\"md\"}\n onClick={() => setCollapsed(!collapsed)}\n tooltip={{\n position: \"right\",\n label: collapsed ? \"Show sidebar\" : \"Hide sidebar\",\n }}\n />\n </Flex>\n );\n};\n\nexport default ToggleSidebarButton;\n","import { useEvents } from \"@alepha/react\";\nimport { useRouter } from \"@alepha/react/router\";\nimport {\n Flex,\n type FlexProps,\n type MantineBreakpoint,\n Text,\n} from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconSquareRounded,\n} from \"@tabler/icons-react\";\nimport {\n type ComponentType,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { renderIcon } from \"../../helpers/renderIcon.tsx\";\nimport ActionButton, { type ActionProps } from \"../buttons/ActionButton.tsx\";\nimport OmnibarButton from \"../buttons/OmnibarButton.tsx\";\nimport ToggleSidebarButton from \"../buttons/ToggleSidebarButton.tsx\";\n\nexport interface SidebarProps {\n items?: SidebarNode[];\n onItemClick?: (item: SidebarMenuItem) => void;\n onSearchClick?: () => void;\n theme?: SidebarTheme;\n flexProps?: Partial<FlexProps>;\n collapsed?: boolean;\n gap?: MantineBreakpoint | number;\n hide?: {\n paths?: string[];\n };\n\n /**\n * Automatically populate the menu from the router's pages.\n */\n autoPopulateMenu?:\n | boolean\n | {\n startsWith: string;\n };\n}\n\nexport const Sidebar = (props: SidebarProps) => {\n const router = useRouter();\n const { onItemClick } = props;\n\n const renderNode = (item: SidebarNode, key: number) => {\n if (\"type\" in item) {\n if (item.type === \"spacer\") {\n return <Flex key={key} h={16} />;\n }\n\n if (item.type === \"divider\") {\n return (\n <Flex\n key={key}\n h={1}\n bg={\"var(--alepha-border)\"}\n my={\"md\"}\n mx={\"sm\"}\n />\n );\n }\n\n if (item.type === \"search\") {\n return <OmnibarButton collapsed={props.collapsed} key={key} />;\n }\n\n if (item.type === \"toggle\") {\n return <ToggleSidebarButton key={key} />;\n }\n\n if (item.type === \"section\") {\n if (props.collapsed) return;\n return (\n <Flex key={key} mt={\"md\"} mb={\"xs\"} align={\"center\"} gap={\"xs\"}>\n {renderIcon(item.icon)}\n <Text\n key={key}\n size={\"xs\"}\n c={\"dimmed\"}\n tt={\"uppercase\"}\n fw={\"bold\"}\n >\n {item.label}\n </Text>\n </Flex>\n );\n }\n }\n\n if (\"element\" in item) {\n return <Flex key={key}>{item.element}</Flex>;\n }\n\n // Check visibility control\n if (item.can && !item.can()) {\n return null;\n }\n\n if (props.collapsed) {\n return (\n <SidebarCollapsedItem\n key={key}\n item={item}\n level={0}\n onItemClick={onItemClick}\n theme={props.theme ?? {}}\n />\n );\n }\n\n return (\n <SidebarItem\n key={key}\n item={item}\n level={0}\n onItemClick={onItemClick}\n theme={props.theme ?? {}}\n />\n );\n };\n\n const getSidebarNodes = (): SidebarNode[] => {\n if (props.items) return props.items;\n if (props.autoPopulateMenu) {\n const items = router.concretePages\n .filter((page) => !page.can || page.can())\n .map((page) => ({\n label: page.label ?? page.name,\n //description: page.description?.slice(0, 32),\n icon: renderIcon(page.icon),\n href: router.path(page.name),\n })) as SidebarMenuItem[];\n if (\n typeof props.autoPopulateMenu === \"object\" &&\n props.autoPopulateMenu.startsWith\n ) {\n const startsWith = props.autoPopulateMenu.startsWith;\n return items.filter((item) => item.href?.startsWith(startsWith));\n }\n return items;\n }\n return [];\n };\n\n const padding = \"md\";\n const gap = props.items ? props.gap : \"xs\";\n const menu = useMemo(() => getSidebarNodes(), []);\n\n return (\n <Flex\n flex={1}\n py={padding}\n direction={\"column\"}\n className={\"overflow-auto\"}\n {...props.flexProps}\n >\n <Flex gap={gap} px={padding} direction={\"column\"}>\n {menu\n .filter((it) => it.position === \"top\")\n .map((item, index) => renderNode(item, index))}\n </Flex>\n <Flex\n gap={gap}\n px={padding}\n direction={\"column\"}\n flex={1}\n className={\"overflow-auto\"}\n >\n {menu\n .filter((it) => !it.position)\n .map((item, index) => renderNode(item, index))}\n </Flex>\n <Flex gap={gap} px={padding} direction={\"column\"}>\n {menu\n .filter((it) => it.position === \"bottom\")\n .map((item, index) => renderNode(item, index))}\n </Flex>\n </Flex>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SidebarItemProps {\n item: SidebarMenuItem;\n level: number;\n onItemClick?: (item: SidebarMenuItem) => void;\n theme: SidebarTheme;\n}\n\nexport const SidebarItem = (props: SidebarItemProps) => {\n const { item, level } = props;\n const maxLevel = 2; // 0, 1, 2 = 3 levels total\n\n const router = useRouter();\n const isActive = useCallback((item: SidebarMenuItem): boolean => {\n if (!item.children) return false;\n for (const child of item.children) {\n if (child.href) {\n if (router.isActive(child.href)) {\n return true;\n }\n }\n if (isActive(child)) {\n return true;\n }\n }\n return false;\n }, []);\n\n const [isOpen, setIsOpen] = useState<boolean>(isActive(item));\n\n useEvents(\n {\n \"react:transition:end\": () => {\n // recalculate open state on transition end to ensure correct state after navigation\n if (isActive(item)) {\n setIsOpen(true);\n }\n },\n },\n [],\n );\n\n if (level > maxLevel) return null;\n\n const handleItemClick = (e: MouseEvent) => {\n if (!props.item.target) {\n e.preventDefault();\n }\n if (item.children && item.children.length > 0) {\n setIsOpen(!isOpen);\n } else {\n props.onItemClick?.(item);\n item.onClick?.();\n }\n };\n\n return (\n <Flex direction={\"column\"} ps={level === 0 ? 0 : 32} pos={\"relative\"}>\n <ActionButton\n w={\"100%\"}\n justify=\"space-between\"\n href={props.item.href}\n target={props.item.target}\n size={\n props.item.theme?.size ??\n props.theme.button?.size ??\n (level === 0 ? \"sm\" : \"xs\")\n }\n c={\"var(--mantine-color-text)\"}\n color={\"gray\"}\n variant={\"subtle\"}\n variantActive={\"default\"}\n radius={props.item.theme?.radius ?? props.theme.button?.radius ?? \"md\"}\n onClick={handleItemClick}\n leftSection={\n <Flex w={\"100%\"} align=\"center\" gap={\"sm\"}>\n {renderIcon(item.icon)}\n <Flex direction={\"column\"}>\n <Flex>{item.label}</Flex>\n {item.description && (\n <Text size={\"xs\"} c={\"dimmed\"}>\n {item.description}\n </Text>\n )}\n </Flex>\n </Flex>\n }\n rightSection={\n item.children ? (\n <Flex>\n {isOpen ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </Flex>\n ) : (\n props.item.rightSection\n )\n }\n {...props.item.actionProps}\n />\n\n {item.children && isOpen && (\n <Flex direction={\"column\"} data-parent-level={level}>\n <Flex\n style={{\n position: \"absolute\",\n width: 1,\n background:\n \"linear-gradient(to bottom, transparent, var(--alepha-border), transparent)\",\n top: 48,\n left: 20 + 32 * level,\n bottom: 16,\n }}\n />\n {item.children\n .filter((child) => !child.can || child.can())\n .map((child, index) => (\n <SidebarItem\n key={index}\n item={child}\n level={level + 1}\n onItemClick={props.onItemClick}\n theme={props.theme}\n />\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SidebarItemProps {\n item: SidebarMenuItem;\n level: number;\n onItemClick?: (item: SidebarMenuItem) => void;\n theme: SidebarTheme;\n}\n\nconst SidebarCollapsedItem = (props: SidebarItemProps) => {\n const { item, level } = props;\n\n const router = useRouter();\n const isActive = useCallback((item: SidebarMenuItem): boolean => {\n if (!item.children) return false;\n for (const child of item.children) {\n if (child.href) {\n if (router.isActive(child.href)) {\n return true;\n }\n }\n if (isActive(child)) {\n return true;\n }\n }\n return false;\n }, []);\n\n const [isOpen, setIsOpen] = useState<boolean>(isActive(item));\n\n const handleItemClick = (e: MouseEvent) => {\n if (!props.item.target) {\n e.preventDefault();\n }\n if (item.children && item.children.length > 0) {\n setIsOpen(!isOpen);\n } else {\n props.onItemClick?.(item);\n item.onClick?.();\n }\n };\n\n return (\n <ActionButton\n size={\n props.item.theme?.size ??\n props.theme.button?.size ??\n (level === 0 ? \"sm\" : \"xs\")\n }\n variant={\"subtle\"}\n variantActive={\"default\"}\n tooltip={\n item.children\n ? undefined\n : {\n label: item.label,\n position: \"right\",\n }\n }\n radius={props.item.theme?.radius ?? props.theme.button?.radius ?? \"md\"}\n onClick={handleItemClick}\n icon={renderIcon(item.icon) ?? <IconSquareRounded />}\n href={props.item.href as any}\n target={props.item.target}\n menu={\n item.children\n ? ({\n position: \"right\",\n on: \"hover\",\n items: item.children\n .filter((child) => !child.can || child.can())\n .map((child) => ({\n label: child.label,\n href: child.href,\n icon: renderIcon(child.icon),\n children: child.children?.filter((c) => !c.can || c.can()),\n })),\n } as any)\n : undefined\n }\n {...props.item.actionProps}\n />\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type SidebarNode =\n | SidebarMenuItem\n | SidebarSpacer\n | SidebarDivider\n | SidebarSearch\n | SidebarElement\n | SidebarSection\n | SidebarToggle;\n\nexport interface SidebarAbstractItem {\n position?: \"top\" | \"bottom\";\n}\n\nexport interface SidebarElement extends SidebarAbstractItem {\n element: ReactNode;\n}\n\nexport interface SidebarSpacer extends SidebarAbstractItem {\n type: \"spacer\";\n}\n\nexport interface SidebarDivider extends SidebarAbstractItem {\n type: \"divider\";\n}\n\nexport interface SidebarSearch extends SidebarAbstractItem {\n type: \"search\";\n}\n\nexport interface SidebarToggle extends SidebarAbstractItem {\n type: \"toggle\";\n}\n\nexport interface SidebarSection extends SidebarAbstractItem {\n type: \"section\";\n label: string;\n icon?: ReactNode | ComponentType;\n}\n\nexport interface SidebarMenuItem extends SidebarAbstractItem {\n label: string | ReactNode;\n description?: string;\n icon?: ReactNode | ComponentType;\n href?: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n activeStartsWith?: boolean; // Use startWith matching for active state\n onClick?: () => void;\n children?: SidebarMenuItem[];\n rightSection?: ReactNode;\n theme?: SidebarButtonTheme;\n actionProps?: ActionProps;\n can?: () => boolean; // Visibility control: true -> visible, false -> hidden\n}\n\nexport interface SidebarButtonTheme {\n radius?: MantineBreakpoint;\n size?: MantineBreakpoint;\n}\n\nexport interface SidebarTheme {\n button?: SidebarButtonTheme;\n search?: SidebarButtonTheme;\n}\n","import { useEvents, useStore } from \"@alepha/react\";\nimport { NestedView, useRouter } from \"@alepha/react/router\";\nimport {\n AppShell,\n type AppShellFooterProps,\n type AppShellHeaderProps,\n type AppShellMainProps,\n type AppShellNavbarProps,\n type AppShellProps,\n} from \"@mantine/core\";\nimport { type ReactNode, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport AppBar, { type AppBarProps } from \"./AppBar.tsx\";\nimport { Sidebar, type SidebarProps } from \"./Sidebar.tsx\";\n\nexport interface AdminShellProps {\n appShellProps?: Partial<AppShellProps>;\n appShellMainProps?: Partial<AppShellMainProps>;\n appShellHeaderProps?: Partial<AppShellHeaderProps>;\n appShellNavbarProps?: Partial<AppShellNavbarProps>;\n appShellFooterProps?: Partial<AppShellFooterProps>;\n sidebarProps?: Partial<SidebarProps>;\n appBarProps?: Partial<AppBarProps>;\n header?: ReactNode;\n footer?: ReactNode;\n children?: ReactNode;\n\n noSidebarWhen?: {\n /**\n * Paths where the sidebar should be hidden.\n */\n paths?: string[];\n };\n}\n\ndeclare module \"alepha\" {\n interface State {\n /**\n * Whether the sidebar is opened or closed.\n */\n \"alepha.ui.sidebar.opened\"?: boolean;\n\n /**\n * Whether the sidebar is collapsed (narrow) or expanded (wide).\n */\n \"alepha.ui.sidebar.collapsed\"?: boolean;\n }\n}\n\nconst AdminShell = (props: AdminShellProps) => {\n const router = useRouter();\n const [opened, setOpened] = useStore(\"alepha.ui.sidebar.opened\");\n const [collapsed] = useStore(\n \"alepha.ui.sidebar.collapsed\",\n props.sidebarProps?.collapsed,\n );\n\n const shouldShowSidebar = () => {\n if (props.noSidebarWhen?.paths) {\n for (const path of props.noSidebarWhen.paths) {\n if (\n router.isActive(path, {\n startWith: true,\n })\n ) {\n return false;\n }\n }\n }\n return true;\n };\n\n const [showSidebar, setShowSidebar] = useState(shouldShowSidebar());\n\n useEvents(\n {\n \"react:transition:end\": () => {\n setShowSidebar(shouldShowSidebar());\n },\n \"react:transition:begin\": () => {\n setOpened(false);\n },\n },\n [],\n );\n\n // Default AppBar items with burger button on the left\n const defaultAppBarItems = [\n { position: \"left\" as const, type: \"burger\" as const },\n ];\n\n const hasSidebar = showSidebar && props.sidebarProps !== undefined;\n const hasAppBar = hasSidebar || props.appBarProps || props.header;\n\n const headerHeight = hasAppBar ? 60 : 0;\n const footerHeight = props.footer ? 24 : 0;\n const sidebarWidth = hasSidebar ? (collapsed ? 78 : 300) : 0;\n\n return (\n <AppShell\n w={\"100%\"}\n flex={1}\n padding=\"md\"\n header={hasAppBar ? { height: 60 } : undefined}\n navbar={\n hasSidebar\n ? {\n width: collapsed ? { base: 78 } : { base: 300 },\n breakpoint: \"sm\",\n collapsed: { mobile: !opened },\n }\n : undefined\n }\n footer={props.footer ? { height: 24 } : undefined}\n {...props.appShellProps}\n >\n <AppShell.Header bg={ui.colors.surface} {...props.appShellHeaderProps}>\n {props.header ?? (\n <AppBar items={defaultAppBarItems} {...props.appBarProps} />\n )}\n </AppShell.Header>\n\n {hasSidebar && (\n <AppShell.Navbar bg={ui.colors.surface} {...props.appShellNavbarProps}>\n <Sidebar collapsed={collapsed} {...(props.sidebarProps ?? {})} />\n </AppShell.Navbar>\n )}\n\n <AppShell.Main\n pl={sidebarWidth}\n pt={headerHeight}\n pb={footerHeight}\n pr={0}\n display={\"flex\"}\n flex={1}\n style={{ flexDirection: \"column\" }}\n {...props.appShellMainProps}\n >\n {props.children ?? <NestedView />}\n </AppShell.Main>\n\n {props.footer && (\n <AppShell.Footer bg={ui.colors.surface} {...props.appShellFooterProps}>\n {props.footer}\n </AppShell.Footer>\n )}\n </AppShell>\n );\n};\n\nexport default AdminShell;\n","import type { FormModel } from \"@alepha/react/form\";\nimport { Flex } from \"@mantine/core\";\nimport { type TObject, t } from \"alepha\";\nimport { useMemo } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport TypeForm, { type TypeFormProps } from \"../form/TypeForm.tsx\";\nimport type { FilterVisibility } from \"./types.ts\";\n\nexport interface DataTableFiltersProps {\n schema: TObject;\n form: FormModel<TObject>;\n typeFormProps?: Partial<Omit<TypeFormProps<TObject>, \"form\">>;\n filterVisibility: FilterVisibility;\n}\n\nconst DataTableFilters = ({\n schema,\n form,\n typeFormProps,\n filterVisibility,\n}: DataTableFiltersProps) => {\n const visibleSchema = useMemo(() => {\n const visibleKeys = Object.keys(schema.properties).filter(\n (key) => filterVisibility[key] !== false,\n );\n\n if (visibleKeys.length === 0) {\n return null;\n }\n\n const visibleProps = visibleKeys.reduce(\n (acc, key) => {\n acc[key] = schema.properties[key];\n return acc;\n },\n {} as Record<string, unknown>,\n );\n\n return t.object(visibleProps as TObject[\"properties\"]);\n }, [schema, filterVisibility]);\n\n if (!visibleSchema) {\n return null;\n }\n\n return (\n <Flex\n w=\"100%\"\n p=\"xs\"\n bg={ui.colors.surface}\n style={{ borderBottom: \"1px solid var(--alepha-border)\" }}\n >\n <TypeForm\n {...typeFormProps}\n skipSubmitButton\n fill\n form={form}\n schema={visibleSchema}\n />\n </Flex>\n );\n};\n\nexport default DataTableFilters;\n","import { Flex, Pagination, Select } from \"@mantine/core\";\n\nexport interface DataTablePaginationProps {\n page: number;\n size: string;\n totalPages: number;\n onPageChange: (page: number) => void;\n onSizeChange: (size: number) => void;\n}\n\nconst DataTablePagination = ({\n page,\n size,\n totalPages,\n onPageChange,\n onSizeChange,\n}: DataTablePaginationProps) => {\n return (\n <Flex\n align=\"center\"\n justify=\"end\"\n gap=\"md\"\n p=\"xs\"\n style={{\n borderTop: \"1px solid var(--alepha-border)\",\n }}\n >\n <Flex>\n <Select\n w={96}\n variant=\"default\"\n value={size}\n onChange={(value) => {\n if (value) {\n onSizeChange(Number(value));\n }\n }}\n data={[\n { value: \"5\", label: \"5\" },\n { value: \"10\", label: \"10\" },\n { value: \"25\", label: \"25\" },\n { value: \"50\", label: \"50\" },\n { value: \"100\", label: \"100\" },\n ]}\n />\n </Flex>\n <Flex>\n <Pagination\n withEdges\n total={totalPages}\n value={page}\n onChange={onPageChange}\n />\n </Flex>\n </Flex>\n );\n};\n\nexport default DataTablePagination;\n","import {\n Button,\n Checkbox,\n Group,\n Popover,\n ScrollArea,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { IconColumns } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\nimport type { ColumnVisibility, DataTableColumn } from \"./types.ts\";\n\nexport interface ColumnPickerProps<T extends object, Filters extends TObject> {\n columns: { [key: string]: DataTableColumn<T, Filters> };\n visibility: ColumnVisibility;\n onVisibilityChange: (visibility: ColumnVisibility) => void;\n}\n\nconst ColumnPicker = <T extends object, Filters extends TObject>({\n columns,\n visibility,\n onVisibilityChange,\n}: ColumnPickerProps<T, Filters>) => {\n const [opened, setOpened] = useState(false);\n const columnEntries = Object.entries(columns);\n\n const handleShowAll = () => {\n const newVisibility = columnEntries.reduce(\n (acc, [key]) => ({ ...acc, [key]: true }),\n {} as ColumnVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleHideAll = () => {\n const newVisibility = columnEntries.reduce(\n (acc, [key]) => ({ ...acc, [key]: false }),\n {} as ColumnVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleToggle = (key: string, checked: boolean) => {\n onVisibilityChange({\n ...visibility,\n [key]: checked,\n });\n };\n\n const visibleCount = columnEntries.filter(\n ([key]) => visibility[key] !== false,\n ).length;\n\n return (\n <Popover\n width={280}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={opened}\n onChange={setOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <ActionButton variant=\"subtle\" icon={IconColumns} />\n </Popover.Target>\n <Popover.Dropdown\n bg=\"transparent\"\n p=\"xs\"\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <Stack gap=\"xs\" bg={ui.colors.surface} p=\"sm\" bdrs=\"sm\">\n <Group justify=\"space-between\">\n <Text size=\"sm\" fw={500}>\n Columns ({visibleCount}/{columnEntries.length})\n </Text>\n <Group gap={4}>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleShowAll}\n >\n All\n </Button>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleHideAll}\n >\n None\n </Button>\n </Group>\n </Group>\n\n <ScrollArea.Autosize mah={300}>\n <Stack gap={4}>\n {columnEntries.map(([key, col]) => (\n <Checkbox\n key={key}\n label={col.label}\n checked={visibility[key] !== false}\n onChange={(e) => handleToggle(key, e.currentTarget.checked)}\n size=\"sm\"\n />\n ))}\n </Stack>\n </ScrollArea.Autosize>\n </Stack>\n </Popover.Dropdown>\n </Popover>\n );\n};\n\nexport default ColumnPicker;\n","import {\n Button,\n Checkbox,\n Group,\n Popover,\n ScrollArea,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { IconFilter } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\nimport type { FilterVisibility } from \"./types.ts\";\n\nexport interface FilterPickerProps {\n schema: TObject;\n visibility: FilterVisibility;\n onVisibilityChange: (visibility: FilterVisibility) => void;\n}\n\nconst getFieldLabel = (schema: TObject, key: string): string => {\n const prop = schema.properties[key];\n if (prop && typeof prop === \"object\" && \"title\" in prop && prop.title) {\n return prop.title as string;\n }\n // Convert camelCase to Title Case\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n};\n\nconst FilterPicker = ({\n schema,\n visibility,\n onVisibilityChange,\n}: FilterPickerProps) => {\n const [opened, setOpened] = useState(false);\n const filterKeys = Object.keys(schema.properties);\n\n const handleShowAll = () => {\n const newVisibility = filterKeys.reduce(\n (acc, key) => ({ ...acc, [key]: true }),\n {} as FilterVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleHideAll = () => {\n const newVisibility = filterKeys.reduce(\n (acc, key) => ({ ...acc, [key]: false }),\n {} as FilterVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleToggle = (key: string, checked: boolean) => {\n onVisibilityChange({\n ...visibility,\n [key]: checked,\n });\n };\n\n const visibleCount = filterKeys.filter(\n (key) => visibility[key] !== false,\n ).length;\n\n return (\n <Popover\n width={280}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={opened}\n onChange={setOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <ActionButton variant=\"subtle\" icon={IconFilter} />\n </Popover.Target>\n <Popover.Dropdown\n bg=\"transparent\"\n p=\"xs\"\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <Stack gap=\"xs\" bg={ui.colors.surface} p=\"sm\" bdrs=\"sm\">\n <Group justify=\"space-between\">\n <Text size=\"sm\" fw={500}>\n Filters ({visibleCount}/{filterKeys.length})\n </Text>\n <Group gap={4}>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleShowAll}\n >\n All\n </Button>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleHideAll}\n >\n None\n </Button>\n </Group>\n </Group>\n\n <ScrollArea.Autosize mah={300}>\n <Stack gap={4}>\n {filterKeys.map((key) => (\n <Checkbox\n key={key}\n label={getFieldLabel(schema, key)}\n checked={visibility[key] !== false}\n onChange={(e) => handleToggle(key, e.currentTarget.checked)}\n size=\"sm\"\n />\n ))}\n </Stack>\n </ScrollArea.Autosize>\n </Stack>\n </Popover.Dropdown>\n </Popover>\n );\n};\n\nexport default FilterPicker;\n","import { Badge, Divider, Flex } from \"@mantine/core\";\nimport { IconRefresh, IconX } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { isValidElement, type ReactNode } from \"react\";\nimport { isComponentType } from \"../../helpers/isComponentType.ts\";\nimport ActionButton, { type ActionProps } from \"../buttons/ActionButton.tsx\";\nimport ColumnPicker from \"./ColumnPicker.tsx\";\nimport FilterPicker from \"./FilterPicker.tsx\";\nimport type {\n CheckboxAction,\n CheckboxActionContext,\n ColumnVisibility,\n DataTableColumn,\n FilterVisibility,\n} from \"./types.ts\";\n\nexport interface DataTableToolbarProps<\n T extends object,\n Filters extends TObject,\n> {\n columns: { [key: string]: DataTableColumn<T, Filters> };\n filters?: TObject;\n columnVisibility: ColumnVisibility;\n filterVisibility: FilterVisibility;\n onColumnVisibilityChange: (visibility: ColumnVisibility) => void;\n onFilterVisibilityChange: (visibility: FilterVisibility) => void;\n actions?: Array<ActionProps & { label?: ReactNode }>;\n onRefresh?: () => void;\n // Checkbox-related props\n selectedItems?: T[];\n checkboxActions?: Array<CheckboxAction<T>>;\n onClearSelection?: () => void;\n}\n\nconst DataTableToolbar = <T extends object, Filters extends TObject>({\n columns,\n filters,\n columnVisibility,\n filterVisibility,\n onColumnVisibilityChange,\n onFilterVisibilityChange,\n actions,\n onRefresh,\n selectedItems = [],\n checkboxActions,\n onClearSelection,\n}: DataTableToolbarProps<T, Filters>) => {\n const hasSelection = selectedItems.length > 0;\n\n const handleCheckboxAction = async (action: CheckboxAction<T>) => {\n const ctx: CheckboxActionContext<T> = {\n selectedItems,\n clearSelection: onClearSelection || (() => {}),\n };\n await action.onClick(ctx);\n };\n\n return (\n <Flex p=\"xs\" style={{ borderBottom: \"1px solid var(--alepha-border)\" }}>\n <Flex gap={4} align=\"center\">\n {filters && (\n <FilterPicker\n schema={filters}\n visibility={filterVisibility}\n onVisibilityChange={onFilterVisibilityChange}\n />\n )}\n <ColumnPicker\n columns={columns}\n visibility={columnVisibility}\n onVisibilityChange={onColumnVisibilityChange}\n />\n\n {hasSelection && (\n <>\n <Divider orientation=\"vertical\" mx=\"xs\" />\n <Badge variant=\"light\" size=\"lg\">\n {selectedItems.length} selected\n </Badge>\n <ActionButton\n variant=\"subtle\"\n size=\"compact-sm\"\n icon={IconX}\n onClick={onClearSelection}\n >\n Clear\n </ActionButton>\n {checkboxActions?.map((action, index) => (\n <ActionButton\n key={index}\n variant=\"light\"\n size=\"compact-sm\"\n intent={action.intent}\n icon={\n action.icon && isComponentType(action.icon)\n ? action.icon\n : undefined\n }\n onClick={() => handleCheckboxAction(action)}\n >\n {action.label}\n </ActionButton>\n ))}\n </>\n )}\n </Flex>\n <Flex flex={1} />\n <Flex gap=\"xs\">\n {actions?.map((props, index) =>\n !isValidElement(props) ? (\n <ActionButton key={index} {...(props as ActionProps)}>\n {(props as ActionProps & { label?: ReactNode }).label}\n </ActionButton>\n ) : (\n props\n ),\n )}\n <ActionButton icon={IconRefresh} onClick={onRefresh}>\n Refresh\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default DataTableToolbar;\n","import { useInject } from \"@alepha/react\";\nimport { type FormModel, useForm } from \"@alepha/react/form\";\nimport { Checkbox, Flex, Table, Text, UnstyledButton } from \"@mantine/core\";\nimport { useDebouncedCallback } from \"@mantine/hooks\";\nimport {\n IconArrowDown,\n IconArrowsSort,\n IconArrowUp,\n} from \"@tabler/icons-react\";\nimport { Alepha, type Static, type TObject, t } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport DataTableFilters, {\n type DataTableFiltersProps,\n} from \"./DataTableFilters.tsx\";\nimport DataTablePagination from \"./DataTablePagination.tsx\";\nimport DataTableToolbar from \"./DataTableToolbar.tsx\";\nimport type {\n ColumnVisibility,\n DataTableColumnContext,\n DataTableProps,\n FilterVisibility,\n MaybePage,\n} from \"./types.ts\";\n\nconst DEFAULT_VISIBLE_COLUMN_COUNT = 10;\n\ntype SortDirection = \"asc\" | \"desc\" | null;\n\n/**\n * Parse the sort string to get direction for a specific field.\n * Alepha convention: 'field' = ASC, '-field' = DESC\n */\nconst getSortDirection = (\n sortString: string | undefined,\n field: string,\n): SortDirection => {\n if (!sortString) return null;\n const parts = sortString.split(\",\").map((s) => s.trim());\n for (const part of parts) {\n if (part === field) return \"asc\";\n if (part === `-${field}`) return \"desc\";\n }\n return null;\n};\n\n/**\n * Toggle sort for a field in the sort string.\n * Cycles: null -> asc -> desc -> null\n */\nconst toggleSort = (\n sortString: string | undefined,\n field: string,\n): string | undefined => {\n const current = getSortDirection(sortString, field);\n\n // Remove existing sort for this field\n const parts = (sortString || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s && s !== field && s !== `-${field}`);\n\n if (current === null) {\n // No sort -> ASC\n parts.unshift(field);\n } else if (current === \"asc\") {\n // ASC -> DESC\n parts.unshift(`-${field}`);\n }\n // DESC -> remove (already filtered out above)\n\n return parts.length > 0 ? parts.join(\",\") : undefined;\n};\n\nconst DataTable = <T extends object, Filters extends TObject>(\n props: DataTableProps<T, Filters>,\n) => {\n const [items, setItems] = useState<MaybePage<T>>(\n typeof props.items === \"function\"\n ? {\n content: [],\n }\n : props.items,\n );\n\n const defaultSize = props.infinityScroll ? 100 : props.defaultSize || 10;\n const [page, setPage] = useState(1);\n const [size, setSize] = useState(String(defaultSize));\n const [currentPage, setCurrentPage] = useState(0);\n const alepha = useInject(Alepha);\n\n // Column visibility state\n const [columnVisibility, setColumnVisibility] = useState<ColumnVisibility>(\n () => {\n if (props.defaultColumnVisibility) {\n return props.defaultColumnVisibility;\n }\n const columnKeys = Object.keys(props.columns);\n const maxVisible =\n props.defaultVisibleColumnCount ?? DEFAULT_VISIBLE_COLUMN_COUNT;\n return columnKeys.reduce(\n (acc, key, index) => ({\n ...acc,\n [key]: index < maxVisible,\n }),\n {} as ColumnVisibility,\n );\n },\n );\n\n // Filter visibility state\n const [filterVisibility, setFilterVisibility] = useState<FilterVisibility>(\n () => {\n if (props.defaultFilterVisibility) {\n return props.defaultFilterVisibility;\n }\n if (!props.filters?.properties) {\n return {};\n }\n return Object.keys(props.filters.properties).reduce(\n (acc, key) => ({ ...acc, [key]: true }),\n {} as FilterVisibility,\n );\n },\n );\n\n // Handle column visibility changes\n const handleColumnVisibilityChange = (visibility: ColumnVisibility) => {\n setColumnVisibility(visibility);\n props.onColumnVisibilityChange?.(visibility);\n };\n\n // Handle filter visibility changes\n const handleFilterVisibilityChange = (visibility: FilterVisibility) => {\n setFilterVisibility(visibility);\n props.onFilterVisibilityChange?.(visibility);\n };\n\n // Compute visible columns\n const visibleColumns = useMemo(() => {\n return Object.entries(props.columns).filter(\n ([key]) => columnVisibility[key] !== false,\n );\n }, [props.columns, columnVisibility]);\n\n // Current sort string from form\n const [sortString, setSortString] = useState<string | undefined>(undefined);\n\n // Handle column header click for sorting\n const handleSortClick = (columnKey: string, sortKey?: string) => {\n const field = sortKey || columnKey;\n const newSort = toggleSort(sortString, field);\n setSortString(newSort);\n form.input.sort.set(newSort);\n form.input.page.set(0); // Reset to first page when sorting changes\n };\n\n // Checkbox selection state\n const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());\n\n // Default getItemKey uses JSON.stringify if not provided\n const getItemKey = useCallback(\n (item: T): string => {\n if (props.getItemKey) {\n return props.getItemKey(item);\n }\n return JSON.stringify(item);\n },\n [props.getItemKey],\n );\n\n // Get selected items from current content\n const selectedItems = useMemo(() => {\n if (!props.withCheckbox) return [];\n return items.content.filter((item) =>\n selectedKeys.has(getItemKey(item as T)),\n ) as T[];\n }, [items.content, selectedKeys, getItemKey, props.withCheckbox]);\n\n // Check if all current page items are selected\n const allSelected = useMemo(() => {\n if (items.content.length === 0) return false;\n return items.content.every((item) =>\n selectedKeys.has(getItemKey(item as T)),\n );\n }, [items.content, selectedKeys, getItemKey]);\n\n // Check if some (but not all) items are selected\n const someSelected = useMemo(() => {\n if (items.content.length === 0) return false;\n const selectedCount = items.content.filter((item) =>\n selectedKeys.has(getItemKey(item as T)),\n ).length;\n return selectedCount > 0 && selectedCount < items.content.length;\n }, [items.content, selectedKeys, getItemKey]);\n\n // Toggle selection of a single item\n const toggleItemSelection = useCallback(\n (item: T) => {\n const key = getItemKey(item);\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n },\n [getItemKey],\n );\n\n // Toggle selection of all items on current page\n const toggleAllSelection = useCallback(() => {\n if (allSelected) {\n // Deselect all current page items\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n for (const item of items.content) {\n next.delete(getItemKey(item as T));\n }\n return next;\n });\n } else {\n // Select all current page items\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n for (const item of items.content) {\n next.add(getItemKey(item as T));\n }\n return next;\n });\n }\n }, [allSelected, items.content, getItemKey]);\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedKeys(new Set());\n }, []);\n\n const form = useForm(\n {\n schema: t.object({\n ...(props.filters ? props.filters.properties : {}),\n page: t.number({ default: 0 }),\n size: t.number({ default: defaultSize }),\n sort: t.optional(t.string()),\n }),\n handler: async (values) => {\n if (typeof props.items === \"function\") {\n const response = await props.items(\n values as Static<Filters> & {\n page: number;\n size: number;\n sort?: string;\n },\n {\n items: items.content,\n },\n );\n\n if (props.infinityScroll && values.page > 0) {\n // Append new items to existing ones for infinity scroll\n setItems((prev) => ({\n ...response,\n content: [...prev.content, ...response.content],\n }));\n } else {\n setItems(response);\n }\n\n setCurrentPage(values.page);\n }\n },\n onReset: async () => {\n setPage(1);\n setSize(\"10\");\n await form.submit();\n },\n onChange: async (key, value) => {\n if (key === \"page\") {\n setPage(value + 1);\n await form.submit();\n return;\n }\n\n if (key === \"size\") {\n setSize(String(value));\n form.input.page.set(0);\n return;\n }\n\n props.onFilterChange?.(\n key,\n value,\n form as unknown as FormModel<Filters>,\n );\n },\n },\n [items],\n );\n\n const submitDebounce = useDebouncedCallback(() => form.submit(), {\n delay: 800,\n });\n\n const dt = useInject(DateTimeProvider);\n\n useEffect(() => {\n if (props.submitOnInit) {\n form.submit();\n }\n if (props.submitEvery) {\n const it = dt.createInterval(() => {\n form.submit();\n }, props.submitEvery);\n return () => dt.clearInterval(it);\n }\n }, []);\n\n useEffect(() => {\n if (typeof props.items !== \"function\") {\n setItems(props.items);\n }\n }, [props.items]);\n\n // Infinity scroll detection\n useEffect(() => {\n if (!props.infinityScroll || typeof props.items !== \"function\") return;\n\n const handleScroll = () => {\n if (form.submitting) return;\n\n const scrollTop = window.scrollY;\n const windowHeight = window.innerHeight;\n const docHeight = document.documentElement.scrollHeight;\n\n const isNearBottom = scrollTop + windowHeight >= docHeight - 300;\n\n if (isNearBottom) {\n const totalPages = items.page?.totalPages ?? 1;\n\n if (currentPage + 1 < totalPages) {\n form.input.page.set(currentPage + 1);\n }\n }\n };\n\n window.addEventListener(\"scroll\", handleScroll);\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [\n props.infinityScroll,\n form.submitting,\n items.page?.totalPages,\n currentPage,\n form,\n ]);\n\n // Checkbox header column\n const checkboxHeader = props.withCheckbox ? (\n <Table.Th style={{ width: 40 }}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAllSelection}\n aria-label=\"Select all\"\n />\n </Table.Th>\n ) : null;\n\n const head = visibleColumns.map(([key, col]) => {\n const sortField = col.sortKey || key;\n const sortDir = col.sortable\n ? getSortDirection(sortString, sortField)\n : null;\n\n const headerContent = (\n <Flex align=\"center\" gap={4}>\n <Text size=\"xs\">{col.label}</Text>\n {col.sortable && (\n <Flex c=\"dimmed\">\n {sortDir === \"asc\" && <IconArrowUp size={ui.sizes.icon.sm} />}\n {sortDir === \"desc\" && <IconArrowDown size={ui.sizes.icon.sm} />}\n {sortDir === null && <IconArrowsSort size={ui.sizes.icon.sm} />}\n </Flex>\n )}\n </Flex>\n );\n\n return (\n <Table.Th\n key={key}\n style={{\n ...(col.fit\n ? {\n // TODO: not working well (bad formatting in some cases)\n // width: \"1%\",\n // whiteSpace: \"nowrap\",\n }\n : {}),\n ...(col.sortable ? { cursor: \"pointer\" } : {}),\n }}\n >\n {col.sortable ? (\n <UnstyledButton onClick={() => handleSortClick(key, col.sortKey)}>\n {headerContent}\n </UnstyledButton>\n ) : (\n headerContent\n )}\n </Table.Th>\n );\n });\n\n const rows = items.content.map((item, index) => {\n const trProps = props.tableTrProps ? props.tableTrProps(item as T) : {};\n const itemKey = getItemKey(item as T);\n const isSelected = selectedKeys.has(itemKey);\n\n return (\n <Table.Tr key={itemKey} {...trProps}>\n {props.withCheckbox && (\n <Table.Td style={{ width: 40 }}>\n <Checkbox\n checked={isSelected}\n onChange={() => toggleItemSelection(item as T)}\n aria-label=\"Select row\"\n />\n </Table.Td>\n )}\n {visibleColumns.map(([key, col]) => (\n <Table.Td key={key}>\n {col.value(\n item as T,\n {\n index,\n form: form as unknown as FormModel<Filters>,\n alepha,\n } as DataTableColumnContext<Filters>,\n )}\n </Table.Td>\n ))}\n </Table.Tr>\n );\n });\n\n const filterSchema = useMemo(() => {\n if (!props.filters) return null;\n return t.omit(form.options.schema, [\"page\", \"size\", \"sort\"]);\n }, [props.filters, form.options.schema]);\n\n return (\n <Flex\n flex={1}\n p={0}\n bg=\"var(--alepha-elevated)\"\n bdrs=\"sm\"\n bd=\"1px solid var(--alepha-border)\"\n direction=\"column\"\n >\n <DataTableToolbar\n columns={props.columns}\n filters={props.filters}\n columnVisibility={columnVisibility}\n filterVisibility={filterVisibility}\n onColumnVisibilityChange={handleColumnVisibilityChange}\n onFilterVisibilityChange={handleFilterVisibilityChange}\n actions={props.actions}\n onRefresh={() => form.submit()}\n selectedItems={selectedItems}\n checkboxActions={props.checkboxActions}\n onClearSelection={clearSelection}\n />\n\n {filterSchema && props.filters && (\n <DataTableFilters\n schema={filterSchema}\n form={form as unknown as FormModel<TObject>}\n typeFormProps={\n props.typeFormProps as DataTableFiltersProps[\"typeFormProps\"]\n }\n filterVisibility={filterVisibility}\n />\n )}\n\n <Flex className=\"overflow-auto\">\n <Table withColumnBorders withRowBorders {...props.tableProps}>\n <Table.Thead>\n <Table.Tr>\n {checkboxHeader}\n {head}\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>{rows}</Table.Tbody>\n </Table>\n </Flex>\n\n {!props.infinityScroll && (\n <DataTablePagination\n page={page}\n size={size}\n totalPages={items.page?.totalPages ?? 1}\n onPageChange={(value) => {\n form.input.page.set(value - 1);\n }}\n onSizeChange={(value) => {\n form.input.size.set(value);\n }}\n />\n )}\n </Flex>\n );\n};\n\nexport default DataTable;\n","import { useInject } from \"@alepha/react\";\nimport { DialogService } from \"../services/DialogService.tsx\";\n\n/**\n * Use this hook to access the Dialog Service for showing various dialog types.\n *\n * @example\n * ```tsx\n * const dialog = useDialog();\n * await dialog.alert({ title: \"Alert\", message: \"This is an alert message\" });\n * const confirmed = await dialog.confirm({ title: \"Confirm\", message: \"Are you sure?\" });\n * const input = await dialog.prompt({ title: \"Input\", message: \"Enter your name:\" });\n * ```\n */\nexport const useDialog = (): DialogService => {\n return useInject(DialogService);\n};\n","import { AlephaReactForm } from \"@alepha/react/form\";\nimport { AlephaReactHead } from \"@alepha/react/head\";\nimport { AlephaReactI18n } from \"@alepha/react/i18n\";\nimport { $module, type Static } from \"alepha\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { alephaThemeAtom } from \"./atoms/alephaThemeAtom.ts\";\nimport type { ControlProps } from \"./components/form/Control.tsx\";\nimport { ThemeProvider } from \"./providers/ThemeProvider.ts\";\nimport { RootRouter } from \"./RootRouter.ts\";\nimport { DialogService } from \"./services/DialogService.tsx\";\nimport { ToastService } from \"./services/ToastService.tsx\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { Flex, Text } from \"@mantine/core\";\nexport * from \"./atoms/alephaThemeAtom.ts\";\nexport * from \"./atoms/alephaThemeListAtom.ts\";\nexport * from \"./atoms/themes/default.ts\";\nexport * from \"./atoms/themes/midnight.ts\";\nexport type {\n ActionClickButtonProps,\n ActionCommonProps,\n ActionMenuConfig,\n ActionMenuItem,\n ActionNavigationButtonProps,\n ActionProps,\n ActionSubmitButtonProps,\n} from \"./components/buttons/ActionButton.tsx\";\nexport { default as ActionButton } from \"./components/buttons/ActionButton.tsx\";\nexport { default as BurgerButton } from \"./components/buttons/BurgerButton.tsx\";\nexport type { ClipboardButtonProps } from \"./components/buttons/ClipboardButton.tsx\";\nexport { default as ClipboardButton } from \"./components/buttons/ClipboardButton.tsx\";\nexport { default as DarkModeButton } from \"./components/buttons/DarkModeButton.tsx\";\nexport { default as LanguageButton } from \"./components/buttons/LanguageButton.tsx\";\nexport { default as OmnibarButton } from \"./components/buttons/OmnibarButton.tsx\";\nexport type { ThemeButtonProps } from \"./components/buttons/ThemeButton.tsx\";\nexport { default as ThemeButton } from \"./components/buttons/ThemeButton.tsx\";\nexport { default as AlertDialog } from \"./components/dialogs/AlertDialog.tsx\";\nexport { default as ConfirmDialog } from \"./components/dialogs/ConfirmDialog.tsx\";\nexport { default as PromptDialog } from \"./components/dialogs/PromptDialog.tsx\";\nexport { default as Control } from \"./components/form/Control.tsx\";\nexport { default as ControlArray } from \"./components/form/ControlArray.tsx\";\nexport { default as ControlDate } from \"./components/form/ControlDate.tsx\";\nexport { default as ControlNumber } from \"./components/form/ControlNumber.tsx\";\nexport { default as ControlObject } from \"./components/form/ControlObject.tsx\";\nexport { default as ControlQueryBuilder } from \"./components/form/ControlQueryBuilder.tsx\";\nexport { default as ControlSelect } from \"./components/form/ControlSelect.tsx\";\nexport { default as TypeForm } from \"./components/form/TypeForm.tsx\";\nexport {\n type AdminShellProps,\n default as AdminShell,\n} from \"./components/layout/AdminShell.tsx\";\nexport { default as AlephaMantineProvider } from \"./components/layout/AlephaMantineProvider.tsx\";\nexport type {\n AppBarBurger,\n AppBarDark,\n AppBarDivider,\n AppBarElement,\n AppBarItem,\n AppBarLang,\n AppBarProps,\n AppBarSearch,\n AppBarSpacer,\n} from \"./components/layout/AppBar.tsx\";\nexport { default as AppBar } from \"./components/layout/AppBar.tsx\";\nexport { default as Omnibar } from \"./components/layout/Omnibar.tsx\";\nexport type {\n SidebarAbstractItem,\n SidebarButtonTheme,\n SidebarDivider,\n SidebarElement,\n SidebarItemProps,\n SidebarMenuItem,\n SidebarNode,\n SidebarProps,\n SidebarSearch,\n SidebarSection,\n SidebarSpacer,\n SidebarTheme,\n} from \"./components/layout/Sidebar.tsx\";\nexport { Sidebar } from \"./components/layout/Sidebar.tsx\";\nexport { default as DataTable } from \"./components/table/DataTable.tsx\";\nexport type {\n CheckboxAction,\n CheckboxActionContext,\n ColumnVisibility,\n DataTableColumn,\n DataTableColumnContext,\n DataTableProps,\n DataTableSubmitContext,\n FilterVisibility,\n MaybePage,\n} from \"./components/table/types.ts\";\nexport * from \"./constants/ui.ts\";\nexport { useDialog } from \"./hooks/useDialog.ts\";\nexport { useToast } from \"./hooks/useToast.ts\";\nexport * from \"./providers/ThemeProvider.ts\";\nexport * from \"./RootRouter.ts\";\nexport type {\n AlertDialogOptions,\n AlertDialogProps,\n BaseDialogOptions,\n ConfirmDialogOptions,\n ConfirmDialogProps,\n PromptDialogOptions,\n PromptDialogProps,\n} from \"./services/DialogService.tsx\";\nexport { DialogService } from \"./services/DialogService.tsx\";\nexport { ToastService } from \"./services/ToastService.tsx\";\nexport * from \"./utils/extractSchemaFields.ts\";\nexport * from \"./utils/icons.tsx\";\nexport * from \"./utils/string.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface TSchemaOptions {\n $control?: Omit<ControlProps, \"input\">;\n }\n}\n\ndeclare module \"alepha\" {\n interface State {\n [alephaThemeAtom.key]?: Static<typeof alephaThemeAtom.schema>;\n }\n}\n\ndeclare module \"@alepha/react/router\" {\n interface PagePrimitiveOptions {\n /**\n * Human-readable title for the page.\n * - for Sidebar navigation\n * - for Omnibar navigation\n * (soon)\n * - for Breadcrumbs\n * - for document title (with AlephaReactHead)\n */\n label?: string;\n\n /**\n * Optional description of the page.\n */\n description?: string;\n\n /**\n * Optional icon for the page.\n */\n icon?: ReactNode | ComponentType;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Mantine\n *\n * @module alepha.ui\n */\nexport const AlephaUI = $module({\n name: \"alepha.ui\",\n services: [DialogService, ToastService, ThemeProvider, RootRouter],\n register: (alepha) => {\n alepha.with(AlephaReactI18n);\n alepha.with(AlephaReactHead);\n alepha.with(AlephaReactForm);\n alepha.with(ThemeProvider);\n alepha.with(DialogService);\n alepha.with(ToastService);\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["ui","Omnibar","AlephaMantineProvider","Text","Text","Text","Text","AlertDialog","ConfirmDialog","PromptDialog","Flex","ErrorViewer","Flex","ActionButton","Flex","ActionButton","ActionButton","ActionButton","Flex","Text","ActionButton","ActionButton","Flex","Control","Text","Control","Text","Text","ActionButton","Flex","Flex","ControlQueryBuilder","Flex","ControlObject","ControlArray","ControlNumber","ControlSelect","ControlDate","Control","Flex","ActionButton","BurgerButton","DarkModeButton","OmnibarButton","LanguageButton","Flex","Flex","OmnibarButton","ToggleSidebarButton","Text","ActionButton","AppBar","Flex","Flex","TypeForm","Flex","ActionButton","Text","ActionButton","Text","Flex","FilterPicker","ColumnPicker","ActionButton","Flex","Text","DataTableToolbar","DataTableFilters","DataTablePagination"],"sources":["../../src/core/atoms/alephaSidebarAtom.ts","../../src/core/atoms/alephaThemeAtom.ts","../../src/core/atoms/themes/default.ts","../../src/core/atoms/themes/midnight.ts","../../src/core/atoms/alephaThemeListAtom.ts","../../src/core/providers/ThemeProvider.ts","../../src/core/hooks/useTheme.ts","../../src/core/services/ToastService.tsx","../../src/core/hooks/useToast.ts","../../src/core/constants/ui.ts","../../src/core/helpers/isComponentType.ts","../../src/core/helpers/renderIcon.tsx","../../src/core/components/layout/Omnibar.tsx","../../src/core/components/layout/AlephaMantineProvider.tsx","../../src/core/RootRouter.ts","../../src/core/components/data/ErrorViewer.tsx","../../src/core/components/dialogs/AlertDialog.tsx","../../src/core/components/dialogs/ConfirmDialog.tsx","../../src/core/components/dialogs/PromptDialog.tsx","../../src/core/services/DialogService.tsx","../../src/core/components/buttons/ActionButton.tsx","../../src/core/components/buttons/BurgerButton.tsx","../../src/core/components/buttons/ClipboardButton.tsx","../../src/core/components/buttons/DarkModeButton.tsx","../../src/core/components/buttons/LanguageButton.tsx","../../src/core/components/buttons/OmnibarButton.tsx","../../src/core/components/buttons/ThemeButton.tsx","../../src/core/components/buttons/ToggleSidebarButton.tsx","../../src/core/utils/icons.tsx","../../src/core/utils/string.ts","../../src/core/utils/parseInput.ts","../../src/core/components/form/ControlArray.tsx","../../src/core/components/form/ControlDate.tsx","../../src/core/components/form/ControlNumber.tsx","../../src/core/components/form/ControlObject.tsx","../../src/core/utils/extractSchemaFields.ts","../../src/core/components/form/ControlQueryBuilder.tsx","../../src/core/components/form/ControlSelect.tsx","../../src/core/components/form/Control.tsx","../../src/core/components/form/TypeForm.tsx","../../src/core/components/layout/AppBar.tsx","../../src/core/components/layout/Sidebar.tsx","../../src/core/components/layout/AdminShell.tsx","../../src/core/components/table/DataTableFilters.tsx","../../src/core/components/table/DataTablePagination.tsx","../../src/core/components/table/ColumnPicker.tsx","../../src/core/components/table/FilterPicker.tsx","../../src/core/components/table/DataTableToolbar.tsx","../../src/core/components/table/DataTable.tsx","../../src/core/hooks/useDialog.ts","../../src/core/index.ts"],"sourcesContent":["import { $atom, type Static, t } from \"alepha\";\n\nexport const alephaSidebarAtom = $atom({\n name: \"alepha.ui.sidebar\",\n schema: t.object({\n /**\n * Whether the sidebar is opened or closed (mobile).\n */\n opened: t.boolean(),\n /**\n * Whether the sidebar is collapsed (narrow) or expanded (wide).\n */\n collapsed: t.boolean(),\n /**\n * Current width of the sidebar when expanded (can be changed by resizing).\n * @default 300\n */\n width: t.number(),\n /**\n * Default width used when expanding from collapsed state or on hover.\n * @default 300\n */\n defaultWidth: t.number(),\n /**\n * Width of the sidebar when collapsed.\n * @default 78\n */\n collapsedWidth: t.number(),\n /**\n * Maximum width when resizing.\n * @default 500\n */\n maxWidth: t.number(),\n /**\n * Minimum width before auto-collapse triggers.\n * @default 150\n */\n collapseThreshold: t.number(),\n /**\n * Delay in ms before sidebar expands on hover when collapsed.\n * @default 300\n */\n hoverDelay: t.number(),\n }),\n default: {\n opened: false,\n collapsed: false,\n width: 300,\n defaultWidth: 300,\n collapsedWidth: 78,\n maxWidth: 500,\n collapseThreshold: 240,\n hoverDelay: 300,\n },\n});\n\nexport type AlephaSidebarState = Static<typeof alephaSidebarAtom.schema>;\n","import { $atom, type Static, t } from \"alepha\";\n\nexport const alephaThemeAtom = $atom({\n name: \"alepha.ui.theme\",\n schema: t.object({\n index: t.integer(),\n }),\n default: {\n index: 0,\n },\n});\n\nexport type CurrentAlephaTheme = Static<typeof alephaThemeAtom.schema>;\n","import type { AlephaTheme } from \"../../interfaces/AlephaTheme.ts\";\n\nexport const defaultTheme: AlephaTheme = {\n name: \"Default\",\n description: \"Default Alepha Theme\",\n};\n","import type { AlephaTheme } from \"../../interfaces/AlephaTheme.ts\";\n\nexport const midnightTheme: AlephaTheme = {\n name: \"Midnight\",\n description: \"Clean, developer-focused design\",\n primaryColor: \"pink\",\n primaryShade: { light: 7, dark: 8 },\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n fontFamilyMonospace:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n headings: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif',\n fontWeight: \"600\",\n textWrap: \"wrap\",\n sizes: {\n h1: { fontSize: \"2rem\", lineHeight: \"1.25\" },\n h2: { fontSize: \"1.5rem\", lineHeight: \"1.3\" },\n h3: { fontSize: \"1.25rem\", lineHeight: \"1.4\" },\n h4: { fontSize: \"1rem\", lineHeight: \"1.5\" },\n h5: { fontSize: \"0.875rem\", lineHeight: \"1.5\" },\n h6: { fontSize: \"0.75rem\", lineHeight: \"1.5\" },\n },\n },\n radius: {\n xs: \"3px\",\n sm: \"6px\",\n md: \"6px\",\n lg: \"8px\",\n xl: \"12px\",\n },\n defaultRadius: \"sm\",\n colors: {\n dark: [\n \"#d0d7de\",\n \"#8b949e\",\n \"#6e7681\",\n \"#484f58\",\n \"#30363d\",\n \"#21262d\",\n \"#161b22\",\n \"#151b23\",\n \"#0d1117\",\n \"#010409\",\n ],\n gray: [\n \"#f6f8fa\",\n \"#eaeef2\",\n \"#d0d7de\",\n \"#afb8c1\",\n \"#8c959f\",\n \"#6e7781\",\n \"#57606a\",\n \"#424a53\",\n \"#32383f\",\n \"#24292f\",\n ],\n blue: [\n \"#ddf4ff\",\n \"#b6e3ff\",\n \"#80ccff\",\n \"#54aeff\",\n \"#218bff\",\n \"#0969da\",\n \"#0550ae\",\n \"#033d8b\",\n \"#0a3069\",\n \"#002155\",\n ],\n green: [\n \"#dafbe1\",\n \"#aceebb\",\n \"#6fdd8b\",\n \"#4ac26b\",\n \"#2da44e\",\n \"#1a7f37\",\n \"#116329\",\n \"#044f1e\",\n \"#003d16\",\n \"#002d11\",\n ],\n red: [\n \"#ffebe9\",\n \"#ffcecb\",\n \"#ffaba8\",\n \"#ff8182\",\n \"#fa4549\",\n \"#cf222e\",\n \"#a40e26\",\n \"#82071e\",\n \"#660018\",\n \"#4c0014\",\n ],\n },\n};\n","import { $atom, t } from \"alepha\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\nimport { defaultTheme } from \"./themes/default.ts\";\nimport { midnightTheme } from \"./themes/midnight.ts\";\n\nexport const alephaThemeListAtom = $atom({\n name: \"alepha.ui.themeList\",\n schema: t.array(t.json<AlephaTheme>()), // TODO: translate to proper schema\n default: [defaultTheme, midnightTheme],\n});\n","import { $inject, Alepha, AlephaError } from \"alepha\";\nimport { $head } from \"alepha/react/head\";\nimport { $cookie } from \"alepha/server/cookies\";\nimport { alephaThemeAtom } from \"../atoms/alephaThemeAtom.ts\";\nimport { alephaThemeListAtom } from \"../atoms/alephaThemeListAtom.ts\";\nimport { defaultTheme } from \"../atoms/themes/default.ts\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\n\nexport class ThemeProvider {\n protected readonly alepha = $inject(Alepha);\n protected readonly cookie = $cookie({\n name: \"theme\",\n schema: alephaThemeAtom.schema,\n ttl: [1, \"year\"],\n });\n\n protected readonly head = $head(() => {\n const theme = this.getTheme();\n if (!theme || !theme.name) {\n return {};\n }\n return {\n htmlAttributes: {\n \"data-theme\": theme.name,\n },\n };\n });\n\n public setTheme(index: number) {\n const newTheme = this.alepha.store.get(alephaThemeListAtom)[\n index\n ] as AlephaTheme;\n\n if (!newTheme) {\n throw new AlephaError(`Theme with index ${index} not found`);\n }\n\n this.cookie.set({ index });\n this.alepha.store.set(alephaThemeAtom, { index });\n\n if (typeof document === \"undefined\") {\n return;\n }\n\n document.documentElement.removeAttribute(\"data-theme\");\n\n if (newTheme.name) {\n document.documentElement.setAttribute(\"data-theme\", newTheme.name);\n }\n }\n\n public getTheme() {\n const index = this.getThemeIndex();\n const list = this.alepha.store.get(\n alephaThemeListAtom,\n ) as Array<AlephaTheme>;\n return list[index] || list[0] || defaultTheme;\n }\n\n protected getThemeIndex() {\n // TODO: make a safe cookie getter, today it crash when Cookie Server is called inside vite pre-render\n try {\n return (\n this.cookie.get()?.index ??\n this.alepha.store.get(alephaThemeAtom)?.index ??\n 0\n );\n } catch {\n return this.alepha.store.get(alephaThemeAtom)?.index ?? 0;\n }\n }\n}\n","import { useInject, useStore } from \"alepha/react\";\nimport {\n alephaThemeAtom,\n type CurrentAlephaTheme,\n} from \"../atoms/alephaThemeAtom.ts\";\nimport type { AlephaTheme } from \"../interfaces/AlephaTheme.ts\";\nimport { ThemeProvider } from \"../providers/ThemeProvider.ts\";\n\n/**\n * Hook to get and set the current theme.\n *\n * Returns a tuple with the current theme and a function to set the theme.\n *\n * ```tsx\n * const [theme, setTheme] = useTheme();\n * ```\n */\nexport const useTheme = (): [\n AlephaTheme,\n (theme: CurrentAlephaTheme) => void,\n] => {\n useStore(alephaThemeAtom);\n\n const themeProvider = useInject(ThemeProvider);\n const theme = themeProvider.getTheme();\n const setTheme = (theme: CurrentAlephaTheme) => {\n themeProvider.setTheme(theme.index);\n };\n\n return [theme, setTheme] as const;\n};\n","import type { NotificationData } from \"@mantine/notifications\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from \"@tabler/icons-react\";\n\nexport interface ToastServiceOptions {\n default?: Partial<NotificationData>;\n}\n\nexport class ToastService {\n protected readonly raw = notifications;\n\n public readonly options: ToastServiceOptions = {\n default: {\n radius: \"md\",\n withBorder: true,\n withCloseButton: true,\n autoClose: 5000,\n position: \"top-center\",\n },\n };\n\n public show(options: NotificationData) {\n notifications.show({\n ...this.options.default,\n ...options,\n });\n }\n\n public info(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"blue\",\n icon: <IconInfoCircle size={20} />,\n title: \"Info\",\n message: \"Information notification\",\n ...options,\n });\n }\n\n public success(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"green\",\n icon: <IconCheck size={16} />,\n title: \"Success\",\n message: \"Operation completed successfully\",\n ...options,\n });\n }\n\n public warning(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"yellow\",\n icon: <IconAlertTriangle size={20} />,\n title: \"Warning\",\n message: \"Please review this warning\",\n ...options,\n });\n }\n\n public danger(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"red\",\n icon: <IconX size={20} />,\n title: \"Error\",\n message: \"An error occurred\",\n ...options,\n });\n }\n}\n","import { useInject } from \"alepha/react\";\nimport { ToastService } from \"../services/ToastService.tsx\";\n\n/**\n * Use this hook to access the Toast Service for showing notifications.\n *\n * @example\n * ```tsx\n * const toast = useToast();\n * toast.success({ message: \"Operation completed successfully!\" });\n * toast.error({ title: \"Error\", message: \"Something went wrong\" });\n * ```\n */\nexport const useToast = (): ToastService => {\n return useInject(ToastService);\n};\n","export const ui = {\n colors: {\n transparent: \"transparent\",\n background: \"var(--alepha-background)\",\n surface: \"var(--alepha-surface)\",\n elevated: \"var(--alepha-elevated)\",\n border: \"var(--alepha-border)\",\n },\n sizes: {\n icon: {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n },\n },\n};\n","import { type ComponentType, isValidElement } from \"react\";\n\nexport function isComponentType(param: any): param is ComponentType<any> {\n if (isValidElement(param)) return false;\n return (\n typeof param === \"function\" ||\n (typeof param === \"object\" && param !== null && \"$$typeof\" in param)\n );\n}\n","import { ui } from \"@alepha/ui\";\nimport { type ComponentType, isValidElement, type ReactNode } from \"react\";\nimport { isComponentType } from \"./isComponentType.ts\";\n\nexport const renderIcon = (icon: ReactNode | ComponentType): ReactNode => {\n if (!icon) return null;\n if (isValidElement(icon)) return icon;\n if (isComponentType(icon)) {\n const IconComponent = icon;\n return <IconComponent size={ui.sizes.icon.md} />;\n }\n return icon as ReactNode;\n};\n","import { Spotlight, type SpotlightActionData } from \"@mantine/spotlight\";\nimport { IconSearch } from \"@tabler/icons-react\";\nimport { useStore } from \"alepha/react\";\nimport { useRouter } from \"alepha/react/router\";\nimport { type ReactNode, useMemo } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport { renderIcon } from \"../../helpers/renderIcon.tsx\";\n\nexport interface OmnibarProps {\n shortcut?: string | string[];\n searchPlaceholder?: string;\n nothingFound?: ReactNode;\n}\n\nconst Omnibar = (props: OmnibarProps) => {\n const shortcut = props.shortcut ?? \"mod+K\";\n const searchPlaceholder = props.searchPlaceholder ?? \"Search...\";\n const nothingFound = props.nothingFound ?? \"Nothing found...\";\n const router = useRouter();\n\n // watch user to re-render on permission changes\n const [user] = useStore(\"alepha.server.request.user\");\n\n const actions: SpotlightActionData[] = useMemo(\n () =>\n router.concretePages\n .filter((page) => {\n if (page.can && !page.can()) return false;\n\n return true;\n })\n .map((page) => ({\n id: page.name,\n label: page.label ?? page.name,\n description: page.description,\n onClick: () => {\n if (page.staticName) {\n return router.go(page.staticName, { params: page.params });\n }\n return router.go(page.name);\n },\n leftSection: renderIcon(page.icon),\n })),\n [user],\n );\n\n return (\n <Spotlight\n actions={actions}\n shortcut={shortcut}\n limit={10}\n searchProps={{\n leftSection: <IconSearch size={ui.sizes.icon.md} />,\n placeholder: searchPlaceholder,\n }}\n nothingFound={nothingFound}\n />\n );\n};\n\nexport default Omnibar;\n","import {\n ColorSchemeScript,\n type ColorSchemeScriptProps,\n MantineProvider,\n type MantineProviderProps,\n} from \"@mantine/core\";\nimport { ModalsProvider, type ModalsProviderProps } from \"@mantine/modals\";\nimport { Notifications, type NotificationsProps } from \"@mantine/notifications\";\nimport type { NavigationProgressProps } from \"@mantine/nprogress\";\nimport { NavigationProgress, nprogress } from \"@mantine/nprogress\";\nimport { TypeBoxError } from \"alepha\";\nimport { useEvents } from \"alepha/react\";\nimport { FormValidationError } from \"alepha/react/form\";\nimport { NestedView } from \"alepha/react/router\";\nimport type { ReactNode } from \"react\";\nimport { useTheme } from \"../../hooks/useTheme.ts\";\nimport { useToast } from \"../../hooks/useToast.ts\";\nimport Omnibar, { type OmnibarProps } from \"./Omnibar.tsx\";\n\nexport interface AlephaMantineProviderProps {\n children?: ReactNode;\n mantine?: MantineProviderProps;\n colorSchemeScript?: ColorSchemeScriptProps;\n navigationProgress?: NavigationProgressProps;\n notifications?: NotificationsProps;\n modals?: ModalsProviderProps;\n omnibar?: OmnibarProps | false;\n}\n\nconst AlephaMantineProvider = (props: AlephaMantineProviderProps) => {\n const toast = useToast();\n const [theme] = useTheme();\n\n useEvents(\n {\n \"react:transition:begin\": () => {\n nprogress.start();\n },\n \"react:transition:end\": () => {\n nprogress.complete();\n },\n \"react:action:error\": ({ error }) => {\n if (\n error instanceof FormValidationError ||\n error instanceof TypeBoxError\n ) {\n // Validation errors are handled by the form component\n return;\n }\n\n toast.danger({\n title: error.name || \"Error\",\n message:\n error.message ?? \"An error occurred while processing your action.\",\n });\n },\n },\n [],\n );\n\n const defaultColorScheme =\n props.mantine?.defaultColorScheme ?? theme.defaultColorScheme;\n\n return (\n <>\n <ColorSchemeScript\n defaultColorScheme={defaultColorScheme}\n {...props.colorSchemeScript}\n />\n <MantineProvider\n {...props.mantine}\n defaultColorScheme={defaultColorScheme}\n theme={{\n // Spread all theme properties from the selected theme\n ...theme,\n // User overrides take precedence\n ...props.mantine?.theme,\n }}\n >\n <Notifications {...props.notifications} />\n <NavigationProgress {...props.navigationProgress} />\n <ModalsProvider {...props.modals}>\n {props.omnibar !== false && <Omnibar {...props.omnibar} />}\n {props.children ?? <NestedView />}\n </ModalsProvider>\n </MantineProvider>\n </>\n );\n};\n\nexport default AlephaMantineProvider;\n","import { $page } from \"alepha/react/router\";\nimport AlephaMantineProvider from \"./components/layout/AlephaMantineProvider.tsx\";\n\nexport class RootRouter {\n public readonly root = $page({\n path: \"/\",\n component: AlephaMantineProvider,\n });\n}\n","import {\n ActionIcon,\n Box,\n Collapse,\n CopyButton,\n type MantineSize,\n Text,\n Tooltip,\n} from \"@mantine/core\";\nimport {\n IconCheck,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\n\ninterface ErrorViewerProps {\n error: Error | unknown;\n showStack?: boolean;\n copyable?: boolean;\n size?: MantineSize;\n}\n\nconst getSizeConfig = (size: MantineSize = \"sm\") => {\n const configs = {\n xs: { text: \"xs\", icon: 12, gap: 2 },\n sm: { text: \"sm\", icon: 14, gap: 4 },\n md: { text: \"md\", icon: 16, gap: 6 },\n lg: { text: \"lg\", icon: 18, gap: 8 },\n xl: { text: \"xl\", icon: 20, gap: 10 },\n };\n return configs[size] || configs.sm;\n};\n\nconst parseStackTrace = (stack: string): string[] => {\n return stack\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n};\n\nexport const ErrorViewer = ({\n error,\n showStack = true,\n copyable = true,\n size = \"sm\",\n}: ErrorViewerProps) => {\n const [stackExpanded, setStackExpanded] = useState(false);\n const sizeConfig = getSizeConfig(size);\n const copyIconSize = sizeConfig.icon + 2;\n\n const isError = error instanceof Error;\n const errorName = isError ? error.name : \"Error\";\n const errorMessage = isError ? error.message : String(error);\n const errorStack = isError ? error.stack : undefined;\n const stackLines = errorStack ? parseStackTrace(errorStack) : [];\n\n const getCopyContent = () => {\n if (isError) {\n return `${errorName}: ${errorMessage}${errorStack ? `\\n\\n${errorStack}` : \"\"}`;\n }\n return String(error);\n };\n\n return (\n <Box pos=\"relative\" w=\"100%\">\n {copyable && (\n <Box pos=\"absolute\" top={0} right={0} style={{ zIndex: 1 }}>\n <CopyButton value={getCopyContent()}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? \"Copied\" : \"Copy Error\"}>\n <ActionIcon\n color={copied ? \"teal\" : \"gray\"}\n variant=\"subtle\"\n onClick={copy}\n size={size}\n >\n {copied ? (\n <IconCheck size={copyIconSize} />\n ) : (\n <IconCopy size={copyIconSize} />\n )}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n </Box>\n )}\n <Box pt={copyable ? 30 : 0}>\n <Box\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: sizeConfig.gap,\n }}\n >\n <Text\n component=\"span\"\n c=\"red\"\n ff=\"monospace\"\n fw={600}\n size={sizeConfig.text}\n >\n {errorName}:\n </Text>\n <Text\n component=\"span\"\n ff=\"monospace\"\n size={sizeConfig.text}\n style={{ wordBreak: \"break-word\" }}\n >\n {errorMessage}\n </Text>\n </Box>\n\n {showStack && stackLines.length > 1 && (\n <Box mt=\"sm\">\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: sizeConfig.gap,\n cursor: \"pointer\",\n }}\n onClick={() => setStackExpanded(!stackExpanded)}\n >\n <ActionIcon size=\"xs\" variant=\"transparent\" c=\"dimmed\">\n {stackExpanded ? (\n <IconChevronDown size={sizeConfig.icon} />\n ) : (\n <IconChevronRight size={sizeConfig.icon} />\n )}\n </ActionIcon>\n <Text c=\"dimmed\" size={sizeConfig.text} fw={500}>\n Stack Trace ({stackLines.length - 1} frames)\n </Text>\n </Box>\n\n <Collapse in={stackExpanded}>\n <Box\n mt=\"xs\"\n pl=\"md\"\n style={{\n borderLeft: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n {stackLines.slice(1).map((line, index) => (\n <Text\n key={index}\n ff=\"monospace\"\n size=\"xs\"\n c=\"dimmed\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-all\",\n }}\n >\n {line}\n </Text>\n ))}\n </Box>\n </Collapse>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n\nexport default ErrorViewer;\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { AlertDialogProps } from \"../../services/DialogService.tsx\";\n\nconst AlertDialog = ({ options, onClose }: AlertDialogProps) => (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button onClick={onClose}>{options?.okLabel || \"OK\"}</Button>\n </Group>\n </>\n);\n\nexport default AlertDialog;\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { ConfirmDialogProps } from \"../../services/DialogService.tsx\";\n\nconst ConfirmDialog = ({ options, onConfirm }: ConfirmDialogProps) => (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onConfirm(false)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n color={options?.confirmColor || \"blue\"}\n onClick={() => onConfirm(true)}\n >\n {options?.confirmLabel || \"Confirm\"}\n </Button>\n </Group>\n </>\n);\n\nexport default ConfirmDialog;\n","import { Button, Group, Text, TextInput } from \"@mantine/core\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PromptDialogProps } from \"../../services/DialogService.tsx\";\n\nconst PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {\n const [value, setValue] = useState(options?.defaultValue || \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n // autofocus the input when the dialog opens\n inputRef.current?.focus();\n }, []);\n\n const handleSubmit = () => {\n if (!options?.required || value.trim()) {\n onSubmit(value);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\") {\n handleSubmit();\n }\n };\n\n return (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <TextInput\n ref={inputRef}\n label={options?.label}\n placeholder={options?.placeholder}\n value={value}\n onChange={(event) => setValue(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n required={options?.required}\n mb=\"md\"\n />\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onSubmit(null)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={options?.required && !value.trim()}\n >\n {options?.submitLabel || \"OK\"}\n </Button>\n </Group>\n </>\n );\n};\n\nexport default PromptDialog;\n","import { Flex, type ModalProps } from \"@mantine/core\";\nimport { modals } from \"@mantine/modals\";\nimport type { ReactNode } from \"react\";\nimport ErrorViewer from \"../components/data/ErrorViewer.tsx\";\nimport AlertDialog from \"../components/dialogs/AlertDialog.tsx\";\nimport ConfirmDialog from \"../components/dialogs/ConfirmDialog.tsx\";\nimport PromptDialog from \"../components/dialogs/PromptDialog.tsx\";\nimport { ui } from \"../constants/ui.ts\";\n\n// Base interfaces\nexport interface BaseDialogOptions extends Partial<ModalProps> {\n title?: ReactNode;\n message?: ReactNode;\n content?: any; // weird typing for mantine modals content\n}\n\nexport interface AlertDialogOptions extends BaseDialogOptions {\n okLabel?: string;\n}\n\nexport interface ConfirmDialogOptions extends BaseDialogOptions {\n confirmLabel?: string;\n cancelLabel?: string;\n confirmColor?: string;\n}\n\nexport interface PromptDialogOptions extends BaseDialogOptions {\n placeholder?: string;\n defaultValue?: string;\n label?: string;\n required?: boolean;\n submitLabel?: string;\n cancelLabel?: string;\n}\n\n// Component prop interfaces\nexport interface AlertDialogProps {\n options?: AlertDialogOptions;\n onClose: () => void;\n}\n\nexport interface ConfirmDialogProps {\n options?: ConfirmDialogOptions;\n onConfirm: (confirmed: boolean) => void;\n}\n\nexport interface PromptDialogProps {\n options?: PromptDialogOptions;\n onSubmit: (value: string | null) => void;\n}\n\nexport interface DialogServiceOptions {\n default?: Partial<BaseDialogOptions>;\n}\n\nexport class DialogService {\n public readonly options: DialogServiceOptions = {\n default: {\n centered: true,\n withCloseButton: true,\n size: \"md\",\n overlayProps: {\n backgroundOpacity: 0.55,\n blur: 3,\n },\n transitionProps: {\n transition: \"pop\",\n duration: 200,\n },\n },\n };\n\n /**\n * Show an alert dialog with a message\n */\n public alert(options?: AlertDialogOptions): Promise<void> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Alert\",\n content: (\n <AlertDialog\n options={options}\n onClose={() => {\n this.close(modalId);\n resolve();\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a confirmation dialog that returns a promise\n */\n public confirm(options?: ConfirmDialogOptions): Promise<boolean> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Confirm\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <ConfirmDialog\n options={options}\n onConfirm={(confirmed) => {\n this.close(modalId);\n resolve(confirmed);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a prompt dialog to get user input\n */\n public prompt(options?: PromptDialogOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Input\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <PromptDialog\n options={options}\n onSubmit={(value) => {\n this.close(modalId);\n resolve(value);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Open a custom dialog with provided content\n */\n public open(options?: BaseDialogOptions): string {\n return modals.open({\n ...this.options.default,\n ...options,\n children: options?.content || options?.message,\n });\n }\n\n /**\n * Close the currently open dialog or a specific dialog by ID\n */\n public close(modalId?: string): void {\n if (modalId) {\n modals.close(modalId);\n } else {\n modals.closeAll();\n }\n }\n\n /**\n * Show an error viewer dialog\n */\n public error(\n error: Error | unknown,\n options?: BaseDialogOptions & { showStack?: boolean },\n ): void {\n this.open({\n size: \"lg\",\n title: options?.title || \"Error\",\n ...options,\n content: (\n <Flex bdrs={\"md\"} w={\"100%\"} flex={1} p={\"sm\"} bg={ui.colors.surface}>\n <ErrorViewer\n size={\"xs\"}\n error={error}\n showStack={options?.showStack ?? true}\n />\n </Flex>\n ),\n });\n }\n\n /**\n * Show a form dialog for structured input\n */\n public form(options?: BaseDialogOptions): Promise<any> {\n // Implementation to be added\n return Promise.resolve(null);\n }\n\n /**\n * Show a loading/progress dialog with optional progress percentage\n */\n public loading(options?: BaseDialogOptions & { progress?: number }): void {\n // Implementation to be added\n }\n\n /**\n * Show an image viewer/gallery dialog\n */\n public image(src: string | string[], options?: BaseDialogOptions): void {\n // Implementation to be added\n }\n}\n","import {\n Anchor,\n type AnchorProps,\n Button,\n type ButtonProps,\n Flex,\n Menu,\n type MenuItemProps,\n type MenuProps,\n type MenuTargetProps,\n ThemeIcon,\n type ThemeIconProps,\n Tooltip,\n type TooltipProps,\n useMantineTheme,\n} from \"@mantine/core\";\nimport { IconCheck, IconChevronRight } from \"@tabler/icons-react\";\nimport { type UseActionReturn, useAction } from \"alepha/react\";\nimport { type FormModel, useFormState } from \"alepha/react/form\";\nimport {\n type RouterGoOptions,\n type UseActiveOptions,\n useActive,\n useRouter,\n} from \"alepha/react/router\";\nimport {\n type ButtonHTMLAttributes,\n Children,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport { isComponentType } from \"../../helpers/isComponentType.ts\";\n\nexport interface ActionMenuItem {\n /**\n * Menu item type\n */\n type?: \"item\" | \"divider\" | \"label\";\n\n /**\n * Label text for the menu item\n */\n label?: string | ReactNode;\n\n /**\n * Icon element to display before the label\n */\n icon?: ReactNode;\n\n /**\n * Click handler for menu items\n */\n onClick?: () => void;\n\n /**\n * Href for navigation menu items\n */\n href?: string;\n\n /**\n * Color for the menu item (e.g., \"red\" for danger actions)\n */\n color?: string;\n\n /**\n * Nested submenu items\n */\n children?: ActionMenuItem[];\n\n /**\n * Whether the menu item is active\n */\n active?: boolean;\n}\n\nexport interface ActionMenuConfig {\n /**\n * Array of menu items to display\n */\n items: ActionMenuItem[];\n\n /**\n * Menu position relative to the button\n */\n position?:\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"left\"\n | \"right\";\n\n /**\n * Menu width\n */\n width?: number | string;\n\n /**\n * Menu shadow\n */\n shadow?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n on?: \"hover\" | \"click\";\n\n targetProps?: MenuTargetProps;\n\n menuProps?: MenuProps;\n}\n\nexport interface ActionCommonProps extends ButtonProps {\n children?: ReactNode;\n\n textVisibleFrom?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n /**\n * Tooltip to display on hover. Can be a string for simple tooltips\n * or a TooltipProps object for advanced configuration.\n */\n tooltip?: string | number | TooltipProps;\n\n /**\n * Menu configuration. When provided, the action will display a dropdown menu.\n */\n menu?: ActionMenuConfig;\n\n /**\n * If set, a confirmation dialog will be shown before performing the action.\n * If `true`, a default title and message will be used.\n * If a string, it will be used as the message with a default title.\n * If an object, it can contain `title` and `message` properties to customize the dialog.\n */\n confirm?: boolean | string | { title?: string; message: string };\n\n /**\n * Icon to display on the left side of the button.\n * If no children are provided, the button will be styled as an icon-only button.\n */\n icon?: ReactNode | ComponentType;\n\n /**\n * Additional props to pass to the ThemeIcon wrapping the icon.\n */\n themeIconProps?: ThemeIconProps;\n\n /**\n * Visual intent of the action button.\n */\n intent?: \"primary\" | \"success\" | \"danger\" | \"warning\" | \"info\" | \"none\";\n}\n\nexport type ActionProps = ActionCommonProps &\n (\n | ActionNavigationButtonProps\n | ActionClickButtonProps\n | ActionSubmitButtonProps\n | ActionHookButtonProps\n | {}\n );\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Helper function to render menu items recursively\nconst ActionMenuItem = (props: {\n item: ActionMenuItem;\n index: number;\n}): ReactNode => {\n const { item, index } = props;\n\n const router = useRouter();\n const action = useAction(\n {\n handler: async (e: any) => {\n await item.onClick?.();\n },\n },\n [item.onClick],\n );\n\n // Render divider\n if (item.type === \"divider\") {\n return <Menu.Divider key={index} />;\n }\n\n // Render label\n if (item.type === \"label\") {\n return <Menu.Label key={index}>{item.label}</Menu.Label>;\n }\n\n // Render submenu if it has children\n if (item.children && item.children.length > 0) {\n return (\n <Menu key={index} trigger=\"hover\" position=\"right-start\" offset={2}>\n <Menu.Target>\n <Menu.Item\n leftSection={item.icon}\n rightSection={<IconChevronRight size={14} />}\n >\n {item.label}\n </Menu.Item>\n </Menu.Target>\n <Menu.Dropdown>\n {item.children.map((child, childIndex) => (\n <ActionMenuItem item={child} index={childIndex} key={childIndex} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};\n if (props.item.onClick) {\n menuItemProps.onClick = action.run;\n } else if (props.item.href) {\n Object.assign(menuItemProps, router.anchor(props.item.href));\n }\n\n // render regular menu item\n return (\n <Menu.Item\n key={index}\n leftSection={item.icon}\n onClick={item.onClick}\n color={item.color}\n rightSection={\n item.active ? (\n <ThemeIcon size={\"xs\"} variant={\"transparent\"}>\n <IconCheck />\n </ThemeIcon>\n ) : undefined\n }\n {...menuItemProps}\n >\n {item.label}\n </Menu.Item>\n );\n};\n\nconst ActionButton = (_props: ActionProps) => {\n const theme = useMantineTheme();\n const props = { ..._props };\n const { tooltip, menu, icon, ...restProps } = props;\n\n if (props.variant === \"subtle\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"gray\";\n }\n\n if (props.intent) {\n if (props.intent === \"none\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"gray\";\n } else if (props.intent === \"primary\") {\n restProps.c ??= \"white\";\n restProps.color ??= theme.primaryColor;\n } else if (props.intent === \"success\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"green\";\n } else if (props.intent === \"danger\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"red\";\n } else if (props.intent === \"warning\") {\n restProps.c ??= \"var(--mantine-color-text)\";\n restProps.color ??= \"yellow\";\n } else if (props.intent === \"info\") {\n restProps.c ??= \"white\";\n restProps.color ??= \"blue\";\n }\n }\n\n if (props.icon) {\n const icon = isComponentType(props.icon) ? (\n <props.icon size={ui.sizes.icon.md} />\n ) : (\n <ThemeIcon\n w={24} // TODO: make size configurable\n variant={\"transparent\"}\n size={\"sm\"}\n c={\"var(--mantine-color-text)\"}\n {...props.themeIconProps}\n >\n {props.icon as ReactNode}\n </ThemeIcon>\n );\n\n if (!props.children) {\n restProps.children = Children.only(icon);\n restProps.px ??= \"xs\"; // TODO: change based on props.size ?\n } else {\n restProps.leftSection = icon;\n }\n }\n\n if (props.leftSection && !props.children) {\n restProps.px ??= \"xs\";\n }\n\n if (props.textVisibleFrom) {\n const { children, textVisibleFrom, leftSection, ...rest } = restProps;\n return (\n <>\n <Flex w={\"100%\"} visibleFrom={textVisibleFrom}>\n <ActionButton\n flex={1}\n {...rest}\n leftSection={leftSection}\n tooltip={tooltip}\n menu={menu}\n >\n {children}\n </ActionButton>\n </Flex>\n <Flex w={\"100%\"} hiddenFrom={textVisibleFrom}>\n <ActionButton px={\"xs\"} {...rest} tooltip={tooltip} menu={menu}>\n {leftSection}\n </ActionButton>\n </Flex>\n </>\n );\n }\n\n const renderAction = () => {\n if (\"href\" in restProps && restProps.href) {\n if (restProps.href.startsWith(\"http\") || restProps.target) {\n return (\n <ActionHrefButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionHrefButton>\n );\n }\n return (\n <ActionNavigationButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionNavigationButton>\n );\n }\n\n delete (restProps as any).classNameActive;\n delete (restProps as any).variantActive;\n\n if (\"action\" in restProps && restProps.action) {\n return (\n <ActionHookButton {...restProps} action={restProps.action}>\n {restProps.children}\n </ActionHookButton>\n );\n }\n\n if (\"onClick\" in restProps && restProps.onClick) {\n return (\n <ActionClickButton {...restProps} onClick={restProps.onClick}>\n {restProps.children}\n </ActionClickButton>\n );\n }\n\n if (\"form\" in restProps && restProps.form) {\n if (restProps.type === \"reset\") {\n return (\n <ActionResetButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionResetButton>\n );\n }\n return (\n <ActionSubmitButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionSubmitButton>\n );\n }\n\n return <Button {...(restProps as any)}>{restProps.children}</Button>;\n };\n\n let actionElement = renderAction();\n\n // wrap with Menu if provided\n if (menu) {\n actionElement = (\n <Menu\n position={menu.position || \"bottom-start\"}\n width={menu.width || 200}\n shadow={menu.shadow || \"md\"}\n trigger={menu.on === \"hover\" ? \"hover\" : \"click\"}\n {...menu.menuProps}\n >\n <Menu.Target {...menu.targetProps}>{actionElement}</Menu.Target>\n <Menu.Dropdown>\n {menu.items.map((item, index) => (\n <ActionMenuItem item={item} index={index} key={index} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n // Wrap with Tooltip if provided\n if (tooltip) {\n // openDelay: 1000 -> like HTML title attribute\n const defaultTooltipProps: Partial<TooltipProps> = {\n openDelay: 1000,\n };\n const tooltipProps: TooltipProps =\n typeof tooltip === \"string\" || typeof tooltip === \"number\"\n ? {\n ...defaultTooltipProps,\n label: tooltip,\n children: actionElement,\n }\n : { ...defaultTooltipProps, ...tooltip, children: actionElement };\n\n return <Tooltip {...tooltipProps} />;\n }\n\n return actionElement;\n};\n\nexport default ActionButton;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Submit\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionSubmitButtonProps extends ButtonProps {\n form: FormModel<any>;\n type?: \"submit\" | \"reset\";\n}\n\n/**\n * Action button that submits a form with loading and disabled state handling.\n */\nconst ActionSubmitButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button\n {...buttonProps}\n loading={state.loading}\n disabled={state.loading}\n type={\"submit\"}\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionResetButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button {...buttonProps} disabled={state.loading} type={\"reset\"}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action with useAction Hook\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionHookButtonProps extends ButtonProps {\n action: UseActionReturn<any[], any>;\n}\n\n/**\n * Action button that integrates with useAction hook return value.\n * Automatically handles loading state and executes the action on click.\n *\n * @example\n * ```tsx\n * const saveAction = useAction({\n * handler: async (data) => {\n * await api.save(data);\n * }\n * }, []);\n *\n * <ActionButton action={saveAction}>\n * Save\n * </ActionButton>\n * ```\n */\nconst ActionHookButton = (props: ActionHookButtonProps) => {\n const { action, ...buttonProps } = props;\n\n return (\n <Button\n {...buttonProps}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={() => action.run()}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Click\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionClickButtonProps extends ButtonProps {\n onClick: (e: any) => any;\n}\n\n/**\n * Basic action button that handles click events with loading and error handling.\n *\n * @example\n * ```tsx\n * <ActionButton onClick={() => api.doSomething()}>\n * Do Something\n * </ActionButton>\n * ```\n */\nconst ActionClickButton = (props: ActionClickButtonProps) => {\n const action = useAction(\n {\n handler: async (e: any) => {\n await props.onClick(e);\n },\n },\n [props.onClick],\n );\n\n return (\n <Button\n {...props}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={action.run}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Navigation\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionNavigationButtonProps extends ButtonProps {\n href: string;\n active?: Partial<UseActiveOptions> | false;\n routerGoOptions?: RouterGoOptions;\n classNameActive?: string;\n variantActive?: ButtonProps[\"variant\"];\n target?: string;\n anchorProps?: AnchorProps;\n}\n\n/**\n * Action for navigation with active state support.\n */\nconst ActionNavigationButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n ...buttonProps\n } = props;\n const router = useRouter();\n const { isPending, isActive } = useActive(\n options ? { href: props.href, ...options } : { href: props.href },\n );\n const anchorProps = router.anchor(props.href, routerGoOptions);\n\n const className = buttonProps.className || \"\";\n if (isActive && options !== false && classNameActive) {\n buttonProps.className = `${className} ${classNameActive}`.trim();\n }\n\n if (props.anchorProps) {\n return (\n <Anchor component={\"a\"} {...anchorProps} {...props.anchorProps}>\n {props.children}\n </Anchor>\n );\n }\n\n return (\n <Button\n component={\"a\"}\n loading={isPending}\n {...buttonProps}\n {...anchorProps}\n variant={\n isActive && options !== false\n ? (variantActive ?? \"filled\")\n : (buttonProps.variant ?? \"subtle\")\n }\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionHrefButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n target,\n ...buttonProps\n } = props;\n\n return (\n <Button component={\"a\"} target={target} {...buttonProps}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n","import { Burger, type BurgerProps } from \"@mantine/core\";\nimport { useStore } from \"alepha/react\";\nimport { alephaSidebarAtom } from \"../../atoms/alephaSidebarAtom.ts\";\n\nexport interface BurgerButtonProps extends BurgerProps {}\n\nconst BurgerButton = (props: BurgerButtonProps) => {\n const [sidebar, setSidebar] = useStore(alephaSidebarAtom);\n\n return (\n <Burger\n opened={sidebar.opened}\n onClick={() => setSidebar({ ...sidebar, opened: !sidebar.opened })}\n hiddenFrom=\"sm\"\n size=\"sm\"\n {...props}\n />\n );\n};\n\nexport default BurgerButton;\n","import { CopyButton, Tooltip } from \"@mantine/core\";\nimport { IconCheck, IconCopy } from \"@tabler/icons-react\";\nimport ActionButton, { type ActionCommonProps } from \"./ActionButton.tsx\";\n\nexport interface ClipboardButtonProps\n extends Omit<ActionCommonProps, \"onClick\" | \"icon\"> {\n /**\n * The value to copy to the clipboard\n */\n value: string;\n\n /**\n * Timeout in ms to show the \"Copied\" state (default: 2000)\n */\n timeout?: number;\n\n /**\n * Label to show in tooltip when not copied (default: \"Copy\")\n */\n copyLabel?: string;\n\n /**\n * Label to show in tooltip when copied (default: \"Copied\")\n */\n copiedLabel?: string;\n}\n\nconst ClipboardButton = (props: ClipboardButtonProps) => {\n const {\n value,\n timeout = 2000,\n copyLabel = \"Copy\",\n copiedLabel = \"Copied\",\n children,\n ...buttonProps\n } = props;\n\n return (\n <CopyButton value={value} timeout={timeout}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? copiedLabel : copyLabel} openDelay={500}>\n <ActionButton\n color={copied ? \"teal\" : undefined}\n onClick={copy}\n icon={copied ? IconCheck : IconCopy}\n {...buttonProps}\n >\n {children}\n </ActionButton>\n </Tooltip>\n )}\n </CopyButton>\n );\n};\n\nexport default ClipboardButton;\n","import {\n Flex,\n type MantineBreakpoint,\n SegmentedControl,\n type SegmentedControlProps,\n useComputedColorScheme,\n useMantineColorScheme,\n} from \"@mantine/core\";\nimport { IconMoon, IconSun } from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface DarkModeButtonProps {\n mode?: \"minimal\" | \"segmented\";\n size?: MantineBreakpoint;\n variant?:\n | \"filled\"\n | \"light\"\n | \"outline\"\n | \"default\"\n | \"subtle\"\n | \"transparent\";\n\n fullWidth?: boolean;\n\n segmentedProps?: Partial<SegmentedControlProps>;\n actionProps?: Partial<ActionProps>;\n}\n\nconst DarkModeButton = (props: DarkModeButtonProps) => {\n const { setColorScheme } = useMantineColorScheme();\n const computedColorScheme = useComputedColorScheme(\"light\");\n const [colorScheme, setColorScheme2] = useState(\"default\");\n const mode = props.mode ?? \"minimal\";\n\n useEffect(() => {\n setColorScheme2(computedColorScheme);\n }, [computedColorScheme]);\n\n const toggleColorScheme = () => {\n setColorScheme(computedColorScheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n if (mode === \"segmented\") {\n return (\n <SegmentedControl\n value={colorScheme}\n onChange={(value) => setColorScheme(value as \"light\" | \"dark\")}\n data={[\n {\n value: \"light\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconSun size={16} />\n </Flex>\n ),\n },\n {\n value: \"dark\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconMoon size={16} />\n </Flex>\n ),\n },\n ]}\n w={props.fullWidth ? \"100%\" : undefined}\n {...props.segmentedProps}\n />\n );\n }\n\n return (\n <ActionButton\n onClick={toggleColorScheme}\n variant={props.variant ?? \"subtle\"}\n size={props.size ?? \"sm\"}\n aria-label=\"Toggle color scheme\"\n px={\"xs\"}\n fullWidth={props.fullWidth ?? false}\n icon={\n colorScheme === \"dark\"\n ? IconSun\n : colorScheme === \"light\"\n ? IconMoon\n : IconSun\n }\n {...props.actionProps}\n />\n );\n};\n\nexport default DarkModeButton;\n","import { IconLanguage } from \"@tabler/icons-react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface LanguageButtonProps {\n languages?: string[];\n actionProps?: ActionProps;\n}\n\nconst LanguageButton = (props: LanguageButtonProps) => {\n const i18n = useI18n();\n return (\n <ActionButton\n variant={\"default\"}\n icon={IconLanguage}\n menu={{\n items: i18n.languages.map((lang) => ({\n label: i18n.tr(lang),\n onClick: () => i18n.setLang(lang),\n active: i18n.lang === lang,\n })),\n }}\n {...props.actionProps}\n />\n );\n};\n\nexport default LanguageButton;\n","import { Flex, Kbd, Text } from \"@mantine/core\";\nimport { useOs } from \"@mantine/hooks\";\nimport { spotlight } from \"@mantine/spotlight\";\nimport { IconSearch } from \"@tabler/icons-react\";\nimport { ClientOnly } from \"alepha/react\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface OmnibarButtonProps {\n actionProps?: ActionProps;\n collapsed?: boolean;\n}\n\nconst OmnibarButton = (props: OmnibarButtonProps) => {\n const os = useOs();\n const isMac = os === \"macos\" || os === \"ios\";\n const shortcut = isMac ? \"⌘\" : \"Ctrl\";\n\n if (props.collapsed) {\n return (\n <ActionButton\n variant={\"subtle\"}\n onClick={spotlight.open}\n radius={\"md\"}\n icon={<IconSearch size={16} />}\n tooltip={{ label: \"Search\", position: \"right\" }}\n {...props.actionProps}\n />\n );\n }\n\n return (\n <ActionButton\n variant={\"default\"}\n onClick={spotlight.open}\n justify={\"space-between\"}\n rightSection={\n <Kbd visibleFrom={\"sm\"} size={\"sm\"}>\n <ClientOnly>{shortcut}</ClientOnly>+K\n </Kbd>\n }\n radius={\"md\"}\n {...props.actionProps}\n >\n <Flex align={\"center\"} gap={\"xs\"}>\n <IconSearch size={16} color={\"gray\"} />\n <Flex visibleFrom={\"sm\"} miw={192}>\n <Text size={\"xs\"} c={\"dimmed\"}>\n Search...\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n};\n\nexport default OmnibarButton;\n","import { IconPalette } from \"@tabler/icons-react\";\nimport { useStore } from \"alepha/react\";\nimport { alephaThemeListAtom } from \"../../atoms/alephaThemeListAtom.ts\";\nimport { useTheme } from \"../../hooks/useTheme.ts\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\nexport interface ThemeButtonProps {\n actionProps?: Partial<ActionProps>;\n}\n\nconst ThemeButton = (props: ThemeButtonProps) => {\n const [theme, setTheme] = useTheme();\n const themeList = useStore(alephaThemeListAtom)[0];\n\n return (\n <ActionButton\n variant=\"subtle\"\n icon={IconPalette}\n menu={{\n items: themeList.map((it, index) => ({\n label: it.name,\n onClick: () =>\n setTheme({\n index,\n }),\n active: theme.name === it.name,\n })),\n }}\n {...props.actionProps}\n />\n );\n};\n\nexport default ThemeButton;\n","import {\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarRightCollapse,\n} from \"@tabler/icons-react\";\nimport { useStore } from \"alepha/react\";\nimport { alephaSidebarAtom } from \"../../atoms/alephaSidebarAtom.ts\";\nimport ActionButton, { type ActionProps } from \"./ActionButton.tsx\";\n\ntype Props = ActionProps;\n\nconst ToggleSidebarButton = (props: Props) => {\n const [sidebar, setSidebar] = useStore(alephaSidebarAtom);\n\n return (\n <ActionButton\n icon={\n sidebar.collapsed ? (\n <IconLayoutSidebarRightCollapse />\n ) : (\n <IconLayoutSidebarLeftCollapse />\n )\n }\n visibleFrom={\"sm\"}\n variant={\"subtle\"}\n size={\"md\"}\n onClick={() => {\n const expanding = sidebar.collapsed;\n setSidebar({\n ...sidebar,\n collapsed: !sidebar.collapsed,\n // Reset width to defaultWidth when expanding\n width: expanding ? sidebar.defaultWidth : sidebar.width,\n });\n }}\n tooltip={{\n position: \"right\",\n label: sidebar.collapsed ? \"Show sidebar\" : \"Hide sidebar\",\n }}\n {...props}\n />\n );\n};\n\nexport default ToggleSidebarButton;\n","import {\n IconAt,\n IconCalendar,\n IconClock,\n IconColorPicker,\n IconFile,\n IconHash,\n IconKey,\n IconLetterCase,\n IconLink,\n IconList,\n IconMail,\n IconPalette,\n IconPhone,\n IconSelector,\n IconToggleLeft,\n} from \"@tabler/icons-react\";\nimport type { ReactElement } from \"react\";\nimport { ui } from \"../constants/ui.ts\";\n\nexport type IconSize = keyof typeof ui.sizes.icon;\n\n/**\n * Get the default icon for an input based on its type, format, or name.\n */\nexport const getDefaultIcon = (params: {\n type?: string;\n format?: string;\n name?: string;\n isEnum?: boolean;\n isArray?: boolean;\n size?: IconSize;\n}): ReactElement => {\n const { type, format, name, isEnum, isArray, size = \"sm\" } = params;\n const iconSize = ui.sizes.icon[size];\n\n // Format-based icons (highest priority)\n if (format) {\n switch (format) {\n case \"email\":\n return <IconMail size={iconSize} />;\n case \"url\":\n case \"uri\":\n return <IconLink size={iconSize} />;\n case \"tel\":\n case \"phone\":\n return <IconPhone size={iconSize} />;\n case \"date\":\n return <IconCalendar size={iconSize} />;\n case \"date-time\":\n return <IconCalendar size={iconSize} />;\n case \"time\":\n return <IconClock size={iconSize} />;\n case \"color\":\n return <IconColorPicker size={iconSize} />;\n case \"uuid\":\n return <IconKey size={iconSize} />;\n }\n }\n\n // Name-based icons (medium priority)\n if (name) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes(\"password\") || nameLower.includes(\"secret\")) {\n return <IconKey size={iconSize} />;\n }\n if (nameLower.includes(\"email\") || nameLower.includes(\"mail\")) {\n return <IconMail size={iconSize} />;\n }\n if (nameLower.includes(\"url\") || nameLower.includes(\"link\")) {\n return <IconLink size={iconSize} />;\n }\n if (nameLower.includes(\"phone\") || nameLower.includes(\"tel\")) {\n return <IconPhone size={iconSize} />;\n }\n if (nameLower.includes(\"color\")) {\n return <IconPalette size={iconSize} />;\n }\n if (nameLower.includes(\"file\") || nameLower.includes(\"upload\")) {\n return <IconFile size={iconSize} />;\n }\n if (nameLower.includes(\"date\")) {\n return <IconCalendar size={iconSize} />;\n }\n if (nameLower.includes(\"time\")) {\n return <IconClock size={iconSize} />;\n }\n }\n\n // Type-based icons (lowest priority)\n if (isEnum || isArray) {\n return <IconSelector size={iconSize} />;\n }\n\n if (type) {\n switch (type) {\n case \"boolean\":\n return <IconToggleLeft size={iconSize} />;\n case \"number\":\n case \"integer\":\n return <IconHash size={iconSize} />;\n case \"array\":\n return <IconList size={iconSize} />;\n case \"string\":\n return <IconLetterCase size={iconSize} />;\n }\n }\n\n // Default icon\n return <IconAt size={iconSize} />;\n};\n","/**\n * Capitalizes the first letter of a string.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n */\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Converts a path or identifier string into a pretty display name.\n * Removes slashes and capitalizes the first letter.\n *\n * @example\n * prettyName(\"/userName\") // \"UserName\"\n * prettyName(\"email\") // \"Email\"\n */\nexport const prettyName = (name: string): string => {\n return capitalize(name.replaceAll(\"/\", \"\"));\n};\n","import { type TObject, TypeBoxError } from \"alepha\";\nimport type { BaseInputField } from \"alepha/react/form\";\nimport {\n createElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { ControlProps } from \"../components/form/Control.tsx\";\nimport { ui } from \"../constants/ui.ts\";\nimport { getDefaultIcon } from \"./icons.tsx\";\nimport { prettyName } from \"./string.ts\";\n\nexport const parseInput = (\n props: GenericControlProps,\n form: {\n error?: Error;\n },\n): ControlInput => {\n const disabled = false; // form.loading;\n const id = props.input.props.id;\n const label =\n props.title ??\n (\"title\" in props.input.schema &&\n typeof props.input.schema.title === \"string\"\n ? props.input.schema.title\n : undefined) ??\n prettyName(props.input.path);\n const description =\n props.description ??\n (\"description\" in props.input.schema &&\n typeof props.input.schema.description === \"string\"\n ? props.input.schema.description\n : undefined);\n const error =\n form.error && form.error instanceof TypeBoxError\n ? form.error.value.message\n : undefined;\n\n // Auto-generate icon if not provided\n const icon = !props.icon\n ? getDefaultIcon({\n type:\n props.input.schema && \"type\" in props.input.schema\n ? String(props.input.schema.type)\n : undefined,\n format:\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined,\n name: props.input.props.name,\n isEnum:\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Boolean(props.input.schema.enum),\n isArray:\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\",\n })\n : isValidElement(props.icon)\n ? props.icon\n : createElement(props.icon, { size: ui.sizes.icon.md });\n\n const format =\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined;\n\n const required = props.input.required;\n const schema = props.input.schema as TObject & { $control?: ControlProps };\n\n const inputProps: InputProps = {\n label,\n description,\n error,\n required,\n disabled,\n };\n\n if (\"minLength\" in schema && typeof schema.minLength === \"number\") {\n inputProps.minLength = schema.minLength;\n }\n if (\"maxLength\" in schema && typeof schema.maxLength === \"number\") {\n inputProps.maxLength = schema.maxLength;\n }\n if (\"minimum\" in schema && typeof schema.minimum === \"number\") {\n inputProps.minimum = schema.minimum;\n }\n if (\"maximum\" in schema && typeof schema.maximum === \"number\") {\n inputProps.maximum = schema.maximum;\n }\n\n return {\n id,\n icon,\n format,\n schema: props.input.schema as TObject & { $control?: ControlProps },\n inputProps,\n };\n};\n\nexport interface GenericControlProps {\n input: BaseInputField;\n title?: string;\n description?: string;\n icon?: ReactElement | ((props: { size: number }) => ReactNode);\n}\n\nexport interface ControlInput {\n id?: string;\n icon: ReactElement;\n format?: string;\n schema: TObject & { $control?: ControlProps };\n inputProps: InputProps;\n}\n\nexport interface InputProps {\n label: string;\n description?: string;\n error?: string;\n required: boolean;\n disabled: boolean;\n\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n}\n","import {\n ActionIcon,\n Fieldset,\n Flex,\n Grid,\n Stack,\n Text,\n UnstyledButton,\n} from \"@mantine/core\";\nimport { IconGripVertical, IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport type { TObject, TSchema } from \"alepha\";\nimport { useEvents } from \"alepha/react\";\nimport type { BaseInputField } from \"alepha/react/form\";\nimport { useRef, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface ControlArrayProps extends GenericControlProps {\n /**\n * Minimum number of items allowed.\n * @default 0\n */\n min?: number;\n\n /**\n * Maximum number of items allowed.\n * @default Infinity\n */\n max?: number;\n\n /**\n * Label for the add button.\n * @default \"Add item\"\n */\n addLabel?: string;\n\n /**\n * Number of columns for object item fields.\n * @default 1\n */\n columns?: number;\n\n /**\n * Variant for the container.\n * - \"fieldset\": Uses Mantine Fieldset with legend\n * - \"plain\": No container, just renders items\n * @default \"fieldset\"\n */\n variant?: \"fieldset\" | \"plain\";\n\n /**\n * Per-field control props override for object items.\n * Keys are field names from the item schema.\n */\n controlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n\n /**\n * Control props for primitive items.\n */\n itemControlProps?: Partial<Omit<ControlProps, \"input\">>;\n\n /**\n * Show drag handle for reordering.\n * @default false\n */\n sortable?: boolean;\n}\n\n/**\n * ControlArray component for editing arrays of schema items.\n *\n * Features:\n * - Dynamic add/remove of items\n * - Supports arrays of objects with nested fields\n * - Supports arrays of primitives\n * - Grid layout for object items\n * - Min/max constraints\n *\n * @example\n * ```tsx\n * // For a schema like:\n * // t.object({\n * // contacts: t.array(t.object({\n * // name: t.text(),\n * // email: t.text({ format: \"email\" }),\n * // }))\n * // })\n *\n * <ControlArray\n * input={form.input.contacts}\n * columns={2}\n * addLabel=\"Add contact\"\n * controlProps={{\n * email: { text: { placeholder: \"email@example.com\" } }\n * }}\n * />\n * ```\n */\nconst ControlArray = (props: ControlArrayProps) => {\n const { inputProps } = parseInput(props, {});\n const idCounter = useRef(0);\n\n // Initialize items with unique keys for React\n const [items, setItems] = useState<Array<{ key: number; value: any }>>(() => {\n const defaultValue = props.input?.props?.defaultValue;\n if (Array.isArray(defaultValue)) {\n return defaultValue.map((value) => ({\n key: idCounter.current++,\n value,\n }));\n }\n return [];\n });\n\n // Listen for form reset events\n useEvents(\n {\n \"form:reset\": (event) => {\n if (event.id === props.input?.form?.id) {\n const defaultValue = props.input?.props?.defaultValue;\n if (Array.isArray(defaultValue)) {\n idCounter.current = 0;\n setItems(\n defaultValue.map((value) => ({\n key: idCounter.current++,\n value,\n })),\n );\n } else {\n setItems([]);\n }\n }\n },\n },\n [props.input],\n );\n\n if (!props.input?.props) {\n return null;\n }\n\n const schema = props.input.schema;\n if (!schema || !(\"items\" in schema)) {\n return null;\n }\n\n const itemSchema = (schema as any).items as TSchema;\n const isObjectItem = itemSchema && \"properties\" in itemSchema;\n const { min = 0, max = Number.POSITIVE_INFINITY, columns = 1 } = props;\n\n const updateFormValue = (newItems: Array<{ key: number; value: any }>) => {\n props.input.set(newItems.map((item) => item.value));\n };\n\n const handleAdd = () => {\n if (items.length >= max) return;\n\n // Create default value based on item schema\n let newValue: any;\n if (isObjectItem) {\n newValue = {};\n // Initialize with default values from schema if available\n const objSchema = itemSchema as TObject;\n for (const [key, propSchema] of Object.entries(objSchema.properties)) {\n if (\"default\" in propSchema) {\n newValue[key] = propSchema.default;\n }\n }\n } else {\n newValue = \"\";\n }\n\n const newItems = [...items, { key: idCounter.current++, value: newValue }];\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleRemove = (index: number) => {\n if (items.length <= min) return;\n const newItems = items.filter((_, i) => i !== index);\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleItemChange = (index: number, value: any) => {\n const newItems = [...items];\n newItems[index] = { ...newItems[index], value };\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const handleFieldChange = (index: number, field: string, value: any) => {\n const newItems = [...items];\n newItems[index] = {\n ...newItems[index],\n value: { ...newItems[index].value, [field]: value },\n };\n setItems(newItems);\n updateFormValue(newItems);\n };\n\n const colSpan = 12 / columns;\n const fieldNames = isObjectItem\n ? Object.keys((itemSchema as TObject).properties)\n : [];\n\n const renderItems = () => (\n <Stack gap=\"sm\">\n {items.map((item, index) => (\n <Flex\n key={item.key}\n gap=\"sm\"\n align=\"flex-start\"\n p=\"xs\"\n bg={ui.colors.surface}\n style={{ borderRadius: \"var(--mantine-radius-sm)\" }}\n >\n {props.sortable && (\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n style={{ cursor: \"grab\" }}\n >\n <IconGripVertical size={16} />\n </ActionIcon>\n )}\n\n {isObjectItem ? (\n <Grid style={{ flex: 1 }} gutter=\"sm\">\n {fieldNames.map((fieldName) => {\n const fieldSchema = (itemSchema as TObject).properties[\n fieldName\n ];\n const fieldControlProps = props.controlProps?.[fieldName] ?? {};\n\n // Create a virtual InputField for the nested property\n const virtualInput: BaseInputField = {\n schema: fieldSchema,\n props: {\n id: `${props.input.props.id}-${item.key}-${fieldName}`,\n name: `${props.input.props.name}[${index}].${fieldName}`,\n defaultValue: item.value?.[fieldName],\n },\n path: `${props.input.path}/${index}/${fieldName}`,\n required:\n (itemSchema as TObject).required?.includes(fieldName) ??\n false,\n form: props.input.form,\n set: (value: any) =>\n handleFieldChange(index, fieldName, value),\n };\n\n return (\n <Grid.Col key={fieldName} span={colSpan}>\n <Control input={virtualInput} {...fieldControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n ) : (\n <Flex style={{ flex: 1 }}>\n <Control\n input={\n {\n schema: itemSchema,\n props: {\n id: `${props.input.props.id}-${item.key}`,\n name: `${props.input.props.name}[${index}]`,\n defaultValue: item.value,\n },\n path: `${props.input.path}/${index}`,\n required: false,\n form: props.input.form,\n set: (value: any) => handleItemChange(index, value),\n } as BaseInputField\n }\n {...props.itemControlProps}\n />\n </Flex>\n )}\n\n <ActionIcon\n variant=\"subtle\"\n color=\"red\"\n onClick={() => handleRemove(index)}\n disabled={items.length <= min}\n >\n <IconTrash size={16} />\n </ActionIcon>\n </Flex>\n ))}\n\n <UnstyledButton\n onClick={handleAdd}\n disabled={items.length >= max}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n padding: \"8px 12px\",\n borderRadius: \"var(--mantine-radius-sm)\",\n border: \"1px dashed var(--mantine-color-dimmed)\",\n color: \"var(--mantine-color-dimmed)\",\n fontSize: \"var(--mantine-font-size-sm)\",\n cursor: items.length >= max ? \"not-allowed\" : \"pointer\",\n opacity: items.length >= max ? 0.5 : 1,\n transition: \"all 150ms ease\",\n }}\n onMouseEnter={(e) => {\n if (items.length < max) {\n e.currentTarget.style.borderColor =\n \"var(--mantine-color-blue-filled)\";\n e.currentTarget.style.color = \"var(--mantine-color-blue-filled)\";\n e.currentTarget.style.background =\n \"var(--mantine-color-blue-light)\";\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"var(--mantine-color-dimmed)\";\n e.currentTarget.style.color = \"var(--mantine-color-dimmed)\";\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <IconPlus size={14} />\n {props.addLabel ?? \"Add\"}\n </UnstyledButton>\n </Stack>\n );\n\n if (props.variant === \"plain\") {\n return (\n <Stack gap=\"xs\">\n {inputProps.label && (\n <Text size=\"sm\" fw={500}>\n {inputProps.label}\n </Text>\n )}\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderItems()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n );\n }\n\n return (\n <Fieldset legend={inputProps.label}>\n <Stack gap=\"xs\">\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderItems()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n </Fieldset>\n );\n};\n\nexport default ControlArray;\n","import {\n DateInput,\n type DateInputProps,\n DateTimePicker,\n type DateTimePickerProps,\n TimeInput,\n type TimeInputProps,\n} from \"@mantine/dates\";\nimport { useFormState } from \"alepha/react/form\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport interface ControlDateProps extends GenericControlProps {\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n}\n\n/**\n * ControlDate component for handling date, datetime, and time inputs.\n *\n * Features:\n * - DateInput for date format\n * - DateTimePicker for date-time format\n * - TimeInput for time format\n *\n * Automatically detects date formats from schema and renders appropriate picker.\n */\nconst ControlDate = (props: ControlDateProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon, format } = parseInput(props, form);\n if (!props.input?.props) {\n return null;\n }\n\n // region <DateTimePicker/>\n if (props.datetime || format === \"date-time\") {\n const dateTimePickerProps =\n typeof props.datetime === \"object\" ? props.datetime : {};\n return (\n <DateTimePicker\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(value ? new Date(value).toISOString() : undefined);\n }}\n {...dateTimePickerProps}\n />\n );\n }\n //endregion\n\n // region <DateInput/>\n if (props.date || format === \"date\") {\n const dateInputProps = typeof props.date === \"object\" ? props.date : {};\n return (\n <DateInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(\n value ? new Date(value).toISOString().slice(0, 10) : undefined,\n );\n }}\n {...dateInputProps}\n />\n );\n }\n //endregion\n\n // region <TimeInput/>\n if (props.time || format === \"time\") {\n const timeInputProps = typeof props.time === \"object\" ? props.time : {};\n return (\n <TimeInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={props.input.props.defaultValue}\n onChange={(event) => {\n props.input.set(event.currentTarget.value);\n }}\n {...timeInputProps}\n />\n );\n }\n //endregion\n\n // Fallback - shouldn't happen\n return null;\n};\n\nexport default ControlDate;\n","import {\n Input,\n NumberInput,\n type NumberInputProps,\n Slider,\n type SliderProps,\n} from \"@mantine/core\";\nimport { useEvents } from \"alepha/react\";\nimport { useFormState } from \"alepha/react/form\";\nimport { useRef, useState } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport interface ControlNumberProps extends GenericControlProps {\n numberInputProps?: Partial<NumberInputProps>;\n sliderProps?: Partial<SliderProps>;\n}\n\n/**\n *\n */\nconst ControlNumber = (props: ControlNumberProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon } = parseInput(props, form);\n const ref = useRef<HTMLInputElement | null>(null);\n\n // HTML Reset doesn't trigger on <NumberInput /> so we handle it manually\n\n const [value, setValue] = useState<number | undefined>(\n props.input.props.defaultValue,\n );\n\n useEvents(\n {\n \"form:reset\": (event) => {\n if (event.id === props.input?.form.id && ref.current) {\n setValue(props.input.props.defaultValue);\n }\n },\n },\n [props.input],\n );\n\n if (!props.input?.props) {\n return null;\n }\n\n const { type, ...inputPropsWithoutType } = props.input.props;\n\n if (props.sliderProps) {\n const min = props.sliderProps.min ?? inputProps.minimum ?? 0;\n const max = props.sliderProps.max ?? inputProps.maximum ?? 100;\n return (\n <Input.Wrapper {...inputProps}>\n <div\n style={{\n height: 32,\n padding: 8,\n }}\n >\n <Slider\n {...inputProps}\n ref={ref}\n id={id}\n {...inputPropsWithoutType}\n {...props.sliderProps}\n value={value}\n min={min}\n max={max}\n label={() => value}\n onChange={(val) => {\n setValue(val);\n props.input.set(val);\n }}\n />\n </div>\n </Input.Wrapper>\n );\n }\n\n return (\n <NumberInput\n {...inputProps}\n ref={ref}\n id={id}\n leftSection={icon}\n {...inputPropsWithoutType}\n {...props.numberInputProps}\n value={value ?? \"\"}\n onChange={(val) => {\n const newValue = val !== null ? Number(val) : undefined;\n setValue(newValue);\n props.input.set(newValue);\n }}\n />\n );\n};\n\nexport default ControlNumber;\n","import { Fieldset, Grid, Stack, Text } from \"@mantine/core\";\nimport type { TObject } from \"alepha\";\nimport type { BaseInputField, ObjectInputField } from \"alepha/react/form\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface ControlObjectProps extends GenericControlProps {\n /**\n * Number of columns for the grid layout.\n * @default 1\n */\n columns?: number;\n\n /**\n * Variant for the container.\n * - \"fieldset\": Uses Mantine Fieldset with legend\n * - \"plain\": No container, just renders fields\n * @default \"fieldset\"\n */\n variant?: \"fieldset\" | \"plain\";\n\n /**\n * Per-field control props override.\n * Keys are field names from the schema.\n */\n controlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n}\n\n/**\n * ControlObject component for editing nested object schemas.\n *\n * Features:\n * - Renders all properties of an object schema\n * - Supports grid layout with configurable columns\n * - Per-field customization via controlProps\n * - Recursive support for deeply nested objects\n *\n * The form system provides nested InputFields under the `.items` property.\n * For example: form.input.address.items.street\n *\n * @example\n * ```tsx\n * // For a schema like:\n * // t.object({\n * // address: t.object({\n * // street: t.text(),\n * // city: t.text(),\n * // zip: t.text(),\n * // })\n * // })\n *\n * <ControlObject\n * input={form.input.address}\n * columns={2}\n * controlProps={{\n * zip: { text: { maxLength: 10 } }\n * }}\n * />\n * ```\n */\nconst ControlObject = (props: ControlObjectProps) => {\n const { inputProps } = parseInput(props, {});\n\n if (!props.input?.props) {\n return null;\n }\n\n const schema = props.input.schema as TObject;\n if (!schema?.properties) {\n return null;\n }\n\n const fieldNames = Object.keys(schema.properties);\n const columns = props.columns ?? 1;\n const colSpan = 12 / columns;\n\n // The form system provides nested InputFields under .items\n const objectInput = props.input as ObjectInputField<TObject>;\n const nestedItems = objectInput.items as Record<string, BaseInputField>;\n\n const renderFields = () => (\n <Grid>\n {fieldNames.map((fieldName) => {\n const fieldControlProps = props.controlProps?.[fieldName] ?? {};\n\n // Access nested InputField from .items\n const field = nestedItems?.[fieldName];\n if (!field) {\n return null;\n }\n\n return (\n <Grid.Col key={fieldName} span={colSpan}>\n <Control input={field} {...fieldControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n );\n\n if (props.variant === \"plain\") {\n return renderFields();\n }\n\n return (\n <Fieldset legend={inputProps.label}>\n <Stack gap=\"xs\">\n {inputProps.description && (\n <Text size=\"sm\" c=\"dimmed\">\n {inputProps.description}\n </Text>\n )}\n {renderFields()}\n {inputProps.error && (\n <Text size=\"sm\" c=\"red\">\n {inputProps.error}\n </Text>\n )}\n </Stack>\n </Fieldset>\n );\n};\n\nexport default ControlObject;\n","import type { TObject, TProperties, TSchema } from \"alepha\";\n\nexport interface SchemaField {\n name: string;\n path: string;\n type: string;\n enum?: readonly any[];\n format?: string;\n description?: string;\n nested?: SchemaField[];\n}\n\n/**\n * Extract field information from a TypeBox schema for query building.\n * Supports nested objects and provides field metadata for autocomplete.\n */\nexport function extractSchemaFields(\n schema: TObject | TProperties,\n prefix = \"\",\n): SchemaField[] {\n const fields: SchemaField[] = [];\n\n // Safety check\n if (!schema || typeof schema !== \"object\") {\n return fields;\n }\n\n // Handle TObject wrapper\n const properties =\n \"properties\" in schema ? schema.properties : (schema as TProperties);\n\n // Safety check for properties\n if (!properties || typeof properties !== \"object\") {\n return fields;\n }\n\n for (const [key, value] of Object.entries(properties)) {\n // Skip if value is not an object (type guard)\n if (typeof value !== \"object\" || value === null) {\n continue;\n }\n\n const fieldSchema = value as TSchema & {\n format?: string;\n enum?: readonly any[];\n description?: string;\n };\n\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Determine the display type - use format for datetime-related fields\n const format = \"format\" in fieldSchema ? fieldSchema.format : undefined;\n const baseType =\n \"type\" in fieldSchema ? (fieldSchema.type as string) : \"object\";\n\n let displayType = baseType;\n if (format === \"date-time\") {\n displayType = \"datetime\";\n } else if (format === \"date\") {\n displayType = \"date\";\n } else if (format === \"time\") {\n displayType = \"time\";\n } else if (format === \"duration\") {\n displayType = \"duration\";\n }\n\n const field: SchemaField = {\n name: key,\n path,\n type: displayType,\n format,\n description:\n \"description\" in fieldSchema ? fieldSchema.description : undefined,\n };\n\n // Handle enum\n if (\"enum\" in fieldSchema && fieldSchema.enum) {\n field.enum = fieldSchema.enum;\n field.type = \"enum\";\n }\n\n // Handle nested objects\n if (\n \"type\" in fieldSchema &&\n fieldSchema.type === \"object\" &&\n \"properties\" in fieldSchema &&\n typeof fieldSchema.properties === \"object\"\n ) {\n field.nested = extractSchemaFields(\n fieldSchema.properties as TProperties,\n path,\n );\n }\n\n fields.push(field);\n\n // Also add nested fields to the flat list for autocomplete\n if (field.nested) {\n fields.push(...field.nested);\n }\n }\n\n return fields;\n}\n\n/**\n * Get suggested operators based on field type\n */\nexport function getOperatorsForField(field: SchemaField): string[] {\n const allOperators = [\"=\", \"!=\"];\n\n if (field.enum) {\n // Enum fields: equality and IN array\n return [...allOperators, \"in\"];\n }\n\n switch (field.type) {\n case \"string\":\n case \"text\":\n // String fields: equality and null checks (wildcards supported in = operator)\n return [...allOperators, \"null\"];\n\n case \"number\":\n case \"integer\":\n // Numeric fields: all comparison operators\n return [...allOperators, \">\", \">=\", \"<\", \"<=\"];\n\n case \"boolean\":\n // Boolean fields: only equality\n return allOperators;\n\n case \"datetime\":\n case \"date\":\n // Date fields: all comparison operators\n return [...allOperators, \">\", \">=\", \"<\", \"<=\"];\n\n default:\n return [...allOperators, \"null\"];\n }\n}\n\n/**\n * Get operator symbol and description\n */\nexport const OPERATOR_INFO: Record<\n string,\n { symbol: string; label: string; example: string }\n> = {\n eq: { symbol: \"=\", label: \"equals\", example: \"name=John\" },\n ne: { symbol: \"!=\", label: \"not equals\", example: \"status!=archived\" },\n gt: { symbol: \">\", label: \"greater than\", example: \"age>18\" },\n gte: { symbol: \">=\", label: \"greater or equal\", example: \"age>=18\" },\n lt: { symbol: \"<\", label: \"less than\", example: \"age<65\" },\n lte: { symbol: \"<=\", label: \"less or equal\", example: \"age<=65\" },\n null: { symbol: \"=null\", label: \"is null\", example: \"deletedAt=null\" },\n notNull: {\n symbol: \"!=null\",\n label: \"is not null\",\n example: \"email!=null\",\n },\n in: {\n symbol: \"[...]\",\n label: \"in array\",\n example: \"status=[active,pending]\",\n },\n};\n","import {\n ActionIcon,\n Badge,\n Divider,\n Flex,\n Group,\n Popover,\n Stack,\n Text,\n TextInput,\n type TextInputProps,\n} from \"@mantine/core\";\nimport { IconFilter, IconInfoTriangle, IconX } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { parseQueryString } from \"alepha/orm\";\nimport { useEvents } from \"alepha/react\";\nimport { useRef, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport {\n extractSchemaFields,\n OPERATOR_INFO,\n type SchemaField,\n} from \"../../utils/extractSchemaFields.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\n\nexport interface ControlQueryBuilderProps\n extends Omit<TextInputProps, \"value\" | \"onChange\"> {\n schema?: TObject;\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n}\n\n/**\n * Query builder with text input and help popover.\n * Generates query strings for parseQueryString syntax.\n */\nconst ControlQueryBuilder = ({\n schema,\n value = \"\",\n onChange,\n placeholder = \"Enter query or click for assistance...\",\n ...textInputProps\n}: ControlQueryBuilderProps) => {\n const [helpOpened, setHelpOpened] = useState(false);\n const [textValue, setTextValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const fields = schema ? extractSchemaFields(schema) : [];\n const [error, setError] = useState<string | null>(null);\n\n const isValid = (value: string) => {\n try {\n parseQueryString(value.trim());\n } catch (e) {\n setError((e as Error).message);\n return false;\n }\n setError(null);\n return true;\n };\n\n const handleTextChange = (newValue: string) => {\n setTextValue(newValue);\n if (isValid(newValue)) {\n onChange?.(newValue);\n }\n };\n\n const handleClear = () => {\n setTextValue(\"\");\n onChange?.(\"\");\n isValid(\"\");\n };\n\n const handleInsert = (text: string) => {\n const newValue = textValue ? `${textValue}${text} ` : `${text} `;\n setTextValue(newValue);\n if (isValid(newValue)) {\n onChange?.(newValue);\n }\n // Refocus the input after inserting\n setTimeout(() => {\n inputRef.current?.focus();\n // set cursor to end\n const length = inputRef.current?.value.length || 0;\n inputRef.current?.setSelectionRange(length, length);\n }, 0);\n };\n\n useEvents(\n {\n \"form:change\": (event) => {\n if (event.id === inputRef.current?.form?.id) {\n if (event.path === (textInputProps as any)[\"data-path\"]) {\n setTextValue(event.value ?? \"\");\n }\n }\n },\n },\n [],\n );\n\n return (\n <Popover\n width={800}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={helpOpened}\n onChange={setHelpOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <TextInput\n ref={inputRef}\n placeholder={placeholder}\n value={textValue}\n onChange={(e) => handleTextChange(e.currentTarget.value)}\n onFocus={() => setHelpOpened(true)}\n leftSection={\n error ? <IconInfoTriangle size={16} /> : <IconFilter size={16} />\n }\n rightSection={\n textValue && (\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n onClick={handleClear}\n >\n <IconX size={14} />\n </ActionIcon>\n )\n }\n {...textInputProps}\n />\n </Popover.Target>\n <Popover.Dropdown\n bg={\"transparent\"}\n p={\"xs\"}\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <QueryHelp fields={fields} onInsert={handleInsert} />\n </Popover.Dropdown>\n </Popover>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Query Help Component\n// ---------------------------------------------------------------------------------------------------------------------\n\ninterface QueryHelpProps {\n fields: SchemaField[];\n onInsert: (text: string) => void;\n}\n\nfunction QueryHelp({ fields, onInsert }: QueryHelpProps) {\n return (\n <Group\n gap=\"md\"\n align=\"flex-start\"\n wrap=\"nowrap\"\n bg={ui.colors.surface}\n p={\"sm\"}\n bdrs={\"sm\"}\n >\n {/* Left Column: Operators */}\n <Stack gap=\"md\" style={{ flex: 1 }}>\n {/* Available Operators */}\n <Stack gap=\"xs\">\n <Text size=\"sm\" fw={600}>\n Operators\n </Text>\n <Stack gap={4}>\n {Object.entries(OPERATOR_INFO).map(([key, info]) => (\n <Group key={key} gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(info.symbol)}\n >\n {info.symbol}\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\" style={{ flex: 1 }}>\n {info.label}\n </Text>\n </Group>\n ))}\n </Stack>\n </Stack>\n\n <Divider />\n\n {/* Logic Operators */}\n <Stack gap=\"xs\">\n <Text size=\"sm\" fw={600}>\n Logic\n </Text>\n <Stack gap={4}>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(\"&\")}\n >\n &\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\">\n AND\n </Text>\n </Group>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"center\"}\n miw={48}\n onClick={() => onInsert(\"|\")}\n >\n |\n </ActionButton>\n <Text size=\"xs\" c=\"dimmed\">\n OR\n </Text>\n </Group>\n </Stack>\n </Stack>\n </Stack>\n\n {/* Divider */}\n {fields.length > 0 && <Divider orientation=\"vertical\" />}\n\n {/* Right Column: Fields */}\n {fields.length > 0 && (\n <Flex direction={\"column\"} gap=\"xs\" style={{ flex: 2 }}>\n <Text size=\"sm\" fw={600}>\n Fields\n </Text>\n <Flex\n direction={\"column\"}\n gap={4}\n style={{ maxHeight: 300, overflowY: \"auto\" }}\n >\n {fields.map((field) => (\n <Flex key={field.path} gap=\"xs\" wrap=\"nowrap\" align=\"flex-start\">\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n variant={\"default\"}\n justify={\"end\"}\n miw={120}\n onClick={() => onInsert(field.path)}\n >\n {field.path}\n </ActionButton>\n <Flex\n mt={3}\n direction={\"column\"}\n gap={2}\n style={{ flex: 1, minWidth: 0 }}\n >\n <Text size=\"xs\" c=\"dimmed\" lineClamp={1}>\n {field.description || field.type}\n </Text>\n {field.enum && (\n <Group gap={0} wrap=\"wrap\">\n {field.enum.map((enumValue) => (\n <ActionButton\n px={\"xs\"}\n size={\"xs\"}\n h={24}\n key={enumValue}\n onClick={() => onInsert(enumValue)}\n >\n {enumValue}\n </ActionButton>\n ))}\n </Group>\n )}\n </Flex>\n <Badge size=\"xs\" variant=\"light\" style={{ flexShrink: 0 }}>\n {field.type}\n </Badge>\n </Flex>\n ))}\n </Flex>\n </Flex>\n )}\n </Group>\n );\n}\n\nexport default ControlQueryBuilder;\n","import {\n Autocomplete,\n type AutocompleteProps,\n Flex,\n Input,\n MultiSelect,\n type MultiSelectProps,\n SegmentedControl,\n type SegmentedControlProps,\n Select,\n type SelectProps,\n TagsInput,\n type TagsInputProps,\n} from \"@mantine/core\";\nimport { useFormState } from \"alepha/react/form\";\nimport { useEffect, useState } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\n\nexport type SelectValueLabel =\n | string\n | { value: string; label: string; icon?: string };\n\nexport interface ControlSelectProps extends GenericControlProps {\n select?: boolean | SelectProps;\n multi?: boolean | MultiSelectProps;\n tags?: boolean | TagsInputProps;\n autocomplete?: boolean | AutocompleteProps;\n segmented?: boolean | Partial<SegmentedControlProps>;\n\n loader?: () => Promise<SelectValueLabel[]>;\n}\n\n/**\n * ControlSelect component for handling Select, MultiSelect, and TagsInput.\n *\n * Features:\n * - Basic Select with enum support\n * - MultiSelect for array of enums\n * - TagsInput for array of strings (no enum)\n * - Future: Lazy loading\n * - Future: Searchable/filterable options\n * - Future: Custom option rendering\n *\n * Automatically detects enum values and array types from schema.\n */\nconst ControlSelect = (props: ControlSelectProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon } = parseInput(props, form);\n\n // Detect if schema is an array type\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n // For arrays, check if items have enum (MultiSelect) or not (TagsInput)\n let itemsEnum: string[] | undefined;\n if (isArray && \"items\" in props.input.schema && props.input.schema.items) {\n const items: any = props.input.schema.items;\n if (\"enum\" in items && Array.isArray(items.enum)) {\n itemsEnum = items.enum;\n }\n }\n\n // Extract enum values from schema (for non-array select)\n const enumValues =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Array.isArray(props.input.schema.enum)\n ? props.input.schema.enum\n : [];\n\n const [data, setData] = useState<SelectValueLabel[]>([]);\n\n useEffect(() => {\n if (!props.input?.props) {\n return;\n }\n\n if (props.loader) {\n props.loader().then(setData);\n } else {\n setData(enumValues);\n }\n }, [props.input, props.loader]);\n\n if (!props.input?.props) {\n return null;\n }\n\n if (props.segmented) {\n const segmentedControlProps: Partial<SegmentedControlProps> =\n typeof props.segmented === \"object\" ? props.segmented : {};\n\n return (\n <Input.Wrapper {...inputProps}>\n <Flex>\n <SegmentedControl\n disabled={inputProps.disabled}\n defaultValue={String(props.input.props.defaultValue)}\n {...segmentedControlProps}\n onChange={(value) => {\n props.input.set(value);\n }}\n data={data.slice(0, 10)}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n\n if (props.autocomplete) {\n const autocompleteProps =\n typeof props.autocomplete === \"object\" ? props.autocomplete : {};\n\n return (\n <Autocomplete\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...autocompleteProps}\n />\n );\n }\n\n // region <TagsInput/> - for array of strings without enum\n if ((isArray && !itemsEnum) || props.tags) {\n const tagsInputProps = typeof props.tags === \"object\" ? props.tags : {};\n return (\n <TagsInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...tagsInputProps}\n />\n );\n }\n // endregion\n\n // region <MultiSelect/> - for array of enums\n if ((isArray && itemsEnum) || props.multi) {\n const data =\n itemsEnum?.map((value: string) => ({\n value,\n label: value,\n })) || [];\n\n const multiSelectProps = typeof props.multi === \"object\" ? props.multi : {};\n\n return (\n <MultiSelect\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...multiSelectProps}\n />\n );\n }\n // endregion\n\n // region <Select/> - for single enum value\n const selectProps = typeof props.select === \"object\" ? props.select : {};\n\n return (\n <Select\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...selectProps}\n />\n );\n // endregion\n};\n\nexport default ControlSelect;\n","import {\n ColorInput,\n type ColorInputProps,\n FileInput,\n type FileInputProps,\n Flex,\n Input,\n PasswordInput,\n type PasswordInputProps,\n Switch,\n type SwitchProps,\n Textarea,\n type TextareaProps,\n TextInput,\n type TextInputProps,\n} from \"@mantine/core\";\nimport type {\n DateInputProps,\n DateTimePickerProps,\n TimeInputProps,\n} from \"@mantine/dates\";\nimport { useFormState } from \"alepha/react/form\";\nimport type { ComponentType } from \"react\";\nimport {\n type GenericControlProps,\n parseInput,\n} from \"../../utils/parseInput.ts\";\nimport ControlArray, { type ControlArrayProps } from \"./ControlArray.tsx\";\nimport ControlDate from \"./ControlDate.tsx\";\nimport ControlNumber, { type ControlNumberProps } from \"./ControlNumber.tsx\";\nimport ControlObject, { type ControlObjectProps } from \"./ControlObject.tsx\";\nimport ControlQueryBuilder from \"./ControlQueryBuilder.tsx\";\nimport ControlSelect, { type ControlSelectProps } from \"./ControlSelect.tsx\";\n\nexport interface ControlProps extends GenericControlProps {\n text?: TextInputProps;\n area?: boolean | TextareaProps;\n select?: boolean | Partial<ControlSelectProps>;\n password?: boolean | PasswordInputProps;\n switch?: boolean | SwitchProps;\n number?: boolean | Partial<ControlNumberProps>;\n file?: boolean | FileInputProps;\n color?: boolean | ColorInputProps;\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n query?: any; // Enable query builder mode with schema-aware autocomplete\n object?: boolean | Partial<Omit<ControlObjectProps, \"input\">>; // Nested object editing\n array?: boolean | Partial<Omit<ControlArrayProps, \"input\">>; // Array of items editing\n custom?: ComponentType<CustomControlProps>;\n\n slider?: boolean;\n segmented?: boolean;\n}\n\n/**\n * Generic form control that renders the appropriate input based on the schema and props.\n *\n * Supports:\n * - TextInput (with format detection: email, url, tel)\n * - Textarea\n * - NumberInput (for number/integer types)\n * - FileInput\n * - ColorInput (for color format)\n * - Select (for enum types)\n * - Autocomplete\n * - PasswordInput\n * - Switch (for boolean types)\n * - SegmentedControl (for enum types)\n * - DateInput (for date format)\n * - DateTimePicker (for date-time format)\n * - TimeInput (for time format)\n * - QueryBuilder (for building type-safe queries with autocomplete)\n * - ControlObject (for nested object schemas)\n * - ControlArray (for arrays of objects)\n * - Custom component\n *\n * Automatically handles labels, descriptions, error messages, required state, and default icons.\n */\nconst Control = (_props: ControlProps) => {\n const form = useFormState(_props.input, [\"error\"]);\n\n // Early return if input is not properly initialized\n if (!_props.input?.props) {\n return null;\n }\n\n const { inputProps, id, icon, format, schema } = parseInput(_props, form);\n\n const props = {\n ..._props,\n ...schema.$control,\n };\n\n //region <QueryBuilder/>\n if (props.query) {\n return (\n <ControlQueryBuilder\n {...props.input.props}\n {...inputProps}\n schema={props.query}\n value={props.input.props.value}\n onChange={(value) => {\n props.input.set(value);\n }}\n />\n );\n }\n //endregion\n\n //region <Custom/>\n if (props.custom) {\n const Custom = props.custom;\n return (\n <Input.Wrapper {...inputProps}>\n <Flex flex={1} mt={\"calc(var(--mantine-spacing-xs) / 2)\"}>\n <Custom\n defaultValue={props.input.props.defaultValue}\n onChange={(value) => {\n props.input.set(value);\n }}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n //endregion\n\n //region <ControlObject/>\n // Handle nested objects with properties\n const isObject =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"object\" &&\n \"properties\" in props.input.schema;\n\n if (props.object || isObject) {\n const controlObjectProps =\n typeof props.object === \"object\" ? props.object : {};\n return (\n <ControlObject\n input={props.input}\n title={props.title}\n description={props.description}\n {...controlObjectProps}\n />\n );\n }\n //endregion\n\n //region <ControlArray/>\n // Handle arrays of objects (arrays of primitives are handled by ControlSelect)\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n const isArrayOfObjects =\n isArray &&\n \"items\" in props.input.schema &&\n props.input.schema.items &&\n typeof props.input.schema.items === \"object\" &&\n \"properties\" in props.input.schema.items;\n\n if (props.array || isArrayOfObjects) {\n const controlArrayProps =\n typeof props.array === \"object\" ? props.array : {};\n return (\n <ControlArray\n input={props.input}\n title={props.title}\n description={props.description}\n {...controlArrayProps}\n />\n );\n }\n //endregion\n\n //region <NumberInput/>\n if (\n props.number ||\n (props.input.schema &&\n \"type\" in props.input.schema &&\n (props.input.schema.type === \"number\" ||\n props.input.schema.type === \"integer\"))\n ) {\n const controlNumberProps =\n typeof props.number === \"object\" ? props.number : {};\n if (props.slider) {\n controlNumberProps.sliderProps ??= {};\n }\n return (\n <ControlNumber\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...controlNumberProps}\n />\n );\n }\n //endregion\n\n //region <FileInput/>\n if (props.file) {\n const fileInputProps = typeof props.file === \"object\" ? props.file : {};\n return (\n <FileInput\n {...inputProps}\n id={id}\n leftSection={icon}\n onChange={(file) => {\n props.input.set(file);\n }}\n {...fileInputProps}\n />\n );\n }\n //endregion\n\n //region <ColorInput/>\n if (props.color || format === \"color\") {\n const colorInputProps = typeof props.color === \"object\" ? props.color : {};\n return (\n <ColorInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...colorInputProps}\n />\n );\n }\n //endregion\n\n //region <ControlSelect/>\n // Handle: single enum, array of enum, array of strings, or explicit select/multi/tags props\n // Note: arrays of objects are handled by ControlArray above, this handles primitive arrays\n const isEnum =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n props.input.schema.enum;\n\n if (isEnum || (isArray && !isArrayOfObjects) || props.select) {\n const opts = typeof props.select === \"object\" ? props.select : {};\n if (props.segmented) {\n opts.segmented ??= {};\n }\n return (\n <ControlSelect\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...opts}\n />\n );\n }\n //endregion\n\n //region <Switch/>\n if (\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"boolean\"\n ) {\n if (props.switch) {\n const switchProps = typeof props.switch === \"object\" ? props.switch : {};\n\n return (\n <Switch\n {...inputProps}\n id={id}\n color={\"blue\"}\n defaultChecked={props.input.props.defaultValue}\n onChange={(event) => {\n props.input.set(event.currentTarget.checked);\n }}\n {...switchProps}\n />\n );\n }\n\n // by default, render as <Select/> with Yes/No/Empty options\n const selectProps: Partial<ControlSelectProps> = {\n loader: async () => [\n { value: \"true\", label: \"Yes\" },\n { value: \"false\", label: \"No\" },\n { value: \"\", label: \"\" },\n ],\n ...props.input.props,\n };\n\n return (\n <ControlSelect\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...selectProps}\n />\n );\n }\n //endregion\n\n //region <PasswordInput/>\n if (props.password || props.input.props.name?.includes(\"password\")) {\n const passwordInputProps =\n typeof props.password === \"object\" ? props.password : {};\n return (\n <PasswordInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...passwordInputProps}\n />\n );\n }\n //endregion\n\n //region <Textarea/>\n if (props.area) {\n const textAreaProps = typeof props.area === \"object\" ? props.area : {};\n return (\n <Textarea\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...textAreaProps}\n />\n );\n }\n //endregion\n\n //region <ControlDate/>\n // Handle: date, date-time, and time formats\n if (\n props.date ||\n props.datetime ||\n props.time ||\n format === \"date\" ||\n format === \"date-time\" ||\n format === \"time\"\n ) {\n return (\n <ControlDate\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n date={props.date}\n datetime={props.datetime}\n time={props.time}\n />\n );\n }\n //endregion\n\n //region <TextInput/> with format detection\n const textInputProps = typeof props.text === \"object\" ? props.text : {};\n\n // Detect HTML5 input type from format\n const getInputType = (): string | undefined => {\n switch (format) {\n case \"email\":\n return \"email\";\n case \"url\":\n case \"uri\":\n return \"url\";\n case \"tel\":\n case \"phone\":\n return \"tel\";\n default:\n return undefined;\n }\n };\n\n return (\n <TextInput\n {...inputProps}\n id={id}\n leftSection={icon}\n type={getInputType()}\n {...props.input.props}\n {...textInputProps}\n inputWrapperOrder={[\"label\", \"input\", \"description\", \"error\"]}\n />\n );\n //endregion\n};\n\nexport default Control;\n\nexport type CustomControlProps = {\n defaultValue: any;\n onChange: (value: any) => void;\n};\n","import { Card, Flex, type FlexProps, Grid } from \"@mantine/core\";\nimport type { TObject } from \"alepha\";\nimport type { FormModel } from \"alepha/react/form\";\nimport type { ReactNode } from \"react\";\nimport ActionButton, {\n type ActionSubmitButtonProps,\n} from \"../buttons/ActionButton.tsx\";\nimport Control, { type ControlProps } from \"./Control.tsx\";\n\nexport interface TypeFormProps<T extends TObject> {\n form: FormModel<T>;\n columns?:\n | number\n | {\n base?: number;\n xs?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n };\n schema?: TObject;\n children?: (input: FormModel<T>[\"input\"]) => ReactNode;\n\n /**\n * Control props applied to all fields.\n */\n controlProps?: Partial<Omit<ControlProps, \"input\">>;\n\n /**\n * Per-field control props override.\n * Keys are field names from the schema.\n */\n fieldControlProps?: Record<string, Partial<Omit<ControlProps, \"input\">>>;\n skipFormElement?: boolean;\n skipSubmitButton?: boolean;\n submitButtonProps?: Partial<Omit<ActionSubmitButtonProps, \"form\">>;\n resetButtonProps?: Partial<Omit<ActionSubmitButtonProps, \"form\">>;\n\n fill?: boolean;\n flexProps?: FlexProps;\n}\n\n/**\n * TypeForm component that automatically renders all form inputs based on schema.\n * Uses the Control component to render individual fields and Mantine Grid for responsive layout.\n *\n * Supports all field types including:\n * - Primitive types (string, number, boolean, etc.)\n * - Enum types (rendered as Select)\n * - Arrays of primitives (rendered as MultiSelect/TagsInput)\n * - Arrays of objects (rendered as ControlArray)\n * - Nested objects (rendered as ControlObject)\n *\n * @example\n * ```tsx\n * import { t } from \"alepha\";\n * import { useForm } from \"alepha/react/form\";\n * import { TypeForm } from \"@alepha/ui\";\n *\n * const form = useForm({\n * schema: t.object({\n * username: t.text(),\n * email: t.text(),\n * age: t.integer(),\n * subscribe: t.boolean(),\n * address: t.object({\n * street: t.text(),\n * city: t.text(),\n * }),\n * tags: t.array(t.text()),\n * contacts: t.array(t.object({\n * name: t.text(),\n * email: t.text(),\n * })),\n * }),\n * handler: (values) => {\n * console.log(values);\n * },\n * });\n *\n * return <TypeForm form={form} columns={2} />;\n * ```\n */\nconst TypeForm = <T extends TObject>(props: TypeFormProps<T>) => {\n const {\n form,\n columns = 3,\n children,\n controlProps,\n fieldControlProps,\n skipFormElement = false,\n skipSubmitButton = false,\n submitButtonProps,\n fill = true,\n } = props;\n\n const schema = props.schema || form.options.schema;\n if (!schema?.properties) {\n return null;\n }\n\n const fieldNames = Object.keys(schema.properties);\n\n // Filter to only include valid InputFields\n // All types are now supported: primitives, enums, arrays, objects\n const supportedFields = fieldNames;\n\n // Handle column configuration with defaults: xs=1, sm=2, lg=3\n const colSpan =\n typeof columns === \"number\"\n ? {\n xs: 12,\n sm: 6,\n lg: 12 / columns,\n }\n : {\n base: columns.base ? 12 / columns.base : undefined,\n xs: columns.xs ? 12 / columns.xs : 12,\n sm: columns.sm ? 12 / columns.sm : 6,\n md: columns.md ? 12 / columns.md : undefined,\n lg: columns.lg ? 12 / columns.lg : 4,\n xl: columns.xl ? 12 / columns.xl : undefined,\n };\n\n const renderFields = () => {\n if (children) {\n return <>{children(form.input)}</>;\n }\n\n return (\n <Grid>\n {supportedFields.map((fieldName) => {\n const field = form.input[fieldName as keyof typeof form.input];\n const fieldSchema: any = schema.properties[fieldName];\n\n // Type guard to ensure field has the expected structure\n if (!field || !fieldSchema) {\n return null;\n }\n\n // Determine if this is a complex type (object or array of objects)\n // that should span full width\n const isObject =\n fieldSchema &&\n \"type\" in fieldSchema &&\n fieldSchema.type === \"object\";\n\n const isArrayOfObjects =\n fieldSchema &&\n \"type\" in fieldSchema &&\n fieldSchema.type === \"array\" &&\n \"items\" in fieldSchema &&\n fieldSchema.items &&\n \"properties\" in fieldSchema.items;\n\n // Complex types span full width, primitives use grid columns\n const span = isObject || isArrayOfObjects ? 12 : colSpan;\n\n // Merge control props: base controlProps + field-specific overrides\n const mergedControlProps = {\n ...controlProps,\n ...fieldControlProps?.[fieldName],\n };\n\n return (\n <Grid.Col key={fieldName} span={span}>\n <Control input={field} {...mergedControlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n );\n };\n\n const content = (\n <Flex\n direction={\"column\"}\n gap={\"sm\"}\n flex={fill ? 1 : undefined}\n {...props.flexProps}\n >\n <Flex direction={\"column\"} gap={\"sm\"} flex={1}>\n {renderFields()}\n </Flex>\n {!skipSubmitButton && (\n <Card w={\"100%\"} withBorder>\n <Flex gap={\"sm\"} flex={1}>\n <Flex></Flex>\n <Flex flex={1}></Flex>\n <Flex gap={\"sm\"}>\n <ActionButton variant={\"subtle\"} type={\"reset\"}>\n Reset\n </ActionButton>\n <ActionButton\n intent={\"primary\"}\n form={form}\n {...submitButtonProps}\n >\n {submitButtonProps?.children ?? \"Submit\"}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n )}\n </Flex>\n );\n\n if (skipFormElement) {\n return content;\n }\n\n return (\n <Flex\n component={\"form\"}\n flex={fill ? 1 : undefined}\n {...form.props}\n {...props.flexProps}\n >\n {content}\n </Flex>\n );\n};\n\nexport default TypeForm;\n","import { Divider, Flex, type FlexProps } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport BurgerButton from \"../buttons/BurgerButton.tsx\";\nimport DarkModeButton, {\n type DarkModeButtonProps,\n} from \"../buttons/DarkModeButton.tsx\";\nimport LanguageButton, {\n type LanguageButtonProps,\n} from \"../buttons/LanguageButton.tsx\";\nimport OmnibarButton, {\n type OmnibarButtonProps,\n} from \"../buttons/OmnibarButton.tsx\";\n\nexport type AppBarItem =\n | AppBarElement\n | AppBarBurger\n | AppBarDark\n | AppBarSearch\n | AppBarLang\n | AppBarSpacer\n | AppBarDivider;\n\nexport interface AppBarElement {\n position: \"left\" | \"center\" | \"right\";\n element: ReactNode;\n}\n\nexport interface AppBarBurger {\n position: \"left\" | \"center\" | \"right\";\n type: \"burger\";\n}\n\nexport interface AppBarDark {\n position: \"left\" | \"center\" | \"right\";\n type: \"dark\";\n props?: DarkModeButtonProps;\n}\n\nexport interface AppBarSearch {\n position: \"left\" | \"center\" | \"right\";\n type: \"search\";\n props?: OmnibarButtonProps;\n}\n\nexport interface AppBarLang {\n position: \"left\" | \"center\" | \"right\";\n type: \"lang\";\n props?: LanguageButtonProps;\n}\n\nexport interface AppBarSpacer {\n position: \"left\" | \"center\" | \"right\";\n type: \"spacer\";\n}\n\nexport interface AppBarDivider {\n position: \"left\" | \"center\" | \"right\";\n type: \"divider\";\n}\n\nexport interface AppBarProps {\n flexProps?: FlexProps;\n items?: AppBarItem[];\n}\n\nconst AppBar = (props: AppBarProps) => {\n const { items = [] } = props;\n\n const renderItem = (item: AppBarItem, index: number) => {\n if (\"type\" in item) {\n if (item.type === \"burger\") {\n return <BurgerButton key={index} />;\n }\n if (item.type === \"dark\") {\n return <DarkModeButton key={index} {...item.props} />;\n }\n if (item.type === \"search\") {\n return <OmnibarButton key={index} {...item.props} />;\n }\n if (item.type === \"lang\") {\n return <LanguageButton key={index} {...item.props} />;\n }\n if (item.type === \"spacer\") {\n return <Flex key={index} w={16} />;\n }\n if (item.type === \"divider\") {\n return <Divider key={index} orientation=\"vertical\" />;\n }\n }\n if (\"element\" in item) {\n return item.element;\n }\n return null;\n };\n\n const leftItems = items.filter((item) => item.position === \"left\");\n const centerItems = items.filter((item) => item.position === \"center\");\n const rightItems = items.filter((item) => item.position === \"right\");\n\n return (\n <Flex\n h=\"100%\"\n align=\"center\"\n px=\"md\"\n justify=\"space-between\"\n {...props.flexProps}\n >\n <Flex flex={1}>\n {leftItems.map((item, index) => (\n <Flex key={index} ml={index === 0 ? 0 : \"md\"} align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n <Flex>\n {centerItems.map((item, index) => (\n <Flex key={index} mx=\"md\" align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n <Flex flex={1} align={\"center\"} justify={\"end\"}>\n {rightItems.map((item, index) => (\n <Flex key={index} ml={index === 0 ? 0 : \"md\"} align=\"center\">\n {renderItem(item, index)}\n </Flex>\n ))}\n </Flex>\n </Flex>\n );\n};\n\nexport default AppBar;\n","import {\n Flex,\n type FlexProps,\n type MantineBreakpoint,\n Text,\n} from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconSquareRounded,\n} from \"@tabler/icons-react\";\nimport { useEvents } from \"alepha/react\";\nimport { useRouter } from \"alepha/react/router\";\nimport {\n type ComponentType,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { renderIcon } from \"../../helpers/renderIcon.tsx\";\nimport ActionButton, { type ActionProps } from \"../buttons/ActionButton.tsx\";\nimport OmnibarButton from \"../buttons/OmnibarButton.tsx\";\nimport ToggleSidebarButton from \"../buttons/ToggleSidebarButton.tsx\";\n\nexport interface SidebarProps {\n items?: SidebarNode[];\n onItemClick?: (item: SidebarMenuItem) => void;\n onSearchClick?: () => void;\n theme?: SidebarTheme;\n flexProps?: Partial<FlexProps>;\n collapsed?: boolean;\n gap?: MantineBreakpoint | number;\n hide?: {\n paths?: string[];\n };\n\n /**\n * Automatically populate the menu from the router's pages.\n */\n autoPopulateMenu?:\n | boolean\n | {\n startsWith: string;\n };\n}\n\nexport const Sidebar = (props: SidebarProps) => {\n const router = useRouter();\n const { onItemClick } = props;\n\n const divider = (key: string | number) => {\n return (\n <Flex\n key={key}\n h={1}\n bg={\"var(--alepha-border)\"}\n my={\"xs\"}\n mx={props.collapsed ? 0 : \"sm\"}\n />\n );\n };\n\n const renderNode = (item: SidebarNode, key: number) => {\n if (\"type\" in item) {\n // Hide spacers when collapsed\n if (item.type === \"spacer\") {\n if (props.collapsed) return null;\n return <Flex key={key} h={16} />;\n }\n\n if (item.type === \"divider\") {\n return divider(key);\n }\n\n if (item.type === \"search\") {\n return (\n <Flex key={key} mb=\"xs\">\n <OmnibarButton collapsed={props.collapsed} />\n </Flex>\n );\n }\n\n if (item.type === \"toggle\") {\n return <ToggleSidebarButton key={key} />;\n }\n\n // Replace sections with dividers when collapsed\n if (item.type === \"section\") {\n if (props.collapsed) {\n return divider(key);\n }\n return (\n <Flex key={key} mt={\"md\"} align={\"center\"} gap={\"xs\"}>\n {renderIcon(item.icon)}\n <Text size={\"xs\"} c={\"dimmed\"} tt={\"uppercase\"} fw={\"bold\"}>\n {item.label}\n </Text>\n </Flex>\n );\n }\n }\n\n if (\"element\" in item) {\n return <Flex key={key}>{item.element}</Flex>;\n }\n\n // Check visibility control\n if (item.can && !item.can()) {\n return null;\n }\n\n if (props.collapsed) {\n return (\n <SidebarCollapsedItem\n key={key}\n item={item}\n level={0}\n onItemClick={onItemClick}\n theme={props.theme ?? {}}\n />\n );\n }\n\n return (\n <SidebarItem\n key={key}\n item={item}\n level={0}\n onItemClick={onItemClick}\n theme={props.theme ?? {}}\n />\n );\n };\n\n const getSidebarNodes = (): SidebarNode[] => {\n if (props.items) return props.items;\n if (props.autoPopulateMenu) {\n const items = router.concretePages\n .filter((page) => !page.can || page.can())\n .map((page) => ({\n label: page.label ?? page.name,\n //description: page.description?.slice(0, 32),\n icon: renderIcon(page.icon),\n href: router.path(page.name),\n })) as SidebarMenuItem[];\n if (\n typeof props.autoPopulateMenu === \"object\" &&\n props.autoPopulateMenu.startsWith\n ) {\n const startsWith = props.autoPopulateMenu.startsWith;\n return items.filter((item) => item.href?.startsWith(startsWith));\n }\n return items;\n }\n return [];\n };\n\n const padding = \"md\";\n const gap = props.items ? (props.gap ?? 2) : \"xs\";\n const menu = useMemo(\n () => getSidebarNodes(),\n [props.items, props.autoPopulateMenu],\n );\n\n return (\n <Flex\n flex={1}\n py={padding}\n direction={\"column\"}\n className=\"alepha-sidebar-scroll\"\n {...props.flexProps}\n >\n <Flex gap={gap} px={padding} direction={\"column\"}>\n {menu\n .filter((it) => it.position === \"top\")\n .map((item, index) => renderNode(item, index))}\n </Flex>\n <Flex\n gap={gap}\n px={padding}\n direction={\"column\"}\n flex={1}\n className=\"alepha-sidebar-scroll\"\n >\n {menu\n .filter((it) => !it.position)\n .map((item, index) => renderNode(item, index))}\n </Flex>\n <Flex gap={gap} px={padding} direction={\"column\"}>\n {menu\n .filter((it) => it.position === \"bottom\")\n .map((item, index) => renderNode(item, index))}\n </Flex>\n </Flex>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SidebarItemProps {\n item: SidebarMenuItem;\n level: number;\n onItemClick?: (item: SidebarMenuItem) => void;\n theme: SidebarTheme;\n}\n\nexport const SidebarItem = (props: SidebarItemProps) => {\n const { item, level } = props;\n const maxLevel = 2; // 0, 1, 2 = 3 levels total\n\n const router = useRouter();\n const isActive = useCallback((item: SidebarMenuItem): boolean => {\n if (!item.children) return false;\n for (const child of item.children) {\n if (child.href) {\n if (router.isActive(child.href)) {\n return true;\n }\n }\n if (isActive(child)) {\n return true;\n }\n }\n return false;\n }, []);\n\n const [isOpen, setIsOpen] = useState<boolean>(isActive(item));\n\n useEvents(\n {\n \"react:transition:end\": () => {\n // recalculate open state on transition end to ensure correct state after navigation\n if (isActive(item)) {\n setIsOpen(true);\n }\n },\n },\n [],\n );\n\n if (level > maxLevel) return null;\n\n const handleItemClick = (e: MouseEvent) => {\n if (!props.item.target) {\n e.preventDefault();\n }\n if (item.children && item.children.length > 0) {\n setIsOpen(!isOpen);\n } else {\n props.onItemClick?.(item);\n item.onClick?.();\n }\n };\n\n return (\n <Flex direction={\"column\"} ps={level === 0 ? 0 : 32} pos={\"relative\"}>\n <ActionButton\n w={\"100%\"}\n justify=\"space-between\"\n href={props.item.href}\n target={props.item.target}\n size={\n props.item.theme?.size ??\n props.theme.button?.size ??\n (level === 0 ? \"sm\" : \"xs\")\n }\n c={\"var(--mantine-color-text)\"}\n color={\"gray\"}\n variant={\"subtle\"}\n variantActive={\"default\"}\n radius={props.item.theme?.radius ?? props.theme.button?.radius ?? \"md\"}\n onClick={handleItemClick}\n leftSection={\n <Flex w={\"100%\"} align=\"center\" gap={\"sm\"}>\n {renderIcon(item.icon)}\n <Flex direction={\"column\"}>\n <Flex>{item.label}</Flex>\n {item.description && (\n <Text size={\"xs\"} c={\"dimmed\"}>\n {item.description}\n </Text>\n )}\n </Flex>\n </Flex>\n }\n rightSection={\n item.children ? (\n <Flex>\n {isOpen ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </Flex>\n ) : (\n props.item.rightSection\n )\n }\n {...props.item.actionProps}\n />\n\n {item.children && isOpen && (\n <Flex direction={\"column\"} data-parent-level={level}>\n <Flex\n style={{\n position: \"absolute\",\n width: 1,\n background:\n \"linear-gradient(to bottom, transparent, var(--alepha-border), transparent)\",\n top: 48,\n left: 20 + 32 * level,\n bottom: 16,\n }}\n />\n {item.children\n .filter((child) => !child.can || child.can())\n .map((child, index) => (\n <SidebarItem\n key={index}\n item={child}\n level={level + 1}\n onItemClick={props.onItemClick}\n theme={props.theme}\n />\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SidebarItemProps {\n item: SidebarMenuItem;\n level: number;\n onItemClick?: (item: SidebarMenuItem) => void;\n theme: SidebarTheme;\n}\n\nconst SidebarCollapsedItem = (props: SidebarItemProps) => {\n const { item, level } = props;\n\n const handleItemClick = () => {\n props.onItemClick?.(item);\n item.onClick?.();\n };\n\n return (\n <ActionButton\n size={\n props.item.theme?.size ??\n props.theme.button?.size ??\n (level === 0 ? \"sm\" : \"xs\")\n }\n variant={\"subtle\"}\n variantActive={\"default\"}\n tooltip={{\n label: item.label,\n position: \"right\",\n }}\n radius={props.item.theme?.radius ?? props.theme.button?.radius ?? \"md\"}\n onClick={handleItemClick}\n icon={renderIcon(item.icon) ?? <IconSquareRounded />}\n href={props.item.href as any}\n target={props.item.target}\n {...props.item.actionProps}\n />\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type SidebarNode =\n | SidebarMenuItem\n | SidebarSpacer\n | SidebarDivider\n | SidebarSearch\n | SidebarElement\n | SidebarSection\n | SidebarToggle;\n\nexport interface SidebarAbstractItem {\n position?: \"top\" | \"bottom\";\n}\n\nexport interface SidebarElement extends SidebarAbstractItem {\n element: ReactNode;\n}\n\nexport interface SidebarSpacer extends SidebarAbstractItem {\n type: \"spacer\";\n}\n\nexport interface SidebarDivider extends SidebarAbstractItem {\n type: \"divider\";\n}\n\nexport interface SidebarSearch extends SidebarAbstractItem {\n type: \"search\";\n}\n\nexport interface SidebarToggle extends SidebarAbstractItem {\n type: \"toggle\";\n}\n\nexport interface SidebarSection extends SidebarAbstractItem {\n type: \"section\";\n label: string;\n icon?: ReactNode | ComponentType;\n}\n\nexport interface SidebarMenuItem extends SidebarAbstractItem {\n label: string | ReactNode;\n description?: string;\n icon?: ReactNode | ComponentType;\n href?: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n activeStartsWith?: boolean; // Use startWith matching for active state\n onClick?: () => void;\n children?: SidebarMenuItem[];\n rightSection?: ReactNode;\n theme?: SidebarButtonTheme;\n actionProps?: ActionProps;\n can?: () => boolean; // Visibility control: true -> visible, false -> hidden\n}\n\nexport interface SidebarButtonTheme {\n radius?: MantineBreakpoint;\n size?: MantineBreakpoint;\n}\n\nexport interface SidebarTheme {\n button?: SidebarButtonTheme;\n search?: SidebarButtonTheme;\n}\n","import {\n AppShell,\n type AppShellFooterProps,\n type AppShellHeaderProps,\n type AppShellMainProps,\n type AppShellNavbarProps,\n type AppShellProps,\n Flex,\n} from \"@mantine/core\";\nimport { useEvents, useStore } from \"alepha/react\";\nimport { NestedView, useRouter } from \"alepha/react/router\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { alephaSidebarAtom } from \"../../atoms/alephaSidebarAtom.ts\";\nimport { ui } from \"../../constants/ui.ts\";\nimport AppBar, { type AppBarProps } from \"./AppBar.tsx\";\nimport { Sidebar, type SidebarProps } from \"./Sidebar.tsx\";\n\nexport interface AdminShellProps {\n appShellProps?: Partial<AppShellProps>;\n appShellMainProps?: Partial<AppShellMainProps>;\n appShellHeaderProps?: Partial<AppShellHeaderProps>;\n appShellNavbarProps?: Partial<AppShellNavbarProps>;\n appShellFooterProps?: Partial<AppShellFooterProps>;\n sidebarProps?: Partial<SidebarProps>;\n appBarProps?: Partial<AppBarProps>;\n header?: ReactNode;\n footer?: ReactNode;\n children?: ReactNode;\n\n /**\n * Enable drag-to-resize for the sidebar.\n * Width and constraints are configured in alephaSidebarAtom.\n */\n resizable?: boolean;\n\n noSidebarWhen?: {\n /**\n * Paths where the sidebar should be hidden.\n */\n paths?: string[];\n };\n}\n\nconst AdminShell = (props: AdminShellProps) => {\n const router = useRouter();\n const [sidebar, setSidebar] = useStore(alephaSidebarAtom);\n const { opened, collapsed } = sidebar;\n\n // Initialize collapsed state from props on mount\n useEffect(() => {\n if (props.sidebarProps?.collapsed !== undefined) {\n setSidebar({ ...sidebar, collapsed: props.sidebarProps.collapsed });\n }\n }, []);\n\n // Resize state\n const [isResizing, setIsResizing] = useState(false);\n const [isHovering, setIsHovering] = useState(false);\n const [collapseEffect, setCollapseEffect] = useState({\n offset: 0,\n opacity: 1,\n });\n const resizeRef = useRef<{ startX: number; startWidth: number } | null>(null);\n\n // Use atom values for constraints\n const {\n collapsedWidth,\n collapseThreshold,\n maxWidth,\n hoverDelay,\n defaultWidth,\n } = sidebar;\n\n const handleResizeStart = useCallback(\n (e: React.MouseEvent) => {\n if (!props.resizable) return;\n e.preventDefault();\n\n // If collapsed and hovering, un-collapse first and start from defaultWidth\n if (collapsed) {\n setSidebar({ ...sidebar, collapsed: false, width: defaultWidth });\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startWidth: defaultWidth,\n };\n } else {\n setIsResizing(true);\n resizeRef.current = {\n startX: e.clientX,\n startWidth: sidebar.width,\n };\n }\n },\n [props.resizable, collapsed, sidebar, setSidebar, defaultWidth],\n );\n\n useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeRef.current) return;\n const delta = e.clientX - resizeRef.current.startX;\n const rawWidth = resizeRef.current.startWidth + delta;\n const newWidth = Math.min(Math.max(rawWidth, collapsedWidth), maxWidth);\n\n // Visual effect when below collapse threshold\n if (rawWidth < collapseThreshold) {\n const progress = Math.max(\n 0,\n (collapseThreshold - rawWidth) / collapseThreshold,\n );\n setCollapseEffect({\n offset: -progress * collapsedWidth,\n opacity: 1 - progress * 0.7,\n });\n setSidebar({ ...sidebar, width: collapseThreshold, collapsed: false });\n } else {\n setCollapseEffect({ offset: 0, opacity: 1 });\n setSidebar({ ...sidebar, width: newWidth, collapsed: false });\n }\n };\n\n const handleMouseUp = () => {\n // If we released while in collapse zone, actually collapse\n if (collapseEffect.offset < 0) {\n setSidebar({ ...sidebar, collapsed: true });\n }\n setCollapseEffect({ offset: 0, opacity: 1 });\n setIsResizing(false);\n resizeRef.current = null;\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [\n isResizing,\n sidebar,\n setSidebar,\n collapsedWidth,\n maxWidth,\n collapseThreshold,\n collapseEffect.offset,\n ]);\n\n // Hover to expand when collapsed (with delay)\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleNavbarMouseEnter = useCallback(() => {\n if (collapsed) {\n hoverTimeoutRef.current = setTimeout(() => {\n setIsHovering(true);\n }, hoverDelay);\n }\n }, [collapsed, hoverDelay]);\n\n const handleNavbarMouseLeave = useCallback(() => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n setIsHovering(false);\n }, []);\n\n // Reset hover state when collapsed changes (e.g., when toggle button is clicked)\n useEffect(() => {\n if (collapsed) {\n setIsHovering(false);\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n }\n }, [collapsed]);\n\n const shouldShowSidebar = () => {\n if (props.noSidebarWhen?.paths) {\n for (const path of props.noSidebarWhen.paths) {\n if (\n router.isActive(path, {\n startWith: true,\n })\n ) {\n return false;\n }\n }\n }\n return true;\n };\n\n const [showSidebar, setShowSidebar] = useState(shouldShowSidebar());\n\n useEvents(\n {\n \"react:transition:end\": () => {\n setShowSidebar(shouldShowSidebar());\n },\n \"react:transition:begin\": () => {\n setSidebar({ ...sidebar, opened: false });\n },\n },\n [sidebar],\n );\n\n // Default AppBar items with burger button on the left\n const defaultAppBarItems = [\n { position: \"left\" as const, type: \"burger\" as const },\n ];\n\n const hasSidebar = showSidebar && props.sidebarProps !== undefined;\n const hasAppBar = hasSidebar || props.appBarProps || props.header;\n\n const headerHeight = hasAppBar ? 60 : 0;\n const footerHeight = props.footer ? 24 : 0;\n const expandedWidth = Math.max(sidebar.width, collapsedWidth);\n\n // When collapsed but hovering, show defaultWidth (not current width)\n const isExpandedByHover = collapsed && isHovering;\n const effectiveCollapsed = collapsed && !isHovering;\n const hoverWidth = Math.max(defaultWidth, collapsedWidth);\n const sidebarWidth = hasSidebar\n ? effectiveCollapsed\n ? collapsedWidth\n : isExpandedByHover\n ? hoverWidth\n : expandedWidth\n : 0;\n const canResize = props.resizable && !collapsed;\n\n return (\n <AppShell\n w={\"100%\"}\n flex={1}\n padding=\"md\"\n header={hasAppBar ? { height: 60 } : undefined}\n navbar={\n hasSidebar\n ? {\n width: effectiveCollapsed\n ? { base: collapsedWidth }\n : isExpandedByHover\n ? { base: hoverWidth }\n : { base: expandedWidth },\n breakpoint: \"sm\",\n collapsed: { mobile: !opened },\n }\n : undefined\n }\n footer={props.footer ? { height: 24 } : undefined}\n {...props.appShellProps}\n >\n <AppShell.Header bg={ui.colors.surface} {...props.appShellHeaderProps}>\n {props.header ?? (\n <AppBar items={defaultAppBarItems} {...props.appBarProps} />\n )}\n </AppShell.Header>\n\n {hasSidebar && (\n <AppShell.Navbar\n bg={ui.colors.surface}\n className=\"alepha-sidebar-navbar\"\n data-resizing={isResizing}\n onMouseEnter={handleNavbarMouseEnter}\n onMouseLeave={handleNavbarMouseLeave}\n style={{\n transform: collapseEffect.offset\n ? `translateX(${collapseEffect.offset}px)`\n : undefined,\n opacity: collapseEffect.opacity,\n }}\n {...props.appShellNavbarProps}\n >\n <Sidebar\n {...(props.sidebarProps ?? {})}\n collapsed={effectiveCollapsed}\n />\n {(canResize || isExpandedByHover) && (\n <Flex\n pos=\"absolute\"\n right={-2}\n top={0}\n bottom={0}\n w={4}\n style={{\n cursor: \"col-resize\",\n userSelect: \"none\",\n }}\n onMouseDown={handleResizeStart}\n />\n )}\n </AppShell.Navbar>\n )}\n\n <AppShell.Main\n pl={sidebarWidth}\n pt={headerHeight}\n pb={footerHeight}\n pr={0}\n display={\"flex\"}\n flex={1}\n style={{ flexDirection: \"column\" }}\n className=\"alepha-sidebar-main\"\n data-resizing={isResizing}\n {...props.appShellMainProps}\n >\n {props.children ?? <NestedView />}\n </AppShell.Main>\n\n {props.footer && (\n <AppShell.Footer bg={ui.colors.surface} {...props.appShellFooterProps}>\n {props.footer}\n </AppShell.Footer>\n )}\n </AppShell>\n );\n};\n\nexport default AdminShell;\n","import { Flex } from \"@mantine/core\";\nimport { type TObject, t } from \"alepha\";\nimport type { FormModel } from \"alepha/react/form\";\nimport { useMemo } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport TypeForm, { type TypeFormProps } from \"../form/TypeForm.tsx\";\nimport type { FilterVisibility } from \"./types.ts\";\n\nexport interface DataTableFiltersProps {\n schema: TObject;\n form: FormModel<TObject>;\n typeFormProps?: Partial<Omit<TypeFormProps<TObject>, \"form\">>;\n filterVisibility: FilterVisibility;\n}\n\nconst DataTableFilters = ({\n schema,\n form,\n typeFormProps,\n filterVisibility,\n}: DataTableFiltersProps) => {\n const visibleSchema = useMemo(() => {\n const visibleKeys = Object.keys(schema.properties).filter(\n (key) => filterVisibility[key] !== false,\n );\n\n if (visibleKeys.length === 0) {\n return null;\n }\n\n const visibleProps = visibleKeys.reduce(\n (acc, key) => {\n acc[key] = schema.properties[key];\n return acc;\n },\n {} as Record<string, unknown>,\n );\n\n return t.object(visibleProps as TObject[\"properties\"]);\n }, [schema, filterVisibility]);\n\n if (!visibleSchema) {\n return null;\n }\n\n return (\n <Flex\n w=\"100%\"\n p=\"xs\"\n bg={ui.colors.surface}\n style={{ borderBottom: \"1px solid var(--alepha-border)\" }}\n >\n <TypeForm\n {...typeFormProps}\n skipSubmitButton\n fill\n form={form}\n schema={visibleSchema}\n />\n </Flex>\n );\n};\n\nexport default DataTableFilters;\n","import { Flex, Pagination, Select } from \"@mantine/core\";\n\nexport interface DataTablePaginationProps {\n page: number;\n size: string;\n totalPages: number;\n onPageChange: (page: number) => void;\n onSizeChange: (size: number) => void;\n}\n\nconst DataTablePagination = ({\n page,\n size,\n totalPages,\n onPageChange,\n onSizeChange,\n}: DataTablePaginationProps) => {\n return (\n <Flex\n align=\"center\"\n justify=\"end\"\n gap=\"md\"\n p=\"xs\"\n style={{\n borderTop: \"1px solid var(--alepha-border)\",\n }}\n >\n <Flex>\n <Select\n w={96}\n variant=\"default\"\n value={size}\n onChange={(value) => {\n if (value) {\n onSizeChange(Number(value));\n }\n }}\n data={[\n { value: \"5\", label: \"5\" },\n { value: \"10\", label: \"10\" },\n { value: \"25\", label: \"25\" },\n { value: \"50\", label: \"50\" },\n { value: \"100\", label: \"100\" },\n ]}\n />\n </Flex>\n <Flex>\n <Pagination\n withEdges\n total={totalPages}\n value={page}\n onChange={onPageChange}\n />\n </Flex>\n </Flex>\n );\n};\n\nexport default DataTablePagination;\n","import {\n Button,\n Checkbox,\n Group,\n Popover,\n ScrollArea,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { IconColumns } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\nimport type { ColumnVisibility, DataTableColumn } from \"./types.ts\";\n\nexport interface ColumnPickerProps<T extends object, Filters extends TObject> {\n columns: { [key: string]: DataTableColumn<T, Filters> };\n visibility: ColumnVisibility;\n onVisibilityChange: (visibility: ColumnVisibility) => void;\n}\n\nconst ColumnPicker = <T extends object, Filters extends TObject>({\n columns,\n visibility,\n onVisibilityChange,\n}: ColumnPickerProps<T, Filters>) => {\n const [opened, setOpened] = useState(false);\n const columnEntries = Object.entries(columns);\n\n const handleShowAll = () => {\n const newVisibility = columnEntries.reduce(\n (acc, [key]) => ({ ...acc, [key]: true }),\n {} as ColumnVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleHideAll = () => {\n const newVisibility = columnEntries.reduce(\n (acc, [key]) => ({ ...acc, [key]: false }),\n {} as ColumnVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleToggle = (key: string, checked: boolean) => {\n onVisibilityChange({\n ...visibility,\n [key]: checked,\n });\n };\n\n const visibleCount = columnEntries.filter(\n ([key]) => visibility[key] !== false,\n ).length;\n\n return (\n <Popover\n width={280}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={opened}\n onChange={setOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <ActionButton variant=\"subtle\" icon={IconColumns} />\n </Popover.Target>\n <Popover.Dropdown\n bg=\"transparent\"\n p=\"xs\"\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <Stack gap=\"xs\" bg={ui.colors.surface} p=\"sm\" bdrs=\"sm\">\n <Group justify=\"space-between\">\n <Text size=\"sm\" fw={500}>\n Columns ({visibleCount}/{columnEntries.length})\n </Text>\n <Group gap={4}>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleShowAll}\n >\n All\n </Button>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleHideAll}\n >\n None\n </Button>\n </Group>\n </Group>\n\n <ScrollArea.Autosize mah={300}>\n <Stack gap={4}>\n {columnEntries.map(([key, col]) => (\n <Checkbox\n key={key}\n label={col.label}\n checked={visibility[key] !== false}\n onChange={(e) => handleToggle(key, e.currentTarget.checked)}\n size=\"sm\"\n />\n ))}\n </Stack>\n </ScrollArea.Autosize>\n </Stack>\n </Popover.Dropdown>\n </Popover>\n );\n};\n\nexport default ColumnPicker;\n","import {\n Button,\n Checkbox,\n Group,\n Popover,\n ScrollArea,\n Stack,\n Text,\n} from \"@mantine/core\";\nimport { IconFilter } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport ActionButton from \"../buttons/ActionButton.tsx\";\nimport type { FilterVisibility } from \"./types.ts\";\n\nexport interface FilterPickerProps {\n schema: TObject;\n visibility: FilterVisibility;\n onVisibilityChange: (visibility: FilterVisibility) => void;\n}\n\nconst getFieldLabel = (schema: TObject, key: string): string => {\n const prop = schema.properties[key];\n if (prop && typeof prop === \"object\" && \"title\" in prop && prop.title) {\n return prop.title as string;\n }\n // Convert camelCase to Title Case\n return key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n};\n\nconst FilterPicker = ({\n schema,\n visibility,\n onVisibilityChange,\n}: FilterPickerProps) => {\n const [opened, setOpened] = useState(false);\n const filterKeys = Object.keys(schema.properties);\n\n const handleShowAll = () => {\n const newVisibility = filterKeys.reduce(\n (acc, key) => ({ ...acc, [key]: true }),\n {} as FilterVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleHideAll = () => {\n const newVisibility = filterKeys.reduce(\n (acc, key) => ({ ...acc, [key]: false }),\n {} as FilterVisibility,\n );\n onVisibilityChange(newVisibility);\n };\n\n const handleToggle = (key: string, checked: boolean) => {\n onVisibilityChange({\n ...visibility,\n [key]: checked,\n });\n };\n\n const visibleCount = filterKeys.filter(\n (key) => visibility[key] !== false,\n ).length;\n\n return (\n <Popover\n width={280}\n position=\"bottom-start\"\n shadow=\"md\"\n opened={opened}\n onChange={setOpened}\n closeOnClickOutside\n closeOnEscape\n transitionProps={{\n transition: \"fade-up\",\n duration: 200,\n timingFunction: \"ease\",\n }}\n >\n <Popover.Target>\n <ActionButton variant=\"subtle\" icon={IconFilter} />\n </Popover.Target>\n <Popover.Dropdown\n bg=\"transparent\"\n p=\"xs\"\n bd={`1px solid ${ui.colors.border}`}\n style={{\n backdropFilter: \"blur(20px)\",\n }}\n >\n <Stack gap=\"xs\" bg={ui.colors.surface} p=\"sm\" bdrs=\"sm\">\n <Group justify=\"space-between\">\n <Text size=\"sm\" fw={500}>\n Filters ({visibleCount}/{filterKeys.length})\n </Text>\n <Group gap={4}>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleShowAll}\n >\n All\n </Button>\n <Button\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={handleHideAll}\n >\n None\n </Button>\n </Group>\n </Group>\n\n <ScrollArea.Autosize mah={300}>\n <Stack gap={4}>\n {filterKeys.map((key) => (\n <Checkbox\n key={key}\n label={getFieldLabel(schema, key)}\n checked={visibility[key] !== false}\n onChange={(e) => handleToggle(key, e.currentTarget.checked)}\n size=\"sm\"\n />\n ))}\n </Stack>\n </ScrollArea.Autosize>\n </Stack>\n </Popover.Dropdown>\n </Popover>\n );\n};\n\nexport default FilterPicker;\n","import { Badge, Divider, Flex } from \"@mantine/core\";\nimport { IconRefresh, IconX } from \"@tabler/icons-react\";\nimport type { TObject } from \"alepha\";\nimport { isValidElement, type ReactNode } from \"react\";\nimport { isComponentType } from \"../../helpers/isComponentType.ts\";\nimport ActionButton, { type ActionProps } from \"../buttons/ActionButton.tsx\";\nimport ColumnPicker from \"./ColumnPicker.tsx\";\nimport FilterPicker from \"./FilterPicker.tsx\";\nimport type {\n CheckboxAction,\n CheckboxActionContext,\n ColumnVisibility,\n DataTableColumn,\n FilterVisibility,\n} from \"./types.ts\";\n\nexport interface DataTableToolbarProps<\n T extends object,\n Filters extends TObject,\n> {\n columns: { [key: string]: DataTableColumn<T, Filters> };\n filters?: TObject;\n columnVisibility: ColumnVisibility;\n filterVisibility: FilterVisibility;\n onColumnVisibilityChange: (visibility: ColumnVisibility) => void;\n onFilterVisibilityChange: (visibility: FilterVisibility) => void;\n actions?: Array<ActionProps & { label?: ReactNode }>;\n onRefresh?: () => void;\n // Checkbox-related props\n selectedItems?: T[];\n checkboxActions?: Array<CheckboxAction<T>>;\n onClearSelection?: () => void;\n}\n\nconst DataTableToolbar = <T extends object, Filters extends TObject>({\n columns,\n filters,\n columnVisibility,\n filterVisibility,\n onColumnVisibilityChange,\n onFilterVisibilityChange,\n actions,\n onRefresh,\n selectedItems = [],\n checkboxActions,\n onClearSelection,\n}: DataTableToolbarProps<T, Filters>) => {\n const hasSelection = selectedItems.length > 0;\n\n const handleCheckboxAction = async (action: CheckboxAction<T>) => {\n const ctx: CheckboxActionContext<T> = {\n selectedItems,\n clearSelection: onClearSelection || (() => {}),\n };\n await action.onClick(ctx);\n };\n\n return (\n <Flex p=\"xs\" style={{ borderBottom: \"1px solid var(--alepha-border)\" }}>\n <Flex gap={4} align=\"center\">\n {filters && (\n <FilterPicker\n schema={filters}\n visibility={filterVisibility}\n onVisibilityChange={onFilterVisibilityChange}\n />\n )}\n <ColumnPicker\n columns={columns}\n visibility={columnVisibility}\n onVisibilityChange={onColumnVisibilityChange}\n />\n\n {hasSelection && (\n <>\n <Divider orientation=\"vertical\" mx=\"xs\" />\n <Badge variant=\"light\" size=\"lg\">\n {selectedItems.length} selected\n </Badge>\n <ActionButton\n variant=\"subtle\"\n size=\"compact-sm\"\n icon={IconX}\n onClick={onClearSelection}\n >\n Clear\n </ActionButton>\n {checkboxActions?.map((action, index) => (\n <ActionButton\n key={index}\n variant=\"light\"\n size=\"compact-sm\"\n intent={action.intent}\n icon={\n action.icon && isComponentType(action.icon)\n ? action.icon\n : undefined\n }\n onClick={() => handleCheckboxAction(action)}\n >\n {action.label}\n </ActionButton>\n ))}\n </>\n )}\n </Flex>\n <Flex flex={1} />\n <Flex gap=\"xs\">\n {actions?.map((props, index) =>\n !isValidElement(props) ? (\n <ActionButton key={index} {...(props as ActionProps)}>\n {(props as ActionProps & { label?: ReactNode }).label}\n </ActionButton>\n ) : (\n props\n ),\n )}\n <ActionButton icon={IconRefresh} onClick={onRefresh}>\n Refresh\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default DataTableToolbar;\n","import { Checkbox, Flex, Table, Text, UnstyledButton } from \"@mantine/core\";\nimport { useDebouncedCallback } from \"@mantine/hooks\";\nimport {\n IconArrowDown,\n IconArrowsSort,\n IconArrowUp,\n} from \"@tabler/icons-react\";\nimport { Alepha, type Static, type TObject, t } from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { useInject } from \"alepha/react\";\nimport { type FormModel, useForm } from \"alepha/react/form\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\nimport DataTableFilters, {\n type DataTableFiltersProps,\n} from \"./DataTableFilters.tsx\";\nimport DataTablePagination from \"./DataTablePagination.tsx\";\nimport DataTableToolbar from \"./DataTableToolbar.tsx\";\nimport type {\n ColumnVisibility,\n DataTableColumnContext,\n DataTableProps,\n FilterVisibility,\n MaybePage,\n} from \"./types.ts\";\n\nconst DEFAULT_VISIBLE_COLUMN_COUNT = 10;\n\ntype SortDirection = \"asc\" | \"desc\" | null;\n\n/**\n * Parse the sort string to get direction for a specific field.\n * Alepha convention: 'field' = ASC, '-field' = DESC\n */\nconst getSortDirection = (\n sortString: string | undefined,\n field: string,\n): SortDirection => {\n if (!sortString) return null;\n const parts = sortString.split(\",\").map((s) => s.trim());\n for (const part of parts) {\n if (part === field) return \"asc\";\n if (part === `-${field}`) return \"desc\";\n }\n return null;\n};\n\n/**\n * Toggle sort for a field in the sort string.\n * Cycles: null -> asc -> desc -> null\n */\nconst toggleSort = (\n sortString: string | undefined,\n field: string,\n): string | undefined => {\n const current = getSortDirection(sortString, field);\n\n // Remove existing sort for this field\n const parts = (sortString || \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s && s !== field && s !== `-${field}`);\n\n if (current === null) {\n // No sort -> ASC\n parts.unshift(field);\n } else if (current === \"asc\") {\n // ASC -> DESC\n parts.unshift(`-${field}`);\n }\n // DESC -> remove (already filtered out above)\n\n return parts.length > 0 ? parts.join(\",\") : undefined;\n};\n\nconst DataTable = <T extends object, Filters extends TObject>(\n props: DataTableProps<T, Filters>,\n) => {\n const [items, setItems] = useState<MaybePage<T>>(\n typeof props.items === \"function\"\n ? {\n content: [],\n }\n : props.items,\n );\n\n const defaultSize = props.infinityScroll ? 100 : props.defaultSize || 10;\n const [page, setPage] = useState(1);\n const [size, setSize] = useState(String(defaultSize));\n const [currentPage, setCurrentPage] = useState(0);\n const alepha = useInject(Alepha);\n\n // Column visibility state\n const [columnVisibility, setColumnVisibility] = useState<ColumnVisibility>(\n () => {\n if (props.defaultColumnVisibility) {\n return props.defaultColumnVisibility;\n }\n const columnKeys = Object.keys(props.columns);\n const maxVisible =\n props.defaultVisibleColumnCount ?? DEFAULT_VISIBLE_COLUMN_COUNT;\n return columnKeys.reduce(\n (acc, key, index) => ({\n ...acc,\n [key]: index < maxVisible,\n }),\n {} as ColumnVisibility,\n );\n },\n );\n\n // Filter visibility state\n const [filterVisibility, setFilterVisibility] = useState<FilterVisibility>(\n () => {\n if (props.defaultFilterVisibility) {\n return props.defaultFilterVisibility;\n }\n if (!props.filters?.properties) {\n return {};\n }\n return Object.keys(props.filters.properties).reduce(\n (acc, key) => ({ ...acc, [key]: true }),\n {} as FilterVisibility,\n );\n },\n );\n\n // Handle column visibility changes\n const handleColumnVisibilityChange = (visibility: ColumnVisibility) => {\n setColumnVisibility(visibility);\n props.onColumnVisibilityChange?.(visibility);\n };\n\n // Handle filter visibility changes\n const handleFilterVisibilityChange = (visibility: FilterVisibility) => {\n setFilterVisibility(visibility);\n props.onFilterVisibilityChange?.(visibility);\n };\n\n // Compute visible columns\n const visibleColumns = useMemo(() => {\n return Object.entries(props.columns).filter(\n ([key]) => columnVisibility[key] !== false,\n );\n }, [props.columns, columnVisibility]);\n\n // Current sort string from form\n const [sortString, setSortString] = useState<string | undefined>(undefined);\n\n // Handle column header click for sorting\n const handleSortClick = (columnKey: string, sortKey?: string) => {\n const field = sortKey || columnKey;\n const newSort = toggleSort(sortString, field);\n setSortString(newSort);\n form.input.sort.set(newSort);\n form.input.page.set(0); // Reset to first page when sorting changes\n };\n\n // Checkbox selection state\n const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());\n\n // Default getItemKey uses JSON.stringify if not provided\n const getItemKey = useCallback(\n (item: T): string => {\n if (props.getItemKey) {\n return props.getItemKey(item);\n }\n return JSON.stringify(item);\n },\n [props.getItemKey],\n );\n\n // Get selected items from current content\n const selectedItems = useMemo(() => {\n if (!props.withCheckbox) return [];\n return items.content.filter((item) =>\n selectedKeys.has(getItemKey(item as T)),\n ) as T[];\n }, [items.content, selectedKeys, getItemKey, props.withCheckbox]);\n\n // Check if all current page items are selected\n const allSelected = useMemo(() => {\n if (items.content.length === 0) return false;\n return items.content.every((item) =>\n selectedKeys.has(getItemKey(item as T)),\n );\n }, [items.content, selectedKeys, getItemKey]);\n\n // Check if some (but not all) items are selected\n const someSelected = useMemo(() => {\n if (items.content.length === 0) return false;\n const selectedCount = items.content.filter((item) =>\n selectedKeys.has(getItemKey(item as T)),\n ).length;\n return selectedCount > 0 && selectedCount < items.content.length;\n }, [items.content, selectedKeys, getItemKey]);\n\n // Toggle selection of a single item\n const toggleItemSelection = useCallback(\n (item: T) => {\n const key = getItemKey(item);\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n },\n [getItemKey],\n );\n\n // Toggle selection of all items on current page\n const toggleAllSelection = useCallback(() => {\n if (allSelected) {\n // Deselect all current page items\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n for (const item of items.content) {\n next.delete(getItemKey(item as T));\n }\n return next;\n });\n } else {\n // Select all current page items\n setSelectedKeys((prev) => {\n const next = new Set(prev);\n for (const item of items.content) {\n next.add(getItemKey(item as T));\n }\n return next;\n });\n }\n }, [allSelected, items.content, getItemKey]);\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedKeys(new Set());\n }, []);\n\n const form = useForm(\n {\n schema: t.object({\n ...(props.filters ? props.filters.properties : {}),\n page: t.number({ default: 0 }),\n size: t.number({ default: defaultSize }),\n sort: t.optional(t.string()),\n }),\n handler: async (values) => {\n if (typeof props.items === \"function\") {\n const response = await props.items(\n values as Static<Filters> & {\n page: number;\n size: number;\n sort?: string;\n },\n {\n items: items.content,\n },\n );\n\n if (props.infinityScroll && values.page > 0) {\n // Append new items to existing ones for infinity scroll\n setItems((prev) => ({\n ...response,\n content: [...prev.content, ...response.content],\n }));\n } else {\n setItems(response);\n }\n\n setCurrentPage(values.page);\n }\n },\n onReset: async () => {\n setPage(1);\n setSize(\"10\");\n await form.submit();\n },\n onChange: async (key, value) => {\n if (key === \"page\") {\n setPage(value + 1);\n await form.submit();\n return;\n }\n\n if (key === \"size\") {\n setSize(String(value));\n form.input.page.set(0);\n return;\n }\n\n props.onFilterChange?.(\n key,\n value,\n form as unknown as FormModel<Filters>,\n );\n },\n },\n [items],\n );\n\n const submitDebounce = useDebouncedCallback(() => form.submit(), {\n delay: 800,\n });\n\n const dt = useInject(DateTimeProvider);\n\n useEffect(() => {\n if (props.submitOnInit) {\n form.submit();\n }\n if (props.submitEvery) {\n const it = dt.createInterval(() => {\n form.submit();\n }, props.submitEvery);\n return () => dt.clearInterval(it);\n }\n }, []);\n\n useEffect(() => {\n if (typeof props.items !== \"function\") {\n setItems(props.items);\n }\n }, [props.items]);\n\n // Infinity scroll detection\n useEffect(() => {\n if (!props.infinityScroll || typeof props.items !== \"function\") return;\n\n const handleScroll = () => {\n if (form.submitting) return;\n\n const scrollTop = window.scrollY;\n const windowHeight = window.innerHeight;\n const docHeight = document.documentElement.scrollHeight;\n\n const isNearBottom = scrollTop + windowHeight >= docHeight - 300;\n\n if (isNearBottom) {\n const totalPages = items.page?.totalPages ?? 1;\n\n if (currentPage + 1 < totalPages) {\n form.input.page.set(currentPage + 1);\n }\n }\n };\n\n window.addEventListener(\"scroll\", handleScroll);\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [\n props.infinityScroll,\n form.submitting,\n items.page?.totalPages,\n currentPage,\n form,\n ]);\n\n // Checkbox header column\n const checkboxHeader = props.withCheckbox ? (\n <Table.Th style={{ width: 40 }}>\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAllSelection}\n aria-label=\"Select all\"\n />\n </Table.Th>\n ) : null;\n\n const head = visibleColumns.map(([key, col]) => {\n const sortField = col.sortKey || key;\n const sortDir = col.sortable\n ? getSortDirection(sortString, sortField)\n : null;\n\n const headerContent = (\n <Flex align=\"center\" gap={4}>\n <Text size=\"xs\">{col.label}</Text>\n {col.sortable && (\n <Flex c=\"dimmed\">\n {sortDir === \"asc\" && <IconArrowUp size={ui.sizes.icon.sm} />}\n {sortDir === \"desc\" && <IconArrowDown size={ui.sizes.icon.sm} />}\n {sortDir === null && <IconArrowsSort size={ui.sizes.icon.sm} />}\n </Flex>\n )}\n </Flex>\n );\n\n return (\n <Table.Th\n key={key}\n style={{\n ...(col.fit\n ? {\n // TODO: not working well (bad formatting in some cases)\n // width: \"1%\",\n // whiteSpace: \"nowrap\",\n }\n : {}),\n ...(col.sortable ? { cursor: \"pointer\" } : {}),\n }}\n >\n {col.sortable ? (\n <UnstyledButton onClick={() => handleSortClick(key, col.sortKey)}>\n {headerContent}\n </UnstyledButton>\n ) : (\n headerContent\n )}\n </Table.Th>\n );\n });\n\n const rows = items.content.map((item, index) => {\n const trProps = props.tableTrProps ? props.tableTrProps(item as T) : {};\n const itemKey = getItemKey(item as T);\n const isSelected = selectedKeys.has(itemKey);\n\n return (\n <Table.Tr key={itemKey} {...trProps}>\n {props.withCheckbox && (\n <Table.Td style={{ width: 40 }}>\n <Checkbox\n checked={isSelected}\n onChange={() => toggleItemSelection(item as T)}\n aria-label=\"Select row\"\n />\n </Table.Td>\n )}\n {visibleColumns.map(([key, col]) => (\n <Table.Td key={key}>\n {col.value(\n item as T,\n {\n index,\n form: form as unknown as FormModel<Filters>,\n alepha,\n } as DataTableColumnContext<Filters>,\n )}\n </Table.Td>\n ))}\n </Table.Tr>\n );\n });\n\n const filterSchema = useMemo(() => {\n if (!props.filters) return null;\n return t.omit(form.options.schema, [\"page\", \"size\", \"sort\"]);\n }, [props.filters, form.options.schema]);\n\n return (\n <Flex\n flex={1}\n p={0}\n bg=\"var(--alepha-elevated)\"\n bdrs=\"sm\"\n bd=\"1px solid var(--alepha-border)\"\n direction=\"column\"\n >\n <DataTableToolbar\n columns={props.columns}\n filters={props.filters}\n columnVisibility={columnVisibility}\n filterVisibility={filterVisibility}\n onColumnVisibilityChange={handleColumnVisibilityChange}\n onFilterVisibilityChange={handleFilterVisibilityChange}\n actions={props.actions}\n onRefresh={() => form.submit()}\n selectedItems={selectedItems}\n checkboxActions={props.checkboxActions}\n onClearSelection={clearSelection}\n />\n\n {filterSchema && props.filters && (\n <DataTableFilters\n schema={filterSchema}\n form={form as unknown as FormModel<TObject>}\n typeFormProps={\n props.typeFormProps as DataTableFiltersProps[\"typeFormProps\"]\n }\n filterVisibility={filterVisibility}\n />\n )}\n\n <Flex className=\"overflow-auto\">\n <Table withColumnBorders withRowBorders {...props.tableProps}>\n <Table.Thead>\n <Table.Tr>\n {checkboxHeader}\n {head}\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>{rows}</Table.Tbody>\n </Table>\n </Flex>\n\n {!props.infinityScroll && (\n <DataTablePagination\n page={page}\n size={size}\n totalPages={items.page?.totalPages ?? 1}\n onPageChange={(value) => {\n form.input.page.set(value - 1);\n }}\n onSizeChange={(value) => {\n form.input.size.set(value);\n }}\n />\n )}\n </Flex>\n );\n};\n\nexport default DataTable;\n","import { useInject } from \"alepha/react\";\nimport { DialogService } from \"../services/DialogService.tsx\";\n\n/**\n * Use this hook to access the Dialog Service for showing various dialog types.\n *\n * @example\n * ```tsx\n * const dialog = useDialog();\n * await dialog.alert({ title: \"Alert\", message: \"This is an alert message\" });\n * const confirmed = await dialog.confirm({ title: \"Confirm\", message: \"Are you sure?\" });\n * const input = await dialog.prompt({ title: \"Input\", message: \"Enter your name:\" });\n * ```\n */\nexport const useDialog = (): DialogService => {\n return useInject(DialogService);\n};\n","import { $context, $module, type Static } from \"alepha\";\nimport { AlephaReactForm } from \"alepha/react/form\";\nimport { AlephaReactHead } from \"alepha/react/head\";\nimport { AlephaReactI18n } from \"alepha/react/i18n\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { alephaSidebarAtom } from \"./atoms/alephaSidebarAtom.ts\";\nimport { alephaThemeAtom } from \"./atoms/alephaThemeAtom.ts\";\nimport type { ControlProps } from \"./components/form/Control.tsx\";\nimport { ThemeProvider } from \"./providers/ThemeProvider.ts\";\nimport { RootRouter } from \"./RootRouter.ts\";\nimport { DialogService } from \"./services/DialogService.tsx\";\nimport { ToastService } from \"./services/ToastService.tsx\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { Flex, Text } from \"@mantine/core\";\nexport * from \"./atoms/alephaSidebarAtom.ts\";\nexport * from \"./atoms/alephaThemeAtom.ts\";\nexport * from \"./atoms/alephaThemeListAtom.ts\";\nexport * from \"./atoms/themes/default.ts\";\nexport * from \"./atoms/themes/midnight.ts\";\nexport type {\n ActionClickButtonProps,\n ActionCommonProps,\n ActionMenuConfig,\n ActionMenuItem,\n ActionNavigationButtonProps,\n ActionProps,\n ActionSubmitButtonProps,\n} from \"./components/buttons/ActionButton.tsx\";\nexport { default as ActionButton } from \"./components/buttons/ActionButton.tsx\";\nexport { default as BurgerButton } from \"./components/buttons/BurgerButton.tsx\";\nexport type { ClipboardButtonProps } from \"./components/buttons/ClipboardButton.tsx\";\nexport { default as ClipboardButton } from \"./components/buttons/ClipboardButton.tsx\";\nexport { default as DarkModeButton } from \"./components/buttons/DarkModeButton.tsx\";\nexport { default as LanguageButton } from \"./components/buttons/LanguageButton.tsx\";\nexport { default as OmnibarButton } from \"./components/buttons/OmnibarButton.tsx\";\nexport type { ThemeButtonProps } from \"./components/buttons/ThemeButton.tsx\";\nexport { default as ThemeButton } from \"./components/buttons/ThemeButton.tsx\";\nexport { default as ToggleSidebarButton } from \"./components/buttons/ToggleSidebarButton.tsx\";\nexport { default as AlertDialog } from \"./components/dialogs/AlertDialog.tsx\";\nexport { default as ConfirmDialog } from \"./components/dialogs/ConfirmDialog.tsx\";\nexport { default as PromptDialog } from \"./components/dialogs/PromptDialog.tsx\";\nexport { default as Control } from \"./components/form/Control.tsx\";\nexport { default as ControlArray } from \"./components/form/ControlArray.tsx\";\nexport { default as ControlDate } from \"./components/form/ControlDate.tsx\";\nexport { default as ControlNumber } from \"./components/form/ControlNumber.tsx\";\nexport { default as ControlObject } from \"./components/form/ControlObject.tsx\";\nexport { default as ControlQueryBuilder } from \"./components/form/ControlQueryBuilder.tsx\";\nexport { default as ControlSelect } from \"./components/form/ControlSelect.tsx\";\nexport { default as TypeForm } from \"./components/form/TypeForm.tsx\";\nexport {\n type AdminShellProps,\n default as AdminShell,\n} from \"./components/layout/AdminShell.tsx\";\nexport { default as AlephaMantineProvider } from \"./components/layout/AlephaMantineProvider.tsx\";\nexport type {\n AppBarBurger,\n AppBarDark,\n AppBarDivider,\n AppBarElement,\n AppBarItem,\n AppBarLang,\n AppBarProps,\n AppBarSearch,\n AppBarSpacer,\n} from \"./components/layout/AppBar.tsx\";\nexport { default as AppBar } from \"./components/layout/AppBar.tsx\";\nexport { default as Omnibar } from \"./components/layout/Omnibar.tsx\";\nexport type {\n SidebarAbstractItem,\n SidebarButtonTheme,\n SidebarDivider,\n SidebarElement,\n SidebarItemProps,\n SidebarMenuItem,\n SidebarNode,\n SidebarProps,\n SidebarSearch,\n SidebarSection,\n SidebarSpacer,\n SidebarTheme,\n} from \"./components/layout/Sidebar.tsx\";\nexport { Sidebar } from \"./components/layout/Sidebar.tsx\";\nexport { default as DataTable } from \"./components/table/DataTable.tsx\";\nexport type {\n CheckboxAction,\n CheckboxActionContext,\n ColumnVisibility,\n DataTableColumn,\n DataTableColumnContext,\n DataTableProps,\n DataTableSubmitContext,\n FilterVisibility,\n MaybePage,\n} from \"./components/table/types.ts\";\nexport * from \"./constants/ui.ts\";\nexport { useDialog } from \"./hooks/useDialog.ts\";\nexport { useToast } from \"./hooks/useToast.ts\";\nexport * from \"./providers/ThemeProvider.ts\";\nexport * from \"./RootRouter.ts\";\nexport type {\n AlertDialogOptions,\n AlertDialogProps,\n BaseDialogOptions,\n ConfirmDialogOptions,\n ConfirmDialogProps,\n PromptDialogOptions,\n PromptDialogProps,\n} from \"./services/DialogService.tsx\";\nexport { DialogService } from \"./services/DialogService.tsx\";\nexport { ToastService } from \"./services/ToastService.tsx\";\nexport * from \"./utils/extractSchemaFields.ts\";\nexport * from \"./utils/icons.tsx\";\nexport * from \"./utils/string.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface TSchemaOptions {\n $control?: Omit<ControlProps, \"input\">;\n }\n}\n\ndeclare module \"alepha\" {\n interface State {\n [alephaSidebarAtom.key]?: Static<typeof alephaSidebarAtom.schema>;\n [alephaThemeAtom.key]?: Static<typeof alephaThemeAtom.schema>;\n }\n}\n\ndeclare module \"alepha/react/router\" {\n interface PagePrimitiveOptions {\n /**\n * Human-readable title for the page.\n * - for Sidebar navigation\n * - for Omnibar navigation\n * (soon)\n * - for Breadcrumbs\n * - for document title (with AlephaReactHead)\n */\n label?: string;\n\n /**\n * Optional description of the page.\n */\n description?: string;\n\n /**\n * Optional icon for the page.\n */\n icon?: ReactNode | ComponentType;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | frontend | rare | experimental |\n *\n * Core UI components based on Mantine UI v8.\n *\n * **Features:**\n * - Mantine integration with theme support\n * - ActionButton, BurgerButton, ClipboardButton, DarkModeButton, LanguageButton, ThemeButton\n * - AlertDialog, ConfirmDialog, PromptDialog\n * - Form controls: Control, ControlArray, ControlDate, ControlNumber, ControlObject, ControlSelect, ControlQueryBuilder\n * - TypeForm for automatic form generation from TypeBox schemas\n * - AdminShell layout component\n * - AppBar with configurable elements\n * - Sidebar navigation with sections and menu items\n * - Omnibar for command palette / search\n * - DataTable with filtering, sorting, pagination\n * - Toast notifications\n * - Theme system with dark mode\n *\n * @module alepha.ui\n */\nexport const AlephaUI = $module({\n name: \"alepha.ui\",\n services: [DialogService, ToastService, ThemeProvider, RootRouter],\n register: (alepha) => {\n alepha.with(AlephaReactI18n);\n alepha.with(AlephaReactHead);\n alepha.with(AlephaReactForm);\n alepha.with(ThemeProvider);\n alepha.with(DialogService);\n alepha.with(ToastService);\n },\n});\n\n/**\n * Register UI components and get the RootRouter instance.\n */\nexport const $ui = (\n opts: {\n // TODO:\n // theme?: ThemeOptions;\n // root?: string = \"/\";\n } = {},\n) => {\n const { alepha } = $context();\n\n // TODO: Register unique instance ? In order to have multiple ui apps in the same context ?\n // app = $ui();\n // admin = $ui({ root: \"/admin\", theme: adminTheme });\n // auth = $ui({ root: \"/auth\", theme: authTheme });\n // etc...\n\n /**\n * If multi ui, should we have N themes ? or one $atom theme but with change based on current ui app ?\n *\n * App (theme=T1) -> Admin (theme=T2) ?\n *\n * > It can be done with onLeave()/onEnter() of the RootRouter to set the theme atom.\n */\n\n return alepha.inject(RootRouter); // Inject as singleton ?\n};\n"],"mappings":"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"}