@pilotiq/pilotiq 0.24.1 → 0.24.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/boost/guidelines.md +571 -0
  3. package/boost/skills/pilotiq-actions/SKILL.md +49 -0
  4. package/boost/skills/pilotiq-actions/rules/dispatch-modes.md +177 -0
  5. package/boost/skills/pilotiq-actions/rules/factories.md +130 -0
  6. package/boost/skills/pilotiq-actions/rules/visibility-and-authorization.md +125 -0
  7. package/boost/skills/pilotiq-fields/SKILL.md +47 -0
  8. package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
  9. package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
  10. package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
  11. package/boost/skills/pilotiq-relations/SKILL.md +47 -0
  12. package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
  13. package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
  14. package/boost/skills/pilotiq-resource/SKILL.md +61 -0
  15. package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
  16. package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
  17. package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
  18. package/dist/Pilotiq.d.ts +31 -0
  19. package/dist/Pilotiq.d.ts.map +1 -1
  20. package/dist/Pilotiq.js +3 -1
  21. package/dist/Pilotiq.js.map +1 -1
  22. package/dist/PilotiqRegistry.d.ts +13 -0
  23. package/dist/PilotiqRegistry.d.ts.map +1 -1
  24. package/dist/PilotiqRegistry.js +15 -0
  25. package/dist/PilotiqRegistry.js.map +1 -1
  26. package/dist/pageData/misc.d.ts.map +1 -1
  27. package/dist/pageData/misc.js +6 -0
  28. package/dist/pageData/misc.js.map +1 -1
  29. package/dist/pageData/navigation.d.ts +1 -0
  30. package/dist/pageData/navigation.d.ts.map +1 -1
  31. package/dist/pageData/navigation.js +3 -0
  32. package/dist/pageData/navigation.js.map +1 -1
  33. package/dist/pageData/relationPages.d.ts.map +1 -1
  34. package/dist/pageData/relationPages.js +3 -0
  35. package/dist/pageData/relationPages.js.map +1 -1
  36. package/dist/pageData/resourcePages.d.ts.map +1 -1
  37. package/dist/pageData/resourcePages.js +8 -0
  38. package/dist/pageData/resourcePages.js.map +1 -1
  39. package/dist/react/AppShell.d.ts +8 -0
  40. package/dist/react/AppShell.d.ts.map +1 -1
  41. package/dist/react/AppShell.js.map +1 -1
  42. package/dist/react/layouts/SidebarLayout.d.ts.map +1 -1
  43. package/dist/react/layouts/SidebarLayout.js +10 -2
  44. package/dist/react/layouts/SidebarLayout.js.map +1 -1
  45. package/dist/react/widgets/StatsOverviewRenderer.d.ts.map +1 -1
  46. package/dist/react/widgets/StatsOverviewRenderer.js +32 -18
  47. package/dist/react/widgets/StatsOverviewRenderer.js.map +1 -1
  48. package/dist/routes/relations.d.ts.map +1 -1
  49. package/dist/routes/relations.js +25 -18
  50. package/dist/routes/relations.js.map +1 -1
  51. package/dist/routes/resources.js.map +1 -1
  52. package/package.json +10 -5
  53. package/.turbo/turbo-build.log +0 -8
  54. package/CLAUDE.md +0 -265
  55. package/src/Cluster.test.ts +0 -283
  56. package/src/Cluster.ts +0 -83
  57. package/src/Column.test.ts +0 -199
  58. package/src/Column.ts +0 -710
  59. package/src/Global.test.ts +0 -367
  60. package/src/Global.ts +0 -169
  61. package/src/Page.test.ts +0 -114
  62. package/src/Page.ts +0 -208
  63. package/src/Pilotiq.perf.test.ts +0 -252
  64. package/src/Pilotiq.test.ts +0 -129
  65. package/src/Pilotiq.ts +0 -1158
  66. package/src/PilotiqRegistry.ts +0 -36
  67. package/src/PilotiqServiceProvider.ts +0 -121
  68. package/src/RelationManager.test.ts +0 -400
  69. package/src/RelationManager.ts +0 -527
  70. package/src/RenderHook.test.ts +0 -252
  71. package/src/RenderHook.ts +0 -242
  72. package/src/Resource.test.ts +0 -284
  73. package/src/Resource.ts +0 -526
  74. package/src/RightPanel.test.ts +0 -202
  75. package/src/RightPanel.ts +0 -132
  76. package/src/Tab.test.ts +0 -91
  77. package/src/Tab.ts +0 -156
  78. package/src/UserMenuItem.ts +0 -145
  79. package/src/actions/Action.test.ts +0 -2526
  80. package/src/actions/Action.ts +0 -1515
  81. package/src/actions/ActionGroup.test.ts +0 -112
  82. package/src/actions/ActionGroup.ts +0 -173
  83. package/src/actions/attachFactory.ts +0 -172
  84. package/src/actions/bulkFactories.ts +0 -168
  85. package/src/actions/crudFactories.ts +0 -220
  86. package/src/actions/exportFactory.ts +0 -225
  87. package/src/actions/factoryHelpers.ts +0 -177
  88. package/src/actions/importFactory.ts +0 -243
  89. package/src/actions/index.ts +0 -17
  90. package/src/actions/m2mFactories.ts +0 -193
  91. package/src/actions/relationFactories.ts +0 -372
  92. package/src/applyPageHooks.test.ts +0 -463
  93. package/src/applyPageHooks.ts +0 -330
  94. package/src/authorization.test.ts +0 -483
  95. package/src/breadcrumbs.test.ts +0 -238
  96. package/src/cells/coerce.test.ts +0 -85
  97. package/src/cells/coerce.ts +0 -84
  98. package/src/clusterPaths.ts +0 -35
  99. package/src/columns/BadgeColumn.test.ts +0 -54
  100. package/src/columns/BadgeColumn.ts +0 -32
  101. package/src/columns/BooleanColumn.test.ts +0 -41
  102. package/src/columns/BooleanColumn.ts +0 -18
  103. package/src/columns/ColorColumn.test.ts +0 -37
  104. package/src/columns/ColorColumn.ts +0 -38
  105. package/src/columns/IconColumn.test.ts +0 -54
  106. package/src/columns/IconColumn.ts +0 -37
  107. package/src/columns/ImageColumn.test.ts +0 -41
  108. package/src/columns/ImageColumn.ts +0 -28
  109. package/src/columns/SelectColumn.ts +0 -98
  110. package/src/columns/TextColumn.test.ts +0 -190
  111. package/src/columns/TextColumn.ts +0 -20
  112. package/src/columns/TextInputColumn.ts +0 -68
  113. package/src/columns/ToggleColumn.ts +0 -46
  114. package/src/columns/editableColumns.test.ts +0 -238
  115. package/src/columns/index.ts +0 -9
  116. package/src/defaultGlobalPages.ts +0 -95
  117. package/src/defaultPages.test.ts +0 -634
  118. package/src/defaultPages.ts +0 -617
  119. package/src/defaultViewPage.test.ts +0 -147
  120. package/src/elements/Form.test.ts +0 -223
  121. package/src/elements/Form.ts +0 -416
  122. package/src/elements/ListTabs.ts +0 -28
  123. package/src/elements/Table.test.ts +0 -422
  124. package/src/elements/Table.ts +0 -850
  125. package/src/elements/TableGroup.test.ts +0 -260
  126. package/src/elements/TableGroup.ts +0 -334
  127. package/src/elements/dispatchAction.test.ts +0 -463
  128. package/src/elements/dispatchAction.ts +0 -355
  129. package/src/elements/dispatchForm.test.ts +0 -477
  130. package/src/elements/dispatchForm.ts +0 -1993
  131. package/src/elements/dispatchTable.test.ts +0 -1514
  132. package/src/elements/dispatchTable.ts +0 -745
  133. package/src/elements/index.ts +0 -21
  134. package/src/entries/BadgeEntry.ts +0 -39
  135. package/src/entries/CodeEntry.test.ts +0 -40
  136. package/src/entries/CodeEntry.ts +0 -52
  137. package/src/entries/ColorEntry.ts +0 -63
  138. package/src/entries/ComponentEntry.test.ts +0 -173
  139. package/src/entries/ComponentEntry.ts +0 -95
  140. package/src/entries/Entry.ts +0 -304
  141. package/src/entries/IconEntry.ts +0 -49
  142. package/src/entries/ImageEntry.ts +0 -61
  143. package/src/entries/KeyValueEntry.ts +0 -47
  144. package/src/entries/RepeatableEntry.test.ts +0 -239
  145. package/src/entries/RepeatableEntry.ts +0 -173
  146. package/src/entries/TextEntry.test.ts +0 -394
  147. package/src/entries/TextEntry.ts +0 -60
  148. package/src/entries/index.ts +0 -12
  149. package/src/entries/leaves.test.ts +0 -306
  150. package/src/entries/registry.ts +0 -54
  151. package/src/fields/BuilderField.test.ts +0 -1188
  152. package/src/fields/BuilderField.ts +0 -605
  153. package/src/fields/BuilderRelationship.test.ts +0 -811
  154. package/src/fields/CheckboxField.test.ts +0 -44
  155. package/src/fields/CheckboxField.ts +0 -27
  156. package/src/fields/CheckboxListField.test.ts +0 -99
  157. package/src/fields/CheckboxListField.ts +0 -66
  158. package/src/fields/ColorPickerField.test.ts +0 -33
  159. package/src/fields/ColorPickerField.ts +0 -25
  160. package/src/fields/DateField.ts +0 -54
  161. package/src/fields/DateTimeField.test.ts +0 -55
  162. package/src/fields/EmailField.ts +0 -16
  163. package/src/fields/Field.test.ts +0 -654
  164. package/src/fields/Field.ts +0 -817
  165. package/src/fields/FileUploadField.test.ts +0 -143
  166. package/src/fields/FileUploadField.ts +0 -159
  167. package/src/fields/HiddenField.test.ts +0 -27
  168. package/src/fields/HiddenField.ts +0 -28
  169. package/src/fields/KeyValueField.test.ts +0 -105
  170. package/src/fields/KeyValueField.ts +0 -55
  171. package/src/fields/MarkdownField.test.ts +0 -167
  172. package/src/fields/MarkdownField.ts +0 -162
  173. package/src/fields/NumberField.ts +0 -33
  174. package/src/fields/RadioField.test.ts +0 -94
  175. package/src/fields/RadioField.ts +0 -67
  176. package/src/fields/RepeaterField.test.ts +0 -1806
  177. package/src/fields/RepeaterField.ts +0 -939
  178. package/src/fields/RepeaterRelationship.test.ts +0 -1923
  179. package/src/fields/RepeaterSimple.test.ts +0 -248
  180. package/src/fields/RowButton.test.ts +0 -219
  181. package/src/fields/RowButton.ts +0 -135
  182. package/src/fields/SelectField.test.ts +0 -192
  183. package/src/fields/SelectField.ts +0 -235
  184. package/src/fields/SliderField.test.ts +0 -50
  185. package/src/fields/SliderField.ts +0 -53
  186. package/src/fields/SlugField.ts +0 -24
  187. package/src/fields/TagsInputField.test.ts +0 -154
  188. package/src/fields/TagsInputField.ts +0 -133
  189. package/src/fields/TextField.test.ts +0 -213
  190. package/src/fields/TextField.ts +0 -177
  191. package/src/fields/TextareaField.test.ts +0 -58
  192. package/src/fields/TextareaField.ts +0 -59
  193. package/src/fields/ToggleButtonsField.test.ts +0 -106
  194. package/src/fields/ToggleButtonsField.ts +0 -59
  195. package/src/fields/ToggleField.ts +0 -16
  196. package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
  197. package/src/fields/optionsResolver.ts +0 -95
  198. package/src/fields/resolveField.ts +0 -28
  199. package/src/filters/BooleanFilter.ts +0 -35
  200. package/src/filters/DateRangeFilter.test.ts +0 -194
  201. package/src/filters/DateRangeFilter.ts +0 -148
  202. package/src/filters/Filter.test.ts +0 -268
  203. package/src/filters/Filter.ts +0 -184
  204. package/src/filters/FormFilter.test.ts +0 -238
  205. package/src/filters/FormFilter.ts +0 -215
  206. package/src/filters/MultiSelectFilter.test.ts +0 -119
  207. package/src/filters/MultiSelectFilter.ts +0 -78
  208. package/src/filters/QueryBuilderFilter.test.ts +0 -662
  209. package/src/filters/QueryBuilderFilter.ts +0 -398
  210. package/src/filters/SelectFilter.ts +0 -46
  211. package/src/filters/TernaryFilter.test.ts +0 -160
  212. package/src/filters/TernaryFilter.ts +0 -72
  213. package/src/filters/TrashedFilter.test.ts +0 -149
  214. package/src/filters/TrashedFilter.ts +0 -55
  215. package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
  216. package/src/filters/queryBuilder/Constraint.ts +0 -115
  217. package/src/filters/queryBuilder/DateConstraint.ts +0 -69
  218. package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
  219. package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
  220. package/src/filters/queryBuilder/TextConstraint.ts +0 -64
  221. package/src/filters/queryBuilder/index.ts +0 -12
  222. package/src/icons/index.ts +0 -2
  223. package/src/icons/lucide.ts +0 -204
  224. package/src/icons/registry.test.ts +0 -56
  225. package/src/icons/registry.ts +0 -41
  226. package/src/icons/types.ts +0 -47
  227. package/src/index.ts +0 -525
  228. package/src/io/csv.test.ts +0 -142
  229. package/src/io/csv.ts +0 -170
  230. package/src/nestedRelationManagerData.test.ts +0 -547
  231. package/src/notifications/Notification.test.ts +0 -210
  232. package/src/notifications/Notification.ts +0 -354
  233. package/src/notifications/broadcast.test.ts +0 -110
  234. package/src/notifications/broadcast.ts +0 -95
  235. package/src/notifications/database.test.ts +0 -383
  236. package/src/notifications/database.ts +0 -398
  237. package/src/notifications/databaseNotifications.test.ts +0 -187
  238. package/src/notifications/dispatchNotificationAction.test.ts +0 -341
  239. package/src/notifications/dispatchNotificationAction.ts +0 -142
  240. package/src/notifications/flash.test.ts +0 -89
  241. package/src/notifications/flash.ts +0 -71
  242. package/src/notifications/index.ts +0 -45
  243. package/src/notifications/registerBroadcastAuth.test.ts +0 -134
  244. package/src/notifications/registerBroadcastAuth.ts +0 -100
  245. package/src/notifications/resolveSavedNotification.test.ts +0 -82
  246. package/src/notifications/resolveSavedNotification.ts +0 -59
  247. package/src/notifications/types.ts +0 -93
  248. package/src/orm/m2mAccessor.ts +0 -66
  249. package/src/orm/modelDefaults.test.ts +0 -633
  250. package/src/orm/modelDefaults.ts +0 -666
  251. package/src/pageData/breadcrumbs.ts +0 -288
  252. package/src/pageData/forms.ts +0 -578
  253. package/src/pageData/helpers.ts +0 -857
  254. package/src/pageData/misc.ts +0 -347
  255. package/src/pageData/navigation.ts +0 -842
  256. package/src/pageData/relationPages.ts +0 -1248
  257. package/src/pageData/relationTabs.ts +0 -286
  258. package/src/pageData/resourcePages.ts +0 -609
  259. package/src/pageData.test.ts +0 -1545
  260. package/src/pageData.ts +0 -341
  261. package/src/plugins/index.ts +0 -8
  262. package/src/plugins/themeEditor.test.ts +0 -36
  263. package/src/plugins/themeEditor.ts +0 -45
  264. package/src/react/AppShell.tsx +0 -251
  265. package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
  266. package/src/react/CollabRoomContext.ts +0 -98
  267. package/src/react/CollabTextRendererRegistry.ts +0 -102
  268. package/src/react/CommandPalette.tsx +0 -375
  269. package/src/react/CurrentUserContext.tsx +0 -50
  270. package/src/react/CustomPageWrapperGate.tsx +0 -69
  271. package/src/react/CustomPageWrapperRegistry.ts +0 -45
  272. package/src/react/FieldFocusReporterRegistry.ts +0 -37
  273. package/src/react/FieldLabelSlotRegistry.ts +0 -30
  274. package/src/react/FieldPresenceRegistry.ts +0 -46
  275. package/src/react/FormCollabBindingRegistry.ts +0 -242
  276. package/src/react/FormStateContext.tsx +0 -591
  277. package/src/react/HeadHooks.tsx +0 -126
  278. package/src/react/MarkdownEditorRegistry.test.ts +0 -38
  279. package/src/react/MarkdownEditorRegistry.ts +0 -107
  280. package/src/react/NotificationActionStrip.tsx +0 -263
  281. package/src/react/NotificationBell.tsx +0 -426
  282. package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
  283. package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
  284. package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
  285. package/src/react/PendingSuggestionsContext.tsx +0 -172
  286. package/src/react/RecordWrapperGate.tsx +0 -58
  287. package/src/react/RecordWrapperRegistry.ts +0 -39
  288. package/src/react/RenderHookSlot.tsx +0 -32
  289. package/src/react/RightSidebar.tsx +0 -257
  290. package/src/react/RightSidebarContext.tsx +0 -234
  291. package/src/react/RightSidebarTrigger.tsx +0 -53
  292. package/src/react/RowCoordsContext.tsx +0 -23
  293. package/src/react/SchemaRenderer.tsx +0 -549
  294. package/src/react/SearchTrigger.tsx +0 -46
  295. package/src/react/ThemeProvider.tsx +0 -93
  296. package/src/react/ThemeSettingsPage.tsx +0 -579
  297. package/src/react/ThemeToggle.tsx +0 -20
  298. package/src/react/Toaster.tsx +0 -158
  299. package/src/react/UserMenu.tsx +0 -196
  300. package/src/react/WidgetDataContext.tsx +0 -157
  301. package/src/react/cells/EditableCell.tsx +0 -389
  302. package/src/react/component-slots.test.ts +0 -103
  303. package/src/react/component-slots.ts +0 -116
  304. package/src/react/fieldJsHandler.test.ts +0 -166
  305. package/src/react/fieldJsHandler.ts +0 -79
  306. package/src/react/fields/BuilderInput.tsx +0 -1078
  307. package/src/react/fields/CheckboxInput.tsx +0 -39
  308. package/src/react/fields/CheckboxListInput.tsx +0 -102
  309. package/src/react/fields/ColorInput.tsx +0 -71
  310. package/src/react/fields/DateFieldInput.tsx +0 -70
  311. package/src/react/fields/DateTimeInput.tsx +0 -62
  312. package/src/react/fields/FieldShell.tsx +0 -348
  313. package/src/react/fields/FileUploadInput.tsx +0 -639
  314. package/src/react/fields/HiddenInput.tsx +0 -17
  315. package/src/react/fields/KeyValueInput.tsx +0 -230
  316. package/src/react/fields/MarkdownInput.tsx +0 -560
  317. package/src/react/fields/RadioInput.tsx +0 -81
  318. package/src/react/fields/RepeaterInput.test.ts +0 -116
  319. package/src/react/fields/RepeaterInput.tsx +0 -1420
  320. package/src/react/fields/SelectFieldInput.tsx +0 -280
  321. package/src/react/fields/SliderInput.tsx +0 -81
  322. package/src/react/fields/TagsInput.tsx +0 -283
  323. package/src/react/fields/TextLikeInput.tsx +0 -256
  324. package/src/react/fields/ToggleButtonsInput.tsx +0 -60
  325. package/src/react/fields/ToggleFieldInput.tsx +0 -56
  326. package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
  327. package/src/react/fields/relationshipRenameDispatch.ts +0 -97
  328. package/src/react/fields/repeaterReconcile.test.ts +0 -114
  329. package/src/react/fields/repeaterReconcile.ts +0 -104
  330. package/src/react/fields/rowChromeButton.tsx +0 -336
  331. package/src/react/fields/rowState.ts +0 -106
  332. package/src/react/fields/syncRowGates.test.ts +0 -202
  333. package/src/react/fields/syncRowGates.ts +0 -66
  334. package/src/react/fields/textInputControls.tsx +0 -238
  335. package/src/react/fields/useRowReorderDnd.ts +0 -78
  336. package/src/react/formStateHelpers.test.ts +0 -508
  337. package/src/react/formStateHelpers.ts +0 -381
  338. package/src/react/hooks/use-mobile.ts +0 -19
  339. package/src/react/icon-context.tsx +0 -60
  340. package/src/react/index.ts +0 -194
  341. package/src/react/layouts/SidebarLayout.tsx +0 -250
  342. package/src/react/layouts/TopbarLayout.tsx +0 -258
  343. package/src/react/navigate.tsx +0 -37
  344. package/src/react/onProviderSynced.test.ts +0 -90
  345. package/src/react/parseRecordEditUrl.test.ts +0 -122
  346. package/src/react/parseRecordEditUrl.ts +0 -94
  347. package/src/react/persistedState.ts +0 -40
  348. package/src/react/registry.ts +0 -48
  349. package/src/react/right-panel-registry.tsx +0 -47
  350. package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
  351. package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
  352. package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
  353. package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
  354. package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
  355. package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
  356. package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
  357. package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
  358. package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
  359. package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
  360. package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
  361. package/src/react/schemaRenderer/action/buttons.tsx +0 -99
  362. package/src/react/schemaRenderer/action/helpers.ts +0 -140
  363. package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
  364. package/src/react/schemaRenderer/columnFormat.ts +0 -65
  365. package/src/react/schemaRenderer/constants.ts +0 -50
  366. package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
  367. package/src/react/schemaRenderer/form/renderField.tsx +0 -511
  368. package/src/react/schemaRenderer/helpers.tsx +0 -81
  369. package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
  370. package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
  371. package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
  372. package/src/react/schemaRenderer/table/filters.tsx +0 -1233
  373. package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
  374. package/src/react/schemaRenderer/table/links.tsx +0 -112
  375. package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
  376. package/src/react/schemaRenderer/table/url.tsx +0 -143
  377. package/src/react/theme-preview/apply.ts +0 -99
  378. package/src/react/theme-preview/build-html.ts +0 -436
  379. package/src/react/ui/button.tsx +0 -51
  380. package/src/react/ui/calendar.tsx +0 -67
  381. package/src/react/ui/checkbox.tsx +0 -29
  382. package/src/react/ui/dialog.tsx +0 -108
  383. package/src/react/ui/dropdown-menu.tsx +0 -97
  384. package/src/react/ui/input.tsx +0 -20
  385. package/src/react/ui/label.tsx +0 -21
  386. package/src/react/ui/popover.tsx +0 -50
  387. package/src/react/ui/select.tsx +0 -169
  388. package/src/react/ui/separator.tsx +0 -25
  389. package/src/react/ui/sheet.tsx +0 -136
  390. package/src/react/ui/sidebar.tsx +0 -723
  391. package/src/react/ui/skeleton.tsx +0 -13
  392. package/src/react/ui/slider.tsx +0 -34
  393. package/src/react/ui/switch.tsx +0 -28
  394. package/src/react/ui/table.tsx +0 -105
  395. package/src/react/ui/tabs.tsx +0 -63
  396. package/src/react/ui/textarea.tsx +0 -18
  397. package/src/react/ui/tooltip.tsx +0 -64
  398. package/src/react/useResizableWidth.ts +0 -139
  399. package/src/react/utils.ts +0 -6
  400. package/src/react/widgetRegistry.test.ts +0 -43
  401. package/src/react/widgetRegistry.ts +0 -50
  402. package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
  403. package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
  404. package/src/react/widgets/ViewRenderer.tsx +0 -71
  405. package/src/relationManagerData.test.ts +0 -1595
  406. package/src/richtext/index.ts +0 -8
  407. package/src/richtext/registry.ts +0 -89
  408. package/src/routes/globals.ts +0 -148
  409. package/src/routes/guard.test.ts +0 -325
  410. package/src/routes/helpers.ts +0 -704
  411. package/src/routes/pages.ts +0 -175
  412. package/src/routes/panel.ts +0 -204
  413. package/src/routes/relations.ts +0 -1243
  414. package/src/routes/resources.ts +0 -781
  415. package/src/routes/theme.ts +0 -91
  416. package/src/routes-nested-relations.test.ts +0 -676
  417. package/src/routes-relations.test.ts +0 -972
  418. package/src/routes.test.ts +0 -2027
  419. package/src/routes.ts +0 -303
  420. package/src/schema/Alert.test.ts +0 -109
  421. package/src/schema/Alert.ts +0 -131
  422. package/src/schema/Block.ts +0 -169
  423. package/src/schema/Breadcrumbs.ts +0 -40
  424. package/src/schema/Card.ts +0 -35
  425. package/src/schema/Divider.ts +0 -20
  426. package/src/schema/Element.ts +0 -219
  427. package/src/schema/EmptyState.test.ts +0 -37
  428. package/src/schema/EmptyState.ts +0 -63
  429. package/src/schema/Fieldset.ts +0 -43
  430. package/src/schema/Grid.ts +0 -43
  431. package/src/schema/Group.ts +0 -30
  432. package/src/schema/Heading.ts +0 -39
  433. package/src/schema/Html.ts +0 -67
  434. package/src/schema/Icon.ts +0 -54
  435. package/src/schema/Image.ts +0 -57
  436. package/src/schema/LinkTag.ts +0 -41
  437. package/src/schema/Markdown.ts +0 -85
  438. package/src/schema/MetaTag.ts +0 -41
  439. package/src/schema/RelationTabs.ts +0 -71
  440. package/src/schema/ScriptTag.ts +0 -55
  441. package/src/schema/Section.ts +0 -160
  442. package/src/schema/ServerDataElement.test.ts +0 -140
  443. package/src/schema/ServerDataElement.ts +0 -156
  444. package/src/schema/SlotComponent.test.ts +0 -77
  445. package/src/schema/SlotComponent.ts +0 -71
  446. package/src/schema/Split.ts +0 -50
  447. package/src/schema/Stat.test.ts +0 -118
  448. package/src/schema/Stat.ts +0 -154
  449. package/src/schema/StatsOverview.test.ts +0 -141
  450. package/src/schema/StatsOverview.ts +0 -119
  451. package/src/schema/StyleTag.ts +0 -35
  452. package/src/schema/TableWidget.test.ts +0 -297
  453. package/src/schema/TableWidget.ts +0 -289
  454. package/src/schema/Tabs.ts +0 -79
  455. package/src/schema/Text.ts +0 -58
  456. package/src/schema/UnorderedList.ts +0 -49
  457. package/src/schema/View.test.ts +0 -111
  458. package/src/schema/View.ts +0 -127
  459. package/src/schema/Wizard.ts +0 -220
  460. package/src/schema/containers.test.ts +0 -564
  461. package/src/schema/headTags.test.ts +0 -134
  462. package/src/schema/index.ts +0 -40
  463. package/src/schema/primes.test.ts +0 -269
  464. package/src/schema/resolveSchema.test.ts +0 -379
  465. package/src/schema/resolveSchema.ts +0 -917
  466. package/src/schema/sanitize.ts +0 -58
  467. package/src/search.test.ts +0 -446
  468. package/src/search.ts +0 -178
  469. package/src/sessionFilters.test.ts +0 -375
  470. package/src/sessionFilters.ts +0 -143
  471. package/src/slot-components/index.ts +0 -10
  472. package/src/slot-components/registry.ts +0 -56
  473. package/src/styles/file-upload.css +0 -13
  474. package/src/summarizers/Summarizer.test.ts +0 -84
  475. package/src/summarizers/Summarizer.ts +0 -123
  476. package/src/summarizers/index.ts +0 -11
  477. package/src/theme/base-colors.ts +0 -68
  478. package/src/theme/chart-colors.ts +0 -50
  479. package/src/theme/colors.ts +0 -447
  480. package/src/theme/generate-css.test.ts +0 -139
  481. package/src/theme/generate-css.ts +0 -44
  482. package/src/theme/generate-scale.test.ts +0 -106
  483. package/src/theme/generate-scale.ts +0 -97
  484. package/src/theme/icon-map.ts +0 -42
  485. package/src/theme/index.ts +0 -34
  486. package/src/theme/migrate.test.ts +0 -178
  487. package/src/theme/migrate.ts +0 -81
  488. package/src/theme/presets.ts +0 -135
  489. package/src/theme/radius.ts +0 -18
  490. package/src/theme/resolve.test.ts +0 -238
  491. package/src/theme/resolve.ts +0 -96
  492. package/src/theme/spacing.ts +0 -18
  493. package/src/theme/storage.test.ts +0 -126
  494. package/src/theme/storage.ts +0 -106
  495. package/src/theme/theme-colors.ts +0 -88
  496. package/src/theme/types.ts +0 -125
  497. package/src/uploads/UploadAdapter.ts +0 -35
  498. package/src/uploads/index.ts +0 -2
  499. package/src/uploads/localUpload.test.ts +0 -70
  500. package/src/uploads/localUpload.ts +0 -84
  501. package/src/validation/Validator.ts +0 -49
  502. package/src/validation/index.ts +0 -28
  503. package/src/validation/rules.ts +0 -78
  504. package/src/validation/runValidators.ts +0 -435
  505. package/src/validation/uniqueValidator.test.ts +0 -196
  506. package/src/validation/uniqueValidator.ts +0 -133
  507. package/src/validation/validators.test.ts +0 -268
  508. package/src/vite.test.ts +0 -184
  509. package/src/vite.ts +0 -787
  510. package/src/widgets/index.ts +0 -10
  511. package/src/widgets/registry.ts +0 -45
  512. package/src/widgets.test.ts +0 -592
  513. package/tsconfig.build.json +0 -11
  514. package/tsconfig.json +0 -4
  515. package/tsconfig.test.json +0 -10
  516. package/views/react/Dashboard.tsx +0 -27
  517. package/views/react/Resources/Form.tsx +0 -102
  518. package/views/react/Resources/Index.tsx +0 -49
