@pilotiq/pilotiq 0.23.1 → 0.24.2

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