@pilotiq/pilotiq 0.23.1 → 0.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/boost/guidelines.md +566 -0
  3. package/boost/skills/pilotiq-fields/SKILL.md +47 -0
  4. package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
  5. package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
  6. package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
  7. package/boost/skills/pilotiq-relations/SKILL.md +47 -0
  8. package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
  9. package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
  10. package/boost/skills/pilotiq-resource/SKILL.md +61 -0
  11. package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
  12. package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
  13. package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
  14. package/dist/actions/exportFactory.d.ts +10 -0
  15. package/dist/actions/exportFactory.d.ts.map +1 -1
  16. package/dist/actions/exportFactory.js +10 -0
  17. package/dist/actions/exportFactory.js.map +1 -1
  18. package/dist/react/CollabRoomContext.d.ts +5 -5
  19. package/dist/react/index.d.ts +0 -1
  20. package/dist/react/index.d.ts.map +1 -1
  21. package/dist/react/index.js +0 -1
  22. package/dist/react/index.js.map +1 -1
  23. package/dist/routes/helpers.d.ts.map +1 -1
  24. package/dist/routes/helpers.js +6 -2
  25. package/dist/routes/helpers.js.map +1 -1
  26. package/dist/routes/relations.d.ts.map +1 -1
  27. package/dist/routes/relations.js +12 -0
  28. package/dist/routes/relations.js.map +1 -1
  29. package/package.json +6 -1
  30. package/.turbo/turbo-build.log +0 -8
  31. package/CLAUDE.md +0 -265
  32. package/dist/react/useCollabSeed.d.ts +0 -23
  33. package/dist/react/useCollabSeed.d.ts.map +0 -1
  34. package/dist/react/useCollabSeed.js +0 -82
  35. package/dist/react/useCollabSeed.js.map +0 -1
  36. package/src/Cluster.test.ts +0 -283
  37. package/src/Cluster.ts +0 -83
  38. package/src/Column.test.ts +0 -199
  39. package/src/Column.ts +0 -710
  40. package/src/Global.test.ts +0 -367
  41. package/src/Global.ts +0 -169
  42. package/src/Page.test.ts +0 -114
  43. package/src/Page.ts +0 -208
  44. package/src/Pilotiq.perf.test.ts +0 -252
  45. package/src/Pilotiq.test.ts +0 -129
  46. package/src/Pilotiq.ts +0 -1158
  47. package/src/PilotiqRegistry.ts +0 -36
  48. package/src/PilotiqServiceProvider.ts +0 -121
  49. package/src/RelationManager.test.ts +0 -400
  50. package/src/RelationManager.ts +0 -527
  51. package/src/RenderHook.test.ts +0 -252
  52. package/src/RenderHook.ts +0 -242
  53. package/src/Resource.test.ts +0 -284
  54. package/src/Resource.ts +0 -526
  55. package/src/RightPanel.test.ts +0 -202
  56. package/src/RightPanel.ts +0 -132
  57. package/src/Tab.test.ts +0 -91
  58. package/src/Tab.ts +0 -156
  59. package/src/UserMenuItem.ts +0 -145
  60. package/src/actions/Action.test.ts +0 -2526
  61. package/src/actions/Action.ts +0 -1515
  62. package/src/actions/ActionGroup.test.ts +0 -112
  63. package/src/actions/ActionGroup.ts +0 -173
  64. package/src/actions/attachFactory.ts +0 -172
  65. package/src/actions/bulkFactories.ts +0 -168
  66. package/src/actions/crudFactories.ts +0 -220
  67. package/src/actions/exportFactory.ts +0 -215
  68. package/src/actions/factoryHelpers.ts +0 -177
  69. package/src/actions/importFactory.ts +0 -243
  70. package/src/actions/index.ts +0 -17
  71. package/src/actions/m2mFactories.ts +0 -193
  72. package/src/actions/relationFactories.ts +0 -372
  73. package/src/applyPageHooks.test.ts +0 -463
  74. package/src/applyPageHooks.ts +0 -330
  75. package/src/authorization.test.ts +0 -483
  76. package/src/breadcrumbs.test.ts +0 -238
  77. package/src/cells/coerce.test.ts +0 -85
  78. package/src/cells/coerce.ts +0 -84
  79. package/src/clusterPaths.ts +0 -35
  80. package/src/columns/BadgeColumn.test.ts +0 -54
  81. package/src/columns/BadgeColumn.ts +0 -32
  82. package/src/columns/BooleanColumn.test.ts +0 -41
  83. package/src/columns/BooleanColumn.ts +0 -18
  84. package/src/columns/ColorColumn.test.ts +0 -37
  85. package/src/columns/ColorColumn.ts +0 -38
  86. package/src/columns/IconColumn.test.ts +0 -54
  87. package/src/columns/IconColumn.ts +0 -37
  88. package/src/columns/ImageColumn.test.ts +0 -41
  89. package/src/columns/ImageColumn.ts +0 -28
  90. package/src/columns/SelectColumn.ts +0 -98
  91. package/src/columns/TextColumn.test.ts +0 -190
  92. package/src/columns/TextColumn.ts +0 -20
  93. package/src/columns/TextInputColumn.ts +0 -68
  94. package/src/columns/ToggleColumn.ts +0 -46
  95. package/src/columns/editableColumns.test.ts +0 -238
  96. package/src/columns/index.ts +0 -9
  97. package/src/defaultGlobalPages.ts +0 -95
  98. package/src/defaultPages.test.ts +0 -634
  99. package/src/defaultPages.ts +0 -617
  100. package/src/defaultViewPage.test.ts +0 -147
  101. package/src/elements/Form.test.ts +0 -223
  102. package/src/elements/Form.ts +0 -416
  103. package/src/elements/ListTabs.ts +0 -28
  104. package/src/elements/Table.test.ts +0 -422
  105. package/src/elements/Table.ts +0 -850
  106. package/src/elements/TableGroup.test.ts +0 -260
  107. package/src/elements/TableGroup.ts +0 -334
  108. package/src/elements/dispatchAction.test.ts +0 -463
  109. package/src/elements/dispatchAction.ts +0 -355
  110. package/src/elements/dispatchForm.test.ts +0 -477
  111. package/src/elements/dispatchForm.ts +0 -1993
  112. package/src/elements/dispatchTable.test.ts +0 -1514
  113. package/src/elements/dispatchTable.ts +0 -745
  114. package/src/elements/index.ts +0 -21
  115. package/src/entries/BadgeEntry.ts +0 -39
  116. package/src/entries/CodeEntry.test.ts +0 -40
  117. package/src/entries/CodeEntry.ts +0 -52
  118. package/src/entries/ColorEntry.ts +0 -63
  119. package/src/entries/ComponentEntry.test.ts +0 -173
  120. package/src/entries/ComponentEntry.ts +0 -95
  121. package/src/entries/Entry.ts +0 -304
  122. package/src/entries/IconEntry.ts +0 -49
  123. package/src/entries/ImageEntry.ts +0 -61
  124. package/src/entries/KeyValueEntry.ts +0 -47
  125. package/src/entries/RepeatableEntry.test.ts +0 -239
  126. package/src/entries/RepeatableEntry.ts +0 -173
  127. package/src/entries/TextEntry.test.ts +0 -394
  128. package/src/entries/TextEntry.ts +0 -60
  129. package/src/entries/index.ts +0 -12
  130. package/src/entries/leaves.test.ts +0 -306
  131. package/src/entries/registry.ts +0 -54
  132. package/src/fields/BuilderField.test.ts +0 -1188
  133. package/src/fields/BuilderField.ts +0 -605
  134. package/src/fields/BuilderRelationship.test.ts +0 -811
  135. package/src/fields/CheckboxField.test.ts +0 -44
  136. package/src/fields/CheckboxField.ts +0 -27
  137. package/src/fields/CheckboxListField.test.ts +0 -99
  138. package/src/fields/CheckboxListField.ts +0 -66
  139. package/src/fields/ColorPickerField.test.ts +0 -33
  140. package/src/fields/ColorPickerField.ts +0 -25
  141. package/src/fields/DateField.ts +0 -54
  142. package/src/fields/DateTimeField.test.ts +0 -55
  143. package/src/fields/EmailField.ts +0 -16
  144. package/src/fields/Field.test.ts +0 -654
  145. package/src/fields/Field.ts +0 -817
  146. package/src/fields/FileUploadField.test.ts +0 -143
  147. package/src/fields/FileUploadField.ts +0 -159
  148. package/src/fields/HiddenField.test.ts +0 -27
  149. package/src/fields/HiddenField.ts +0 -28
  150. package/src/fields/KeyValueField.test.ts +0 -105
  151. package/src/fields/KeyValueField.ts +0 -55
  152. package/src/fields/MarkdownField.test.ts +0 -167
  153. package/src/fields/MarkdownField.ts +0 -162
  154. package/src/fields/NumberField.ts +0 -33
  155. package/src/fields/RadioField.test.ts +0 -94
  156. package/src/fields/RadioField.ts +0 -67
  157. package/src/fields/RepeaterField.test.ts +0 -1806
  158. package/src/fields/RepeaterField.ts +0 -939
  159. package/src/fields/RepeaterRelationship.test.ts +0 -1923
  160. package/src/fields/RepeaterSimple.test.ts +0 -248
  161. package/src/fields/RowButton.test.ts +0 -219
  162. package/src/fields/RowButton.ts +0 -135
  163. package/src/fields/SelectField.test.ts +0 -192
  164. package/src/fields/SelectField.ts +0 -235
  165. package/src/fields/SliderField.test.ts +0 -50
  166. package/src/fields/SliderField.ts +0 -53
  167. package/src/fields/SlugField.ts +0 -24
  168. package/src/fields/TagsInputField.test.ts +0 -154
  169. package/src/fields/TagsInputField.ts +0 -133
  170. package/src/fields/TextField.test.ts +0 -213
  171. package/src/fields/TextField.ts +0 -177
  172. package/src/fields/TextareaField.test.ts +0 -58
  173. package/src/fields/TextareaField.ts +0 -59
  174. package/src/fields/ToggleButtonsField.test.ts +0 -106
  175. package/src/fields/ToggleButtonsField.ts +0 -59
  176. package/src/fields/ToggleField.ts +0 -16
  177. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
  178. package/src/fields/optionsResolver.ts +0 -95
  179. package/src/fields/resolveField.ts +0 -28
  180. package/src/filters/BooleanFilter.ts +0 -35
  181. package/src/filters/DateRangeFilter.test.ts +0 -194
  182. package/src/filters/DateRangeFilter.ts +0 -148
  183. package/src/filters/Filter.test.ts +0 -268
  184. package/src/filters/Filter.ts +0 -184
  185. package/src/filters/FormFilter.test.ts +0 -238
  186. package/src/filters/FormFilter.ts +0 -215
  187. package/src/filters/MultiSelectFilter.test.ts +0 -119
  188. package/src/filters/MultiSelectFilter.ts +0 -78
  189. package/src/filters/QueryBuilderFilter.test.ts +0 -662
  190. package/src/filters/QueryBuilderFilter.ts +0 -398
  191. package/src/filters/SelectFilter.ts +0 -46
  192. package/src/filters/TernaryFilter.test.ts +0 -160
  193. package/src/filters/TernaryFilter.ts +0 -72
  194. package/src/filters/TrashedFilter.test.ts +0 -149
  195. package/src/filters/TrashedFilter.ts +0 -55
  196. package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
  197. package/src/filters/queryBuilder/Constraint.ts +0 -115
  198. package/src/filters/queryBuilder/DateConstraint.ts +0 -69
  199. package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
  200. package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
  201. package/src/filters/queryBuilder/TextConstraint.ts +0 -64
  202. package/src/filters/queryBuilder/index.ts +0 -12
  203. package/src/icons/index.ts +0 -2
  204. package/src/icons/lucide.ts +0 -204
  205. package/src/icons/registry.test.ts +0 -56
  206. package/src/icons/registry.ts +0 -41
  207. package/src/icons/types.ts +0 -47
  208. package/src/index.ts +0 -525
  209. package/src/io/csv.test.ts +0 -142
  210. package/src/io/csv.ts +0 -170
  211. package/src/nestedRelationManagerData.test.ts +0 -547
  212. package/src/notifications/Notification.test.ts +0 -210
  213. package/src/notifications/Notification.ts +0 -354
  214. package/src/notifications/broadcast.test.ts +0 -110
  215. package/src/notifications/broadcast.ts +0 -95
  216. package/src/notifications/database.test.ts +0 -383
  217. package/src/notifications/database.ts +0 -398
  218. package/src/notifications/databaseNotifications.test.ts +0 -187
  219. package/src/notifications/dispatchNotificationAction.test.ts +0 -341
  220. package/src/notifications/dispatchNotificationAction.ts +0 -142
  221. package/src/notifications/flash.test.ts +0 -89
  222. package/src/notifications/flash.ts +0 -71
  223. package/src/notifications/index.ts +0 -45
  224. package/src/notifications/registerBroadcastAuth.test.ts +0 -134
  225. package/src/notifications/registerBroadcastAuth.ts +0 -100
  226. package/src/notifications/resolveSavedNotification.test.ts +0 -82
  227. package/src/notifications/resolveSavedNotification.ts +0 -59
  228. package/src/notifications/types.ts +0 -93
  229. package/src/orm/m2mAccessor.ts +0 -66
  230. package/src/orm/modelDefaults.test.ts +0 -633
  231. package/src/orm/modelDefaults.ts +0 -666
  232. package/src/pageData/breadcrumbs.ts +0 -288
  233. package/src/pageData/forms.ts +0 -578
  234. package/src/pageData/helpers.ts +0 -857
  235. package/src/pageData/misc.ts +0 -347
  236. package/src/pageData/navigation.ts +0 -842
  237. package/src/pageData/relationPages.ts +0 -1248
  238. package/src/pageData/relationTabs.ts +0 -286
  239. package/src/pageData/resourcePages.ts +0 -609
  240. package/src/pageData.test.ts +0 -1545
  241. package/src/pageData.ts +0 -341
  242. package/src/plugins/index.ts +0 -8
  243. package/src/plugins/themeEditor.test.ts +0 -36
  244. package/src/plugins/themeEditor.ts +0 -45
  245. package/src/react/AppShell.tsx +0 -251
  246. package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
  247. package/src/react/CollabRoomContext.ts +0 -98
  248. package/src/react/CollabTextRendererRegistry.ts +0 -102
  249. package/src/react/CommandPalette.tsx +0 -375
  250. package/src/react/CurrentUserContext.tsx +0 -50
  251. package/src/react/CustomPageWrapperGate.tsx +0 -69
  252. package/src/react/CustomPageWrapperRegistry.ts +0 -45
  253. package/src/react/FieldFocusReporterRegistry.ts +0 -37
  254. package/src/react/FieldLabelSlotRegistry.ts +0 -30
  255. package/src/react/FieldPresenceRegistry.ts +0 -46
  256. package/src/react/FormCollabBindingRegistry.ts +0 -242
  257. package/src/react/FormStateContext.tsx +0 -591
  258. package/src/react/HeadHooks.tsx +0 -126
  259. package/src/react/MarkdownEditorRegistry.test.ts +0 -38
  260. package/src/react/MarkdownEditorRegistry.ts +0 -107
  261. package/src/react/NotificationActionStrip.tsx +0 -263
  262. package/src/react/NotificationBell.tsx +0 -426
  263. package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
  264. package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
  265. package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
  266. package/src/react/PendingSuggestionsContext.tsx +0 -172
  267. package/src/react/RecordWrapperGate.tsx +0 -58
  268. package/src/react/RecordWrapperRegistry.ts +0 -39
  269. package/src/react/RenderHookSlot.tsx +0 -32
  270. package/src/react/RightSidebar.tsx +0 -257
  271. package/src/react/RightSidebarContext.tsx +0 -234
  272. package/src/react/RightSidebarTrigger.tsx +0 -53
  273. package/src/react/RowCoordsContext.tsx +0 -23
  274. package/src/react/SchemaRenderer.tsx +0 -549
  275. package/src/react/SearchTrigger.tsx +0 -46
  276. package/src/react/ThemeProvider.tsx +0 -93
  277. package/src/react/ThemeSettingsPage.tsx +0 -579
  278. package/src/react/ThemeToggle.tsx +0 -20
  279. package/src/react/Toaster.tsx +0 -158
  280. package/src/react/UserMenu.tsx +0 -196
  281. package/src/react/WidgetDataContext.tsx +0 -157
  282. package/src/react/cells/EditableCell.tsx +0 -389
  283. package/src/react/component-slots.test.ts +0 -103
  284. package/src/react/component-slots.ts +0 -116
  285. package/src/react/fieldJsHandler.test.ts +0 -166
  286. package/src/react/fieldJsHandler.ts +0 -79
  287. package/src/react/fields/BuilderInput.tsx +0 -1078
  288. package/src/react/fields/CheckboxInput.tsx +0 -39
  289. package/src/react/fields/CheckboxListInput.tsx +0 -102
  290. package/src/react/fields/ColorInput.tsx +0 -71
  291. package/src/react/fields/DateFieldInput.tsx +0 -70
  292. package/src/react/fields/DateTimeInput.tsx +0 -62
  293. package/src/react/fields/FieldShell.tsx +0 -348
  294. package/src/react/fields/FileUploadInput.tsx +0 -639
  295. package/src/react/fields/HiddenInput.tsx +0 -17
  296. package/src/react/fields/KeyValueInput.tsx +0 -230
  297. package/src/react/fields/MarkdownInput.tsx +0 -560
  298. package/src/react/fields/RadioInput.tsx +0 -81
  299. package/src/react/fields/RepeaterInput.test.ts +0 -116
  300. package/src/react/fields/RepeaterInput.tsx +0 -1420
  301. package/src/react/fields/SelectFieldInput.tsx +0 -280
  302. package/src/react/fields/SliderInput.tsx +0 -81
  303. package/src/react/fields/TagsInput.tsx +0 -283
  304. package/src/react/fields/TextLikeInput.tsx +0 -256
  305. package/src/react/fields/ToggleButtonsInput.tsx +0 -60
  306. package/src/react/fields/ToggleFieldInput.tsx +0 -56
  307. package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
  308. package/src/react/fields/relationshipRenameDispatch.ts +0 -97
  309. package/src/react/fields/repeaterReconcile.test.ts +0 -114
  310. package/src/react/fields/repeaterReconcile.ts +0 -104
  311. package/src/react/fields/rowChromeButton.tsx +0 -336
  312. package/src/react/fields/rowState.ts +0 -106
  313. package/src/react/fields/syncRowGates.test.ts +0 -202
  314. package/src/react/fields/syncRowGates.ts +0 -66
  315. package/src/react/fields/textInputControls.tsx +0 -238
  316. package/src/react/fields/useRowReorderDnd.ts +0 -78
  317. package/src/react/formStateHelpers.test.ts +0 -508
  318. package/src/react/formStateHelpers.ts +0 -381
  319. package/src/react/hooks/use-mobile.ts +0 -19
  320. package/src/react/icon-context.tsx +0 -60
  321. package/src/react/index.ts +0 -195
  322. package/src/react/layouts/SidebarLayout.tsx +0 -250
  323. package/src/react/layouts/TopbarLayout.tsx +0 -258
  324. package/src/react/navigate.tsx +0 -37
  325. package/src/react/onProviderSynced.test.ts +0 -90
  326. package/src/react/parseRecordEditUrl.test.ts +0 -122
  327. package/src/react/parseRecordEditUrl.ts +0 -94
  328. package/src/react/persistedState.ts +0 -40
  329. package/src/react/registry.ts +0 -48
  330. package/src/react/right-panel-registry.tsx +0 -47
  331. package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
  332. package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
  333. package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
  334. package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
  335. package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
  336. package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
  337. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
  338. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
  339. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
  340. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
  341. package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
  342. package/src/react/schemaRenderer/action/buttons.tsx +0 -99
  343. package/src/react/schemaRenderer/action/helpers.ts +0 -140
  344. package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
  345. package/src/react/schemaRenderer/columnFormat.ts +0 -65
  346. package/src/react/schemaRenderer/constants.ts +0 -50
  347. package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
  348. package/src/react/schemaRenderer/form/renderField.tsx +0 -511
  349. package/src/react/schemaRenderer/helpers.tsx +0 -81
  350. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
  351. package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
  352. package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
  353. package/src/react/schemaRenderer/table/filters.tsx +0 -1233
  354. package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
  355. package/src/react/schemaRenderer/table/links.tsx +0 -112
  356. package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
  357. package/src/react/schemaRenderer/table/url.tsx +0 -143
  358. package/src/react/theme-preview/apply.ts +0 -99
  359. package/src/react/theme-preview/build-html.ts +0 -436
  360. package/src/react/ui/button.tsx +0 -51
  361. package/src/react/ui/calendar.tsx +0 -67
  362. package/src/react/ui/checkbox.tsx +0 -29
  363. package/src/react/ui/dialog.tsx +0 -108
  364. package/src/react/ui/dropdown-menu.tsx +0 -97
  365. package/src/react/ui/input.tsx +0 -20
  366. package/src/react/ui/label.tsx +0 -21
  367. package/src/react/ui/popover.tsx +0 -50
  368. package/src/react/ui/select.tsx +0 -169
  369. package/src/react/ui/separator.tsx +0 -25
  370. package/src/react/ui/sheet.tsx +0 -136
  371. package/src/react/ui/sidebar.tsx +0 -723
  372. package/src/react/ui/skeleton.tsx +0 -13
  373. package/src/react/ui/slider.tsx +0 -34
  374. package/src/react/ui/switch.tsx +0 -28
  375. package/src/react/ui/table.tsx +0 -105
  376. package/src/react/ui/tabs.tsx +0 -63
  377. package/src/react/ui/textarea.tsx +0 -18
  378. package/src/react/ui/tooltip.tsx +0 -64
  379. package/src/react/useCollabSeed.ts +0 -86
  380. package/src/react/useResizableWidth.ts +0 -139
  381. package/src/react/utils.ts +0 -6
  382. package/src/react/widgetRegistry.test.ts +0 -43
  383. package/src/react/widgetRegistry.ts +0 -50
  384. package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
  385. package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
  386. package/src/react/widgets/ViewRenderer.tsx +0 -71
  387. package/src/relationManagerData.test.ts +0 -1595
  388. package/src/richtext/index.ts +0 -8
  389. package/src/richtext/registry.ts +0 -89
  390. package/src/routes/globals.ts +0 -148
  391. package/src/routes/guard.test.ts +0 -325
  392. package/src/routes/helpers.ts +0 -700
  393. package/src/routes/pages.ts +0 -175
  394. package/src/routes/panel.ts +0 -204
  395. package/src/routes/relations.ts +0 -1227
  396. package/src/routes/resources.ts +0 -781
  397. package/src/routes/theme.ts +0 -91
  398. package/src/routes-nested-relations.test.ts +0 -676
  399. package/src/routes-relations.test.ts +0 -972
  400. package/src/routes.test.ts +0 -2027
  401. package/src/routes.ts +0 -303
  402. package/src/schema/Alert.test.ts +0 -109
  403. package/src/schema/Alert.ts +0 -131
  404. package/src/schema/Block.ts +0 -169
  405. package/src/schema/Breadcrumbs.ts +0 -40
  406. package/src/schema/Card.ts +0 -35
  407. package/src/schema/Divider.ts +0 -20
  408. package/src/schema/Element.ts +0 -219
  409. package/src/schema/EmptyState.test.ts +0 -37
  410. package/src/schema/EmptyState.ts +0 -63
  411. package/src/schema/Fieldset.ts +0 -43
  412. package/src/schema/Grid.ts +0 -43
  413. package/src/schema/Group.ts +0 -30
  414. package/src/schema/Heading.ts +0 -39
  415. package/src/schema/Html.ts +0 -67
  416. package/src/schema/Icon.ts +0 -54
  417. package/src/schema/Image.ts +0 -57
  418. package/src/schema/LinkTag.ts +0 -41
  419. package/src/schema/Markdown.ts +0 -85
  420. package/src/schema/MetaTag.ts +0 -41
  421. package/src/schema/RelationTabs.ts +0 -71
  422. package/src/schema/ScriptTag.ts +0 -55
  423. package/src/schema/Section.ts +0 -160
  424. package/src/schema/ServerDataElement.test.ts +0 -140
  425. package/src/schema/ServerDataElement.ts +0 -156
  426. package/src/schema/SlotComponent.test.ts +0 -77
  427. package/src/schema/SlotComponent.ts +0 -71
  428. package/src/schema/Split.ts +0 -50
  429. package/src/schema/Stat.test.ts +0 -118
  430. package/src/schema/Stat.ts +0 -154
  431. package/src/schema/StatsOverview.test.ts +0 -141
  432. package/src/schema/StatsOverview.ts +0 -119
  433. package/src/schema/StyleTag.ts +0 -35
  434. package/src/schema/TableWidget.test.ts +0 -297
  435. package/src/schema/TableWidget.ts +0 -289
  436. package/src/schema/Tabs.ts +0 -79
  437. package/src/schema/Text.ts +0 -58
  438. package/src/schema/UnorderedList.ts +0 -49
  439. package/src/schema/View.test.ts +0 -111
  440. package/src/schema/View.ts +0 -127
  441. package/src/schema/Wizard.ts +0 -220
  442. package/src/schema/containers.test.ts +0 -564
  443. package/src/schema/headTags.test.ts +0 -134
  444. package/src/schema/index.ts +0 -40
  445. package/src/schema/primes.test.ts +0 -269
  446. package/src/schema/resolveSchema.test.ts +0 -379
  447. package/src/schema/resolveSchema.ts +0 -917
  448. package/src/schema/sanitize.ts +0 -58
  449. package/src/search.test.ts +0 -446
  450. package/src/search.ts +0 -178
  451. package/src/sessionFilters.test.ts +0 -375
  452. package/src/sessionFilters.ts +0 -143
  453. package/src/slot-components/index.ts +0 -10
  454. package/src/slot-components/registry.ts +0 -56
  455. package/src/styles/file-upload.css +0 -13
  456. package/src/summarizers/Summarizer.test.ts +0 -84
  457. package/src/summarizers/Summarizer.ts +0 -123
  458. package/src/summarizers/index.ts +0 -11
  459. package/src/theme/base-colors.ts +0 -68
  460. package/src/theme/chart-colors.ts +0 -50
  461. package/src/theme/colors.ts +0 -447
  462. package/src/theme/generate-css.test.ts +0 -139
  463. package/src/theme/generate-css.ts +0 -44
  464. package/src/theme/generate-scale.test.ts +0 -106
  465. package/src/theme/generate-scale.ts +0 -97
  466. package/src/theme/icon-map.ts +0 -42
  467. package/src/theme/index.ts +0 -34
  468. package/src/theme/migrate.test.ts +0 -178
  469. package/src/theme/migrate.ts +0 -81
  470. package/src/theme/presets.ts +0 -135
  471. package/src/theme/radius.ts +0 -18
  472. package/src/theme/resolve.test.ts +0 -238
  473. package/src/theme/resolve.ts +0 -96
  474. package/src/theme/spacing.ts +0 -18
  475. package/src/theme/storage.test.ts +0 -126
  476. package/src/theme/storage.ts +0 -106
  477. package/src/theme/theme-colors.ts +0 -88
  478. package/src/theme/types.ts +0 -125
  479. package/src/uploads/UploadAdapter.ts +0 -35
  480. package/src/uploads/index.ts +0 -2
  481. package/src/uploads/localUpload.test.ts +0 -70
  482. package/src/uploads/localUpload.ts +0 -84
  483. package/src/validation/Validator.ts +0 -49
  484. package/src/validation/index.ts +0 -28
  485. package/src/validation/rules.ts +0 -78
  486. package/src/validation/runValidators.ts +0 -435
  487. package/src/validation/uniqueValidator.test.ts +0 -196
  488. package/src/validation/uniqueValidator.ts +0 -133
  489. package/src/validation/validators.test.ts +0 -268
  490. package/src/vite.test.ts +0 -184
  491. package/src/vite.ts +0 -787
  492. package/src/widgets/index.ts +0 -10
  493. package/src/widgets/registry.ts +0 -45
  494. package/src/widgets.test.ts +0 -592
  495. package/tsconfig.build.json +0 -11
  496. package/tsconfig.json +0 -4
  497. package/tsconfig.test.json +0 -10
  498. package/views/react/Dashboard.tsx +0 -27
  499. package/views/react/Resources/Form.tsx +0 -102
  500. 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
- }