@pilotiq/pilotiq 0.24.1 → 0.24.2

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