@pilotiq/pilotiq 0.24.1 → 0.24.3

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