@pilotiq/pilotiq 0.23.1 → 0.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +91 -0
- package/boost/guidelines.md +566 -0
- package/boost/skills/pilotiq-fields/SKILL.md +47 -0
- package/boost/skills/pilotiq-fields/rules/field-catalog.md +288 -0
- package/boost/skills/pilotiq-fields/rules/reactive-fields.md +199 -0
- package/boost/skills/pilotiq-fields/rules/validation.md +198 -0
- package/boost/skills/pilotiq-relations/SKILL.md +47 -0
- package/boost/skills/pilotiq-relations/rules/relation-managers.md +256 -0
- package/boost/skills/pilotiq-relations/rules/repeater-relationship.md +177 -0
- package/boost/skills/pilotiq-resource/SKILL.md +61 -0
- package/boost/skills/pilotiq-resource/rules/authorization.md +242 -0
- package/boost/skills/pilotiq-resource/rules/defining-resources.md +228 -0
- package/boost/skills/pilotiq-resource/rules/page-overrides.md +296 -0
- package/dist/actions/exportFactory.d.ts +10 -0
- package/dist/actions/exportFactory.d.ts.map +1 -1
- package/dist/actions/exportFactory.js +10 -0
- package/dist/actions/exportFactory.js.map +1 -1
- package/dist/react/CollabRoomContext.d.ts +5 -5
- package/dist/react/index.d.ts +0 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -1
- package/dist/react/index.js.map +1 -1
- package/dist/routes/helpers.d.ts.map +1 -1
- package/dist/routes/helpers.js +6 -2
- package/dist/routes/helpers.js.map +1 -1
- package/dist/routes/relations.d.ts.map +1 -1
- package/dist/routes/relations.js +12 -0
- package/dist/routes/relations.js.map +1 -1
- package/package.json +6 -1
- package/.turbo/turbo-build.log +0 -8
- package/CLAUDE.md +0 -265
- package/dist/react/useCollabSeed.d.ts +0 -23
- package/dist/react/useCollabSeed.d.ts.map +0 -1
- package/dist/react/useCollabSeed.js +0 -82
- package/dist/react/useCollabSeed.js.map +0 -1
- package/src/Cluster.test.ts +0 -283
- package/src/Cluster.ts +0 -83
- package/src/Column.test.ts +0 -199
- package/src/Column.ts +0 -710
- package/src/Global.test.ts +0 -367
- package/src/Global.ts +0 -169
- package/src/Page.test.ts +0 -114
- package/src/Page.ts +0 -208
- package/src/Pilotiq.perf.test.ts +0 -252
- package/src/Pilotiq.test.ts +0 -129
- package/src/Pilotiq.ts +0 -1158
- package/src/PilotiqRegistry.ts +0 -36
- package/src/PilotiqServiceProvider.ts +0 -121
- package/src/RelationManager.test.ts +0 -400
- package/src/RelationManager.ts +0 -527
- package/src/RenderHook.test.ts +0 -252
- package/src/RenderHook.ts +0 -242
- package/src/Resource.test.ts +0 -284
- package/src/Resource.ts +0 -526
- package/src/RightPanel.test.ts +0 -202
- package/src/RightPanel.ts +0 -132
- package/src/Tab.test.ts +0 -91
- package/src/Tab.ts +0 -156
- package/src/UserMenuItem.ts +0 -145
- package/src/actions/Action.test.ts +0 -2526
- package/src/actions/Action.ts +0 -1515
- package/src/actions/ActionGroup.test.ts +0 -112
- package/src/actions/ActionGroup.ts +0 -173
- package/src/actions/attachFactory.ts +0 -172
- package/src/actions/bulkFactories.ts +0 -168
- package/src/actions/crudFactories.ts +0 -220
- package/src/actions/exportFactory.ts +0 -215
- package/src/actions/factoryHelpers.ts +0 -177
- package/src/actions/importFactory.ts +0 -243
- package/src/actions/index.ts +0 -17
- package/src/actions/m2mFactories.ts +0 -193
- package/src/actions/relationFactories.ts +0 -372
- package/src/applyPageHooks.test.ts +0 -463
- package/src/applyPageHooks.ts +0 -330
- package/src/authorization.test.ts +0 -483
- package/src/breadcrumbs.test.ts +0 -238
- package/src/cells/coerce.test.ts +0 -85
- package/src/cells/coerce.ts +0 -84
- package/src/clusterPaths.ts +0 -35
- package/src/columns/BadgeColumn.test.ts +0 -54
- package/src/columns/BadgeColumn.ts +0 -32
- package/src/columns/BooleanColumn.test.ts +0 -41
- package/src/columns/BooleanColumn.ts +0 -18
- package/src/columns/ColorColumn.test.ts +0 -37
- package/src/columns/ColorColumn.ts +0 -38
- package/src/columns/IconColumn.test.ts +0 -54
- package/src/columns/IconColumn.ts +0 -37
- package/src/columns/ImageColumn.test.ts +0 -41
- package/src/columns/ImageColumn.ts +0 -28
- package/src/columns/SelectColumn.ts +0 -98
- package/src/columns/TextColumn.test.ts +0 -190
- package/src/columns/TextColumn.ts +0 -20
- package/src/columns/TextInputColumn.ts +0 -68
- package/src/columns/ToggleColumn.ts +0 -46
- package/src/columns/editableColumns.test.ts +0 -238
- package/src/columns/index.ts +0 -9
- package/src/defaultGlobalPages.ts +0 -95
- package/src/defaultPages.test.ts +0 -634
- package/src/defaultPages.ts +0 -617
- package/src/defaultViewPage.test.ts +0 -147
- package/src/elements/Form.test.ts +0 -223
- package/src/elements/Form.ts +0 -416
- package/src/elements/ListTabs.ts +0 -28
- package/src/elements/Table.test.ts +0 -422
- package/src/elements/Table.ts +0 -850
- package/src/elements/TableGroup.test.ts +0 -260
- package/src/elements/TableGroup.ts +0 -334
- package/src/elements/dispatchAction.test.ts +0 -463
- package/src/elements/dispatchAction.ts +0 -355
- package/src/elements/dispatchForm.test.ts +0 -477
- package/src/elements/dispatchForm.ts +0 -1993
- package/src/elements/dispatchTable.test.ts +0 -1514
- package/src/elements/dispatchTable.ts +0 -745
- package/src/elements/index.ts +0 -21
- package/src/entries/BadgeEntry.ts +0 -39
- package/src/entries/CodeEntry.test.ts +0 -40
- package/src/entries/CodeEntry.ts +0 -52
- package/src/entries/ColorEntry.ts +0 -63
- package/src/entries/ComponentEntry.test.ts +0 -173
- package/src/entries/ComponentEntry.ts +0 -95
- package/src/entries/Entry.ts +0 -304
- package/src/entries/IconEntry.ts +0 -49
- package/src/entries/ImageEntry.ts +0 -61
- package/src/entries/KeyValueEntry.ts +0 -47
- package/src/entries/RepeatableEntry.test.ts +0 -239
- package/src/entries/RepeatableEntry.ts +0 -173
- package/src/entries/TextEntry.test.ts +0 -394
- package/src/entries/TextEntry.ts +0 -60
- package/src/entries/index.ts +0 -12
- package/src/entries/leaves.test.ts +0 -306
- package/src/entries/registry.ts +0 -54
- package/src/fields/BuilderField.test.ts +0 -1188
- package/src/fields/BuilderField.ts +0 -605
- package/src/fields/BuilderRelationship.test.ts +0 -811
- package/src/fields/CheckboxField.test.ts +0 -44
- package/src/fields/CheckboxField.ts +0 -27
- package/src/fields/CheckboxListField.test.ts +0 -99
- package/src/fields/CheckboxListField.ts +0 -66
- package/src/fields/ColorPickerField.test.ts +0 -33
- package/src/fields/ColorPickerField.ts +0 -25
- package/src/fields/DateField.ts +0 -54
- package/src/fields/DateTimeField.test.ts +0 -55
- package/src/fields/EmailField.ts +0 -16
- package/src/fields/Field.test.ts +0 -654
- package/src/fields/Field.ts +0 -817
- package/src/fields/FileUploadField.test.ts +0 -143
- package/src/fields/FileUploadField.ts +0 -159
- package/src/fields/HiddenField.test.ts +0 -27
- package/src/fields/HiddenField.ts +0 -28
- package/src/fields/KeyValueField.test.ts +0 -105
- package/src/fields/KeyValueField.ts +0 -55
- package/src/fields/MarkdownField.test.ts +0 -167
- package/src/fields/MarkdownField.ts +0 -162
- package/src/fields/NumberField.ts +0 -33
- package/src/fields/RadioField.test.ts +0 -94
- package/src/fields/RadioField.ts +0 -67
- package/src/fields/RepeaterField.test.ts +0 -1806
- package/src/fields/RepeaterField.ts +0 -939
- package/src/fields/RepeaterRelationship.test.ts +0 -1923
- package/src/fields/RepeaterSimple.test.ts +0 -248
- package/src/fields/RowButton.test.ts +0 -219
- package/src/fields/RowButton.ts +0 -135
- package/src/fields/SelectField.test.ts +0 -192
- package/src/fields/SelectField.ts +0 -235
- package/src/fields/SliderField.test.ts +0 -50
- package/src/fields/SliderField.ts +0 -53
- package/src/fields/SlugField.ts +0 -24
- package/src/fields/TagsInputField.test.ts +0 -154
- package/src/fields/TagsInputField.ts +0 -133
- package/src/fields/TextField.test.ts +0 -213
- package/src/fields/TextField.ts +0 -177
- package/src/fields/TextareaField.test.ts +0 -58
- package/src/fields/TextareaField.ts +0 -59
- package/src/fields/ToggleButtonsField.test.ts +0 -106
- package/src/fields/ToggleButtonsField.ts +0 -59
- package/src/fields/ToggleField.ts +0 -16
- package/src/fields/disableOptionsWhenSelectedInSiblingRepeaterItems.test.ts +0 -319
- package/src/fields/optionsResolver.ts +0 -95
- package/src/fields/resolveField.ts +0 -28
- package/src/filters/BooleanFilter.ts +0 -35
- package/src/filters/DateRangeFilter.test.ts +0 -194
- package/src/filters/DateRangeFilter.ts +0 -148
- package/src/filters/Filter.test.ts +0 -268
- package/src/filters/Filter.ts +0 -184
- package/src/filters/FormFilter.test.ts +0 -238
- package/src/filters/FormFilter.ts +0 -215
- package/src/filters/MultiSelectFilter.test.ts +0 -119
- package/src/filters/MultiSelectFilter.ts +0 -78
- package/src/filters/QueryBuilderFilter.test.ts +0 -662
- package/src/filters/QueryBuilderFilter.ts +0 -398
- package/src/filters/SelectFilter.ts +0 -46
- package/src/filters/TernaryFilter.test.ts +0 -160
- package/src/filters/TernaryFilter.ts +0 -72
- package/src/filters/TrashedFilter.test.ts +0 -149
- package/src/filters/TrashedFilter.ts +0 -55
- package/src/filters/queryBuilder/BooleanConstraint.ts +0 -31
- package/src/filters/queryBuilder/Constraint.ts +0 -115
- package/src/filters/queryBuilder/DateConstraint.ts +0 -69
- package/src/filters/queryBuilder/NumberConstraint.ts +0 -66
- package/src/filters/queryBuilder/SelectConstraint.ts +0 -72
- package/src/filters/queryBuilder/TextConstraint.ts +0 -64
- package/src/filters/queryBuilder/index.ts +0 -12
- package/src/icons/index.ts +0 -2
- package/src/icons/lucide.ts +0 -204
- package/src/icons/registry.test.ts +0 -56
- package/src/icons/registry.ts +0 -41
- package/src/icons/types.ts +0 -47
- package/src/index.ts +0 -525
- package/src/io/csv.test.ts +0 -142
- package/src/io/csv.ts +0 -170
- package/src/nestedRelationManagerData.test.ts +0 -547
- package/src/notifications/Notification.test.ts +0 -210
- package/src/notifications/Notification.ts +0 -354
- package/src/notifications/broadcast.test.ts +0 -110
- package/src/notifications/broadcast.ts +0 -95
- package/src/notifications/database.test.ts +0 -383
- package/src/notifications/database.ts +0 -398
- package/src/notifications/databaseNotifications.test.ts +0 -187
- package/src/notifications/dispatchNotificationAction.test.ts +0 -341
- package/src/notifications/dispatchNotificationAction.ts +0 -142
- package/src/notifications/flash.test.ts +0 -89
- package/src/notifications/flash.ts +0 -71
- package/src/notifications/index.ts +0 -45
- package/src/notifications/registerBroadcastAuth.test.ts +0 -134
- package/src/notifications/registerBroadcastAuth.ts +0 -100
- package/src/notifications/resolveSavedNotification.test.ts +0 -82
- package/src/notifications/resolveSavedNotification.ts +0 -59
- package/src/notifications/types.ts +0 -93
- package/src/orm/m2mAccessor.ts +0 -66
- package/src/orm/modelDefaults.test.ts +0 -633
- package/src/orm/modelDefaults.ts +0 -666
- package/src/pageData/breadcrumbs.ts +0 -288
- package/src/pageData/forms.ts +0 -578
- package/src/pageData/helpers.ts +0 -857
- package/src/pageData/misc.ts +0 -347
- package/src/pageData/navigation.ts +0 -842
- package/src/pageData/relationPages.ts +0 -1248
- package/src/pageData/relationTabs.ts +0 -286
- package/src/pageData/resourcePages.ts +0 -609
- package/src/pageData.test.ts +0 -1545
- package/src/pageData.ts +0 -341
- package/src/plugins/index.ts +0 -8
- package/src/plugins/themeEditor.test.ts +0 -36
- package/src/plugins/themeEditor.ts +0 -45
- package/src/react/AppShell.tsx +0 -251
- package/src/react/CollabExtensionFactoryRegistry.ts +0 -55
- package/src/react/CollabRoomContext.ts +0 -98
- package/src/react/CollabTextRendererRegistry.ts +0 -102
- package/src/react/CommandPalette.tsx +0 -375
- package/src/react/CurrentUserContext.tsx +0 -50
- package/src/react/CustomPageWrapperGate.tsx +0 -69
- package/src/react/CustomPageWrapperRegistry.ts +0 -45
- package/src/react/FieldFocusReporterRegistry.ts +0 -37
- package/src/react/FieldLabelSlotRegistry.ts +0 -30
- package/src/react/FieldPresenceRegistry.ts +0 -46
- package/src/react/FormCollabBindingRegistry.ts +0 -242
- package/src/react/FormStateContext.tsx +0 -591
- package/src/react/HeadHooks.tsx +0 -126
- package/src/react/MarkdownEditorRegistry.test.ts +0 -38
- package/src/react/MarkdownEditorRegistry.ts +0 -107
- package/src/react/NotificationActionStrip.tsx +0 -263
- package/src/react/NotificationBell.tsx +0 -426
- package/src/react/PendingSuggestionApplierRegistry.test.ts +0 -97
- package/src/react/PendingSuggestionApplierRegistry.ts +0 -98
- package/src/react/PendingSuggestionOverlayRegistry.ts +0 -54
- package/src/react/PendingSuggestionsContext.tsx +0 -172
- package/src/react/RecordWrapperGate.tsx +0 -58
- package/src/react/RecordWrapperRegistry.ts +0 -39
- package/src/react/RenderHookSlot.tsx +0 -32
- package/src/react/RightSidebar.tsx +0 -257
- package/src/react/RightSidebarContext.tsx +0 -234
- package/src/react/RightSidebarTrigger.tsx +0 -53
- package/src/react/RowCoordsContext.tsx +0 -23
- package/src/react/SchemaRenderer.tsx +0 -549
- package/src/react/SearchTrigger.tsx +0 -46
- package/src/react/ThemeProvider.tsx +0 -93
- package/src/react/ThemeSettingsPage.tsx +0 -579
- package/src/react/ThemeToggle.tsx +0 -20
- package/src/react/Toaster.tsx +0 -158
- package/src/react/UserMenu.tsx +0 -196
- package/src/react/WidgetDataContext.tsx +0 -157
- package/src/react/cells/EditableCell.tsx +0 -389
- package/src/react/component-slots.test.ts +0 -103
- package/src/react/component-slots.ts +0 -116
- package/src/react/fieldJsHandler.test.ts +0 -166
- package/src/react/fieldJsHandler.ts +0 -79
- package/src/react/fields/BuilderInput.tsx +0 -1078
- package/src/react/fields/CheckboxInput.tsx +0 -39
- package/src/react/fields/CheckboxListInput.tsx +0 -102
- package/src/react/fields/ColorInput.tsx +0 -71
- package/src/react/fields/DateFieldInput.tsx +0 -70
- package/src/react/fields/DateTimeInput.tsx +0 -62
- package/src/react/fields/FieldShell.tsx +0 -348
- package/src/react/fields/FileUploadInput.tsx +0 -639
- package/src/react/fields/HiddenInput.tsx +0 -17
- package/src/react/fields/KeyValueInput.tsx +0 -230
- package/src/react/fields/MarkdownInput.tsx +0 -560
- package/src/react/fields/RadioInput.tsx +0 -81
- package/src/react/fields/RepeaterInput.test.ts +0 -116
- package/src/react/fields/RepeaterInput.tsx +0 -1420
- package/src/react/fields/SelectFieldInput.tsx +0 -280
- package/src/react/fields/SliderInput.tsx +0 -81
- package/src/react/fields/TagsInput.tsx +0 -283
- package/src/react/fields/TextLikeInput.tsx +0 -256
- package/src/react/fields/ToggleButtonsInput.tsx +0 -60
- package/src/react/fields/ToggleFieldInput.tsx +0 -56
- package/src/react/fields/relationshipRenameDispatch.test.ts +0 -106
- package/src/react/fields/relationshipRenameDispatch.ts +0 -97
- package/src/react/fields/repeaterReconcile.test.ts +0 -114
- package/src/react/fields/repeaterReconcile.ts +0 -104
- package/src/react/fields/rowChromeButton.tsx +0 -336
- package/src/react/fields/rowState.ts +0 -106
- package/src/react/fields/syncRowGates.test.ts +0 -202
- package/src/react/fields/syncRowGates.ts +0 -66
- package/src/react/fields/textInputControls.tsx +0 -238
- package/src/react/fields/useRowReorderDnd.ts +0 -78
- package/src/react/formStateHelpers.test.ts +0 -508
- package/src/react/formStateHelpers.ts +0 -381
- package/src/react/hooks/use-mobile.ts +0 -19
- package/src/react/icon-context.tsx +0 -60
- package/src/react/index.ts +0 -195
- package/src/react/layouts/SidebarLayout.tsx +0 -250
- package/src/react/layouts/TopbarLayout.tsx +0 -258
- package/src/react/navigate.tsx +0 -37
- package/src/react/onProviderSynced.test.ts +0 -90
- package/src/react/parseRecordEditUrl.test.ts +0 -122
- package/src/react/parseRecordEditUrl.ts +0 -94
- package/src/react/persistedState.ts +0 -40
- package/src/react/registry.ts +0 -48
- package/src/react/right-panel-registry.tsx +0 -47
- package/src/react/schemaRenderer/AlertRenderer.tsx +0 -112
- package/src/react/schemaRenderer/EntryRenderer.tsx +0 -501
- package/src/react/schemaRenderer/SectionRenderer.tsx +0 -120
- package/src/react/schemaRenderer/SimpleElements.tsx +0 -306
- package/src/react/schemaRenderer/TabsRenderer.tsx +0 -62
- package/src/react/schemaRenderer/WizardRenderer.tsx +0 -338
- package/src/react/schemaRenderer/action/ActionGroupTrigger.tsx +0 -177
- package/src/react/schemaRenderer/action/ActionModalDialog.tsx +0 -273
- package/src/react/schemaRenderer/action/ConfirmActionDialog.tsx +0 -61
- package/src/react/schemaRenderer/action/HandlerActionButton.tsx +0 -43
- package/src/react/schemaRenderer/action/MethodActionButton.tsx +0 -64
- package/src/react/schemaRenderer/action/buttons.tsx +0 -99
- package/src/react/schemaRenderer/action/helpers.ts +0 -140
- package/src/react/schemaRenderer/action/renderAction.tsx +0 -245
- package/src/react/schemaRenderer/columnFormat.ts +0 -65
- package/src/react/schemaRenderer/constants.ts +0 -50
- package/src/react/schemaRenderer/form/FormRenderer.tsx +0 -274
- package/src/react/schemaRenderer/form/renderField.tsx +0 -511
- package/src/react/schemaRenderer/helpers.tsx +0 -81
- package/src/react/schemaRenderer/table/CardsLayoutBody.tsx +0 -308
- package/src/react/schemaRenderer/table/TableRenderer.tsx +0 -123
- package/src/react/schemaRenderer/table/TableRendererBody.tsx +0 -974
- package/src/react/schemaRenderer/table/filters.tsx +0 -1233
- package/src/react/schemaRenderer/table/formatCell.tsx +0 -264
- package/src/react/schemaRenderer/table/links.tsx +0 -112
- package/src/react/schemaRenderer/table/renderRowActions.tsx +0 -52
- package/src/react/schemaRenderer/table/url.tsx +0 -143
- package/src/react/theme-preview/apply.ts +0 -99
- package/src/react/theme-preview/build-html.ts +0 -436
- package/src/react/ui/button.tsx +0 -51
- package/src/react/ui/calendar.tsx +0 -67
- package/src/react/ui/checkbox.tsx +0 -29
- package/src/react/ui/dialog.tsx +0 -108
- package/src/react/ui/dropdown-menu.tsx +0 -97
- package/src/react/ui/input.tsx +0 -20
- package/src/react/ui/label.tsx +0 -21
- package/src/react/ui/popover.tsx +0 -50
- package/src/react/ui/select.tsx +0 -169
- package/src/react/ui/separator.tsx +0 -25
- package/src/react/ui/sheet.tsx +0 -136
- package/src/react/ui/sidebar.tsx +0 -723
- package/src/react/ui/skeleton.tsx +0 -13
- package/src/react/ui/slider.tsx +0 -34
- package/src/react/ui/switch.tsx +0 -28
- package/src/react/ui/table.tsx +0 -105
- package/src/react/ui/tabs.tsx +0 -63
- package/src/react/ui/textarea.tsx +0 -18
- package/src/react/ui/tooltip.tsx +0 -64
- package/src/react/useCollabSeed.ts +0 -86
- package/src/react/useResizableWidth.ts +0 -139
- package/src/react/utils.ts +0 -6
- package/src/react/widgetRegistry.test.ts +0 -43
- package/src/react/widgetRegistry.ts +0 -50
- package/src/react/widgets/StatsOverviewRenderer.tsx +0 -232
- package/src/react/widgets/TableWidgetRenderer.tsx +0 -231
- package/src/react/widgets/ViewRenderer.tsx +0 -71
- package/src/relationManagerData.test.ts +0 -1595
- package/src/richtext/index.ts +0 -8
- package/src/richtext/registry.ts +0 -89
- package/src/routes/globals.ts +0 -148
- package/src/routes/guard.test.ts +0 -325
- package/src/routes/helpers.ts +0 -700
- package/src/routes/pages.ts +0 -175
- package/src/routes/panel.ts +0 -204
- package/src/routes/relations.ts +0 -1227
- package/src/routes/resources.ts +0 -781
- package/src/routes/theme.ts +0 -91
- package/src/routes-nested-relations.test.ts +0 -676
- package/src/routes-relations.test.ts +0 -972
- package/src/routes.test.ts +0 -2027
- package/src/routes.ts +0 -303
- package/src/schema/Alert.test.ts +0 -109
- package/src/schema/Alert.ts +0 -131
- package/src/schema/Block.ts +0 -169
- package/src/schema/Breadcrumbs.ts +0 -40
- package/src/schema/Card.ts +0 -35
- package/src/schema/Divider.ts +0 -20
- package/src/schema/Element.ts +0 -219
- package/src/schema/EmptyState.test.ts +0 -37
- package/src/schema/EmptyState.ts +0 -63
- package/src/schema/Fieldset.ts +0 -43
- package/src/schema/Grid.ts +0 -43
- package/src/schema/Group.ts +0 -30
- package/src/schema/Heading.ts +0 -39
- package/src/schema/Html.ts +0 -67
- package/src/schema/Icon.ts +0 -54
- package/src/schema/Image.ts +0 -57
- package/src/schema/LinkTag.ts +0 -41
- package/src/schema/Markdown.ts +0 -85
- package/src/schema/MetaTag.ts +0 -41
- package/src/schema/RelationTabs.ts +0 -71
- package/src/schema/ScriptTag.ts +0 -55
- package/src/schema/Section.ts +0 -160
- package/src/schema/ServerDataElement.test.ts +0 -140
- package/src/schema/ServerDataElement.ts +0 -156
- package/src/schema/SlotComponent.test.ts +0 -77
- package/src/schema/SlotComponent.ts +0 -71
- package/src/schema/Split.ts +0 -50
- package/src/schema/Stat.test.ts +0 -118
- package/src/schema/Stat.ts +0 -154
- package/src/schema/StatsOverview.test.ts +0 -141
- package/src/schema/StatsOverview.ts +0 -119
- package/src/schema/StyleTag.ts +0 -35
- package/src/schema/TableWidget.test.ts +0 -297
- package/src/schema/TableWidget.ts +0 -289
- package/src/schema/Tabs.ts +0 -79
- package/src/schema/Text.ts +0 -58
- package/src/schema/UnorderedList.ts +0 -49
- package/src/schema/View.test.ts +0 -111
- package/src/schema/View.ts +0 -127
- package/src/schema/Wizard.ts +0 -220
- package/src/schema/containers.test.ts +0 -564
- package/src/schema/headTags.test.ts +0 -134
- package/src/schema/index.ts +0 -40
- package/src/schema/primes.test.ts +0 -269
- package/src/schema/resolveSchema.test.ts +0 -379
- package/src/schema/resolveSchema.ts +0 -917
- package/src/schema/sanitize.ts +0 -58
- package/src/search.test.ts +0 -446
- package/src/search.ts +0 -178
- package/src/sessionFilters.test.ts +0 -375
- package/src/sessionFilters.ts +0 -143
- package/src/slot-components/index.ts +0 -10
- package/src/slot-components/registry.ts +0 -56
- package/src/styles/file-upload.css +0 -13
- package/src/summarizers/Summarizer.test.ts +0 -84
- package/src/summarizers/Summarizer.ts +0 -123
- package/src/summarizers/index.ts +0 -11
- package/src/theme/base-colors.ts +0 -68
- package/src/theme/chart-colors.ts +0 -50
- package/src/theme/colors.ts +0 -447
- package/src/theme/generate-css.test.ts +0 -139
- package/src/theme/generate-css.ts +0 -44
- package/src/theme/generate-scale.test.ts +0 -106
- package/src/theme/generate-scale.ts +0 -97
- package/src/theme/icon-map.ts +0 -42
- package/src/theme/index.ts +0 -34
- package/src/theme/migrate.test.ts +0 -178
- package/src/theme/migrate.ts +0 -81
- package/src/theme/presets.ts +0 -135
- package/src/theme/radius.ts +0 -18
- package/src/theme/resolve.test.ts +0 -238
- package/src/theme/resolve.ts +0 -96
- package/src/theme/spacing.ts +0 -18
- package/src/theme/storage.test.ts +0 -126
- package/src/theme/storage.ts +0 -106
- package/src/theme/theme-colors.ts +0 -88
- package/src/theme/types.ts +0 -125
- package/src/uploads/UploadAdapter.ts +0 -35
- package/src/uploads/index.ts +0 -2
- package/src/uploads/localUpload.test.ts +0 -70
- package/src/uploads/localUpload.ts +0 -84
- package/src/validation/Validator.ts +0 -49
- package/src/validation/index.ts +0 -28
- package/src/validation/rules.ts +0 -78
- package/src/validation/runValidators.ts +0 -435
- package/src/validation/uniqueValidator.test.ts +0 -196
- package/src/validation/uniqueValidator.ts +0 -133
- package/src/validation/validators.test.ts +0 -268
- package/src/vite.test.ts +0 -184
- package/src/vite.ts +0 -787
- package/src/widgets/index.ts +0 -10
- package/src/widgets/registry.ts +0 -45
- package/src/widgets.test.ts +0 -592
- package/tsconfig.build.json +0 -11
- package/tsconfig.json +0 -4
- package/tsconfig.test.json +0 -10
- package/views/react/Dashboard.tsx +0 -27
- package/views/react/Resources/Form.tsx +0 -102
- package/views/react/Resources/Index.tsx +0 -49
package/src/schema/Block.ts
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import type { Element, ElementMeta } from './Element.js'
|
|
2
|
-
import type { LayoutContext, LayoutVisibilityRule } from './Element.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Wire-format metadata for a single block type — what `BuilderField`
|
|
6
|
-
* ships to the client so the block-picker UI can render the
|
|
7
|
-
* `Add block` dropdown AND so the renderer can render a freshly-picked
|
|
8
|
-
* block's empty children without an extra server roundtrip.
|
|
9
|
-
*
|
|
10
|
-
* The per-row resolved schema lives on each `BuilderRowMeta`; this is
|
|
11
|
-
* the empty-row blueprint (`template`) used when the user picks the
|
|
12
|
-
* block from the dropdown. Resolved server-side once per block via
|
|
13
|
-
* `resolveBuilderRows` against `values: {}` so any inner-field
|
|
14
|
-
* `default()` surfaces.
|
|
15
|
-
*/
|
|
16
|
-
export interface BlockMeta {
|
|
17
|
-
name: string
|
|
18
|
-
label: string
|
|
19
|
-
icon?: string
|
|
20
|
-
columns?: number
|
|
21
|
-
maxItems?: number
|
|
22
|
-
template: ElementMeta[]
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Single block-type definition consumed by `BuilderField.blocks([…])`.
|
|
27
|
-
* Mirrors Filament's `Block` primitive: a name, a label, an optional
|
|
28
|
-
* icon, and an inner `schema()` rendered when a row of this type is
|
|
29
|
-
* created.
|
|
30
|
-
*
|
|
31
|
-
* Not an `Element` — `Block` is a schema-author primitive (like `Tab`,
|
|
32
|
-
* `Step`, `ListTab` minus the discriminator-driven layout role) held
|
|
33
|
-
* by `BuilderField` and looked up per-row by name. Resolving each
|
|
34
|
-
* row's children happens inside `resolveBuilderRows`, which calls
|
|
35
|
-
* `resolveSchema` against `block.getSchema()` with row-scoped values.
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* Block.make('heading')
|
|
39
|
-
* .label('Heading')
|
|
40
|
-
* .icon('heading')
|
|
41
|
-
* .schema([
|
|
42
|
-
* TextField.make('text').required(),
|
|
43
|
-
* SelectField.make('level').options({ h1: 'H1', h2: 'H2' }),
|
|
44
|
-
* ])
|
|
45
|
-
* .columns(2)
|
|
46
|
-
* .maxItems(1) // only one Hero allowed per record
|
|
47
|
-
*/
|
|
48
|
-
export class Block {
|
|
49
|
-
readonly name: string
|
|
50
|
-
|
|
51
|
-
private _label?: string
|
|
52
|
-
private _icon?: string
|
|
53
|
-
private _columns?: number
|
|
54
|
-
private _maxItems?: number
|
|
55
|
-
private _schema: Element[] = []
|
|
56
|
-
private _visibleRule?: LayoutVisibilityRule
|
|
57
|
-
|
|
58
|
-
private constructor(name: string) {
|
|
59
|
-
this.name = name
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
static make(name: string): Block {
|
|
63
|
-
return new Block(name)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// ─── Builder ─────────────────────────────────────────
|
|
67
|
-
|
|
68
|
-
label(l: string): this { this._label = l; return this }
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Icon shown next to the block label in the picker dropdown and
|
|
72
|
-
* (when `Builder.blockIcons()` is on) in each row's header. String-only
|
|
73
|
-
* — resolved through the icon registry, mirroring `Section.icon` /
|
|
74
|
-
* `Tab.icon`. Component-typed icons are reserved for top-level
|
|
75
|
-
* (Resource / Global / Page) bindings that own a manifest entry.
|
|
76
|
-
*/
|
|
77
|
-
icon(name: string): this { this._icon = name; return this }
|
|
78
|
-
|
|
79
|
-
/** Inner form schema rendered when a row of this block type is added. */
|
|
80
|
-
schema(elements: Element[]): this { this._schema = elements; return this }
|
|
81
|
-
|
|
82
|
-
/** Grid column count for this block's inner schema. */
|
|
83
|
-
columns(n: number): this { this._columns = n; return this }
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Cap on how many rows of THIS block type may appear in a single
|
|
87
|
-
* `BuilderField`. Validator + client-side gate (the picker greys out
|
|
88
|
-
* the option once the cap is hit). Useful for "exactly one Hero" or
|
|
89
|
-
* "at most three callouts".
|
|
90
|
-
*/
|
|
91
|
-
maxItems(n: number): this { this._maxItems = n; return this }
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Conditionally hide this block from the Builder's picker dropdown.
|
|
95
|
-
* Rule shape mirrors `Element.visible()`: a literal `boolean` or a
|
|
96
|
-
* callback receiving a `LayoutContext` (`{ record, values, user, $get,
|
|
97
|
-
* $set }`). Async callbacks are awaited.
|
|
98
|
-
*
|
|
99
|
-
* Hidden blocks disappear from the picker only — existing rows of a
|
|
100
|
-
* now-hidden block keep rendering with their full schema, so toggling
|
|
101
|
-
* visibility on a feature flag never silently destroys content.
|
|
102
|
-
*
|
|
103
|
-
* Throwing → fail closed (block stays hidden), parallel to
|
|
104
|
-
* `Element.evaluateVisibility`'s posture for layout rules.
|
|
105
|
-
*/
|
|
106
|
-
visible(rule: LayoutVisibilityRule): this {
|
|
107
|
-
this._visibleRule = rule
|
|
108
|
-
return this
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Inverse of `visible()`. `hidden(true)` is `visible(false)`. */
|
|
112
|
-
hidden(rule: LayoutVisibilityRule): this {
|
|
113
|
-
if (typeof rule === 'boolean') {
|
|
114
|
-
this._visibleRule = !rule
|
|
115
|
-
} else {
|
|
116
|
-
this._visibleRule = async (ctx) => !(await rule(ctx))
|
|
117
|
-
}
|
|
118
|
-
return this
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
hasVisibilityRule(): boolean { return this._visibleRule !== undefined }
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Resolve the visibility rule against a context. Returns `true` when
|
|
125
|
-
* no rule is set; throwing rules return `false` and log a warning.
|
|
126
|
-
*/
|
|
127
|
-
async evaluateVisibility(ctx: LayoutContext = {}): Promise<boolean> {
|
|
128
|
-
const rule = this._visibleRule
|
|
129
|
-
if (rule === undefined) return true
|
|
130
|
-
if (typeof rule === 'boolean') return rule
|
|
131
|
-
try {
|
|
132
|
-
return Boolean(await rule(ctx))
|
|
133
|
-
} catch (err) {
|
|
134
|
-
console.warn(`[pilotiq] visible() rule on Block "${this.name}" threw:`, err)
|
|
135
|
-
return false
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// ─── Read-only access ────────────────────────────────
|
|
140
|
-
|
|
141
|
-
getLabel(): string {
|
|
142
|
-
return this._label ?? this.name.charAt(0).toUpperCase() + this.name.slice(1)
|
|
143
|
-
}
|
|
144
|
-
getIcon(): string | undefined { return this._icon }
|
|
145
|
-
getColumns(): number | undefined { return this._columns }
|
|
146
|
-
getMaxItems(): number | undefined { return this._maxItems }
|
|
147
|
-
getSchema(): Element[] { return this._schema }
|
|
148
|
-
|
|
149
|
-
// ─── Wire format ─────────────────────────────────────
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Bare picker meta. The `template` field is filled in by the resolver
|
|
153
|
-
* (it needs the surrounding `RenderContext` to walk the inner schema)
|
|
154
|
-
* — the no-arg `toMeta()` ships an empty array as a stable shape so
|
|
155
|
-
* non-resolver callers (e.g. unit tests, plain `Builder.toMeta()`)
|
|
156
|
-
* don't crash on a missing field.
|
|
157
|
-
*/
|
|
158
|
-
toMeta(): BlockMeta {
|
|
159
|
-
const meta: BlockMeta = {
|
|
160
|
-
name: this.name,
|
|
161
|
-
label: this.getLabel(),
|
|
162
|
-
template: [],
|
|
163
|
-
}
|
|
164
|
-
if (this._icon !== undefined) meta.icon = this._icon
|
|
165
|
-
if (this._columns !== undefined) meta.columns = this._columns
|
|
166
|
-
if (this._maxItems !== undefined) meta.maxItems = this._maxItems
|
|
167
|
-
return meta
|
|
168
|
-
}
|
|
169
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Phase C — one rung in the breadcrumb chain. A trailing item without
|
|
5
|
-
* a `url` is rendered as the current page (unlinked, `aria-current="page"`).
|
|
6
|
-
*/
|
|
7
|
-
export interface BreadcrumbItem {
|
|
8
|
-
label: string
|
|
9
|
-
url?: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Phase C — server-resolved breadcrumb strip. Page-data builders
|
|
14
|
-
* prepend it ahead of any other top-of-page chrome (e.g. RelationTabs)
|
|
15
|
-
* so the renderer can paint:
|
|
16
|
-
*
|
|
17
|
-
* Home / Posts / "Hello world" / Edit
|
|
18
|
-
*
|
|
19
|
-
* Users do not author this directly; the per-page-role builders in
|
|
20
|
-
* `pageData.ts` construct it via `Breadcrumbs.make([...])` after they've
|
|
21
|
-
* already loaded the parent / child records they need to derive titles.
|
|
22
|
-
*/
|
|
23
|
-
export class Breadcrumbs extends Element {
|
|
24
|
-
private constructor(private readonly _items: BreadcrumbItem[]) {
|
|
25
|
-
super()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
static make(items: BreadcrumbItem[]): Breadcrumbs {
|
|
29
|
-
return new Breadcrumbs(items)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
getType(): string { return 'breadcrumbs' }
|
|
33
|
-
|
|
34
|
-
toMeta() {
|
|
35
|
-
return {
|
|
36
|
-
type: 'breadcrumbs' as const,
|
|
37
|
-
items: this._items,
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
package/src/schema/Card.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
|
|
3
|
-
export class Card extends Element {
|
|
4
|
-
private _description?: string
|
|
5
|
-
|
|
6
|
-
private constructor(private _title?: string) {
|
|
7
|
-
super()
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
static make(title?: string): Card {
|
|
11
|
-
return new Card(title)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
description(d: string): this { this._description = d; return this }
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Set the child elements of this card. Children can be any Element —
|
|
18
|
-
* Fields, other display elements, Actions, etc. Resolved recursively
|
|
19
|
-
* by `resolveSchema()` and attached to meta as `meta.children`.
|
|
20
|
-
*/
|
|
21
|
-
schema(elements: Element[]): this {
|
|
22
|
-
this._children = elements
|
|
23
|
-
return this
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
getType(): string { return 'card' }
|
|
27
|
-
|
|
28
|
-
toMeta(): Record<string, unknown> {
|
|
29
|
-
return {
|
|
30
|
-
type: 'card' as const,
|
|
31
|
-
...(this._title ? { title: this._title } : {}),
|
|
32
|
-
...(this._description ? { description: this._description } : {}),
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
package/src/schema/Divider.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
|
|
3
|
-
export class Divider extends Element {
|
|
4
|
-
private constructor(private _label?: string) {
|
|
5
|
-
super()
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
static make(label?: string): Divider {
|
|
9
|
-
return new Divider(label)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
getType(): string { return 'divider' }
|
|
13
|
-
|
|
14
|
-
toMeta() {
|
|
15
|
-
return {
|
|
16
|
-
type: 'divider' as const,
|
|
17
|
-
...(this._label ? { label: this._label } : {}),
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
package/src/schema/Element.ts
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context passed to layout-level `visible / hidden` rules. Mirrors
|
|
3
|
-
* `ConditionContext` in `fields/Field.ts` (same shape) so authors can
|
|
4
|
-
* destructure identically: `visible(({ $get }) => $get('kind') === 'a')`.
|
|
5
|
-
*
|
|
6
|
-
* Defined here (rather than importing from Field) so `Element` stays the
|
|
7
|
-
* lowest-dependency module in the schema folder — Field already imports
|
|
8
|
-
* from Element, not the other way around.
|
|
9
|
-
*/
|
|
10
|
-
export interface LayoutContext {
|
|
11
|
-
record?: unknown
|
|
12
|
-
values?: Record<string, unknown>
|
|
13
|
-
$get?: (name: string) => unknown
|
|
14
|
-
$set?: (name: string, value: unknown) => void
|
|
15
|
-
user?: unknown
|
|
16
|
-
/**
|
|
17
|
-
* Plan #14 — present only when this layout element is being resolved
|
|
18
|
-
* inside a Repeater row. `row.index` is the row's position; `row.$get
|
|
19
|
-
* / $set` are row-local. `ctx.values` is automatically scoped to the
|
|
20
|
-
* row when present, so most callbacks just destructure `values`; `row`
|
|
21
|
-
* is the explicit access path.
|
|
22
|
-
*/
|
|
23
|
-
row?: {
|
|
24
|
-
index: number
|
|
25
|
-
$get: (name: string) => unknown
|
|
26
|
-
$set: (name: string, value: unknown) => void
|
|
27
|
-
/**
|
|
28
|
-
* Present only when the row lives inside a `BuilderField` — the row's
|
|
29
|
-
* block name (the `type` discriminator). Lets a single `itemHidden` /
|
|
30
|
-
* `itemCanDelete` / `itemCanClone` / `itemCanReorder` rule branch by
|
|
31
|
-
* block without checking `values` shape. Always `undefined` for
|
|
32
|
-
* `RepeaterField` rows (which are homogeneous).
|
|
33
|
-
*/
|
|
34
|
-
blockType?: string
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Layout-level visibility rule. Either a literal `boolean` (useful for
|
|
40
|
-
* one-off feature flags) or a callback receiving a `LayoutContext`.
|
|
41
|
-
* Callbacks may be async — the resolver awaits before deciding.
|
|
42
|
-
*
|
|
43
|
-
* Plan #8 adds this to every `Element` subclass except `Field` and
|
|
44
|
-
* `Action`, which already own their own visibility paths
|
|
45
|
-
* (`showWhen / hideWhen / hideFromMode` on Field; `.visible / .hidden` on
|
|
46
|
-
* Action). The resolver only consults `_visibleRule` for layout
|
|
47
|
-
* elements — see `resolveSchema.ts` for the gating logic.
|
|
48
|
-
*/
|
|
49
|
-
export type LayoutVisibilityRule =
|
|
50
|
-
| boolean
|
|
51
|
-
| ((ctx: LayoutContext) => boolean | Promise<boolean>)
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Positional control inside a `Grid` / `Split` parent. Emitted under
|
|
55
|
-
* `meta._layout` and mapped to Tailwind utility classes (`col-span-*`,
|
|
56
|
-
* `col-start-*`, `order-*`) by the renderer. Outside a grid/split the
|
|
57
|
-
* keys are still emitted but the renderer ignores them.
|
|
58
|
-
*/
|
|
59
|
-
export interface LayoutPositioning {
|
|
60
|
-
columnSpan?: number
|
|
61
|
-
columnStart?: number
|
|
62
|
-
columnOrder?: number
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Base class for everything that can appear in a schema tree.
|
|
67
|
-
*
|
|
68
|
-
* `Field` (form input), `Action` (handler), and the display elements
|
|
69
|
-
* (Text, Heading, Card, Section, Stat, ...) all extend this class. Container
|
|
70
|
-
* elements populate `_children` to nest other Elements; leaves leave it
|
|
71
|
-
* undefined.
|
|
72
|
-
*
|
|
73
|
-
* The contract is intentionally tiny — `getType()` to identify, `toMeta()`
|
|
74
|
-
* to serialize. Everything else (visibility flags, validation, persistence)
|
|
75
|
-
* is layered on by specialized subclasses (Phase 1.2+).
|
|
76
|
-
*/
|
|
77
|
-
export abstract class Element {
|
|
78
|
-
protected _children?: Element[]
|
|
79
|
-
|
|
80
|
-
// ─── Plan #8 layout-level state ───────────────────────
|
|
81
|
-
protected _visibleRule?: LayoutVisibilityRule
|
|
82
|
-
protected _columnSpan?: number
|
|
83
|
-
protected _columnStart?: number
|
|
84
|
-
protected _columnOrder?: number
|
|
85
|
-
|
|
86
|
-
/** Discriminator string. Used by the resolver and the client renderer. */
|
|
87
|
-
abstract getType(): string
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Serialize this element's own state (excluding children) to a JSON-safe
|
|
91
|
-
* object. Children are handled by the resolver — do NOT inline them here.
|
|
92
|
-
*
|
|
93
|
-
* May return a Promise — reactive Field subclasses (Plan #5) compute
|
|
94
|
-
* dependent options asynchronously by awaiting a user-supplied function.
|
|
95
|
-
* The resolver awaits before merging children meta.
|
|
96
|
-
*/
|
|
97
|
-
abstract toMeta(): Record<string, unknown> | Promise<Record<string, unknown>>
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Children of a container element, or `undefined` for leaves. The resolver
|
|
101
|
-
* walks this to build the nested meta tree.
|
|
102
|
-
*/
|
|
103
|
-
getChildren(): Element[] | undefined {
|
|
104
|
-
return this._children
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// ─── Layout visibility (Plan #8) ──────────────────────
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Show this element only when the predicate returns `true` (or is set
|
|
111
|
-
* to `true` literally). Throwing predicates fail closed (treated as
|
|
112
|
-
* `false`). The resolver evaluates this per resolve cycle and drops
|
|
113
|
-
* the element from the meta tree when it returns false. Plan #8.
|
|
114
|
-
*
|
|
115
|
-
* Field subclasses use the existing `showWhen / hideWhen` API — this
|
|
116
|
-
* setter on a Field is a no-op (Field's own visibility logic wins).
|
|
117
|
-
* Action subclasses use the existing `.visible / .hidden` API.
|
|
118
|
-
*/
|
|
119
|
-
visible(rule: LayoutVisibilityRule): this {
|
|
120
|
-
this._visibleRule = rule
|
|
121
|
-
return this
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Inverse of `visible()`. `hidden(true)` is the same as `visible(false)`;
|
|
126
|
-
* `hidden(fn)` shows the element when `fn` returns `false`.
|
|
127
|
-
*/
|
|
128
|
-
hidden(rule: LayoutVisibilityRule): this {
|
|
129
|
-
if (typeof rule === 'boolean') {
|
|
130
|
-
this._visibleRule = !rule
|
|
131
|
-
} else {
|
|
132
|
-
this._visibleRule = async (ctx) => !(await rule(ctx))
|
|
133
|
-
}
|
|
134
|
-
return this
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
hasVisibilityRule(): boolean {
|
|
138
|
-
return this._visibleRule !== undefined
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
getVisibilityRule(): LayoutVisibilityRule | undefined {
|
|
142
|
-
return this._visibleRule
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Resolve the visibility rule against a context. Returns `true` when no
|
|
147
|
-
* rule is set. Async — callbacks may return a Promise. Throwing
|
|
148
|
-
* callbacks resolve to `false` and log a warning, mirroring
|
|
149
|
-
* `Action.evaluate`'s fail-closed posture.
|
|
150
|
-
*/
|
|
151
|
-
async evaluateVisibility(ctx: LayoutContext = {}): Promise<boolean> {
|
|
152
|
-
const rule = this._visibleRule
|
|
153
|
-
if (rule === undefined) return true
|
|
154
|
-
if (typeof rule === 'boolean') return rule
|
|
155
|
-
try {
|
|
156
|
-
return Boolean(await rule(ctx))
|
|
157
|
-
} catch (err) {
|
|
158
|
-
console.warn(`[pilotiq] visible() rule on ${this.getType()} threw:`, err)
|
|
159
|
-
return false
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// ─── Layout positioning (Plan #8) ─────────────────────
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Span `n` columns inside a parent `Grid` or `Split`. No-op when the
|
|
167
|
-
* element isn't inside a grid container — the meta still emits the
|
|
168
|
-
* hint, the renderer simply ignores it. Tailwind only generates
|
|
169
|
-
* `col-span-1..N` for the parent's column count, so values larger
|
|
170
|
-
* than the parent count are clamped at render.
|
|
171
|
-
*/
|
|
172
|
-
columnSpan(n: number): this {
|
|
173
|
-
this._columnSpan = n
|
|
174
|
-
return this
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** Start at column `n` (1-indexed) inside a parent grid. */
|
|
178
|
-
columnStart(n: number): this {
|
|
179
|
-
this._columnStart = n
|
|
180
|
-
return this
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** CSS `order` for reordering siblings on small viewports. */
|
|
184
|
-
columnOrder(n: number): this {
|
|
185
|
-
this._columnOrder = n
|
|
186
|
-
return this
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Build the layout-positioning bag. Returns `undefined` when no
|
|
191
|
-
* positioning method has been called — keeps `_layout` off the meta
|
|
192
|
-
* for the common case where authors don't customize.
|
|
193
|
-
*/
|
|
194
|
-
getLayoutPositioning(): LayoutPositioning | undefined {
|
|
195
|
-
if (this._columnSpan === undefined &&
|
|
196
|
-
this._columnStart === undefined &&
|
|
197
|
-
this._columnOrder === undefined) {
|
|
198
|
-
return undefined
|
|
199
|
-
}
|
|
200
|
-
const out: LayoutPositioning = {}
|
|
201
|
-
if (this._columnSpan !== undefined) out.columnSpan = this._columnSpan
|
|
202
|
-
if (this._columnStart !== undefined) out.columnStart = this._columnStart
|
|
203
|
-
if (this._columnOrder !== undefined) out.columnOrder = this._columnOrder
|
|
204
|
-
return out
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Resolved metadata — JSON-serializable, sent to the client via viewProps.
|
|
210
|
-
*
|
|
211
|
-
* `type` is the discriminator from `Element.getType()`. `children` (when
|
|
212
|
-
* present) is the resolved meta tree of the element's children.
|
|
213
|
-
*/
|
|
214
|
-
export type ElementMeta = Record<string, unknown> & {
|
|
215
|
-
type: string
|
|
216
|
-
children?: ElementMeta[]
|
|
217
|
-
/** Plan #8 — emitted only when the element used `columnSpan/Start/Order`. */
|
|
218
|
-
_layout?: LayoutPositioning
|
|
219
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { EmptyState } from './EmptyState.js'
|
|
5
|
-
import { Action } from '../actions/Action.js'
|
|
6
|
-
|
|
7
|
-
describe('EmptyState schema primitive', () => {
|
|
8
|
-
it('emits heading + contained:true by default', () => {
|
|
9
|
-
const meta = EmptyState.make('No reports yet').toMeta()
|
|
10
|
-
assert.equal(meta.type, 'emptyState')
|
|
11
|
-
assert.equal(meta.heading, 'No reports yet')
|
|
12
|
-
assert.equal(meta.contained, true)
|
|
13
|
-
assert.equal('description' in meta, false)
|
|
14
|
-
assert.equal('icon' in meta, false)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('emits description / icon when set', () => {
|
|
18
|
-
const meta = EmptyState.make('Empty')
|
|
19
|
-
.description('Add your first item')
|
|
20
|
-
.icon('file-text')
|
|
21
|
-
.toMeta()
|
|
22
|
-
assert.equal(meta.description, 'Add your first item')
|
|
23
|
-
assert.equal(meta.icon, 'file-text')
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
it('contained(false) flips the wrapper flag', () => {
|
|
27
|
-
const meta = EmptyState.make('Empty').contained(false).toMeta()
|
|
28
|
-
assert.equal(meta.contained, false)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('footer(actions) lands on the children pipe (resolved by walker)', () => {
|
|
32
|
-
const create = Action.make('create').label('Create')
|
|
33
|
-
const empty = EmptyState.make('No rows').footer([create])
|
|
34
|
-
// _children is the pre-resolve slot the schema walker reads.
|
|
35
|
-
assert.equal(Array.isArray(empty['_children' as keyof typeof empty]), true)
|
|
36
|
-
})
|
|
37
|
-
})
|
package/src/schema/EmptyState.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
import type { Action } from '../actions/Action.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Schema-level empty-state primitive — distinct from `Table.emptyState`
|
|
6
|
-
* (which is table-chrome). Use this when an entire page section, custom
|
|
7
|
-
* page, or dashboard zone has nothing to show. Drops into any layout
|
|
8
|
-
* the same way as `Heading` / `Text` / `Alert` do.
|
|
9
|
-
*
|
|
10
|
-
* EmptyState.make('No reports yet')
|
|
11
|
-
* .description('Create your first report to get started.')
|
|
12
|
-
* .icon('file-text')
|
|
13
|
-
* .footer([Action::make('create').url('/admin/reports/create')])
|
|
14
|
-
*
|
|
15
|
-
* v1 ships heading + description + icon + footer + `contained()`. Per-
|
|
16
|
-
* page-mode visibility, columnSpan etc. inherit from `Element`.
|
|
17
|
-
*/
|
|
18
|
-
export class EmptyState extends Element {
|
|
19
|
-
private _description?: string
|
|
20
|
-
private _icon?: string
|
|
21
|
-
private _contained: boolean = true
|
|
22
|
-
|
|
23
|
-
private constructor(private heading: string) {
|
|
24
|
-
super()
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
static make(heading: string): EmptyState {
|
|
28
|
-
return new EmptyState(heading)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
description(d: string): this { this._description = d; return this }
|
|
32
|
-
icon(name: string): this { this._icon = name; return this }
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Disable the default card-styled wrapper (background + border +
|
|
36
|
-
* padding) — useful when nesting inside another container that
|
|
37
|
-
* already brings its own chrome. Default `true` (contained).
|
|
38
|
-
*/
|
|
39
|
-
contained(v = true): this { this._contained = v; return this }
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Action buttons rendered below the description. Same shape as
|
|
43
|
-
* `Heading.actions(...)` — actions land on `_children` and serialize
|
|
44
|
-
* through the standard schema walker so `Action.evaluate(ctx)` for
|
|
45
|
-
* visibility / authorize fires unchanged.
|
|
46
|
-
*/
|
|
47
|
-
footer(actions: Action[]): this {
|
|
48
|
-
this._children = actions
|
|
49
|
-
return this
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
override getType(): string { return 'emptyState' }
|
|
53
|
-
|
|
54
|
-
override toMeta() {
|
|
55
|
-
return {
|
|
56
|
-
type: 'emptyState' as const,
|
|
57
|
-
heading: this.heading,
|
|
58
|
-
contained: this._contained,
|
|
59
|
-
...(this._description ? { description: this._description } : {}),
|
|
60
|
-
...(this._icon ? { icon: this._icon } : {}),
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
package/src/schema/Fieldset.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Lightweight labeled container. Renders as `<fieldset><legend>` with a
|
|
5
|
-
* thin border + small horizontal padding. Lighter than `Section` — no
|
|
6
|
-
* description, no collapsible disclosure, no badge. Use when fields share
|
|
7
|
-
* a topic but the page already has section-level chrome.
|
|
8
|
-
*
|
|
9
|
-
* Optional `.columns(n)` produces a multi-column layout the same way
|
|
10
|
-
* `Section.columns()` does. Outside of forms, Fieldset still renders the
|
|
11
|
-
* border + legend; the renderer treats `<legend>` as a small heading
|
|
12
|
-
* regardless of context.
|
|
13
|
-
*/
|
|
14
|
-
export class Fieldset extends Element {
|
|
15
|
-
private _columns: 1 | 2 | 3 = 1
|
|
16
|
-
|
|
17
|
-
private constructor(private _label: string) {
|
|
18
|
-
super()
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
static make(label: string): Fieldset {
|
|
22
|
-
return new Fieldset(label)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Number of columns the fieldset's children are laid out in. Default 1. */
|
|
26
|
-
columns(n: 1 | 2 | 3): this { this._columns = n; return this }
|
|
27
|
-
|
|
28
|
-
/** Set the children. Any Element type is accepted. */
|
|
29
|
-
schema(elements: Element[]): this {
|
|
30
|
-
this._children = elements
|
|
31
|
-
return this
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
getType(): string { return 'fieldset' }
|
|
35
|
-
|
|
36
|
-
toMeta(): Record<string, unknown> {
|
|
37
|
-
return {
|
|
38
|
-
type: 'fieldset' as const,
|
|
39
|
-
label: this._label,
|
|
40
|
-
columns: this._columns,
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
package/src/schema/Grid.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Element } from './Element.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Layout container that arranges its children in a column grid. Lighter than
|
|
5
|
-
* `Section` — no title, no description, no collapsible disclosure. Use it
|
|
6
|
-
* for ad-hoc multi-column layouts (e.g. side-by-side fields without a
|
|
7
|
-
* surrounding form section).
|
|
8
|
-
*
|
|
9
|
-
* `columns` defaults to 2 and accepts any positive integer; the client
|
|
10
|
-
* renderer is expected to clamp to a sensible max.
|
|
11
|
-
*/
|
|
12
|
-
export class Grid extends Element {
|
|
13
|
-
private _columns = 2
|
|
14
|
-
private _gap?: number
|
|
15
|
-
|
|
16
|
-
private constructor() {
|
|
17
|
-
super()
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static make(): Grid {
|
|
21
|
-
return new Grid()
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
columns(n: number): this { this._columns = n; return this }
|
|
25
|
-
|
|
26
|
-
/** Optional gap between cells (units interpreted by the client renderer). */
|
|
27
|
-
gap(n: number): this { this._gap = n; return this }
|
|
28
|
-
|
|
29
|
-
schema(elements: Element[]): this {
|
|
30
|
-
this._children = elements
|
|
31
|
-
return this
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
getType(): string { return 'grid' }
|
|
35
|
-
|
|
36
|
-
toMeta(): Record<string, unknown> {
|
|
37
|
-
return {
|
|
38
|
-
type: 'grid' as const,
|
|
39
|
-
columns: this._columns,
|
|
40
|
-
...(this._gap !== undefined ? { gap: this._gap } : {}),
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|