@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
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
import type { PresetLabels } from '../../types/presetLabels';
|
|
8
8
|
import { createSolvingIndicator } from '../../compute/solving.svelte';
|
|
9
9
|
import { createRequestResponseDriver } from '@selvajs/solve/client';
|
|
10
|
-
import type {
|
|
10
|
+
import type {
|
|
11
|
+
RetainedSolveResult,
|
|
12
|
+
SolveEventSource,
|
|
13
|
+
SolveSession,
|
|
14
|
+
SolveSettlement
|
|
15
|
+
} from '@selvajs/solve/client';
|
|
11
16
|
import SolveMessages from './SolveMessages.svelte';
|
|
12
17
|
import { meshPolicy } from '@selvajs/visualization/parse';
|
|
13
18
|
import type { ThreeViewer } from '@selvajs/visualization/render';
|
|
@@ -19,8 +24,8 @@
|
|
|
19
24
|
import { type ViewerConfig } from '../viewer/Viewer.svelte';
|
|
20
25
|
import StateDisplay from '../primitives/StateDisplay.svelte';
|
|
21
26
|
import { setClientSlot, type ClientSlot } from '../../contexts/clientSlotContext.svelte';
|
|
22
|
-
import type { Locale } from '../../i18n/messages';
|
|
23
|
-
import {
|
|
27
|
+
import type { Locale, ViewerMessages } from '../../i18n/messages';
|
|
28
|
+
import { layerLocaleContext } from '../../i18n/localeContext.svelte';
|
|
24
29
|
|
|
25
30
|
import type { Snippet } from 'svelte';
|
|
26
31
|
|
|
@@ -34,8 +39,11 @@
|
|
|
34
39
|
isEmbedded?: boolean;
|
|
35
40
|
primaryColor?: string;
|
|
36
41
|
showModeToggle?: boolean;
|
|
42
|
+
/** Host actions, listed in the panel footer's ⋯ menu after saving and loading inputs. */
|
|
37
43
|
panelActions?: ActionButton[];
|
|
44
|
+
/** Lists "Save inputs…" in the footer menu. */
|
|
38
45
|
showSaveButton?: boolean;
|
|
46
|
+
/** Lists "Load inputs…" in the footer menu. */
|
|
39
47
|
showLoadButton?: boolean;
|
|
40
48
|
/** When set, persist saved states via this callback instead of downloading a .slvp file. */
|
|
41
49
|
onSaveState?: (state: ParameterPreset) => void | Promise<void>;
|
|
@@ -74,6 +82,12 @@
|
|
|
74
82
|
*/
|
|
75
83
|
getSession: () => SolveSession;
|
|
76
84
|
}) => void;
|
|
85
|
+
/**
|
|
86
|
+
* Once per settled solve: applied, discarded, blocked, aborted or failed. A result held
|
|
87
|
+
* for review counts when the user accepts or rejects it, and one a queued solve replaces
|
|
88
|
+
* never does. Auto-solves from input changes count too.
|
|
89
|
+
*/
|
|
90
|
+
onSolved?: (settlement: SolveSettlement) => void;
|
|
77
91
|
/** Hands the live three.js viewer to the host once it mounts. See `Viewer.svelte` for the contract. */
|
|
78
92
|
onViewerReady?: (viewer: ThreeViewer) => void | (() => void);
|
|
79
93
|
/** Viewer chrome and defaults. `backgroundColor` and `showSceneManager` are set by the layout. */
|
|
@@ -92,6 +106,14 @@
|
|
|
92
106
|
// Language for the app's own chrome, English when unset. Does not translate
|
|
93
107
|
// schema-authored labels or Grasshopper-sourced names/metadata.
|
|
94
108
|
lang?: Locale;
|
|
109
|
+
/**
|
|
110
|
+
* Replaces individual strings of the app's own chrome, layered over the `lang` catalog
|
|
111
|
+
* (`VIEWER_MESSAGES`): reword a label, or supply every string for a language with no
|
|
112
|
+
* built-in catalog. Reaches every component inside, the viewer included. A `{name}`
|
|
113
|
+
* placeholder in the default is filled the same way in an override. The preset manager's
|
|
114
|
+
* strings come from `presetLabels` instead.
|
|
115
|
+
*/
|
|
116
|
+
messages?: Partial<ViewerMessages>;
|
|
95
117
|
}
|
|
96
118
|
|
|
97
119
|
let {
|
|
@@ -123,22 +145,26 @@
|
|
|
123
145
|
brandName,
|
|
124
146
|
header,
|
|
125
147
|
onReady,
|
|
148
|
+
onSolved,
|
|
126
149
|
onViewerReady,
|
|
127
150
|
viewerConfig = {},
|
|
128
151
|
externalScopeKey,
|
|
129
152
|
clientSlot,
|
|
130
|
-
lang
|
|
153
|
+
lang,
|
|
154
|
+
messages
|
|
131
155
|
}: Props = $props();
|
|
132
156
|
|
|
133
157
|
// Reaches InputControl deep in the tree.
|
|
134
158
|
// svelte-ignore state_referenced_locally
|
|
135
159
|
setClientSlot(clientSlot);
|
|
136
160
|
|
|
137
|
-
// Resolution: explicit `lang` → host-provided locale → English
|
|
138
|
-
// switching
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
161
|
+
// Resolution: explicit `lang` → host-provided locale → English, with `messages` on top.
|
|
162
|
+
// Getters, so switching either updates the chrome live.
|
|
163
|
+
const locale = layerLocaleContext(
|
|
164
|
+
() => lang,
|
|
165
|
+
() => messages
|
|
166
|
+
);
|
|
167
|
+
const t = $derived(locale.messages);
|
|
142
168
|
|
|
143
169
|
const resolvedScopeKey = $derived(externalScopeKey || definitionKey || schema?.id || '');
|
|
144
170
|
|
|
@@ -168,6 +194,9 @@
|
|
|
168
194
|
|
|
169
195
|
const solvingIndicator = createSolvingIndicator(() => session.isSolving);
|
|
170
196
|
|
|
197
|
+
// Read at call time, so a host swapping the callback needs no resubscribe.
|
|
198
|
+
$effect(() => session.onSettled((settlement) => onSolved?.(settlement)));
|
|
199
|
+
|
|
171
200
|
$effect(() => {
|
|
172
201
|
onReady?.({
|
|
173
202
|
loadValues: (incoming) => session.loadValues(incoming),
|
|
@@ -217,14 +246,14 @@
|
|
|
217
246
|
|
|
218
247
|
let resolvedIsEmbedded = $derived(isEmbedded ?? page.url.searchParams.get('embed') === 'true');
|
|
219
248
|
let resolvedPrimaryColor = $derived(primaryColor ?? page.url.searchParams.get('primary'));
|
|
220
|
-
let
|
|
221
|
-
resolvedPrimaryColor ?
|
|
249
|
+
let primaryOverride = $derived(
|
|
250
|
+
resolvedPrimaryColor ? hexToOklch(resolvedPrimaryColor) : undefined
|
|
222
251
|
);
|
|
223
252
|
|
|
224
253
|
let pageTitle = $derived(title ?? (schema?.description || schema.name));
|
|
225
254
|
</script>
|
|
226
255
|
|
|
227
|
-
<div style={
|
|
256
|
+
<div class="contents" style:--primary={primaryOverride}>
|
|
228
257
|
<AppShell
|
|
229
258
|
mode="fixed"
|
|
230
259
|
showHeader={!resolvedIsEmbedded}
|
|
@@ -254,9 +283,11 @@
|
|
|
254
283
|
{#key definitionKey}
|
|
255
284
|
<AppLayout
|
|
256
285
|
{schema}
|
|
286
|
+
showViewer={!!schema.viewerOptions?.enableRemote}
|
|
257
287
|
meshes={session.meshes}
|
|
258
288
|
isSolving={session.isSolving}
|
|
259
|
-
showSolvingIndicator={
|
|
289
|
+
showSolvingIndicator={solvingIndicator.show}
|
|
290
|
+
solveIsSlow={solvingIndicator.slow}
|
|
260
291
|
hasPendingChanges={session.hasPendingChanges}
|
|
261
292
|
hasNeverSolved={session.hasNeverSolved}
|
|
262
293
|
bind:isViewerFullscreen
|
|
@@ -272,6 +303,7 @@
|
|
|
272
303
|
{presetLabels}
|
|
273
304
|
onValueChange={handleValueChange}
|
|
274
305
|
oncalculate={handleCalculate}
|
|
306
|
+
ensureSolved={() => session.ensureSolved()}
|
|
275
307
|
onLoadValues={() => session.loadValues({})}
|
|
276
308
|
/>
|
|
277
309
|
{/key}
|
|
@@ -286,15 +318,4 @@
|
|
|
286
318
|
onabort={() => session.abort()}
|
|
287
319
|
onconfirm={() => session.acknowledge()}
|
|
288
320
|
ondiscard={() => session.discard()}
|
|
289
|
-
labels={{
|
|
290
|
-
solving: t.solveSolving,
|
|
291
|
-
blockedTitle: t.solveBlockedTitle,
|
|
292
|
-
messagesTitle: t.solveMessagesTitle,
|
|
293
|
-
blockedDescription: t.solveBlocked,
|
|
294
|
-
messagesDescription: t.solveMessagesDescription,
|
|
295
|
-
confirm: t.solveMessagesConfirm,
|
|
296
|
-
discard: t.solveMessagesDiscard,
|
|
297
|
-
abort: t.solveMessagesAbort,
|
|
298
|
-
dismiss: t.solveMessagesDismiss
|
|
299
|
-
}}
|
|
300
321
|
/>
|
|
@@ -3,14 +3,15 @@
|
|
|
3
3
|
//
|
|
4
4
|
// The counterpart to `SolveMessages`, which interrupts only for what the definition's author
|
|
5
5
|
// wrote. Everything else — Grasshopper complaining about its own components — lands here,
|
|
6
|
-
// where it is available without being in the way.
|
|
7
|
-
//
|
|
6
|
+
// where it is available without being in the way. Most severe first, with the component that
|
|
7
|
+
// raised each message on its own line rather than spliced into its text.
|
|
8
8
|
|
|
9
9
|
import type { Snippet } from 'svelte';
|
|
10
|
-
import { CircleAlert, TriangleAlert, Info } from '@lucide/svelte';
|
|
11
10
|
import type { SolveDiagnostic } from '@selvajs/solve/shared';
|
|
12
11
|
import * as Dialog from '$lib/components/primitives/dialog';
|
|
13
|
-
import {
|
|
12
|
+
import IssueList, { type Issue } from '$lib/components/primitives/IssueList.svelte';
|
|
13
|
+
import { getLocaleContext } from '$lib/i18n/localeContext.svelte';
|
|
14
|
+
import { formatCount } from '$lib/i18n/messages';
|
|
14
15
|
|
|
15
16
|
interface Props {
|
|
16
17
|
/** The last solve's messages. Preferred over `errors`/`warnings` when both are given. */
|
|
@@ -24,6 +25,9 @@
|
|
|
24
25
|
|
|
25
26
|
let { diagnostics, errors = [], warnings = [], trigger }: Props = $props();
|
|
26
27
|
|
|
28
|
+
const locale = getLocaleContext();
|
|
29
|
+
const t = $derived(locale.messages);
|
|
30
|
+
|
|
27
31
|
let open = $state(false);
|
|
28
32
|
|
|
29
33
|
const rows = $derived<SolveDiagnostic[]>(
|
|
@@ -42,34 +46,11 @@
|
|
|
42
46
|
count: number;
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
heading: 'Errors',
|
|
51
|
-
one: 'error',
|
|
52
|
-
many: 'errors',
|
|
53
|
-
icon: CircleAlert,
|
|
54
|
-
tone: 'text-destructive'
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
level: 'warning',
|
|
58
|
-
heading: 'Warnings',
|
|
59
|
-
one: 'warning',
|
|
60
|
-
many: 'warnings',
|
|
61
|
-
icon: TriangleAlert,
|
|
62
|
-
tone: 'text-amber-500'
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
level: 'remark',
|
|
66
|
-
heading: 'Notes',
|
|
67
|
-
one: 'note',
|
|
68
|
-
many: 'notes',
|
|
69
|
-
icon: Info,
|
|
70
|
-
tone: 'text-muted-foreground'
|
|
71
|
-
}
|
|
72
|
-
] as const;
|
|
49
|
+
const levels = $derived([
|
|
50
|
+
{ level: 'error', severity: 'error', one: t.errorCountOne, other: t.errorCountOther },
|
|
51
|
+
{ level: 'warning', severity: 'warning', one: t.warningCountOne, other: t.warningCountOther },
|
|
52
|
+
{ level: 'remark', severity: 'note', one: t.noteCountOne, other: t.noteCountOther }
|
|
53
|
+
] as const);
|
|
73
54
|
|
|
74
55
|
/**
|
|
75
56
|
* One section per level that has messages, most severe first; within a level, the order the
|
|
@@ -77,72 +58,55 @@
|
|
|
77
58
|
* branches raises the same warning 200 times, and an unstacked list buries every other message.
|
|
78
59
|
*/
|
|
79
60
|
const sections = $derived(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
byKey[key]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
61
|
+
levels
|
|
62
|
+
.map((meta) => {
|
|
63
|
+
// A null-prototype object rather than a Map: a local built fresh on each derive, never
|
|
64
|
+
// reactive state, and the lint rule that steers Map → SvelteMap cannot tell them apart.
|
|
65
|
+
const byKey: Record<string, Item> = Object.create(null);
|
|
66
|
+
const items: Item[] = [];
|
|
67
|
+
for (const d of rows) {
|
|
68
|
+
if (d.level !== meta.level) continue;
|
|
69
|
+
const key = `${d.message} ${d.source ?? ''}`;
|
|
70
|
+
if (byKey[key]) {
|
|
71
|
+
byKey[key].count++;
|
|
72
|
+
} else {
|
|
73
|
+
byKey[key] = { level: d.level, message: d.message, source: d.source, count: 1 };
|
|
74
|
+
items.push(byKey[key]);
|
|
75
|
+
}
|
|
93
76
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
77
|
+
return { ...meta, items };
|
|
78
|
+
})
|
|
79
|
+
.filter((section) => section.items.length > 0)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const issues = $derived<Issue[]>(
|
|
83
|
+
sections.flatMap((section) =>
|
|
84
|
+
section.items.map((item) => ({
|
|
85
|
+
severity: section.severity,
|
|
86
|
+
message: item.message,
|
|
87
|
+
source: item.source,
|
|
88
|
+
count: item.count
|
|
89
|
+
}))
|
|
90
|
+
)
|
|
97
91
|
);
|
|
98
92
|
</script>
|
|
99
93
|
|
|
100
94
|
<Dialog.Root bind:open>
|
|
101
|
-
<Dialog.Trigger
|
|
95
|
+
<Dialog.Trigger>
|
|
102
96
|
{@render trigger()}
|
|
103
97
|
</Dialog.Trigger>
|
|
104
98
|
|
|
105
|
-
<Dialog.Content class="max-w-lg
|
|
99
|
+
<Dialog.Content class="max-w-lg">
|
|
106
100
|
<Dialog.Header>
|
|
107
|
-
<Dialog.Title>
|
|
101
|
+
<Dialog.Title>{t.messagesTitle}</Dialog.Title>
|
|
108
102
|
<Dialog.Description>
|
|
109
103
|
{#each sections as section, i (section.level)}
|
|
110
104
|
{#if i > 0}<span class="mx-1.5">·</span>{/if}
|
|
111
|
-
<span
|
|
112
|
-
>{section.items.length} {section.items.length === 1 ? section.one : section.many}</span
|
|
113
|
-
>
|
|
105
|
+
<span>{formatCount(section.items.length, section.one, section.other)}</span>
|
|
114
106
|
{/each}
|
|
115
107
|
</Dialog.Description>
|
|
116
108
|
</Dialog.Header>
|
|
117
109
|
|
|
118
|
-
<
|
|
119
|
-
{#each sections as section (section.level)}
|
|
120
|
-
<section>
|
|
121
|
-
<h3 class="mb-1.5 gap-1.5 text-xs font-medium flex items-center text-muted-foreground">
|
|
122
|
-
<section.icon class="h-3.5 w-3.5 {section.tone}" />
|
|
123
|
-
{section.heading}
|
|
124
|
-
</h3>
|
|
125
|
-
<ul class="divide-y rounded-lg border">
|
|
126
|
-
{#each section.items as item (item.message + (item.source ?? ''))}
|
|
127
|
-
<li class="gap-3 px-3 py-2 text-sm flex items-start justify-between">
|
|
128
|
-
<p class="min-w-0 wrap-anywhere">
|
|
129
|
-
{item.message}
|
|
130
|
-
{#if item.count > 1}
|
|
131
|
-
<span class="ml-1 text-xs text-muted-foreground tabular-nums"
|
|
132
|
-
>×{item.count}</span
|
|
133
|
-
>
|
|
134
|
-
{/if}
|
|
135
|
-
</p>
|
|
136
|
-
{#if item.source}
|
|
137
|
-
<Badge variant="secondary" class="font-normal max-w-[40%] shrink-0 truncate">
|
|
138
|
-
{item.source}
|
|
139
|
-
</Badge>
|
|
140
|
-
{/if}
|
|
141
|
-
</li>
|
|
142
|
-
{/each}
|
|
143
|
-
</ul>
|
|
144
|
-
</section>
|
|
145
|
-
{/each}
|
|
146
|
-
</div>
|
|
110
|
+
<IssueList {issues} />
|
|
147
111
|
</Dialog.Content>
|
|
148
112
|
</Dialog.Root>
|
|
@@ -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>
|