@@ -1,69 +0,0 @@
1
- import { type ReactNode } from 'react'
2
- import { getCustomPageWrapper } from './CustomPageWrapperRegistry.js'
3
- import type { PageCollabConfig } from '../Page.js'
4
-
5
- /** Per-custom-page collab opt-in keyed by URL slug (`P.getSlug()` for
6
- * non-clustered, `${cluster.slug}/${P.getSlug()}` for clustered). Built
7
- * server-side by `panelInfo()` as `pageCollab`. */
8
- export type PageCollabMap = Record<string, PageCollabConfig>
9
-
10
- export interface CustomPageWrapperGateProps {
11
- currentPath?: string
12
- basePath: string
13
- /** Per-page opt-in map. Absent means no custom page opted in — gate
14
- * always passes through. */
15
- pageCollab?: PageCollabMap
16
- children: ReactNode
17
- }
18
-
19
- /**
20
- * Strip `basePath` from `currentPath` and return the remaining slash-
21
- * joined tail. Returns `null` when the path is empty / doesn't start
22
- * with `basePath` / has no tail. Mirrors `parseRecordPageUrl`'s
23
- * normalization (trailing slash on either side is tolerated).
24
- */
25
- function pageSlugFromUrl(currentPath: string, basePath: string): string | null {
26
- if (!currentPath) return null
27
- const trimmedPath = currentPath.replace(/\/+$/, '')
28
- const trimmedBase = basePath.replace(/\/+$/, '')
29
-
30
- if (trimmedBase !== '' && !trimmedPath.startsWith(trimmedBase)) return null
31
-
32
- const tail = trimmedPath.slice(trimmedBase.length).replace(/^\/+/, '')
33
- if (tail.length === 0) return null
34
- return tail
35
- }
36
-
37
- /**
38
- * Conditionally wraps the page tree with the plugin-registered
39
- * `CustomPageWrapper` when the current URL resolves to a custom page
40
- * (a `Page` subclass with `static collab = { room: '…' }`).
41
- * Pass-through in every other case:
42
- *
43
- * - no plugin registered a wrapper (`getCustomPageWrapper() === null`)
44
- * - `currentPath` not yet known on the very first SSR render
45
- * - `pageCollab` map absent (no page opted in)
46
- * - the URL tail doesn't match any registered page slug (resource
47
- * list/edit/view pages, dashboard, theme editor, etc.)
48
- *
49
- * Mounted inside `AppShell` around the page content area, beside
50
- * `RecordWrapperGate`. The two gates are mutually exclusive in
51
- * practice — record routes have 3+ segments ending in /edit or /view,
52
- * custom-page routes are 1-2 segments matching a registered page slug.
53
- */
54
- export function CustomPageWrapperGate({ currentPath, basePath, pageCollab, children }: CustomPageWrapperGateProps) {
55
- const Wrapper = getCustomPageWrapper()
56
- if (!Wrapper || !currentPath || !pageCollab) return <>{children}</>
57
-
58
- const slug = pageSlugFromUrl(currentPath, basePath)
59
- if (!slug) return <>{children}</>
60
-
61
- const cfg = pageCollab[slug]
62
- if (!cfg) return <>{children}</>
63
-
64
- return (
65
- <Wrapper pageSlug={slug} room={cfg.room} presence={cfg.presence}>
66
- {children}
67
- </Wrapper>
68
- )
69
- }
@@ -1,45 +0,0 @@
1
- import type { ComponentType, ReactNode } from 'react'
2
-
3
- /**
4
- * Props the custom-page wrapper receives from `CustomPageWrapperGate`
5
- * when the current URL resolves to an opted-in custom page (a `Page`
6
- * subclass with `static collab = { room: '…' }`).
7
- *
8
- * The wrapper owns whatever page-scoped context the plugin provides —
9
- * `@pilotiq-pro/collab` mounts a collab room here so every collab
10
- * field inside the page tree shares one Y.Doc + WS connection. Other
11
- * plugins could mount per-page presence, audit logging, etc.
12
- *
13
- * `pageSlug` is the gate's URL slug (cluster-prefixed for clustered
14
- * pages). `room` is the literal `room` value the page declared on
15
- * `static collab` — opaque to pilotiq; the plugin is free to namespace
16
- * it internally before opening the WS.
17
- */
18
- export interface CustomPageWrapperProps {
19
- pageSlug: string
20
- room: string
21
- presence: boolean
22
- children: ReactNode
23
- }
24
-
25
- let _component: ComponentType<CustomPageWrapperProps> | null = null
26
-
27
- /**
28
- * Register a component that wraps the page tree on every opted-in
29
- * custom-page route. Called once at boot by a plugin (e.g.
30
- * `@pilotiq-pro/collab`). No-op when no plugin registers —
31
- * `CustomPageWrapperGate` passes through unchanged.
32
- */
33
- export function registerCustomPageWrapper(C: ComponentType<CustomPageWrapperProps>): void {
34
- _component = C
35
- }
36
-
37
- /** Returns the registered wrapper component, or `null`. */
38
- export function getCustomPageWrapper(): ComponentType<CustomPageWrapperProps> | null {
39
- return _component
40
- }
41
-
42
- /** Test-only — drops any registered wrapper so tests stay isolated. */
43
- export function _resetCustomPageWrapper(): void {
44
- _component = null
45
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * Module-level slot for focus / blur callbacks dispatched by pilotiq's
3
- * `FieldShell`. A collab plugin (e.g. `@pilotiq-pro/collab`) registers
4
- * a reporter at boot; on every controlled-field focus / blur event,
5
- * `FieldShell` calls the matching method with `{ fieldName, formId }`
6
- * so the plugin can mirror the local user's focus state into Yjs
7
- * awareness.
8
- *
9
- * `FieldShell` skips dispatching for fields opted out via
10
- * `Field.collab(false)` AND for dotted-path names (Repeater rows stay
11
- * out of F4 presence in v1) — so the reporter never sees those events.
12
- */
13
- export interface FieldFocusEvent {
14
- fieldName: string
15
- formId: string
16
- }
17
-
18
- export interface FieldFocusReporter {
19
- onFocus(event: FieldFocusEvent): void
20
- onBlur(event: FieldFocusEvent): void
21
- }
22
-
23
- let _reporter: FieldFocusReporter | null = null
24
-
25
- /**
26
- * Register the reporter. Called once at boot by the collab plugin.
27
- * No-op when no plugin registers — `FieldShell` doesn't wire focus
28
- * listeners.
29
- */
30
- export function registerFieldFocusReporter(reporter: FieldFocusReporter): void {
31
- _reporter = reporter
32
- }
33
-
34
- /** Returns the registered reporter, or `null`. */
35
- export function getFieldFocusReporter(): FieldFocusReporter | null {
36
- return _reporter
37
- }
@@ -1,30 +0,0 @@
1
- import type { ComponentType } from 'react'
2
-
3
- /**
4
- * Props the field label slot component receives from `SchemaRenderer`.
5
- * For AI actions this carries the field name, action list, and the
6
- * pre-composed agent-run base URL stamped by `tagFieldAiUrls`.
7
- */
8
- export interface FieldLabelSlotProps {
9
- fieldName: string
10
- actions: Array<{ slug: string; label: string; icon?: string }>
11
- agentRunBase: string
12
- }
13
-
14
- let _component: ComponentType<FieldLabelSlotProps> | null = null
15
-
16
- /**
17
- * Register a component to render inline next to every field label that
18
- * has `aiActions` stamped on its meta. Called once at boot by a plugin's
19
- * `register(panel)` step (e.g. `@pilotiq-pro/ai`). No-op when no plugin
20
- * registers — `getFieldLabelSlot()` returns `null` and `SchemaRenderer`
21
- * skips the slot.
22
- */
23
- export function registerFieldLabelSlot(C: ComponentType<FieldLabelSlotProps>): void {
24
- _component = C
25
- }
26
-
27
- /** Returns the registered field label slot component, or `null`. */
28
- export function getFieldLabelSlot(): ComponentType<FieldLabelSlotProps> | null {
29
- return _component
30
- }
@@ -1,46 +0,0 @@
1
- import type { ComponentType } from 'react'
2
-
3
- /**
4
- * Props the per-field presence chip receives from `FieldShell` when a
5
- * `@pilotiq-pro/collab`-style plugin has registered a component.
6
- *
7
- * The chip subscribes to the active collab room's awareness state and
8
- * renders colored avatars / dots for every remote user currently
9
- * focused on this field. Pilotiq core renders it alongside the field's
10
- * label; the component owns the awareness lookup so pilotiq stays
11
- * Yjs-free.
12
- *
13
- * Mounted only when:
14
- *
15
- * - A collab plugin has registered a component via
16
- * `registerFieldPresenceComponent(...)`,
17
- * - The field hasn't opted out via `Field.collab(false)`, and
18
- * - The field has a stable `name` (dotted-path Repeater rows skip
19
- * presence in v1 — Phase F.5 work).
20
- */
21
- export interface FieldPresenceProps {
22
- /** Top-level field name. Dotted-path names are skipped by `FieldShell`. */
23
- fieldName: string
24
- /**
25
- * Stable form identifier — same value the form's `FormStateProvider`
26
- * uses. Lets the chip scope presence by form when multiple forms
27
- * render on the same record (action modals, etc.).
28
- */
29
- formId: string
30
- }
31
-
32
- let _component: ComponentType<FieldPresenceProps> | null = null
33
-
34
- /**
35
- * Register a component that renders inside `FieldShell`'s label area
36
- * for every controlled field. Called once at boot by a collab plugin.
37
- * No-op when no plugin registers — `FieldShell` skips the slot.
38
- */
39
- export function registerFieldPresenceComponent(C: ComponentType<FieldPresenceProps>): void {
40
- _component = C
41
- }
42
-
43
- /** Returns the registered presence component, or `null`. */
44
- export function getFieldPresenceComponent(): ComponentType<FieldPresenceProps> | null {
45
- return _component
46
- }
@@ -1,242 +0,0 @@
1
- import type { ElementMeta } from '../schema/Element.js'
2
- import type { CollabRoom } from './CollabRoomContext.js'
3
-
4
- /**
5
- * Binding contract that a collab plugin returns from
6
- * `registerFormCollabBinding` — wraps a single form's value map in a
7
- * shared CRDT type (typically a `Y.Map` on the surrounding record's
8
- * `Y.Doc`) so every field on the form syncs across clients.
9
- *
10
- * Pilotiq's `FormStateProvider` calls into this contract when a
11
- * `<RecordCollabRoom>` is mounted up-tree:
12
- *
13
- * - `get()` is read once on mount to overlay any already-synced
14
- * state on top of the form's SSR-rendered defaults.
15
- * - `set(name, v)` is called from `setValue` after the local React
16
- * state update — every controlled field's edit lands in the CRDT.
17
- * - `subscribe(fn)` registers a listener that fires when REMOTE
18
- * changes land; `fn(snapshot)` receives the full updated map.
19
- * The provider re-applies this snapshot onto its React state.
20
- * - `destroy()` is called on unmount — gives the plugin a chance to
21
- * remove its CRDT observer.
22
- *
23
- * Text-field character-level CRDT lives in `@pilotiq/tiptap`'s
24
- * `CollabTextRenderer` (`Y.XmlFragment` per field, keyed by bare name
25
- * for top-level + `${arrayName}.${rowId}.${fieldName}` composite for
26
- * row leaves) — pilotiq core no longer mediates per-field text CRDT,
27
- * so this binding only handles non-text values + row lifecycle.
28
- *
29
- * `unknown` payloads keep pilotiq core Yjs-free; the binding owns its
30
- * own type knowledge. Same posture as `CollabExtensionFactory`.
31
- */
32
- export interface FormCollabBinding {
33
- /** Snapshot of the current synced values. Called once on mount. */
34
- get(): Record<string, unknown>
35
- /** Write the local edit to the CRDT. Triggers a broadcast to peers. */
36
- set(name: string, value: unknown): void
37
- /** Subscribe to remote changes. Returns an unsubscribe function. */
38
- subscribe(fn: (snapshot: Record<string, unknown>) => void): () => void
39
- /** Cleanup hook called when the form unmounts. */
40
- destroy(): void
41
-
42
- // ── Phase F.5 — Repeater / Builder row-identity surface (all optional) ──
43
-
44
- /**
45
- * Add a row to a Repeater or Builder field. `rowId` is the stable
46
- * `__id` the renderer already mints (UUID for new rows / DB PK for
47
- * relationship-backed rows) — the binding indexes the row's CRDT
48
- * surface by this id so concurrent inserts from peers both survive.
49
- *
50
- * Idempotent — calling with a `rowId` that already exists in the
51
- * Repeater's array is a no-op. `initial` may carry pre-filled values
52
- * for the new row (e.g. the inner fields' `default()` from schema
53
- * resolution); the binding seeds them onto the row's storage under
54
- * the same idempotent posture as top-level `set` (first writer wins
55
- * across concurrent first-mounters).
56
- *
57
- * Renderer call sites: `RepeaterInput.addRow()` + `BuilderInput.addBlock()`.
58
- * When absent, F.5 row-level CRDT degrades to v1 behaviour (whole-array
59
- * LWW under the top-level Y.Map).
60
- */
61
- addRow?(arrayName: string, rowId: string, initial: Record<string, unknown>): void
62
-
63
- /**
64
- * Remove a row from a Repeater/Builder field by stable id. Idempotent
65
- * — a missing `rowId` is a no-op. Triggered by the renderer's row
66
- * delete button.
67
- */
68
- removeRow?(arrayName: string, rowId: string): void
69
-
70
- /**
71
- * Apply a new row order. `newOrder` is the full list of row ids in
72
- * their final positions; the binding computes the minimal CRDT move
73
- * sequence and applies it inside a single transaction (peers see one
74
- * coalesced update, not N intermediate states).
75
- *
76
- * Called by drag-and-drop / up-down move handlers in
77
- * `RepeaterInput` + `BuilderInput`.
78
- */
79
- reorderRows?(arrayName: string, newOrder: string[]): void
80
-
81
- /**
82
- * Write a single field on a row. Replaces the dotted-path `set` for
83
- * row leaves (`tags.0.label` → `setRow('tags', rowId, 'label', value)`).
84
- * Non-text row fields land on the row's scalar field-map under LWW;
85
- * text row fields don't flow through here — the Tiptap renderer
86
- * writes them directly to a `Y.XmlFragment` at the doc root keyed by
87
- * `${arrayName}.${rowId}.${fieldName}`.
88
- *
89
- * `FormStateProvider` calls this on every local edit when both a
90
- * dotted-path name is being written AND `setRow` is implemented;
91
- * otherwise the v1 skip-on-dot path runs.
92
- */
93
- setRow?(arrayName: string, rowId: string, fieldName: string, value: unknown): void
94
-
95
- /**
96
- * Subscribe to row-lifecycle events for a Repeater/Builder array.
97
- * Fires on remote add / remove / move; the renderer reconciles its
98
- * `rows` state by `__id`. Local mutations fire too — the renderer
99
- * deduplicates by checking whether the event's `rowId` matches one
100
- * it just dispatched itself (the binding's roundtrip + the
101
- * renderer's optimistic update converge).
102
- */
103
- subscribeRows?(arrayName: string, fn: (event: RowsEvent) => void): () => void
104
-
105
- /**
106
- * Snapshot the current row id order for an array. Unlike `subscribeRows`,
107
- * which only fires on delta events, this returns whatever is in the CRDT
108
- * right now — used by the renderer's mount-time reconciler to detect
109
- * orphaned rows (CRDT carries a UUID forward after the parent save
110
- * switched the row's `__id` to a DB PK; see
111
- * `docs/plans/repeater-relationship-pk-switch.md` Phase A).
112
- *
113
- * Empty array when the binding has no state for `arrayName` yet.
114
- */
115
- getRowOrder?(arrayName: string): string[]
116
-
117
- /**
118
- * PK-switch Phase B — re-key a row from `oldId` to `newId` across the
119
- * binding's row CRDT surface. Called by `FormRenderer` after a successful
120
- * form submit that emitted `relationshipRenames` in the JSON response;
121
- * the relevant `Repeater.relationship` / `Builder.relationship` field
122
- * pre-assigned the submitter's UUID and the server returned the DB PK
123
- * each row was actually persisted under. Renaming inside CRDT means
124
- * other peers converge on the DB PK without reloading.
125
- *
126
- * Idempotent: bindings should no-op on `oldId === newId`, on unknown
127
- * `oldId`, on unknown `arrayName`, AND on collisions where `newId`
128
- * already exists (clobbering an unrelated row's content is worse than
129
- * leaving the orphan UUID for the mount-time reconciler to drop).
130
- *
131
- * When absent, the dispatch step silently skips — the submitting
132
- * peer's Phase A reconciler still drops orphans on next mount, but
133
- * other peers stay on the UUID until they reload (the documented
134
- * pre-Phase-B posture). See
135
- * `pilotiq-pro/docs/plans/repeater-relationship-pk-switch.md`.
136
- */
137
- renameRow?(arrayName: string, oldId: string, newId: string): void
138
- }
139
-
140
- /**
141
- * Phase F.5 — array-scoped imperative API exposed to Repeater / Builder
142
- * renderers through `useRowBinding(arrayName)`. Each method's first arg
143
- * (`arrayName`) is pre-bound by the hook so call sites read naturally.
144
- *
145
- * Returned by the hook only when the active binding implements all four
146
- * F.5 row methods (`addRow + removeRow + reorderRows`); partial impls
147
- * read as null so renderers can do a single existence check before
148
- * proceeding. `setRow` is intentionally NOT exposed here — it's invoked
149
- * implicitly via `FormStateProvider.setValue`'s dotted-path routing,
150
- * so renderers never need to touch it directly.
151
- */
152
- export interface RowBindingApi {
153
- /** Register a new row in the array's CRDT surface. `initial` may
154
- * carry pre-seeded values (e.g. clone of a sibling); pass `{}` (or
155
- * omit) for empty rows. Idempotent under existing rowId. */
156
- add(rowId: string, initial?: Record<string, unknown>): void
157
- /** Remove the row with the given id. Idempotent for unknown ids. */
158
- remove(rowId: string): void
159
- /** Replace the array's row order. `newOrder` is the full list of row
160
- * ids in their post-reorder positions; the binding emits the minimal
161
- * CRDT move sequence in one transaction so peers observe a single
162
- * coalesced update. */
163
- reorder(newOrder: string[]): void
164
- /** Subscribe to remote row-lifecycle events on this array. Returns
165
- * an unsubscribe fn the renderer's `useEffect` cleanup hangs on.
166
- * Local mutations may also surface here (Yjs observers fire on
167
- * local transactions); the renderer is expected to dedupe by
168
- * rowId presence in its current state. Optional on the underlying
169
- * contract — `null` when the binding lacks `subscribeRows`. */
170
- subscribe(fn: (event: RowsEvent) => void): () => void
171
- /** Snapshot the array's current row id order. Empty array when the
172
- * binding has no state yet OR when the underlying binding doesn't
173
- * implement `getRowOrder` (in which case mount-time reconciliation
174
- * no-ops). */
175
- current(): string[]
176
- }
177
-
178
- /**
179
- * Phase F.5 — row-lifecycle event surfaced through `subscribeRows`.
180
- *
181
- * - `add` — a new row was inserted at `index`. `values` carries
182
- * the row's seeded field values (mirrors `addRow.initial`).
183
- * - `remove` — a row was removed; `index` is its position at the
184
- * moment of removal.
185
- * - `move` — a row shifted positions. `from` and `to` are 0-based
186
- * indices in the post-reorder layout (i.e. the row at
187
- * position `from` ended up at `to`).
188
- *
189
- * Pilotiq core stays Yjs-free — the binding impl in `@pilotiq-pro/collab`
190
- * translates `Y.Array<Y.Map>` `observe` deltas into these events.
191
- */
192
- export type RowsEvent =
193
- | { kind: 'add'; rowId: string; index: number; values: Record<string, unknown> }
194
- | { kind: 'remove'; rowId: string; index: number }
195
- | { kind: 'move'; rowId: string; from: number; to: number }
196
-
197
- export interface FormCollabBindingFactoryArgs {
198
- /** Active collab room — provides `ydoc`, `provider`, `user`. Opaque to pilotiq core. */
199
- room: CollabRoom
200
- /**
201
- * Form identifier — used by the binding to partition CRDT state when
202
- * multiple forms render against the same room (e.g. a record page that
203
- * shows a primary form plus a side-mounted action form). Most pages
204
- * only have one form, so most bindings use this as the `Y.Map` name.
205
- */
206
- formId: string
207
- /**
208
- * Initial values from pilotiq's normal SSR resolution. The binding
209
- * uses these to perform the idempotent "first-load seed" (`!ymap.has(k)`
210
- * gated write) so the first client to open a record populates the
211
- * Y.Map with the DB-derived defaults; subsequent clients find the
212
- * map already populated and skip.
213
- */
214
- initial: Record<string, unknown>
215
- /**
216
- * Initial form meta from the server. The binding walks this once at
217
- * construction to index Repeater / Builder array names for row-level
218
- * CRDT. Text fields (top-level and row leaves alike) don't need to be
219
- * partitioned here — the Tiptap renderer owns their `Y.XmlFragment`s
220
- * at the doc root. The meta is captured at mount; later structural
221
- * changes from `live()` re-resolves aren't re-walked.
222
- */
223
- formMeta: ElementMeta
224
- }
225
-
226
- export type FormCollabBindingFactory = (args: FormCollabBindingFactoryArgs) => FormCollabBinding
227
-
228
- let _factory: FormCollabBindingFactory | null = null
229
-
230
- /**
231
- * Register the form-level CRDT binding factory. Called once at boot by
232
- * `@pilotiq-pro/collab`'s plugin. No-op when no plugin registers —
233
- * `FormStateProvider` falls back to its plain local-state path.
234
- */
235
- export function registerFormCollabBinding(factory: FormCollabBindingFactory): void {
236
- _factory = factory
237
- }
238
-
239
- /** Returns the registered binding factory, or `null`. */
240
- export function getFormCollabBinding(): FormCollabBindingFactory | null {
241
- return _factory
242
- }