@pilotiq/pilotiq 0.7.1 → 0.8.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 (367) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +154 -0
  3. package/CLAUDE.md +59 -3
  4. package/dist/Pilotiq.d.ts +83 -0
  5. package/dist/Pilotiq.d.ts.map +1 -1
  6. package/dist/Pilotiq.js +39 -0
  7. package/dist/Pilotiq.js.map +1 -1
  8. package/dist/actions/Action.d.ts +27 -99
  9. package/dist/actions/Action.d.ts.map +1 -1
  10. package/dist/actions/Action.js +52 -754
  11. package/dist/actions/Action.js.map +1 -1
  12. package/dist/actions/bulkFactories.d.ts +46 -0
  13. package/dist/actions/bulkFactories.d.ts.map +1 -0
  14. package/dist/actions/bulkFactories.js +144 -0
  15. package/dist/actions/bulkFactories.js.map +1 -0
  16. package/dist/actions/crudFactories.d.ts +94 -0
  17. package/dist/actions/crudFactories.d.ts.map +1 -0
  18. package/dist/actions/crudFactories.js +209 -0
  19. package/dist/actions/crudFactories.js.map +1 -0
  20. package/dist/actions/factoryHelpers.d.ts +108 -0
  21. package/dist/actions/factoryHelpers.d.ts.map +1 -0
  22. package/dist/actions/factoryHelpers.js +138 -0
  23. package/dist/actions/factoryHelpers.js.map +1 -0
  24. package/dist/actions/m2mFactories.d.ts +47 -0
  25. package/dist/actions/m2mFactories.d.ts.map +1 -0
  26. package/dist/actions/m2mFactories.js +173 -0
  27. package/dist/actions/m2mFactories.js.map +1 -0
  28. package/dist/actions/relationFactories.d.ts +93 -0
  29. package/dist/actions/relationFactories.d.ts.map +1 -0
  30. package/dist/actions/relationFactories.js +321 -0
  31. package/dist/actions/relationFactories.js.map +1 -0
  32. package/dist/elements/dispatchForm.js +1 -1
  33. package/dist/elements/dispatchForm.js.map +1 -1
  34. package/dist/elements/dispatchTable.js +1 -1
  35. package/dist/elements/dispatchTable.js.map +1 -1
  36. package/dist/fields/Field.d.ts +31 -0
  37. package/dist/fields/Field.d.ts.map +1 -1
  38. package/dist/fields/Field.js +25 -0
  39. package/dist/fields/Field.js.map +1 -1
  40. package/dist/pageData/breadcrumbs.d.ts +42 -0
  41. package/dist/pageData/breadcrumbs.d.ts.map +1 -0
  42. package/dist/pageData/breadcrumbs.js +172 -0
  43. package/dist/pageData/breadcrumbs.js.map +1 -0
  44. package/dist/pageData/forms.d.ts +137 -0
  45. package/dist/pageData/forms.d.ts.map +1 -0
  46. package/dist/pageData/forms.js +427 -0
  47. package/dist/pageData/forms.js.map +1 -0
  48. package/dist/pageData/helpers.d.ts +239 -0
  49. package/dist/pageData/helpers.d.ts.map +1 -0
  50. package/dist/pageData/helpers.js +703 -0
  51. package/dist/pageData/helpers.js.map +1 -0
  52. package/dist/pageData/misc.d.ts +76 -0
  53. package/dist/pageData/misc.d.ts.map +1 -0
  54. package/dist/pageData/misc.js +263 -0
  55. package/dist/pageData/misc.js.map +1 -0
  56. package/dist/pageData/navigation.d.ts +292 -0
  57. package/dist/pageData/navigation.d.ts.map +1 -0
  58. package/dist/pageData/navigation.js +591 -0
  59. package/dist/pageData/navigation.js.map +1 -0
  60. package/dist/pageData/relationPages.d.ts +172 -0
  61. package/dist/pageData/relationPages.d.ts.map +1 -0
  62. package/dist/pageData/relationPages.js +867 -0
  63. package/dist/pageData/relationPages.js.map +1 -0
  64. package/dist/pageData/relationTabs.d.ts +65 -0
  65. package/dist/pageData/relationTabs.d.ts.map +1 -0
  66. package/dist/pageData/relationTabs.js +258 -0
  67. package/dist/pageData/relationTabs.js.map +1 -0
  68. package/dist/pageData/resourcePages.d.ts +48 -0
  69. package/dist/pageData/resourcePages.d.ts.map +1 -0
  70. package/dist/pageData/resourcePages.js +504 -0
  71. package/dist/pageData/resourcePages.js.map +1 -0
  72. package/dist/pageData.d.ts +12 -792
  73. package/dist/pageData.d.ts.map +1 -1
  74. package/dist/pageData.js +24 -3797
  75. package/dist/pageData.js.map +1 -1
  76. package/dist/react/AppShell.d.ts +8 -0
  77. package/dist/react/AppShell.d.ts.map +1 -1
  78. package/dist/react/AppShell.js +11 -1
  79. package/dist/react/AppShell.js.map +1 -1
  80. package/dist/react/CollabExtensionFactoryRegistry.d.ts +47 -0
  81. package/dist/react/CollabExtensionFactoryRegistry.d.ts.map +1 -0
  82. package/dist/react/CollabExtensionFactoryRegistry.js +14 -0
  83. package/dist/react/CollabExtensionFactoryRegistry.js.map +1 -0
  84. package/dist/react/CollabRoomContext.d.ts +37 -0
  85. package/dist/react/CollabRoomContext.d.ts.map +1 -0
  86. package/dist/react/CollabRoomContext.js +12 -0
  87. package/dist/react/CollabRoomContext.js.map +1 -0
  88. package/dist/react/FormCollabBindingRegistry.d.ts +62 -0
  89. package/dist/react/FormCollabBindingRegistry.d.ts.map +1 -0
  90. package/dist/react/FormCollabBindingRegistry.js +14 -0
  91. package/dist/react/FormCollabBindingRegistry.js.map +1 -0
  92. package/dist/react/RecordWrapperGate.d.ts +25 -0
  93. package/dist/react/RecordWrapperGate.d.ts.map +1 -0
  94. package/dist/react/RecordWrapperGate.js +30 -0
  95. package/dist/react/RecordWrapperGate.js.map +1 -0
  96. package/dist/react/RecordWrapperRegistry.d.ts +31 -0
  97. package/dist/react/RecordWrapperRegistry.d.ts.map +1 -0
  98. package/dist/react/RecordWrapperRegistry.js +15 -0
  99. package/dist/react/RecordWrapperRegistry.js.map +1 -0
  100. package/dist/react/SchemaRenderer.d.ts +17 -23
  101. package/dist/react/SchemaRenderer.d.ts.map +1 -1
  102. package/dist/react/SchemaRenderer.js +71 -3647
  103. package/dist/react/SchemaRenderer.js.map +1 -1
  104. package/dist/react/component-slots.d.ts +103 -0
  105. package/dist/react/component-slots.d.ts.map +1 -0
  106. package/dist/react/component-slots.js +18 -0
  107. package/dist/react/component-slots.js.map +1 -0
  108. package/dist/react/fields/BuilderInput.d.ts.map +1 -1
  109. package/dist/react/fields/BuilderInput.js +21 -117
  110. package/dist/react/fields/BuilderInput.js.map +1 -1
  111. package/dist/react/fields/MarkdownInput.d.ts.map +1 -1
  112. package/dist/react/fields/MarkdownInput.js +1 -3
  113. package/dist/react/fields/MarkdownInput.js.map +1 -1
  114. package/dist/react/fields/RepeaterInput.d.ts.map +1 -1
  115. package/dist/react/fields/RepeaterInput.js +22 -127
  116. package/dist/react/fields/RepeaterInput.js.map +1 -1
  117. package/dist/react/fields/rowState.d.ts +40 -0
  118. package/dist/react/fields/rowState.d.ts.map +1 -0
  119. package/dist/react/fields/rowState.js +60 -0
  120. package/dist/react/fields/rowState.js.map +1 -0
  121. package/dist/react/fields/useRowReorderDnd.d.ts +28 -0
  122. package/dist/react/fields/useRowReorderDnd.d.ts.map +1 -0
  123. package/dist/react/fields/useRowReorderDnd.js +51 -0
  124. package/dist/react/fields/useRowReorderDnd.js.map +1 -0
  125. package/dist/react/index.d.ts +9 -0
  126. package/dist/react/index.d.ts.map +1 -1
  127. package/dist/react/index.js +8 -0
  128. package/dist/react/index.js.map +1 -1
  129. package/dist/react/layouts/SidebarLayout.d.ts +1 -1
  130. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  131. package/dist/react/layouts/SidebarLayout.js +10 -2
  132. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  133. package/dist/react/layouts/TopbarLayout.d.ts +1 -1
  134. package/dist/react/layouts/TopbarLayout.d.ts.map +1 -1
  135. package/dist/react/layouts/TopbarLayout.js +19 -11
  136. package/dist/react/layouts/TopbarLayout.js.map +1 -1
  137. package/dist/react/parseRecordEditUrl.d.ts +29 -0
  138. package/dist/react/parseRecordEditUrl.d.ts.map +1 -0
  139. package/dist/react/parseRecordEditUrl.js +25 -0
  140. package/dist/react/parseRecordEditUrl.js.map +1 -0
  141. package/dist/react/persistedState.d.ts +19 -0
  142. package/dist/react/persistedState.d.ts.map +1 -0
  143. package/dist/react/persistedState.js +51 -0
  144. package/dist/react/persistedState.js.map +1 -0
  145. package/dist/react/schemaRenderer/AlertRenderer.d.ts +12 -0
  146. package/dist/react/schemaRenderer/AlertRenderer.d.ts.map +1 -0
  147. package/dist/react/schemaRenderer/AlertRenderer.js +61 -0
  148. package/dist/react/schemaRenderer/AlertRenderer.js.map +1 -0
  149. package/dist/react/schemaRenderer/EntryRenderer.d.ts +13 -0
  150. package/dist/react/schemaRenderer/EntryRenderer.d.ts.map +1 -0
  151. package/dist/react/schemaRenderer/EntryRenderer.js +277 -0
  152. package/dist/react/schemaRenderer/EntryRenderer.js.map +1 -0
  153. package/dist/react/schemaRenderer/SectionRenderer.d.ts +16 -0
  154. package/dist/react/schemaRenderer/SectionRenderer.d.ts.map +1 -0
  155. package/dist/react/schemaRenderer/SectionRenderer.js +62 -0
  156. package/dist/react/schemaRenderer/SectionRenderer.js.map +1 -0
  157. package/dist/react/schemaRenderer/SimpleElements.d.ts +25 -0
  158. package/dist/react/schemaRenderer/SimpleElements.d.ts.map +1 -0
  159. package/dist/react/schemaRenderer/SimpleElements.js +147 -0
  160. package/dist/react/schemaRenderer/SimpleElements.js.map +1 -0
  161. package/dist/react/schemaRenderer/TabsRenderer.d.ts +17 -0
  162. package/dist/react/schemaRenderer/TabsRenderer.d.ts.map +1 -0
  163. package/dist/react/schemaRenderer/TabsRenderer.js +31 -0
  164. package/dist/react/schemaRenderer/TabsRenderer.js.map +1 -0
  165. package/dist/react/schemaRenderer/WizardRenderer.d.ts +34 -0
  166. package/dist/react/schemaRenderer/WizardRenderer.d.ts.map +1 -0
  167. package/dist/react/schemaRenderer/WizardRenderer.js +208 -0
  168. package/dist/react/schemaRenderer/WizardRenderer.js.map +1 -0
  169. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts +21 -0
  170. package/dist/react/schemaRenderer/action/ActionGroupTrigger.d.ts.map +1 -0
  171. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js +82 -0
  172. package/dist/react/schemaRenderer/action/ActionGroupTrigger.js.map +1 -0
  173. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts +30 -0
  174. package/dist/react/schemaRenderer/action/ActionModalDialog.d.ts.map +1 -0
  175. package/dist/react/schemaRenderer/action/ActionModalDialog.js +182 -0
  176. package/dist/react/schemaRenderer/action/ActionModalDialog.js.map +1 -0
  177. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts +17 -0
  178. package/dist/react/schemaRenderer/action/ConfirmActionDialog.d.ts.map +1 -0
  179. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js +19 -0
  180. package/dist/react/schemaRenderer/action/ConfirmActionDialog.js.map +1 -0
  181. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts +16 -0
  182. package/dist/react/schemaRenderer/action/HandlerActionButton.d.ts.map +1 -0
  183. package/dist/react/schemaRenderer/action/HandlerActionButton.js +16 -0
  184. package/dist/react/schemaRenderer/action/HandlerActionButton.js.map +1 -0
  185. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts +22 -0
  186. package/dist/react/schemaRenderer/action/MethodActionButton.d.ts.map +1 -0
  187. package/dist/react/schemaRenderer/action/MethodActionButton.js +26 -0
  188. package/dist/react/schemaRenderer/action/MethodActionButton.js.map +1 -0
  189. package/dist/react/schemaRenderer/action/buttons.d.ts +18 -0
  190. package/dist/react/schemaRenderer/action/buttons.d.ts.map +1 -0
  191. package/dist/react/schemaRenderer/action/buttons.js +74 -0
  192. package/dist/react/schemaRenderer/action/buttons.js.map +1 -0
  193. package/dist/react/schemaRenderer/action/helpers.d.ts +26 -0
  194. package/dist/react/schemaRenderer/action/helpers.d.ts.map +1 -0
  195. package/dist/react/schemaRenderer/action/helpers.js +126 -0
  196. package/dist/react/schemaRenderer/action/helpers.js.map +1 -0
  197. package/dist/react/schemaRenderer/action/renderAction.d.ts +21 -0
  198. package/dist/react/schemaRenderer/action/renderAction.d.ts.map +1 -0
  199. package/dist/react/schemaRenderer/action/renderAction.js +102 -0
  200. package/dist/react/schemaRenderer/action/renderAction.js.map +1 -0
  201. package/dist/react/schemaRenderer/columnFormat.d.ts +10 -0
  202. package/dist/react/schemaRenderer/columnFormat.d.ts.map +1 -0
  203. package/dist/react/schemaRenderer/columnFormat.js +76 -0
  204. package/dist/react/schemaRenderer/columnFormat.js.map +1 -0
  205. package/dist/react/schemaRenderer/constants.d.ts +8 -0
  206. package/dist/react/schemaRenderer/constants.d.ts.map +1 -0
  207. package/dist/react/schemaRenderer/constants.js +45 -0
  208. package/dist/react/schemaRenderer/constants.js.map +1 -0
  209. package/dist/react/schemaRenderer/form/FormRenderer.d.ts +29 -0
  210. package/dist/react/schemaRenderer/form/FormRenderer.d.ts.map +1 -0
  211. package/dist/react/schemaRenderer/form/FormRenderer.js +152 -0
  212. package/dist/react/schemaRenderer/form/FormRenderer.js.map +1 -0
  213. package/dist/react/schemaRenderer/form/renderField.d.ts +6 -0
  214. package/dist/react/schemaRenderer/form/renderField.d.ts.map +1 -0
  215. package/dist/react/schemaRenderer/form/renderField.js +239 -0
  216. package/dist/react/schemaRenderer/form/renderField.js.map +1 -0
  217. package/dist/react/schemaRenderer/helpers.d.ts +32 -0
  218. package/dist/react/schemaRenderer/helpers.d.ts.map +1 -0
  219. package/dist/react/schemaRenderer/helpers.js +52 -0
  220. package/dist/react/schemaRenderer/helpers.js.map +1 -0
  221. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts +60 -0
  222. package/dist/react/schemaRenderer/table/CardsLayoutBody.d.ts.map +1 -0
  223. package/dist/react/schemaRenderer/table/CardsLayoutBody.js +189 -0
  224. package/dist/react/schemaRenderer/table/CardsLayoutBody.js.map +1 -0
  225. package/dist/react/schemaRenderer/table/TableRenderer.d.ts +29 -0
  226. package/dist/react/schemaRenderer/table/TableRenderer.d.ts.map +1 -0
  227. package/dist/react/schemaRenderer/table/TableRenderer.js +85 -0
  228. package/dist/react/schemaRenderer/table/TableRenderer.js.map +1 -0
  229. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts +18 -0
  230. package/dist/react/schemaRenderer/table/TableRendererBody.d.ts.map +1 -0
  231. package/dist/react/schemaRenderer/table/TableRendererBody.js +555 -0
  232. package/dist/react/schemaRenderer/table/TableRendererBody.js.map +1 -0
  233. package/dist/react/schemaRenderer/table/filters.d.ts +263 -0
  234. package/dist/react/schemaRenderer/table/filters.d.ts.map +1 -0
  235. package/dist/react/schemaRenderer/table/filters.js +497 -0
  236. package/dist/react/schemaRenderer/table/filters.js.map +1 -0
  237. package/dist/react/schemaRenderer/table/formatCell.d.ts +11 -0
  238. package/dist/react/schemaRenderer/table/formatCell.d.ts.map +1 -0
  239. package/dist/react/schemaRenderer/table/formatCell.js +172 -0
  240. package/dist/react/schemaRenderer/table/formatCell.js.map +1 -0
  241. package/dist/react/schemaRenderer/table/links.d.ts +42 -0
  242. package/dist/react/schemaRenderer/table/links.d.ts.map +1 -0
  243. package/dist/react/schemaRenderer/table/links.js +55 -0
  244. package/dist/react/schemaRenderer/table/links.js.map +1 -0
  245. package/dist/react/schemaRenderer/table/renderRowActions.d.ts +13 -0
  246. package/dist/react/schemaRenderer/table/renderRowActions.d.ts.map +1 -0
  247. package/dist/react/schemaRenderer/table/renderRowActions.js +25 -0
  248. package/dist/react/schemaRenderer/table/renderRowActions.js.map +1 -0
  249. package/dist/react/schemaRenderer/table/url.d.ts +41 -0
  250. package/dist/react/schemaRenderer/table/url.d.ts.map +1 -0
  251. package/dist/react/schemaRenderer/table/url.js +114 -0
  252. package/dist/react/schemaRenderer/table/url.js.map +1 -0
  253. package/dist/routes/globals.d.ts +13 -0
  254. package/dist/routes/globals.d.ts.map +1 -0
  255. package/dist/routes/globals.js +131 -0
  256. package/dist/routes/globals.js.map +1 -0
  257. package/dist/routes/helpers.d.ts +217 -0
  258. package/dist/routes/helpers.d.ts.map +1 -0
  259. package/dist/routes/helpers.js +498 -0
  260. package/dist/routes/helpers.js.map +1 -0
  261. package/dist/routes/pages.d.ts +15 -0
  262. package/dist/routes/pages.d.ts.map +1 -0
  263. package/dist/routes/pages.js +145 -0
  264. package/dist/routes/pages.js.map +1 -0
  265. package/dist/routes/panel.d.ts +19 -0
  266. package/dist/routes/panel.d.ts.map +1 -0
  267. package/dist/routes/panel.js +191 -0
  268. package/dist/routes/panel.js.map +1 -0
  269. package/dist/routes/relations.d.ts +21 -0
  270. package/dist/routes/relations.d.ts.map +1 -0
  271. package/dist/routes/relations.js +1239 -0
  272. package/dist/routes/relations.js.map +1 -0
  273. package/dist/routes/resources.d.ts +28 -0
  274. package/dist/routes/resources.d.ts.map +1 -0
  275. package/dist/routes/resources.js +741 -0
  276. package/dist/routes/resources.js.map +1 -0
  277. package/dist/routes/theme.d.ts +12 -0
  278. package/dist/routes/theme.d.ts.map +1 -0
  279. package/dist/routes/theme.js +82 -0
  280. package/dist/routes/theme.js.map +1 -0
  281. package/dist/routes.d.ts.map +1 -1
  282. package/dist/routes.js +64 -3078
  283. package/dist/routes.js.map +1 -1
  284. package/dist/vite.d.ts +1 -0
  285. package/dist/vite.d.ts.map +1 -1
  286. package/dist/vite.js +31 -10
  287. package/dist/vite.js.map +1 -1
  288. package/package.json +2 -1
  289. package/src/Pilotiq.ts +95 -0
  290. package/src/actions/Action.ts +79 -723
  291. package/src/actions/bulkFactories.ts +168 -0
  292. package/src/actions/crudFactories.ts +220 -0
  293. package/src/actions/factoryHelpers.ts +177 -0
  294. package/src/actions/m2mFactories.ts +193 -0
  295. package/src/actions/relationFactories.ts +372 -0
  296. package/src/elements/dispatchForm.ts +1 -1
  297. package/src/elements/dispatchTable.ts +1 -1
  298. package/src/fields/Field.ts +39 -0
  299. package/src/pageData/breadcrumbs.ts +288 -0
  300. package/src/pageData/forms.ts +578 -0
  301. package/src/pageData/helpers.ts +764 -0
  302. package/src/pageData/misc.ts +347 -0
  303. package/src/pageData/navigation.ts +779 -0
  304. package/src/pageData/relationPages.ts +1246 -0
  305. package/src/pageData/relationTabs.ts +286 -0
  306. package/src/pageData/resourcePages.ts +593 -0
  307. package/src/pageData.ts +122 -4731
  308. package/src/react/AppShell.tsx +27 -1
  309. package/src/react/CollabExtensionFactoryRegistry.ts +55 -0
  310. package/src/react/CollabRoomContext.ts +42 -0
  311. package/src/react/FormCollabBindingRegistry.ts +72 -0
  312. package/src/react/RecordWrapperGate.tsx +40 -0
  313. package/src/react/RecordWrapperRegistry.ts +39 -0
  314. package/src/react/SchemaRenderer.tsx +230 -6479
  315. package/src/react/component-slots.test.ts +103 -0
  316. package/src/react/component-slots.ts +116 -0
  317. package/src/react/fields/BuilderInput.tsx +29 -117
  318. package/src/react/fields/MarkdownInput.tsx +0 -1
  319. package/src/react/fields/RepeaterInput.tsx +29 -130
  320. package/src/react/fields/rowState.ts +106 -0
  321. package/src/react/fields/useRowReorderDnd.ts +78 -0
  322. package/src/react/index.ts +38 -0
  323. package/src/react/layouts/SidebarLayout.tsx +39 -28
  324. package/src/react/layouts/TopbarLayout.tsx +70 -57
  325. package/src/react/parseRecordEditUrl.test.ts +75 -0
  326. package/src/react/parseRecordEditUrl.ts +55 -0
  327. package/src/react/persistedState.ts +40 -0
  328. package/src/react/schemaRenderer/AlertRenderer.tsx +112 -0
  329. package/src/react/schemaRenderer/EntryRenderer.tsx +501 -0
  330. package/src/react/schemaRenderer/SectionRenderer.tsx +120 -0
  331. package/src/react/schemaRenderer/SimpleElements.tsx +306 -0
  332. package/src/react/schemaRenderer/TabsRenderer.tsx +62 -0
  333. package/src/react/schemaRenderer/WizardRenderer.tsx +338 -0
  334. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +177 -0
  335. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +273 -0
  336. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +61 -0
  337. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +43 -0
  338. package/src/react/schemaRenderer/action/MethodActionButton.tsx +64 -0
  339. package/src/react/schemaRenderer/action/buttons.tsx +99 -0
  340. package/src/react/schemaRenderer/action/helpers.ts +140 -0
  341. package/src/react/schemaRenderer/action/renderAction.tsx +245 -0
  342. package/src/react/schemaRenderer/columnFormat.ts +65 -0
  343. package/src/react/schemaRenderer/constants.ts +50 -0
  344. package/src/react/schemaRenderer/form/FormRenderer.tsx +233 -0
  345. package/src/react/schemaRenderer/form/renderField.tsx +511 -0
  346. package/src/react/schemaRenderer/helpers.tsx +81 -0
  347. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +308 -0
  348. package/src/react/schemaRenderer/table/TableRenderer.tsx +123 -0
  349. package/src/react/schemaRenderer/table/TableRendererBody.tsx +974 -0
  350. package/src/react/schemaRenderer/table/filters.tsx +1233 -0
  351. package/src/react/schemaRenderer/table/formatCell.tsx +264 -0
  352. package/src/react/schemaRenderer/table/links.tsx +112 -0
  353. package/src/react/schemaRenderer/table/renderRowActions.tsx +52 -0
  354. package/src/react/schemaRenderer/table/url.tsx +143 -0
  355. package/src/routes/globals.ts +154 -0
  356. package/src/routes/helpers.ts +668 -0
  357. package/src/routes/pages.ts +173 -0
  358. package/src/routes/panel.ts +204 -0
  359. package/src/routes/relations.ts +1219 -0
  360. package/src/routes/resources.ts +786 -0
  361. package/src/routes/theme.ts +109 -0
  362. package/src/routes.test.ts +1 -1
  363. package/src/routes.ts +64 -3176
  364. package/src/schema/TableWidget.test.ts +2 -2
  365. package/src/theme/migrate.test.ts +178 -0
  366. package/src/vite.test.ts +184 -0
  367. package/src/vite.ts +31 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/action/buttons.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { NotificationMeta } from '../../../notifications/Notification.js';
