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