@selvajs/ui 6.5.1-beta.1 → 6.6.0-beta.12
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/dist/components/ConfirmDialog.svelte +2 -10
- package/dist/components/ErrorScreen.svelte +21 -27
- package/dist/components/compute/AppLayout.svelte +298 -128
- package/dist/components/compute/AppLayout.svelte.d.ts +22 -0
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +45 -24
- package/dist/components/compute/ComputeApp.svelte.d.ts +19 -2
- package/dist/components/compute/ComputeMessagesDialog.svelte +47 -83
- package/dist/components/compute/ParameterPresetManager.svelte +37 -130
- package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
- package/dist/components/compute/SolveMessages.svelte +131 -77
- package/dist/components/compute/SolveMessages.svelte.d.ts +7 -12
- package/dist/components/layout/AppShell.svelte +10 -6
- package/dist/components/layout/PageFooter.svelte +23 -11
- package/dist/components/layout/PageHeader.svelte +11 -7
- package/dist/components/layout/Pagination.svelte +2 -4
- package/dist/components/layout/SectionHeader.svelte +4 -2
- package/dist/components/layout/SideNav.svelte +56 -7
- package/dist/components/preview/ChartOutput.svelte +91 -48
- package/dist/components/preview/Group.svelte +92 -103
- package/dist/components/preview/Group.svelte.d.ts +1 -1
- package/dist/components/preview/HelpButton.svelte +36 -0
- package/dist/components/preview/HelpButton.svelte.d.ts +8 -0
- package/dist/components/preview/ImageOutput.svelte +434 -72
- package/dist/components/preview/InputControl.svelte +163 -90
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- package/dist/components/preview/OutputDisplay.svelte +44 -42
- package/dist/components/preview/TabBar.svelte +106 -22
- package/dist/components/preview/TabBar.svelte.d.ts +1 -0
- package/dist/components/preview/TabContent.svelte +63 -57
- package/dist/components/preview/TabContent.svelte.d.ts +5 -1
- package/dist/components/preview/TabLayout.svelte +27 -5
- package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
- package/dist/components/preview/inputs/CheckboxInput.svelte +7 -7
- package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +3 -0
- package/dist/components/preview/inputs/ChecklistInput.svelte +7 -2
- package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/ColorInput.svelte +4 -2
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +19 -4
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/FileInput.svelte +112 -108
- 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 +123 -61
- 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 +44 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/TextInput.svelte +8 -4
- package/dist/components/preview/inputs/TileInput.svelte +80 -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 +11 -18
- package/dist/components/primitives/DataTable.svelte +38 -5
- package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
- package/dist/components/primitives/FilterableDropdown.svelte +42 -129
- package/dist/components/primitives/FilterableDropdown.svelte.d.ts +1 -1
- package/dist/components/primitives/IssueList.svelte +56 -0
- package/dist/components/primitives/IssueList.svelte.d.ts +20 -0
- package/dist/components/primitives/SeverityIcon.svelte +15 -0
- package/dist/components/primitives/SeverityIcon.svelte.d.ts +8 -0
- package/dist/components/primitives/SolvingIndicator.svelte +43 -42
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +6 -0
- package/dist/components/primitives/StateDisplay.svelte +19 -79
- package/dist/components/primitives/ViewToggle.svelte +18 -33
- package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
- package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +6 -1
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/dist/components/primitives/badge/badge.svelte +2 -2
- package/dist/components/primitives/badge/badge.svelte.d.ts +4 -4
- package/dist/components/primitives/button/button.svelte +6 -2
- package/dist/components/primitives/button/button.svelte.d.ts +10 -4
- package/dist/components/primitives/card/card-header.svelte +1 -1
- package/dist/components/primitives/card/card.svelte +21 -5
- package/dist/components/primitives/card/card.svelte.d.ts +25 -1
- package/dist/components/primitives/card/index.d.ts +1 -2
- package/dist/components/primitives/card/index.js +2 -3
- package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
- package/dist/components/primitives/command/command-dialog.svelte +42 -0
- package/dist/components/primitives/command/command-dialog.svelte.d.ts +14 -0
- package/dist/components/primitives/command/command-empty.svelte +17 -0
- package/dist/components/primitives/command/command-empty.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-group.svelte +33 -0
- package/dist/components/primitives/command/command-group.svelte.d.ts +7 -0
- package/dist/components/primitives/command/command-input.svelte +36 -0
- package/dist/components/primitives/command/command-input.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-item.svelte +28 -0
- package/dist/components/primitives/command/command-item.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-link-item.svelte +21 -0
- package/dist/components/primitives/command/command-link-item.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-list.svelte +20 -0
- package/dist/components/primitives/command/command-list.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-loading.svelte +7 -0
- package/dist/components/primitives/command/command-loading.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-separator.svelte +17 -0
- package/dist/components/primitives/command/command-separator.svelte.d.ts +4 -0
- package/dist/components/primitives/command/command-shortcut.svelte +23 -0
- package/dist/components/primitives/command/command-shortcut.svelte.d.ts +5 -0
- package/dist/components/primitives/command/command.svelte +28 -0
- package/dist/components/primitives/command/command.svelte.d.ts +8 -0
- package/dist/components/primitives/command/index.d.ts +12 -0
- package/dist/components/primitives/command/index.js +14 -0
- package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-content.svelte +11 -3
- package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +2 -0
- package/dist/components/primitives/dialog/dialog-overlay.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-title.svelte +6 -2
- package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +5 -1
- package/dist/components/primitives/drawer/Drawer.svelte +2 -2
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +9 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +10 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +8 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-group.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +8 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-label.svelte.d.ts +8 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-portal.svelte.d.ts +3 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-separator.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +5 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +10 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub.svelte.d.ts +3 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.svelte.d.ts +3 -0
- package/dist/components/primitives/dropdown-menu/index.d.ts +18 -0
- package/dist/components/primitives/dropdown-menu/index.js +18 -0
- package/dist/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
- package/dist/components/primitives/empty/empty-content.svelte.d.ts +5 -0
- package/dist/components/primitives/empty/empty-description.svelte +23 -0
- package/dist/components/primitives/{alert/alert-description.svelte.d.ts → empty/empty-description.svelte.d.ts} +4 -4
- package/dist/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
- package/dist/components/primitives/empty/empty-header.svelte.d.ts +5 -0
- package/dist/components/primitives/empty/empty-media.svelte +41 -0
- package/dist/components/primitives/empty/empty-media.svelte.d.ts +26 -0
- package/dist/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
- package/dist/components/primitives/{card/card-action.svelte.d.ts → empty/empty-title.svelte.d.ts} +3 -3
- package/dist/components/primitives/empty/empty.svelte +23 -0
- package/dist/components/primitives/empty/empty.svelte.d.ts +5 -0
- package/dist/components/primitives/empty/index.d.ts +7 -0
- package/dist/components/primitives/empty/index.js +9 -0
- package/dist/components/primitives/index.d.ts +10 -1
- package/dist/components/primitives/index.js +10 -1
- package/dist/components/primitives/input/input.svelte +4 -4
- package/dist/components/primitives/input-group/index.d.ts +7 -0
- package/dist/components/primitives/input-group/index.js +9 -0
- package/dist/components/primitives/input-group/input-group-addon.svelte +53 -0
- package/dist/components/primitives/input-group/input-group-addon.svelte.d.ts +32 -0
- package/dist/components/primitives/input-group/input-group-button.svelte +49 -0
- package/dist/components/primitives/input-group/input-group-button.svelte.d.ts +32 -0
- package/dist/components/primitives/input-group/input-group-input.svelte +25 -0
- package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +11 -0
- package/dist/components/primitives/input-group/input-group-text.svelte +22 -0
- package/dist/components/primitives/input-group/input-group-text.svelte.d.ts +5 -0
- package/dist/components/primitives/input-group/input-group-textarea.svelte +23 -0
- package/dist/components/primitives/input-group/input-group-textarea.svelte.d.ts +3 -0
- package/dist/components/primitives/input-group/input-group.svelte +24 -0
- package/dist/components/primitives/{alert/alert-title.svelte.d.ts → input-group/input-group.svelte.d.ts} +4 -4
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
- package/dist/components/primitives/popover/index.d.ts +9 -0
- package/dist/components/primitives/popover/index.js +11 -0
- package/dist/components/primitives/popover/popover-close.svelte +7 -0
- package/dist/components/primitives/popover/popover-close.svelte.d.ts +4 -0
- package/dist/components/primitives/popover/popover-content.svelte +31 -0
- package/dist/components/primitives/popover/popover-content.svelte.d.ts +10 -0
- package/dist/components/primitives/popover/popover-description.svelte +20 -0
- package/dist/components/primitives/popover/popover-description.svelte.d.ts +5 -0
- package/dist/components/primitives/popover/popover-header.svelte +20 -0
- package/dist/components/primitives/popover/popover-header.svelte.d.ts +5 -0
- package/dist/components/primitives/popover/popover-portal.svelte +7 -0
- package/dist/components/primitives/popover/popover-portal.svelte.d.ts +3 -0
- package/dist/components/primitives/popover/popover-title.svelte +15 -0
- package/dist/components/primitives/popover/popover-title.svelte.d.ts +5 -0
- package/dist/components/primitives/popover/popover-trigger.svelte +17 -0
- package/dist/components/primitives/popover/popover-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/popover/popover.svelte +7 -0
- package/dist/components/primitives/popover/popover.svelte.d.ts +3 -0
- package/dist/components/primitives/resizable/resizable-handle.svelte +6 -2
- package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +2 -0
- package/dist/components/primitives/resizable/resizable-pane-group.svelte +1 -4
- package/dist/components/primitives/scroll-area/scroll-area.svelte +1 -1
- package/dist/components/primitives/search/search.svelte +3 -3
- package/dist/components/primitives/select/select-content.svelte +1 -1
- package/dist/components/primitives/select/select-trigger.svelte +1 -1
- package/dist/components/primitives/severity.d.ts +7 -0
- package/dist/components/primitives/severity.js +19 -0
- package/dist/components/primitives/slider/slider.svelte +8 -3
- package/dist/components/primitives/slider/slider.svelte.d.ts +5 -1
- package/dist/components/primitives/sonner/sonner.svelte +1 -1
- package/dist/components/primitives/spinner/index.d.ts +1 -0
- package/dist/components/primitives/spinner/index.js +1 -0
- package/dist/components/primitives/spinner/spinner.svelte +29 -0
- package/dist/components/primitives/spinner/spinner.svelte.d.ts +4 -0
- package/dist/components/primitives/switch/switch.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-list.svelte +27 -5
- package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +22 -1
- package/dist/components/primitives/tabs/tabs-trigger.svelte +23 -5
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +22 -1
- package/dist/components/primitives/tabs/tabs.svelte +6 -2
- package/dist/components/primitives/tabs/tabs.svelte.d.ts +5 -1
- package/dist/components/primitives/textarea/textarea.svelte +1 -1
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
- package/dist/components/primitives/toggle/index.d.ts +3 -0
- package/dist/components/primitives/toggle/index.js +5 -0
- package/dist/components/primitives/toggle/toggle.svelte +54 -0
- package/dist/components/primitives/toggle/toggle.svelte.d.ts +46 -0
- package/dist/components/primitives/toggle-group/index.d.ts +3 -0
- package/dist/components/primitives/toggle-group/index.js +5 -0
- package/dist/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
- package/dist/components/primitives/toggle-group/toggle-group-item.svelte.d.ts +6 -0
- package/dist/components/primitives/toggle-group/toggle-group.svelte +75 -0
- package/dist/components/primitives/toggle-group/toggle-group.svelte.d.ts +17 -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 +14 -5
- package/dist/components/viewer/Viewer.svelte +243 -221
- package/dist/components/viewer/Viewer.svelte.d.ts +3 -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 +7 -9
- package/dist/contexts/hostContext.svelte.d.ts +39 -0
- package/dist/contexts/hostContext.svelte.js +9 -0
- package/dist/i18n/localeContext.svelte.d.ts +10 -3
- package/dist/i18n/localeContext.svelte.js +27 -5
- package/dist/i18n/messages.d.ts +150 -2
- package/dist/i18n/messages.js +261 -11
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -0
- package/dist/public.d.ts +1 -1
- 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.js +21 -0
- package/dist/styles/base.css +80 -10
- 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/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 +19 -15
- package/src/lib/components/ConfirmDialog.svelte +2 -10
- package/src/lib/components/ErrorScreen.svelte +21 -27
- package/src/lib/components/compute/AppLayout.svelte +298 -128
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +45 -24
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +47 -83
- package/src/lib/components/compute/ParameterPresetManager.svelte +37 -130
- package/src/lib/components/compute/SolveMessages.svelte +131 -77
- package/src/lib/components/layout/AppShell.svelte +10 -6
- package/src/lib/components/layout/PageFooter.svelte +23 -11
- package/src/lib/components/layout/PageHeader.svelte +11 -7
- package/src/lib/components/layout/Pagination.svelte +2 -4
- package/src/lib/components/layout/SectionHeader.svelte +4 -2
- package/src/lib/components/layout/SideNav.svelte +56 -7
- package/src/lib/components/preview/ChartOutput.svelte +91 -48
- package/src/lib/components/preview/Group.svelte +92 -103
- package/src/lib/components/preview/HelpButton.svelte +36 -0
- package/src/lib/components/preview/ImageOutput.svelte +434 -72
- package/src/lib/components/preview/InputControl.svelte +163 -90
- package/src/lib/components/preview/OutputDisplay.svelte +44 -42
- package/src/lib/components/preview/TabBar.svelte +106 -22
- package/src/lib/components/preview/TabContent.svelte +63 -57
- package/src/lib/components/preview/TabLayout.svelte +27 -5
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +7 -7
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +7 -2
- package/src/lib/components/preview/inputs/ColorInput.svelte +4 -2
- package/src/lib/components/preview/inputs/DropdownInput.svelte +19 -4
- package/src/lib/components/preview/inputs/FileInput.svelte +112 -108
- package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +123 -61
- package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/src/lib/components/preview/inputs/SegmentedInput.svelte +44 -0
- package/src/lib/components/preview/inputs/TextInput.svelte +8 -4
- package/src/lib/components/preview/inputs/TileInput.svelte +80 -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 +11 -18
- package/src/lib/components/primitives/DataTable.svelte +38 -5
- package/src/lib/components/primitives/FilterableDropdown.svelte +42 -129
- package/src/lib/components/primitives/IssueList.svelte +56 -0
- package/src/lib/components/primitives/SeverityIcon.svelte +15 -0
- package/src/lib/components/primitives/SolvingIndicator.svelte +43 -42
- package/src/lib/components/primitives/StateDisplay.svelte +19 -79
- package/src/lib/components/primitives/ViewToggle.svelte +18 -33
- package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +9 -3
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/badge/badge.svelte +2 -2
- package/src/lib/components/primitives/button/button.svelte +6 -2
- package/src/lib/components/primitives/card/card-header.svelte +1 -1
- package/src/lib/components/primitives/card/card.svelte +21 -5
- package/src/lib/components/primitives/card/index.ts +1 -4
- package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
- package/src/lib/components/primitives/command/command-dialog.svelte +42 -0
- package/src/lib/components/primitives/command/command-empty.svelte +17 -0
- package/src/lib/components/primitives/command/command-group.svelte +33 -0
- package/src/lib/components/primitives/command/command-input.svelte +36 -0
- package/src/lib/components/primitives/command/command-item.svelte +28 -0
- package/src/lib/components/primitives/command/command-link-item.svelte +21 -0
- package/src/lib/components/primitives/command/command-list.svelte +20 -0
- package/src/lib/components/primitives/command/command-loading.svelte +7 -0
- package/src/lib/components/primitives/command/command-separator.svelte +17 -0
- package/src/lib/components/primitives/command/command-shortcut.svelte +23 -0
- package/src/lib/components/primitives/command/command.svelte +28 -0
- package/src/lib/components/primitives/command/index.ts +37 -0
- package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-content.svelte +11 -3
- package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-title.svelte +6 -2
- package/src/lib/components/primitives/drawer/Drawer.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +31 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group.svelte +7 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +27 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +24 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-portal.svelte +7 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +17 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +23 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub.svelte +7 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu.svelte +7 -0
- package/src/lib/components/primitives/dropdown-menu/index.ts +54 -0
- package/src/lib/components/primitives/{alert/alert-description.svelte → empty/empty-content.svelte} +3 -3
- package/src/lib/components/primitives/empty/empty-description.svelte +23 -0
- package/src/lib/components/primitives/{alert/alert-title.svelte → empty/empty-header.svelte} +3 -3
- package/src/lib/components/primitives/empty/empty-media.svelte +41 -0
- package/src/lib/components/primitives/{card/card-action.svelte → empty/empty-title.svelte} +2 -2
- package/src/lib/components/primitives/empty/empty.svelte +23 -0
- package/src/lib/components/primitives/empty/index.ts +22 -0
- package/src/lib/components/primitives/index.ts +10 -1
- package/src/lib/components/primitives/input/input.svelte +4 -4
- package/src/lib/components/primitives/input-group/index.ts +22 -0
- package/src/lib/components/primitives/input-group/input-group-addon.svelte +53 -0
- package/src/lib/components/primitives/input-group/input-group-button.svelte +49 -0
- package/src/lib/components/primitives/input-group/input-group-input.svelte +25 -0
- package/src/lib/components/primitives/input-group/input-group-text.svelte +22 -0
- package/src/lib/components/primitives/input-group/input-group-textarea.svelte +23 -0
- package/src/lib/components/primitives/input-group/input-group.svelte +24 -0
- package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +6 -7
- package/src/lib/components/primitives/popover/index.ts +28 -0
- package/src/lib/components/primitives/popover/popover-close.svelte +7 -0
- package/src/lib/components/primitives/popover/popover-content.svelte +31 -0
- package/src/lib/components/primitives/popover/popover-description.svelte +20 -0
- package/src/lib/components/primitives/popover/popover-header.svelte +20 -0
- package/src/lib/components/primitives/popover/popover-portal.svelte +7 -0
- package/src/lib/components/primitives/popover/popover-title.svelte +15 -0
- package/src/lib/components/primitives/popover/popover-trigger.svelte +17 -0
- package/src/lib/components/primitives/popover/popover.svelte +7 -0
- package/src/lib/components/primitives/resizable/resizable-handle.svelte +6 -2
- package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -4
- package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
- package/src/lib/components/primitives/search/search.svelte +3 -3
- package/src/lib/components/primitives/select/select-content.svelte +1 -1
- package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
- package/src/lib/components/primitives/severity.ts +26 -0
- package/src/lib/components/primitives/slider/slider.svelte +8 -3
- package/src/lib/components/primitives/sonner/sonner.svelte +1 -1
- package/src/lib/components/primitives/spinner/index.ts +1 -0
- package/src/lib/components/primitives/spinner/spinner.svelte +29 -0
- package/src/lib/components/primitives/switch/switch.svelte +2 -2
- package/src/lib/components/primitives/tabs/tabs-list.svelte +27 -5
- package/src/lib/components/primitives/tabs/tabs-trigger.svelte +23 -5
- package/src/lib/components/primitives/tabs/tabs.svelte +6 -2
- package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
- package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +1 -1
- package/src/lib/components/primitives/toggle/index.ts +13 -0
- package/src/lib/components/primitives/toggle/toggle.svelte +54 -0
- package/src/lib/components/primitives/toggle-group/index.ts +10 -0
- package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +35 -0
- package/src/lib/components/primitives/toggle-group/toggle-group.svelte +75 -0
- package/src/lib/components/viewer/MeshMetadataPanel.svelte +119 -0
- package/src/lib/components/viewer/SceneManager.svelte +14 -5
- package/src/lib/components/viewer/Viewer.svelte +243 -221
- 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 +7 -9
- package/src/lib/contexts/hostContext.svelte.ts +51 -0
- package/src/lib/i18n/localeContext.svelte.ts +40 -5
- package/src/lib/i18n/messages.ts +453 -13
- package/src/lib/index.ts +21 -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 +23 -0
- package/src/lib/styles/base.css +80 -10
- package/src/lib/types/actionButton.ts +16 -3
- package/src/lib/types/presetLabels.ts +13 -11
- 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/alert/alert.svelte +0 -44
- package/dist/components/primitives/alert/alert.svelte.d.ts +0 -26
- package/dist/components/primitives/alert/index.d.ts +0 -5
- package/dist/components/primitives/alert/index.js +0 -7
- package/dist/components/viewer/MeshMetadataDialog.svelte +0 -126
- package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
- package/src/lib/components/primitives/alert/alert.svelte +0 -44
- package/src/lib/components/primitives/alert/index.ts +0 -14
- package/src/lib/components/viewer/MeshMetadataDialog.svelte +0 -126
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { Upload } from '@lucide/svelte';
|
|
3
3
|
import type { UISchema, ParameterPreset } from '@selvajs/schemas';
|
|
4
4
|
import {
|
|
5
5
|
createSavedState,
|
|
@@ -8,18 +8,14 @@
|
|
|
8
8
|
exportStateAsJson,
|
|
9
9
|
importStateFromJson
|
|
10
10
|
} from '../../schema/param-exporter';
|
|
11
|
-
import { Button, Input, Label, Textarea, Dialog,
|
|
12
|
-
|
|
13
|
-
import type { ActionButton } from '../../types/actionButton';
|
|
11
|
+
import { Button, Input, Label, Textarea, Dialog, Callout, IssueList, toast } from '../primitives';
|
|
14
12
|
import { DEFAULT_PRESET_LABELS, type PresetLabels } from '../../types/presetLabels';
|
|
13
|
+
import { pickFile } from '../../utils/host-files';
|
|
15
14
|
|
|
16
15
|
interface Props {
|
|
17
16
|
schema: UISchema;
|
|
18
17
|
currentValues: Record<string, unknown>;
|
|
19
18
|
onLoadValues: (values: Record<string, unknown>) => void;
|
|
20
|
-
showSaveButton?: boolean;
|
|
21
|
-
showLoadButton?: boolean;
|
|
22
|
-
actions?: ActionButton[];
|
|
23
19
|
/** When set, persist saved states via this callback instead of downloading a .slvp file. */
|
|
24
20
|
onSaveState?: (state: ParameterPreset) => void | Promise<void>;
|
|
25
21
|
/** When set, the Load dialog lists these states instead of showing a file input. */
|
|
@@ -28,17 +24,7 @@
|
|
|
28
24
|
labels?: Partial<PresetLabels>;
|
|
29
25
|
}
|
|
30
26
|
|
|
31
|
-
let {
|
|
32
|
-
schema,
|
|
33
|
-
currentValues,
|
|
34
|
-
onLoadValues,
|
|
35
|
-
showSaveButton = true,
|
|
36
|
-
showLoadButton = true,
|
|
37
|
-
actions = [],
|
|
38
|
-
onSaveState,
|
|
39
|
-
onListStates,
|
|
40
|
-
labels
|
|
41
|
-
}: Props = $props();
|
|
27
|
+
let { schema, currentValues, onLoadValues, onSaveState, onListStates, labels }: Props = $props();
|
|
42
28
|
|
|
43
29
|
const t = $derived({ ...DEFAULT_PRESET_LABELS, ...labels });
|
|
44
30
|
|
|
@@ -52,13 +38,13 @@
|
|
|
52
38
|
let showLoadDialog = $state(false);
|
|
53
39
|
let loadResult = $state<PresetLoadResult | null>(null);
|
|
54
40
|
let loadingPresetName = $state('');
|
|
55
|
-
let fileInputRef = $state<HTMLInputElement | null>(null);
|
|
56
41
|
|
|
57
42
|
let listedStates = $state<ParameterPreset[]>([]);
|
|
58
43
|
let isLoadingList = $state(false);
|
|
59
44
|
let listError = $state('');
|
|
60
45
|
|
|
61
|
-
|
|
46
|
+
/** Opens the save dialog. The panel footer's menu calls it. */
|
|
47
|
+
export function openSave() {
|
|
62
48
|
exportName = `State ${new Date().toLocaleDateString()}`;
|
|
63
49
|
exportDescription = '';
|
|
64
50
|
exportAuthor = schema.author || '';
|
|
@@ -83,7 +69,7 @@
|
|
|
83
69
|
});
|
|
84
70
|
|
|
85
71
|
if (onSaveState) await onSaveState(state);
|
|
86
|
-
else exportStateAsJson(state);
|
|
72
|
+
else await exportStateAsJson(state);
|
|
87
73
|
showExportDialog = false;
|
|
88
74
|
}
|
|
89
75
|
|
|
@@ -100,19 +86,16 @@
|
|
|
100
86
|
}
|
|
101
87
|
}
|
|
102
88
|
|
|
103
|
-
async function
|
|
104
|
-
|
|
105
|
-
|
|
89
|
+
async function importFromFile() {
|
|
90
|
+
// .sps is the pre-rename extension; files with it exist on users' drives, so keep accepting it.
|
|
91
|
+
const file = await pickFile({ accept: '.slvp,.sps' });
|
|
92
|
+
if (!file) return;
|
|
106
93
|
|
|
107
94
|
try {
|
|
108
|
-
|
|
109
|
-
tryLoad(imported);
|
|
95
|
+
tryLoad(await importStateFromJson(file));
|
|
110
96
|
} catch (error) {
|
|
111
97
|
toast.error(t.loadImportError + (error as Error).message);
|
|
112
98
|
}
|
|
113
|
-
|
|
114
|
-
// Reset so re-picking the same file fires `change` again.
|
|
115
|
-
input.value = '';
|
|
116
99
|
}
|
|
117
100
|
|
|
118
101
|
function confirmLoad() {
|
|
@@ -128,7 +111,8 @@
|
|
|
128
111
|
loadResult = null;
|
|
129
112
|
}
|
|
130
113
|
|
|
131
|
-
|
|
114
|
+
/** Opens the load dialog. The panel footer's menu calls it. */
|
|
115
|
+
export async function openLoad() {
|
|
132
116
|
showLoadDialog = true;
|
|
133
117
|
if (!onListStates) return;
|
|
134
118
|
|
|
@@ -145,8 +129,8 @@
|
|
|
145
129
|
}
|
|
146
130
|
|
|
147
131
|
function handleLoadClick() {
|
|
148
|
-
fileInputRef?.click();
|
|
149
132
|
showLoadDialog = false;
|
|
133
|
+
void importFromFile();
|
|
150
134
|
}
|
|
151
135
|
|
|
152
136
|
function selectListedState(preset: ParameterPreset) {
|
|
@@ -155,39 +139,6 @@
|
|
|
155
139
|
}
|
|
156
140
|
</script>
|
|
157
141
|
|
|
158
|
-
{#if showSaveButton}
|
|
159
|
-
<Button variant="default" size="sm" onclick={openExportDialog}>
|
|
160
|
-
<Download class="mr-2 h-4 w-4" />
|
|
161
|
-
{t.saveButton}
|
|
162
|
-
</Button>
|
|
163
|
-
{/if}
|
|
164
|
-
|
|
165
|
-
{#if showLoadButton}
|
|
166
|
-
<Button variant="outline" size="sm" onclick={openLoadDialog}>
|
|
167
|
-
<Upload class="mr-2 h-4 w-4" />
|
|
168
|
-
{t.loadButton}
|
|
169
|
-
</Button>
|
|
170
|
-
{/if}
|
|
171
|
-
|
|
172
|
-
{#each actions as action (action.id)}
|
|
173
|
-
<Button variant={action.variant ?? 'outline'} size={action.size ?? 'sm'} onclick={action.onclick}>
|
|
174
|
-
{#if action.icon}
|
|
175
|
-
{@const IconComponent = action.icon}
|
|
176
|
-
<IconComponent class="mr-2 h-4 w-4" />
|
|
177
|
-
{/if}
|
|
178
|
-
{action.label}
|
|
179
|
-
</Button>
|
|
180
|
-
{/each}
|
|
181
|
-
|
|
182
|
-
<!-- .sps is the pre-rename extension; files with it exist on users' drives, so keep accepting it. -->
|
|
183
|
-
<input
|
|
184
|
-
bind:this={fileInputRef}
|
|
185
|
-
type="file"
|
|
186
|
-
accept=".slvp,.sps"
|
|
187
|
-
onchange={handleImport}
|
|
188
|
-
class="hidden"
|
|
189
|
-
/>
|
|
190
|
-
|
|
191
142
|
<!-- Save Dialog -->
|
|
192
143
|
<Dialog.Root bind:open={showExportDialog}>
|
|
193
144
|
<Dialog.Content>
|
|
@@ -225,7 +176,7 @@
|
|
|
225
176
|
|
|
226
177
|
<Dialog.Footer>
|
|
227
178
|
<Button variant="outline" onclick={() => (showExportDialog = false)}>{t.cancelButton}</Button>
|
|
228
|
-
<Button onclick={handleExport}>{t.
|
|
179
|
+
<Button onclick={handleExport}>{t.saveConfirmButton}</Button>
|
|
229
180
|
</Dialog.Footer>
|
|
230
181
|
</Dialog.Content>
|
|
231
182
|
</Dialog.Root>
|
|
@@ -239,7 +190,7 @@
|
|
|
239
190
|
</Dialog.Header>
|
|
240
191
|
|
|
241
192
|
{#if onListStates}
|
|
242
|
-
<div class="py-4
|
|
193
|
+
<div class="py-4">
|
|
243
194
|
{#if isLoadingList}
|
|
244
195
|
<p class="text-sm py-8 text-center text-muted-foreground">…</p>
|
|
245
196
|
{:else if listError}
|
|
@@ -283,7 +234,7 @@
|
|
|
283
234
|
|
|
284
235
|
<!-- Validation Dialog -->
|
|
285
236
|
<Dialog.Root bind:open={showValidationDialog}>
|
|
286
|
-
<Dialog.Content class="max-w-2xl
|
|
237
|
+
<Dialog.Content class="max-w-2xl">
|
|
287
238
|
<Dialog.Header>
|
|
288
239
|
<Dialog.Title>{t.validationTitle}</Dialog.Title>
|
|
289
240
|
<Dialog.Description>
|
|
@@ -296,75 +247,31 @@
|
|
|
296
247
|
{#if loadResult}
|
|
297
248
|
<div class="gap-4 py-4 grid">
|
|
298
249
|
{#if loadResult.isValid}
|
|
299
|
-
<
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
<div>
|
|
303
|
-
<h4 class="text-sm font-semibold text-success-foreground">
|
|
304
|
-
{t.validationNoIssuesTitle}
|
|
305
|
-
</h4>
|
|
306
|
-
<p class="text-sm mt-1 text-success-foreground/80">
|
|
307
|
-
{t.validationNoIssuesBody}
|
|
308
|
-
</p>
|
|
309
|
-
</div>
|
|
310
|
-
</div>
|
|
311
|
-
</Card.Root>
|
|
250
|
+
<Callout tone="success" title={t.validationNoIssuesTitle}>
|
|
251
|
+
{t.validationNoIssuesBody}
|
|
252
|
+
</Callout>
|
|
312
253
|
{:else if loadResult.canLoad}
|
|
313
|
-
<
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
<div>
|
|
317
|
-
<h4 class="text-sm font-semibold text-warning-foreground">
|
|
318
|
-
{t.validationWarningsTitle}
|
|
319
|
-
</h4>
|
|
320
|
-
<p class="text-sm mt-1 text-warning-foreground/80">
|
|
321
|
-
{t.validationWarningsBody.replace('{count}', String(loadResult.issues.length))}
|
|
322
|
-
</p>
|
|
323
|
-
</div>
|
|
324
|
-
</div>
|
|
325
|
-
</Card.Root>
|
|
254
|
+
<Callout tone="warning" title={t.validationWarningsTitle}>
|
|
255
|
+
{t.validationWarningsBody.replace('{count}', String(loadResult.issues.length))}
|
|
256
|
+
</Callout>
|
|
326
257
|
{:else}
|
|
327
|
-
<
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
<div>
|
|
331
|
-
<h4 class="text-sm font-semibold text-destructive">{t.validationErrorsTitle}</h4>
|
|
332
|
-
<p class="text-sm mt-1 text-destructive/80">
|
|
333
|
-
{t.validationErrorsBody}
|
|
334
|
-
</p>
|
|
335
|
-
</div>
|
|
336
|
-
</div>
|
|
337
|
-
</Card.Root>
|
|
258
|
+
<Callout tone="danger" title={t.validationErrorsTitle}>
|
|
259
|
+
{t.validationErrorsBody}
|
|
260
|
+
</Callout>
|
|
338
261
|
{/if}
|
|
339
262
|
|
|
340
263
|
{#if !loadResult.isValid}
|
|
341
|
-
<div class="
|
|
264
|
+
<div class="gap-2 flex flex-col">
|
|
342
265
|
<h4 class="text-sm font-medium">{t.validationIssuesHeading}</h4>
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
? 'text-destructive'
|
|
353
|
-
: 'text-warning'}"
|
|
354
|
-
/>
|
|
355
|
-
<div class="flex-1">
|
|
356
|
-
<p class="text-sm font-medium">{issue.message}</p>
|
|
357
|
-
{#if issue.details}
|
|
358
|
-
<p class="text-xs mt-1 text-muted-foreground">
|
|
359
|
-
{t.validationExpected}
|
|
360
|
-
{issue.details.expected} → {t.validationActual}
|
|
361
|
-
{issue.details.actual}
|
|
362
|
-
</p>
|
|
363
|
-
{/if}
|
|
364
|
-
</div>
|
|
365
|
-
</div>
|
|
366
|
-
</div>
|
|
367
|
-
{/each}
|
|
266
|
+
<IssueList
|
|
267
|
+
issues={loadResult.issues.map((issue) => ({
|
|
268
|
+
severity: issue.severity === 'error' ? 'error' : 'warning',
|
|
269
|
+
message: issue.message,
|
|
270
|
+
detail: issue.details
|
|
271
|
+
? `${t.validationExpected} ${issue.details.expected} → ${t.validationActual} ${issue.details.actual}`
|
|
272
|
+
: undefined
|
|
273
|
+
}))}
|
|
274
|
+
/>
|
|
368
275
|
</div>
|
|
369
276
|
{/if}
|
|
370
277
|
</div>
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import type { UISchema, ParameterPreset } from '@selvajs/schemas';
|
|
2
|
-
import type { ActionButton } from '../../types/actionButton';
|
|
3
2
|
import { type PresetLabels } from '../../types/presetLabels';
|
|
4
3
|
interface Props {
|
|
5
4
|
schema: UISchema;
|
|
6
5
|
currentValues: Record<string, unknown>;
|
|
7
6
|
onLoadValues: (values: Record<string, unknown>) => void;
|
|
8
|
-
showSaveButton?: boolean;
|
|
9
|
-
showLoadButton?: boolean;
|
|
10
|
-
actions?: ActionButton[];
|
|
11
7
|
/** When set, persist saved states via this callback instead of downloading a .slvp file. */
|
|
12
8
|
onSaveState?: (state: ParameterPreset) => void | Promise<void>;
|
|
13
9
|
/** When set, the Load dialog lists these states instead of showing a file input. */
|
|
@@ -15,6 +11,9 @@ interface Props {
|
|
|
15
11
|
/** Overrides merged over `DEFAULT_PRESET_LABELS`. */
|
|
16
12
|
labels?: Partial<PresetLabels>;
|
|
17
13
|
}
|
|
18
|
-
declare const ParameterPresetManager: import("svelte").Component<Props, {
|
|
14
|
+
declare const ParameterPresetManager: import("svelte").Component<Props, {
|
|
15
|
+
openSave: () => void;
|
|
16
|
+
openLoad: () => Promise<void>;
|
|
17
|
+
}, "">;
|
|
19
18
|
type ParameterPresetManager = ReturnType<typeof ParameterPresetManager>;
|
|
20
19
|
export default ParameterPresetManager;
|
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
// anything, so it appears on its own after the solve and fades.
|
|
14
14
|
|
|
15
15
|
import { untrack } from 'svelte';
|
|
16
|
-
import {
|
|
16
|
+
import { LoaderCircle } from '@lucide/svelte';
|
|
17
17
|
import type { SolveDiagnostic } from '@selvajs/solve/shared';
|
|
18
18
|
import type { LiveSolveState, SolvePhase } from '@selvajs/solve/client';
|
|
19
19
|
import { Button } from '../primitives/button';
|
|
20
|
+
import IssueList, { type Issue } from '../primitives/IssueList.svelte';
|
|
21
|
+
import SeverityIcon from '../primitives/SeverityIcon.svelte';
|
|
22
|
+
import { getLocaleContext } from '../../i18n/localeContext.svelte';
|
|
20
23
|
|
|
21
24
|
interface Props {
|
|
22
25
|
/** What the running (or most recent) solve has said over the live channel. */
|
|
@@ -28,33 +31,15 @@
|
|
|
28
31
|
onabort: () => void;
|
|
29
32
|
onconfirm: () => void;
|
|
30
33
|
ondiscard: () => void;
|
|
31
|
-
|
|
34
|
+
/**
|
|
35
|
+
* See `createSolvingIndicator`. The live panel would only paint once the solve is over, so
|
|
36
|
+
* an Esc hint stands in for it; the result's messages still show.
|
|
37
|
+
*/
|
|
38
|
+
freezesDuringSolve?: boolean;
|
|
39
|
+
/** `floating` overlays the bottom centre; `inline` sits in the flow below the host's content. */
|
|
40
|
+
placement?: 'floating' | 'inline';
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
interface Labels {
|
|
35
|
-
solving: string;
|
|
36
|
-
blockedTitle: string;
|
|
37
|
-
messagesTitle: string;
|
|
38
|
-
blockedDescription: string;
|
|
39
|
-
messagesDescription: string;
|
|
40
|
-
confirm: string;
|
|
41
|
-
discard: string;
|
|
42
|
-
abort: string;
|
|
43
|
-
dismiss: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const DEFAULT_LABELS: Labels = {
|
|
47
|
-
solving: 'Solving…',
|
|
48
|
-
blockedTitle: 'Solve stopped',
|
|
49
|
-
messagesTitle: 'Solve messages',
|
|
50
|
-
blockedDescription: 'The definition stopped this solve. No results were produced.',
|
|
51
|
-
messagesDescription: 'This solve reported the following. Continue to see the result.',
|
|
52
|
-
confirm: 'Continue',
|
|
53
|
-
discard: 'Discard',
|
|
54
|
-
abort: 'Abort',
|
|
55
|
-
dismiss: 'Dismiss'
|
|
56
|
-
};
|
|
57
|
-
|
|
58
43
|
let {
|
|
59
44
|
live,
|
|
60
45
|
phase: sessionPhase,
|
|
@@ -62,9 +47,13 @@
|
|
|
62
47
|
onabort,
|
|
63
48
|
onconfirm,
|
|
64
49
|
ondiscard,
|
|
65
|
-
|
|
50
|
+
freezesDuringSolve = false,
|
|
51
|
+
placement = 'floating'
|
|
66
52
|
}: Props = $props();
|
|
67
53
|
|
|
54
|
+
const locale = getLocaleContext();
|
|
55
|
+
const t = $derived(locale.messages);
|
|
56
|
+
|
|
68
57
|
const REMARK_LINGER_MS = 6000;
|
|
69
58
|
|
|
70
59
|
const progress = $derived([...live.progress.values()]);
|
|
@@ -137,16 +126,30 @@
|
|
|
137
126
|
// Keyed on the diagnostics array's identity, which every report renews, rather than on a
|
|
138
127
|
// solve id: only the live channel has one, and on the Compute path remarks arrive with the
|
|
139
128
|
// result. Once per array, so remarks that sat behind a review do not reappear after Continue.
|
|
129
|
+
//
|
|
130
|
+
// A remark is shown once while it stays raised, not after every solve. Every report repeats
|
|
131
|
+
// it: Grasshopper keeps runtime messages on a Message component an input change did not
|
|
132
|
+
// reach, and Compute re-solves the whole definition. It shows again once a solve stops
|
|
133
|
+
// raising it and a later one raises it anew.
|
|
140
134
|
let lingering = $state(false);
|
|
141
135
|
let lingeredFor: SolveDiagnostic[] | null = null;
|
|
136
|
+
let shownRemarks: ReadonlySet<string> = new Set();
|
|
137
|
+
let freshRemarks = $state.raw<SolveDiagnostic[]>([]);
|
|
138
|
+
const remarkKey = (d: SolveDiagnostic) => `${d.source ?? ''}\u0000${d.message}`;
|
|
142
139
|
$effect(() => {
|
|
143
140
|
if (phase === 'live') {
|
|
144
141
|
lingering = false;
|
|
145
142
|
return;
|
|
146
143
|
}
|
|
147
|
-
if (
|
|
144
|
+
if (lingeredFor === diagnostics) return;
|
|
148
145
|
lingeredFor = diagnostics;
|
|
149
|
-
|
|
146
|
+
const raised = authoredRemarks.map(remarkKey);
|
|
147
|
+
const stillShown = raised.filter((k) => shownRemarks.has(k));
|
|
148
|
+
const fresh = authoredRemarks.filter((d) => !shownRemarks.has(remarkKey(d)));
|
|
149
|
+
const showNow = phase === 'idle' && fresh.length > 0;
|
|
150
|
+
shownRemarks = new Set(showNow ? [...stillShown, ...fresh.map(remarkKey)] : stillShown);
|
|
151
|
+
if (!showNow) return;
|
|
152
|
+
freshRemarks = fresh;
|
|
150
153
|
lingering = true;
|
|
151
154
|
const timer = setTimeout(() => (lingering = false), REMARK_LINGER_MS);
|
|
152
155
|
return () => clearTimeout(timer);
|
|
@@ -165,6 +168,7 @@
|
|
|
165
168
|
$effect(() => {
|
|
166
169
|
if (phase === 'live') {
|
|
167
170
|
finishing = false;
|
|
171
|
+
if (freezesDuringSolve) return;
|
|
168
172
|
const timer = setTimeout(() => {
|
|
169
173
|
revealed = true;
|
|
170
174
|
revealedAt = performance.now();
|
|
@@ -191,7 +195,16 @@
|
|
|
191
195
|
// While solving, the live channel is all there is. Once the result lands it is authoritative
|
|
192
196
|
// — it carries remarks too — so the live list is dropped entirely and nothing is shown twice.
|
|
193
197
|
const rows = $derived<SolveDiagnostic[]>(
|
|
194
|
-
view === 'live' ? [...live.diagnostics] : view === 'idle' ?
|
|
198
|
+
view === 'live' ? [...live.diagnostics] : view === 'idle' ? freshRemarks : authoredGating
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
// A remark states something without asking anything, so it reads as a quiet note.
|
|
202
|
+
const issues = $derived<Issue[]>(
|
|
203
|
+
rows.map((d) => ({
|
|
204
|
+
severity: d.level === 'remark' ? 'note' : d.level,
|
|
205
|
+
message: d.message,
|
|
206
|
+
source: d.source
|
|
207
|
+
}))
|
|
195
208
|
);
|
|
196
209
|
|
|
197
210
|
// Steps a few milliseconds long would swap the headline faster than it can be read. Each one
|
|
@@ -228,28 +241,59 @@
|
|
|
228
241
|
: rows.length > 0 && lingering
|
|
229
242
|
);
|
|
230
243
|
|
|
244
|
+
// What a screen reader hears of the passive views, through a region that outlives the panel: one
|
|
245
|
+
// created together with its text is not announced. The step name, not its counter, so a long
|
|
246
|
+
// solve announces each step rather than every tick. Review and blocked are alerts of their own.
|
|
247
|
+
const announcement = $derived(
|
|
248
|
+
!visible
|
|
249
|
+
? ''
|
|
250
|
+
: view === 'live'
|
|
251
|
+
? ((headline ?? progress[0])?.label ?? t.solveSolving)
|
|
252
|
+
: view === 'idle'
|
|
253
|
+
? rows.map((d) => d.message).join(' ')
|
|
254
|
+
: ''
|
|
255
|
+
);
|
|
256
|
+
|
|
231
257
|
function dismiss() {
|
|
232
258
|
dismissedFor = diagnostics;
|
|
233
259
|
}
|
|
234
260
|
|
|
235
261
|
// Escape resolves to the safe side — discard, keeping what is on screen — never to silently
|
|
236
|
-
// applying a result the user has not accepted.
|
|
262
|
+
// applying a result the user has not accepted. A frozen host gets no keydown until the solve
|
|
263
|
+
// ends; there the plugin aborts on the key state, which only counts while Rhino is in front, so
|
|
264
|
+
// a browser tab (local or Compute) has to abort from the page.
|
|
237
265
|
function handleKeydown(e: KeyboardEvent) {
|
|
238
266
|
if (e.key !== 'Escape') return;
|
|
239
|
-
if (phase === '
|
|
267
|
+
if (phase === 'live') {
|
|
268
|
+
if (!freezesDuringSolve) onabort();
|
|
269
|
+
} else if (phase === 'review') ondiscard();
|
|
240
270
|
else if (phase === 'blocked') dismiss();
|
|
241
271
|
}
|
|
242
272
|
</script>
|
|
243
273
|
|
|
244
274
|
<svelte:window onkeydown={handleKeydown} />
|
|
245
275
|
|
|
246
|
-
{
|
|
276
|
+
<div class="sr-only" role="status" aria-live="polite">{announcement}</div>
|
|
277
|
+
|
|
278
|
+
{#if freezesDuringSolve && view === 'live'}
|
|
279
|
+
<!-- Painted before the solve takes the thread; Abort could not be clicked until it ends. Inline,
|
|
280
|
+
the solving chip carries the hint instead: a line here would resize the footer mid-solve. -->
|
|
281
|
+
{#if placement === 'floating'}
|
|
282
|
+
<p
|
|
283
|
+
class="bottom-4 text-xs fixed left-1/2 z-50 -translate-x-1/2 text-muted-foreground"
|
|
284
|
+
data-testid="solve-esc-hint"
|
|
285
|
+
>
|
|
286
|
+
{t.solveMessagesEscHint}
|
|
287
|
+
</p>
|
|
288
|
+
{/if}
|
|
289
|
+
{:else if visible}
|
|
290
|
+
<!-- Inline, it is a row of the host's footer like the Calculate row under it, not a card: a
|
|
291
|
+
framed box inside an edge-to-edge column reads as a dialog glued into the page. -->
|
|
247
292
|
<div
|
|
248
|
-
class=
|
|
249
|
-
|
|
250
|
-
? 'border-destructive/50'
|
|
251
|
-
|
|
252
|
-
role={view === 'live' || view === 'idle' ? 'status' : 'alert'}
|
|
293
|
+
class={placement === 'inline'
|
|
294
|
+
? `px-2 py-2 border-t ${view === 'blocked' ? 'border-destructive/40' : 'border-border/50'}`
|
|
295
|
+
: `p-3 bottom-4 shadow-lg w-lg fixed left-1/2 z-50 max-w-screen-inset -translate-x-1/2 rounded-lg border bg-background ${view === 'blocked' ? 'border-destructive/50' : ''}`}
|
|
296
|
+
role={view === 'review' || view === 'blocked' ? 'alert' : undefined}
|
|
253
297
|
data-testid="solve-messages"
|
|
254
298
|
data-view={view}
|
|
255
299
|
>
|
|
@@ -259,7 +303,7 @@
|
|
|
259
303
|
<div>
|
|
260
304
|
<div class="gap-2 flex items-center">
|
|
261
305
|
<LoaderCircle class="h-4 w-4 animate-spin shrink-0 text-muted-foreground" />
|
|
262
|
-
<span class="min-w-0 text-sm flex-1 truncate">{head?.label ??
|
|
306
|
+
<span class="min-w-0 text-sm flex-1 truncate">{head?.label ?? t.solveSolving}</span>
|
|
263
307
|
{#if head?.done !== undefined && head?.total !== undefined}
|
|
264
308
|
<span class="text-xs shrink-0 text-muted-foreground tabular-nums">
|
|
265
309
|
{head.done} / {head.total}
|
|
@@ -267,12 +311,17 @@
|
|
|
267
311
|
{/if}
|
|
268
312
|
<Button
|
|
269
313
|
variant="secondary"
|
|
270
|
-
size="
|
|
271
|
-
class="-my-1
|
|
314
|
+
size="xs"
|
|
315
|
+
class="-my-1 shrink-0"
|
|
272
316
|
disabled={finishing}
|
|
273
317
|
onclick={onabort}
|
|
318
|
+
aria-keyshortcuts="Escape"
|
|
319
|
+
title={t.solveMessagesEscHint}
|
|
274
320
|
>
|
|
275
|
-
{
|
|
321
|
+
{t.solveMessagesAbort}
|
|
322
|
+
<kbd class="px-1 font-sans rounded border border-border/60 text-2xs opacity-70">
|
|
323
|
+
Esc
|
|
324
|
+
</kbd>
|
|
276
325
|
</Button>
|
|
277
326
|
</div>
|
|
278
327
|
{#each progress as p, i (p.source ?? '')}
|
|
@@ -289,7 +338,7 @@
|
|
|
289
338
|
<div
|
|
290
339
|
class="h-1 overflow-hidden rounded-full bg-muted"
|
|
291
340
|
role="progressbar"
|
|
292
|
-
aria-label={p.label ?? p.source ??
|
|
341
|
+
aria-label={p.label ?? p.source ?? t.solveSolving}
|
|
293
342
|
aria-valuemin={0}
|
|
294
343
|
aria-valuemax={100}
|
|
295
344
|
aria-valuenow={p.fraction !== undefined ? Math.round(p.fraction * 100) : undefined}
|
|
@@ -299,8 +348,9 @@
|
|
|
299
348
|
? { width: 1, ms: FINISH_MS }
|
|
300
349
|
: (bars[p.source ?? ''] ?? { width: p.fraction, ms: 150 })}
|
|
301
350
|
<div
|
|
302
|
-
class="h-full rounded-full bg-primary transition-
|
|
303
|
-
style="
|
|
351
|
+
class="h-full w-(--bar-width) rounded-full bg-primary transition-all duration-(--bar-ms) ease-linear"
|
|
352
|
+
style:--bar-width="{bar.width * 100}%"
|
|
353
|
+
style:--bar-ms="{bar.ms}ms"
|
|
304
354
|
></div>
|
|
305
355
|
{:else}
|
|
306
356
|
<div class="animate-pulse h-full w-1/3 rounded-full bg-primary/60"></div>
|
|
@@ -310,56 +360,60 @@
|
|
|
310
360
|
{/each}
|
|
311
361
|
</div>
|
|
312
362
|
</div>
|
|
363
|
+
{:else if (view === 'review' || view === 'blocked') && placement === 'inline'}
|
|
364
|
+
<!-- Each message carries its own icon, so the label goes without one; the buttons share
|
|
365
|
+
its row rather than adding one under a single line of text. -->
|
|
366
|
+
<div class="mb-1.5 gap-2 flex items-center">
|
|
367
|
+
<span
|
|
368
|
+
class="min-w-0 text-xs font-medium flex-1 truncate {view === 'blocked'
|
|
369
|
+
? 'text-destructive'
|
|
370
|
+
: 'text-muted-foreground'}"
|
|
371
|
+
>
|
|
372
|
+
{view === 'blocked' ? t.solveBlockedTitle : t.solveMessagesTitle}
|
|
373
|
+
</span>
|
|
374
|
+
{#if view === 'blocked'}
|
|
375
|
+
<Button variant="ghost" size="xs" class="-my-1 shrink-0" onclick={dismiss}>
|
|
376
|
+
{t.solveMessagesDismiss}
|
|
377
|
+
</Button>
|
|
378
|
+
{:else}
|
|
379
|
+
<Button variant="ghost" size="xs" class="-my-1 shrink-0" onclick={ondiscard}>
|
|
380
|
+
{t.solveMessagesDiscard}
|
|
381
|
+
</Button>
|
|
382
|
+
<Button size="xs" class="-my-1 shrink-0" onclick={onconfirm}>
|
|
383
|
+
{t.solveMessagesConfirm}
|
|
384
|
+
</Button>
|
|
385
|
+
{/if}
|
|
386
|
+
</div>
|
|
313
387
|
{:else if view === 'review' || view === 'blocked'}
|
|
314
388
|
<div class="mb-2">
|
|
315
389
|
<div class="gap-2 text-sm font-medium flex items-center">
|
|
316
390
|
{#if view === 'blocked'}
|
|
317
|
-
<
|
|
318
|
-
{
|
|
391
|
+
<SeverityIcon severity="error" />
|
|
392
|
+
{t.solveBlockedTitle}
|
|
319
393
|
{:else}
|
|
320
|
-
<
|
|
321
|
-
{
|
|
394
|
+
<SeverityIcon severity="warning" />
|
|
395
|
+
{t.solveMessagesTitle}
|
|
322
396
|
{/if}
|
|
323
397
|
</div>
|
|
324
398
|
<p class="text-xs text-muted-foreground">
|
|
325
|
-
{view === 'blocked' ?
|
|
399
|
+
{view === 'blocked' ? t.solveBlocked : t.solveMessagesDescription}
|
|
326
400
|
</p>
|
|
327
401
|
</div>
|
|
328
402
|
{/if}
|
|
329
403
|
|
|
330
404
|
{#if rows.length > 0}
|
|
331
|
-
<
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
: ''}"
|
|
335
|
-
>
|
|
336
|
-
{#each rows as row, i (i)}
|
|
337
|
-
<li class="gap-2 flex">
|
|
338
|
-
{#if row.level === 'error'}
|
|
339
|
-
<CircleAlert class="mt-0.5 h-4 w-4 shrink-0 text-destructive" />
|
|
340
|
-
{:else if row.level === 'warning'}
|
|
341
|
-
<TriangleAlert class="mt-0.5 h-4 w-4 text-amber-500 shrink-0" />
|
|
342
|
-
{:else}
|
|
343
|
-
<Info class="mt-0.5 h-4 w-4 shrink-0 text-muted-foreground" />
|
|
344
|
-
{/if}
|
|
345
|
-
<div class="min-w-0 flex-1">
|
|
346
|
-
<p class="wrap-anywhere">{row.message}</p>
|
|
347
|
-
{#if row.source}
|
|
348
|
-
<p class="text-xs text-muted-foreground">{row.source}</p>
|
|
349
|
-
{/if}
|
|
350
|
-
</div>
|
|
351
|
-
</li>
|
|
352
|
-
{/each}
|
|
353
|
-
</ul>
|
|
405
|
+
<div class="max-h-40 overflow-y-auto {view === 'live' ? 'mt-3 pt-3 border-t' : ''}">
|
|
406
|
+
<IssueList {issues} variant="plain" />
|
|
407
|
+
</div>
|
|
354
408
|
{/if}
|
|
355
409
|
|
|
356
|
-
{#if view === 'review' || view === 'blocked'}
|
|
410
|
+
{#if (view === 'review' || view === 'blocked') && placement === 'floating'}
|
|
357
411
|
<div class="mt-3 gap-2 flex justify-end">
|
|
358
412
|
{#if view === 'blocked'}
|
|
359
|
-
<Button variant="outline" size="sm" onclick={dismiss}>{
|
|
413
|
+
<Button variant="outline" size="sm" onclick={dismiss}>{t.solveMessagesDismiss}</Button>
|
|
360
414
|
{:else}
|
|
361
|
-
<Button variant="outline" size="sm" onclick={ondiscard}>{
|
|
362
|
-
<Button size="sm" onclick={onconfirm}>{
|
|
415
|
+
<Button variant="outline" size="sm" onclick={ondiscard}>{t.solveMessagesDiscard}</Button>
|
|
416
|
+
<Button size="sm" onclick={onconfirm}>{t.solveMessagesConfirm}</Button>
|
|
363
417
|
{/if}
|
|
364
418
|
</div>
|
|
365
419
|
{/if}
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
import type { SolveDiagnostic } from '@selvajs/solve/shared';
|
|
2
2
|
import type { LiveSolveState, SolvePhase } from '@selvajs/solve/client';
|
|
3
|
-
interface Labels {
|
|
4
|
-
solving: string;
|
|
5
|
-
blockedTitle: string;
|
|
6
|
-
messagesTitle: string;
|
|
7
|
-
blockedDescription: string;
|
|
8
|
-
messagesDescription: string;
|
|
9
|
-
confirm: string;
|
|
10
|
-
discard: string;
|
|
11
|
-
abort: string;
|
|
12
|
-
dismiss: string;
|
|
13
|
-
}
|
|
14
3
|
interface Props {
|
|
15
4
|
/** What the running (or most recent) solve has said over the live channel. */
|
|
16
5
|
live: LiveSolveState;
|
|
@@ -21,7 +10,13 @@ interface Props {
|
|
|
21
10
|
onabort: () => void;
|
|
22
11
|
onconfirm: () => void;
|
|
23
12
|
ondiscard: () => void;
|
|
24
|
-
|
|
13
|
+
/**
|
|
14
|
+
* See `createSolvingIndicator`. The live panel would only paint once the solve is over, so
|
|
15
|
+
* an Esc hint stands in for it; the result's messages still show.
|
|
16
|
+
*/
|
|
17
|
+
freezesDuringSolve?: boolean;
|
|
18
|
+
/** `floating` overlays the bottom centre; `inline` sits in the flow below the host's content. */
|
|
19
|
+
placement?: 'floating' | 'inline';
|
|
25
20
|
}
|
|
26
21
|
declare const SolveMessages: import("svelte").Component<Props, {}, "">;
|
|
27
22
|
type SolveMessages = ReturnType<typeof SolveMessages>;
|