@maxal_studio/kratosjs-react 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/README.md +44 -0
  2. package/dist/FieldRenderer.d.ts +13 -0
  3. package/dist/FieldRenderer.js +62 -0
  4. package/dist/FormRenderer.d.ts +7 -0
  5. package/dist/FormRenderer.js +78 -0
  6. package/dist/TableRenderer.d.ts +2 -0
  7. package/dist/TableRenderer.js +1 -0
  8. package/dist/api/actionsApi.d.ts +23 -0
  9. package/dist/api/actionsApi.js +46 -0
  10. package/dist/api/authenticatedFetch.d.ts +8 -0
  11. package/dist/api/authenticatedFetch.js +31 -0
  12. package/dist/api/exportApi.d.ts +18 -0
  13. package/dist/api/exportApi.js +50 -0
  14. package/dist/api/http.d.ts +24 -0
  15. package/dist/api/http.js +52 -0
  16. package/dist/api/resourceApi.d.ts +37 -0
  17. package/dist/api/resourceApi.js +52 -0
  18. package/dist/api/tableApi.d.ts +83 -0
  19. package/dist/api/tableApi.js +51 -0
  20. package/dist/api/urls.d.ts +19 -0
  21. package/dist/api/urls.js +46 -0
  22. package/dist/app.d.ts +101 -0
  23. package/dist/app.js +89 -0
  24. package/dist/auth/AuthContext.d.ts +22 -0
  25. package/dist/auth/AuthContext.js +147 -0
  26. package/dist/auth/LoginPage.d.ts +10 -0
  27. package/dist/auth/LoginPage.js +179 -0
  28. package/dist/auth/ProtectedRoute.d.ts +12 -0
  29. package/dist/auth/ProtectedRoute.js +22 -0
  30. package/dist/auth/authApiClient.d.ts +24 -0
  31. package/dist/auth/authApiClient.js +95 -0
  32. package/dist/auth/types.d.ts +103 -0
  33. package/dist/auth/types.js +1 -0
  34. package/dist/components/ActionFormModal.d.ts +22 -0
  35. package/dist/components/ActionFormModal.js +8 -0
  36. package/dist/components/AdminPanel.d.ts +11 -0
  37. package/dist/components/AdminPanel.js +194 -0
  38. package/dist/components/Checkbox.d.ts +10 -0
  39. package/dist/components/Checkbox.js +8 -0
  40. package/dist/components/CheckboxField.d.ts +7 -0
  41. package/dist/components/CheckboxField.js +26 -0
  42. package/dist/components/ColorPickerField.d.ts +7 -0
  43. package/dist/components/ColorPickerField.js +26 -0
  44. package/dist/components/DateTimePickerField.d.ts +7 -0
  45. package/dist/components/DateTimePickerField.js +64 -0
  46. package/dist/components/FileUploadField.d.ts +9 -0
  47. package/dist/components/FileUploadField.js +478 -0
  48. package/dist/components/GlobalSearch.d.ts +22 -0
  49. package/dist/components/GlobalSearch.js +181 -0
  50. package/dist/components/GroupField.d.ts +7 -0
  51. package/dist/components/GroupField.js +23 -0
  52. package/dist/components/HiddenField.d.ts +3 -0
  53. package/dist/components/HiddenField.js +10 -0
  54. package/dist/components/ModalBreadcrumb.d.ts +5 -0
  55. package/dist/components/ModalBreadcrumb.js +33 -0
  56. package/dist/components/ModalDrawer.d.ts +15 -0
  57. package/dist/components/ModalDrawer.js +40 -0
  58. package/dist/components/RadioField.d.ts +7 -0
  59. package/dist/components/RadioField.js +26 -0
  60. package/dist/components/RepeaterField.d.ts +3 -0
  61. package/dist/components/RepeaterField.js +191 -0
  62. package/dist/components/ResourceModalRenderer.d.ts +10 -0
  63. package/dist/components/ResourceModalRenderer.js +80 -0
  64. package/dist/components/RichEditorField.d.ts +3 -0
  65. package/dist/components/RichEditorField.js +655 -0
  66. package/dist/components/SectionField.d.ts +9 -0
  67. package/dist/components/SectionField.js +111 -0
  68. package/dist/components/SelectField.d.ts +8 -0
  69. package/dist/components/SelectField.js +523 -0
  70. package/dist/components/TabsField.d.ts +10 -0
  71. package/dist/components/TabsField.js +214 -0
  72. package/dist/components/TagsInputField.d.ts +7 -0
  73. package/dist/components/TagsInputField.js +172 -0
  74. package/dist/components/TextInputField.d.ts +7 -0
  75. package/dist/components/TextInputField.js +44 -0
  76. package/dist/components/TextareaField.d.ts +7 -0
  77. package/dist/components/TextareaField.js +31 -0
  78. package/dist/components/ToggleField.d.ts +7 -0
  79. package/dist/components/ToggleField.js +57 -0
  80. package/dist/components/ViewModal.d.ts +25 -0
  81. package/dist/components/ViewModal.js +159 -0
  82. package/dist/components/blocks/BlockRenderer.d.ts +7 -0
  83. package/dist/components/blocks/BlockRenderer.js +36 -0
  84. package/dist/components/blocks/FormBlockRenderer.d.ts +6 -0
  85. package/dist/components/blocks/FormBlockRenderer.js +110 -0
  86. package/dist/components/blocks/TableBlockRenderer.d.ts +6 -0
  87. package/dist/components/blocks/TableBlockRenderer.js +12 -0
  88. package/dist/components/blocks/TabsBlockRenderer.d.ts +7 -0
  89. package/dist/components/blocks/TabsBlockRenderer.js +11 -0
  90. package/dist/components/blocks/WidgetBlockRenderer.d.ts +6 -0
  91. package/dist/components/blocks/WidgetBlockRenderer.js +11 -0
  92. package/dist/components/columns/CheckboxColumnComponent.d.ts +6 -0
  93. package/dist/components/columns/CheckboxColumnComponent.js +21 -0
  94. package/dist/components/columns/ColorColumnComponent.d.ts +3 -0
  95. package/dist/components/columns/ColorColumnComponent.js +11 -0
  96. package/dist/components/columns/DeeplinkWrapper.d.ts +15 -0
  97. package/dist/components/columns/DeeplinkWrapper.js +85 -0
  98. package/dist/components/columns/IconColumnComponent.d.ts +3 -0
  99. package/dist/components/columns/IconColumnComponent.js +52 -0
  100. package/dist/components/columns/ImageColumnComponent.d.ts +3 -0
  101. package/dist/components/columns/ImageColumnComponent.js +98 -0
  102. package/dist/components/columns/MediaColumnComponent.d.ts +3 -0
  103. package/dist/components/columns/MediaColumnComponent.js +160 -0
  104. package/dist/components/columns/SelectColumnComponent.d.ts +6 -0
  105. package/dist/components/columns/SelectColumnComponent.js +26 -0
  106. package/dist/components/columns/TagsColumnComponent.d.ts +3 -0
  107. package/dist/components/columns/TagsColumnComponent.js +18 -0
  108. package/dist/components/columns/TextColumnComponent.d.ts +11 -0
  109. package/dist/components/columns/TextColumnComponent.js +107 -0
  110. package/dist/components/columns/TextInputColumnComponent.d.ts +6 -0
  111. package/dist/components/columns/TextInputColumnComponent.js +18 -0
  112. package/dist/components/columns/ToggleColumnComponent.d.ts +6 -0
  113. package/dist/components/columns/ToggleColumnComponent.js +25 -0
  114. package/dist/components/columns/VideoColumnComponent.d.ts +3 -0
  115. package/dist/components/columns/VideoColumnComponent.js +125 -0
  116. package/dist/components/columns/ViewColumnComponent.d.ts +3 -0
  117. package/dist/components/columns/ViewColumnComponent.js +7 -0
  118. package/dist/components/errors/ErrorBoundary.d.ts +23 -0
  119. package/dist/components/errors/ErrorBoundary.js +33 -0
  120. package/dist/components/filters/CustomFilterComponent.d.ts +10 -0
  121. package/dist/components/filters/CustomFilterComponent.js +33 -0
  122. package/dist/components/filters/DateFilterComponent.d.ts +15 -0
  123. package/dist/components/filters/DateFilterComponent.js +132 -0
  124. package/dist/components/filters/QueryBuilderFilterComponent.d.ts +11 -0
  125. package/dist/components/filters/QueryBuilderFilterComponent.js +200 -0
  126. package/dist/components/layout/Header.d.ts +10 -0
  127. package/dist/components/layout/Header.js +70 -0
  128. package/dist/components/layout/PanelBrandMark.d.ts +8 -0
  129. package/dist/components/layout/PanelBrandMark.js +28 -0
  130. package/dist/components/layout/Sidebar.d.ts +35 -0
  131. package/dist/components/layout/Sidebar.js +125 -0
  132. package/dist/components/modals/RelationCreateModal.d.ts +19 -0
  133. package/dist/components/modals/RelationCreateModal.js +57 -0
  134. package/dist/components/modals/ResourceFormModal.d.ts +37 -0
  135. package/dist/components/modals/ResourceFormModal.js +44 -0
  136. package/dist/components/modals/useResourceForm.d.ts +40 -0
  137. package/dist/components/modals/useResourceForm.js +138 -0
  138. package/dist/components/modals/view/RecordActions.d.ts +17 -0
  139. package/dist/components/modals/view/RecordActions.js +16 -0
  140. package/dist/components/modals/view/RecordDetails.d.ts +13 -0
  141. package/dist/components/modals/view/RecordDetails.js +29 -0
  142. package/dist/components/modals/view/RelationPanel.d.ts +18 -0
  143. package/dist/components/modals/view/RelationPanel.js +16 -0
  144. package/dist/components/modals/view/RelationTabs.d.ts +32 -0
  145. package/dist/components/modals/view/RelationTabs.js +42 -0
  146. package/dist/components/modals/view/useRecordView.d.ts +18 -0
  147. package/dist/components/modals/view/useRecordView.js +114 -0
  148. package/dist/components/pages/PageRenderer.d.ts +6 -0
  149. package/dist/components/pages/PageRenderer.js +107 -0
  150. package/dist/components/table/ColumnTogglePopup.d.ts +11 -0
  151. package/dist/components/table/ColumnTogglePopup.js +16 -0
  152. package/dist/components/table/GridCard.d.ts +21 -0
  153. package/dist/components/table/GridCard.js +30 -0
  154. package/dist/components/table/GridView.d.ts +23 -0
  155. package/dist/components/table/GridView.js +49 -0
  156. package/dist/components/table/LayoutToggle.d.ts +7 -0
  157. package/dist/components/table/LayoutToggle.js +9 -0
  158. package/dist/components/table/TableActionsDropdown.d.ts +13 -0
  159. package/dist/components/table/TableActionsDropdown.js +46 -0
  160. package/dist/components/table/TableBulkActions.d.ts +11 -0
  161. package/dist/components/table/TableBulkActions.js +21 -0
  162. package/dist/components/table/TableHeader.d.ts +14 -0
  163. package/dist/components/table/TableHeader.js +23 -0
  164. package/dist/components/table/TablePagination.d.ts +13 -0
  165. package/dist/components/table/TablePagination.js +55 -0
  166. package/dist/components/table/TableRow.d.ts +21 -0
  167. package/dist/components/table/TableRow.js +32 -0
  168. package/dist/components/table/TableSearchBar.d.ts +11 -0
  169. package/dist/components/table/TableSearchBar.js +12 -0
  170. package/dist/components/table/TableTabs.d.ts +14 -0
  171. package/dist/components/table/TableTabs.js +8 -0
  172. package/dist/components/ui/Badge.d.ts +6 -0
  173. package/dist/components/ui/Badge.js +12 -0
  174. package/dist/components/ui/Button.d.ts +22 -0
  175. package/dist/components/ui/Button.js +22 -0
  176. package/dist/components/ui/Card.d.ts +7 -0
  177. package/dist/components/ui/Card.js +5 -0
  178. package/dist/components/ui/ConfirmDialog.d.ts +19 -0
  179. package/dist/components/ui/ConfirmDialog.js +45 -0
  180. package/dist/components/ui/EmptyState.d.ts +9 -0
  181. package/dist/components/ui/EmptyState.js +6 -0
  182. package/dist/components/ui/ErrorAlert.d.ts +7 -0
  183. package/dist/components/ui/ErrorAlert.js +9 -0
  184. package/dist/components/ui/Input.d.ts +11 -0
  185. package/dist/components/ui/Input.js +10 -0
  186. package/dist/components/ui/Label.d.ts +5 -0
  187. package/dist/components/ui/Label.js +5 -0
  188. package/dist/components/ui/PillButton.d.ts +14 -0
  189. package/dist/components/ui/PillButton.js +19 -0
  190. package/dist/components/ui/Select.d.ts +7 -0
  191. package/dist/components/ui/Select.js +7 -0
  192. package/dist/components/ui/Spinner.d.ts +8 -0
  193. package/dist/components/ui/Spinner.js +14 -0
  194. package/dist/components/ui/Toast.d.ts +21 -0
  195. package/dist/components/ui/Toast.js +47 -0
  196. package/dist/components/ui/index.d.ts +24 -0
  197. package/dist/components/ui/index.js +12 -0
  198. package/dist/components/utils/HintDisplay.d.ts +11 -0
  199. package/dist/components/utils/HintDisplay.js +12 -0
  200. package/dist/components/utils/Icon.d.ts +22 -0
  201. package/dist/components/utils/Icon.js +22 -0
  202. package/dist/components/utils/MediaPreviewModal.d.ts +14 -0
  203. package/dist/components/utils/MediaPreviewModal.js +32 -0
  204. package/dist/components/utils/ViewFieldWrapper.d.ts +11 -0
  205. package/dist/components/utils/ViewFieldWrapper.js +9 -0
  206. package/dist/components/utils/layoutHelpers.d.ts +19 -0
  207. package/dist/components/utils/layoutHelpers.js +257 -0
  208. package/dist/components/widgets/ChartWidget.d.ts +16 -0
  209. package/dist/components/widgets/ChartWidget.js +192 -0
  210. package/dist/components/widgets/StatsWidget.d.ts +16 -0
  211. package/dist/components/widgets/StatsWidget.js +39 -0
  212. package/dist/components/widgets/WidgetRenderer.d.ts +10 -0
  213. package/dist/components/widgets/WidgetRenderer.js +50 -0
  214. package/dist/components/widgets/WidgetShell.d.ts +9 -0
  215. package/dist/components/widgets/WidgetShell.js +7 -0
  216. package/dist/contexts/AuthChallengeRegistryContext.d.ts +15 -0
  217. package/dist/contexts/AuthChallengeRegistryContext.js +15 -0
  218. package/dist/contexts/BlockRegistryContext.d.ts +18 -0
  219. package/dist/contexts/BlockRegistryContext.js +8 -0
  220. package/dist/contexts/ColumnRegistryContext.d.ts +8 -0
  221. package/dist/contexts/ColumnRegistryContext.js +30 -0
  222. package/dist/contexts/FieldRegistryContext.d.ts +13 -0
  223. package/dist/contexts/FieldRegistryContext.js +46 -0
  224. package/dist/contexts/PanelMetadataContext.d.ts +26 -0
  225. package/dist/contexts/PanelMetadataContext.js +26 -0
  226. package/dist/contexts/PanelProviders.d.ts +27 -0
  227. package/dist/contexts/PanelProviders.js +24 -0
  228. package/dist/contexts/ResourceModalContext.d.ts +26 -0
  229. package/dist/contexts/ResourceModalContext.js +76 -0
  230. package/dist/contexts/SlotRegistryContext.d.ts +19 -0
  231. package/dist/contexts/SlotRegistryContext.js +24 -0
  232. package/dist/contexts/TableRefreshContext.d.ts +10 -0
  233. package/dist/contexts/TableRefreshContext.js +30 -0
  234. package/dist/contexts/WidgetRegistryContext.d.ts +17 -0
  235. package/dist/contexts/WidgetRegistryContext.js +14 -0
  236. package/dist/contexts/createRegistryContext.d.ts +19 -0
  237. package/dist/contexts/createRegistryContext.js +20 -0
  238. package/dist/hooks/useAfterStateUpdated.d.ts +6 -0
  239. package/dist/hooks/useAfterStateUpdated.js +62 -0
  240. package/dist/hooks/useValidation.d.ts +26 -0
  241. package/dist/hooks/useValidation.js +76 -0
  242. package/dist/i18n/I18nProvider.d.ts +27 -0
  243. package/dist/i18n/I18nProvider.js +101 -0
  244. package/dist/i18n/LocaleSwitcher.d.ts +10 -0
  245. package/dist/i18n/LocaleSwitcher.js +30 -0
  246. package/dist/i18n/activeLocale.d.ts +11 -0
  247. package/dist/i18n/activeLocale.js +34 -0
  248. package/dist/i18n/buildClientI18n.d.ts +28 -0
  249. package/dist/i18n/buildClientI18n.js +67 -0
  250. package/dist/i18n/index.d.ts +11 -0
  251. package/dist/i18n/index.js +9 -0
  252. package/dist/i18n/locales/core/en.d.ts +225 -0
  253. package/dist/i18n/locales/core/en.js +252 -0
  254. package/dist/i18n/locales/core/index.d.ts +2 -0
  255. package/dist/i18n/locales/core/index.js +4 -0
  256. package/dist/i18n/locales/core/sq.d.ts +253 -0
  257. package/dist/i18n/locales/core/sq.js +255 -0
  258. package/dist/i18n/useFormatter.d.ts +18 -0
  259. package/dist/i18n/useFormatter.js +37 -0
  260. package/dist/i18n/useLocale.d.ts +11 -0
  261. package/dist/i18n/useLocale.js +11 -0
  262. package/dist/i18n/useTranslation.d.ts +12 -0
  263. package/dist/i18n/useTranslation.js +12 -0
  264. package/dist/index.d.ts +106 -0
  265. package/dist/index.js +101 -0
  266. package/dist/pages/ResourceListPage.d.ts +8 -0
  267. package/dist/pages/ResourceListPage.js +139 -0
  268. package/dist/plugin.d.ts +79 -0
  269. package/dist/plugin.js +34 -0
  270. package/dist/runtime/conditions.d.ts +35 -0
  271. package/dist/runtime/conditions.js +97 -0
  272. package/dist/runtime/formTraversal.d.ts +25 -0
  273. package/dist/runtime/formTraversal.js +37 -0
  274. package/dist/runtime/serializedFunctions.d.ts +41 -0
  275. package/dist/runtime/serializedFunctions.js +264 -0
  276. package/dist/slots/Slot.d.ts +24 -0
  277. package/dist/slots/Slot.js +29 -0
  278. package/dist/slots/SlotCluster.d.ts +22 -0
  279. package/dist/slots/SlotCluster.js +49 -0
  280. package/dist/slots/index.d.ts +7 -0
  281. package/dist/slots/index.js +4 -0
  282. package/dist/slots/mergeSlots.d.ts +18 -0
  283. package/dist/slots/mergeSlots.js +35 -0
  284. package/dist/slots/types.d.ts +87 -0
  285. package/dist/slots/types.js +30 -0
  286. package/dist/styles.css +1 -0
  287. package/dist/table/TableContext.d.ts +36 -0
  288. package/dist/table/TableContext.js +13 -0
  289. package/dist/table/TableRenderer.d.ts +29 -0
  290. package/dist/table/TableRenderer.js +159 -0
  291. package/dist/table/components/FiltersPanel.d.ts +11 -0
  292. package/dist/table/components/FiltersPanel.js +52 -0
  293. package/dist/table/components/TableToolbar.d.ts +28 -0
  294. package/dist/table/components/TableToolbar.js +27 -0
  295. package/dist/table/components/TableToolbarButton.d.ts +6 -0
  296. package/dist/table/components/TableToolbarButton.js +9 -0
  297. package/dist/table/components/TableView.d.ts +12 -0
  298. package/dist/table/components/TableView.js +21 -0
  299. package/dist/table/defaultRowActions.d.ts +21 -0
  300. package/dist/table/defaultRowActions.js +37 -0
  301. package/dist/table/hooks/useColumnVisibility.d.ts +13 -0
  302. package/dist/table/hooks/useColumnVisibility.js +59 -0
  303. package/dist/table/hooks/useEditableRows.d.ts +22 -0
  304. package/dist/table/hooks/useEditableRows.js +63 -0
  305. package/dist/table/hooks/useTableActions.d.ts +54 -0
  306. package/dist/table/hooks/useTableActions.js +313 -0
  307. package/dist/table/hooks/useTableData.d.ts +28 -0
  308. package/dist/table/hooks/useTableData.js +63 -0
  309. package/dist/table/hooks/useTableLayout.d.ts +12 -0
  310. package/dist/table/hooks/useTableLayout.js +31 -0
  311. package/dist/table/hooks/useTableQuery.d.ts +29 -0
  312. package/dist/table/hooks/useTableQuery.js +135 -0
  313. package/dist/types/index.d.ts +224 -0
  314. package/dist/types/index.js +6 -0
  315. package/dist/utils/classNames.d.ts +7 -0
  316. package/dist/utils/classNames.js +9 -0
  317. package/dist/utils/columnMediaDimensions.d.ts +13 -0
  318. package/dist/utils/columnMediaDimensions.js +29 -0
  319. package/dist/utils/columnVisibilityStorage.d.ts +22 -0
  320. package/dist/utils/columnVisibilityStorage.js +56 -0
  321. package/dist/utils/fieldErrors.d.ts +13 -0
  322. package/dist/utils/fieldErrors.js +25 -0
  323. package/dist/utils/formatValue.d.ts +28 -0
  324. package/dist/utils/formatValue.js +109 -0
  325. package/dist/utils/layoutStorage.d.ts +23 -0
  326. package/dist/utils/layoutStorage.js +53 -0
  327. package/dist/utils/redirectHandler.d.ts +7 -0
  328. package/dist/utils/redirectHandler.js +25 -0
  329. package/dist/utils/tableFormatters.d.ts +14 -0
  330. package/dist/utils/tableFormatters.js +93 -0
  331. package/dist/utils/widgetVisibilityStorage.d.ts +11 -0
  332. package/dist/utils/widgetVisibilityStorage.js +39 -0
  333. package/package.json +101 -0
  334. package/src/FieldRenderer.test.tsx +44 -0
  335. package/src/FieldRenderer.tsx +104 -0
  336. package/src/FormRenderer.containers.test.tsx +121 -0
  337. package/src/FormRenderer.test.tsx +174 -0
  338. package/src/FormRenderer.tsx +140 -0
  339. package/src/TableRenderer.tsx +2 -0
  340. package/src/api/actionsApi.ts +76 -0
  341. package/src/api/authenticatedFetch.ts +40 -0
  342. package/src/api/exportApi.ts +66 -0
  343. package/src/api/http.test.ts +58 -0
  344. package/src/api/http.ts +68 -0
  345. package/src/api/resourceApi.ts +88 -0
  346. package/src/api/tableApi.test.ts +108 -0
  347. package/src/api/tableApi.ts +107 -0
  348. package/src/api/urls.ts +50 -0
  349. package/src/app.test.tsx +67 -0
  350. package/src/app.tsx +181 -0
  351. package/src/auth/AuthContext.tsx +188 -0
  352. package/src/auth/LoginPage.tsx +380 -0
  353. package/src/auth/ProtectedRoute.tsx +39 -0
  354. package/src/auth/authApiClient.ts +109 -0
  355. package/src/auth/authFlow.test.tsx +168 -0
  356. package/src/auth/types.ts +104 -0
  357. package/src/components/ActionFormModal.tsx +45 -0
  358. package/src/components/AdminPanel.tsx +368 -0
  359. package/src/components/Checkbox.tsx +59 -0
  360. package/src/components/CheckboxField.tsx +88 -0
  361. package/src/components/ColorPickerField.tsx +93 -0
  362. package/src/components/DateTimePickerField.tsx +112 -0
  363. package/src/components/FileUploadField.tsx +841 -0
  364. package/src/components/GlobalSearch.tsx +436 -0
  365. package/src/components/GroupField.tsx +85 -0
  366. package/src/components/HiddenField.tsx +14 -0
  367. package/src/components/ModalBreadcrumb.tsx +74 -0
  368. package/src/components/ModalDrawer.tsx +137 -0
  369. package/src/components/RadioField.tsx +80 -0
  370. package/src/components/RepeaterField.tsx +546 -0
  371. package/src/components/ResourceModalRenderer.tsx +144 -0
  372. package/src/components/RichEditorField.tsx +942 -0
  373. package/src/components/SectionField.tsx +242 -0
  374. package/src/components/SelectField.tsx +843 -0
  375. package/src/components/TabsField.test.tsx +151 -0
  376. package/src/components/TabsField.tsx +386 -0
  377. package/src/components/TagsInputField.tsx +411 -0
  378. package/src/components/TextInputField.tsx +91 -0
  379. package/src/components/TextareaField.tsx +110 -0
  380. package/src/components/ToggleField.tsx +126 -0
  381. package/src/components/ViewModal.tsx +353 -0
  382. package/src/components/blocks/BlockRenderer.tsx +56 -0
  383. package/src/components/blocks/FormBlockRenderer.tsx +160 -0
  384. package/src/components/blocks/TableBlockRenderer.tsx +33 -0
  385. package/src/components/blocks/TabsBlockRenderer.tsx +49 -0
  386. package/src/components/blocks/WidgetBlockRenderer.tsx +19 -0
  387. package/src/components/columns/CheckboxColumnComponent.tsx +38 -0
  388. package/src/components/columns/ColorColumnComponent.tsx +23 -0
  389. package/src/components/columns/CustomColumn.test.tsx +55 -0
  390. package/src/components/columns/DeeplinkWrapper.tsx +103 -0
  391. package/src/components/columns/IconColumnComponent.tsx +55 -0
  392. package/src/components/columns/ImageColumnComponent.tsx +220 -0
  393. package/src/components/columns/MediaColumnComponent.tsx +294 -0
  394. package/src/components/columns/SelectColumnComponent.tsx +49 -0
  395. package/src/components/columns/TagsColumnComponent.tsx +46 -0
  396. package/src/components/columns/TextColumnComponent.tsx +191 -0
  397. package/src/components/columns/TextInputColumnComponent.tsx +35 -0
  398. package/src/components/columns/ToggleColumnComponent.tsx +56 -0
  399. package/src/components/columns/VideoColumnComponent.tsx +236 -0
  400. package/src/components/columns/ViewColumnComponent.tsx +9 -0
  401. package/src/components/errors/ErrorBoundary.tsx +58 -0
  402. package/src/components/filters/CustomFilterComponent.tsx +130 -0
  403. package/src/components/filters/DateFilterComponent.tsx +272 -0
  404. package/src/components/filters/QueryBuilderFilterComponent.tsx +502 -0
  405. package/src/components/layout/Header.tsx +212 -0
  406. package/src/components/layout/PanelBrandMark.tsx +61 -0
  407. package/src/components/layout/Sidebar.tsx +283 -0
  408. package/src/components/modals/RelationCreateModal.tsx +107 -0
  409. package/src/components/modals/ResourceFormModal.test.tsx +119 -0
  410. package/src/components/modals/ResourceFormModal.tsx +128 -0
  411. package/src/components/modals/useResourceForm.ts +207 -0
  412. package/src/components/modals/view/RecordActions.tsx +69 -0
  413. package/src/components/modals/view/RecordDetails.tsx +60 -0
  414. package/src/components/modals/view/RelationPanel.tsx +76 -0
  415. package/src/components/modals/view/RelationTabs.tsx +145 -0
  416. package/src/components/modals/view/useRecordView.ts +134 -0
  417. package/src/components/pages/PageRenderer.tsx +173 -0
  418. package/src/components/table/ColumnTogglePopup.tsx +85 -0
  419. package/src/components/table/GridCard.tsx +155 -0
  420. package/src/components/table/GridView.tsx +138 -0
  421. package/src/components/table/LayoutToggle.tsx +24 -0
  422. package/src/components/table/TableActionsDropdown.tsx +114 -0
  423. package/src/components/table/TableBulkActions.tsx +65 -0
  424. package/src/components/table/TableHeader.tsx +96 -0
  425. package/src/components/table/TablePagination.tsx +169 -0
  426. package/src/components/table/TableRow.tsx +155 -0
  427. package/src/components/table/TableSearchBar.tsx +66 -0
  428. package/src/components/table/TableTabs.tsx +49 -0
  429. package/src/components/ui/Badge.tsx +30 -0
  430. package/src/components/ui/Button.test.tsx +78 -0
  431. package/src/components/ui/Button.tsx +102 -0
  432. package/src/components/ui/Card.tsx +23 -0
  433. package/src/components/ui/ConfirmDialog.tsx +112 -0
  434. package/src/components/ui/EmptyState.tsx +24 -0
  435. package/src/components/ui/ErrorAlert.tsx +37 -0
  436. package/src/components/ui/Input.tsx +48 -0
  437. package/src/components/ui/Label.tsx +15 -0
  438. package/src/components/ui/PillButton.tsx +72 -0
  439. package/src/components/ui/Select.tsx +33 -0
  440. package/src/components/ui/Spinner.tsx +39 -0
  441. package/src/components/ui/Toast.tsx +105 -0
  442. package/src/components/ui/index.ts +24 -0
  443. package/src/components/utils/HintDisplay.tsx +26 -0
  444. package/src/components/utils/Icon.tsx +36 -0
  445. package/src/components/utils/MediaPreviewModal.tsx +114 -0
  446. package/src/components/utils/ViewFieldWrapper.tsx +23 -0
  447. package/src/components/utils/layoutHelpers.ts +267 -0
  448. package/src/components/widgets/ChartWidget.tsx +247 -0
  449. package/src/components/widgets/StatsWidget.tsx +72 -0
  450. package/src/components/widgets/WidgetRenderer.tsx +108 -0
  451. package/src/components/widgets/WidgetShell.tsx +37 -0
  452. package/src/contexts/AuthChallengeRegistryContext.tsx +29 -0
  453. package/src/contexts/BlockRegistryContext.tsx +28 -0
  454. package/src/contexts/ColumnRegistryContext.tsx +38 -0
  455. package/src/contexts/FieldRegistryContext.tsx +56 -0
  456. package/src/contexts/PanelMetadataContext.tsx +60 -0
  457. package/src/contexts/PanelProviders.tsx +85 -0
  458. package/src/contexts/ResourceModalContext.tsx +137 -0
  459. package/src/contexts/SlotRegistryContext.tsx +35 -0
  460. package/src/contexts/TableRefreshContext.tsx +44 -0
  461. package/src/contexts/WidgetRegistryContext.tsx +34 -0
  462. package/src/contexts/createRegistryContext.tsx +29 -0
  463. package/src/hooks/useAfterStateUpdated.ts +70 -0
  464. package/src/hooks/useValidation.test.ts +59 -0
  465. package/src/hooks/useValidation.ts +95 -0
  466. package/src/i18n/I18nProvider.tsx +128 -0
  467. package/src/i18n/LocaleSwitcher.tsx +50 -0
  468. package/src/i18n/activeLocale.ts +39 -0
  469. package/src/i18n/buildClientI18n.ts +101 -0
  470. package/src/i18n/i18n.test.tsx +140 -0
  471. package/src/i18n/index.ts +12 -0
  472. package/src/i18n/locales/core/en.ts +274 -0
  473. package/src/i18n/locales/core/index.ts +5 -0
  474. package/src/i18n/locales/core/sq.ts +275 -0
  475. package/src/i18n/useFormatter.ts +42 -0
  476. package/src/i18n/useLocale.ts +16 -0
  477. package/src/i18n/useTranslation.ts +17 -0
  478. package/src/index.ts +244 -0
  479. package/src/pages/ResourceListPage.tsx +205 -0
  480. package/src/plugin.ts +110 -0
  481. package/src/runtime/conditions.test.ts +99 -0
  482. package/src/runtime/conditions.ts +148 -0
  483. package/src/runtime/formTraversal.ts +41 -0
  484. package/src/runtime/serializedFunctions.test.ts +59 -0
  485. package/src/runtime/serializedFunctions.ts +284 -0
  486. package/src/slots/Slot.test.tsx +89 -0
  487. package/src/slots/Slot.tsx +47 -0
  488. package/src/slots/SlotCluster.test.tsx +95 -0
  489. package/src/slots/SlotCluster.tsx +107 -0
  490. package/src/slots/index.ts +15 -0
  491. package/src/slots/mergeSlots.test.ts +71 -0
  492. package/src/slots/mergeSlots.ts +40 -0
  493. package/src/slots/slotNames.test.ts +21 -0
  494. package/src/slots/types.ts +119 -0
  495. package/src/styles.css +437 -0
  496. package/src/table/TableContext.tsx +41 -0
  497. package/src/table/TableRenderer.test.tsx +197 -0
  498. package/src/table/TableRenderer.tsx +390 -0
  499. package/src/table/components/FiltersPanel.tsx +193 -0
  500. package/src/table/components/TableToolbar.tsx +153 -0
  501. package/src/table/components/TableToolbarButton.tsx +14 -0
  502. package/src/table/components/TableView.tsx +106 -0
  503. package/src/table/defaultRowActions.ts +43 -0
  504. package/src/table/hooks/useColumnVisibility.test.ts +51 -0
  505. package/src/table/hooks/useColumnVisibility.ts +71 -0
  506. package/src/table/hooks/useEditableRows.test.ts +69 -0
  507. package/src/table/hooks/useEditableRows.ts +89 -0
  508. package/src/table/hooks/useTableActions.ts +393 -0
  509. package/src/table/hooks/useTableData.ts +89 -0
  510. package/src/table/hooks/useTableLayout.ts +45 -0
  511. package/src/table/hooks/useTableQuery.test.ts +116 -0
  512. package/src/table/hooks/useTableQuery.ts +172 -0
  513. package/src/test/mockFetch.ts +67 -0
  514. package/src/test/setup.ts +25 -0
  515. package/src/types/index.ts +228 -0
  516. package/src/utils/classNames.ts +10 -0
  517. package/src/utils/columnMediaDimensions.ts +45 -0
  518. package/src/utils/columnVisibilityStorage.ts +55 -0
  519. package/src/utils/fieldErrors.test.ts +35 -0
  520. package/src/utils/fieldErrors.ts +27 -0
  521. package/src/utils/formatValue.test.tsx +65 -0
  522. package/src/utils/formatValue.tsx +117 -0
  523. package/src/utils/layoutStorage.ts +52 -0
  524. package/src/utils/redirectHandler.ts +29 -0
  525. package/src/utils/tableFormatters.test.ts +54 -0
  526. package/src/utils/tableFormatters.ts +104 -0
  527. package/src/utils/widgetVisibilityStorage.ts +38 -0
  528. package/tailwind.config.js +9 -0
  529. package/vite.config.ts +17 -0
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface WidgetRendererProps {
3
+ widgets?: any[];
4
+ widgetData?: Record<string, any>;
5
+ className?: string;
6
+ /** When set, controlled mode: no internal toggle, use this value and callback */
7
+ expanded?: boolean;
8
+ onExpandedChange?: (expanded: boolean) => void;
9
+ }
10
+ export declare function WidgetRenderer({ widgets, widgetData, className, expanded: controlledExpanded, onExpandedChange, }: WidgetRendererProps): React.JSX.Element;
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { ChevronDown, ChevronUp } from 'lucide-react';
4
+ import { useWidgetRegistry } from '../../contexts/WidgetRegistryContext';
5
+ import { ErrorBoundary } from '../errors/ErrorBoundary';
6
+ import { Slot } from '../../slots/Slot';
7
+ import { cn } from '../../utils/classNames';
8
+ import { widgetVisibilityStorage, getDefaultWidgetsExpanded } from '../../utils/widgetVisibilityStorage';
9
+ import { PillButton } from '../ui/PillButton';
10
+ import { translate } from '../../i18n/activeLocale';
11
+ export function WidgetRenderer({ widgets, widgetData, className, expanded: controlledExpanded, onExpandedChange, }) {
12
+ const widgetRegistry = useWidgetRegistry();
13
+ const [internalExpanded, setInternalExpanded] = useState(false);
14
+ const isControlled = controlledExpanded !== undefined && onExpandedChange !== undefined;
15
+ const expanded = isControlled ? controlledExpanded : internalExpanded;
16
+ useEffect(() => {
17
+ if (isControlled)
18
+ return;
19
+ const stored = widgetVisibilityStorage.get();
20
+ if (stored !== null) {
21
+ setInternalExpanded(stored);
22
+ }
23
+ else {
24
+ setInternalExpanded(getDefaultWidgetsExpanded());
25
+ }
26
+ }, [isControlled]);
27
+ const toggleExpanded = () => {
28
+ const next = !expanded;
29
+ if (isControlled) {
30
+ widgetVisibilityStorage.set(next);
31
+ onExpandedChange(next);
32
+ }
33
+ else {
34
+ setInternalExpanded(next);
35
+ widgetVisibilityStorage.set(next);
36
+ }
37
+ };
38
+ if (!widgets || widgets.length === 0) {
39
+ return null;
40
+ }
41
+ return (_jsxs("div", { className: cn('mb-4', className), children: [!isControlled && (_jsx("div", { className: "mb-2 flex justify-end", children: _jsx(PillButton, { variant: "default", onClick: toggleExpanded, "aria-expanded": expanded, "aria-controls": "widgets-content", id: "widgets-toggle", icon: expanded ? _jsx(ChevronUp, { className: "h-4 w-4" }) : _jsx(ChevronDown, { className: "h-4 w-4" }), children: translate('core:common.widgets') }) })), _jsx("div", { id: "widgets-content", role: "region", "aria-labelledby": "widgets-toggle", className: cn('overflow-hidden transition-[grid-template-rows] duration-200 ease-out', expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'), style: { display: 'grid' }, children: _jsx("div", { className: "min-h-0", children: _jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4", children: [widgets.map(widget => {
42
+ const WidgetComponent = widgetRegistry[widget.type];
43
+ if (!WidgetComponent) {
44
+ console.warn(`Widget type "${widget.type}" not registered`);
45
+ return null;
46
+ }
47
+ const data = widgetData?.[widget.name] ?? null;
48
+ return (_jsx("div", { className: "min-w-0", children: _jsx(ErrorBoundary, { label: `widget "${widget.name}"`, children: _jsx(WidgetComponent, { widget: widget, data: data }) }) }, widget.name));
49
+ }), _jsx(Slot, { name: "widgets.append" })] }) }) })] }));
50
+ }
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface WidgetShellProps {
3
+ label?: string;
4
+ icon?: string;
5
+ className?: string;
6
+ children: React.ReactNode;
7
+ }
8
+ /** Shared card shell for dashboard/table widgets. */
9
+ export declare function WidgetShell({ label, icon, className, children }: WidgetShellProps): React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from '../utils/Icon';
3
+ import { cn } from '../../utils/classNames';
4
+ /** Shared card shell for dashboard/table widgets. */
5
+ export function WidgetShell({ label, icon, className, children }) {
6
+ return (_jsxs("div", { className: cn('flex min-h-[8.5rem] flex-col rounded-xl border border-border bg-surface p-4 transition-colors hover:bg-hover/20', className), children: [(label || icon) && (_jsxs("div", { className: "mb-3 flex items-start justify-between gap-2", children: [label ? (_jsx("p", { className: "text-[11px] font-medium uppercase tracking-wider text-fg-muted", children: label })) : (_jsx("span", {})), icon && (_jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-raised text-fg-secondary shadow-soft-sm", children: _jsx(Icon, { name: icon, className: "h-4 w-4" }) }))] })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: children })] }));
7
+ }
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { AuthChallengeComponent } from '../auth/types';
3
+ export type AuthChallengeRegistry = Record<string, AuthChallengeComponent>;
4
+ export declare const AuthChallengeRegistryContext: React.Context<Record<string, AuthChallengeComponent>>;
5
+ export declare const useAuthChallengeRegistry: () => Record<string, AuthChallengeComponent>;
6
+ export interface AuthChallengeRegistryProviderProps {
7
+ customAuthChallenges?: AuthChallengeRegistry;
8
+ children: React.ReactNode;
9
+ }
10
+ /**
11
+ * Provider for challenge UI components keyed by challenge `type`. Lives above the auth gate
12
+ * so the LoginPage (rendered when there is no user) can look up the component for a pending
13
+ * challenge.
14
+ */
15
+ export declare function AuthChallengeRegistryProvider({ customAuthChallenges, children, }: AuthChallengeRegistryProviderProps): React.JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRegistryContext } from './createRegistryContext';
3
+ // No built-in challenge UIs: challenge components are entirely plugin-provided
4
+ // (e.g. the 2FA plugin registers a '2fa-totp' component).
5
+ const registry = createRegistryContext('AuthChallengeRegistry', {});
6
+ export const AuthChallengeRegistryContext = registry.Context;
7
+ export const useAuthChallengeRegistry = registry.useRegistry;
8
+ /**
9
+ * Provider for challenge UI components keyed by challenge `type`. Lives above the auth gate
10
+ * so the LoginPage (rendered when there is no user) can look up the component for a pending
11
+ * challenge.
12
+ */
13
+ export function AuthChallengeRegistryProvider({ customAuthChallenges = {}, children, }) {
14
+ return _jsx(registry.Provider, { registry: customAuthChallenges, children: children });
15
+ }
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ export interface CustomBlockComponentProps {
3
+ block: any;
4
+ blockData?: Record<string, any>;
5
+ apiBaseUrl?: string;
6
+ }
7
+ export type CustomBlockComponent = React.ComponentType<CustomBlockComponentProps>;
8
+ export interface BlockRegistry {
9
+ [key: string]: CustomBlockComponent;
10
+ }
11
+ interface BlockRegistryProviderProps {
12
+ children: React.ReactNode;
13
+ customBlocks?: BlockRegistry;
14
+ }
15
+ export declare function BlockRegistryProvider({ children, customBlocks }: BlockRegistryProviderProps): React.JSX.Element;
16
+ /** Returns the flat block registry (custom page blocks keyed by type). */
17
+ export declare const useBlockRegistry: () => Record<string, CustomBlockComponent>;
18
+ export {};
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRegistryContext } from './createRegistryContext';
3
+ const registry = createRegistryContext('BlockRegistry', {});
4
+ export function BlockRegistryProvider({ children, customBlocks }) {
5
+ return _jsx(registry.Provider, { registry: customBlocks, children: children });
6
+ }
7
+ /** Returns the flat block registry (custom page blocks keyed by type). */
8
+ export const useBlockRegistry = registry.useRegistry;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export type ColumnComponent = React.ComponentType<any>;
3
+ export type ColumnRegistry = Record<string, ColumnComponent>;
4
+ export declare const ColumnRegistryProvider: {
5
+ ({ registry, children }: import("./createRegistryContext").RegistryProviderProps<ColumnComponent>): React.JSX.Element;
6
+ displayName: string;
7
+ };
8
+ export declare const useColumnRegistry: () => Record<string, ColumnComponent>;
@@ -0,0 +1,30 @@
1
+ import { createRegistryContext } from './createRegistryContext';
2
+ import { TextColumnComponent } from '../components/columns/TextColumnComponent';
3
+ import { IconColumnComponent } from '../components/columns/IconColumnComponent';
4
+ import { ImageColumnComponent } from '../components/columns/ImageColumnComponent';
5
+ import { VideoColumnComponent } from '../components/columns/VideoColumnComponent';
6
+ import { MediaColumnComponent } from '../components/columns/MediaColumnComponent';
7
+ import { ColorColumnComponent } from '../components/columns/ColorColumnComponent';
8
+ import { TagsColumnComponent } from '../components/columns/TagsColumnComponent';
9
+ import { ViewColumnComponent } from '../components/columns/ViewColumnComponent';
10
+ import { CheckboxColumnComponent } from '../components/columns/CheckboxColumnComponent';
11
+ import { ToggleColumnComponent } from '../components/columns/ToggleColumnComponent';
12
+ import { SelectColumnComponent } from '../components/columns/SelectColumnComponent';
13
+ import { TextInputColumnComponent } from '../components/columns/TextInputColumnComponent';
14
+ const defaultColumns = {
15
+ text: TextColumnComponent,
16
+ icon: IconColumnComponent,
17
+ image: ImageColumnComponent,
18
+ video: VideoColumnComponent,
19
+ media: MediaColumnComponent,
20
+ color: ColorColumnComponent,
21
+ tags: TagsColumnComponent,
22
+ view: ViewColumnComponent,
23
+ checkbox: CheckboxColumnComponent,
24
+ toggle: ToggleColumnComponent,
25
+ select: SelectColumnComponent,
26
+ textinput: TextInputColumnComponent,
27
+ };
28
+ const registry = createRegistryContext('ColumnRegistry', defaultColumns);
29
+ export const ColumnRegistryProvider = registry.Provider;
30
+ export const useColumnRegistry = registry.useRegistry;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { FieldRegistry } from '../types';
3
+ export declare const FieldRegistryContext: React.Context<Record<string, import("../types").FieldComponent>>;
4
+ export declare const useFieldRegistry: () => Record<string, import("../types").FieldComponent>;
5
+ export interface FieldRegistryProviderProps {
6
+ customFields?: FieldRegistry;
7
+ children: React.ReactNode;
8
+ }
9
+ /**
10
+ * Provider component that manages the field registry.
11
+ * Custom field components (e.g. from plugins) override the built-ins.
12
+ */
13
+ export declare function FieldRegistryProvider({ customFields, children }: FieldRegistryProviderProps): React.JSX.Element;
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRegistryContext } from './createRegistryContext';
3
+ import { TextInputField } from '../components/TextInputField';
4
+ import { SelectField } from '../components/SelectField';
5
+ import { TextareaField } from '../components/TextareaField';
6
+ import { CheckboxField } from '../components/CheckboxField';
7
+ import { ToggleField } from '../components/ToggleField';
8
+ import { RadioField } from '../components/RadioField';
9
+ import { DateTimePickerField } from '../components/DateTimePickerField';
10
+ import { ColorPickerField } from '../components/ColorPickerField';
11
+ import { RepeaterField } from '../components/RepeaterField';
12
+ import { TagsInputField } from '../components/TagsInputField';
13
+ import { HiddenField } from '../components/HiddenField';
14
+ import { FileUploadField } from '../components/FileUploadField';
15
+ import { RichEditorField } from '../components/RichEditorField';
16
+ import { SectionField } from '../components/SectionField';
17
+ import { GroupField } from '../components/GroupField';
18
+ import { TabsField } from '../components/TabsField';
19
+ const defaultFields = {
20
+ 'text-input': TextInputField,
21
+ select: SelectField,
22
+ textarea: TextareaField,
23
+ checkbox: CheckboxField,
24
+ toggle: ToggleField,
25
+ radio: RadioField,
26
+ 'date-time-picker': DateTimePickerField,
27
+ 'color-picker': ColorPickerField,
28
+ repeater: RepeaterField,
29
+ 'tags-input': TagsInputField,
30
+ hidden: HiddenField,
31
+ fileUpload: FileUploadField,
32
+ richEditor: RichEditorField,
33
+ section: SectionField,
34
+ group: GroupField,
35
+ tabs: TabsField,
36
+ };
37
+ const registry = createRegistryContext('FieldRegistry', defaultFields);
38
+ export const FieldRegistryContext = registry.Context;
39
+ export const useFieldRegistry = registry.useRegistry;
40
+ /**
41
+ * Provider component that manages the field registry.
42
+ * Custom field components (e.g. from plugins) override the built-ins.
43
+ */
44
+ export function FieldRegistryProvider({ customFields = {}, children }) {
45
+ return _jsx(registry.Provider, { registry: customFields, children: children });
46
+ }
@@ -0,0 +1,26 @@
1
+ import React, { ReactNode } from 'react';
2
+ import type { ResourceMetadata } from '../components/layout/Sidebar';
3
+ export interface PageMetadata {
4
+ slug: string;
5
+ label: string;
6
+ icon?: string;
7
+ navigationGroup?: string;
8
+ navigationSort?: number;
9
+ hidden?: boolean;
10
+ badge?: string | number | null;
11
+ badgeColor?: string;
12
+ }
13
+ interface PanelMetadataContextType {
14
+ resources: ResourceMetadata[];
15
+ pages: PageMetadata[];
16
+ getResourceLabel: (slug: string) => string | undefined;
17
+ getPageLabel: (slug: string) => string | undefined;
18
+ }
19
+ export interface PanelMetadataProviderProps {
20
+ children: ReactNode;
21
+ resources: ResourceMetadata[];
22
+ pages: PageMetadata[];
23
+ }
24
+ export declare function PanelMetadataProvider({ children, resources, pages }: PanelMetadataProviderProps): React.JSX.Element;
25
+ export declare function usePanelMetadata(): PanelMetadataContextType;
26
+ export {};
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ const PanelMetadataContext = createContext(undefined);
4
+ export function PanelMetadataProvider({ children, resources, pages }) {
5
+ const getResourceLabel = (slug) => {
6
+ const resource = resources.find(r => r.slug === slug);
7
+ return resource?.label;
8
+ };
9
+ const getPageLabel = (slug) => {
10
+ const page = pages.find(p => p.slug === slug);
11
+ return page?.label;
12
+ };
13
+ return (_jsx(PanelMetadataContext.Provider, { value: {
14
+ resources,
15
+ pages,
16
+ getResourceLabel,
17
+ getPageLabel,
18
+ }, children: children }));
19
+ }
20
+ export function usePanelMetadata() {
21
+ const context = useContext(PanelMetadataContext);
22
+ if (!context) {
23
+ throw new Error('usePanelMetadata must be used within PanelMetadataProvider');
24
+ }
25
+ return context;
26
+ }
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { BlockRegistry } from './BlockRegistryContext';
3
+ import { WidgetRegistry } from './WidgetRegistryContext';
4
+ import { ColumnRegistry } from './ColumnRegistryContext';
5
+ import { AuthChallengeRegistry } from './AuthChallengeRegistryContext';
6
+ import type { ResolvedSlots } from '../slots/types';
7
+ import type { ClientI18nConfig } from '../i18n/buildClientI18n';
8
+ import { FieldRegistry } from '../types';
9
+ export interface PanelProvidersProps {
10
+ apiBaseUrl: string;
11
+ customFields?: FieldRegistry;
12
+ customColumns?: ColumnRegistry;
13
+ customWidgets?: WidgetRegistry;
14
+ customBlocks?: BlockRegistry;
15
+ customAuthChallenges?: AuthChallengeRegistry;
16
+ customSlots?: ResolvedSlots;
17
+ i18nConfig?: ClientI18nConfig;
18
+ children: React.ReactNode;
19
+ }
20
+ /**
21
+ * Composes the auth gate and every panel-level provider (modal stack,
22
+ * table refresh, and the component registries) in one place.
23
+ *
24
+ * The auth-challenge registry wraps the auth gate so the LoginPage — rendered by
25
+ * ProtectedRoute when there is no user — can resolve the component for a pending challenge.
26
+ */
27
+ export declare function PanelProviders({ apiBaseUrl, customFields, customColumns, customWidgets, customBlocks, customAuthChallenges, customSlots, i18nConfig, children, }: PanelProvidersProps): React.JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { AuthProvider } from '../auth/AuthContext';
3
+ import { ProtectedRoute } from '../auth/ProtectedRoute';
4
+ import { ResourceModalProvider } from './ResourceModalContext';
5
+ import { TableRefreshProvider } from './TableRefreshContext';
6
+ import { BlockRegistryProvider } from './BlockRegistryContext';
7
+ import { WidgetRegistryProvider } from './WidgetRegistryContext';
8
+ import { FieldRegistryProvider } from './FieldRegistryContext';
9
+ import { ColumnRegistryProvider } from './ColumnRegistryContext';
10
+ import { AuthChallengeRegistryProvider } from './AuthChallengeRegistryContext';
11
+ import { SlotRegistryProvider } from './SlotRegistryContext';
12
+ import { ToastProvider } from '../components/ui/Toast';
13
+ import { ConfirmProvider } from '../components/ui/ConfirmDialog';
14
+ import { I18nProvider } from '../i18n/I18nProvider';
15
+ /**
16
+ * Composes the auth gate and every panel-level provider (modal stack,
17
+ * table refresh, and the component registries) in one place.
18
+ *
19
+ * The auth-challenge registry wraps the auth gate so the LoginPage — rendered by
20
+ * ProtectedRoute when there is no user — can resolve the component for a pending challenge.
21
+ */
22
+ export function PanelProviders({ apiBaseUrl, customFields, customColumns, customWidgets, customBlocks, customAuthChallenges, customSlots, i18nConfig, children, }) {
23
+ return (_jsx(I18nProvider, { config: i18nConfig, children: _jsx(ToastProvider, { children: _jsx(ConfirmProvider, { children: _jsx(AuthProvider, { apiBaseUrl: apiBaseUrl, children: _jsx(AuthChallengeRegistryProvider, { customAuthChallenges: customAuthChallenges, children: _jsx(SlotRegistryProvider, { slots: customSlots, children: _jsx(ProtectedRoute, { apiBaseUrl: apiBaseUrl, children: _jsx(ResourceModalProvider, { children: _jsx(TableRefreshProvider, { children: _jsx(BlockRegistryProvider, { customBlocks: customBlocks, children: _jsx(WidgetRegistryProvider, { customWidgets: customWidgets, children: _jsx(FieldRegistryProvider, { customFields: customFields, children: _jsx(ColumnRegistryProvider, { registry: customColumns, children: children }) }) }) }) }) }) }) }) }) }) }) }) }));
24
+ }
@@ -0,0 +1,26 @@
1
+ import React, { ReactNode } from 'react';
2
+ export interface ModalState {
3
+ resource: string;
4
+ recordId?: string;
5
+ mode: 'view' | 'edit' | 'create' | 'action';
6
+ depth: number;
7
+ actionName?: string;
8
+ actionLabel?: string;
9
+ originUrl?: string;
10
+ }
11
+ interface ResourceModalContextType {
12
+ modalStack: ModalState[];
13
+ modalTitles: Record<string, string>;
14
+ openModal: (resource: string, mode: 'view' | 'edit' | 'create' | 'action', recordId?: string, actionName?: string, actionLabel?: string, originUrl?: string) => void;
15
+ closeModal: () => void;
16
+ closeAllModals: () => void;
17
+ clearModalsForResource: (resource: string) => void;
18
+ setModalTitle: (key: string, title: string) => void;
19
+ removeModalTitle: (key: string) => void;
20
+ clearModalTitles: () => void;
21
+ }
22
+ export declare function ResourceModalProvider({ children }: {
23
+ children: ReactNode;
24
+ }): React.JSX.Element;
25
+ export declare function useResourceModal(): ResourceModalContextType;
26
+ export {};
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useState, useCallback } from 'react';
3
+ const ResourceModalContext = createContext(undefined);
4
+ export function ResourceModalProvider({ children }) {
5
+ const [modalStack, setModalStack] = useState([]);
6
+ const [modalTitles, setModalTitles] = useState({});
7
+ const openModal = useCallback((resource, mode, recordId, actionName, actionLabel, originUrl) => {
8
+ setModalStack(prev => {
9
+ // Check if this exact modal is already at the top of the stack (prevent duplicates)
10
+ const topModal = prev[prev.length - 1];
11
+ if (topModal &&
12
+ topModal.resource === resource &&
13
+ topModal.recordId === recordId &&
14
+ topModal.mode === mode &&
15
+ topModal.actionName === actionName) {
16
+ // Same modal already at top, don't add duplicate
17
+ return prev;
18
+ }
19
+ // Add new modal to stack with auto-calculated depth
20
+ const newModal = {
21
+ resource,
22
+ recordId,
23
+ mode,
24
+ depth: prev.length, // depth = current stack length
25
+ actionName,
26
+ actionLabel,
27
+ originUrl,
28
+ };
29
+ return [...prev, newModal];
30
+ });
31
+ }, []);
32
+ const closeModal = useCallback(() => {
33
+ setModalStack(prev => {
34
+ if (prev.length === 0)
35
+ return prev;
36
+ // Remove last modal from stack (pop)
37
+ return prev.slice(0, -1);
38
+ });
39
+ }, []);
40
+ const closeAllModals = useCallback(() => {
41
+ setModalStack([]);
42
+ }, []);
43
+ const clearModalsForResource = useCallback((resource) => {
44
+ setModalStack(prev => prev.filter(modal => modal.resource !== resource));
45
+ }, []);
46
+ const setModalTitle = useCallback((key, title) => {
47
+ setModalTitles(prev => ({ ...prev, [key]: title }));
48
+ }, []);
49
+ const removeModalTitle = useCallback((key) => {
50
+ setModalTitles(prev => {
51
+ const { [key]: _, ...rest } = prev;
52
+ return rest;
53
+ });
54
+ }, []);
55
+ const clearModalTitles = useCallback(() => {
56
+ setModalTitles({});
57
+ }, []);
58
+ return (_jsx(ResourceModalContext.Provider, { value: {
59
+ modalStack,
60
+ modalTitles,
61
+ openModal,
62
+ closeModal,
63
+ closeAllModals,
64
+ clearModalsForResource,
65
+ setModalTitle,
66
+ removeModalTitle,
67
+ clearModalTitles,
68
+ }, children: children }));
69
+ }
70
+ export function useResourceModal() {
71
+ const context = useContext(ResourceModalContext);
72
+ if (!context) {
73
+ throw new Error('useResourceModal must be used within ResourceModalProvider');
74
+ }
75
+ return context;
76
+ }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import type { SlotContribution, ResolvedSlots, SlotName } from '../slots/types';
3
+ declare const SlotRegistryContext: React.Context<ResolvedSlots>;
4
+ export interface SlotRegistryProviderProps {
5
+ /** Resolved slot map (already merged across plugins + app). */
6
+ slots?: ResolvedSlots;
7
+ children: React.ReactNode;
8
+ }
9
+ /**
10
+ * Provides the merged slot map to the tree. Slots differ from the component
11
+ * registries (`createRegistryContext`): they are 1:many and concatenated rather
12
+ * than overridden, so this provider keeps a sorted array per slot name.
13
+ */
14
+ export declare function SlotRegistryProvider({ slots, children }: SlotRegistryProviderProps): React.JSX.Element;
15
+ /** Full resolved slot map (for introspection/tests). */
16
+ export declare function useSlotRegistry(): ResolvedSlots;
17
+ /** The sorted contributions for a single slot, or an empty array. */
18
+ export declare function useSlot(name: SlotName): SlotContribution[];
19
+ export { SlotRegistryContext };
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ import { sortSlots } from '../slots/mergeSlots';
4
+ const SlotRegistryContext = createContext({});
5
+ SlotRegistryContext.displayName = 'SlotRegistry';
6
+ /**
7
+ * Provides the merged slot map to the tree. Slots differ from the component
8
+ * registries (`createRegistryContext`): they are 1:many and concatenated rather
9
+ * than overridden, so this provider keeps a sorted array per slot name.
10
+ */
11
+ export function SlotRegistryProvider({ slots = {}, children }) {
12
+ const value = useMemo(() => sortSlots({ ...slots }), [slots]);
13
+ return _jsx(SlotRegistryContext.Provider, { value: value, children: children });
14
+ }
15
+ /** Full resolved slot map (for introspection/tests). */
16
+ export function useSlotRegistry() {
17
+ return useContext(SlotRegistryContext);
18
+ }
19
+ /** The sorted contributions for a single slot, or an empty array. */
20
+ export function useSlot(name) {
21
+ const registry = useContext(SlotRegistryContext);
22
+ return registry[name] ?? [];
23
+ }
24
+ export { SlotRegistryContext };
@@ -0,0 +1,10 @@
1
+ import React, { ReactNode } from 'react';
2
+ interface TableRefreshContextType {
3
+ refreshTable: (resourceSlug: string) => void;
4
+ registerRefresh: (resourceSlug: string, callback: () => void) => () => void;
5
+ }
6
+ export declare function TableRefreshProvider({ children }: {
7
+ children: ReactNode;
8
+ }): React.JSX.Element;
9
+ export declare function useTableRefresh(): TableRefreshContextType;
10
+ export {};
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React, { createContext, useContext, useCallback } from 'react';
3
+ const TableRefreshContext = createContext(undefined);
4
+ export function TableRefreshProvider({ children }) {
5
+ const refreshCallbacks = React.useRef(new Map());
6
+ const refreshTable = useCallback((resourceSlug) => {
7
+ const callback = refreshCallbacks.current.get(resourceSlug);
8
+ if (callback) {
9
+ callback();
10
+ }
11
+ }, []);
12
+ const registerRefresh = useCallback((resourceSlug, callback) => {
13
+ refreshCallbacks.current.set(resourceSlug, callback);
14
+ return () => {
15
+ refreshCallbacks.current.delete(resourceSlug);
16
+ };
17
+ }, []);
18
+ return (_jsx(TableRefreshContext.Provider, { value: { refreshTable, registerRefresh }, children: children }));
19
+ }
20
+ export function useTableRefresh() {
21
+ const context = useContext(TableRefreshContext);
22
+ if (!context) {
23
+ // Return no-op functions if context is not available
24
+ return {
25
+ refreshTable: () => { },
26
+ registerRefresh: () => () => { },
27
+ };
28
+ }
29
+ return context;
30
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export interface WidgetComponentProps {
3
+ widget: any;
4
+ data: any;
5
+ }
6
+ export type WidgetComponent = React.ComponentType<WidgetComponentProps>;
7
+ export interface WidgetRegistry {
8
+ [key: string]: WidgetComponent;
9
+ }
10
+ interface WidgetRegistryProviderProps {
11
+ children: React.ReactNode;
12
+ customWidgets?: WidgetRegistry;
13
+ }
14
+ export declare function WidgetRegistryProvider({ children, customWidgets }: WidgetRegistryProviderProps): React.JSX.Element;
15
+ /** Returns the flat widget registry (built-ins merged with custom widgets). */
16
+ export declare const useWidgetRegistry: () => Record<string, WidgetComponent>;
17
+ export {};
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRegistryContext } from './createRegistryContext';
3
+ import { StatsWidget } from '../components/widgets/StatsWidget';
4
+ import { ChartWidget } from '../components/widgets/ChartWidget';
5
+ const builtInWidgets = {
6
+ stats: StatsWidget,
7
+ chart: ChartWidget,
8
+ };
9
+ const registry = createRegistryContext('WidgetRegistry', builtInWidgets);
10
+ export function WidgetRegistryProvider({ children, customWidgets }) {
11
+ return _jsx(registry.Provider, { registry: customWidgets, children: children });
12
+ }
13
+ /** Returns the flat widget registry (built-ins merged with custom widgets). */
14
+ export const useWidgetRegistry = registry.useRegistry;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ export interface RegistryProviderProps<T> {
3
+ /** Custom entries; merged over the defaults, custom entries win */
4
+ registry?: Record<string, T>;
5
+ children: React.ReactNode;
6
+ }
7
+ /**
8
+ * Factory for component registries (fields, columns, widgets, blocks).
9
+ * All registries share one pattern: a flat `Record<string, Component>` of
10
+ * defaults that custom (plugin) entries can extend or override.
11
+ */
12
+ export declare function createRegistryContext<T>(displayName: string, defaults: Record<string, T>): {
13
+ Context: React.Context<Record<string, T>>;
14
+ Provider: {
15
+ ({ registry, children }: RegistryProviderProps<T>): React.JSX.Element;
16
+ displayName: string;
17
+ };
18
+ useRegistry: () => Record<string, T>;
19
+ };
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ /**
4
+ * Factory for component registries (fields, columns, widgets, blocks).
5
+ * All registries share one pattern: a flat `Record<string, Component>` of
6
+ * defaults that custom (plugin) entries can extend or override.
7
+ */
8
+ export function createRegistryContext(displayName, defaults) {
9
+ const Context = createContext(defaults);
10
+ Context.displayName = displayName;
11
+ function Provider({ registry = {}, children }) {
12
+ const merged = useMemo(() => ({ ...defaults, ...registry }), [registry]);
13
+ return _jsx(Context.Provider, { value: merged, children: children });
14
+ }
15
+ Provider.displayName = `${displayName}Provider`;
16
+ function useRegistry() {
17
+ return useContext(Context);
18
+ }
19
+ return { Context, Provider, useRegistry };
20
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Hook to execute afterStateUpdated callback when a field's value changes
3
+ * @param fieldName - Name of the field to watch
4
+ * @param callbackString - Serialized callback function as string
5
+ */
6
+ export declare function useAfterStateUpdated(fieldName: string, callbackString?: string): void;