@selvajs/ui 6.6.0-beta.8 → 7.0.0
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/README.md +0 -3
- package/dist/components/ErrorScreen.svelte +1 -1
- package/dist/components/compute/AppLayout.svelte +95 -37
- package/dist/components/compute/AppLayout.svelte.d.ts +18 -1
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +6 -2
- package/dist/components/compute/ComputeApp.svelte.d.ts +1 -1
- package/dist/components/compute/ComputeMessagesDialog.svelte +3 -3
- package/dist/components/compute/ParameterPresetManager.svelte +9 -21
- package/dist/components/compute/SolveMessages.svelte +101 -87
- package/dist/components/compute/SolveMessages.svelte.d.ts +12 -0
- package/dist/components/layout/AppShell.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte.d.ts +1 -1
- package/dist/components/layout/PageContent.svelte +3 -2
- package/dist/components/layout/PageFooter.svelte +8 -6
- package/dist/components/layout/PageHeader.svelte +3 -3
- package/dist/components/layout/SideNav.svelte +56 -15
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +158 -62
- package/dist/components/preview/Group.svelte +14 -9
- package/dist/components/preview/HelpButton.svelte +1 -1
- package/dist/components/preview/ImageOutput.svelte +16 -11
- package/dist/components/preview/InputControl.svelte +115 -50
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- package/dist/components/preview/OutputDisplay.svelte +26 -17
- package/dist/components/preview/TabBar.svelte +8 -6
- package/dist/components/preview/TabBar.svelte.d.ts +2 -0
- package/dist/components/preview/TabContent.svelte +65 -33
- package/dist/components/preview/TabContent.svelte.d.ts +5 -1
- package/dist/components/preview/TabLayout.svelte +29 -8
- package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
- package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/dist/components/preview/inputs/ChecklistInput.svelte +11 -6
- package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/ColorInput.svelte +356 -14
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +18 -6
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/FileInput.svelte +71 -75
- package/dist/components/preview/inputs/GeometryInput.svelte +128 -0
- package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +21 -0
- package/dist/components/preview/inputs/NumberInput.svelte +8 -8
- package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte +45 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/TextInput.svelte +5 -5
- package/dist/components/preview/inputs/TileInput.svelte +83 -0
- package/dist/components/preview/inputs/TileInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/index.d.ts +3 -0
- package/dist/components/preview/inputs/index.js +3 -0
- package/dist/components/primitives/CalculateButton.svelte +10 -4
- package/dist/components/primitives/Callout.svelte +8 -6
- package/dist/components/primitives/Callout.svelte.d.ts +4 -4
- package/dist/components/primitives/DataTable.svelte +1 -1
- package/dist/components/primitives/FilterableDropdown.svelte +13 -1
- package/dist/components/primitives/FilterableDropdown.svelte.d.ts +5 -0
- package/dist/components/primitives/ImageUploadField.svelte +1 -1
- package/dist/components/primitives/SolvingIndicator.svelte +245 -19
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +15 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/components/primitives/badge/badge.svelte +2 -2
- package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
- package/dist/components/primitives/button/button.svelte +9 -7
- package/dist/components/primitives/button/button.svelte.d.ts +19 -16
- package/dist/components/primitives/card/card.svelte +1 -1
- package/dist/components/primitives/card/card.svelte.d.ts +1 -1
- package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
- package/dist/components/primitives/command/command-input.svelte +1 -1
- package/dist/components/primitives/command/command-item.svelte +1 -1
- package/dist/components/primitives/command/command-link-item.svelte +1 -1
- package/dist/components/primitives/command/command.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-content.svelte +3 -3
- package/dist/components/primitives/drawer/Drawer.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/index.js +1 -1
- package/dist/components/primitives/input/input.svelte +2 -2
- package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/primitives/input-group/input-group.svelte +1 -1
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/dist/components/primitives/popover/popover-content.svelte +1 -1
- package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
- package/dist/components/primitives/search/search.svelte +1 -1
- package/dist/components/primitives/select/select-content.svelte +1 -1
- package/dist/components/primitives/select/select-item.svelte +1 -1
- package/dist/components/primitives/select/select-trigger.svelte +1 -1
- package/dist/components/primitives/slider/slider.svelte +1 -1
- package/dist/components/primitives/switch/switch.svelte +1 -1
- package/dist/components/primitives/tabs/tabs-list.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +6 -6
- package/dist/components/primitives/tabs/tabs-trigger.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +6 -6
- package/dist/components/primitives/textarea/textarea.svelte +1 -1
- package/dist/components/primitives/toggle/toggle.svelte +11 -3
- package/dist/components/primitives/toggle/toggle.svelte.d.ts +13 -4
- package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
- package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
- package/dist/components/primitives/tooltip/index.d.ts +6 -0
- package/dist/components/primitives/tooltip/index.js +8 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/dist/components/viewer/SceneManager.svelte +32 -21
- package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
- package/dist/components/viewer/Viewer.svelte +135 -185
- package/dist/components/viewer/Viewer.svelte.d.ts +7 -2
- package/dist/components/viewer/ViewerDock.svelte +404 -0
- package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
- package/dist/composables/useFooterItem.svelte.d.ts +1 -1
- package/dist/composables/useFooterItem.svelte.js +1 -1
- package/dist/compute/liveProgress.svelte.d.ts +16 -0
- package/dist/compute/liveProgress.svelte.js +90 -0
- package/dist/compute/solving.svelte.d.ts +11 -7
- package/dist/compute/solving.svelte.js +64 -45
- package/dist/constants.d.ts +6 -8
- package/dist/constants.js +8 -11
- package/dist/contexts/hostContext.svelte.d.ts +39 -0
- package/dist/contexts/hostContext.svelte.js +9 -0
- package/dist/features/chart/plotly-compat.d.ts +15 -0
- package/dist/features/chart/plotly-compat.js +124 -0
- package/dist/i18n/messages.d.ts +50 -0
- package/dist/i18n/messages.js +84 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/public.d.ts +1 -0
- package/dist/public.js +1 -0
- package/dist/schema/host-support.d.ts +29 -0
- package/dist/schema/host-support.js +97 -0
- package/dist/schema/option-display.d.ts +12 -0
- package/dist/schema/option-display.js +29 -0
- package/dist/schema/param-exporter.d.ts +4 -1
- package/dist/schema/param-exporter.js +10 -6
- package/dist/schema/visibility-rules.d.ts +7 -1
- package/dist/schema/visibility-rules.js +17 -0
- package/dist/styles/base.css +94 -84
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/dist/utils/file-download.js +6 -10
- package/dist/utils/host-files.d.ts +12 -0
- package/dist/utils/host-files.js +46 -0
- package/dist/utils/webp-to-png.d.ts +10 -0
- package/dist/utils/webp-to-png.js +41 -0
- package/package.json +31 -23
- package/src/lib/components/ErrorScreen.svelte +1 -1
- package/src/lib/components/compute/AppLayout.svelte +96 -38
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +6 -2
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +4 -4
- package/src/lib/components/compute/ParameterPresetManager.svelte +9 -21
- package/src/lib/components/compute/SolveMessages.svelte +103 -89
- package/src/lib/components/layout/AppShell.svelte +2 -2
- package/src/lib/components/layout/FooterItemRenderer.svelte +2 -2
- package/src/lib/components/layout/PageContent.svelte +3 -2
- package/src/lib/components/layout/PageFooter.svelte +8 -6
- package/src/lib/components/layout/PageHeader.svelte +3 -3
- package/src/lib/components/layout/SideNav.svelte +56 -15
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +158 -62
- package/src/lib/components/preview/Group.svelte +14 -9
- package/src/lib/components/preview/HelpButton.svelte +1 -1
- package/src/lib/components/preview/ImageOutput.svelte +16 -11
- package/src/lib/components/preview/InputControl.svelte +115 -50
- package/src/lib/components/preview/OutputDisplay.svelte +26 -17
- package/src/lib/components/preview/TabBar.svelte +8 -6
- package/src/lib/components/preview/TabContent.svelte +65 -33
- package/src/lib/components/preview/TabLayout.svelte +29 -8
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +11 -6
- package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
- package/src/lib/components/preview/inputs/DropdownInput.svelte +18 -6
- package/src/lib/components/preview/inputs/FileInput.svelte +71 -75
- package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +8 -8
- package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/src/lib/components/preview/inputs/SegmentedInput.svelte +45 -0
- package/src/lib/components/preview/inputs/TextInput.svelte +5 -5
- package/src/lib/components/preview/inputs/TileInput.svelte +83 -0
- package/src/lib/components/preview/inputs/index.ts +3 -0
- package/src/lib/components/primitives/CalculateButton.svelte +10 -4
- package/src/lib/components/primitives/Callout.svelte +9 -7
- package/src/lib/components/primitives/DataTable.svelte +1 -1
- package/src/lib/components/primitives/FilterableDropdown.svelte +14 -2
- package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
- package/src/lib/components/primitives/IssueList.svelte +1 -1
- package/src/lib/components/primitives/SeverityIcon.svelte +1 -1
- package/src/lib/components/primitives/SolvingIndicator.svelte +245 -19
- package/src/lib/components/primitives/StateDisplay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +1 -1
- package/src/lib/components/primitives/badge/badge.svelte +3 -3
- package/src/lib/components/primitives/button/button.svelte +9 -7
- package/src/lib/components/primitives/button-group/button-group-separator.svelte +2 -2
- package/src/lib/components/primitives/button-group/button-group-text.svelte +1 -1
- package/src/lib/components/primitives/button-group/button-group.svelte +1 -1
- package/src/lib/components/primitives/card/card-content.svelte +1 -1
- package/src/lib/components/primitives/card/card-description.svelte +1 -1
- package/src/lib/components/primitives/card/card-footer.svelte +1 -1
- package/src/lib/components/primitives/card/card-header.svelte +1 -1
- package/src/lib/components/primitives/card/card-title.svelte +1 -1
- package/src/lib/components/primitives/card/card.svelte +2 -2
- package/src/lib/components/primitives/checkbox/checkbox.svelte +2 -2
- package/src/lib/components/primitives/command/command-dialog.svelte +2 -2
- package/src/lib/components/primitives/command/command-empty.svelte +1 -1
- package/src/lib/components/primitives/command/command-group.svelte +1 -1
- package/src/lib/components/primitives/command/command-input.svelte +3 -3
- package/src/lib/components/primitives/command/command-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-link-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-list.svelte +1 -1
- package/src/lib/components/primitives/command/command-separator.svelte +1 -1
- package/src/lib/components/primitives/command/command-shortcut.svelte +1 -1
- package/src/lib/components/primitives/command/command.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-label.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/dialog/dialog-content.svelte +4 -4
- package/src/lib/components/primitives/dialog/dialog-description.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-header.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-title.svelte +1 -1
- package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +32 -12
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +6 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +5 -3
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/empty/empty-content.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-description.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-header.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-media.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-title.svelte +1 -1
- package/src/lib/components/primitives/empty/empty.svelte +1 -1
- package/src/lib/components/primitives/field/field-content.svelte +1 -1
- package/src/lib/components/primitives/field/field-description.svelte +1 -1
- package/src/lib/components/primitives/field/field-error.svelte +1 -1
- package/src/lib/components/primitives/field/field-group.svelte +1 -1
- package/src/lib/components/primitives/field/field-label.svelte +2 -2
- package/src/lib/components/primitives/field/field-legend.svelte +1 -1
- package/src/lib/components/primitives/field/field-separator.svelte +2 -2
- package/src/lib/components/primitives/field/field-set.svelte +1 -1
- package/src/lib/components/primitives/field/field-title.svelte +1 -1
- package/src/lib/components/primitives/field/field.svelte +1 -1
- package/src/lib/components/primitives/index.ts +1 -1
- package/src/lib/components/primitives/input/input.svelte +3 -3
- package/src/lib/components/primitives/input-group/input-group-addon.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-button.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-input.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-text.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-textarea.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group.svelte +2 -2
- package/src/lib/components/primitives/label/label.svelte +1 -1
- package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-content.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-description.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-header.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-title.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-trigger.svelte +1 -1
- package/src/lib/components/primitives/resizable/resizable-handle.svelte +3 -3
- package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
- package/src/lib/components/primitives/search/search.svelte +2 -2
- package/src/lib/components/primitives/select/select-content.svelte +2 -2
- package/src/lib/components/primitives/select/select-group-heading.svelte +1 -1
- package/src/lib/components/primitives/select/select-item.svelte +2 -2
- package/src/lib/components/primitives/select/select-label.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-down-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-up-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-separator.svelte +2 -2
- package/src/lib/components/primitives/select/select-trigger.svelte +2 -2
- package/src/lib/components/primitives/separator/separator.svelte +1 -1
- package/src/lib/components/primitives/slider/slider.svelte +2 -2
- package/src/lib/components/primitives/spinner/spinner.svelte +1 -1
- package/src/lib/components/primitives/switch/switch.svelte +2 -2
- package/src/lib/components/primitives/tabs/tabs-content.svelte +1 -1
- package/src/lib/components/primitives/tabs/tabs-list.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs-trigger.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs.svelte +1 -1
- package/src/lib/components/primitives/textarea/textarea.svelte +2 -2
- package/src/lib/components/primitives/toggle/toggle.svelte +12 -4
- package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +3 -3
- package/src/lib/components/primitives/toggle-group/toggle-group.svelte +3 -3
- package/src/lib/components/primitives/tooltip/index.ts +19 -0
- package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
- package/src/lib/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/src/lib/components/viewer/SceneManager.svelte +32 -21
- package/src/lib/components/viewer/Viewer.svelte +136 -186
- package/src/lib/components/viewer/ViewerDock.svelte +404 -0
- package/src/lib/composables/useFooterItem.svelte.ts +1 -1
- package/src/lib/compute/liveProgress.svelte.ts +103 -0
- package/src/lib/compute/solving.svelte.ts +66 -50
- package/src/lib/constants.ts +8 -11
- package/src/lib/contexts/hostContext.svelte.ts +51 -0
- package/src/lib/features/chart/plotly-compat.ts +141 -0
- package/src/lib/i18n/messages.ts +139 -0
- package/src/lib/index.ts +22 -0
- package/src/lib/public.ts +1 -0
- package/src/lib/schema/host-support.ts +129 -0
- package/src/lib/schema/option-display.ts +44 -0
- package/src/lib/schema/param-exporter.ts +10 -7
- package/src/lib/schema/visibility-rules.ts +27 -1
- package/src/lib/styles/base.css +94 -84
- package/src/lib/utils/color-space.ts +107 -0
- package/src/lib/utils/file-download.ts +7 -11
- package/src/lib/utils/host-files.ts +61 -0
- package/src/lib/utils/webp-to-png.ts +48 -0
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
- package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
- package/dist/components/primitives/theme-switcher/index.js +0 -1
- package/dist/styles/themes/cyberpunk.css +0 -98
- package/dist/styles/themes/neutral.css +0 -72
- package/dist/styles/themes/ocean.css +0 -75
- package/dist/styles/themes/selva.css +0 -105
- package/dist/theme/themeStore.svelte.d.ts +0 -12
- package/dist/theme/themeStore.svelte.js +0 -40
- package/dist/theme/themes.d.ts +0 -5
- package/dist/theme/themes.js +0 -13
- package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
- package/src/lib/styles/themes/cyberpunk.css +0 -98
- package/src/lib/styles/themes/neutral.css +0 -72
- package/src/lib/styles/themes/ocean.css +0 -75
- package/src/lib/styles/themes/selva.css +0 -105
- package/src/lib/theme/themeStore.svelte.ts +0 -50
- package/src/lib/theme/themes.ts +0 -18
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
FileInputWidgetConfig,
|
|
5
5
|
DynamicValueListWidgetConfig,
|
|
6
6
|
DropdownWidgetConfig,
|
|
7
|
+
UISchema,
|
|
7
8
|
SupportedTypes
|
|
8
9
|
} from '@selvajs/schemas';
|
|
9
10
|
import {
|
|
@@ -15,7 +16,9 @@
|
|
|
15
16
|
isFileWidget,
|
|
16
17
|
isColorWidget
|
|
17
18
|
} from '@selvajs/schemas';
|
|
18
|
-
import * as Field from '
|
|
19
|
+
import * as Field from '#lib/components/primitives/field/index.js';
|
|
20
|
+
import { Button } from '#lib/components/primitives/button/index.js';
|
|
21
|
+
import { toast } from '#lib/components/primitives/sonner/index.js';
|
|
19
22
|
import HelpButton from './HelpButton.svelte';
|
|
20
23
|
import {
|
|
21
24
|
CheckboxInput,
|
|
@@ -23,11 +26,21 @@
|
|
|
23
26
|
ColorInput,
|
|
24
27
|
DropdownInput,
|
|
25
28
|
FileInput,
|
|
29
|
+
GeometryInput,
|
|
26
30
|
NumberInput,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
SegmentedInput,
|
|
32
|
+
TextInput,
|
|
33
|
+
TileInput
|
|
34
|
+
} from '#lib/components/preview/inputs/index.js';
|
|
35
|
+
import { getClientSlot } from '#lib/contexts/clientSlotContext.svelte.js';
|
|
36
|
+
import {
|
|
37
|
+
getHostContext,
|
|
38
|
+
type GeometryPickTarget,
|
|
39
|
+
type PickKind
|
|
40
|
+
} from '#lib/contexts/hostContext.svelte.js';
|
|
41
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
42
|
+
import { isGeometryParamType, isTriggerItem } from '#lib/schema/host-support.js';
|
|
43
|
+
import { resolveOptionDisplay } from '#lib/schema/option-display.js';
|
|
31
44
|
|
|
32
45
|
interface Props {
|
|
33
46
|
item: InputLayoutItem;
|
|
@@ -42,6 +55,10 @@
|
|
|
42
55
|
disabled?: boolean;
|
|
43
56
|
/** Runtime-computed options for a dynamic value list input (name -> value). */
|
|
44
57
|
dynamicOptions?: Record<string, string>;
|
|
58
|
+
/** The input's paramType: a geometry input gets its control from this, not from the widget type. */
|
|
59
|
+
paramType?: string;
|
|
60
|
+
/** The schema's icons and thumbnails, which value-list options point into. */
|
|
61
|
+
assets?: UISchema['assets'];
|
|
45
62
|
}
|
|
46
63
|
|
|
47
64
|
let {
|
|
@@ -50,10 +67,25 @@
|
|
|
50
67
|
displayName,
|
|
51
68
|
onChange,
|
|
52
69
|
disabled = false,
|
|
53
|
-
dynamicOptions
|
|
70
|
+
dynamicOptions,
|
|
71
|
+
paramType,
|
|
72
|
+
assets
|
|
54
73
|
}: Props = $props();
|
|
55
74
|
|
|
56
75
|
const locale = getLocaleContext();
|
|
76
|
+
const hostActions = getHostContext();
|
|
77
|
+
const { pickGeometry, clearGeometry, onGeometrySummary } = hostActions;
|
|
78
|
+
const isGeometry = $derived(isGeometryParamType(paramType));
|
|
79
|
+
const isTrigger = $derived(isTriggerItem(item));
|
|
80
|
+
const pickTarget = $derived(
|
|
81
|
+
isGeometry ? hostActions.describeGeometry?.(item.paramId) : undefined
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Get Point/Line/Plane take their own kind; Get Geometry takes what its filter allows.
|
|
85
|
+
function pickKinds(target: GeometryPickTarget | undefined): readonly PickKind[] | undefined {
|
|
86
|
+
if (paramType === 'point' || paramType === 'line' || paramType === 'plane') return [paramType];
|
|
87
|
+
return target?.kinds;
|
|
88
|
+
}
|
|
57
89
|
|
|
58
90
|
const inputId = $derived(`input-${item.paramId}`);
|
|
59
91
|
const label = $derived(displayName || item.displayName || item.paramId);
|
|
@@ -102,7 +134,8 @@
|
|
|
102
134
|
// As a dropdown config so DropdownInput/ChecklistInput can consume it unchanged.
|
|
103
135
|
const dynamicListAsDropdownConfig = $derived<DropdownWidgetConfig>({
|
|
104
136
|
options: dynamicListOptions,
|
|
105
|
-
displayAs: dynamicListConfig?.displayAs ?? 'dropdown'
|
|
137
|
+
displayAs: dynamicListConfig?.displayAs ?? 'dropdown',
|
|
138
|
+
optionMedia: dynamicListConfig?.optionMedia
|
|
106
139
|
});
|
|
107
140
|
const hideDynamicListWhenEmpty = $derived(
|
|
108
141
|
isDynamicValueListWidget(item) &&
|
|
@@ -173,6 +206,48 @@
|
|
|
173
206
|
}
|
|
174
207
|
</script>
|
|
175
208
|
|
|
209
|
+
{#snippet valueList(config: DropdownWidgetConfig)}
|
|
210
|
+
{@const display = resolveOptionDisplay(
|
|
211
|
+
config.displayAs,
|
|
212
|
+
Object.keys(config.options ?? {}).length
|
|
213
|
+
)}
|
|
214
|
+
{@const single = typeof value === 'string' ? value : ''}
|
|
215
|
+
{#if display === 'checklist'}
|
|
216
|
+
<ChecklistInput
|
|
217
|
+
{inputId}
|
|
218
|
+
value={Array.isArray(value)
|
|
219
|
+
? (value as string[])
|
|
220
|
+
: typeof value === 'string' && value
|
|
221
|
+
? [value]
|
|
222
|
+
: []}
|
|
223
|
+
{config}
|
|
224
|
+
{assets}
|
|
225
|
+
onChange={commit}
|
|
226
|
+
{disabled}
|
|
227
|
+
/>
|
|
228
|
+
{:else if display === 'segmented'}
|
|
229
|
+
<SegmentedInput
|
|
230
|
+
labelId="{inputId}-label"
|
|
231
|
+
value={single}
|
|
232
|
+
{config}
|
|
233
|
+
{assets}
|
|
234
|
+
onChange={commit}
|
|
235
|
+
{disabled}
|
|
236
|
+
/>
|
|
237
|
+
{:else if display === 'tiles'}
|
|
238
|
+
<TileInput
|
|
239
|
+
labelId="{inputId}-label"
|
|
240
|
+
value={single}
|
|
241
|
+
{config}
|
|
242
|
+
{assets}
|
|
243
|
+
onChange={commit}
|
|
244
|
+
{disabled}
|
|
245
|
+
/>
|
|
246
|
+
{:else}
|
|
247
|
+
<DropdownInput value={single} {config} {assets} onChange={commit} {disabled} />
|
|
248
|
+
{/if}
|
|
249
|
+
{/snippet}
|
|
250
|
+
|
|
176
251
|
{#snippet labelText(forId?: string, tone: 'quiet' | 'strong' = 'quiet')}
|
|
177
252
|
<Field.Label
|
|
178
253
|
for={forId}
|
|
@@ -208,7 +283,7 @@
|
|
|
208
283
|
|
|
209
284
|
{#if isClientSlot}
|
|
210
285
|
{#if clientSlot}
|
|
211
|
-
<div role="group" class="group/field gap-
|
|
286
|
+
<div role="group" class="group/field gap-2 min-w-0 flex flex-col">
|
|
212
287
|
{@render fieldHeader()}
|
|
213
288
|
{@render clientSlot({
|
|
214
289
|
inputId: item.paramId,
|
|
@@ -218,8 +293,36 @@
|
|
|
218
293
|
})}
|
|
219
294
|
</div>
|
|
220
295
|
{/if}
|
|
296
|
+
{:else if isGeometry}
|
|
297
|
+
<div role="group" class="group/field gap-2 min-w-0 flex flex-col">
|
|
298
|
+
{@render fieldHeader(inputId)}
|
|
299
|
+
<GeometryInput
|
|
300
|
+
{inputId}
|
|
301
|
+
kinds={pickKinds(pickTarget)}
|
|
302
|
+
atMost={pickTarget?.atMost}
|
|
303
|
+
summary={typeof value === 'string' ? value : undefined}
|
|
304
|
+
onPick={pickGeometry && (() => pickGeometry(item.paramId))}
|
|
305
|
+
onClear={clearGeometry && (() => clearGeometry(item.paramId))}
|
|
306
|
+
watchSummary={onGeometrySummary && ((listener) => onGeometrySummary(item.paramId, listener))}
|
|
307
|
+
onError={(message) => toast.error(message)}
|
|
308
|
+
{disabled}
|
|
309
|
+
/>
|
|
310
|
+
</div>
|
|
311
|
+
{:else if isTrigger}
|
|
312
|
+
<div role="group" class="group/field gap-1.5 min-w-0 flex items-center" data-control-line>
|
|
313
|
+
<Button
|
|
314
|
+
id={inputId}
|
|
315
|
+
variant="outline"
|
|
316
|
+
class="min-w-0 flex-1"
|
|
317
|
+
onclick={() => hostActions.trigger?.(item.paramId)}
|
|
318
|
+
disabled={disabled || !hostActions.trigger || hostActions.isSolving?.()}
|
|
319
|
+
>
|
|
320
|
+
<span class="truncate">{label}</span>
|
|
321
|
+
</Button>
|
|
322
|
+
{@render helpButton()}
|
|
323
|
+
</div>
|
|
221
324
|
{:else if !hideDynamicListWhenEmpty}
|
|
222
|
-
<div role="group" class="group/field gap-
|
|
325
|
+
<div role="group" class="group/field gap-2 min-w-0 flex flex-col">
|
|
223
326
|
{#if !isCheckboxWidget(item)}
|
|
224
327
|
{@render fieldHeader(inputId)}
|
|
225
328
|
{/if}
|
|
@@ -254,49 +357,10 @@
|
|
|
254
357
|
{disabled}
|
|
255
358
|
/>
|
|
256
359
|
{:else if isDropdownWidget(item)}
|
|
257
|
-
{@
|
|
258
|
-
{#if config.displayAs === 'checklist'}
|
|
259
|
-
<ChecklistInput
|
|
260
|
-
{inputId}
|
|
261
|
-
value={Array.isArray(value)
|
|
262
|
-
? (value as string[])
|
|
263
|
-
: typeof value === 'string' && value
|
|
264
|
-
? [value]
|
|
265
|
-
: []}
|
|
266
|
-
{config}
|
|
267
|
-
onChange={commit}
|
|
268
|
-
{disabled}
|
|
269
|
-
/>
|
|
270
|
-
{:else}
|
|
271
|
-
<DropdownInput
|
|
272
|
-
value={typeof value === 'string' ? value : ''}
|
|
273
|
-
{config}
|
|
274
|
-
onChange={commit}
|
|
275
|
-
{disabled}
|
|
276
|
-
/>
|
|
277
|
-
{/if}
|
|
360
|
+
{@render valueList(item.config)}
|
|
278
361
|
{:else if isDynamicValueListWidget(item)}
|
|
279
362
|
{#if dynamicListHasOptions}
|
|
280
|
-
{
|
|
281
|
-
<ChecklistInput
|
|
282
|
-
{inputId}
|
|
283
|
-
value={Array.isArray(value)
|
|
284
|
-
? (value as string[])
|
|
285
|
-
: typeof value === 'string' && value
|
|
286
|
-
? [value]
|
|
287
|
-
: []}
|
|
288
|
-
config={dynamicListAsDropdownConfig}
|
|
289
|
-
onChange={commit}
|
|
290
|
-
{disabled}
|
|
291
|
-
/>
|
|
292
|
-
{:else}
|
|
293
|
-
<DropdownInput
|
|
294
|
-
value={typeof value === 'string' ? value : ''}
|
|
295
|
-
config={dynamicListAsDropdownConfig}
|
|
296
|
-
onChange={commit}
|
|
297
|
-
{disabled}
|
|
298
|
-
/>
|
|
299
|
-
{/if}
|
|
363
|
+
{@render valueList(dynamicListAsDropdownConfig)}
|
|
300
364
|
{:else}
|
|
301
365
|
<p class="text-sm text-muted-foreground">{locale.messages.noOptionsYet}</p>
|
|
302
366
|
{/if}
|
|
@@ -314,6 +378,7 @@
|
|
|
314
378
|
{inputId}
|
|
315
379
|
value={typeof value === 'string' ? value : '#000000'}
|
|
316
380
|
onChange={(newValue) => commit(newValue)}
|
|
381
|
+
{disabled}
|
|
317
382
|
/>
|
|
318
383
|
{/if}
|
|
319
384
|
</div>
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
formatFileSize,
|
|
9
9
|
getBase64FileSize,
|
|
10
10
|
isFileData
|
|
11
|
-
} from '
|
|
11
|
+
} from '#lib/utils/file-download.js';
|
|
12
12
|
import { Button } from '../primitives';
|
|
13
13
|
import { Folder, FolderOpen, FileIcon, ChevronRight } from '@lucide/svelte';
|
|
14
14
|
import HelpButton from './HelpButton.svelte';
|
|
15
15
|
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
16
|
-
import { Label } from '
|
|
17
|
-
import { getLocaleContext } from '
|
|
18
|
-
import { formatCount, formatMessage } from '
|
|
16
|
+
import { Label } from '#lib/components/primitives/label/index.js';
|
|
17
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
18
|
+
import { formatCount, formatMessage } from '#lib/i18n/messages.js';
|
|
19
19
|
|
|
20
20
|
interface Props {
|
|
21
21
|
item: OutputLayoutItem;
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
);
|
|
39
39
|
const hasValue = $derived(value != null);
|
|
40
40
|
|
|
41
|
-
const boxClass = 'min-h-12.5 rounded px-3 py-3
|
|
41
|
+
const boxClass = 'min-h-12.5 rounded-md px-3 py-3 text-sm border border-border-strong';
|
|
42
42
|
|
|
43
43
|
async function copyToClipboard() {
|
|
44
44
|
try {
|
|
@@ -157,7 +157,11 @@
|
|
|
157
157
|
|
|
158
158
|
{#snippet fieldHeader()}
|
|
159
159
|
<div class="gap-2 flex items-center">
|
|
160
|
-
<Label>
|
|
160
|
+
<Label>
|
|
161
|
+
<span class={item.widgetType === 'number' ? 'text-xs font-normal text-muted-foreground' : ''}
|
|
162
|
+
>{label}</span
|
|
163
|
+
>
|
|
164
|
+
</Label>
|
|
161
165
|
{#if item.description}
|
|
162
166
|
<HelpButton {label} description={item.description} />
|
|
163
167
|
{/if}
|
|
@@ -190,7 +194,7 @@
|
|
|
190
194
|
<span class="font-medium">{node.name}</span>
|
|
191
195
|
</button>
|
|
192
196
|
{#if isOpen}
|
|
193
|
-
<div class="ml-4 pl-2 border-l border-border
|
|
197
|
+
<div class="ml-4 pl-2 border-l border-border-strong">
|
|
194
198
|
{@render treeNodes(node.children, folderPath)}
|
|
195
199
|
</div>
|
|
196
200
|
{/if}
|
|
@@ -213,12 +217,14 @@
|
|
|
213
217
|
|
|
214
218
|
{#snippet fileDisplay()}
|
|
215
219
|
{#if fileCount === 0}
|
|
216
|
-
<div
|
|
220
|
+
<div
|
|
221
|
+
class="px-3 py-3 text-sm rounded-md border border-border-strong bg-muted text-muted-foreground"
|
|
222
|
+
>
|
|
217
223
|
{t.waitingForFiles}
|
|
218
224
|
</div>
|
|
219
225
|
{:else}
|
|
220
226
|
<div class="gap-2 flex flex-col">
|
|
221
|
-
<div class="
|
|
227
|
+
<div class="px-3 py-2 rounded-md border border-border-strong bg-muted">
|
|
222
228
|
<div class="gap-2 flex items-center justify-between">
|
|
223
229
|
<span class="min-w-0 text-sm font-medium truncate text-foreground">
|
|
224
230
|
{fileCount === 1
|
|
@@ -248,7 +254,7 @@
|
|
|
248
254
|
</div>
|
|
249
255
|
{#if hasDuplicates}
|
|
250
256
|
<div
|
|
251
|
-
class="
|
|
257
|
+
class="px-3 py-2 text-sm rounded-md border border-destructive bg-destructive/10 text-destructive"
|
|
252
258
|
>
|
|
253
259
|
<div class="font-medium">{t.duplicateFilesTitle}</div>
|
|
254
260
|
<div class="mt-1 text-xs">
|
|
@@ -264,7 +270,7 @@
|
|
|
264
270
|
{/if}
|
|
265
271
|
{#if downloadError}
|
|
266
272
|
<div
|
|
267
|
-
class="
|
|
273
|
+
class="px-3 py-2 text-sm rounded-md border border-destructive bg-destructive/10 text-destructive"
|
|
268
274
|
>
|
|
269
275
|
{downloadError}
|
|
270
276
|
</div>
|
|
@@ -282,7 +288,10 @@
|
|
|
282
288
|
|
|
283
289
|
<!-- Dynamic value list outputs are routing sinks (their options feed an input), not displayed. -->
|
|
284
290
|
{#if item.widgetType !== 'dynamicValueList'}
|
|
285
|
-
<div
|
|
291
|
+
<div
|
|
292
|
+
role="group"
|
|
293
|
+
class="group/field flex flex-col {item.widgetType === 'number' ? 'gap-0.5' : 'gap-2'}"
|
|
294
|
+
>
|
|
286
295
|
{@render fieldHeader()}
|
|
287
296
|
|
|
288
297
|
{#if item.widgetType === 'chart'}
|
|
@@ -295,21 +304,21 @@
|
|
|
295
304
|
{:else if item.widgetType === 'file'}
|
|
296
305
|
{@render fileDisplay()}
|
|
297
306
|
{:else if item.widgetType === 'number'}
|
|
298
|
-
<div class="
|
|
307
|
+
<div class="min-h-8 text-2xl font-semibold wrap-break-word text-foreground tabular-nums">
|
|
299
308
|
{#if hasValue}
|
|
300
|
-
|
|
309
|
+
{formattedValue}
|
|
301
310
|
{:else}
|
|
302
|
-
{@render placeholder()}
|
|
311
|
+
<span class="text-base font-normal">{@render placeholder()}</span>
|
|
303
312
|
{/if}
|
|
304
313
|
</div>
|
|
305
314
|
{:else if item.widgetType === 'text'}
|
|
306
315
|
<div class="group relative">
|
|
307
316
|
{#if isObjectValue}
|
|
308
317
|
<pre
|
|
309
|
-
class="{boxClass} max-h-96 overflow-auto bg-muted
|
|
318
|
+
class="{boxClass} max-h-96 font-mono overflow-auto bg-muted wrap-anywhere text-foreground">{formattedValue}</pre>
|
|
310
319
|
{:else}
|
|
311
320
|
<div
|
|
312
|
-
class="{boxClass} bg-muted
|
|
321
|
+
class="{boxClass} bg-muted wrap-anywhere wrap-break-word whitespace-pre-wrap text-foreground"
|
|
313
322
|
>
|
|
314
323
|
{#if hasValue}{value}{:else}{@render placeholder()}{/if}
|
|
315
324
|
</div>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { TabConfig } from '@selvajs/schemas';
|
|
3
|
-
import * as Tabs from '
|
|
3
|
+
import * as Tabs from '#lib/components/primitives/tabs/index.js';
|
|
4
4
|
import { ChevronLeft, ChevronRight } from '@lucide/svelte';
|
|
5
5
|
import Icon from '@iconify/svelte';
|
|
6
|
-
import { getLocaleContext } from '
|
|
6
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
7
7
|
|
|
8
8
|
const locale = getLocaleContext();
|
|
9
9
|
const t = $derived(locale.messages);
|
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
tabs: TabConfig[];
|
|
13
13
|
activeTabId: string;
|
|
14
14
|
onTabChange: (tabId: string) => void;
|
|
15
|
+
/** Matches TabContent's tighter gutter in the stacked phone layout. */
|
|
16
|
+
bare?: boolean;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
let { tabs, activeTabId, onTabChange }: Props = $props();
|
|
19
|
+
let { tabs, activeTabId, onTabChange, bare = false }: Props = $props();
|
|
18
20
|
|
|
19
21
|
const SCROLL_BUTTON_WIDTH = 32;
|
|
20
22
|
|
|
@@ -64,7 +66,7 @@
|
|
|
64
66
|
}
|
|
65
67
|
</script>
|
|
66
68
|
|
|
67
|
-
<div class="tab-bar relative shrink-0 border-b border-border">
|
|
69
|
+
<div class="tab-bar relative shrink-0 border-b border-border {bare ? 'mx-1' : 'mx-3'}">
|
|
68
70
|
<Tabs.List bind:ref={listRef} variant="line" onscroll={updateOverflow} onwheel={handleWheel}>
|
|
69
71
|
{#each tabs as tab (tab.id)}
|
|
70
72
|
<Tabs.Trigger value={tab.id} onclick={() => onTabChange(tab.id)} variant="line">
|
|
@@ -127,11 +129,11 @@
|
|
|
127
129
|
.scroll-button.back {
|
|
128
130
|
left: 0;
|
|
129
131
|
padding: 0 1.25rem 0 0.375rem;
|
|
130
|
-
background: linear-gradient(to right, var(--
|
|
132
|
+
background: linear-gradient(to right, var(--tab-bar-bg, var(--background)) 55%, transparent);
|
|
131
133
|
}
|
|
132
134
|
.scroll-button.forward {
|
|
133
135
|
right: 0;
|
|
134
136
|
padding: 0 0.375rem 0 1.25rem;
|
|
135
|
-
background: linear-gradient(to left, var(--
|
|
137
|
+
background: linear-gradient(to left, var(--tab-bar-bg, var(--background)) 55%, transparent);
|
|
136
138
|
}
|
|
137
139
|
</style>
|
|
@@ -3,18 +3,21 @@
|
|
|
3
3
|
TabConfig,
|
|
4
4
|
SchemaInput,
|
|
5
5
|
DiscoveredOutput,
|
|
6
|
+
UISchema,
|
|
6
7
|
SupportedTypes,
|
|
7
8
|
InputLayoutItem,
|
|
8
9
|
OutputLayoutItem
|
|
9
10
|
} from '@selvajs/schemas';
|
|
10
|
-
import * as Tabs from '
|
|
11
|
-
import { ScrollArea } from '
|
|
11
|
+
import * as Tabs from '#lib/components/primitives/tabs/index.js';
|
|
12
|
+
import { ScrollArea } from '#lib/components/primitives/scroll-area/index.js';
|
|
12
13
|
import StateDisplay from '../primitives/StateDisplay.svelte';
|
|
13
14
|
import Group from './Group.svelte';
|
|
14
15
|
import InputControl from './InputControl.svelte';
|
|
15
16
|
import OutputDisplay from './OutputDisplay.svelte';
|
|
16
|
-
import { evaluateGroupVisibility } from '
|
|
17
|
-
import {
|
|
17
|
+
import { evaluateGroupVisibility } from '#lib/schema/visibility-rules.js';
|
|
18
|
+
import { isSupportedOn, layoutItemKind } from '#lib/schema/host-support.js';
|
|
19
|
+
import { getHostContext } from '#lib/contexts/hostContext.svelte.js';
|
|
20
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
18
21
|
|
|
19
22
|
const locale = getLocaleContext();
|
|
20
23
|
const t = $derived(locale.messages);
|
|
@@ -29,6 +32,10 @@
|
|
|
29
32
|
outputs: DiscoveredOutput[];
|
|
30
33
|
/** Computed value list options keyed by the target dynamic-value-list input id. */
|
|
31
34
|
dynamicOptions?: Record<string, Record<string, string>>;
|
|
35
|
+
/** The schema's icons and thumbnails, which value-list options point into. */
|
|
36
|
+
assets?: UISchema['assets'];
|
|
37
|
+
/** No tinted backdrop and no scroll area of its own: the container scrolls. */
|
|
38
|
+
bare?: boolean;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
let {
|
|
@@ -39,11 +46,24 @@
|
|
|
39
46
|
onValueChange,
|
|
40
47
|
inputs,
|
|
41
48
|
outputs,
|
|
42
|
-
dynamicOptions = {}
|
|
49
|
+
dynamicOptions = {},
|
|
50
|
+
assets,
|
|
51
|
+
bare = false
|
|
43
52
|
}: Props = $props();
|
|
44
53
|
|
|
54
|
+
const { host } = getHostContext();
|
|
55
|
+
|
|
56
|
+
// An element this host can't render is left out, not shown broken: its input still solves with
|
|
57
|
+
// the definition's own default. A group left with nothing to show goes too.
|
|
45
58
|
const visibleGroups = $derived(
|
|
46
|
-
tab.groups
|
|
59
|
+
tab.groups
|
|
60
|
+
.filter((group) => evaluateGroupVisibility(group, values))
|
|
61
|
+
.flatMap((group) => {
|
|
62
|
+
const items = group.items.filter((item) =>
|
|
63
|
+
isSupportedOn(host, layoutItemKind(item, inputs))
|
|
64
|
+
);
|
|
65
|
+
return items.length > 0 || group.items.length === 0 ? [{ ...group, items }] : [];
|
|
66
|
+
})
|
|
47
67
|
);
|
|
48
68
|
|
|
49
69
|
function getInputById(paramId: string): SchemaInput | undefined {
|
|
@@ -68,6 +88,8 @@
|
|
|
68
88
|
onChange={onValueChange}
|
|
69
89
|
disabled={visibility.disabled}
|
|
70
90
|
dynamicOptions={dynamicOptions[input.id]}
|
|
91
|
+
paramType={input.paramType}
|
|
92
|
+
{assets}
|
|
71
93
|
/>
|
|
72
94
|
{/if}
|
|
73
95
|
{/snippet}
|
|
@@ -83,34 +105,44 @@
|
|
|
83
105
|
{/if}
|
|
84
106
|
{/snippet}
|
|
85
107
|
|
|
86
|
-
|
|
87
|
-
<div class=
|
|
88
|
-
|
|
89
|
-
<div class="px-3">
|
|
90
|
-
<!-- A heading per panel lets a screen reader jump between them; the tab, when shown,
|
|
108
|
+
{#snippet body()}
|
|
109
|
+
<div class={bare ? 'px-1' : 'px-3'}>
|
|
110
|
+
<!-- A heading per panel lets a screen reader jump between them; the tab, when shown,
|
|
91
111
|
already names it on screen. -->
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
</div>
|
|
112
|
-
{/if}
|
|
112
|
+
<h2 class="sr-only">{tab.label}</h2>
|
|
113
|
+
{#if visibleGroups.length === 0}
|
|
114
|
+
<StateDisplay type="empty" size="medium" message={t.tabNoGroups} />
|
|
115
|
+
{:else}
|
|
116
|
+
<div class="gap-4 py-4 flex flex-col">
|
|
117
|
+
{#each visibleGroups as group (group.id)}
|
|
118
|
+
<Group
|
|
119
|
+
label={group.label}
|
|
120
|
+
description={group.description}
|
|
121
|
+
items={group.items}
|
|
122
|
+
columns={group.columns ?? 1}
|
|
123
|
+
collapsed={collapsedGroups[group.id] ?? false}
|
|
124
|
+
{values}
|
|
125
|
+
onToggle={() => onToggleGroup(group.id)}
|
|
126
|
+
inputSnippet={renderInput}
|
|
127
|
+
outputSnippet={renderOutput}
|
|
128
|
+
flat={visibleGroups.length === 1}
|
|
129
|
+
/>
|
|
130
|
+
{/each}
|
|
113
131
|
</div>
|
|
114
|
-
|
|
132
|
+
{/if}
|
|
115
133
|
</div>
|
|
134
|
+
{/snippet}
|
|
135
|
+
|
|
136
|
+
<Tabs.Content value={tab.id} class="min-h-0">
|
|
137
|
+
{#if bare}
|
|
138
|
+
{@render body()}
|
|
139
|
+
{:else}
|
|
140
|
+
<div class="h-full">
|
|
141
|
+
<!-- `auto`, not the default `hover`: a hover-only bar comes and goes with the pointer,
|
|
142
|
+
and a host that freezes mid-solve drops the pointer state with it. -->
|
|
143
|
+
<ScrollArea class="h-full" orientation="vertical" type="auto">
|
|
144
|
+
{@render body()}
|
|
145
|
+
</ScrollArea>
|
|
146
|
+
</div>
|
|
147
|
+
{/if}
|
|
116
148
|
</Tabs.Content>
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { UISchema, SupportedTypes } from '@selvajs/schemas';
|
|
3
|
-
import * as
|
|
4
|
-
import * as Tabs from '$lib/components/primitives/tabs';
|
|
3
|
+
import * as Tabs from '#lib/components/primitives/tabs/index.js';
|
|
5
4
|
import TabBar from './TabBar.svelte';
|
|
6
5
|
import TabContent from './TabContent.svelte';
|
|
7
|
-
import { isTabVisible } from '
|
|
8
|
-
import { buildDynamicValueListOptions } from '
|
|
6
|
+
import { isTabVisible } from '#lib/schema/visibility-rules.js';
|
|
7
|
+
import { buildDynamicValueListOptions } from '#lib/schema/dynamic-value-list.js';
|
|
9
8
|
|
|
10
9
|
interface Props {
|
|
11
10
|
schema: UISchema;
|
|
@@ -15,9 +14,21 @@
|
|
|
15
14
|
panelFilter?: 'left' | 'right';
|
|
16
15
|
/** Externally request a specific tab to be active (e.g. from collapsed strip click) */
|
|
17
16
|
requestedTabId?: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Drops the card frame and the tab's own scroll area, for a container that already frames
|
|
19
|
+
* and scrolls it (the phone drawer). Nested, the inner scroll gets only a sliver of height.
|
|
20
|
+
*/
|
|
21
|
+
bare?: boolean;
|
|
18
22
|
}
|
|
19
23
|
|
|
20
|
-
let {
|
|
24
|
+
let {
|
|
25
|
+
schema,
|
|
26
|
+
values,
|
|
27
|
+
onValueChange,
|
|
28
|
+
panelFilter,
|
|
29
|
+
requestedTabId = null,
|
|
30
|
+
bare = false
|
|
31
|
+
}: Props = $props();
|
|
21
32
|
|
|
22
33
|
let activeTabId = $state('');
|
|
23
34
|
let collapsedGroups = $state<Record<string, boolean>>({});
|
|
@@ -66,10 +77,10 @@
|
|
|
66
77
|
}
|
|
67
78
|
</script>
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
{#snippet tabs()}
|
|
70
81
|
<Tabs.Root value={activeTabId} variant="line" class="min-h-0 flex-1">
|
|
71
82
|
{#if showTabBar}
|
|
72
|
-
<TabBar tabs={visibleTabs} {activeTabId} onTabChange={handleTabChange} />
|
|
83
|
+
<TabBar tabs={visibleTabs} {activeTabId} onTabChange={handleTabChange} {bare} />
|
|
73
84
|
{/if}
|
|
74
85
|
|
|
75
86
|
{#each visibleTabs as tab (tab.id)}
|
|
@@ -82,7 +93,17 @@
|
|
|
82
93
|
inputs={schema.inputs}
|
|
83
94
|
outputs={schema.outputs}
|
|
84
95
|
{dynamicOptions}
|
|
96
|
+
assets={schema.assets}
|
|
97
|
+
{bare}
|
|
85
98
|
/>
|
|
86
99
|
{/each}
|
|
87
100
|
</Tabs.Root>
|
|
88
|
-
|
|
101
|
+
{/snippet}
|
|
102
|
+
|
|
103
|
+
{#if bare}
|
|
104
|
+
{@render tabs()}
|
|
105
|
+
{:else}
|
|
106
|
+
<div class="min-h-0 flex flex-1 flex-col">
|
|
107
|
+
{@render tabs()}
|
|
108
|
+
</div>
|
|
109
|
+
{/if}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { SupportedTypes } from '@selvajs/schemas';
|
|
4
|
-
import { Checkbox } from '
|
|
4
|
+
import { Checkbox } from '#lib/components/primitives/checkbox/index.js';
|
|
5
5
|
|
|
6
6
|
interface Props {
|
|
7
7
|
inputId: string;
|