@selvajs/ui 6.6.0-beta.2 → 6.6.0-beta.20
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 +7 -3
- package/dist/components/compute/AppLayout.svelte +307 -123
- package/dist/components/compute/AppLayout.svelte.d.ts +28 -0
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +46 -22
- package/dist/components/compute/ComputeApp.svelte.d.ts +20 -3
- package/dist/components/compute/ComputeMessagesDialog.svelte +31 -41
- package/dist/components/compute/ParameterPresetManager.svelte +16 -65
- package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
- package/dist/components/compute/SolveMessages.svelte +128 -121
- package/dist/components/compute/SolveMessages.svelte.d.ts +12 -12
- package/dist/components/layout/AppShell.svelte +10 -6
- 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 +26 -14
- package/dist/components/layout/PageHeader.svelte +14 -10
- package/dist/components/layout/SectionHeader.svelte +4 -2
- package/dist/components/layout/SideNav.svelte +57 -8
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +131 -65
- package/dist/components/preview/Group.svelte +42 -22
- package/dist/components/preview/HelpButton.svelte +5 -3
- package/dist/components/preview/ImageOutput.svelte +435 -71
- package/dist/components/preview/InputControl.svelte +125 -51
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- package/dist/components/preview/OutputDisplay.svelte +42 -28
- package/dist/components/preview/TabBar.svelte +8 -6
- package/dist/components/preview/TabBar.svelte.d.ts +2 -0
- package/dist/components/preview/TabContent.svelte +66 -31
- 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 +357 -13
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +2 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +20 -5
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/FileInput.svelte +115 -103
- 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 +98 -16
- package/dist/components/preview/inputs/NumberInput.svelte.d.ts +2 -0
- 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 +11 -6
- 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 +56 -24
- package/dist/components/primitives/CalculateButton.svelte.d.ts +3 -0
- package/dist/components/primitives/Callout.svelte +8 -6
- package/dist/components/primitives/Callout.svelte.d.ts +4 -4
- package/dist/components/primitives/DataTable.svelte +38 -4
- package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
- 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 -15
- 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 +4 -4
- package/dist/components/primitives/badge/badge.svelte.d.ts +10 -10
- package/dist/components/primitives/button/button.svelte +10 -8
- package/dist/components/primitives/button/button.svelte.d.ts +20 -17
- 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 +7 -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 +4 -4
- 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 +5 -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/scroll-area/scroll-area.svelte +1 -1
- package/dist/components/primitives/search/search.svelte +2 -2
- 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 +8 -3
- package/dist/components/primitives/slider/slider.svelte.d.ts +5 -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 +3 -3
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +7 -7
- 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 +119 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
- package/dist/components/viewer/SceneManager.svelte +32 -21
- package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
- package/dist/components/viewer/Viewer.svelte +195 -207
- 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/run-panel-action.d.ts +8 -0
- package/dist/compute/run-panel-action.js +12 -0
- package/dist/compute/solving.svelte.d.ts +11 -7
- package/dist/compute/solving.svelte.js +64 -45
- package/dist/compute/useSolveSession.svelte.js +3 -0
- 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/localeContext.svelte.d.ts +10 -3
- package/dist/i18n/localeContext.svelte.js +27 -5
- package/dist/i18n/messages.d.ts +164 -2
- package/dist/i18n/messages.js +281 -11
- package/dist/index.d.ts +6 -1
- package/dist/index.js +5 -0
- package/dist/public.d.ts +2 -1
- 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 +38 -0
- package/dist/styles/base.css +116 -83
- package/dist/types/actionButton.d.ts +17 -3
- package/dist/types/presetLabels.d.ts +3 -2
- package/dist/types/presetLabels.js +9 -8
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/dist/utils/file-download.js +10 -22
- package/dist/utils/host-files.d.ts +12 -0
- package/dist/utils/host-files.js +46 -0
- package/dist/utils/loadScript.d.ts +2 -0
- package/dist/utils/loadScript.js +2 -0
- package/dist/utils/webp-to-png.d.ts +10 -0
- package/dist/utils/webp-to-png.js +41 -0
- package/package.json +30 -22
- package/src/lib/components/ErrorScreen.svelte +7 -3
- package/src/lib/components/compute/AppLayout.svelte +307 -123
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +46 -22
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +32 -42
- package/src/lib/components/compute/ParameterPresetManager.svelte +16 -65
- package/src/lib/components/compute/SolveMessages.svelte +130 -123
- package/src/lib/components/layout/AppShell.svelte +10 -6
- 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 +26 -14
- package/src/lib/components/layout/PageHeader.svelte +14 -10
- package/src/lib/components/layout/SectionHeader.svelte +4 -2
- package/src/lib/components/layout/SideNav.svelte +57 -8
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +131 -65
- package/src/lib/components/preview/Group.svelte +42 -22
- package/src/lib/components/preview/HelpButton.svelte +5 -3
- package/src/lib/components/preview/ImageOutput.svelte +435 -71
- package/src/lib/components/preview/InputControl.svelte +125 -51
- package/src/lib/components/preview/OutputDisplay.svelte +42 -28
- package/src/lib/components/preview/TabBar.svelte +8 -6
- package/src/lib/components/preview/TabContent.svelte +66 -31
- 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 +357 -13
- package/src/lib/components/preview/inputs/DropdownInput.svelte +20 -5
- package/src/lib/components/preview/inputs/FileInput.svelte +115 -103
- package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +98 -16
- 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 +11 -6
- 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 +56 -24
- package/src/lib/components/primitives/Callout.svelte +9 -7
- package/src/lib/components/primitives/DataTable.svelte +38 -4
- 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 -15
- 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 +5 -5
- package/src/lib/components/primitives/button/button.svelte +10 -8
- 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 +8 -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 +5 -5
- 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 +5 -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 +2 -2
- package/src/lib/components/primitives/search/search.svelte +3 -3
- 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 +9 -4
- 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 +4 -4
- 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 +119 -0
- package/src/lib/components/viewer/SceneManager.svelte +32 -21
- package/src/lib/components/viewer/Viewer.svelte +196 -208
- 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/run-panel-action.ts +16 -0
- package/src/lib/compute/solving.svelte.ts +66 -50
- package/src/lib/compute/useSolveSession.svelte.ts +3 -0
- 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/localeContext.svelte.ts +40 -5
- package/src/lib/i18n/messages.ts +487 -13
- package/src/lib/index.ts +23 -0
- package/src/lib/public.ts +2 -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 +50 -1
- package/src/lib/styles/base.css +116 -83
- package/src/lib/types/actionButton.ts +16 -3
- package/src/lib/types/presetLabels.ts +13 -11
- package/src/lib/utils/color-space.ts +107 -0
- package/src/lib/utils/file-download.ts +11 -21
- package/src/lib/utils/host-files.ts +61 -0
- package/src/lib/utils/loadScript.ts +3 -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/components/viewer/MeshMetadataDialog.svelte +0 -126
- package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
- 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/components/viewer/MeshMetadataDialog.svelte +0 -126
- 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,10 +26,21 @@
|
|
|
23
26
|
ColorInput,
|
|
24
27
|
DropdownInput,
|
|
25
28
|
FileInput,
|
|
29
|
+
GeometryInput,
|
|
26
30
|
NumberInput,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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';
|
|
30
44
|
|
|
31
45
|
interface Props {
|
|
32
46
|
item: InputLayoutItem;
|
|
@@ -41,6 +55,10 @@
|
|
|
41
55
|
disabled?: boolean;
|
|
42
56
|
/** Runtime-computed options for a dynamic value list input (name -> value). */
|
|
43
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'];
|
|
44
62
|
}
|
|
45
63
|
|
|
46
64
|
let {
|
|
@@ -49,9 +67,26 @@
|
|
|
49
67
|
displayName,
|
|
50
68
|
onChange,
|
|
51
69
|
disabled = false,
|
|
52
|
-
dynamicOptions
|
|
70
|
+
dynamicOptions,
|
|
71
|
+
paramType,
|
|
72
|
+
assets
|
|
53
73
|
}: Props = $props();
|
|
54
74
|
|
|
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
|
+
}
|
|
89
|
+
|
|
55
90
|
const inputId = $derived(`input-${item.paramId}`);
|
|
56
91
|
const label = $derived(displayName || item.displayName || item.paramId);
|
|
57
92
|
|
|
@@ -99,7 +134,8 @@
|
|
|
99
134
|
// As a dropdown config so DropdownInput/ChecklistInput can consume it unchanged.
|
|
100
135
|
const dynamicListAsDropdownConfig = $derived<DropdownWidgetConfig>({
|
|
101
136
|
options: dynamicListOptions,
|
|
102
|
-
displayAs: dynamicListConfig?.displayAs ?? 'dropdown'
|
|
137
|
+
displayAs: dynamicListConfig?.displayAs ?? 'dropdown',
|
|
138
|
+
optionMedia: dynamicListConfig?.optionMedia
|
|
103
139
|
});
|
|
104
140
|
const hideDynamicListWhenEmpty = $derived(
|
|
105
141
|
isDynamicValueListWidget(item) &&
|
|
@@ -170,8 +206,54 @@
|
|
|
170
206
|
}
|
|
171
207
|
</script>
|
|
172
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
|
+
|
|
173
251
|
{#snippet labelText(forId?: string, tone: 'quiet' | 'strong' = 'quiet')}
|
|
174
|
-
<Field.Label
|
|
252
|
+
<Field.Label
|
|
253
|
+
for={forId}
|
|
254
|
+
id={forId ? `${forId}-label` : undefined}
|
|
255
|
+
class="min-w-0 block break-words"
|
|
256
|
+
>
|
|
175
257
|
<span
|
|
176
258
|
class={tone === 'quiet' ? 'font-normal text-muted-foreground' : 'font-normal text-foreground'}
|
|
177
259
|
>{label}</span
|
|
@@ -201,7 +283,7 @@
|
|
|
201
283
|
|
|
202
284
|
{#if isClientSlot}
|
|
203
285
|
{#if clientSlot}
|
|
204
|
-
<div role="group" class="group/field gap-
|
|
286
|
+
<div role="group" class="group/field gap-2 min-w-0 flex flex-col">
|
|
205
287
|
{@render fieldHeader()}
|
|
206
288
|
{@render clientSlot({
|
|
207
289
|
inputId: item.paramId,
|
|
@@ -211,8 +293,36 @@
|
|
|
211
293
|
})}
|
|
212
294
|
</div>
|
|
213
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>
|
|
214
324
|
{:else if !hideDynamicListWhenEmpty}
|
|
215
|
-
<div role="group" class="group/field gap-
|
|
325
|
+
<div role="group" class="group/field gap-2 min-w-0 flex flex-col">
|
|
216
326
|
{#if !isCheckboxWidget(item)}
|
|
217
327
|
{@render fieldHeader(inputId)}
|
|
218
328
|
{/if}
|
|
@@ -221,6 +331,7 @@
|
|
|
221
331
|
{@const config = item.config}
|
|
222
332
|
<NumberInput
|
|
223
333
|
{inputId}
|
|
334
|
+
labelId="{inputId}-label"
|
|
224
335
|
value={typeof value === 'number' ? value : undefined}
|
|
225
336
|
{config}
|
|
226
337
|
onChange={commit}
|
|
@@ -246,51 +357,12 @@
|
|
|
246
357
|
{disabled}
|
|
247
358
|
/>
|
|
248
359
|
{:else if isDropdownWidget(item)}
|
|
249
|
-
{@
|
|
250
|
-
{#if config.displayAs === 'checklist'}
|
|
251
|
-
<ChecklistInput
|
|
252
|
-
{inputId}
|
|
253
|
-
value={Array.isArray(value)
|
|
254
|
-
? (value as string[])
|
|
255
|
-
: typeof value === 'string' && value
|
|
256
|
-
? [value]
|
|
257
|
-
: []}
|
|
258
|
-
{config}
|
|
259
|
-
onChange={commit}
|
|
260
|
-
{disabled}
|
|
261
|
-
/>
|
|
262
|
-
{:else}
|
|
263
|
-
<DropdownInput
|
|
264
|
-
value={typeof value === 'string' ? value : ''}
|
|
265
|
-
{config}
|
|
266
|
-
onChange={commit}
|
|
267
|
-
{disabled}
|
|
268
|
-
/>
|
|
269
|
-
{/if}
|
|
360
|
+
{@render valueList(item.config)}
|
|
270
361
|
{:else if isDynamicValueListWidget(item)}
|
|
271
362
|
{#if dynamicListHasOptions}
|
|
272
|
-
{
|
|
273
|
-
<ChecklistInput
|
|
274
|
-
{inputId}
|
|
275
|
-
value={Array.isArray(value)
|
|
276
|
-
? (value as string[])
|
|
277
|
-
: typeof value === 'string' && value
|
|
278
|
-
? [value]
|
|
279
|
-
: []}
|
|
280
|
-
config={dynamicListAsDropdownConfig}
|
|
281
|
-
onChange={commit}
|
|
282
|
-
{disabled}
|
|
283
|
-
/>
|
|
284
|
-
{:else}
|
|
285
|
-
<DropdownInput
|
|
286
|
-
value={typeof value === 'string' ? value : ''}
|
|
287
|
-
config={dynamicListAsDropdownConfig}
|
|
288
|
-
onChange={commit}
|
|
289
|
-
{disabled}
|
|
290
|
-
/>
|
|
291
|
-
{/if}
|
|
363
|
+
{@render valueList(dynamicListAsDropdownConfig)}
|
|
292
364
|
{:else}
|
|
293
|
-
<p class="text-sm text-muted-foreground">
|
|
365
|
+
<p class="text-sm text-muted-foreground">{locale.messages.noOptionsYet}</p>
|
|
294
366
|
{/if}
|
|
295
367
|
{:else if isFileWidget(item)}
|
|
296
368
|
{@const config = item.config as FileInputWidgetConfig}
|
|
@@ -303,8 +375,10 @@
|
|
|
303
375
|
/>
|
|
304
376
|
{:else if isColorWidget(item)}
|
|
305
377
|
<ColorInput
|
|
378
|
+
{inputId}
|
|
306
379
|
value={typeof value === 'string' ? value : '#000000'}
|
|
307
380
|
onChange={(newValue) => commit(newValue)}
|
|
381
|
+
{disabled}
|
|
308
382
|
/>
|
|
309
383
|
{/if}
|
|
310
384
|
</div>
|
|
@@ -8,12 +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 '
|
|
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';
|
|
17
19
|
|
|
18
20
|
interface Props {
|
|
19
21
|
item: OutputLayoutItem;
|
|
@@ -23,6 +25,9 @@
|
|
|
23
25
|
|
|
24
26
|
let { item, value, displayName }: Props = $props();
|
|
25
27
|
|
|
28
|
+
const locale = getLocaleContext();
|
|
29
|
+
const t = $derived(locale.messages);
|
|
30
|
+
|
|
26
31
|
let copied = $state(false);
|
|
27
32
|
let copyTimeout: ReturnType<typeof setTimeout>;
|
|
28
33
|
|
|
@@ -33,7 +38,7 @@
|
|
|
33
38
|
);
|
|
34
39
|
const hasValue = $derived(value != null);
|
|
35
40
|
|
|
36
|
-
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';
|
|
37
42
|
|
|
38
43
|
async function copyToClipboard() {
|
|
39
44
|
try {
|
|
@@ -142,7 +147,7 @@
|
|
|
142
147
|
await downloadFiles(filesArray, fileName);
|
|
143
148
|
}
|
|
144
149
|
} catch (err) {
|
|
145
|
-
downloadError = err instanceof Error ? err.message :
|
|
150
|
+
downloadError = err instanceof Error ? err.message : t.downloadFailed;
|
|
146
151
|
console.error('[OutputDisplayWidget] Download error:', err);
|
|
147
152
|
} finally {
|
|
148
153
|
downloading = false;
|
|
@@ -152,7 +157,11 @@
|
|
|
152
157
|
|
|
153
158
|
{#snippet fieldHeader()}
|
|
154
159
|
<div class="gap-2 flex items-center">
|
|
155
|
-
<Label>
|
|
160
|
+
<Label>
|
|
161
|
+
<span class={item.widgetType === 'number' ? 'text-xs font-normal text-muted-foreground' : ''}
|
|
162
|
+
>{label}</span
|
|
163
|
+
>
|
|
164
|
+
</Label>
|
|
156
165
|
{#if item.description}
|
|
157
166
|
<HelpButton {label} description={item.description} />
|
|
158
167
|
{/if}
|
|
@@ -160,7 +169,7 @@
|
|
|
160
169
|
{/snippet}
|
|
161
170
|
|
|
162
171
|
{#snippet placeholder()}
|
|
163
|
-
<span class="text-muted-foreground not-italic">
|
|
172
|
+
<span class="text-muted-foreground not-italic">{t.waitingForData}</span>
|
|
164
173
|
{/snippet}
|
|
165
174
|
|
|
166
175
|
{#snippet treeNodes(nodes: Map<string, TreeNode>, path: string)}
|
|
@@ -185,7 +194,7 @@
|
|
|
185
194
|
<span class="font-medium">{node.name}</span>
|
|
186
195
|
</button>
|
|
187
196
|
{#if isOpen}
|
|
188
|
-
<div class="ml-4 pl-2 border-l border-border
|
|
197
|
+
<div class="ml-4 pl-2 border-l border-border-strong">
|
|
189
198
|
{@render treeNodes(node.children, folderPath)}
|
|
190
199
|
</div>
|
|
191
200
|
{/if}
|
|
@@ -208,17 +217,19 @@
|
|
|
208
217
|
|
|
209
218
|
{#snippet fileDisplay()}
|
|
210
219
|
{#if fileCount === 0}
|
|
211
|
-
<div
|
|
212
|
-
|
|
220
|
+
<div
|
|
221
|
+
class="px-3 py-3 text-sm rounded-md border border-border-strong bg-muted text-muted-foreground"
|
|
222
|
+
>
|
|
223
|
+
{t.waitingForFiles}
|
|
213
224
|
</div>
|
|
214
225
|
{:else}
|
|
215
226
|
<div class="gap-2 flex flex-col">
|
|
216
|
-
<div class="
|
|
227
|
+
<div class="px-3 py-2 rounded-md border border-border-strong bg-muted">
|
|
217
228
|
<div class="gap-2 flex items-center justify-between">
|
|
218
229
|
<span class="min-w-0 text-sm font-medium truncate text-foreground">
|
|
219
230
|
{fileCount === 1
|
|
220
231
|
? `${filesArray[0].fileName}${filesArray[0].fileType}`
|
|
221
|
-
:
|
|
232
|
+
: formatMessage(t.fileCount, { count: fileCount })}
|
|
222
233
|
</span>
|
|
223
234
|
<span class="text-xs shrink-0 text-muted-foreground">{formatFileSize(totalSize)}</span>
|
|
224
235
|
</div>
|
|
@@ -243,33 +254,33 @@
|
|
|
243
254
|
</div>
|
|
244
255
|
{#if hasDuplicates}
|
|
245
256
|
<div
|
|
246
|
-
class="
|
|
257
|
+
class="px-3 py-2 text-sm rounded-md border border-destructive bg-destructive/10 text-destructive"
|
|
247
258
|
>
|
|
248
|
-
<div class="font-medium">
|
|
259
|
+
<div class="font-medium">{t.duplicateFilesTitle}</div>
|
|
249
260
|
<div class="mt-1 text-xs">
|
|
250
|
-
|
|
261
|
+
{formatCount(duplicatePaths.length, t.duplicatePathsOne, t.duplicatePathsOther)}
|
|
251
262
|
</div>
|
|
252
263
|
<ul class="mt-1 ml-4 text-xs list-disc">
|
|
253
264
|
{#each duplicatePaths as path (path)}
|
|
254
265
|
<li class="truncate"><span class="font-mono">{path}</span></li>
|
|
255
266
|
{/each}
|
|
256
267
|
</ul>
|
|
257
|
-
<div class="mt-1 text-xs">
|
|
258
|
-
Rename outputs in your Grasshopper definition so each file has a unique name.
|
|
259
|
-
</div>
|
|
268
|
+
<div class="mt-1 text-xs">{t.duplicateFilesHint}</div>
|
|
260
269
|
</div>
|
|
261
270
|
{/if}
|
|
262
271
|
{#if downloadError}
|
|
263
272
|
<div
|
|
264
|
-
class="
|
|
273
|
+
class="px-3 py-2 text-sm rounded-md border border-destructive bg-destructive/10 text-destructive"
|
|
265
274
|
>
|
|
266
275
|
{downloadError}
|
|
267
276
|
</div>
|
|
268
277
|
{/if}
|
|
269
278
|
<Button onclick={handleDownload} disabled={downloading || hasDuplicates} class="w-full">
|
|
270
279
|
{downloading
|
|
271
|
-
?
|
|
272
|
-
:
|
|
280
|
+
? t.downloading
|
|
281
|
+
: fileCount === 1
|
|
282
|
+
? t.downloadFile
|
|
283
|
+
: formatMessage(t.downloadFiles, { count: fileCount })}
|
|
273
284
|
</Button>
|
|
274
285
|
</div>
|
|
275
286
|
{/if}
|
|
@@ -277,7 +288,10 @@
|
|
|
277
288
|
|
|
278
289
|
<!-- Dynamic value list outputs are routing sinks (their options feed an input), not displayed. -->
|
|
279
290
|
{#if item.widgetType !== 'dynamicValueList'}
|
|
280
|
-
<div
|
|
291
|
+
<div
|
|
292
|
+
role="group"
|
|
293
|
+
class="group/field flex flex-col {item.widgetType === 'number' ? 'gap-0.5' : 'gap-2'}"
|
|
294
|
+
>
|
|
281
295
|
{@render fieldHeader()}
|
|
282
296
|
|
|
283
297
|
{#if item.widgetType === 'chart'}
|
|
@@ -290,21 +304,21 @@
|
|
|
290
304
|
{:else if item.widgetType === 'file'}
|
|
291
305
|
{@render fileDisplay()}
|
|
292
306
|
{:else if item.widgetType === 'number'}
|
|
293
|
-
<div class="
|
|
307
|
+
<div class="min-h-8 text-2xl font-semibold wrap-break-word text-foreground tabular-nums">
|
|
294
308
|
{#if hasValue}
|
|
295
|
-
|
|
309
|
+
{formattedValue}
|
|
296
310
|
{:else}
|
|
297
|
-
{@render placeholder()}
|
|
311
|
+
<span class="text-base font-normal">{@render placeholder()}</span>
|
|
298
312
|
{/if}
|
|
299
313
|
</div>
|
|
300
314
|
{:else if item.widgetType === 'text'}
|
|
301
315
|
<div class="group relative">
|
|
302
316
|
{#if isObjectValue}
|
|
303
317
|
<pre
|
|
304
|
-
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>
|
|
305
319
|
{:else}
|
|
306
320
|
<div
|
|
307
|
-
class="{boxClass} bg-muted
|
|
321
|
+
class="{boxClass} bg-muted wrap-anywhere wrap-break-word whitespace-pre-wrap text-foreground"
|
|
308
322
|
>
|
|
309
323
|
{#if hasValue}{value}{:else}{@render placeholder()}{/if}
|
|
310
324
|
</div>
|
|
@@ -313,10 +327,10 @@
|
|
|
313
327
|
<div
|
|
314
328
|
class="right-2 top-2 absolute transition-opacity {copied
|
|
315
329
|
? 'opacity-100'
|
|
316
|
-
: 'opacity-0 group-hover:opacity-100 focus-within:opacity-100'}"
|
|
330
|
+
: 'opacity-0 group-hover:opacity-100 focus-within:opacity-100 pointer-coarse:opacity-100'}"
|
|
317
331
|
>
|
|
318
332
|
<Button onclick={copyToClipboard} size="sm">
|
|
319
|
-
{copied ?
|
|
333
|
+
{copied ? t.copied : t.copy}
|
|
320
334
|
</Button>
|
|
321
335
|
</div>
|
|
322
336
|
{/if}
|
|
@@ -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,31 +105,44 @@
|
|
|
83
105
|
{/if}
|
|
84
106
|
{/snippet}
|
|
85
107
|
|
|
86
|
-
|
|
87
|
-
<div class=
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
{/if}
|
|
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,
|
|
111
|
+
already names it on screen. -->
|
|
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}
|
|
110
131
|
</div>
|
|
111
|
-
|
|
132
|
+
{/if}
|
|
112
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}
|
|
113
148
|
</Tabs.Content>
|