2
+ export type Notify = (n: NotificationMeta | Omit<NotificationMeta, 'id'>) => void;
3
+ export type Navigate = (url: string) => void;
4
+ /** Drain `notifications[]` from a JSON response into `useToast().notify`. */
5
+ export declare function dispatchNotifications(data: unknown, notify: Notify): void;
6
+ /**
7
+ * Fetch + JSON dispatch for form-method actions (Delete-style — no
8
+ * server-rendered <form>, no 303 redirect, no full page reload). Sends
9
+ * `_method` as a body field so Hono's POST handler dispatches the
10
+ * intended verb. On success: drain notifications, SPA-navigate to the
11
+ * server-supplied redirect (or stay on current path if none).
12
+ *
13
+ * Failure modes:
14
+ * - 4xx/5xx with `{ error }`: surfaced as an error toast.
15
+ * - Network errors: error toast with the exception message.
16
+ */
17
+ export declare function dispatchMethodAction(url: string, method: 'post' | 'put' | 'patch' | 'delete', navigate: Navigate, notify: Notify): Promise<void>;
18
+ /**
19
+ * Fetch + JSON dispatch for handler-style actions (no schema, no modal,
20
+ * just a button). Sends `ids[]` plus arbitrary `values` fields. Server
21
+ * returns `{ ok, redirect, notifications }` (or `{ ok: false, error }` on
22
+ * failure). On success: drain notifications, SPA-navigate; on failure:
23
+ * surface the error as a toast. No full page reload in any case.
24
+ */
25
+ export declare function dispatchHandlerAction(url: string, ids: string[], navigate: Navigate, notify: Notify, values?: Record<string, string>, formSnapshot?: FormData): Promise<void>;
26
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/action/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAQ9E,MAAM,MAAM,MAAM,GAAK,CAAC,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA;AACnF,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;AAE5C,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAO,MAAM,EAChB,MAAM,EAAI,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,EAC7C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAI,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAO,MAAM,EAChB,GAAG,EAAO,MAAM,EAAE,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAI,MAAM,EAChB,MAAM,GAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACrC,YAAY,CAAC,EAAE,QAAQ,GACtB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,126 @@
1
+ /** Drain `notifications[]` from a JSON response into `useToast().notify`. */
2
+ export function dispatchNotifications(data, notify) {
3
+ const notifs = data.notifications;
4
+ if (!notifs || notifs.length === 0)
5
+ return;
6
+ for (const n of notifs)
7
+ notify(n);
8
+ }
9
+ /**
10
+ * Fetch + JSON dispatch for form-method actions (Delete-style — no
11
+ * server-rendered <form>, no 303 redirect, no full page reload). Sends
12
+ * `_method` as a body field so Hono's POST handler dispatches the
13
+ * intended verb. On success: drain notifications, SPA-navigate to the
14
+ * server-supplied redirect (or stay on current path if none).
15
+ *
16
+ * Failure modes:
17
+ * - 4xx/5xx with `{ error }`: surfaced as an error toast.
18
+ * - Network errors: error toast with the exception message.
19
+ */
20
+ export async function dispatchMethodAction(url, method, navigate, notify) {
21
+ try {
22
+ const fd = new FormData();
23
+ if (method !== 'post')
24
+ fd.append('_method', method);
25
+ const res = await fetch(url, {
26
+ method: 'POST',
27
+ headers: { 'Accept': 'application/json' },
28
+ body: fd,
29
+ });
30
+ const data = await res.json().catch(() => ({}));
31
+ if (!res.ok) {
32
+ const message = String(data.error ?? `Request failed (${res.status})`);
33
+ notify({ type: 'error', title: 'Action failed', body: message });
34
+ return;
35
+ }
36
+ dispatchNotifications(data, notify);
37
+ const redirect = String(data.redirect ?? '');
38
+ if (redirect)
39
+ navigate(redirect);
40
+ else if (typeof window !== 'undefined')
41
+ navigate(window.location.pathname + window.location.search);
42
+ }
43
+ catch (err) {
44
+ notify({ type: 'error', title: 'Action failed', body: err instanceof Error ? err.message : String(err) });
45
+ }
46
+ }
47
+ /**
48
+ * Fetch + JSON dispatch for handler-style actions (no schema, no modal,
49
+ * just a button). Sends `ids[]` plus arbitrary `values` fields. Server
50
+ * returns `{ ok, redirect, notifications }` (or `{ ok: false, error }` on
51
+ * failure). On success: drain notifications, SPA-navigate; on failure:
52
+ * surface the error as a toast. No full page reload in any case.
53
+ */
54
+ export async function dispatchHandlerAction(url, ids, navigate, notify, values = {}, formSnapshot) {
55
+ try {
56
+ // When `formSnapshot` is set (Repeater / Builder `extraItemActions`
57
+ // dispatch), the snapshot already carries the form's full state — we
58
+ // just append `ids` / `values` on top so the server sees both the
59
+ // form body (for coerceFormValues + row hydration) and the action's
60
+ // own meta keys.
61
+ const fd = formSnapshot ?? new FormData();
62
+ for (const id of ids)
63
+ fd.append('ids', id);
64
+ for (const [k, v] of Object.entries(values))
65
+ fd.append(k, v);
66
+ const res = await fetch(url, {
67
+ method: 'POST',
68
+ headers: { 'Accept': 'application/json' },
69
+ body: fd,
70
+ });
71
+ // Download branch — handlers that return `{ download }` ask the server
72
+ // to write the body inline with `Content-Disposition: attachment`. Trip
73
+ // a browser download via a synthetic `<a download>` and exit early
74
+ // (no notify drain / no SPA-nav — the file IS the success signal).
75
+ if (res.ok && triggerDownloadIfAttachment(res)) {
76
+ await res.blob().then(triggerBlobDownload(res));
77
+ return;
78
+ }
79
+ const data = await res.json().catch(() => ({}));
80
+ if (!res.ok) {
81
+ const message = String(data.error ?? `Request failed (${res.status})`);
82
+ notify({ type: 'error', title: 'Action failed', body: message });
83
+ return;
84
+ }
85
+ dispatchNotifications(data, notify);
86
+ const redirect = String(data.redirect ?? '');
87
+ if (redirect)
88
+ navigate(redirect);
89
+ else if (typeof window !== 'undefined')
90
+ navigate(window.location.pathname + window.location.search);
91
+ }
92
+ catch (err) {
93
+ notify({ type: 'error', title: 'Action failed', body: err instanceof Error ? err.message : String(err) });
94
+ }
95
+ }
96
+ /** Returns true when the response carries `Content-Disposition: attachment`,
97
+ * which is how the route layer signals a download payload. The header
98
+ * match is case-insensitive (different runtimes normalize differently). */
99
+ function triggerDownloadIfAttachment(res) {
100
+ const cd = res.headers.get('Content-Disposition') ?? res.headers.get('content-disposition') ?? '';
101
+ return cd.toLowerCase().includes('attachment');
102
+ }
103
+ /** Returns a closure that converts the blob into a download by clicking
104
+ * a synthetic `<a download="…">`. Filename is parsed from
105
+ * `Content-Disposition`'s `filename="…"` parameter; falls back to
106
+ * `'download'` when missing. Only mounted when `document` is present
107
+ * (no-op in SSR). */
108
+ function triggerBlobDownload(res) {
109
+ const cd = res.headers.get('Content-Disposition') ?? res.headers.get('content-disposition') ?? '';
110
+ const match = cd.match(/filename\*?=(?:UTF-8'')?["']?([^"';\r\n]+)["']?/i);
111
+ const filename = (match?.[1] ?? 'download').trim();
112
+ return (blob) => {
113
+ if (typeof document === 'undefined' || typeof URL === 'undefined')
114
+ return;
115
+ const objUrl = URL.createObjectURL(blob);
116
+ const a = document.createElement('a');
117
+ a.href = objUrl;
118
+ a.download = filename;
119
+ a.style.display = 'none';
120
+ document.body.appendChild(a);
121
+ a.click();
122
+ a.remove();
123
+ URL.revokeObjectURL(objUrl);
124
+ };
125
+ }
126
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/action/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { ElementMeta } from '../../../schema/Element.js';
3
+ import { type RenderActionOptions } from './buttons.js';
4
+ /**
5
+ * Function-prop deps for action rendering — injected from
6
+ * `SchemaRenderer.tsx`'s top-level dispatch. `renderElement` is needed
7
+ * for slot-component pass-through and modal-content-footer; `renderFormChild`
8
+ * is needed by `ActionModalDialog` for its form-body fields.
9
+ */
10
+ export interface ActionRendererDeps {
11
+ renderElement: (el: ElementMeta, index: number) => React.ReactNode;
12
+ renderFormChild: (child: ElementMeta, index: number, values: Record<string, unknown>, errors: Record<string, string[]>) => React.ReactNode;
13
+ }
14
+ /** Render either a single Action or an ActionGroup based on `el.type`.
15
+ * Used by callsites that accept both (table header / bulk toolbars,
16
+ * heading actions, container schemas). */
17
+ export declare function renderActionLike(el: ElementMeta, index: number, opts: RenderActionOptions, deps: ActionRendererDeps): React.ReactNode;
18
+ /** Render a single `Action` element. Dispatches on the Action's mode
19
+ * (submit / href / method / handler) and chrome (confirm, modal). */
20
+ export declare function renderAction(el: ElementMeta, index: number, opts: RenderActionOptions, deps: ActionRendererDeps): React.ReactNode;
21
+ //# sourceMappingURL=renderAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderAction.d.ts","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/action/renderAction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAA;AAOrB;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAG,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;IACnE,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;CAC3I;AAED;;0CAE0C;AAC1C,wBAAgB,gBAAgB,CAC9B,EAAE,EAAK,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAG,mBAAmB,EAC1B,IAAI,EAAG,kBAAkB,GACxB,KAAK,CAAC,SAAS,CAqBjB;AAED;sEACsE;AACtE,wBAAgB,YAAY,CAC1B,EAAE,EAAK,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAG,mBAAmB,EAC1B,IAAI,EAAG,kBAAkB,GACxB,KAAK,CAAC,SAAS,CAoLjB"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { withTooltip } from '../helpers.js';
3
+ import { actionButtonClass, renderActionBadge, renderActionIcon, } from './buttons.js';
4
+ import { ActionGroupTrigger } from './ActionGroupTrigger.js';
5
+ import { ActionModalDialog } from './ActionModalDialog.js';
6
+ import { ConfirmActionDialog } from './ConfirmActionDialog.js';
7
+ import { HandlerActionButton } from './HandlerActionButton.js';
8
+ import { MethodActionButton } from './MethodActionButton.js';
9
+ /** Render either a single Action or an ActionGroup based on `el.type`.
10
+ * Used by callsites that accept both (table header / bulk toolbars,
11
+ * heading actions, container schemas). */
12
+ export function renderActionLike(el, index, opts, deps) {
13
+ if (el.type === 'slotComponent') {
14
+ // Plugin-contributed React mount — render through the main element
15
+ // dispatcher, which looks up the registered component and forwards
16
+ // its serialised props bag. Keeps every action-row slot (heading
17
+ // children, alert footer, empty-state footer, table-toolbar bulk
18
+ // strip) usable as a plugin extension point.
19
+ return deps.renderElement(el, index);
20
+ }
21
+ if (el.type === 'actionGroup') {
22
+ return (_jsx(ActionGroupTrigger, { el: el, ids: opts.ids ?? [], renderFormChild: deps.renderFormChild, renderElement: deps.renderElement }, index));
23
+ }
24
+ return renderAction(el, index, opts, deps);
25
+ }
26
+ /** Render a single `Action` element. Dispatches on the Action's mode
27
+ * (submit / href / method / handler) and chrome (confirm, modal). */
28
+ export function renderAction(el, index, opts, deps) {
29
+ const name = String(el['name'] ?? '');
30
+ const label = String(el['label'] ?? name);
31
+ const destructive = Boolean(el['destructive']);
32
+ const href = el['href'];
33
+ const method = el['method'];
34
+ const actionUrl = el['action'];
35
+ const dispatchUrl = el['dispatchUrl'];
36
+ const submit = Boolean(el['submit']);
37
+ const confirm = el['confirm'];
38
+ const tooltip = el['tooltip'];
39
+ const iconOnly = Boolean(el['iconOnly']);
40
+ const isDisabled = Boolean(el['disabled']);
41
+ const className = actionButtonClass(el, opts) + (isDisabled ? ' opacity-50 cursor-not-allowed pointer-events-none' : '');
42
+ const icon = renderActionIcon(el);
43
+ const badge = renderActionBadge(el);
44
+ // Icon-only buttons hide the label visually but expose it via aria-label.
45
+ const ariaLabel = iconOnly ? label : undefined;
46
+ const inner = iconOnly ? _jsxs(_Fragment, { children: [icon, badge] }) : _jsxs(_Fragment, { children: [icon, _jsx("span", { children: label }), badge] });
47
+ // Submit-style action — renders as <button type="submit">. Optionally
48
+ // targets a specific form via the HTML `form="<id>"` attribute so the
49
+ // button can submit a form it lives outside of (e.g. a page-header
50
+ // Save button driving a form below). When `formField` is set, the
51
+ // button posts a sentinel name/value pair (e.g. `_continueCreate=1`)
52
+ // so the server can branch on which submit was clicked.
53
+ if (submit) {
54
+ const formTarget = el['form'];
55
+ const formField = el['formField'];
56
+ if (confirm) {
57
+ // Confirm-gated submit: render as type="button" so click opens the
58
+ // dialog instead of submitting; on confirm, programmatically submit
59
+ // the targeted form (or the closest enclosing form if no formTarget).
60
+ // `formField` is intentionally not threaded here — programmatic
61
+ // `requestSubmit()` has no submitter, so the name/value pair would
62
+ // be lost anyway. Pair `.confirm()` with a hidden input on the form
63
+ // if you need a sentinel under a confirm flow.
64
+ return (_jsx(ConfirmActionDialog, { title: confirm.title, message: confirm.message, destructive: destructive, onConfirm: () => {
65
+ if (typeof document === 'undefined')
66
+ return;
67
+ const form = formTarget
68
+ ? document.getElementById(formTarget)
69
+ : document.querySelector('form');
70
+ form?.requestSubmit();
71
+ }, trigger: (open) => withTooltip(_jsx("button", { type: "button", onClick: open, className: className, "data-action-name": name, "aria-label": ariaLabel, children: inner }), tooltip) }, index));
72
+ }
73
+ return withTooltip(_jsx("button", { type: "submit", form: formTarget, className: className, "data-action-name": name, "aria-label": ariaLabel, ...(formField ? { name: formField.name, value: formField.value } : {}), children: inner }, index), tooltip);
74
+ }
75
+ // Substitute the `:id` placeholder with the current row id when this
76
+ // action is rendered in a row context. Lets row-level link/form actions
77
+ // ship a single template URL like `/admin/articles/:id/edit`.
78
+ const rowId = opts.ids?.length === 1 ? opts.ids[0] : undefined;
79
+ const resolveTemplate = (s) => s && rowId ? s.replace(':id', rowId) : s;
80
+ // Link-style action.
81
+ if (href) {
82
+ return withTooltip(_jsx("a", { href: resolveTemplate(href), className: className, "data-action-name": name, "aria-label": ariaLabel, children: inner }, index), tooltip);
83
+ }
84
+ // Form-style action (POST/PUT/PATCH/DELETE) — fetch + JSON, no full reload.
85
+ if (method) {
86
+ const resolvedUrl = resolveTemplate(actionUrl);
87
+ return (_jsx(MethodActionButton, { url: resolvedUrl, method: method, confirm: confirm, destructive: destructive, className: className, name: name, ariaLabel: ariaLabel, tooltip: tooltip, inner: inner }, index));
88
+ }
89
+ // Handler-style action — fetch + JSON dispatch with `ids[]` body.
90
+ if (dispatchUrl) {
91
+ const ids = opts.ids ?? [];
92
+ const modal = el['modal'];
93
+ if (confirm || modal) {
94
+ return (_jsx(ActionModalDialog, { meta: el, ids: ids, trigger: (open) => withTooltip(_jsx("button", { type: "button", onClick: open, className: className, "data-action-name": name, "aria-label": ariaLabel, children: inner }), tooltip), renderFormChild: deps.renderFormChild, renderElement: deps.renderElement }, index));
95
+ }
96
+ return (_jsx(HandlerActionButton, { url: dispatchUrl, ids: ids, className: className, name: name, ariaLabel: ariaLabel, tooltip: tooltip, inner: inner }, index));
97
+ }
98
+ // No dispatch wired (no href / method / dispatchUrl). Render a disabled
99
+ // placeholder so the user sees the button, but it does nothing.
100
+ return withTooltip(_jsx("button", { type: "button", disabled: true, className: className + ' opacity-50 cursor-not-allowed', "data-action-name": name, "aria-label": ariaLabel, children: inner }, index), tooltip);
101
+ }
102
+ //# sourceMappingURL=renderAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderAction.js","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/action/renderAction.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Apply a built-in `ColumnFormat` to a raw value; returns a string.
2
+ *
3
+ * Used by both `formatCell` (table layer) and `renderEntry` (infolist
4
+ * Phase #16). Hoisted out of the table block so EntryRenderer doesn't
5
+ * need to import across phases. */
6
+ export declare function applyColumnFormat(value: unknown, format: {
7
+ kind: string;
8
+ [k: string]: unknown;
9
+ }): string;
10
+ //# sourceMappingURL=columnFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnFormat.d.ts","sourceRoot":"","sources":["../../../src/react/schemaRenderer/columnFormat.ts"],"names":[],"mappings":"AAAA;;;;oCAIoC;AACpC,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,CA2DxG"}
@@ -0,0 +1,76 @@
1
+ /** Apply a built-in `ColumnFormat` to a raw value; returns a string.
2
+ *
3
+ * Used by both `formatCell` (table layer) and `renderEntry` (infolist
4
+ * Phase #16). Hoisted out of the table block so EntryRenderer doesn't
5
+ * need to import across phases. */
6
+ export function applyColumnFormat(value, format) {
7
+ if (value === null || value === undefined || value === '')
8
+ return '';
9
+ switch (format['kind']) {
10
+ case 'dateTime': {
11
+ const d = value instanceof Date ? value : new Date(String(value));
12
+ if (isNaN(d.getTime()))
13
+ return String(value);
14
+ // Default — locale-aware short date+time. Custom patterns aren't
15
+ // supported (no date-fns dep); pattern is kept on meta for future use.
16
+ return d.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });
17
+ }
18
+ case 'since': {
19
+ const d = value instanceof Date ? value : new Date(String(value));
20
+ if (isNaN(d.getTime()))
21
+ return String(value);
22
+ const seconds = Math.round((Date.now() - d.getTime()) / 1000);
23
+ const abs = Math.abs(seconds);
24
+ const past = seconds >= 0;
25
+ const fmt = (n, unit) => past ? `${n} ${unit}${n === 1 ? '' : 's'} ago` : `in ${n} ${unit}${n === 1 ? '' : 's'}`;
26
+ if (abs < 60)
27
+ return past ? 'just now' : 'in a moment';
28
+ if (abs < 3600)
29
+ return fmt(Math.floor(abs / 60), 'minute');
30
+ if (abs < 86400)
31
+ return fmt(Math.floor(abs / 3600), 'hour');
32
+ if (abs < 2592000)
33
+ return fmt(Math.floor(abs / 86400), 'day');
34
+ if (abs < 31536000)
35
+ return fmt(Math.floor(abs / 2592000), 'month');
36
+ return fmt(Math.floor(abs / 31536000), 'year');
37
+ }
38
+ case 'money': {
39
+ const n = typeof value === 'number' ? value : Number(value);
40
+ if (isNaN(n))
41
+ return String(value);
42
+ const currency = String(format['currency'] ?? 'USD');
43
+ const locale = format['locale'];
44
+ return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(n);
45
+ }
46
+ case 'numeric': {
47
+ const n = typeof value === 'number' ? value : Number(value);
48
+ if (isNaN(n))
49
+ return String(value);
50
+ const decimals = format['decimals'];
51
+ const locale = format['locale'];
52
+ const opts = {};
53
+ if (decimals !== undefined) {
54
+ opts.minimumFractionDigits = decimals;
55
+ opts.maximumFractionDigits = decimals;
56
+ }
57
+ return new Intl.NumberFormat(locale, opts).format(n);
58
+ }
59
+ case 'limit': {
60
+ const s = String(value);
61
+ const n = format['chars'];
62
+ return s.length > n ? s.slice(0, n) + '…' : s;
63
+ }
64
+ case 'words': {
65
+ const s = String(value).trim();
66
+ if (s.length === 0)
67
+ return s;
68
+ const tokens = s.split(/\s+/);
69
+ const n = format['words'];
70
+ return tokens.length > n ? tokens.slice(0, n).join(' ') + '…' : s;
71
+ }
72
+ default:
73
+ return String(value);
74
+ }
75
+ }
76
+ //# sourceMappingURL=columnFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnFormat.js","sourceRoot":"","sources":["../../../src/react/schemaRenderer/columnFormat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const TEXT_COLOR_CLASSES: Record<string, string>;
2
+ export declare const TEXT_SIZE_CLASSES: Record<string, string>;
3
+ export declare const TEXT_WEIGHT_CLASSES: Record<string, string>;
4
+ export declare const COLUMN_COLOR_CLASSES: Record<string, string>;
5
+ export declare const COLUMN_WEIGHT_CLASSES: Record<string, string>;
6
+ export declare const BADGE_COLOR_CLASSES: Record<string, string>;
7
+ export declare const alertStyles: Record<string, string>;
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/react/schemaRenderer/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQrD,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMpD,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKtD,CAAA;AAMD,eAAO,MAAM,oBAAoB,wBAAsB,CAAA;AACvD,eAAO,MAAM,qBAAqB,wBAAsB,CAAA;AAExD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOtD,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAA"}
@@ -0,0 +1,45 @@
1
+ // Tailwind-class lookup tables shared across SchemaRenderer's element
2
+ // dispatchers. Pure data — no React, no DOM.
3
+ export const TEXT_COLOR_CLASSES = {
4
+ default: '',
5
+ muted: 'text-muted-foreground',
6
+ primary: 'text-primary',
7
+ destructive: 'text-destructive',
8
+ success: 'text-emerald-600 dark:text-emerald-400',
9
+ warning: 'text-amber-600 dark:text-amber-400',
10
+ info: 'text-blue-600 dark:text-blue-400',
11
+ };
12
+ export const TEXT_SIZE_CLASSES = {
13
+ xs: 'text-xs',
14
+ sm: 'text-sm',
15
+ base: 'text-base',
16
+ lg: 'text-lg',
17
+ xl: 'text-xl',
18
+ };
19
+ export const TEXT_WEIGHT_CLASSES = {
20
+ normal: 'font-normal',
21
+ medium: 'font-medium',
22
+ semibold: 'font-semibold',
23
+ bold: 'font-bold',
24
+ };
25
+ // `ColumnColor` / `ColumnWeight` mirror the text-side scales 1:1. Kept as
26
+ // named aliases so column-cell call sites still read distinctly, but a
27
+ // single source-of-truth means adding a new color / weight only touches
28
+ // the text map.
29
+ export const COLUMN_COLOR_CLASSES = TEXT_COLOR_CLASSES;
30
+ export const COLUMN_WEIGHT_CLASSES = TEXT_WEIGHT_CLASSES;
31
+ export const BADGE_COLOR_CLASSES = {
32
+ gray: 'bg-muted text-muted-foreground',
33
+ primary: 'bg-primary/10 text-primary',
34
+ success: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-200',
35
+ warning: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-200',
36
+ destructive: 'bg-destructive/10 text-destructive',
37
+ info: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-200',
38
+ };
39
+ export const alertStyles = {
40
+ info: 'border-blue-200 bg-blue-50 text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200',
41
+ warning: 'border-amber-200 bg-amber-50 text-amber-800 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-200',
42
+ success: 'border-green-200 bg-green-50 text-green-800 dark:border-green-800 dark:bg-green-950 dark:text-green-200',
43
+ danger: 'border-red-200 bg-red-50 text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200',
44
+ };
45
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/react/schemaRenderer/constants.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,6CAA6C;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,OAAO,EAAM,EAAE;IACf,KAAK,EAAQ,uBAAuB;IACpC,OAAO,EAAM,cAAc;IAC3B,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAM,wCAAwC;IACrD,OAAO,EAAM,oCAAoC;IACjD,IAAI,EAAS,kCAAkC;CAChD,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,EAAE,EAAI,SAAS;IACf,EAAE,EAAI,SAAS;IACf,IAAI,EAAE,WAAW;IACjB,EAAE,EAAI,SAAS;IACf,EAAE,EAAI,SAAS;CAChB,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,MAAM,EAAI,aAAa;IACvB,MAAM,EAAI,aAAa;IACvB,QAAQ,EAAE,eAAe;IACzB,IAAI,EAAM,WAAW;CACtB,CAAA;AAED,0EAA0E;AAC1E,uEAAuE;AACvE,wEAAwE;AACxE,gBAAgB;AAChB,MAAM,CAAC,MAAM,oBAAoB,GAAI,kBAAkB,CAAA;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AAExD,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,IAAI,EAAS,gCAAgC;IAC7C,OAAO,EAAM,4BAA4B;IACzC,OAAO,EAAM,8EAA8E;IAC3F,OAAO,EAAM,yEAAyE;IACtF,WAAW,EAAE,oCAAoC;IACjD,IAAI,EAAS,kEAAkE;CAChF,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,IAAI,EAAK,mGAAmG;IAC5G,OAAO,EAAE,yGAAyG;IAClH,OAAO,EAAE,yGAAyG;IAClH,MAAM,EAAG,6FAA6F;CACvG,CAAA"}
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import type { ElementMeta } from '../../../schema/Element.js';
3
+ type RenderElement = (el: ElementMeta, index: number) => React.ReactNode;
4
+ /**
5
+ * Top-level `<form>` element. Owns:
6
+ * - HTML form chrome (action, method, _method spoof, hidden formId)
7
+ * - Fetch + JSON submission with `Accept: application/json` (so the
8
+ * server can return 422 with field errors instead of re-rendering)
9
+ * - Inline error stamping (`_form` banner + per-field error strings)
10
+ * - `FormStateProvider` mount when the form has any reactive field
11
+ * (`live()` or `afterStateUpdatedJs`) and a `stateUrl` was stamped.
12
+ *
13
+ * `renderElement` is injected for non-field children inside the form
14
+ * body (cards / dividers / fieldsets / etc).
15
+ */
16
+ export declare function FormRenderer({ el, renderElement, }: {
17
+ el: ElementMeta;
18
+ renderElement: RenderElement;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ /**
21
+ * Render one child of a form's resolved schema with per-field values + errors.
22
+ *
23
+ * Field elements wrap in error-stamp chrome; non-field children fall
24
+ * through to `renderElement` so the form body can host cards / dividers /
25
+ * fieldsets / etc.
26
+ */
27
+ export declare function renderFormChild(child: ElementMeta, index: number, values: Record<string, unknown>, errors: Record<string, string[]>, renderElement: RenderElement): React.ReactNode;
28
+ export {};
29
+ //# sourceMappingURL=FormRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormRenderer.d.ts","sourceRoot":"","sources":["../../../../src/react/schemaRenderer/form/FormRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAS7D,KAAK,aAAa,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;AAExE;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAC3B,EAAE,EACF,aAAa,GACd,EAAE;IACD,EAAE,EAAE,WAAW,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;CAC7B,2CAuIA;AAyBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAU,WAAW,EAC1B,KAAK,EAAU,MAAM,EACrB,MAAM,EAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,MAAM,EAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACvC,aAAa,EAAE,aAAa,GAC3B,KAAK,CAAC,SAAS,CAejB"}