@pilotiq/pilotiq 0.24.1 → 0.24.3

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 (518) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/boost/guidelines.md +571 -0
  3. package/boost/skills/pilotiq-actions/SKILL.md +49 -0
  4. package/boost/skills/pilotiq-actions/rules/dispatch-modes.md +177 -0
  5. package/boost/skills/pilotiq-actions/rules/factories.md +130 -0
  6. package/boost/skills/pilotiq-actions/rules/visibility-and-authorization.md +125 -0
  7. package/boost/skills/pilotiq-fields/SKILL.md +47 -0
  8. package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
  9. package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
  10. package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
  11. package/boost/skills/pilotiq-relations/SKILL.md +47 -0
  12. package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
  13. package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
  14. package/boost/skills/pilotiq-resource/SKILL.md +61 -0
  15. package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
  16. package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
  17. package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
  18. package/dist/Pilotiq.d.ts +31 -0
  19. package/dist/Pilotiq.d.ts.map +1 -1
  20. package/dist/Pilotiq.js +3 -1
  21. package/dist/Pilotiq.js.map +1 -1
  22. package/dist/PilotiqRegistry.d.ts +13 -0
  23. package/dist/PilotiqRegistry.d.ts.map +1 -1
  24. package/dist/PilotiqRegistry.js +15 -0
  25. package/dist/PilotiqRegistry.js.map +1 -1
  26. package/dist/pageData/misc.d.ts.map +1 -1
  27. package/dist/pageData/misc.js +6 -0
  28. package/dist/pageData/misc.js.map +1 -1
  29. package/dist/pageData/navigation.d.ts +1 -0
  30. package/dist/pageData/navigation.d.ts.map +1 -1
  31. package/dist/pageData/navigation.js +3 -0
  32. package/dist/pageData/navigation.js.map +1 -1
  33. package/dist/pageData/relationPages.d.ts.map +1 -1
  34. package/dist/pageData/relationPages.js +3 -0
  35. package/dist/pageData/relationPages.js.map +1 -1
  36. package/dist/pageData/resourcePages.d.ts.map +1 -1
  37. package/dist/pageData/resourcePages.js +8 -0
  38. package/dist/pageData/resourcePages.js.map +1 -1
  39. package/dist/react/AppShell.d.ts +8 -0
  40. package/dist/react/AppShell.d.ts.map +1 -1
  41. package/dist/react/AppShell.js.map +1 -1
  42. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  43. package/dist/react/layouts/SidebarLayout.js +10 -2
  44. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  45. package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -1
  46. package/dist/react/widgets/StatsOverviewRenderer.js +32 -18
  47. package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -1
  48. package/dist/routes/relations.d.ts.map +1 -1
  49. package/dist/routes/relations.js +25 -18
  50. package/dist/routes/relations.js.map +1 -1
  51. package/dist/routes/resources.js.map +1 -1
  52. package/package.json +10 -5
  53. package/.turbo/turbo-build.log +0 -8
  54. package/CLAUDE.md +0 -265
  55. package/src/Cluster.test.ts +0 -283
  56. package/src/Cluster.ts +0 -83
  57. package/src/Column.test.ts +0 -199
  58. package/src/Column.ts +0 -710
  59. package/src/Global.test.ts +0 -367
  60. package/src/Global.ts +0 -169
  61. package/src/Page.test.ts +0 -114
  62. package/src/Page.ts +0 -208
  63. package/src/Pilotiq.perf.test.ts +0 -252
  64. package/src/Pilotiq.test.ts +0 -129
  65. package/src/Pilotiq.ts +0 -1158
  66. package/src/PilotiqRegistry.ts +0 -36
  67. package/src/PilotiqServiceProvider.ts +0 -121
  68. package/src/RelationManager.test.ts +0 -400
  69. package/src/RelationManager.ts +0 -527
  70. package/src/RenderHook.test.ts +0 -252
  71. package/src/RenderHook.ts +0 -242
  72. package/src/Resource.test.ts +0 -284
  73. package/src/Resource.ts +0 -526
  74. package/src/RightPanel.test.ts +0 -202
  75. package/src/RightPanel.ts +0 -132
  76. package/src/Tab.test.ts +0 -91
  77. package/src/Tab.ts +0 -156
  78. package/src/UserMenuItem.ts +0 -145
  79. package/src/actions/Action.test.ts +0 -2526
  80. package/src/actions/Action.ts +0 -1515
  81. package/src/actions/ActionGroup.test.ts +0 -112
  82. package/src/actions/ActionGroup.ts +0 -173
  83. package/src/actions/attachFactory.ts +0 -172
  84. package/src/actions/bulkFactories.ts +0 -168
  85. package/src/actions/crudFactories.ts +0 -220
  86. package/src/actions/exportFactory.ts +0 -225
  87. package/src/actions/factoryHelpers.ts +0 -177
  88. package/src/actions/importFactory.ts +0 -243
  89. package/src/actions/index.ts +0 -17
  90. package/src/actions/m2mFactories.ts +0 -193
  91. package/src/actions/relationFactories.ts +0 -372
  92. package/src/applyPageHooks.test.ts +0 -463
  93. package/src/applyPageHooks.ts +0 -330
  94. package/src/authorization.test.ts +0 -483
  95. package/src/breadcrumbs.test.ts +0 -238
  96. package/src/cells/coerce.test.ts +0 -85
  97. package/src/cells/coerce.ts +0 -84
  98. package/src/clusterPaths.ts +0 -35
  99. package/src/columns/BadgeColumn.test.ts +0 -54
  100. package/src/columns/BadgeColumn.ts +0 -32
  101. package/src/columns/BooleanColumn.test.ts +0 -41
  102. package/src/columns/BooleanColumn.ts +0 -18
  103. package/src/columns/ColorColumn.test.ts +0 -37
  104. package/src/columns/ColorColumn.ts +0 -38
  105. package/src/columns/IconColumn.test.ts +0 -54
  106. package/src/columns/IconColumn.ts +0 -37
  107. package/src/columns/ImageColumn.test.ts +0 -41
  108. package/src/columns/ImageColumn.ts +0 -28
  109. package/src/columns/SelectColumn.ts +0 -98
  110. package/src/columns/TextColumn.test.ts +0 -190
  111. package/src/columns/TextColumn.ts +0 -20
  112. package/src/columns/TextInputColumn.ts +0 -68
  113. package/src/columns/ToggleColumn.ts +0 -46
  114. package/src/columns/editableColumns.test.ts +0 -238
  115. package/src/columns/index.ts +0 -9
  116. package/src/defaultGlobalPages.ts +0 -95
  117. package/src/defaultPages.test.ts +0 -634
  118. package/src/defaultPages.ts +0 -617
  119. package/src/defaultViewPage.test.ts +0 -147
  120. package/src/elements/Form.test.ts +0 -223
  121. package/src/elements/Form.ts +0 -416
  122. package/src/elements/ListTabs.ts +0 -28
  123. package/src/elements/Table.test.ts +0 -422
  124. package/src/elements/Table.ts +0 -850
  125. package/src/elements/TableGroup.test.ts +0 -260
  126. package/src/elements/TableGroup.ts +0 -334
  127. package/src/elements/dispatchAction.test.ts +0 -463
  128. package/src/elements/dispatchAction.ts +0 -355
  129. package/src/elements/dispatchForm.test.ts +0 -477
  130. package/src/elements/dispatchForm.ts +0 -1993
  131. package/src/elements/dispatchTable.test.ts +0 -1514
  132. package/src/elements/dispatchTable.ts +0 -745
  133. package/src/elements/index.ts +0 -21
  134. package/src/entries/BadgeEntry.ts +0 -39
  135. package/src/entries/CodeEntry.test.ts +0 -40
  136. package/src/entries/CodeEntry.ts +0 -52
  137. package/src/entries/ColorEntry.ts +0 -63
  138. package/src/entries/ComponentEntry.test.ts +0 -173
  139. package/src/entries/ComponentEntry.ts +0 -95
  140. package/src/entries/Entry.ts +0 -304
  141. package/src/entries/IconEntry.ts +0 -49
  142. package/src/entries/ImageEntry.ts +0 -61
  143. package/src/entries/KeyValueEntry.ts +0 -47
  144. package/src/entries/RepeatableEntry.test.ts +0 -239
  145. package/src/entries/RepeatableEntry.ts +0 -173
  146. package/src/entries/TextEntry.test.ts +0 -394
  147. package/src/entries/TextEntry.ts +0 -60
  148. package/src/entries/index.ts +0 -12
  149. package/src/entries/leaves.test.ts +0 -306
  150. package/src/entries/registry.ts +0 -54
  151. package/src/fields/BuilderField.test.ts +0 -1188
  152. package/src/fields/BuilderField.ts +0 -605
  153. package/src/fields/BuilderRelationship.test.ts +0 -811
  154. package/src/fields/CheckboxField.test.ts +0 -44
  155. package/src/fields/CheckboxField.ts +0 -27
  156. package/src/fields/CheckboxListField.test.ts +0 -99
  157. package/src/fields/CheckboxListField.ts +0 -66
  158. package/src/fields/ColorPickerField.test.ts +0 -33
  159. package/src/fields/ColorPickerField.ts +0 -25
  160. package/src/fields/DateField.ts +0 -54
  161. package/src/fields/DateTimeField.test.ts +0 -55
  162. package/src/fields/EmailField.ts +0 -16
  163. package/src/fields/Field.test.ts +0 -654
  164. package/src/fields/Field.ts +0 -817
  165. package/src/fields/FileUploadField.test.ts +0 -143
  166. package/src/fields/FileUploadField.ts +0 -159
  167. package/src/fields/HiddenField.test.ts +0 -27
  168. package/src/fields/HiddenField.ts +0 -28
  169. package/src/fields/KeyValueField.test.ts +0 -105
  170. package/src/fields/KeyValueField.ts +0 -55
  171. package/src/fields/MarkdownField.test.ts +0 -167
  172. package/src/fields/MarkdownField.ts +0 -162
  173. package/src/fields/NumberField.ts +0 -33
  174. package/src/fields/RadioField.test.ts +0 -94
  175. package/src/fields/RadioField.ts +0 -67
  176. package/src/fields/RepeaterField.test.ts +0 -1806
  177. package/src/fields/RepeaterField.ts +0 -939
  178. package/src/fields/RepeaterRelationship.test.ts +0 -1923
  179. package/src/fields/RepeaterSimple.test.ts +0 -248
  180. package/src/fields/RowButton.test.ts +0 -219
  181. package/src/fields/RowButton.ts +0 -135
  182. package/src/fields/SelectField.test.ts +0 -192
  183. package/src/fields/SelectField.ts +0 -235
  184. package/src/fields/SliderField.test.ts +0 -50
  185. package/src/fields/SliderField.ts +0 -53
  186. package/src/fields/SlugField.ts +0 -24
  187. package/src/fields/TagsInputField.test.ts +0 -154
  188. package/src/fields/TagsInputField.ts +0 -133
  189. package/src/fields/TextField.test.ts +0 -213
  190. package/src/fields/TextField.ts +0 -177
  191. package/src/fields/TextareaField.test.ts +0 -58
  192. package/src/fields/TextareaField.ts +0 -59
  193. package/src/fields/ToggleButtonsField.test.ts +0 -106
  194. package/src/fields/ToggleButtonsField.ts +0 -59
  195. package/src/fields/ToggleField.ts +0 -16
  196. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
  197. package/src/fields/optionsResolver.ts +0 -95
  198. package/src/fields/resolveField.ts +0 -28
  199. package/src/filters/BooleanFilter.ts +0 -35
  200. package/src/filters/DateRangeFilter.test.ts +0 -194
  201. package/src/filters/DateRangeFilter.ts +0 -148
  202. package/src/filters/Filter.test.ts +0 -268
  203. package/src/filters/Filter.ts +0 -184
  204. package/src/filters/FormFilter.test.ts +0 -238
  205. package/src/filters/FormFilter.ts +0 -215
  206. package/src/filters/MultiSelectFilter.test.ts +0 -119
  207. package/src/filters/MultiSelectFilter.ts +0 -78
  208. package/src/filters/QueryBuilderFilter.test.ts +0 -662
  209. package/src/filters/QueryBuilderFilter.ts +0 -398
  210. package/src/filters/SelectFilter.ts +0 -46
  211. package/src/filters/TernaryFilter.test.ts +0 -160
  212. package/src/filters/TernaryFilter.ts +0 -72
  213. package/src/filters/TrashedFilter.test.ts +0 -149
  214. package/src/filters/TrashedFilter.ts +0 -55
  215. package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
  216. package/src/filters/queryBuilder/Constraint.ts +0 -115
  217. package/src/filters/queryBuilder/DateConstraint.ts +0 -69
  218. package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
  219. package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
  220. package/src/filters/queryBuilder/TextConstraint.ts +0 -64
  221. package/src/filters/queryBuilder/index.ts +0 -12
  222. package/src/icons/index.ts +0 -2
  223. package/src/icons/lucide.ts +0 -204
  224. package/src/icons/registry.test.ts +0 -56
  225. package/src/icons/registry.ts +0 -41
  226. package/src/icons/types.ts +0 -47
  227. package/src/index.ts +0 -525
  228. package/src/io/csv.test.ts +0 -142
  229. package/src/io/csv.ts +0 -170
  230. package/src/nestedRelationManagerData.test.ts +0 -547
  231. package/src/notifications/Notification.test.ts +0 -210
  232. package/src/notifications/Notification.ts +0 -354
  233. package/src/notifications/broadcast.test.ts +0 -110
  234. package/src/notifications/broadcast.ts +0 -95
  235. package/src/notifications/database.test.ts +0 -383
  236. package/src/notifications/database.ts +0 -398
  237. package/src/notifications/databaseNotifications.test.ts +0 -187
  238. package/src/notifications/dispatchNotificationAction.test.ts +0 -341
  239. package/src/notifications/dispatchNotificationAction.ts +0 -142
  240. package/src/notifications/flash.test.ts +0 -89
  241. package/src/notifications/flash.ts +0 -71
  242. package/src/notifications/index.ts +0 -45
  243. package/src/notifications/registerBroadcastAuth.test.ts +0 -134
  244. package/src/notifications/registerBroadcastAuth.ts +0 -100
  245. package/src/notifications/resolveSavedNotification.test.ts +0 -82
  246. package/src/notifications/resolveSavedNotification.ts +0 -59
  247. package/src/notifications/types.ts +0 -93
  248. package/src/orm/m2mAccessor.ts +0 -66
  249. package/src/orm/modelDefaults.test.ts +0 -633
  250. package/src/orm/modelDefaults.ts +0 -666
  251. package/src/pageData/breadcrumbs.ts +0 -288
  252. package/src/pageData/forms.ts +0 -578
  253. package/src/pageData/helpers.ts +0 -857
  254. package/src/pageData/misc.ts +0 -347
  255. package/src/pageData/navigation.ts +0 -842
  256. package/src/pageData/relationPages.ts +0 -1248
  257. package/src/pageData/relationTabs.ts +0 -286
  258. package/src/pageData/resourcePages.ts +0 -609
  259. package/src/pageData.test.ts +0 -1545
  260. package/src/pageData.ts +0 -341
  261. package/src/plugins/index.ts +0 -8
  262. package/src/plugins/themeEditor.test.ts +0 -36
  263. package/src/plugins/themeEditor.ts +0 -45
  264. package/src/react/AppShell.tsx +0 -251
  265. package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
  266. package/src/react/CollabRoomContext.ts +0 -98
  267. package/src/react/CollabTextRendererRegistry.ts +0 -102
  268. package/src/react/CommandPalette.tsx +0 -375
  269. package/src/react/CurrentUserContext.tsx +0 -50
  270. package/src/react/CustomPageWrapperGate.tsx +0 -69
  271. package/src/react/CustomPageWrapperRegistry.ts +0 -45
  272. package/src/react/FieldFocusReporterRegistry.ts +0 -37
  273. package/src/react/FieldLabelSlotRegistry.ts +0 -30
  274. package/src/react/FieldPresenceRegistry.ts +0 -46
  275. package/src/react/FormCollabBindingRegistry.ts +0 -242
  276. package/src/react/FormStateContext.tsx +0 -591
  277. package/src/react/HeadHooks.tsx +0 -126
  278. package/src/react/MarkdownEditorRegistry.test.ts +0 -38
  279. package/src/react/MarkdownEditorRegistry.ts +0 -107
  280. package/src/react/NotificationActionStrip.tsx +0 -263
  281. package/src/react/NotificationBell.tsx +0 -426
  282. package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
  283. package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
  284. package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
  285. package/src/react/PendingSuggestionsContext.tsx +0 -172
  286. package/src/react/RecordWrapperGate.tsx +0 -58
  287. package/src/react/RecordWrapperRegistry.ts +0 -39
  288. package/src/react/RenderHookSlot.tsx +0 -32
  289. package/src/react/RightSidebar.tsx +0 -257
  290. package/src/react/RightSidebarContext.tsx +0 -234
  291. package/src/react/RightSidebarTrigger.tsx +0 -53
  292. package/src/react/RowCoordsContext.tsx +0 -23
  293. package/src/react/SchemaRenderer.tsx +0 -549
  294. package/src/react/SearchTrigger.tsx +0 -46
  295. package/src/react/ThemeProvider.tsx +0 -93
  296. package/src/react/ThemeSettingsPage.tsx +0 -579
  297. package/src/react/ThemeToggle.tsx +0 -20
  298. package/src/react/Toaster.tsx +0 -158
  299. package/src/react/UserMenu.tsx +0 -196
  300. package/src/react/WidgetDataContext.tsx +0 -157
  301. package/src/react/cells/EditableCell.tsx +0 -389
  302. package/src/react/component-slots.test.ts +0 -103
  303. package/src/react/component-slots.ts +0 -116
  304. package/src/react/fieldJsHandler.test.ts +0 -166
  305. package/src/react/fieldJsHandler.ts +0 -79
  306. package/src/react/fields/BuilderInput.tsx +0 -1078
  307. package/src/react/fields/CheckboxInput.tsx +0 -39
  308. package/src/react/fields/CheckboxListInput.tsx +0 -102
  309. package/src/react/fields/ColorInput.tsx +0 -71
  310. package/src/react/fields/DateFieldInput.tsx +0 -70
  311. package/src/react/fields/DateTimeInput.tsx +0 -62
  312. package/src/react/fields/FieldShell.tsx +0 -348
  313. package/src/react/fields/FileUploadInput.tsx +0 -639
  314. package/src/react/fields/HiddenInput.tsx +0 -17
  315. package/src/react/fields/KeyValueInput.tsx +0 -230
  316. package/src/react/fields/MarkdownInput.tsx +0 -560
  317. package/src/react/fields/RadioInput.tsx +0 -81
  318. package/src/react/fields/RepeaterInput.test.ts +0 -116
  319. package/src/react/fields/RepeaterInput.tsx +0 -1420
  320. package/src/react/fields/SelectFieldInput.tsx +0 -280
  321. package/src/react/fields/SliderInput.tsx +0 -81
  322. package/src/react/fields/TagsInput.tsx +0 -283
  323. package/src/react/fields/TextLikeInput.tsx +0 -256
  324. package/src/react/fields/ToggleButtonsInput.tsx +0 -60
  325. package/src/react/fields/ToggleFieldInput.tsx +0 -56
  326. package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
  327. package/src/react/fields/relationshipRenameDispatch.ts +0 -97
  328. package/src/react/fields/repeaterReconcile.test.ts +0 -114
  329. package/src/react/fields/repeaterReconcile.ts +0 -104
  330. package/src/react/fields/rowChromeButton.tsx +0 -336
  331. package/src/react/fields/rowState.ts +0 -106
  332. package/src/react/fields/syncRowGates.test.ts +0 -202
  333. package/src/react/fields/syncRowGates.ts +0 -66
  334. package/src/react/fields/textInputControls.tsx +0 -238
  335. package/src/react/fields/useRowReorderDnd.ts +0 -78
  336. package/src/react/formStateHelpers.test.ts +0 -508
  337. package/src/react/formStateHelpers.ts +0 -381
  338. package/src/react/hooks/use-mobile.ts +0 -19
  339. package/src/react/icon-context.tsx +0 -60
  340. package/src/react/index.ts +0 -194
  341. package/src/react/layouts/SidebarLayout.tsx +0 -250
  342. package/src/react/layouts/TopbarLayout.tsx +0 -258
  343. package/src/react/navigate.tsx +0 -37
  344. package/src/react/onProviderSynced.test.ts +0 -90
  345. package/src/react/parseRecordEditUrl.test.ts +0 -122
  346. package/src/react/parseRecordEditUrl.ts +0 -94
  347. package/src/react/persistedState.ts +0 -40
  348. package/src/react/registry.ts +0 -48
  349. package/src/react/right-panel-registry.tsx +0 -47
  350. package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
  351. package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
  352. package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
  353. package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
  354. package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
  355. package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
  356. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
  357. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
  358. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
  359. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
  360. package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
  361. package/src/react/schemaRenderer/action/buttons.tsx +0 -99
  362. package/src/react/schemaRenderer/action/helpers.ts +0 -140
  363. package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
  364. package/src/react/schemaRenderer/columnFormat.ts +0 -65
  365. package/src/react/schemaRenderer/constants.ts +0 -50
  366. package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
  367. package/src/react/schemaRenderer/form/renderField.tsx +0 -511
  368. package/src/react/schemaRenderer/helpers.tsx +0 -81
  369. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
  370. package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
  371. package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
  372. package/src/react/schemaRenderer/table/filters.tsx +0 -1233
  373. package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
  374. package/src/react/schemaRenderer/table/links.tsx +0 -112
  375. package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
  376. package/src/react/schemaRenderer/table/url.tsx +0 -143
  377. package/src/react/theme-preview/apply.ts +0 -99
  378. package/src/react/theme-preview/build-html.ts +0 -436
  379. package/src/react/ui/button.tsx +0 -51
  380. package/src/react/ui/calendar.tsx +0 -67
  381. package/src/react/ui/checkbox.tsx +0 -29
  382. package/src/react/ui/dialog.tsx +0 -108
  383. package/src/react/ui/dropdown-menu.tsx +0 -97
  384. package/src/react/ui/input.tsx +0 -20
  385. package/src/react/ui/label.tsx +0 -21
  386. package/src/react/ui/popover.tsx +0 -50
  387. package/src/react/ui/select.tsx +0 -169
  388. package/src/react/ui/separator.tsx +0 -25
  389. package/src/react/ui/sheet.tsx +0 -136
  390. package/src/react/ui/sidebar.tsx +0 -723
  391. package/src/react/ui/skeleton.tsx +0 -13
  392. package/src/react/ui/slider.tsx +0 -34
  393. package/src/react/ui/switch.tsx +0 -28
  394. package/src/react/ui/table.tsx +0 -105
  395. package/src/react/ui/tabs.tsx +0 -63
  396. package/src/react/ui/textarea.tsx +0 -18
  397. package/src/react/ui/tooltip.tsx +0 -64
  398. package/src/react/useResizableWidth.ts +0 -139
  399. package/src/react/utils.ts +0 -6
  400. package/src/react/widgetRegistry.test.ts +0 -43
  401. package/src/react/widgetRegistry.ts +0 -50
  402. package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
  403. package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
  404. package/src/react/widgets/ViewRenderer.tsx +0 -71
  405. package/src/relationManagerData.test.ts +0 -1595
  406. package/src/richtext/index.ts +0 -8
  407. package/src/richtext/registry.ts +0 -89
  408. package/src/routes/globals.ts +0 -148
  409. package/src/routes/guard.test.ts +0 -325
  410. package/src/routes/helpers.ts +0 -704
  411. package/src/routes/pages.ts +0 -175
  412. package/src/routes/panel.ts +0 -204
  413. package/src/routes/relations.ts +0 -1243
  414. package/src/routes/resources.ts +0 -781
  415. package/src/routes/theme.ts +0 -91
  416. package/src/routes-nested-relations.test.ts +0 -676
  417. package/src/routes-relations.test.ts +0 -972
  418. package/src/routes.test.ts +0 -2027
  419. package/src/routes.ts +0 -303
  420. package/src/schema/Alert.test.ts +0 -109
  421. package/src/schema/Alert.ts +0 -131
  422. package/src/schema/Block.ts +0 -169
  423. package/src/schema/Breadcrumbs.ts +0 -40
  424. package/src/schema/Card.ts +0 -35
  425. package/src/schema/Divider.ts +0 -20
  426. package/src/schema/Element.ts +0 -219
  427. package/src/schema/EmptyState.test.ts +0 -37
  428. package/src/schema/EmptyState.ts +0 -63
  429. package/src/schema/Fieldset.ts +0 -43
  430. package/src/schema/Grid.ts +0 -43
  431. package/src/schema/Group.ts +0 -30
  432. package/src/schema/Heading.ts +0 -39
  433. package/src/schema/Html.ts +0 -67
  434. package/src/schema/Icon.ts +0 -54
  435. package/src/schema/Image.ts +0 -57
  436. package/src/schema/LinkTag.ts +0 -41
  437. package/src/schema/Markdown.ts +0 -85
  438. package/src/schema/MetaTag.ts +0 -41
  439. package/src/schema/RelationTabs.ts +0 -71
  440. package/src/schema/ScriptTag.ts +0 -55
  441. package/src/schema/Section.ts +0 -160
  442. package/src/schema/ServerDataElement.test.ts +0 -140
  443. package/src/schema/ServerDataElement.ts +0 -156
  444. package/src/schema/SlotComponent.test.ts +0 -77
  445. package/src/schema/SlotComponent.ts +0 -71
  446. package/src/schema/Split.ts +0 -50
  447. package/src/schema/Stat.test.ts +0 -118
  448. package/src/schema/Stat.ts +0 -154
  449. package/src/schema/StatsOverview.test.ts +0 -141
  450. package/src/schema/StatsOverview.ts +0 -119
  451. package/src/schema/StyleTag.ts +0 -35
  452. package/src/schema/TableWidget.test.ts +0 -297
  453. package/src/schema/TableWidget.ts +0 -289
  454. package/src/schema/Tabs.ts +0 -79
  455. package/src/schema/Text.ts +0 -58
  456. package/src/schema/UnorderedList.ts +0 -49
  457. package/src/schema/View.test.ts +0 -111
  458. package/src/schema/View.ts +0 -127
  459. package/src/schema/Wizard.ts +0 -220
  460. package/src/schema/containers.test.ts +0 -564
  461. package/src/schema/headTags.test.ts +0 -134
  462. package/src/schema/index.ts +0 -40
  463. package/src/schema/primes.test.ts +0 -269
  464. package/src/schema/resolveSchema.test.ts +0 -379
  465. package/src/schema/resolveSchema.ts +0 -917
  466. package/src/schema/sanitize.ts +0 -58
  467. package/src/search.test.ts +0 -446
  468. package/src/search.ts +0 -178
  469. package/src/sessionFilters.test.ts +0 -375
  470. package/src/sessionFilters.ts +0 -143
  471. package/src/slot-components/index.ts +0 -10
  472. package/src/slot-components/registry.ts +0 -56
  473. package/src/styles/file-upload.css +0 -13
  474. package/src/summarizers/Summarizer.test.ts +0 -84
  475. package/src/summarizers/Summarizer.ts +0 -123
  476. package/src/summarizers/index.ts +0 -11
  477. package/src/theme/base-colors.ts +0 -68
  478. package/src/theme/chart-colors.ts +0 -50
  479. package/src/theme/colors.ts +0 -447
  480. package/src/theme/generate-css.test.ts +0 -139
  481. package/src/theme/generate-css.ts +0 -44
  482. package/src/theme/generate-scale.test.ts +0 -106
  483. package/src/theme/generate-scale.ts +0 -97
  484. package/src/theme/icon-map.ts +0 -42
  485. package/src/theme/index.ts +0 -34
  486. package/src/theme/migrate.test.ts +0 -178
  487. package/src/theme/migrate.ts +0 -81
  488. package/src/theme/presets.ts +0 -135
  489. package/src/theme/radius.ts +0 -18
  490. package/src/theme/resolve.test.ts +0 -238
  491. package/src/theme/resolve.ts +0 -96
  492. package/src/theme/spacing.ts +0 -18
  493. package/src/theme/storage.test.ts +0 -126
  494. package/src/theme/storage.ts +0 -106
  495. package/src/theme/theme-colors.ts +0 -88
  496. package/src/theme/types.ts +0 -125
  497. package/src/uploads/UploadAdapter.ts +0 -35
  498. package/src/uploads/index.ts +0 -2
  499. package/src/uploads/localUpload.test.ts +0 -70
  500. package/src/uploads/localUpload.ts +0 -84
  501. package/src/validation/Validator.ts +0 -49
  502. package/src/validation/index.ts +0 -28
  503. package/src/validation/rules.ts +0 -78
  504. package/src/validation/runValidators.ts +0 -435
  505. package/src/validation/uniqueValidator.test.ts +0 -196
  506. package/src/validation/uniqueValidator.ts +0 -133
  507. package/src/validation/validators.test.ts +0 -268
  508. package/src/vite.test.ts +0 -184
  509. package/src/vite.ts +0 -787
  510. package/src/widgets/index.ts +0 -10
  511. package/src/widgets/registry.ts +0 -45
  512. package/src/widgets.test.ts +0 -592
  513. package/tsconfig.build.json +0 -11
  514. package/tsconfig.json +0 -4
  515. package/tsconfig.test.json +0 -10
  516. package/views/react/Dashboard.tsx +0 -27
  517. package/views/react/Resources/Form.tsx +0 -102
  518. package/views/react/Resources/Index.tsx +0 -49
