@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,37 @@
1
+ /**
2
+ * Frontend implementation of the declarative children contract (mirrors
3
+ * `src/utils/formSchemaTraversal`). The core package's
4
+ * barrel pulls Node-only deps, so we share the *contract* (the serialized
5
+ * shape), not the module:
6
+ * - children live under `schema`
7
+ * - `isLayout` marks pure layout containers (no value of their own)
8
+ * - `childScope: 'array'` marks item-template containers (Repeater)
9
+ *
10
+ * Any component (core or plugin) that follows the contract is traversed
11
+ * correctly with no type-specific code.
12
+ */
13
+ /** Direct child components of a node. */
14
+ export function getChildComponents(node) {
15
+ const schema = node.schema;
16
+ return Array.isArray(schema) ? schema : [];
17
+ }
18
+ /** A pure layout container (inherits parent value scope, holds no value of its own). */
19
+ export function isLayout(node) {
20
+ return node.isLayout === true;
21
+ }
22
+ /** Children form an item template whose value lives under the node's own name (Repeater). */
23
+ export function isArrayScope(node) {
24
+ return node.childScope === 'array';
25
+ }
26
+ /**
27
+ * Depth-first predicate over a node and all of its descendants. Recursion stops
28
+ * descending past array-scope containers (their item template is a separate
29
+ * value scope) — the predicate still sees the container node itself.
30
+ */
31
+ export function someComponent(node, predicate) {
32
+ if (predicate(node))
33
+ return true;
34
+ if (isArrayScope(node))
35
+ return false;
36
+ return getChildComponents(node).some(child => someComponent(child, predicate));
37
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Runtime for executing functions serialized by the KratosJs backend.
3
+ *
4
+ * ## Trust boundary
5
+ *
6
+ * The strings executed here are NOT user input. They are functions written by
7
+ * the panel developer in resource/column definitions (kratosjs core
8
+ * serializes them with `.toString()`) and served by the developer's own server
9
+ * over the authenticated metadata API. They carry exactly the same trust as
10
+ * the application JS bundle itself: if an attacker can tamper with the
11
+ * metadata endpoint, they already control the panel.
12
+ *
13
+ * Implementation notes:
14
+ * - Compilation uses `new Function` (never `eval`), so serialized code cannot
15
+ * capture local scope from this module.
16
+ * - Compiled functions are cached by source string — schemas re-render often
17
+ * and re-parsing on every render is wasted work.
18
+ * - Deploying a CSP without `'unsafe-eval'` requires avoiding serialized
19
+ * functions entirely (use structured conditions instead, see conditions.ts).
20
+ */
21
+ /**
22
+ * Strip TypeScript/esbuild helper wrappers from serialized code.
23
+ * Toolchains wrap named function expressions as `__name(fn, "fnName")`;
24
+ * this extracts the first argument and drops the name, iterating until
25
+ * no `__name(` wrappers remain (handles nesting in block bodies).
26
+ */
27
+ export declare function stripTypeScriptHelpers(code: string): string;
28
+ /**
29
+ * Compile a serialized function string into a callable, with caching.
30
+ * Returns undefined (and logs) when the string cannot be compiled.
31
+ */
32
+ export declare function compileSerializedFunction(functionString: string | undefined): ((...args: any[]) => any) | undefined;
33
+ /**
34
+ * Execute a serialized function with the given arguments.
35
+ * Without arguments, returns the compiled function itself.
36
+ * Returns undefined on compile or runtime errors.
37
+ *
38
+ * @example
39
+ * executeSerializedFunction('(value, record) => value.toUpperCase()', 'hello', {});
40
+ */
41
+ export declare function executeSerializedFunction(functionString: string | undefined, ...args: any[]): any;
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Runtime for executing functions serialized by the KratosJs backend.
3
+ *
4
+ * ## Trust boundary
5
+ *
6
+ * The strings executed here are NOT user input. They are functions written by
7
+ * the panel developer in resource/column definitions (kratosjs core
8
+ * serializes them with `.toString()`) and served by the developer's own server
9
+ * over the authenticated metadata API. They carry exactly the same trust as
10
+ * the application JS bundle itself: if an attacker can tamper with the
11
+ * metadata endpoint, they already control the panel.
12
+ *
13
+ * Implementation notes:
14
+ * - Compilation uses `new Function` (never `eval`), so serialized code cannot
15
+ * capture local scope from this module.
16
+ * - Compiled functions are cached by source string — schemas re-render often
17
+ * and re-parsing on every render is wasted work.
18
+ * - Deploying a CSP without `'unsafe-eval'` requires avoiding serialized
19
+ * functions entirely (use structured conditions instead, see conditions.ts).
20
+ */
21
+ const compileCache = new Map();
22
+ /**
23
+ * Strip TypeScript/esbuild helper wrappers from serialized code.
24
+ * Toolchains wrap named function expressions as `__name(fn, "fnName")`;
25
+ * this extracts the first argument and drops the name, iterating until
26
+ * no `__name(` wrappers remain (handles nesting in block bodies).
27
+ */
28
+ export function stripTypeScriptHelpers(code) {
29
+ let cleaned = code;
30
+ let changed = true;
31
+ let iterations = 0;
32
+ const maxIterations = 100; // Safety limit to prevent infinite loops
33
+ while (changed && iterations < maxIterations) {
34
+ iterations++;
35
+ const before = cleaned;
36
+ let result = '';
37
+ let i = 0;
38
+ while (i < cleaned.length) {
39
+ // Check if we're at __name(
40
+ if (cleaned.substring(i, i + 6) === '__name' && (cleaned[i + 6] === '(' || /\s/.test(cleaned[i + 6]))) {
41
+ // Skip '__name' and any whitespace, find the opening parenthesis
42
+ let j = i + 6;
43
+ while (j < cleaned.length && /\s/.test(cleaned[j]))
44
+ j++;
45
+ if (j >= cleaned.length || cleaned[j] !== '(') {
46
+ // Not a __name( call, add it back and continue
47
+ result += cleaned[i];
48
+ i++;
49
+ continue;
50
+ }
51
+ // Skip '('
52
+ j++;
53
+ // Find the first argument (the function expression),
54
+ // matching balanced parens/brackets/braces outside strings
55
+ let depth = 0;
56
+ const start = j;
57
+ let inString = false;
58
+ let stringChar = '';
59
+ let inTemplate = false;
60
+ while (j < cleaned.length) {
61
+ const char = cleaned[j];
62
+ const prevChar = j > 0 ? cleaned[j - 1] : '';
63
+ if (!inString && !inTemplate) {
64
+ if (char === '`') {
65
+ inTemplate = true;
66
+ }
67
+ else if (char === '"' || char === "'") {
68
+ inString = true;
69
+ stringChar = char;
70
+ }
71
+ }
72
+ else if (inString && char === stringChar && prevChar !== '\\') {
73
+ inString = false;
74
+ }
75
+ else if (inTemplate && char === '`' && prevChar !== '\\') {
76
+ inTemplate = false;
77
+ }
78
+ if (!inString && !inTemplate) {
79
+ if (char === '(' || char === '[' || char === '{') {
80
+ depth++;
81
+ }
82
+ else if (char === ')' || char === ']' || char === '}') {
83
+ depth--;
84
+ }
85
+ // A comma at depth 0 ends the first argument
86
+ if (char === ',' && depth === 0) {
87
+ break;
88
+ }
89
+ }
90
+ j++;
91
+ }
92
+ const functionExpr = cleaned.substring(start, j);
93
+ result += functionExpr;
94
+ // Skip the comma
95
+ if (cleaned[j] === ',')
96
+ j++;
97
+ // Skip whitespace
98
+ while (j < cleaned.length && /\s/.test(cleaned[j]))
99
+ j++;
100
+ // Skip the string argument ("functionName")
101
+ if (cleaned[j] === '"' || cleaned[j] === "'") {
102
+ const quote = cleaned[j];
103
+ j++;
104
+ while (j < cleaned.length && cleaned[j] !== quote) {
105
+ if (cleaned[j] === '\\')
106
+ j++; // Skip escaped characters
107
+ j++;
108
+ }
109
+ if (cleaned[j] === quote)
110
+ j++; // Skip closing quote
111
+ }
112
+ // Skip whitespace and closing paren
113
+ while (j < cleaned.length && (/\s/.test(cleaned[j]) || cleaned[j] === ')'))
114
+ j++;
115
+ i = j;
116
+ }
117
+ else {
118
+ result += cleaned[i];
119
+ i++;
120
+ }
121
+ }
122
+ cleaned = result;
123
+ changed = before !== cleaned;
124
+ }
125
+ return cleaned;
126
+ }
127
+ /**
128
+ * Extract parameter names from a function parameter list.
129
+ * Handles: (a, b), (a,b), a, (a = 1, b), etc.
130
+ */
131
+ function extractParameters(paramString) {
132
+ if (!paramString)
133
+ return [];
134
+ const cleaned = paramString.replace(/^\(|\)$/g, '').trim();
135
+ if (!cleaned)
136
+ return [];
137
+ const params = [];
138
+ let current = '';
139
+ let depth = 0;
140
+ for (let i = 0; i < cleaned.length; i++) {
141
+ const char = cleaned[i];
142
+ if (char === '(' || char === '[' || char === '{') {
143
+ depth++;
144
+ current += char;
145
+ }
146
+ else if (char === ')' || char === ']' || char === '}') {
147
+ depth--;
148
+ current += char;
149
+ }
150
+ else if (char === ',' && depth === 0) {
151
+ const paramName = current.trim().split('=')[0].trim();
152
+ if (paramName) {
153
+ params.push(paramName);
154
+ }
155
+ current = '';
156
+ }
157
+ else {
158
+ current += char;
159
+ }
160
+ }
161
+ if (current.trim()) {
162
+ const paramName = current.trim().split('=')[0].trim();
163
+ if (paramName) {
164
+ params.push(paramName);
165
+ }
166
+ }
167
+ return params.length > 0 ? params : ['value', 'record']; // Default fallback
168
+ }
169
+ function compile(functionString) {
170
+ const trimmed = stripTypeScriptHelpers(functionString).trim();
171
+ if (trimmed.includes('=>')) {
172
+ const arrowIndex = trimmed.indexOf('=>');
173
+ const afterArrow = trimmed.substring(arrowIndex + 2).trim();
174
+ const beforeArrow = trimmed.substring(0, arrowIndex).trim();
175
+ const params = extractParameters(beforeArrow);
176
+ if (afterArrow.startsWith('{')) {
177
+ // Block body — extract content between balanced braces
178
+ let braceCount = 0;
179
+ let startIndex = 0;
180
+ let endIndex = afterArrow.length;
181
+ for (let i = 0; i < afterArrow.length; i++) {
182
+ if (afterArrow[i] === '{') {
183
+ if (braceCount === 0)
184
+ startIndex = i + 1;
185
+ braceCount++;
186
+ }
187
+ else if (afterArrow[i] === '}') {
188
+ braceCount--;
189
+ if (braceCount === 0) {
190
+ endIndex = i;
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ const functionBody = afterArrow.substring(startIndex, endIndex).trim();
196
+ return new Function(...params, functionBody);
197
+ }
198
+ // Expression body — wrap in a return statement
199
+ return new Function(...params, `return ${afterArrow}`);
200
+ }
201
+ if (trimmed.startsWith('function')) {
202
+ return new Function(`return ${trimmed}`)();
203
+ }
204
+ // Bare function body, or an unrecognized wrapping
205
+ try {
206
+ return new Function('value', 'record', trimmed);
207
+ }
208
+ catch {
209
+ // Last resort: treat the string as an expression evaluating to a function
210
+ const fn = new Function(`return (${trimmed})`)();
211
+ if (typeof fn === 'function') {
212
+ return fn;
213
+ }
214
+ throw new Error('Serialized string is not a valid function');
215
+ }
216
+ }
217
+ /**
218
+ * Compile a serialized function string into a callable, with caching.
219
+ * Returns undefined (and logs) when the string cannot be compiled.
220
+ */
221
+ export function compileSerializedFunction(functionString) {
222
+ if (!functionString) {
223
+ return undefined;
224
+ }
225
+ if (compileCache.has(functionString)) {
226
+ return compileCache.get(functionString);
227
+ }
228
+ let compiled;
229
+ try {
230
+ compiled = compile(functionString);
231
+ }
232
+ catch (error) {
233
+ console.error('Error compiling serialized function:', error);
234
+ console.error('Function string (first 500 chars):', functionString.substring(0, 500));
235
+ compiled = undefined;
236
+ }
237
+ compileCache.set(functionString, compiled);
238
+ return compiled;
239
+ }
240
+ /**
241
+ * Execute a serialized function with the given arguments.
242
+ * Without arguments, returns the compiled function itself.
243
+ * Returns undefined on compile or runtime errors.
244
+ *
245
+ * @example
246
+ * executeSerializedFunction('(value, record) => value.toUpperCase()', 'hello', {});
247
+ */
248
+ export function executeSerializedFunction(functionString, ...args) {
249
+ const fn = compileSerializedFunction(functionString);
250
+ if (!fn) {
251
+ return undefined;
252
+ }
253
+ if (args.length === 0) {
254
+ return fn;
255
+ }
256
+ try {
257
+ return fn(...args);
258
+ }
259
+ catch (error) {
260
+ console.error('Error executing serialized function:', error);
261
+ console.error('Function string (first 500 chars):', functionString?.substring(0, 500));
262
+ return undefined;
263
+ }
264
+ }
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import type { SlotContext, SlotContribution, SlotName } from './types';
3
+ /**
4
+ * Render one contribution. Both a React component and a plain
5
+ * `(ctx) => ReactNode` are function components of the context, so a single
6
+ * `createElement` path covers both forms.
7
+ */
8
+ export declare function renderSlot(contribution: SlotContribution, context: SlotContext): React.ReactNode;
9
+ export interface SlotProps {
10
+ /** The slot to render. */
11
+ name: SlotName;
12
+ /** Context passed to each contribution. `slot` is filled in automatically. */
13
+ context?: Omit<SlotContext, 'slot'>;
14
+ /** Optional wrapper element type. Defaults to a Fragment (no DOM). */
15
+ as?: React.ElementType;
16
+ /** className for the wrapper (ignored when `as` is omitted). */
17
+ className?: string;
18
+ }
19
+ /**
20
+ * Renders every contribution registered for `name`, in order, each isolated by
21
+ * an `ErrorBoundary`. Renders nothing (no wrapper DOM) when the slot is empty,
22
+ * so slots stay invisible until something is contributed.
23
+ */
24
+ export declare function Slot({ name, context, as, className }: SlotProps): React.JSX.Element;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { ErrorBoundary } from '../components/errors/ErrorBoundary';
4
+ import { useSlot } from '../contexts/SlotRegistryContext';
5
+ /**
6
+ * Render one contribution. Both a React component and a plain
7
+ * `(ctx) => ReactNode` are function components of the context, so a single
8
+ * `createElement` path covers both forms.
9
+ */
10
+ export function renderSlot(contribution, context) {
11
+ return (_jsx(ErrorBoundary, { label: `slot "${context.slot}" (${contribution.id})`, children: React.createElement(contribution.render, context) }, contribution.id));
12
+ }
13
+ /**
14
+ * Renders every contribution registered for `name`, in order, each isolated by
15
+ * an `ErrorBoundary`. Renders nothing (no wrapper DOM) when the slot is empty,
16
+ * so slots stay invisible until something is contributed.
17
+ */
18
+ export function Slot({ name, context, as, className }) {
19
+ const contributions = useSlot(name);
20
+ if (contributions.length === 0)
21
+ return null;
22
+ const fullContext = { ...context, slot: name };
23
+ const children = contributions.map(contribution => renderSlot(contribution, fullContext));
24
+ if (as) {
25
+ const Wrapper = as;
26
+ return _jsx(Wrapper, { className: className, children: children });
27
+ }
28
+ return _jsx(_Fragment, { children: children });
29
+ }
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import type { SlotContext, SlotName } from './types';
3
+ export interface SlotClusterProps {
4
+ /** The slot to render. */
5
+ name: SlotName;
6
+ /** Context passed to each contribution. `slot` is filled in automatically. */
7
+ context?: Omit<SlotContext, 'slot'>;
8
+ /**
9
+ * How many contributions render inline on `sm`+ screens before the rest
10
+ * collapse into a "…" menu. Below `sm`, everything collapses. Default 2.
11
+ */
12
+ maxInline?: number;
13
+ /** className for the inline flex row. */
14
+ className?: string;
15
+ }
16
+ /**
17
+ * A responsive slot for tight horizontal areas (header right, table toolbar).
18
+ * On `sm`+ the first `maxInline` items render inline and any extras fall into a
19
+ * "…" dropdown; below `sm` every item collapses into the dropdown, so a crowded
20
+ * slot can never overflow a phone-width row regardless of contributor count.
21
+ */
22
+ export declare function SlotCluster({ name, context, maxInline, className }: SlotClusterProps): React.JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { MoreHorizontal } from 'lucide-react';
4
+ import { IconButton } from '../components/ui';
5
+ import { cn } from '../utils/classNames';
6
+ import { translate } from '../i18n/activeLocale';
7
+ import { useSlot } from '../contexts/SlotRegistryContext';
8
+ import { renderSlot } from './Slot';
9
+ /** A self-contained "…" dropdown holding overflow slot contributions. */
10
+ function OverflowMenu({ items, context, className, }) {
11
+ const [open, setOpen] = useState(false);
12
+ const ref = useRef(null);
13
+ useEffect(() => {
14
+ if (!open)
15
+ return;
16
+ const onClick = (event) => {
17
+ if (ref.current && !ref.current.contains(event.target))
18
+ setOpen(false);
19
+ };
20
+ const onEsc = (event) => {
21
+ if (event.key === 'Escape')
22
+ setOpen(false);
23
+ };
24
+ document.addEventListener('mousedown', onClick);
25
+ document.addEventListener('keydown', onEsc);
26
+ return () => {
27
+ document.removeEventListener('mousedown', onClick);
28
+ document.removeEventListener('keydown', onEsc);
29
+ };
30
+ }, [open]);
31
+ if (items.length === 0)
32
+ return null;
33
+ return (_jsxs("div", { className: cn('relative', className), ref: ref, children: [_jsx(IconButton, { variant: "ghost", size: "sm", "aria-label": translate('core:common.more'), "aria-expanded": open, "aria-haspopup": "menu", className: "h-9 w-9 shrink-0", onClick: () => setOpen(o => !o), children: _jsx(MoreHorizontal, { className: "h-4 w-4" }) }), open && (_jsx("div", { role: "menu", className: "absolute right-0 z-50 mt-2 flex w-56 flex-col gap-1 rounded-xl border border-border bg-raised p-2 shadow-soft-lg", children: items.map(item => renderSlot(item, context)) }))] }));
34
+ }
35
+ /**
36
+ * A responsive slot for tight horizontal areas (header right, table toolbar).
37
+ * On `sm`+ the first `maxInline` items render inline and any extras fall into a
38
+ * "…" dropdown; below `sm` every item collapses into the dropdown, so a crowded
39
+ * slot can never overflow a phone-width row regardless of contributor count.
40
+ */
41
+ export function SlotCluster({ name, context, maxInline = 2, className }) {
42
+ const contributions = useSlot(name);
43
+ if (contributions.length === 0)
44
+ return null;
45
+ const fullContext = { ...context, slot: name };
46
+ const inline = contributions.slice(0, maxInline);
47
+ const overflow = contributions.slice(maxInline);
48
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: cn('hidden items-center gap-1 sm:flex sm:gap-2', className), children: [inline.map(item => (_jsx("div", { className: "shrink-0", children: renderSlot(item, fullContext) }, item.id))), _jsx(OverflowMenu, { items: overflow, context: fullContext })] }), _jsx(OverflowMenu, { items: contributions, context: fullContext, className: "sm:hidden" })] }));
49
+ }
@@ -0,0 +1,7 @@
1
+ export { Slot, renderSlot } from './Slot';
2
+ export type { SlotProps } from './Slot';
3
+ export { SlotCluster } from './SlotCluster';
4
+ export type { SlotClusterProps } from './SlotCluster';
5
+ export { mergeSlots, appendSlots, sortSlots } from './mergeSlots';
6
+ export { SLOT_NAMES } from './types';
7
+ export type { SlotName, BuiltInSlotName, SlotContext, SlotRender, SlotContribution, SlotMap, ResolvedSlots, } from './types';
@@ -0,0 +1,4 @@
1
+ export { Slot, renderSlot } from './Slot';
2
+ export { SlotCluster } from './SlotCluster';
3
+ export { mergeSlots, appendSlots, sortSlots } from './mergeSlots';
4
+ export { SLOT_NAMES } from './types';
@@ -0,0 +1,18 @@
1
+ import type { SlotMap, ResolvedSlots, SlotContribution } from './types';
2
+ /**
3
+ * Append the contributions of one `SlotMap` onto an accumulator. Unlike the
4
+ * override-based component registries, slots are 1:many — every contribution is
5
+ * kept, preserving the order contributors were applied in.
6
+ */
7
+ export declare function appendSlots(target: ResolvedSlots, slots?: SlotMap): ResolvedSlots;
8
+ /**
9
+ * Stable-sort every slot's contributions by `order` (default 0). Equal orders
10
+ * keep registration order, since `Array.prototype.sort` is stable.
11
+ */
12
+ export declare function sortSlots(resolved: ResolvedSlots): ResolvedSlots;
13
+ /**
14
+ * Merge an ordered list of slot maps into a single resolved, sorted map.
15
+ * Earlier maps contribute first; the app map is appended last by the caller.
16
+ */
17
+ export declare function mergeSlots(maps: Array<SlotMap | undefined>): ResolvedSlots;
18
+ export type { SlotContribution };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Append the contributions of one `SlotMap` onto an accumulator. Unlike the
3
+ * override-based component registries, slots are 1:many — every contribution is
4
+ * kept, preserving the order contributors were applied in.
5
+ */
6
+ export function appendSlots(target, slots = {}) {
7
+ for (const [name, value] of Object.entries(slots)) {
8
+ if (!value)
9
+ continue;
10
+ const contributions = Array.isArray(value) ? value : [value];
11
+ (target[name] ?? (target[name] = [])).push(...contributions);
12
+ }
13
+ return target;
14
+ }
15
+ /**
16
+ * Stable-sort every slot's contributions by `order` (default 0). Equal orders
17
+ * keep registration order, since `Array.prototype.sort` is stable.
18
+ */
19
+ export function sortSlots(resolved) {
20
+ for (const name of Object.keys(resolved)) {
21
+ resolved[name] = [...resolved[name]].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
22
+ }
23
+ return resolved;
24
+ }
25
+ /**
26
+ * Merge an ordered list of slot maps into a single resolved, sorted map.
27
+ * Earlier maps contribute first; the app map is appended last by the caller.
28
+ */
29
+ export function mergeSlots(maps) {
30
+ const resolved = {};
31
+ for (const map of maps) {
32
+ appendSlots(resolved, map);
33
+ }
34
+ return sortSlots(resolved);
35
+ }
@@ -0,0 +1,87 @@
1
+ import type { ReactNode, ComponentType } from 'react';
2
+ /**
3
+ * Built-in slot ids — the named injection points the framework renders in the
4
+ * panel chrome. Plugins may also use arbitrary strings to declare their own
5
+ * slots inside components they render.
6
+ */
7
+ export type BuiltInSlotName = 'header.left' | 'header.right' | 'header.userMenu' | 'sidebar.brand' | 'sidebar.top' | 'sidebar.bottom' | 'panel.footer' | 'table.toolbar' | 'table.aboveTable' | 'table.belowTable' | 'table.bulkActions' | 'table.rowActions' | 'form.header' | 'form.footer' | 'detail.actions' | 'detail.tabs' | 'detail.afterDetails' | 'page.top' | 'page.bottom' | 'widgets.append' | 'modal.headerActions' | 'modal.footer' | 'login.top' | 'login.belowForm';
8
+ /**
9
+ * A slot name. The built-in names give autocomplete; the `string & {}` arm keeps
10
+ * the union open so plugins can define and target their own slots.
11
+ */
12
+ export type SlotName = BuiltInSlotName | (string & {});
13
+ /**
14
+ * Context passed to every slot render. The base shape is always present; each
15
+ * placement widens it with the data it can supply (e.g. the current record for
16
+ * detail/form slots, the resource slug for table slots).
17
+ */
18
+ export interface SlotContext {
19
+ /** The slot being rendered. */
20
+ slot: SlotName;
21
+ /** Slug of the resource in scope, when the slot sits inside a resource view. */
22
+ resourceSlug?: string;
23
+ /** Resource/page schema in scope, when available. */
24
+ schema?: unknown;
25
+ /** The record in scope, for detail/form slots. */
26
+ record?: Record<string, unknown>;
27
+ /** Current router pathname. */
28
+ location?: string;
29
+ /** Authenticated user, for header/userMenu slots. Cast to your `AuthUser`. */
30
+ user?: unknown;
31
+ /** Slot-specific extras (e.g. `{ selectedIds }` for `table.bulkActions`, `{ rowId }` for `table.rowActions`). */
32
+ data?: Record<string, unknown>;
33
+ }
34
+ /**
35
+ * A slot's renderable: either a React component that receives the slot context
36
+ * as props, or a plain function of the context returning a node.
37
+ */
38
+ export type SlotRender<C extends SlotContext = SlotContext> = ComponentType<C> | ((ctx: C) => ReactNode);
39
+ /**
40
+ * A single contribution to a slot. Multiple contributions stack into one slot,
41
+ * unlike the override-based component registries.
42
+ */
43
+ export interface SlotContribution<C extends SlotContext = SlotContext> {
44
+ /** Stable id — used as the React key and to dedupe across contributors. */
45
+ id: string;
46
+ /** Component or function that produces the slot content. */
47
+ render: SlotRender<C>;
48
+ /** Lower renders first. Defaults to 0; ties keep registration order. */
49
+ order?: number;
50
+ }
51
+ /**
52
+ * What a plugin/app contributes: a single contribution or an array per slot.
53
+ * Authored on `KratosPluginClient.slots` and `mountAdminPanel({ slots })`.
54
+ */
55
+ export type SlotMap = Partial<Record<SlotName, SlotContribution | SlotContribution[]>>;
56
+ /** Internal resolved form: every slot maps to a sorted array of contributions. */
57
+ export type ResolvedSlots = Record<string, SlotContribution[]>;
58
+ /**
59
+ * Built-in slot names as a const object, for autocomplete and refactor-safe
60
+ * references without losing the open `SlotName` string union.
61
+ */
62
+ export declare const SLOT_NAMES: {
63
+ readonly headerLeft: "header.left";
64
+ readonly headerRight: "header.right";
65
+ readonly headerUserMenu: "header.userMenu";
66
+ readonly sidebarBrand: "sidebar.brand";
67
+ readonly sidebarTop: "sidebar.top";
68
+ readonly sidebarBottom: "sidebar.bottom";
69
+ readonly panelFooter: "panel.footer";
70
+ readonly tableToolbar: "table.toolbar";
71
+ readonly tableAboveTable: "table.aboveTable";
72
+ readonly tableBelowTable: "table.belowTable";
73
+ readonly tableBulkActions: "table.bulkActions";
74
+ readonly tableRowActions: "table.rowActions";
75
+ readonly formHeader: "form.header";
76
+ readonly formFooter: "form.footer";
77
+ readonly detailActions: "detail.actions";
78
+ readonly detailTabs: "detail.tabs";
79
+ readonly detailAfterDetails: "detail.afterDetails";
80
+ readonly pageTop: "page.top";
81
+ readonly pageBottom: "page.bottom";
82
+ readonly widgetsAppend: "widgets.append";
83
+ readonly modalHeaderActions: "modal.headerActions";
84
+ readonly modalFooter: "modal.footer";
85
+ readonly loginTop: "login.top";
86
+ readonly loginBelowForm: "login.belowForm";
87
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Built-in slot names as a const object, for autocomplete and refactor-safe
3
+ * references without losing the open `SlotName` string union.
4
+ */
5
+ export const SLOT_NAMES = {
6
+ headerLeft: 'header.left',
7
+ headerRight: 'header.right',
8
+ headerUserMenu: 'header.userMenu',
9
+ sidebarBrand: 'sidebar.brand',
10
+ sidebarTop: 'sidebar.top',
11
+ sidebarBottom: 'sidebar.bottom',
12
+ panelFooter: 'panel.footer',
13
+ tableToolbar: 'table.toolbar',
14
+ tableAboveTable: 'table.aboveTable',
15
+ tableBelowTable: 'table.belowTable',
16
+ tableBulkActions: 'table.bulkActions',
17
+ tableRowActions: 'table.rowActions',
18
+ formHeader: 'form.header',
19
+ formFooter: 'form.footer',
20
+ detailActions: 'detail.actions',
21
+ detailTabs: 'detail.tabs',
22
+ detailAfterDetails: 'detail.afterDetails',
23
+ pageTop: 'page.top',
24
+ pageBottom: 'page.bottom',
25
+ widgetsAppend: 'widgets.append',
26
+ modalHeaderActions: 'modal.headerActions',
27
+ modalFooter: 'modal.footer',
28
+ loginTop: 'login.top',
29
+ loginBelowForm: 'login.belowForm',
30
+ };