@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,381 +0,0 @@
1
- import type { ElementMeta } from '../schema/Element.js'
2
- import type { FormCollabBinding } from './FormCollabBindingRegistry.js'
3
-
4
- /** Walk a form's child tree and collect every Field's `defaultValue` into
5
- * a flat values map keyed by field name. Used by `FormStateProvider` to
6
- * seed its controlled-state map from the server's initial render. */
7
- export function collectFieldDefaults(formMeta: ElementMeta): Record<string, unknown> {
8
- const out: Record<string, unknown> = {}
9
- // Server already overlays form-level `values` onto each field's
10
- // `defaultValue` during resolveSchema, so we only need to read the
11
- // field's `defaultValue`. We also overlay `formMeta.values` last as a
12
- // safety net for any field that didn't carry a defaultValue but has a
13
- // matching key on the form.
14
- walkFields(formMeta, (field) => {
15
- const name = String(field['name'] ?? '')
16
- if (!name) return
17
- const defaultValue = field['defaultValue']
18
- if (defaultValue !== undefined) {
19
- out[name] = defaultValue
20
- } else if (!(name in out)) {
21
- out[name] = ''
22
- }
23
- })
24
-
25
- const formValues = (formMeta as { values?: Record<string, unknown> }).values
26
- if (formValues) {
27
- for (const [k, v] of Object.entries(formValues)) {
28
- if (v !== undefined) out[k] = v
29
- }
30
- }
31
- return out
32
- }
33
-
34
- /** Locate a Field meta by name within a form's descendants. Returns
35
- * `undefined` when no match. Used by `triggerLive` to look up the
36
- * field's `live` config.
37
- *
38
- * Plan #14 — for dotted-path names like `items.0.product` (a field
39
- * inside a Repeater row), walks into the Repeater's first row's
40
- * children to find the inner field. The inner field's `live` config
41
- * is identical for every row (it's defined once on the field), so
42
- * reading from row 0 is sufficient. */
43
- export function findFieldMeta(formMeta: ElementMeta, name: string): ElementMeta | undefined {
44
- if (name.includes('.')) return findFieldMetaDotted(formMeta, name)
45
- let found: ElementMeta | undefined
46
- walkFields(formMeta, (field) => {
47
- if (found) return
48
- if (String(field['name'] ?? '') === name) found = field
49
- })
50
- return found
51
- }
52
-
53
- /** Walk a dotted path against a form tree. Segments alternate
54
- * field-name and row-index. Mirrors the server-side `resolveRepeaterPath`
55
- * in `dispatchForm.ts`. */
56
- function findFieldMetaDotted(formMeta: ElementMeta, path: string): ElementMeta | undefined {
57
- const segments = path.split('.')
58
- let currentChildren: ElementMeta[] = (formMeta.children as ElementMeta[] | undefined) ?? []
59
- let i = 0
60
- while (i < segments.length) {
61
- const fieldName = segments[i]
62
- if (fieldName === undefined) return undefined
63
- const field = findChildFieldByName(currentChildren, fieldName)
64
- if (!field) return undefined
65
- // Leaf — last segment was a field name.
66
- if (i === segments.length - 1) return field
67
- // Otherwise we must be inside a Repeater; the next segment is a row index.
68
- if (field['fieldType'] !== 'repeater') return undefined
69
- const idxRaw = segments[i + 1]
70
- if (idxRaw === undefined) return undefined
71
- const idx = Number(idxRaw)
72
- if (!Number.isInteger(idx) || idx < 0) return undefined
73
- // Live config is template-level; row 0's children are equivalent for
74
- // lookup. Fall back to the requested row when present (handles future
75
- // per-row schema variants without re-coding).
76
- const rows = (field['rows'] as Array<{ children: ElementMeta[] }> | undefined) ?? []
77
- const row = rows[idx] ?? rows[0]
78
- if (!row) {
79
- const tpl = (field['template'] as ElementMeta[] | undefined) ?? []
80
- currentChildren = tpl
81
- } else {
82
- currentChildren = row.children
83
- }
84
- i += 2
85
- }
86
- return undefined
87
- }
88
-
89
- /** Find a direct child field by name — non-recursive (only scans the
90
- * immediate `Field` children of the given list). Layout containers are
91
- * flattened first so a Field inside `Section / Card / Group / etc.`
92
- * still counts as a "direct" child of the row's schema. */
93
- function findChildFieldByName(elements: ElementMeta[], name: string): ElementMeta | undefined {
94
- for (const el of elements) {
95
- if (el.type === 'field' && String(el['name'] ?? '') === name) return el
96
- // Don't recurse into a Repeater's children — the dotted path handles
97
- // that explicitly via the next segment.
98
- if (el['fieldType'] === 'repeater') continue
99
- const children = el.children as ElementMeta[] | undefined
100
- if (Array.isArray(children) && children.length > 0) {
101
- const hit = findChildFieldByName(children, name)
102
- if (hit) return hit
103
- }
104
- }
105
- return undefined
106
- }
107
-
108
- /** Recursive walker — visits every `field`-typed descendant. Stops at
109
- * Repeater boundaries (its row children are addressed via dotted paths,
110
- * not via this walker). */
111
- function walkFields(node: ElementMeta, visit: (field: ElementMeta) => void): void {
112
- if (node.type === 'field') {
113
- visit(node)
114
- if (node['fieldType'] === 'repeater') return
115
- }
116
- const children = node.children
117
- if (Array.isArray(children)) {
118
- for (const child of children) walkFields(child as ElementMeta, visit)
119
- }
120
- }
121
-
122
- /**
123
- * Build a nested object from FormData entries. Keys split on `.`:
124
- * - `name` → `{ name: 'value' }`
125
- * - `items.0.product` → `{ items: [{ product: 'value' }] }`
126
- * - `items.0.modifiers.1.name` → nested arrays of objects
127
- *
128
- * Plan #14 — used by FormStateProvider to snapshot the current DOM
129
- * state of a form (including uncontrolled inner-Repeater inputs)
130
- * before POSTing a live re-resolve. Server's `coerceFormValues` does
131
- * the same structural fold plus type coercion; the client just folds.
132
- *
133
- * Rules:
134
- * - Numeric segments after a field name → array indices.
135
- * - Multiple values for the same key → last one wins (matches
136
- * browser-form semantics; checkbox lists handled at the field level).
137
- * - Reserved `__id` keys (Repeater row identity) and `_formId / _method`
138
- * are filtered out — they're transport metadata, not field values.
139
- */
140
- export function parseFormDataToNested(fd: FormData): Record<string, unknown> {
141
- const out: Record<string, unknown> = {}
142
- for (const [rawKey, rawValue] of fd.entries()) {
143
- if (rawKey === '_formId' || rawKey === '_method') continue
144
- if (rawKey.endsWith('.__id')) continue
145
- // FormData values may be File or string. We only need string here —
146
- // file uploads pre-resolve to URL strings before live POST.
147
- const value = typeof rawValue === 'string' ? rawValue : ''
148
- writeNestedPath(out, rawKey.split('.'), value)
149
- }
150
- return out
151
- }
152
-
153
- /** Write a value into a nested object/array structure along a path
154
- * whose segments alternate field name (string) and array index
155
- * (numeric string). Creates intermediate objects/arrays as needed. */
156
- function writeNestedPath(root: Record<string, unknown>, segments: string[], value: unknown): void {
157
- if (segments.length === 0) return
158
- let cursor: Record<string, unknown> | unknown[] = root
159
- for (let i = 0; i < segments.length - 1; i++) {
160
- const seg = segments[i] as string
161
- const nextSeg = segments[i + 1] as string
162
- const nextIsIndex = /^\d+$/.test(nextSeg)
163
- if (Array.isArray(cursor)) {
164
- const idx = Number(seg)
165
- if (!Number.isInteger(idx) || idx < 0) return
166
- if (cursor[idx] === undefined) cursor[idx] = nextIsIndex ? [] : {}
167
- cursor = cursor[idx] as Record<string, unknown> | unknown[]
168
- } else {
169
- if (cursor[seg] === undefined) cursor[seg] = nextIsIndex ? [] : {}
170
- cursor = cursor[seg] as Record<string, unknown> | unknown[]
171
- }
172
- }
173
- const leaf = segments[segments.length - 1] as string
174
- if (Array.isArray(cursor)) {
175
- const idx = Number(leaf)
176
- if (!Number.isInteger(idx) || idx < 0) return
177
- cursor[idx] = value
178
- } else {
179
- cursor[leaf] = value
180
- }
181
- }
182
-
183
- /** Public — write a single value into a nested structure along a
184
- * dotted path. Used by FormStateProvider to apply a `triggerLive`
185
- * value override on top of the FormData snapshot. */
186
- export function writeNestedValue(
187
- root: Record<string, unknown>,
188
- path: string,
189
- value: unknown,
190
- ): void {
191
- writeNestedPath(root, path.split('.'), value)
192
- }
193
-
194
- /** Read a single value from a nested structure along a dotted path.
195
- * Returns `undefined` for missing paths or when an intermediate
196
- * segment is not a navigable container. Used by `afterStateUpdatedJs`
197
- * to expose `$get('items.0.name')` to the JS handler. */
198
- export function readNestedValue(
199
- root: Record<string, unknown>,
200
- path: string,
201
- ): unknown {
202
- const segments = path.split('.')
203
- let cursor: unknown = root
204
- for (const seg of segments) {
205
- if (cursor === null || cursor === undefined) return undefined
206
- if (Array.isArray(cursor)) {
207
- const idx = Number(seg)
208
- if (!Number.isInteger(idx)) return undefined
209
- cursor = cursor[idx]
210
- continue
211
- }
212
- if (typeof cursor === 'object') {
213
- cursor = (cursor as Record<string, unknown>)[seg]
214
- continue
215
- }
216
- return undefined
217
- }
218
- return cursor
219
- }
220
-
221
- /**
222
- * Phase F.5 — parsed row-field coordinates.
223
- *
224
- * `fieldName` is the leaf field's name as declared in the inner schema
225
- * (e.g. the `TextField.make('label')` inside a `Repeater.schema([...])`).
226
- * Builder rows wrap their inner schema under a literal `data` segment;
227
- * `parseRowFieldPath` strips that segment so consumers don't need to
228
- * know which row-array dialect they're addressing.
229
- */
230
- export interface ParsedRowFieldPath {
231
- arrayName: string
232
- index: number
233
- fieldName: string
234
- }
235
-
236
- /**
237
- * Phase F.5 — parse a dotted form-field name into row-array coordinates
238
- * when it matches a Repeater or Builder row-leaf shape; return `null`
239
- * otherwise. Used by `FormStateProvider` to route row-leaf writes
240
- * through `FormCollabBinding.setRow` instead of skipping them.
241
- *
242
- * `tags.0.label` → { arrayName: 'tags', index: 0, fieldName: 'label' } (Repeater)
243
- * `blocks.0.data.body` → { arrayName: 'blocks', index: 0, fieldName: 'body' } (Builder)
244
- * `tags.0.__id` → null (row identity — handled by addRow / reorderRows)
245
- * `blocks.0.type` → null (Builder block discriminator — not a user field)
246
- * `foo` → null (top-level field — top-level binding.set path)
247
- * `tags.notnum.label` → null (malformed)
248
- *
249
- * Nested Repeaters / Builders (e.g. `articles.0.comments.1.body`) are
250
- * out of scope v1 — they return `null` here too. F.5b's binding impl
251
- * therefore never sees them and they continue to ride the local-state
252
- * path until a future phase opens the door.
253
- */
254
- export function parseRowFieldPath(path: string): ParsedRowFieldPath | null {
255
- const segments = path.split('.')
256
- if (segments.length === 3) {
257
- const [arrayName, idxRaw, fieldName] = segments as [string, string, string]
258
- if (!/^\d+$/.test(idxRaw)) return null
259
- if (!arrayName || !fieldName) return null
260
- if (fieldName === '__id' || fieldName === 'type') return null
261
- return { arrayName, index: Number(idxRaw), fieldName }
262
- }
263
- if (segments.length === 4 && segments[2] === 'data') {
264
- const [arrayName, idxRaw, , fieldName] = segments as [string, string, string, string]
265
- if (!/^\d+$/.test(idxRaw)) return null
266
- if (!arrayName || !fieldName) return null
267
- return { arrayName, index: Number(idxRaw), fieldName }
268
- }
269
- return null
270
- }
271
-
272
- /**
273
- * Phase F.5 — resolve the stable `__id` of the row at `arrayName[index]`
274
- * from a flat dotted-path values map. The renderer mints `__id` on every
275
- * row insert (UUID for new / DB PK for relationship-backed) so callers
276
- * here are looking up an id that already exists; returns `null` only
277
- * when the row hasn't been registered yet (e.g. the binding observed a
278
- * remote insert before the local renderer rebuilt its row map).
279
- *
280
- * The lookup always reads from the flat shape (`${arrayName}.${index}.__id`)
281
- * since both `FormStateProvider`'s `valuesRef` and server-resolve responses
282
- * use flat dotted-path keys.
283
- */
284
- export function rowIdAtIndex(
285
- values: Record<string, unknown>,
286
- arrayName: string,
287
- index: number,
288
- ): string | null {
289
- const flat = values[`${arrayName}.${index}.__id`]
290
- if (typeof flat === 'string' && flat.length > 0) return flat
291
- return null
292
- }
293
-
294
- /**
295
- * Phase F2 — returns `true` iff the named field has explicitly opted out
296
- * of realtime collab via `Field.collab(false)`. Sparse meta — absent =
297
- * inherit the panel default (collab on). Walks the form meta tree the
298
- * same way `findFieldMeta` does. Cheap (one map lookup per write).
299
- *
300
- * Exposed so `routeBindingWrite` can compose against it from this
301
- * module instead of FormStateContext's private helper.
302
- */
303
- export function fieldOptsOutOfCollab(formMeta: ElementMeta, name: string): boolean {
304
- const meta = findFieldMeta(formMeta, name) as { collab?: boolean } | undefined
305
- return meta?.collab === false
306
- }
307
-
308
- /**
309
- * Phase F.5 — route a single (name, value) write through the collab
310
- * binding by name shape:
311
- *
312
- * - top-level name → `binding.set(name, value)` (F2 path)
313
- * - row leaf → `binding.setRow(arrayName, rowId, fieldName, value)`
314
- * when the binding implements F.5; falls through
315
- * to no-op otherwise (v1 skip-on-dot behaviour).
316
- *
317
- * Skips when no binding is registered or the field opted out via
318
- * `.collab(false)`. `valuesForLookup` supplies the rowId map — pass the
319
- * latest snapshot the caller has access to (`valuesRef.current` for
320
- * local writes; merged `valuesRef + serverValues` for server-resolve).
321
- *
322
- * Shared between `setValue` (local edits) and the server-resolve overlay
323
- * inside `performLivePost` so both routing decisions stay in lockstep.
324
- */
325
- export function routeBindingWrite(
326
- binding: FormCollabBinding | null,
327
- formMeta: ElementMeta | undefined,
328
- valuesForLookup: Record<string, unknown>,
329
- name: string,
330
- value: unknown,
331
- ): void {
332
- if (!binding) return
333
- if (formMeta && fieldOptsOutOfCollab(formMeta, name)) return
334
- if (!name.includes('.')) {
335
- binding.set(name, value)
336
- return
337
- }
338
- if (!binding.setRow) return // pre-F.5 binding — row leaves stay local
339
- const parsed = parseRowFieldPath(name)
340
- if (!parsed) return // nested-Repeater / malformed — out of scope v1
341
- const rowId = rowIdAtIndex(valuesForLookup, parsed.arrayName, parsed.index)
342
- if (!rowId) return // row not yet stamped — local-only until id lands
343
- binding.setRow(parsed.arrayName, rowId, parsed.fieldName, value)
344
- }
345
-
346
- /**
347
- * Phase F.5 — walk a form's meta tree for top-level Repeater / Builder
348
- * field names. Used by `FormStateProvider` to build the per-array
349
- * `RowBindingApi` map from a single meta walk at binding mount.
350
- *
351
- * Stops at the array boundary itself — we want the array's own field
352
- * name, not the inner-row fields inside it (which address through
353
- * `setRow`'s dotted-path routing, not through their own row bindings).
354
- * Skips fields opted out via `.collab(false)` so the array is left on
355
- * the v1 local-state path.
356
- */
357
- export function collectRowArrayFieldNames(formMeta: ElementMeta): string[] {
358
- const out: string[] = []
359
- walk(formMeta)
360
- return out
361
-
362
- function walk(node: ElementMeta): void {
363
- if (node.type === 'field') {
364
- const fieldType = node['fieldType']
365
- if (fieldType === 'repeater' || fieldType === 'builder') {
366
- if ((node as { collab?: boolean }).collab !== false) {
367
- const name = String(node['name'] ?? '')
368
- if (name) out.push(name)
369
- }
370
- // Don't descend — inner row fields address through dotted-path
371
- // routing, not their own row bindings.
372
- return
373
- }
374
- }
375
- const children = node.children
376
- if (Array.isArray(children)) {
377
- for (const child of children) walk(child as ElementMeta)
378
- }
379
- }
380
- }
381
-
@@ -1,19 +0,0 @@
1
- import * as React from 'react'
2
-
3
- const MOBILE_BREAKPOINT = 768
4
-
5
- export function useIsMobile() {
6
- const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)
7
-
8
- React.useEffect(() => {
9
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10
- const onChange = () => {
11
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12
- }
13
- mql.addEventListener('change', onChange)
14
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15
- return () => mql.removeEventListener('change', onChange)
16
- }, [])
17
-
18
- return !!isMobile
19
- }
@@ -1,60 +0,0 @@
1
- import React, { createContext, useContext } from 'react'
2
- import { getIcon, type IconType } from '../icons/registry.js'
3
- import type { SerializedIcon } from '../icons/types.js'
4
-
5
- /**
6
- * Build-time component manifest. Maps Resource/Global/Page class names
7
- * (e.g., `'ArticleResource'`) to the class itself. The Pilotiq Vite
8
- * plugin emits this map by reading `app/Pilotiq/AdminPanel.ts` and
9
- * re-exporting every registered class. The auto-gen `+Layout.tsx`
10
- * imports it and passes it to `AppShell`.
11
- *
12
- * Only used to resolve component-typed icons (`Resource.icon = Newspaper`).
13
- * String-typed icons go through `getIcon()` against the runtime registry.
14
- */
15
- export type ComponentRegistry = Record<string, { icon?: unknown; navigationIcon?: unknown }>
16
-
17
- const Ctx = createContext<ComponentRegistry | undefined>(undefined)
18
-
19
- export function ComponentRegistryProvider({
20
- value,
21
- children,
22
- }: {
23
- value: ComponentRegistry | undefined
24
- children: React.ReactNode
25
- }) {
26
- return <Ctx.Provider value={value}>{children}</Ctx.Provider>
27
- }
28
-
29
- export function useComponentRegistry(): ComponentRegistry | undefined {
30
- return useContext(Ctx)
31
- }
32
-
33
- /**
34
- * Resolve a `SerializedIcon` from `viewProps` to a React component.
35
- *
36
- * - `string` → look up in the runtime `registerIcons()` registry.
37
- * - `{ class: 'ArticleResource' }` → look up in the build-time component
38
- * manifest. If the entry has its own `.navigationIcon` it wins;
39
- * otherwise falls through to `.icon`. The icon prop on the class
40
- * itself can be either another component (returned directly) or
41
- * another string (re-resolved through the runtime registry).
42
- * - `undefined` → returns `undefined` (caller picks its own fallback).
43
- */
44
- export function useIconFor(value: SerializedIcon | undefined): IconType | undefined {
45
- const manifest = useComponentRegistry()
46
- if (value === undefined) return undefined
47
- if (typeof value === 'string') return getIcon(value)
48
- if (typeof value === 'object' && 'class' in value) {
49
- const entry = manifest?.[value.class]
50
- if (!entry) return undefined
51
- const candidate = entry.navigationIcon ?? entry.icon
52
- if (candidate === undefined || candidate === null) return undefined
53
- // String → re-resolve through the runtime registry; otherwise
54
- // (function or forwardRef/memo object) treat as a renderable component.
55
- if (typeof candidate === 'string') return getIcon(candidate)
56
- if (typeof candidate === 'function' || typeof candidate === 'object') return candidate as IconType
57
- return undefined
58
- }
59
- return undefined
60
- }
@@ -1,194 +0,0 @@
1
- export { AppShell, type AppShellProps } from './AppShell.js'
2
- export {
3
- ComponentRegistryProvider,
4
- useComponentRegistry,
5
- useIconFor,
6
- type ComponentRegistry,
7
- } from './icon-context.js'
8
-
9
- export {
10
- SchemaRenderer,
11
- type SchemaRendererProps,
12
- FormFields,
13
- type FormFieldsProps,
14
- } from './SchemaRenderer.js'
15
- export { registerFieldRenderer, getFieldRenderer, type FieldRendererProps } from './registry.js'
16
- export { registerFieldLabelSlot, getFieldLabelSlot, type FieldLabelSlotProps } from './FieldLabelSlotRegistry.js'
17
- export {
18
- registerPendingSuggestionOverlay,
19
- getPendingSuggestionOverlay,
20
- type PendingSuggestionOverlayProps,
21
- } from './PendingSuggestionOverlayRegistry.js'
22
- export {
23
- PendingSuggestionsContext,
24
- usePendingSuggestions,
25
- usePendingSuggestionsForField,
26
- type PendingSuggestion,
27
- type PendingSuggestionOrigin,
28
- type PendingSuggestionsApi,
29
- } from './PendingSuggestionsContext.js'
30
- export {
31
- registerPendingSuggestionApplier,
32
- getPendingSuggestionApplier,
33
- type PendingSuggestionApplier,
34
- } from './PendingSuggestionApplierRegistry.js'
35
- export {
36
- CollabRoomContext,
37
- useCollabRoom,
38
- onProviderSynced,
39
- type CollabRoom,
40
- type SyncedProviderLike,
41
- } from './CollabRoomContext.js'
42
- export {
43
- registerCollabExtensions,
44
- getCollabExtensions,
45
- type CollabExtensionFactory,
46
- type CollabExtensionFactoryArgs,
47
- } from './CollabExtensionFactoryRegistry.js'
48
- export {
49
- registerCollabTextRenderer,
50
- getCollabTextRenderer,
51
- type CollabTextRenderer,
52
- type CollabTextRendererProps,
53
- } from './CollabTextRendererRegistry.js'
54
- export {
55
- registerMarkdownEditor,
56
- getMarkdownEditor,
57
- type MarkdownEditor,
58
- type MarkdownEditorProps,
59
- } from './MarkdownEditorRegistry.js'
60
- export {
61
- registerFormCollabBinding,
62
- getFormCollabBinding,
63
- type FormCollabBinding,
64
- type FormCollabBindingFactory,
65
- type FormCollabBindingFactoryArgs,
66
- type RowsEvent,
67
- type RowBindingApi,
68
- } from './FormCollabBindingRegistry.js'
69
- export {
70
- registerFieldPresenceComponent,
71
- getFieldPresenceComponent,
72
- type FieldPresenceProps,
73
- } from './FieldPresenceRegistry.js'
74
- export {
75
- registerFieldFocusReporter,
76
- getFieldFocusReporter,
77
- type FieldFocusReporter,
78
- type FieldFocusEvent,
79
- } from './FieldFocusReporterRegistry.js'
80
- export {
81
- registerRecordWrapper,
82
- getRecordWrapper,
83
- type RecordWrapperProps,
84
- } from './RecordWrapperRegistry.js'
85
- export {
86
- RecordWrapperGate,
87
- type RecordWrapperGateProps,
88
- } from './RecordWrapperGate.js'
89
- export {
90
- registerCustomPageWrapper,
91
- getCustomPageWrapper,
92
- type CustomPageWrapperProps,
93
- } from './CustomPageWrapperRegistry.js'
94
- export {
95
- CustomPageWrapperGate,
96
- type CustomPageWrapperGateProps,
97
- type PageCollabMap,
98
- } from './CustomPageWrapperGate.js'
99
- export {
100
- parseRecordPageUrl,
101
- parseRecordEditUrl,
102
- type RecordPageIdentity,
103
- type RecordPageRole,
104
- type RecordEditIdentity,
105
- } from './parseRecordEditUrl.js'
106
- export {
107
- registerWidgetRenderer,
108
- getWidgetRenderer,
109
- type WidgetRendererProps,
110
- } from './widgetRegistry.js'
111
-
112
- export {
113
- FormStateProvider,
114
- useFieldState,
115
- useFormState,
116
- useFormId,
117
- useRowBinding,
118
- type FormStateApi,
119
- type FormStateProviderProps,
120
- type UseFieldStateResult,
121
- } from './FormStateContext.js'
122
-
123
- export { parseFormDataToNested, parseRowFieldPath, type ParsedRowFieldPath } from './formStateHelpers.js'
124
- export { RowCoordsContext, useRowCoords, type RowCoords } from './RowCoordsContext.js'
125
-
126
- export { NavigateProvider, useNavigate, type NavigateFn } from './navigate.js'
127
-
128
- export { ToasterProvider, useToast } from './Toaster.js'
129
-
130
- export {
131
- WidgetDataProvider,
132
- useInitialWidgetData,
133
- useWidgetData,
134
- type WidgetState,
135
- type WidgetMetaLike,
136
- type WidgetDataProviderProps,
137
- } from './WidgetDataContext.js'
138
-
139
- export {
140
- RightPanelRegistryProvider,
141
- useRightPanelRegistry,
142
- useRightPanelComponent,
143
- type RightPanelRegistry,
144
- } from './right-panel-registry.js'
145
-
146
- export {
147
- RightSidebarProvider,
148
- useRightSidebar,
149
- useRightSidebarOptional,
150
- type RightSidebarApi,
151
- type RightSidebarProviderProps,
152
- } from './RightSidebarContext.js'
153
- export {
154
- RightSidebar,
155
- type RightSidebarProps,
156
- } from './RightSidebar.js'
157
- export { RightSidebarTrigger } from './RightSidebarTrigger.js'
158
- export { SearchTrigger } from './SearchTrigger.js'
159
- export {
160
- useResizableWidth,
161
- clampPanelWidth,
162
- type UseResizableWidthOptions,
163
- type UseResizableWidthApi,
164
- } from './useResizableWidth.js'
165
-
166
- export {
167
- CurrentUserProvider,
168
- useCurrentUser,
169
- type CurrentUser,
170
- } from './CurrentUserContext.js'
171
-
172
- export { ThemeProvider, useTheme } from './ThemeProvider.js'
173
- export { ThemeToggle } from './ThemeToggle.js'
174
- export { ThemeSettingsPage } from './ThemeSettingsPage.js'
175
- export { UserMenu } from './UserMenu.js'
176
- export { NotificationBell } from './NotificationBell.js'
177
- export { RenderHookSlot } from './RenderHookSlot.js'
178
- export { HeadHooks } from './HeadHooks.js'
179
-
180
- export {
181
- isNavItemActive,
182
- type NavComponentProps,
183
- type HeaderComponentProps,
184
- type FooterComponentProps,
185
- type ComponentSlotRegistry,
186
- } from './component-slots.js'
187
- export type { NavItem } from '../pageData.js'
188
-
189
- // Re-export pure theme functions for client-safe usage (avoids importing main barrel which has server-only code)
190
- export { generateThemeCSS } from '../theme/generate-css.js'
191
- export { resolveTheme } from '../theme/resolve.js'
192
-
193
- // Backwards compat
194
- export { AppShell as AdminShell, type AppShellProps as AdminShellProps } from './AppShell.js'