@selvajs/ui 6.5.1-beta.1 → 6.6.0-beta.11
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 +286 -116
- package/dist/components/compute/AppLayout.svelte.d.ts +22 -0
- 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 +35 -25
- 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 +430 -71
- package/dist/components/preview/InputControl.svelte +163 -90
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- package/dist/components/preview/OutputDisplay.svelte +28 -33
- 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 +14 -14
- package/src/lib/components/ConfirmDialog.svelte +2 -10
- package/src/lib/components/ErrorScreen.svelte +21 -27
- package/src/lib/components/compute/AppLayout.svelte +286 -116
- 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 +35 -25
- 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 +430 -71
- package/src/lib/components/preview/InputControl.svelte +163 -90
- package/src/lib/components/preview/OutputDisplay.svelte +28 -33
- 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
package/dist/i18n/messages.js
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
// Only the strings @selvajs/ui renders itself. Names coming from a Grasshopper
|
|
6
6
|
// definition — meshes, layers, metadata keys — live in the user's .gh file and
|
|
7
7
|
// cannot be translated here.
|
|
8
|
+
//
|
|
9
|
+
// A `{name}` in a message is a placeholder the component fills in. Pairs ending in
|
|
10
|
+
// `One`/`Other` are the singular and plural forms of one message.
|
|
8
11
|
const en = {
|
|
9
12
|
toolsMenu: 'Viewer tools',
|
|
10
13
|
switchToOrthographic: 'Orthographic camera',
|
|
@@ -26,6 +29,13 @@ const en = {
|
|
|
26
29
|
viewLeft: 'Left',
|
|
27
30
|
viewBottom: 'Bottom',
|
|
28
31
|
viewIso: 'Isometric',
|
|
32
|
+
lookTechnical: 'Technical',
|
|
33
|
+
lookStudio: 'Studio',
|
|
34
|
+
lookShowcase: 'Showcase',
|
|
35
|
+
lookArctic: 'Arctic',
|
|
36
|
+
lookXray: 'X-Ray',
|
|
37
|
+
lookLineart: 'Line Art',
|
|
38
|
+
lookWireframe: 'Wireframe',
|
|
29
39
|
searchObjects: 'Search objects...',
|
|
30
40
|
clearSearch: 'Clear search',
|
|
31
41
|
expandLayer: 'Expand layer',
|
|
@@ -40,7 +50,7 @@ const en = {
|
|
|
40
50
|
noResultsFor: 'No results for "{query}"',
|
|
41
51
|
objectFallbackName: 'Object',
|
|
42
52
|
noMetadata: 'No metadata',
|
|
43
|
-
loadingSchema: 'Loading
|
|
53
|
+
loadingSchema: 'Loading…',
|
|
44
54
|
solveBlocked: 'The definition stopped this solve. No results were produced.',
|
|
45
55
|
solveBlockedTitle: 'Solve stopped',
|
|
46
56
|
solveMessagesTitle: 'Solve messages',
|
|
@@ -48,22 +58,129 @@ const en = {
|
|
|
48
58
|
solveMessagesConfirm: 'Continue',
|
|
49
59
|
solveMessagesDiscard: 'Discard',
|
|
50
60
|
solveMessagesAbort: 'Abort',
|
|
61
|
+
solveMessagesEscHint: 'Esc aborts the solve',
|
|
51
62
|
solveMessagesDismiss: 'Dismiss',
|
|
52
63
|
solveSolving: 'Solving…',
|
|
53
64
|
parametersTab: 'Parameters',
|
|
54
65
|
moreTab: 'More',
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
scrollTabsBack: 'Previous tabs',
|
|
67
|
+
scrollTabsForward: 'More tabs',
|
|
57
68
|
expandSidePanel: 'Expand {side} panel',
|
|
58
69
|
panelSideLeft: 'left',
|
|
59
70
|
panelSideRight: 'right',
|
|
60
71
|
tabNoGroups: 'This tab has no groups configured.',
|
|
61
72
|
solving: 'Solving',
|
|
62
73
|
solvingEllipsis: 'Solving...',
|
|
63
|
-
solvingSubtitle: '
|
|
74
|
+
solvingSubtitle: 'This can take a moment…',
|
|
64
75
|
pressToCalculate: 'Press to calculate',
|
|
65
76
|
calculate: 'Calculate',
|
|
66
|
-
upToDate: 'Up to date'
|
|
77
|
+
upToDate: 'Up to date',
|
|
78
|
+
moreActions: 'More actions',
|
|
79
|
+
calculatesFirst: 'Calculates first',
|
|
80
|
+
errorCountOne: '{count} error',
|
|
81
|
+
errorCountOther: '{count} errors',
|
|
82
|
+
warningCountOne: '{count} warning',
|
|
83
|
+
warningCountOther: '{count} warnings',
|
|
84
|
+
noteCountOne: '{count} note',
|
|
85
|
+
noteCountOther: '{count} notes',
|
|
86
|
+
lastSolveMessagesOne: '{count} message from the last solve',
|
|
87
|
+
lastSolveMessagesOther: '{count} messages from the last solve',
|
|
88
|
+
messagesTitle: 'Messages',
|
|
89
|
+
copyright: 'by {name} © {year}',
|
|
90
|
+
close: 'Close',
|
|
91
|
+
toggleTheme: 'Toggle theme',
|
|
92
|
+
errorTitle: 'Error',
|
|
93
|
+
goHome: 'Go Home',
|
|
94
|
+
selectOption: 'Select an option...',
|
|
95
|
+
noOptionsYet: 'No options available yet.',
|
|
96
|
+
minValue: 'Minimum value is {min}',
|
|
97
|
+
maxValue: 'Maximum value is {max}',
|
|
98
|
+
fineDragHint: 'Hold Shift to drag finely',
|
|
99
|
+
maxLength: 'Maximum {max} characters allowed',
|
|
100
|
+
invalidFormat: 'Invalid format',
|
|
101
|
+
invalidPattern: 'Invalid validation pattern configured',
|
|
102
|
+
geometryPickAnyOne: 'Pick an object',
|
|
103
|
+
geometryPickAnyOther: 'Pick objects',
|
|
104
|
+
geometryPicking: 'Pick in the viewport, Esc to cancel',
|
|
105
|
+
geometryPickInPanel: 'Pick in the Rhino panel',
|
|
106
|
+
geometryPickAgain: 'Pick again',
|
|
107
|
+
geometryClear: 'Clear',
|
|
108
|
+
geometryPickPointOne: 'Pick a point',
|
|
109
|
+
geometryPickPointOther: 'Pick points',
|
|
110
|
+
geometryPickPointCloudOne: 'Pick a point cloud',
|
|
111
|
+
geometryPickPointCloudOther: 'Pick point clouds',
|
|
112
|
+
geometryPickCurveOne: 'Pick a curve',
|
|
113
|
+
geometryPickCurveOther: 'Pick curves',
|
|
114
|
+
geometryPickLineOne: 'Pick a line',
|
|
115
|
+
geometryPickLineOther: 'Pick lines',
|
|
116
|
+
geometryPickPlaneOne: 'Pick a plane',
|
|
117
|
+
geometryPickPlaneOther: 'Pick planes',
|
|
118
|
+
geometryPickSurfaceOne: 'Pick a surface',
|
|
119
|
+
geometryPickSurfaceOther: 'Pick surfaces',
|
|
120
|
+
geometryPickPolysurfaceOne: 'Pick a polysurface',
|
|
121
|
+
geometryPickPolysurfaceOther: 'Pick polysurfaces',
|
|
122
|
+
geometryPickExtrusionOne: 'Pick an extrusion',
|
|
123
|
+
geometryPickExtrusionOther: 'Pick extrusions',
|
|
124
|
+
geometryPickMeshOne: 'Pick a mesh',
|
|
125
|
+
geometryPickMeshOther: 'Pick meshes',
|
|
126
|
+
geometryPickSubdOne: 'Pick a SubD',
|
|
127
|
+
geometryPickSubdOther: 'Pick SubDs',
|
|
128
|
+
geometryPickBlockOne: 'Pick a block',
|
|
129
|
+
geometryPickBlockOther: 'Pick blocks',
|
|
130
|
+
fileModeUpload: 'Upload',
|
|
131
|
+
fileModeUrl: 'URL',
|
|
132
|
+
fileUrlLabel: 'File URL',
|
|
133
|
+
fetchFile: 'Fetch',
|
|
134
|
+
fetchingFile: 'Fetching...',
|
|
135
|
+
fileUrlPublic: 'URL must be publicly accessible (no login required).',
|
|
136
|
+
chooseFile: 'Choose File or Drag & Drop',
|
|
137
|
+
acceptedFormats: 'Accepted formats: {formats}',
|
|
138
|
+
uploadedFile: 'Uploaded file ({ext})',
|
|
139
|
+
uploadedFileSize: 'Uploaded file ({ext}, {size}MB)',
|
|
140
|
+
fileLoaded: 'Loaded {ext} ({size} KB)',
|
|
141
|
+
urlInvalid: 'Invalid URL — make sure it starts with https://',
|
|
142
|
+
urlProtocolUnsupported: 'Only http:// and https:// URLs are supported.',
|
|
143
|
+
urlServerError: 'Server returned {status}. Check the URL is correct and publicly accessible.',
|
|
144
|
+
fileFormatNotAccepted: 'File format "{ext}" is not accepted. Allowed: {formats}',
|
|
145
|
+
fileTooLarge: 'File too large: {size}MB (max {max}MB).',
|
|
146
|
+
fileTooLargeUseUpload: 'Download it and use Upload instead.',
|
|
147
|
+
fileReadFailed: 'Failed to read the downloaded file.',
|
|
148
|
+
urlUnreachable: 'Could not reach "{host}" — the file may not exist, or the server does not allow browser access.',
|
|
149
|
+
urlUnreachableHint: 'Check that the URL is correct and the file is publicly accessible. If the server requires login, download the file and use the Upload option instead.',
|
|
150
|
+
urlHintSharePoint: 'SharePoint/OneDrive blocks browser access. Open the file in SharePoint, use "Download" to save it locally, then upload it here.',
|
|
151
|
+
urlHintGoogleDrive: 'Google Drive blocks browser access. Use "Download" in Google Drive to save the file locally, then upload it here.',
|
|
152
|
+
urlHintDropbox: 'Dropbox links may block browser access. Try changing "?dl=0" to "?dl=1" in the URL, or download and upload instead.',
|
|
153
|
+
unknownError: 'Unknown error',
|
|
154
|
+
waitingForData: 'Waiting for data...',
|
|
155
|
+
waitingForFiles: 'Waiting for file data...',
|
|
156
|
+
fileCount: '{count} files',
|
|
157
|
+
duplicateFilesTitle: 'Duplicate file names detected',
|
|
158
|
+
duplicatePathsOne: 'The following path appears more than once:',
|
|
159
|
+
duplicatePathsOther: 'The following paths appear more than once:',
|
|
160
|
+
duplicateFilesHint: 'Rename outputs in your Grasshopper definition so each file has a unique name.',
|
|
161
|
+
downloadFile: 'Download File',
|
|
162
|
+
downloadFiles: 'Download {count} Files',
|
|
163
|
+
downloading: 'Downloading...',
|
|
164
|
+
downloadFailed: 'Download failed',
|
|
165
|
+
copy: 'Copy',
|
|
166
|
+
copied: 'Copied!',
|
|
167
|
+
chartReceiving: 'Receiving chart data...',
|
|
168
|
+
chartRenderFailed: 'Failed to render chart',
|
|
169
|
+
fullscreenUnavailable: 'Fullscreen unavailable: {error}',
|
|
170
|
+
exitFullscreenFailed: 'Exit fullscreen failed: {error}',
|
|
171
|
+
imageViewer: 'image viewer',
|
|
172
|
+
imageLoading: 'Loading image…',
|
|
173
|
+
imageUnsupported: 'Unsupported image format: {ext}. Supported: {formats}',
|
|
174
|
+
imageUnknownFormat: '(unknown)',
|
|
175
|
+
imageDecodeFailed: "Couldn't decode {file}",
|
|
176
|
+
previousImage: 'Previous image',
|
|
177
|
+
nextImage: 'Next image',
|
|
178
|
+
zoomHint: 'Hold Ctrl or ⌘ and scroll to zoom',
|
|
179
|
+
zoomIn: 'Zoom in',
|
|
180
|
+
zoomOut: 'Zoom out',
|
|
181
|
+
zoomFit: 'Fit',
|
|
182
|
+
zoomActual: 'Actual pixels',
|
|
183
|
+
downloadImage: 'Download image'
|
|
67
184
|
};
|
|
68
185
|
const de = {
|
|
69
186
|
toolsMenu: 'Viewer-Werkzeuge',
|
|
@@ -86,6 +203,13 @@ const de = {
|
|
|
86
203
|
viewLeft: 'Links',
|
|
87
204
|
viewBottom: 'Unten',
|
|
88
205
|
viewIso: 'Isometrisch',
|
|
206
|
+
lookTechnical: 'Technisch',
|
|
207
|
+
lookStudio: 'Studio',
|
|
208
|
+
lookShowcase: 'Präsentation',
|
|
209
|
+
lookArctic: 'Arktis',
|
|
210
|
+
lookXray: 'Röntgen',
|
|
211
|
+
lookLineart: 'Strichzeichnung',
|
|
212
|
+
lookWireframe: 'Drahtgitter',
|
|
89
213
|
searchObjects: 'Objekte suchen...',
|
|
90
214
|
clearSearch: 'Suche löschen',
|
|
91
215
|
expandLayer: 'Ebene aufklappen',
|
|
@@ -100,7 +224,7 @@ const de = {
|
|
|
100
224
|
noResultsFor: 'Keine Ergebnisse für „{query}“',
|
|
101
225
|
objectFallbackName: 'Objekt',
|
|
102
226
|
noMetadata: 'Keine Metadaten',
|
|
103
|
-
loadingSchema: '
|
|
227
|
+
loadingSchema: 'Wird geladen…',
|
|
104
228
|
solveBlocked: 'Die Definition hat diese Berechnung gestoppt. Es wurden keine Ergebnisse erzeugt.',
|
|
105
229
|
solveBlockedTitle: 'Berechnung gestoppt',
|
|
106
230
|
solveMessagesTitle: 'Meldungen zur Berechnung',
|
|
@@ -108,22 +232,129 @@ const de = {
|
|
|
108
232
|
solveMessagesConfirm: 'Weiter',
|
|
109
233
|
solveMessagesDiscard: 'Verwerfen',
|
|
110
234
|
solveMessagesAbort: 'Abbrechen',
|
|
235
|
+
solveMessagesEscHint: 'Esc bricht die Berechnung ab',
|
|
111
236
|
solveMessagesDismiss: 'Schliessen',
|
|
112
237
|
solveSolving: 'Berechnung läuft…',
|
|
113
238
|
parametersTab: 'Parameter',
|
|
114
239
|
moreTab: 'Mehr',
|
|
115
|
-
|
|
116
|
-
|
|
240
|
+
scrollTabsBack: 'Vorherige Tabs',
|
|
241
|
+
scrollTabsForward: 'Weitere Tabs',
|
|
117
242
|
expandSidePanel: '{side} Bereich aufklappen',
|
|
118
243
|
panelSideLeft: 'Linken',
|
|
119
244
|
panelSideRight: 'Rechten',
|
|
120
245
|
tabNoGroups: 'Für diesen Tab sind keine Gruppen konfiguriert.',
|
|
121
246
|
solving: 'Berechnung läuft',
|
|
122
247
|
solvingEllipsis: 'Berechnung läuft...',
|
|
123
|
-
solvingSubtitle: '
|
|
124
|
-
pressToCalculate: '
|
|
248
|
+
solvingSubtitle: 'Das kann einen Moment dauern…',
|
|
249
|
+
pressToCalculate: 'Berechnen',
|
|
125
250
|
calculate: 'Berechnen',
|
|
126
|
-
upToDate: '
|
|
251
|
+
upToDate: 'Berechnet',
|
|
252
|
+
moreActions: 'Weitere Aktionen',
|
|
253
|
+
calculatesFirst: 'Berechnet zuerst',
|
|
254
|
+
errorCountOne: '{count} Fehler',
|
|
255
|
+
errorCountOther: '{count} Fehler',
|
|
256
|
+
warningCountOne: '{count} Warnung',
|
|
257
|
+
warningCountOther: '{count} Warnungen',
|
|
258
|
+
noteCountOne: '{count} Hinweis',
|
|
259
|
+
noteCountOther: '{count} Hinweise',
|
|
260
|
+
lastSolveMessagesOne: '{count} Meldung der letzten Berechnung',
|
|
261
|
+
lastSolveMessagesOther: '{count} Meldungen der letzten Berechnung',
|
|
262
|
+
messagesTitle: 'Meldungen',
|
|
263
|
+
copyright: 'von {name} © {year}',
|
|
264
|
+
close: 'Schliessen',
|
|
265
|
+
toggleTheme: 'Farbschema wechseln',
|
|
266
|
+
errorTitle: 'Fehler',
|
|
267
|
+
goHome: 'Zur Startseite',
|
|
268
|
+
selectOption: 'Option wählen…',
|
|
269
|
+
noOptionsYet: 'Noch keine Optionen verfügbar.',
|
|
270
|
+
minValue: 'Der kleinste erlaubte Wert ist {min}',
|
|
271
|
+
maxValue: 'Der grösste erlaubte Wert ist {max}',
|
|
272
|
+
fineDragHint: 'Umschalttaste halten für feine Schritte',
|
|
273
|
+
maxLength: 'Höchstens {max} Zeichen erlaubt',
|
|
274
|
+
invalidFormat: 'Ungültiges Format',
|
|
275
|
+
invalidPattern: 'Ungültiges Prüfmuster hinterlegt',
|
|
276
|
+
geometryPickAnyOne: 'Objekt wählen',
|
|
277
|
+
geometryPickAnyOther: 'Objekte wählen',
|
|
278
|
+
geometryPicking: 'Im Ansichtsfenster wählen, Esc bricht ab',
|
|
279
|
+
geometryPickInPanel: 'Im Rhino-Panel wählen',
|
|
280
|
+
geometryPickAgain: 'Neu wählen',
|
|
281
|
+
geometryClear: 'Leeren',
|
|
282
|
+
geometryPickPointOne: 'Punkt wählen',
|
|
283
|
+
geometryPickPointOther: 'Punkte wählen',
|
|
284
|
+
geometryPickPointCloudOne: 'Punktwolke wählen',
|
|
285
|
+
geometryPickPointCloudOther: 'Punktwolken wählen',
|
|
286
|
+
geometryPickCurveOne: 'Kurve wählen',
|
|
287
|
+
geometryPickCurveOther: 'Kurven wählen',
|
|
288
|
+
geometryPickLineOne: 'Linie wählen',
|
|
289
|
+
geometryPickLineOther: 'Linien wählen',
|
|
290
|
+
geometryPickPlaneOne: 'Ebene wählen',
|
|
291
|
+
geometryPickPlaneOther: 'Ebenen wählen',
|
|
292
|
+
geometryPickSurfaceOne: 'Fläche wählen',
|
|
293
|
+
geometryPickSurfaceOther: 'Flächen wählen',
|
|
294
|
+
geometryPickPolysurfaceOne: 'Flächenverband wählen',
|
|
295
|
+
geometryPickPolysurfaceOther: 'Flächenverbände wählen',
|
|
296
|
+
geometryPickExtrusionOne: 'Extrusion wählen',
|
|
297
|
+
geometryPickExtrusionOther: 'Extrusionen wählen',
|
|
298
|
+
geometryPickMeshOne: 'Netz wählen',
|
|
299
|
+
geometryPickMeshOther: 'Netze wählen',
|
|
300
|
+
geometryPickSubdOne: 'SubD wählen',
|
|
301
|
+
geometryPickSubdOther: 'SubDs wählen',
|
|
302
|
+
geometryPickBlockOne: 'Block wählen',
|
|
303
|
+
geometryPickBlockOther: 'Blöcke wählen',
|
|
304
|
+
fileModeUpload: 'Hochladen',
|
|
305
|
+
fileModeUrl: 'URL',
|
|
306
|
+
fileUrlLabel: 'Datei-URL',
|
|
307
|
+
fetchFile: 'Abrufen',
|
|
308
|
+
fetchingFile: 'Wird abgerufen…',
|
|
309
|
+
fileUrlPublic: 'Die URL muss öffentlich erreichbar sein (ohne Anmeldung).',
|
|
310
|
+
chooseFile: 'Datei wählen oder hierher ziehen',
|
|
311
|
+
acceptedFormats: 'Erlaubte Formate: {formats}',
|
|
312
|
+
uploadedFile: 'Hochgeladene Datei ({ext})',
|
|
313
|
+
uploadedFileSize: 'Hochgeladene Datei ({ext}, {size} MB)',
|
|
314
|
+
fileLoaded: '{ext} geladen ({size} KB)',
|
|
315
|
+
urlInvalid: 'Ungültige URL – sie muss mit https:// beginnen',
|
|
316
|
+
urlProtocolUnsupported: 'Nur http://- und https://-URLs werden unterstützt.',
|
|
317
|
+
urlServerError: 'Der Server antwortete mit {status}. Ist die URL korrekt und öffentlich erreichbar?',
|
|
318
|
+
fileFormatNotAccepted: 'Dateiformat „{ext}“ ist nicht erlaubt. Erlaubt: {formats}',
|
|
319
|
+
fileTooLarge: 'Datei zu gross: {size} MB (höchstens {max} MB).',
|
|
320
|
+
fileTooLargeUseUpload: 'Datei herunterladen und stattdessen über „Hochladen“ einfügen.',
|
|
321
|
+
fileReadFailed: 'Die heruntergeladene Datei konnte nicht gelesen werden.',
|
|
322
|
+
urlUnreachable: '„{host}“ ist nicht erreichbar – die Datei existiert vielleicht nicht, oder der Server erlaubt keinen Zugriff aus dem Browser.',
|
|
323
|
+
urlUnreachableHint: 'Prüfen, ob die URL stimmt und die Datei öffentlich erreichbar ist. Verlangt der Server eine Anmeldung: Datei herunterladen und über „Hochladen“ einfügen.',
|
|
324
|
+
urlHintSharePoint: 'SharePoint/OneDrive sperrt den Zugriff aus dem Browser. Datei in SharePoint öffnen, mit „Herunterladen“ lokal speichern und hier hochladen.',
|
|
325
|
+
urlHintGoogleDrive: 'Google Drive sperrt den Zugriff aus dem Browser. Datei in Google Drive mit „Herunterladen“ lokal speichern und hier hochladen.',
|
|
326
|
+
urlHintDropbox: 'Dropbox-Links sperren den Zugriff aus dem Browser oft. In der URL „?dl=0“ durch „?dl=1“ ersetzen oder die Datei herunterladen und hochladen.',
|
|
327
|
+
unknownError: 'Unbekannter Fehler',
|
|
328
|
+
waitingForData: 'Noch keine Daten',
|
|
329
|
+
waitingForFiles: 'Noch keine Dateien',
|
|
330
|
+
fileCount: '{count} Dateien',
|
|
331
|
+
duplicateFilesTitle: 'Doppelte Dateinamen',
|
|
332
|
+
duplicatePathsOne: 'Dieser Pfad kommt mehrfach vor:',
|
|
333
|
+
duplicatePathsOther: 'Diese Pfade kommen mehrfach vor:',
|
|
334
|
+
duplicateFilesHint: 'Ausgaben in der Grasshopper-Definition umbenennen, damit jede Datei einen eindeutigen Namen hat.',
|
|
335
|
+
downloadFile: 'Datei herunterladen',
|
|
336
|
+
downloadFiles: '{count} Dateien herunterladen',
|
|
337
|
+
downloading: 'Wird heruntergeladen…',
|
|
338
|
+
downloadFailed: 'Download fehlgeschlagen',
|
|
339
|
+
copy: 'Kopieren',
|
|
340
|
+
copied: 'Kopiert!',
|
|
341
|
+
chartReceiving: 'Diagrammdaten werden empfangen…',
|
|
342
|
+
chartRenderFailed: 'Diagramm konnte nicht dargestellt werden',
|
|
343
|
+
fullscreenUnavailable: 'Vollbild nicht verfügbar: {error}',
|
|
344
|
+
exitFullscreenFailed: 'Vollbild konnte nicht beendet werden: {error}',
|
|
345
|
+
imageViewer: 'Bildbetrachter',
|
|
346
|
+
imageLoading: 'Bild wird geladen…',
|
|
347
|
+
imageUnsupported: 'Bildformat nicht unterstützt: {ext}. Unterstützt: {formats}',
|
|
348
|
+
imageUnknownFormat: '(unbekannt)',
|
|
349
|
+
imageDecodeFailed: '{file} konnte nicht gelesen werden',
|
|
350
|
+
previousImage: 'Vorheriges Bild',
|
|
351
|
+
nextImage: 'Nächstes Bild',
|
|
352
|
+
zoomHint: 'Zum Zoomen Strg oder ⌘ halten und scrollen',
|
|
353
|
+
zoomIn: 'Vergrössern',
|
|
354
|
+
zoomOut: 'Verkleinern',
|
|
355
|
+
zoomFit: 'Einpassen',
|
|
356
|
+
zoomActual: 'Originalgrösse',
|
|
357
|
+
downloadImage: 'Bild herunterladen'
|
|
127
358
|
};
|
|
128
359
|
export const VIEWER_MESSAGES = { en, de };
|
|
129
360
|
export const DEFAULT_LOCALE = 'en';
|
|
@@ -131,3 +362,22 @@ export const DEFAULT_LOCALE = 'en';
|
|
|
131
362
|
export function messagesFor(locale) {
|
|
132
363
|
return VIEWER_MESSAGES[locale ?? DEFAULT_LOCALE] ?? VIEWER_MESSAGES[DEFAULT_LOCALE];
|
|
133
364
|
}
|
|
365
|
+
/** Layers a host's partial overrides over a full catalog. An `undefined` entry keeps the base string. */
|
|
366
|
+
export function withOverrides(base, overrides) {
|
|
367
|
+
if (!overrides)
|
|
368
|
+
return base;
|
|
369
|
+
const merged = { ...base };
|
|
370
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
371
|
+
if (value !== undefined)
|
|
372
|
+
merged[key] = value;
|
|
373
|
+
}
|
|
374
|
+
return merged;
|
|
375
|
+
}
|
|
376
|
+
/** Fills each `{name}` placeholder from `vars`; an unknown placeholder is left as written. */
|
|
377
|
+
export function formatMessage(template, vars) {
|
|
378
|
+
return template.replace(/\{(\w+)\}/g, (placeholder, name) => name in vars ? String(vars[name]) : placeholder);
|
|
379
|
+
}
|
|
380
|
+
/** Picks the singular or plural form for `count` and fills its `{count}`. */
|
|
381
|
+
export function formatCount(count, one, other) {
|
|
382
|
+
return formatMessage(count === 1 ? one : other, { count });
|
|
383
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,15 +9,18 @@ export { default as Viewer } from './components/viewer/Viewer.svelte';
|
|
|
9
9
|
export * from './schema/defaults';
|
|
10
10
|
export * from './schema/dynamic-value-list';
|
|
11
11
|
export * from './schema/traversal';
|
|
12
|
+
export { type UIHost, type ElementKind, HOST_LABELS, isGeometryParamType, layoutItemKind, hostsFor, isSupportedOn, valuelessInputIds, unsupportedItems } from './schema/host-support';
|
|
12
13
|
export * from './compute/solving.svelte';
|
|
13
14
|
export { useSolveSession } from './compute/useSolveSession.svelte';
|
|
14
|
-
export { createSolveSession, createRequestResponseDriver, type SolveSession, type SolveSessionArgs, type SolveDriver, type SolveReporter, type LiveSolveState, type SolvePhase, EMPTY_LIVE_SOLVE, decodeOutcome, finalizeResult, type SolveOutcome } from '@selvajs/solve/client';
|
|
15
|
+
export { createSolveSession, createRequestResponseDriver, type SolveSession, type SolveSessionArgs, type SolveSettlement, type SolveDriver, type SolveReporter, type LiveSolveState, type SolvePhase, EMPTY_LIVE_SOLVE, decodeOutcome, finalizeResult, type SolveOutcome } from '@selvajs/solve/client';
|
|
15
16
|
export { writeExternalValue, readExternalValue, clearExternalValue, getExternalInputs, type ExternalValueRef, type ExternalInput } from '@selvajs/solve/client';
|
|
16
17
|
export * from './contexts/footerContext.svelte';
|
|
17
18
|
export * from './contexts/clientSlotContext.svelte';
|
|
19
|
+
export * from './contexts/hostContext.svelte';
|
|
18
20
|
export * from './composables/useFooterItem.svelte';
|
|
19
21
|
export * from './utils';
|
|
20
22
|
export { randomId } from './utils/randomId';
|
|
23
|
+
export { saveBlob, pickFile, setBlobSaver, setFilePicker, type BlobSaver, type FilePicker } from './utils/host-files';
|
|
21
24
|
export type { ActionButton } from './types/actionButton';
|
|
22
25
|
export type { SolveFn, SolveResult, SolveDiagnostic } from '@selvajs/solve/shared';
|
|
23
26
|
export { DEFAULT_PRESET_LABELS, type PresetLabels } from './types/presetLabels';
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ export { default as Viewer } from './components/viewer/Viewer.svelte';
|
|
|
13
13
|
export * from './schema/defaults';
|
|
14
14
|
export * from './schema/dynamic-value-list';
|
|
15
15
|
export * from './schema/traversal';
|
|
16
|
+
export { HOST_LABELS, isGeometryParamType, layoutItemKind, hostsFor, isSupportedOn, valuelessInputIds, unsupportedItems } from './schema/host-support';
|
|
16
17
|
export * from './compute/solving.svelte';
|
|
17
18
|
// Solve Session seam. Re-exported so transports outside this package — e.g.
|
|
18
19
|
// plugin-ui's WebSocket driver — can satisfy SolveDriver and drive a session.
|
|
@@ -25,7 +26,9 @@ EMPTY_LIVE_SOLVE, decodeOutcome, finalizeResult } from '@selvajs/solve/client';
|
|
|
25
26
|
export { writeExternalValue, readExternalValue, clearExternalValue, getExternalInputs } from '@selvajs/solve/client';
|
|
26
27
|
export * from './contexts/footerContext.svelte';
|
|
27
28
|
export * from './contexts/clientSlotContext.svelte';
|
|
29
|
+
export * from './contexts/hostContext.svelte';
|
|
28
30
|
export * from './composables/useFooterItem.svelte';
|
|
29
31
|
export * from './utils';
|
|
30
32
|
export { randomId } from './utils/randomId';
|
|
33
|
+
export { saveBlob, pickFile, setBlobSaver, setFilePicker } from './utils/host-files';
|
|
31
34
|
export { DEFAULT_PRESET_LABELS } from './types/presetLabels';
|
package/dist/public.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { VIEWER_MESSAGES, DEFAULT_LOCALE, messagesFor } from './i18n/messages';
|
|
|
8
8
|
export { setLocaleContext, getLocaleContext, type LocaleContext } from './i18n/localeContext.svelte';
|
|
9
9
|
export { default as ErrorScreen } from './components/ErrorScreen.svelte';
|
|
10
10
|
export { useSolveSession } from './compute/useSolveSession.svelte';
|
|
11
|
-
export { createSolveSession, createRequestResponseDriver, type SolveSession, type SolveSessionArgs, type SolveDriver, type SolveReporter, type LiveSolveState, type SolvePhase } from '@selvajs/solve/client';
|
|
11
|
+
export { createSolveSession, createRequestResponseDriver, type SolveSession, type SolveSessionArgs, type SolveSettlement, type SolveDriver, type SolveReporter, type LiveSolveState, type SolvePhase } from '@selvajs/solve/client';
|
|
12
12
|
export type { ClientSlotArgs, ClientSlot } from './contexts/clientSlotContext.svelte';
|
|
13
13
|
export { writeExternalValue, readExternalValue, clearExternalValue, getExternalInputs, type ExternalValueRef, type ExternalInput } from '@selvajs/solve/client';
|
|
14
14
|
export * from './schema/defaults';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { InputLayoutItem, LayoutItem, SchemaInput, UISchema } from '@selvajs/schemas';
|
|
2
|
+
/**
|
|
3
|
+
* Where a UI runs: `rhino` is the plugin's page inside Rhino, solving in the user's own
|
|
4
|
+
* Grasshopper; `selva` is the Selva app, solving headless on Rhino.Compute.
|
|
5
|
+
*/
|
|
6
|
+
export type UIHost = 'rhino' | 'selva';
|
|
7
|
+
/**
|
|
8
|
+
* - `value`: an input or output every host renders.
|
|
9
|
+
* - `geometry`: a Rhino Get Geometry/Point/Line/Plane input, filled by picking in the viewport.
|
|
10
|
+
* - `trigger`: a boolean input shown as a button; a press solves once with `true`.
|
|
11
|
+
* - `unknown`: a layout item from a newer schema than this build knows.
|
|
12
|
+
*/
|
|
13
|
+
export type ElementKind = 'value' | 'geometry' | 'trigger' | 'unknown';
|
|
14
|
+
export declare const HOST_LABELS: Record<UIHost, string>;
|
|
15
|
+
/** The control comes from this, whatever the saved widgetType says: saved ones hold `text`. */
|
|
16
|
+
export declare function isGeometryParamType(paramType: string | undefined): boolean;
|
|
17
|
+
export declare function isTriggerItem(item: LayoutItem): boolean;
|
|
18
|
+
export declare function layoutItemKind(item: LayoutItem, inputs: readonly SchemaInput[]): ElementKind;
|
|
19
|
+
export declare function hostsFor(kind: ElementKind): readonly UIHost[];
|
|
20
|
+
export declare function isSupportedOn(host: UIHost, kind: ElementKind): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Inputs the form keeps no value for: geometry lives on the Grasshopper param after a pick, and a
|
|
23
|
+
* button only sends a press. Value updates and presets skip them; holding a button's `true` would
|
|
24
|
+
* fire its action again on every solve.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isValuelessInput(item: InputLayoutItem, input: SchemaInput | undefined): boolean;
|
|
27
|
+
export declare function valuelessInputIds(schema: UISchema): Set<string>;
|
|
28
|
+
/** The placed items a host won't render, for the builder's summary of where the UI runs. */
|
|
29
|
+
export declare function unsupportedItems(schema: UISchema, host: UIHost): LayoutItem[];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Which elements of a schema each host renders. Worked out from the schema on every read and
|
|
2
|
+
// never stored in it: a stored copy goes stale the way a saved paramType does. Making an element
|
|
3
|
+
// work on Selva later is a change to SUPPORT, with no schema change and no migration.
|
|
4
|
+
import { getGroups } from '@selvajs/schemas';
|
|
5
|
+
const SUPPORT = {
|
|
6
|
+
value: ['rhino', 'selva'],
|
|
7
|
+
geometry: ['rhino'],
|
|
8
|
+
trigger: ['rhino'],
|
|
9
|
+
unknown: []
|
|
10
|
+
};
|
|
11
|
+
export const HOST_LABELS = { rhino: 'Rhino', selva: 'Selva' };
|
|
12
|
+
const GEOMETRY_PARAM_TYPES = new Set(['geometry', 'point', 'line', 'plane']);
|
|
13
|
+
// Keyed by the schema's own widget unions, so a widget added to the schema fails to compile here
|
|
14
|
+
// until someone decides which hosts render it.
|
|
15
|
+
const INPUT_WIDGETS = {
|
|
16
|
+
number: true,
|
|
17
|
+
text: true,
|
|
18
|
+
dropdown: true,
|
|
19
|
+
dynamicValueList: true,
|
|
20
|
+
checkbox: true,
|
|
21
|
+
file: true,
|
|
22
|
+
color: true
|
|
23
|
+
};
|
|
24
|
+
const OUTPUT_WIDGETS = {
|
|
25
|
+
text: true,
|
|
26
|
+
number: true,
|
|
27
|
+
file: true,
|
|
28
|
+
chart: true,
|
|
29
|
+
image: true,
|
|
30
|
+
dynamicValueList: true
|
|
31
|
+
};
|
|
32
|
+
const KNOWN_WIDGETS = {
|
|
33
|
+
input: new Set(Object.keys(INPUT_WIDGETS)),
|
|
34
|
+
output: new Set(Object.keys(OUTPUT_WIDGETS))
|
|
35
|
+
};
|
|
36
|
+
/** The control comes from this, whatever the saved widgetType says: saved ones hold `text`. */
|
|
37
|
+
export function isGeometryParamType(paramType) {
|
|
38
|
+
return paramType !== undefined && GEOMETRY_PARAM_TYPES.has(paramType);
|
|
39
|
+
}
|
|
40
|
+
export function isTriggerItem(item) {
|
|
41
|
+
return (item.type === 'input' &&
|
|
42
|
+
item.widgetType === 'checkbox' &&
|
|
43
|
+
item.config?.displayAs === 'button');
|
|
44
|
+
}
|
|
45
|
+
export function layoutItemKind(item, inputs) {
|
|
46
|
+
if (item.type === 'linebreak')
|
|
47
|
+
return 'value';
|
|
48
|
+
if (item.type !== 'input' && item.type !== 'output')
|
|
49
|
+
return 'unknown';
|
|
50
|
+
if (item.type === 'input') {
|
|
51
|
+
const paramType = inputs.find((i) => i.id === item.paramId)?.paramType;
|
|
52
|
+
if (isGeometryParamType(paramType))
|
|
53
|
+
return 'geometry';
|
|
54
|
+
}
|
|
55
|
+
if (!KNOWN_WIDGETS[item.type].has(item.widgetType))
|
|
56
|
+
return 'unknown';
|
|
57
|
+
return isTriggerItem(item) ? 'trigger' : 'value';
|
|
58
|
+
}
|
|
59
|
+
export function hostsFor(kind) {
|
|
60
|
+
return SUPPORT[kind];
|
|
61
|
+
}
|
|
62
|
+
export function isSupportedOn(host, kind) {
|
|
63
|
+
return SUPPORT[kind].includes(host);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Inputs the form keeps no value for: geometry lives on the Grasshopper param after a pick, and a
|
|
67
|
+
* button only sends a press. Value updates and presets skip them; holding a button's `true` would
|
|
68
|
+
* fire its action again on every solve.
|
|
69
|
+
*/
|
|
70
|
+
export function isValuelessInput(item, input) {
|
|
71
|
+
return isGeometryParamType(input?.paramType) || isTriggerItem(item);
|
|
72
|
+
}
|
|
73
|
+
export function valuelessInputIds(schema) {
|
|
74
|
+
const ids = new Set();
|
|
75
|
+
for (const input of schema.inputs) {
|
|
76
|
+
if (isGeometryParamType(input.paramType))
|
|
77
|
+
ids.add(input.id);
|
|
78
|
+
}
|
|
79
|
+
for (const group of getGroups(schema)) {
|
|
80
|
+
for (const item of group.items ?? []) {
|
|
81
|
+
if (isTriggerItem(item))
|
|
82
|
+
ids.add(item.paramId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return ids;
|
|
86
|
+
}
|
|
87
|
+
/** The placed items a host won't render, for the builder's summary of where the UI runs. */
|
|
88
|
+
export function unsupportedItems(schema, host) {
|
|
89
|
+
const items = [];
|
|
90
|
+
for (const group of getGroups(schema)) {
|
|
91
|
+
for (const item of group.items ?? []) {
|
|
92
|
+
if (!isSupportedOn(host, layoutItemKind(item, schema.inputs)))
|
|
93
|
+
items.push(item);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return items;
|
|
97
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DropdownWidgetConfig, OptionMedia, UISchema } from '@selvajs/schemas';
|
|
2
|
+
export type OptionDisplay = NonNullable<DropdownWidgetConfig['displayAs']>;
|
|
3
|
+
export declare function resolveOptionDisplay(displayAs: string | undefined, optionCount: number): OptionDisplay;
|
|
4
|
+
export type GlyphSource = {
|
|
5
|
+
kind: 'icon';
|
|
6
|
+
d: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'image';
|
|
9
|
+
src: string;
|
|
10
|
+
};
|
|
11
|
+
/** What to draw beside an option: its thumbnail, else its icon. */
|
|
12
|
+
export declare function optionGlyph(media: OptionMedia | undefined, assets: UISchema['assets'] | undefined): GlyphSource | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Past this a button row no longer fits a panel column. A computed list can grow past it at
|
|
2
|
+
// runtime, so the row turns back into a dropdown instead of wrapping.
|
|
3
|
+
const MAX_SEGMENTED_OPTIONS = 6;
|
|
4
|
+
export function resolveOptionDisplay(displayAs, optionCount) {
|
|
5
|
+
switch (displayAs) {
|
|
6
|
+
case 'checklist':
|
|
7
|
+
case 'tiles':
|
|
8
|
+
return displayAs;
|
|
9
|
+
case 'segmented':
|
|
10
|
+
return optionCount <= MAX_SEGMENTED_OPTIONS ? 'segmented' : 'dropdown';
|
|
11
|
+
default:
|
|
12
|
+
return 'dropdown';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// The schema can come from any .gh, so an image reaches <img> only as an inline raster data URI.
|
|
16
|
+
// Anything else could be a URL that makes every viewer's browser call wherever the file points.
|
|
17
|
+
const RASTER_DATA_URI = /^data:image\/(webp|jpeg|png);base64,[A-Za-z0-9+/=]+$/;
|
|
18
|
+
/** What to draw beside an option: its thumbnail, else its icon. */
|
|
19
|
+
export function optionGlyph(media, assets) {
|
|
20
|
+
if (!media || !assets)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (media.image) {
|
|
23
|
+
const src = assets[media.image]?.img;
|
|
24
|
+
if (src && RASTER_DATA_URI.test(src))
|
|
25
|
+
return { kind: 'image', src };
|
|
26
|
+
}
|
|
27
|
+
const d = media.icon ? assets[media.icon]?.d : undefined;
|
|
28
|
+
return d ? { kind: 'icon', d } : undefined;
|
|
29
|
+
}
|
|
@@ -14,6 +14,8 @@ export declare function validateSavedState(savedState: ParameterPreset, currentS
|
|
|
14
14
|
* Params the current schema no longer has are dropped. That's the same condition
|
|
15
15
|
* `validateSavedState` flags as an error, but the rule is re-derived from the schema here
|
|
16
16
|
* rather than read back off the issue list — nothing couples to how sentinel ids are encoded.
|
|
17
|
+
* Valueless inputs are dropped too: a preset saved before an input became a button or a
|
|
18
|
+
* geometry input still holds a value for it.
|
|
17
19
|
*/
|
|
18
20
|
export declare function extractLoadableValues(savedState: ParameterPreset, currentSchema: UISchema): Record<string, unknown>;
|
|
19
21
|
export interface PresetLoadResult {
|
|
@@ -28,5 +30,6 @@ export interface PresetLoadResult {
|
|
|
28
30
|
}
|
|
29
31
|
/** Validates and computes the loadable values in one pass, so callers thread one object. */
|
|
30
32
|
export declare function loadPreset(savedState: ParameterPreset, currentSchema: UISchema): PresetLoadResult;
|
|
31
|
-
|
|
33
|
+
/** Resolves false when the user cancelled the save. */
|
|
34
|
+
export declare function exportStateAsJson(savedState: ParameterPreset): Promise<boolean>;
|
|
32
35
|
export declare function importStateFromJson(file: File): Promise<ParameterPreset>;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomId } from '../utils/randomId';
|
|
2
|
+
import { saveBlob } from '../utils/host-files';
|
|
2
3
|
import { getGroups } from '@selvajs/schemas';
|
|
4
|
+
import { isValuelessInput, valuelessInputIds } from './host-support';
|
|
3
5
|
export function createSavedState(schema, currentValues, metadata) {
|
|
4
6
|
const parameters = [];
|
|
5
7
|
for (const group of getGroups(schema)) {
|
|
@@ -8,6 +10,8 @@ export function createSavedState(schema, currentValues, metadata) {
|
|
|
8
10
|
continue;
|
|
9
11
|
const value = currentValues[item.paramId];
|
|
10
12
|
const inputDef = schema.inputs.find((i) => i.id === item.paramId);
|
|
13
|
+
if (isValuelessInput(item, inputDef))
|
|
14
|
+
continue;
|
|
11
15
|
if (value !== undefined && inputDef) {
|
|
12
16
|
parameters.push({
|
|
13
17
|
paramId: item.paramId,
|
|
@@ -78,12 +82,15 @@ export function validateSavedState(savedState, currentSchema) {
|
|
|
78
82
|
* Params the current schema no longer has are dropped. That's the same condition
|
|
79
83
|
* `validateSavedState` flags as an error, but the rule is re-derived from the schema here
|
|
80
84
|
* rather than read back off the issue list — nothing couples to how sentinel ids are encoded.
|
|
85
|
+
* Valueless inputs are dropped too: a preset saved before an input became a button or a
|
|
86
|
+
* geometry input still holds a value for it.
|
|
81
87
|
*/
|
|
82
88
|
export function extractLoadableValues(savedState, currentSchema) {
|
|
83
89
|
const values = {};
|
|
90
|
+
const valueless = valuelessInputIds(currentSchema);
|
|
84
91
|
for (const paramState of savedState.parameters) {
|
|
85
92
|
const exists = currentSchema.inputs.some((i) => i.id === paramState.paramId);
|
|
86
|
-
if (exists) {
|
|
93
|
+
if (exists && !valueless.has(paramState.paramId)) {
|
|
87
94
|
values[paramState.paramId] = paramState.value;
|
|
88
95
|
}
|
|
89
96
|
}
|
|
@@ -99,17 +106,14 @@ export function loadPreset(savedState, currentSchema) {
|
|
|
99
106
|
canLoad: validation.canLoad
|
|
100
107
|
};
|
|
101
108
|
}
|
|
109
|
+
/** Resolves false when the user cancelled the save. */
|
|
102
110
|
export function exportStateAsJson(savedState) {
|
|
103
111
|
const blob = new Blob([JSON.stringify(savedState, null, 2)], { type: 'application/json' });
|
|
104
112
|
const safeName = savedState.name.replace(/[^a-z0-9]/gi, '_');
|
|
105
113
|
const date = savedState.timestamp.split('T')[0].replace(/-/g, '_');
|
|
106
|
-
const link = document.createElement('a');
|
|
107
|
-
link.href = URL.createObjectURL(blob);
|
|
108
114
|
// .slvp = Selva parameter preset. Import still accepts the pre-rename .sps — same JSON,
|
|
109
115
|
// only the writer's extension changed.
|
|
110
|
-
|
|
111
|
-
link.click();
|
|
112
|
-
URL.revokeObjectURL(link.href);
|
|
116
|
+
return saveBlob(blob, `${safeName}_${date}.slvp`);
|
|
113
117
|
}
|
|
114
118
|
export async function importStateFromJson(file) {
|
|
115
119
|
const state = JSON.parse(await file.text());
|