@@ -1,605 +0,0 @@
1
- import { type ElementMeta } from '../schema/Element.js'
2
- import { Block, type BlockMeta } from '../schema/Block.js'
3
- import { Field, type FieldMeta } from './Field.js'
4
- import type { RenderContext } from '../schema/resolveSchema.js'
5
- import type { Action, ActionMeta } from '../actions/Action.js'
6
- import type { ModelLike } from '../orm/modelDefaults.js'
7
- import {
8
- RowButton,
9
- type RowButtonKind,
10
- type RowButtonsMeta,
11
- } from './RowButton.js'
12
- import {
13
- serializeRowButtons,
14
- normalizeGridConfig,
15
- type RepeaterGridConfig,
16
- type RepeaterItemCanRule,
17
- type RepeaterItemHiddenRule,
18
- } from './RepeaterField.js'
19
-
20
- /**
21
- * Configuration for `Builder.relationship(...)`. Heterogeneous-row sibling
22
- * of `RepeaterRelationshipConfig`.
23
- *
24
- * `name` matches a key on the parent model's `static relations` map. The
25
- * child model carries a discriminator column (default `type`, holds the
26
- * block name) and a JSON payload column (default `data`, holds the
27
- * per-block inner-schema values verbatim) — plus the standard FK + PK,
28
- * and an optional `sort` column when `orderColumn` is set.
29
- *
30
- * Two relation modes are supported:
31
- *
32
- * - `hasMany` — single foreign key on the child. `model` + `foreignKey`
33
- * overrides exist for ORMs that don't follow the
34
- * convention; both default to discovery via
35
- * `parent.relations[name]` at submit time.
36
- * - `morphMany` — polymorphic owner side. The child carries
37
- * `<morphName>Id` + `<morphName>Type` columns (the
38
- * morph stamp). Resolved entirely off the parent's
39
- * `relations[name]` morph descriptor — no `foreignKey`
40
- * override; the column names are driven by `morphName`.
41
- * `morphOne` collapses into the same branch.
42
- *
43
- * `typeColumn` + `dataColumn` default to `'type'` and `'data'` — same as
44
- * Filament.
45
- */
46
- export interface BuilderRelationshipConfig {
47
- /** Relationship key on the parent (e.g. `'blocks'`). */
48
- name: string
49
- /** Override the child model. Defaults to `parent.relations[name].model()`. */
50
- model?: ModelLike
51
- /** Override the FK column on the child. Defaults to `parent.relations[name].foreignKey`. */
52
- foreignKey?: string
53
- /** Discriminator column on the child holding the block name. Default `'type'`. */
54
- typeColumn?: string
55
- /** JSON payload column on the child holding the per-block fields. Default `'data'`. */
56
- dataColumn?: string
57
- /** Optional integer column on the child to receive the row index. */
58
- orderColumn?: string
59
- }
60
-
61
- /** Public meta — `model` + `foreignKey` are server-only and stay private. */
62
- export interface BuilderRelationshipMeta {
63
- name: string
64
- typeColumn?: string
65
- dataColumn?: string
66
- orderColumn?: string
67
- }
68
-
69
- /**
70
- * Function evaluated once per row at meta-build to derive a human-readable
71
- * label for the collapsed-row header. Receives the row's raw `data` body
72
- * and the row's resolved `type`. Errors are swallowed and the renderer
73
- * falls back to the block's label + row index.
74
- */
75
- export type BuilderItemLabel = (
76
- data: Record<string, unknown>,
77
- blockName: string,
78
- ) => string
79
-
80
- /**
81
- * Per-row visibility rule. Same shape as `Repeater.itemHidden(rule)`:
82
- * either a literal `boolean` or a callback receiving a row-scoped
83
- * `LayoutContext` (`row.blockType` exposes the block name). Truthy
84
- * hides the row; the renderer keeps inputs mounted via `display: none`
85
- * so values + `__id` round-trip on submit.
86
- *
87
- * Throwing → row stays visible (fail-closed-as-visible — same posture as
88
- * Repeater).
89
- */
90
- export type BuilderItemHiddenRule = RepeaterItemHiddenRule
91
-
92
- export type BuilderItemCanRule = RepeaterItemCanRule
93
-
94
- /** Position of the `Add block` button under the field's row stack. */
95
- export type BuilderAddActionAlignment = 'start' | 'center' | 'end'
96
-
97
- /**
98
- * Resolved per-row metadata. `id` mirrors Repeater's stable id round-trip;
99
- * `type` carries the block discriminator so the renderer knows which
100
- * picker option produced this row. `children` is the row's resolved
101
- * inner schema (the matching block's `schema()` resolved against
102
- * row-scoped values). `unknownType` is set when the row's submitted
103
- * `type` doesn't match any registered block — the renderer falls back
104
- * to a "missing block" placeholder; values still round-trip.
105
- */
106
- export interface BuilderRowMeta {
107
- id: string
108
- type: string
109
- children: ElementMeta[]
110
- itemLabel?: string
111
- hidden?: boolean
112
- unknownType?: boolean
113
- /**
114
- * Resolved per-row action metas for `extraItemActions(...)`. Same shape
115
- * as `RepeaterRowMeta.extraActions` — see RepeaterField for the row
116
- * dispatch contract. Field-level only in v1; per-block actions stay
117
- * deferred to a future polish (`Block.extraItemActions(...)`).
118
- */
119
- extraActions?: ActionMeta[]
120
- /**
121
- * Per-row capability flags. Stamped only when the corresponding
122
- * `itemCan*(rule)` resolved falsy for this row. The renderer reads
123
- * these and skips the matching button. See `RepeaterRowMeta.canDelete`
124
- * for the full contract — semantics are identical (`row.blockType` is
125
- * available to the predicate as `ctx.row.blockType`).
126
- */
127
- canDelete?: false
128
- canClone?: false
129
- canReorder?: false
130
- }
131
-
132
- export interface BuilderFieldMeta extends FieldMeta {
133
- fieldType: 'builder'
134
- rows: BuilderRowMeta[]
135
- /** Picker entries — every block registered via `.blocks([…])`. */
136
- blocks: BlockMeta[]
137
- /**
138
- * Set when `Builder.relationship(...)` is configured. Tells diagnostics
139
- * + future UI hooks that submitted rows persist as child records on a
140
- * `HasMany` relation; behavior is otherwise server-side. The serialized
141
- * shape carries only `{ name, typeColumn?, dataColumn?, orderColumn? }`
142
- * — `model` and `foreignKey` are server-only.
143
- */
144
- relationship?: BuilderRelationshipMeta
145
- minItems?: number
146
- maxItems?: number
147
- defaultBlock?: string
148
- reorderable?: boolean
149
- reorderableWithButtons?: boolean
150
- collapsible?: boolean
151
- defaultCollapsed?: boolean
152
- /**
153
- * Set when `Builder.accordion()` is configured. The renderer replaces
154
- * the per-row collapsed map with a single "open row id" slot — picking
155
- * row N collapses every other row. Implies `collapsible: true`. See
156
- * `RepeaterFieldMeta.accordion` for the shared semantics.
157
- */
158
- accordion?: boolean
159
- cloneable?: boolean
160
- addable?: boolean
161
- deletable?: boolean
162
- /**
163
- * Set when `Builder.addBetween()` is configured. The renderer mounts a
164
- * thin "+" insertion zone above each row (and at the very top) — clicking
165
- * it opens a compact picker that inserts the picked block at that
166
- * index. The bottom `Add block` button stays — `addBetween` is additive,
167
- * not a replacement. Respects `addable === false` and the field-level
168
- * `maxItems` cap; per-block `Block.maxItems` already filters the picker.
169
- */
170
- addBetween?: boolean
171
- addActionLabel?: string
172
- addActionAlignment?: BuilderAddActionAlignment
173
- blockPickerColumns?: number
174
- blockNumbers?: boolean
175
- blockIcons?: boolean
176
- itemNumbers?: boolean
177
- /**
178
- * Set when `Builder.grid(...)` is configured. Lays the ROWS themselves
179
- * in an n-column grid — distinct from a Block's inner `Block.columns(n)`,
180
- * which grids fields *inside* a single row. Accepts the scalar form
181
- * (`grid(2)`) or a responsive object (`grid({ default: 1, md: 2 })`) —
182
- * see `RepeaterFieldMeta.grid` for the shared semantics.
183
- */
184
- grid?: RepeaterGridConfig
185
- /**
186
- * Per-slot chrome overrides for the seven built-in row buttons. Same
187
- * shape as `RepeaterFieldMeta.buttons`; see `RowButton` for the
188
- * customizer. Authors set these via `.addAction(RowButton.make()…)` etc.
189
- */
190
- buttons?: RowButtonsMeta
191
- }
192
-
193
- /**
194
- * Heterogeneous-row Repeater. The author registers N block-types via
195
- * `.blocks([Block.make('heading').schema([…]), …])`; the rendered form
196
- * lets the end user pick from those types when adding rows.
197
- *
198
- * Storage on the parent record is `[{ __id, type, data: {…} }, …]` — a
199
- * `{ type, data }` envelope per row. JSON-friendly, collision-free with
200
- * any inner field name, mirrors Filament. See `docs/plans/builder-field.md`
201
- * for the wire-format details.
202
- */
203
- export class BuilderField extends Field {
204
- private _blocks: Block[] = []
205
- private _blocksByName: Map<string, Block> = new Map()
206
- private _minItems?: number
207
- private _maxItems?: number
208
- private _defaultBlock?: string
209
- private _reorderable = false
210
- private _reorderableWithButtons = false
211
- private _collapsible = false
212
- private _defaultCollapsed = false
213
- private _accordion = false
214
- private _cloneable = false
215
- private _addable = true
216
- private _deletable = true
217
- private _addBetween = false
218
- private _itemNumbers = false
219
- private _blockNumbers = false
220
- private _blockIcons = true
221
- private _blockPickerColumns?: number
222
- private _addActionLabel?: string
223
- private _addActionAlignment: BuilderAddActionAlignment = 'start'
224
- private _itemLabel?: BuilderItemLabel
225
- private _itemHidden?: BuilderItemHiddenRule
226
- private _itemCanDelete?: BuilderItemCanRule
227
- private _itemCanClone?: BuilderItemCanRule
228
- private _itemCanReorder?: BuilderItemCanRule
229
- private _extraItemActions: Action[] = []
230
- private _grid?: RepeaterGridConfig
231
- private _buttons: { [K in RowButtonKind]?: RowButton } = {}
232
- private _relationship?: BuilderRelationshipConfig
233
-
234
- private constructor(name: string) {
235
- super(name, 'builder')
236
- }
237
-
238
- static make(name: string): BuilderField {
239
- return new BuilderField(name)
240
- }
241
-
242
- /** Register the block types the user can pick from. Order = picker order. */
243
- blocks(blocks: Block[]): this {
244
- this._blocks = blocks
245
- this._blocksByName = new Map(blocks.map(b => [b.name, b]))
246
- return this
247
- }
248
-
249
- /** Validator + client gate. */
250
- minItems(n: number): this { this._minItems = n; return this }
251
- maxItems(n: number): this { this._maxItems = n; return this }
252
-
253
- /**
254
- * Block name auto-selected when adding a row without explicitly opening
255
- * the picker (e.g. when there's only one block type, or for "quick add"
256
- * UX). Defaults to undefined → picker always opens.
257
- */
258
- defaultBlock(name: string): this { this._defaultBlock = name; return this }
259
-
260
- reorderable(value: boolean = true): this { this._reorderable = value; return this }
261
-
262
- /**
263
- * Force button-only reorder (Up / Down arrows on each row). When `false`
264
- * (default), reorderable rows use HTML5 drag-and-drop with the buttons
265
- * as a keyboard fallback. Mirrors Filament's
266
- * `reorderableWithButtons(bool)`.
267
- */
268
- reorderableWithButtons(value: boolean = true): this {
269
- this._reorderableWithButtons = value
270
- return this
271
- }
272
-
273
- collapsible(value: boolean = true): this { this._collapsible = value; return this }
274
- collapsed(value: boolean = true): this { this._defaultCollapsed = value; return this }
275
-
276
- /**
277
- * Accordion mode: only one row open at a time. Picking a different row
278
- * collapses the currently-open one. Pair with `collapsed()` to start
279
- * with every row collapsed (default is "first row open"). Auto-arms
280
- * `collapsible()` since the accordion ergonomic is meaningless on a
281
- * non-collapsible builder. Mirrors `RepeaterField.accordion()`.
282
- */
283
- accordion(value: boolean = true): this {
284
- this._accordion = value
285
- if (value) this._collapsible = true
286
- return this
287
- }
288
-
289
- cloneable(value: boolean = true): this { this._cloneable = value; return this }
290
-
291
- /**
292
- * Hide the `Add block` button. `maxItems` is the validator gate; this is
293
- * the separate UX gate (e.g. read-only on a published record). Default `true`.
294
- */
295
- addable(value: boolean = true): this { this._addable = value; return this }
296
-
297
- /**
298
- * Hide the per-row delete button. `minItems` is the validator gate; this
299
- * is the UX gate. Default `true`.
300
- */
301
- deletable(value: boolean = true): this { this._deletable = value; return this }
302
-
303
- /**
304
- * Mount inline `+ Insert` zones above each row (and at the very top)
305
- * so the user can insert a new block between existing rows without
306
- * scrolling to the field's bottom `Add block` button. Mirrors
307
- * Filament's `addBetweenAction()` affordance. Additive — the bottom
308
- * `Add block` button stays. Respects `addable === false` and
309
- * `maxItems`; per-block `Block.maxItems` already filters the picker.
310
- */
311
- addBetween(value: boolean = true): this { this._addBetween = value; return this }
312
-
313
- /** Position of the `Add block` button. */
314
- addActionAlignment(a: BuilderAddActionAlignment): this {
315
- this._addActionAlignment = a
316
- return this
317
- }
318
-
319
- addActionLabel(label: string): this { this._addActionLabel = label; return this }
320
-
321
- /** Grid column count for the picker dropdown. Default 1. */
322
- blockPickerColumns(n: number): this { this._blockPickerColumns = n; return this }
323
-
324
- /** Show 1-based numbering on each row's header. */
325
- blockNumbers(value: boolean = true): this { this._blockNumbers = value; return this }
326
-
327
- /** Show the block's icon in each row's header. Default `true`. */
328
- blockIcons(value: boolean = true): this { this._blockIcons = value; return this }
329
-
330
- /** Alias of `blockNumbers` for users coming from Repeater (parity flag). */
331
- itemNumbers(value: boolean = true): this { this._itemNumbers = value; return this }
332
-
333
- itemLabel(fn: BuilderItemLabel): this { this._itemLabel = fn; return this }
334
-
335
- itemHidden(rule: BuilderItemHiddenRule): this { this._itemHidden = rule; return this }
336
-
337
- /**
338
- * Per-row gate for the trash button. Mirrors `Repeater.itemCanDelete`.
339
- * Predicate sees a row-scoped `LayoutContext` with `ctx.row.blockType`
340
- * exposing the row's block name so a single rule can branch by block.
341
- * Throwing → button stays visible + warn (fail-open, same posture as
342
- * `itemHidden`). Presentation only — gate the parent form's lifecycle
343
- * hooks for real authorization.
344
- */
345
- itemCanDelete(rule: BuilderItemCanRule): this { this._itemCanDelete = rule; return this }
346
-
347
- /**
348
- * Per-row gate for the clone (`Duplicate row`) button. Mirrors
349
- * `Repeater.itemCanClone`. No-op when `cloneable()` is off field-wide.
350
- */
351
- itemCanClone(rule: BuilderItemCanRule): this { this._itemCanClone = rule; return this }
352
-
353
- /**
354
- * Per-row gate for the reorder controls (drag grip + Up / Down arrows).
355
- * Mirrors `Repeater.itemCanReorder`. No-op when `reorderable()` is off
356
- * field-wide. Drag targeting is unaffected — non-pinned rows can still
357
- * drop at the pinned row's slot; pin both sides to keep a pair adjacent.
358
- */
359
- itemCanReorder(rule: BuilderItemCanRule): this { this._itemCanReorder = rule; return this }
360
-
361
- /**
362
- * Per-row action buttons rendered alongside clone/delete in each row's
363
- * header. Field-level only in v1 — applies to every block. Per-block
364
- * variants (`Block.extraItemActions(...)`) deferred. See
365
- * `RepeaterField.extraItemActions` for the dispatch contract; the only
366
- * Builder-specific note is that `ctx.row` exposes `blockType` so a
367
- * single handler can branch by block.
368
- */
369
- extraItemActions(actions: Action[]): this {
370
- this._extraItemActions = actions
371
- return this
372
- }
373
-
374
- /**
375
- * Lay the ROWS themselves in an n-column grid. Distinct from
376
- * `Block.columns(n)`, which grids fields *inside* a single block's
377
- * body. Accepts the scalar form (`grid(2)`) or a responsive object
378
- * (`grid({ default: 1, md: 2 })`). See `RepeaterField.grid()` for
379
- * the shared semantics — same renderer behavior, same drag-indicator
380
- * caveat.
381
- */
382
- grid(config: RepeaterGridConfig): this {
383
- const normalized = normalizeGridConfig(config)
384
- if (normalized === undefined) delete this._grid
385
- else this._grid = normalized
386
- return this
387
- }
388
-
389
- /**
390
- * Persist rows to a `HasMany` (or `MorphMany` / `MorphOne`) relation on
391
- * the parent record instead of serializing them to a JSON column. Each
392
- * row maps to a real child record carrying a `type` discriminator + a
393
- * JSON `data` payload (column names configurable). Submit creates /
394
- * updates / deletes children against the relation transparently.
395
- *
396
- * For `morphMany`, the child also carries `<morphName>Id` +
397
- * `<morphName>Type` columns; the framework stamps both on every create
398
- * (and refuses to overwrite them on update) so a tampered POST body
399
- * can't reassign a row to a different polymorphic parent. The morph
400
- * shape is read off the parent's `static relations[name]` descriptor —
401
- * no `foreignKey` override applies.
402
- *
403
- * Pass either the relationship name as a string (the common case —
404
- * `model` + `foreignKey` are auto-discovered from the parent's
405
- * `static relations` map; `typeColumn` / `dataColumn` default to
406
- * `'type'` / `'data'`) or an object form for explicit overrides.
407
- *
408
- * Mutually exclusive with `dehydrated(false)` — the field's whole purpose
409
- * is to write data, so silently dropping it would be confusing.
410
- * Validators run unchanged.
411
- */
412
- relationship(arg: string | BuilderRelationshipConfig): this {
413
- if (this.isDehydrated() === false) {
414
- throw new Error(
415
- `[Pilotiq] Builder "${this.name}": relationship() is incompatible with dehydrated(false) — the field's purpose is to persist data.`,
416
- )
417
- }
418
- this._relationship = typeof arg === 'string' ? { name: arg } : { ...arg }
419
- return this
420
- }
421
-
422
- /**
423
- * Sugar over `.relationship({ ..., orderColumn: col })`. Sets the order
424
- * column on an already-configured relationship; throws when
425
- * `relationship()` hasn't been called first so misconfiguration surfaces
426
- * eagerly.
427
- */
428
- orderColumn(col: string): this {
429
- if (!this._relationship) {
430
- throw new Error(
431
- `[Pilotiq] Builder "${this.name}": orderColumn() requires relationship() to be configured first.`,
432
- )
433
- }
434
- this._relationship.orderColumn = col
435
- return this
436
- }
437
-
438
- /**
439
- * Customize the bottom Add button's chrome. Equivalent to
440
- * `addActionLabel()` plus icon / color / tooltip overrides; the
441
- * customizer wins when both are set (it ships under `meta.buttons.add`
442
- * which the renderer reads after `addActionLabel`).
443
- */
444
- addAction(b: RowButton): this { this._buttons.add = b; return this }
445
-
446
- /** Customize the per-row clone button. */
447
- cloneAction(b: RowButton): this { this._buttons.clone = b; return this }
448
-
449
- /** Customize the per-row trash button. */
450
- deleteAction(b: RowButton): this { this._buttons.delete = b; return this }
451
-
452
- /** Customize the per-row Up arrow. */
453
- moveUpAction(b: RowButton): this { this._buttons.moveUp = b; return this }
454
-
455
- /** Customize the per-row Down arrow. */
456
- moveDownAction(b: RowButton): this { this._buttons.moveDown = b; return this }
457
-
458
- /**
459
- * Customize the drag-grip handle (label → aria-label, tooltip → title,
460
- * icon swaps the glyph, color re-tones the handle). The grip isn't a
461
- * real `<button>` so click semantics don't apply.
462
- */
463
- reorderAction(b: RowButton): this { this._buttons.reorder = b; return this }
464
-
465
- /**
466
- * Customize the per-row collapse chevron. Applies to BOTH states by
467
- * default — the open chevron and the collapsed chevron share the
468
- * override unless `expandAction(...)` is also set, in which case
469
- * `collapseAction` covers only the open state and `expandAction`
470
- * covers the collapsed state. Mirrors `RepeaterField.collapseAction`.
471
- */
472
- collapseAction(b: RowButton): this { this._buttons.collapse = b; return this }
473
-
474
- /**
475
- * Customize the per-row chevron when the row is currently *collapsed*.
476
- * Sibling of `collapseAction` for the closed-state glyph. Mirrors
477
- * `RepeaterField.expandAction`.
478
- */
479
- expandAction(b: RowButton): this { this._buttons.expand = b; return this }
480
-
481
- /**
482
- * Mount an "Expand all" button in the field header. Opt-in: calling
483
- * without args shows the button with default chrome; pass a
484
- * `RowButton` to override icon / label / tooltip / color. Auto-arms
485
- * `collapsible()`. In `accordion()` mode the button opens the first
486
- * visible row. Mirrors `RepeaterField.expandAllAction`.
487
- */
488
- expandAllAction(button?: RowButton): this {
489
- this._buttons.expandAll = button ?? RowButton.make()
490
- this._collapsible = true
491
- return this
492
- }
493
-
494
- /**
495
- * Mount a "Collapse all" button in the field header. Opt-in (calling
496
- * enables; pass a `RowButton` to customize). Auto-arms `collapsible()`.
497
- * Mirrors `RepeaterField.collapseAllAction`.
498
- */
499
- collapseAllAction(button?: RowButton): this {
500
- this._buttons.collapseAll = button ?? RowButton.make()
501
- this._collapsible = true
502
- return this
503
- }
504
-
505
- // ─── Read-only access ────────────────────────────────
506
-
507
- override getChildren(): undefined {
508
- // Builder rows are addressed per-row via `getBlocks()` + dotted paths.
509
- // Never return them as flat children — the parent walkers must stop
510
- // at the Builder boundary, just like RepeaterField.
511
- return undefined
512
- }
513
-
514
- getBlocks(): Block[] { return this._blocks }
515
- getBlock(name: string): Block | undefined { return this._blocksByName.get(name) }
516
- getMinItems(): number | undefined { return this._minItems }
517
- getMaxItems(): number | undefined { return this._maxItems }
518
- getDefaultBlock(): string | undefined { return this._defaultBlock }
519
- isReorderable(): boolean { return this._reorderable }
520
- isReorderableWithButtons(): boolean { return this._reorderableWithButtons }
521
- isCollapsible(): boolean { return this._collapsible }
522
- isDefaultCollapsed(): boolean { return this._defaultCollapsed }
523
- isAccordion(): boolean { return this._accordion }
524
- isCloneable(): boolean { return this._cloneable }
525
- isAddable(): boolean { return this._addable }
526
- isDeletable(): boolean { return this._deletable }
527
- isAddBetween(): boolean { return this._addBetween }
528
- showsBlockNumbers(): boolean { return this._blockNumbers || this._itemNumbers }
529
- showsBlockIcons(): boolean { return this._blockIcons }
530
- getBlockPickerColumns(): number | undefined { return this._blockPickerColumns }
531
- getAddActionLabel(): string | undefined { return this._addActionLabel }
532
- getAddActionAlignment(): BuilderAddActionAlignment { return this._addActionAlignment }
533
- getItemLabel(): BuilderItemLabel | undefined { return this._itemLabel }
534
- getItemHidden(): BuilderItemHiddenRule | undefined { return this._itemHidden }
535
- getItemCanDelete(): BuilderItemCanRule | undefined { return this._itemCanDelete }
536
- getItemCanClone(): BuilderItemCanRule | undefined { return this._itemCanClone }
537
- getItemCanReorder(): BuilderItemCanRule | undefined { return this._itemCanReorder }
538
- getExtraItemActions(): Action[] { return this._extraItemActions }
539
- getGrid(): RepeaterGridConfig | undefined { return this._grid }
540
- /** Resolved relationship config (`undefined` when not configured). */
541
- getRelationship(): BuilderRelationshipConfig | undefined { return this._relationship }
542
- isRelationship(): boolean { return this._relationship !== undefined }
543
- /** The configured customizer for a given slot, or `undefined`. */
544
- getButton(kind: RowButtonKind): RowButton | undefined { return this._buttons[kind] }
545
-
546
- // ─── Meta ────────────────────────────────────────────
547
-
548
- /**
549
- * Bare meta — `rows` and per-row resolved children are populated by
550
- * `resolveBuilderRows` in `schema/resolveSchema.ts`. The `blocks` array
551
- * (picker entries) ships unconditionally; the picker UI needs it before
552
- * the user has added any rows.
553
- */
554
- override toMeta(ctx?: RenderContext): BuilderFieldMeta {
555
- const base = this.buildMeta(ctx)
556
- const meta: BuilderFieldMeta = {
557
- ...base,
558
- fieldType: 'builder',
559
- rows: [],
560
- blocks: this._blocks.map(b => b.toMeta()),
561
- }
562
- if (this._minItems !== undefined) meta.minItems = this._minItems
563
- if (this._maxItems !== undefined) meta.maxItems = this._maxItems
564
- if (this._defaultBlock !== undefined) meta.defaultBlock = this._defaultBlock
565
- if (this._reorderable) meta.reorderable = true
566
- if (this._reorderableWithButtons) meta.reorderableWithButtons = true
567
- if (this._collapsible) meta.collapsible = true
568
- if (this._defaultCollapsed) meta.defaultCollapsed = true
569
- if (this._accordion) meta.accordion = true
570
- if (this._cloneable) meta.cloneable = true
571
- if (this._addable === false) meta.addable = false
572
- if (this._deletable === false) meta.deletable = false
573
- if (this._addBetween) meta.addBetween = true
574
- if (this._blockNumbers) meta.blockNumbers = true
575
- if (this._blockIcons === false) meta.blockIcons = false
576
- if (this._itemNumbers) meta.itemNumbers = true
577
- if (this._blockPickerColumns !== undefined) meta.blockPickerColumns = this._blockPickerColumns
578
- if (this._addActionLabel !== undefined) meta.addActionLabel = this._addActionLabel
579
- if (this._addActionAlignment !== 'start') meta.addActionAlignment = this._addActionAlignment
580
- if (this._grid !== undefined) meta.grid = this._grid
581
- if (this._relationship !== undefined) {
582
- const r: BuilderRelationshipMeta = { name: this._relationship.name }
583
- if (this._relationship.typeColumn !== undefined) r.typeColumn = this._relationship.typeColumn
584
- if (this._relationship.dataColumn !== undefined) r.dataColumn = this._relationship.dataColumn
585
- if (this._relationship.orderColumn !== undefined) r.orderColumn = this._relationship.orderColumn
586
- meta.relationship = r
587
- }
588
- const buttons = serializeRowButtons(this._buttons)
589
- if (buttons !== undefined) meta.buttons = buttons
590
- return meta
591
- }
592
- }
593
-
594
- export const Builder = BuilderField
595
-
596
- /**
597
- * Structural Builder check — Vite's SSR module cache can load this
598
- * package via two paths during a single dev session, so `instanceof
599
- * BuilderField` can silently return false across module copies. The
600
- * structural check matches `getType() === 'field'` (Field's discriminator)
601
- * + `fieldType === 'builder'`. Same posture as `isRepeaterField`.
602
- */
603
- export function isBuilderField(el: { getType(): string; fieldType?: string }): boolean {
604
- return el.getType() === 'field' && el['fieldType'] === 'builder'
605
- }