@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/entries/Entry.ts
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { Element, type ElementMeta } from '../schema/Element.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Per-record formatter callback. Receives the resolved state value and the
|
|
6
|
-
* full record; returns the rendered string. Runs server-side at resolve
|
|
7
|
-
* time — output is stamped on `EntryMeta._formatted` so the renderer can
|
|
8
|
-
* skip re-running the format spec.
|
|
9
|
-
*/
|
|
10
|
-
export type EntryFormatStateHandler = (
|
|
11
|
-
value: unknown,
|
|
12
|
-
record: Record<string, unknown>,
|
|
13
|
-
) => string
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Override for `Entry.resolveValue`. String form is dotted-path traversal
|
|
17
|
-
* (`'author.name'`, `'tags.0.name'`); function form runs the user handler
|
|
18
|
-
* with the full record. Used for joins, computed columns, or anywhere the
|
|
19
|
-
* value isn't `record[name]`.
|
|
20
|
-
*/
|
|
21
|
-
export type EntryStateResolver =
|
|
22
|
-
| string
|
|
23
|
-
| ((record: Record<string, unknown>) => unknown)
|
|
24
|
-
|
|
25
|
-
/** Built-in formatters — same shape as `ColumnFormat` so the renderer
|
|
26
|
-
* reuses `applyColumnFormat()` unchanged. */
|
|
27
|
-
export type EntryFormat =
|
|
28
|
-
| { kind: 'dateTime'; pattern?: string }
|
|
29
|
-
| { kind: 'since' }
|
|
30
|
-
| { kind: 'money'; currency: string; locale?: string }
|
|
31
|
-
| { kind: 'numeric'; decimals?: number; locale?: string }
|
|
32
|
-
| { kind: 'limit'; chars: number }
|
|
33
|
-
|
|
34
|
-
export type EntryWeight = 'normal' | 'medium' | 'semibold' | 'bold'
|
|
35
|
-
export type EntryColor = 'default' | 'muted' | 'primary' | 'destructive' | 'success' | 'warning' | 'info'
|
|
36
|
-
export type EntrySize = 'xs' | 'sm' | 'base' | 'lg' | 'xl'
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* JSON shape sent to the client for every entry. Subclasses extend the
|
|
40
|
-
* union via `entryType` (`'text' | 'badge' | 'icon' | 'image'`) and
|
|
41
|
-
* tack on subclass-specific keys without further widening.
|
|
42
|
-
*/
|
|
43
|
-
export interface EntryMeta extends ElementMeta {
|
|
44
|
-
type: 'entry'
|
|
45
|
-
entryType: string
|
|
46
|
-
name: string
|
|
47
|
-
label: string
|
|
48
|
-
value: unknown
|
|
49
|
-
inlineLabel?: boolean
|
|
50
|
-
default?: string
|
|
51
|
-
helperText?: string
|
|
52
|
-
tooltip?: string
|
|
53
|
-
weight?: EntryWeight
|
|
54
|
-
color?: EntryColor
|
|
55
|
-
size?: EntrySize
|
|
56
|
-
format?: EntryFormat
|
|
57
|
-
copyable?: { label?: string }
|
|
58
|
-
/**
|
|
59
|
-
* Server-evaluated `formatStateUsing` output. The renderer prefers this
|
|
60
|
-
* over re-applying `format` when present (mirrors the `Column._formatted`
|
|
61
|
-
* convention from Plan #2).
|
|
62
|
-
*/
|
|
63
|
-
_formatted?: string
|
|
64
|
-
lineClamp?: number
|
|
65
|
-
wrap?: boolean
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Read-only sibling of `Field`. Renders a label-value pair on `ViewPage`
|
|
70
|
-
* (or anywhere `Resource.detail()` returns elements).
|
|
71
|
-
*
|
|
72
|
-
* Entries resolve their value from `ctx.record[name]` at meta-build time
|
|
73
|
-
* — they're inert templates with no input components, no validators, no
|
|
74
|
-
* submit chrome. The cosmetic surface (`color / weight / size / tooltip`)
|
|
75
|
-
* mirrors the `Column` chrome so rows of a table and detail-page entries
|
|
76
|
-
* stay visually consistent.
|
|
77
|
-
*
|
|
78
|
-
* Subclasses set the `entryType` discriminator (`'text' | 'badge' | …`)
|
|
79
|
-
* which the renderer dispatches on; everything else lives on the base.
|
|
80
|
-
*/
|
|
81
|
-
export abstract class Entry extends Element {
|
|
82
|
-
protected _name: string
|
|
83
|
-
protected _label?: string
|
|
84
|
-
protected _inlineLabel = false
|
|
85
|
-
protected _default?: string
|
|
86
|
-
protected _helperText?: string
|
|
87
|
-
protected _tooltip?: string
|
|
88
|
-
protected _weight?: EntryWeight
|
|
89
|
-
protected _color?: EntryColor
|
|
90
|
-
protected _size?: EntrySize
|
|
91
|
-
protected _format?: EntryFormat
|
|
92
|
-
protected _formatState?: EntryFormatStateHandler
|
|
93
|
-
protected _state?: EntryStateResolver
|
|
94
|
-
protected _copyable?: { label?: string }
|
|
95
|
-
protected _lineClamp?: number
|
|
96
|
-
protected _wrap = false
|
|
97
|
-
|
|
98
|
-
protected constructor(name: string) {
|
|
99
|
-
super()
|
|
100
|
-
this._name = name
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** Subclasses set the wire-side discriminator (`'text' | 'badge' | …`). */
|
|
104
|
-
protected abstract getEntryType(): string
|
|
105
|
-
|
|
106
|
-
getType(): string { return 'entry' }
|
|
107
|
-
getName(): string { return this._name }
|
|
108
|
-
|
|
109
|
-
// ─── Chrome ───────────────────────────────────────────
|
|
110
|
-
|
|
111
|
-
/** Override the auto-derived label. Default = startCase of `name`. */
|
|
112
|
-
label(text: string): this { this._label = text; return this }
|
|
113
|
-
|
|
114
|
-
/** Render label to the left of the value rather than above it. */
|
|
115
|
-
inlineLabel(v = true): this { this._inlineLabel = v; return this }
|
|
116
|
-
|
|
117
|
-
/** Fallback string when the resolved value is null / undefined / empty. */
|
|
118
|
-
default(s: string): this { this._default = s; return this }
|
|
119
|
-
/** Alias matching the field-side spelling. */
|
|
120
|
-
placeholder(s: string): this { return this.default(s) }
|
|
121
|
-
|
|
122
|
-
helperText(text: string): this { this._helperText = text; return this }
|
|
123
|
-
tooltip(text: string): this { this._tooltip = text; return this }
|
|
124
|
-
|
|
125
|
-
weight(w: EntryWeight): this { this._weight = w; return this }
|
|
126
|
-
color(c: EntryColor): this { this._color = c; return this }
|
|
127
|
-
size(s: EntrySize): this { this._size = s; return this }
|
|
128
|
-
|
|
129
|
-
/** Truncate the value with an ellipsis when it spills onto more than `n`
|
|
130
|
-
* lines (CSS `-webkit-line-clamp`). Mutually exclusive with `wrap()`. */
|
|
131
|
-
lineClamp(n: number): this { this._lineClamp = n; return this }
|
|
132
|
-
|
|
133
|
-
/** Allow the value to wrap onto multiple lines. Without this the value
|
|
134
|
-
* is rendered with `whitespace-nowrap`. */
|
|
135
|
-
wrap(v = true): this { this._wrap = v; return this }
|
|
136
|
-
|
|
137
|
-
// ─── Built-in formatters (mirrors Column) ─────────────
|
|
138
|
-
|
|
139
|
-
dateTime(pattern?: string): this {
|
|
140
|
-
this._format = pattern ? { kind: 'dateTime', pattern } : { kind: 'dateTime' }
|
|
141
|
-
return this
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
since(): this {
|
|
145
|
-
this._format = { kind: 'since' }
|
|
146
|
-
return this
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
money(currency: string, locale?: string): this {
|
|
150
|
-
this._format = locale ? { kind: 'money', currency, locale } : { kind: 'money', currency }
|
|
151
|
-
return this
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
numeric(opts: { decimals?: number; locale?: string } = {}): this {
|
|
155
|
-
this._format = {
|
|
156
|
-
kind: 'numeric',
|
|
157
|
-
...(opts.decimals !== undefined ? { decimals: opts.decimals } : {}),
|
|
158
|
-
...(opts.locale !== undefined ? { locale: opts.locale } : {}),
|
|
159
|
-
}
|
|
160
|
-
return this
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
limit(chars: number): this {
|
|
164
|
-
this._format = { kind: 'limit', chars }
|
|
165
|
-
return this
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/** Per-record formatter — receives the resolved state value and the full
|
|
169
|
-
* record, returns the display string. Wins over `format` when both are
|
|
170
|
-
* set (output stamped on `_formatted`). */
|
|
171
|
-
formatStateUsing(fn: EntryFormatStateHandler): this {
|
|
172
|
-
this._formatState = fn
|
|
173
|
-
return this
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/** Render a copy-icon button next to the value. v1 copies via the
|
|
177
|
-
* client `navigator.clipboard.writeText` of the *raw* state value, or
|
|
178
|
-
* the formatted string when `formatStateUsing` is set. */
|
|
179
|
-
copyable(label?: string): this {
|
|
180
|
-
this._copyable = label !== undefined ? { label } : {}
|
|
181
|
-
return this
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Override the default `record[name]` lookup. String form does dotted-
|
|
186
|
-
* path traversal — `'author.name'`, `'tags.0.label'`; missing
|
|
187
|
-
* intermediates resolve to `undefined`. Function form runs the
|
|
188
|
-
* user-supplied accessor with the full record.
|
|
189
|
-
*
|
|
190
|
-
* The entry's `name` still drives the auto-derived label and the wire-
|
|
191
|
-
* side discriminator key, so use `.label(...)` alongside when the path
|
|
192
|
-
* doesn't read well as a heading.
|
|
193
|
-
*
|
|
194
|
-
* @example
|
|
195
|
-
* TextEntry.make('authorName').state('author.name').label('Author')
|
|
196
|
-
* TextEntry.make('total').state(r => Number(r.subtotal) + Number(r.tax))
|
|
197
|
-
*/
|
|
198
|
-
state(resolver: EntryStateResolver): this {
|
|
199
|
-
this._state = resolver
|
|
200
|
-
return this
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// ─── Resolution ───────────────────────────────────────
|
|
204
|
-
|
|
205
|
-
/** Read the state value out of the loaded record. Honors `state()`
|
|
206
|
-
* override (string dotted-path or accessor fn) when set; otherwise
|
|
207
|
-
* falls back to `record[name]`. */
|
|
208
|
-
resolveValue(ctx?: RenderContext): unknown {
|
|
209
|
-
const record = ctx?.record as Record<string, unknown> | undefined
|
|
210
|
-
if (record === undefined || record === null) return undefined
|
|
211
|
-
if (this._state === undefined) return record[this._name]
|
|
212
|
-
if (typeof this._state === 'function') {
|
|
213
|
-
try { return this._state(record) }
|
|
214
|
-
catch { return undefined }
|
|
215
|
-
}
|
|
216
|
-
return readDottedPath(record, this._state)
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/** Default label = startCase of the attribute name. */
|
|
220
|
-
protected deriveLabel(): string {
|
|
221
|
-
if (this._label !== undefined) return this._label
|
|
222
|
-
if (!this._name) return ''
|
|
223
|
-
return this._name
|
|
224
|
-
.replace(/([A-Z])/g, ' $1')
|
|
225
|
-
.replace(/[_-]+/g, ' ')
|
|
226
|
-
.replace(/^./, c => c.toUpperCase())
|
|
227
|
-
.trim()
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Build the wire-side meta. Subclasses override to add type-specific
|
|
232
|
-
* keys; all should call `super.toMeta(ctx)` first and spread.
|
|
233
|
-
*
|
|
234
|
-
* Async because `formatStateUsing` may want to await a lookup; v1
|
|
235
|
-
* callers pass synchronous handlers but the contract leaves room.
|
|
236
|
-
*/
|
|
237
|
-
toMeta(ctx?: RenderContext): EntryMeta | Promise<EntryMeta> {
|
|
238
|
-
const value = this.resolveValue(ctx)
|
|
239
|
-
const record = (ctx?.record ?? {}) as Record<string, unknown>
|
|
240
|
-
|
|
241
|
-
const meta: EntryMeta = {
|
|
242
|
-
type: 'entry',
|
|
243
|
-
entryType: this.getEntryType(),
|
|
244
|
-
name: this._name,
|
|
245
|
-
label: this.deriveLabel(),
|
|
246
|
-
value,
|
|
247
|
-
}
|
|
248
|
-
if (this._inlineLabel) meta.inlineLabel = true
|
|
249
|
-
if (this._default !== undefined) meta.default = this._default
|
|
250
|
-
if (this._helperText !== undefined) meta.helperText = this._helperText
|
|
251
|
-
if (this._tooltip !== undefined) meta.tooltip = this._tooltip
|
|
252
|
-
if (this._weight !== undefined) meta.weight = this._weight
|
|
253
|
-
if (this._color !== undefined) meta.color = this._color
|
|
254
|
-
if (this._size !== undefined) meta.size = this._size
|
|
255
|
-
if (this._format !== undefined) meta.format = this._format
|
|
256
|
-
if (this._copyable !== undefined) meta.copyable = this._copyable
|
|
257
|
-
if (this._lineClamp !== undefined) meta.lineClamp = this._lineClamp
|
|
258
|
-
if (this._wrap) meta.wrap = true
|
|
259
|
-
|
|
260
|
-
if (this._formatState) {
|
|
261
|
-
try {
|
|
262
|
-
meta._formatted = this._formatState(value, record)
|
|
263
|
-
} catch {
|
|
264
|
-
// Fail-soft — drop the formatted string and let the client fall
|
|
265
|
-
// back to the raw value or built-in `format`. Matches the
|
|
266
|
-
// posture of `Column.formatStateUsing` (errors don't crash the
|
|
267
|
-
// page-data builder).
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
return meta
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/** Type guard mirroring `isServerDataElement` / `isRepeaterField`. Lets
|
|
276
|
-
* walkers branch on entries without `instanceof`-tripping over Vite
|
|
277
|
-
* module-cache duplication (`feedback_vite_ssr_module_dup_instanceof`). */
|
|
278
|
-
export function isEntry(el: Element): el is Entry {
|
|
279
|
-
return el.getType() === 'entry'
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/** Walk a dotted path against an arbitrary record / array shape; bail to
|
|
283
|
-
* `undefined` on any missing intermediate. Numeric segments index into
|
|
284
|
-
* arrays. Inlined here rather than reused from `dispatchForm.ts` because
|
|
285
|
-
* Entry has no other dependency on the form pipeline and keeping the
|
|
286
|
-
* schema layer free of submit-side imports avoids a cycle. */
|
|
287
|
-
function readDottedPath(record: Record<string, unknown>, path: string): unknown {
|
|
288
|
-
if (path === '') return record
|
|
289
|
-
const segments = path.split('.')
|
|
290
|
-
let cur: unknown = record
|
|
291
|
-
for (const seg of segments) {
|
|
292
|
-
if (cur === null || cur === undefined) return undefined
|
|
293
|
-
if (Array.isArray(cur)) {
|
|
294
|
-
const idx = Number(seg)
|
|
295
|
-
if (!Number.isInteger(idx)) return undefined
|
|
296
|
-
cur = cur[idx]
|
|
297
|
-
} else if (typeof cur === 'object') {
|
|
298
|
-
cur = (cur as Record<string, unknown>)[seg]
|
|
299
|
-
} else {
|
|
300
|
-
return undefined
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
return cur
|
|
304
|
-
}
|
package/src/entries/IconEntry.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
/** Per-value icon mapping. `icon` is a registry name (`getIcon(name)`);
|
|
5
|
-
* `color` is one of the standard column-color tokens; `label` overrides
|
|
6
|
-
* the accessible label (defaults to the raw value). */
|
|
7
|
-
export interface IconEntryOption {
|
|
8
|
-
icon: string
|
|
9
|
-
color?: string
|
|
10
|
-
label?: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Read-only sibling of `IconColumn` / `BooleanColumn`. Renders an icon
|
|
15
|
-
* for the resolved state value via a value→icon map. Use for status
|
|
16
|
-
* indicators on detail pages (active/inactive, paid/unpaid, …).
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* IconEntry.make('verified').options({
|
|
20
|
-
* true: { icon: 'check-circle', color: 'success', label: 'Verified' },
|
|
21
|
-
* false: { icon: 'x-circle', color: 'destructive', label: 'Unverified' },
|
|
22
|
-
* })
|
|
23
|
-
*/
|
|
24
|
-
export class IconEntry extends Entry {
|
|
25
|
-
private _options: Record<string, IconEntryOption> = {}
|
|
26
|
-
|
|
27
|
-
private constructor(name: string) {
|
|
28
|
-
super(name)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
static make(name: string): IconEntry {
|
|
32
|
-
return new IconEntry(name)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
options(map: Record<string, IconEntryOption>): this {
|
|
36
|
-
this._options = { ...this._options, ...map }
|
|
37
|
-
return this
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
protected override getEntryType(): string { return 'icon' }
|
|
41
|
-
|
|
42
|
-
override async toMeta(ctx?: RenderContext): Promise<EntryMeta> {
|
|
43
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as EntryMeta & { options?: Record<string, IconEntryOption> }
|
|
44
|
-
if (Object.keys(this._options).length > 0) {
|
|
45
|
-
meta.options = this._options
|
|
46
|
-
}
|
|
47
|
-
return meta
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
export type ImageEntryShape = 'square' | 'rounded' | 'circle'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Read-only sibling of `ImageColumn` / the `Image` display prime, but
|
|
8
|
-
* record-bound. The state value is the image URL; `.width(px) / .height(px)`
|
|
9
|
-
* (or the `.dimensions(px)` square sugar) control the rendered size;
|
|
10
|
-
* `.square() / .rounded() / .circle()` pick the border-radius shape.
|
|
11
|
-
*
|
|
12
|
-
* `Entry.size(EntrySize)` is inherited but doesn't affect image rendering
|
|
13
|
-
* — it's the text-size token used by `TextEntry`. Use `dimensions()` for
|
|
14
|
-
* pixel sizing instead.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ImageEntry.make('avatarUrl').dimensions(96).circle()
|
|
18
|
-
*/
|
|
19
|
-
export class ImageEntry extends Entry {
|
|
20
|
-
private _width = 64
|
|
21
|
-
private _height = 64
|
|
22
|
-
private _imageShape: ImageEntryShape = 'rounded'
|
|
23
|
-
|
|
24
|
-
private constructor(name: string) {
|
|
25
|
-
super(name)
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
static make(name: string): ImageEntry {
|
|
29
|
-
return new ImageEntry(name)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
width(px: number): this { this._width = px; return this }
|
|
33
|
-
height(px: number): this { this._height = px; return this }
|
|
34
|
-
|
|
35
|
-
/** Square sugar — sets width and height to the same pixel value. */
|
|
36
|
-
dimensions(px: number): this {
|
|
37
|
-
this._width = px
|
|
38
|
-
this._height = px
|
|
39
|
-
return this
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
square(): this { this._imageShape = 'square'; return this }
|
|
43
|
-
rounded(): this { this._imageShape = 'rounded'; return this }
|
|
44
|
-
circle(): this { this._imageShape = 'circle'; return this }
|
|
45
|
-
|
|
46
|
-
protected override getEntryType(): string { return 'image' }
|
|
47
|
-
|
|
48
|
-
override async toMeta(ctx?: RenderContext): Promise<EntryMeta> {
|
|
49
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as EntryMeta & {
|
|
50
|
-
imageSize?: number
|
|
51
|
-
imageWidth?: number
|
|
52
|
-
imageHeight?: number
|
|
53
|
-
imageShape?: ImageEntryShape
|
|
54
|
-
}
|
|
55
|
-
meta.imageWidth = this._width
|
|
56
|
-
meta.imageHeight = this._height
|
|
57
|
-
meta.imageShape = this._imageShape
|
|
58
|
-
if (this._width === this._height) meta.imageSize = this._width
|
|
59
|
-
return meta
|
|
60
|
-
}
|
|
61
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Entry, type EntryMeta } from './Entry.js'
|
|
2
|
-
import type { RenderContext } from '../schema/resolveSchema.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Read-only sibling of `KeyValueField`. Renders a `Record<string, unknown>`
|
|
6
|
-
* (or any plain object) as a two-column key/value table. Useful for debug
|
|
7
|
-
* surfaces — request headers, webhook payloads, settings blobs.
|
|
8
|
-
*
|
|
9
|
-
* The state value at `ctx.record[name]` may be:
|
|
10
|
-
* - a plain object → rendered as key→value rows
|
|
11
|
-
* - a JSON string → parsed and rendered (admin-trusted; non-JSON falls
|
|
12
|
-
* through as a single "value" entry)
|
|
13
|
-
* - null / undefined / empty → renders the `default()` placeholder
|
|
14
|
-
*
|
|
15
|
-
* Values that are themselves objects / arrays are stringified via JSON
|
|
16
|
-
* for compactness; primitives render as their string form.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* KeyValueEntry.make('headers').keyLabel('Header').valueLabel('Value')
|
|
20
|
-
*/
|
|
21
|
-
export class KeyValueEntry extends Entry {
|
|
22
|
-
private _keyLabel = 'Key'
|
|
23
|
-
private _valueLabel = 'Value'
|
|
24
|
-
|
|
25
|
-
private constructor(name: string) {
|
|
26
|
-
super(name)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
static make(name: string): KeyValueEntry {
|
|
30
|
-
return new KeyValueEntry(name)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
keyLabel(label: string): this { this._keyLabel = label; return this }
|
|
34
|
-
valueLabel(label: string): this { this._valueLabel = label; return this }
|
|
35
|
-
|
|
36
|
-
protected override getEntryType(): string { return 'keyValue' }
|
|
37
|
-
|
|
38
|
-
override async toMeta(ctx?: RenderContext): Promise<EntryMeta> {
|
|
39
|
-
const meta = await Promise.resolve(super.toMeta(ctx)) as EntryMeta & {
|
|
40
|
-
keyLabel?: string
|
|
41
|
-
valueLabel?: string
|
|
42
|
-
}
|
|
43
|
-
meta.keyLabel = this._keyLabel
|
|
44
|
-
meta.valueLabel = this._valueLabel
|
|
45
|
-
return meta
|
|
46
|
-
}
|
|
47
|
-
}
|