@selvajs/ui 6.6.0-beta.9 → 7.0.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -3
- package/dist/components/ErrorScreen.svelte +1 -1
- package/dist/components/compute/AppLayout.svelte +230 -85
- package/dist/components/compute/AppLayout.svelte.d.ts +14 -2
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +6 -2
- package/dist/components/compute/ComputeApp.svelte.d.ts +1 -1
- package/dist/components/compute/ComputeMessagesDialog.svelte +3 -3
- package/dist/components/compute/ParameterPresetManager.svelte +1 -1
- package/dist/components/compute/SolveMessages.svelte +79 -88
- package/dist/components/compute/SolveMessages.svelte.d.ts +5 -0
- package/dist/components/layout/AppShell.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte.d.ts +1 -1
- package/dist/components/layout/PageContent.svelte +3 -2
- package/dist/components/layout/PageFooter.svelte +9 -6
- package/dist/components/layout/PageHeader.svelte +3 -3
- package/dist/components/layout/SideNav.svelte +3 -3
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +141 -50
- package/dist/components/preview/Group.svelte +9 -9
- package/dist/components/preview/HelpButton.svelte +1 -1
- package/dist/components/preview/ImageOutput.svelte +13 -10
- package/dist/components/preview/InputControl.svelte +13 -12
- package/dist/components/preview/OutputDisplay.svelte +26 -17
- package/dist/components/preview/TabBar.svelte +8 -6
- package/dist/components/preview/TabBar.svelte.d.ts +2 -0
- package/dist/components/preview/TabContent.svelte +8 -8
- package/dist/components/preview/TabLayout.svelte +6 -7
- package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/dist/components/preview/inputs/ChecklistInput.svelte +5 -5
- package/dist/components/preview/inputs/ColorInput.svelte +356 -14
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +3 -3
- package/dist/components/preview/inputs/FileInput.svelte +17 -12
- package/dist/components/preview/inputs/GeometryInput.svelte +4 -4
- package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +1 -1
- package/dist/components/preview/inputs/NumberInput.svelte +8 -8
- package/dist/components/preview/inputs/OptionGlyph.svelte +1 -1
- package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +1 -1
- package/dist/components/preview/inputs/SegmentedInput.svelte +3 -2
- package/dist/components/preview/inputs/TextInput.svelte +5 -5
- package/dist/components/preview/inputs/TileInput.svelte +8 -5
- package/dist/components/primitives/CalculateButton.svelte +10 -4
- package/dist/components/primitives/Callout.svelte +8 -6
- package/dist/components/primitives/Callout.svelte.d.ts +4 -4
- package/dist/components/primitives/DataTable.svelte +1 -1
- package/dist/components/primitives/FilterableDropdown.svelte +13 -1
- package/dist/components/primitives/FilterableDropdown.svelte.d.ts +5 -0
- package/dist/components/primitives/ImageUploadField.svelte +1 -1
- package/dist/components/primitives/SolvingIndicator.svelte +242 -41
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +13 -5
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/components/primitives/badge/badge.svelte +2 -2
- package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
- package/dist/components/primitives/button/button.svelte +7 -8
- package/dist/components/primitives/button/button.svelte.d.ts +19 -19
- package/dist/components/primitives/card/card.svelte +1 -1
- package/dist/components/primitives/card/card.svelte.d.ts +1 -1
- package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
- package/dist/components/primitives/command/command-input.svelte +1 -1
- package/dist/components/primitives/command/command-item.svelte +1 -1
- package/dist/components/primitives/command/command-link-item.svelte +1 -1
- package/dist/components/primitives/command/command.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-content.svelte +3 -3
- package/dist/components/primitives/drawer/Drawer.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/index.js +1 -1
- package/dist/components/primitives/input/input.svelte +2 -2
- package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/primitives/input-group/input-group.svelte +1 -1
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/dist/components/primitives/popover/popover-content.svelte +1 -1
- package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
- package/dist/components/primitives/search/search.svelte +1 -1
- package/dist/components/primitives/select/select-content.svelte +1 -1
- package/dist/components/primitives/select/select-item.svelte +1 -1
- package/dist/components/primitives/select/select-trigger.svelte +1 -1
- package/dist/components/primitives/slider/slider.svelte +1 -1
- package/dist/components/primitives/switch/switch.svelte +1 -1
- package/dist/components/primitives/tabs/tabs-list.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +6 -6
- package/dist/components/primitives/tabs/tabs-trigger.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +6 -6
- package/dist/components/primitives/textarea/textarea.svelte +1 -1
- package/dist/components/primitives/toggle/toggle.svelte +8 -2
- package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -4
- package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
- package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
- package/dist/components/primitives/tooltip/index.d.ts +6 -0
- package/dist/components/primitives/tooltip/index.js +8 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/dist/components/viewer/SceneManager.svelte +32 -21
- package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
- package/dist/components/viewer/Viewer.svelte +128 -178
- package/dist/components/viewer/Viewer.svelte.d.ts +7 -2
- package/dist/components/viewer/ViewerDock.svelte +452 -0
- package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
- package/dist/composables/useFooterItem.svelte.d.ts +1 -1
- package/dist/composables/useFooterItem.svelte.js +1 -1
- package/dist/compute/liveProgress.svelte.d.ts +16 -0
- package/dist/compute/liveProgress.svelte.js +90 -0
- package/dist/compute/solving.svelte.d.ts +7 -9
- package/dist/compute/solving.svelte.js +56 -48
- package/dist/constants.d.ts +6 -8
- package/dist/constants.js +8 -11
- package/dist/contexts/hostContext.svelte.d.ts +1 -1
- package/dist/features/chart/plotly-compat.d.ts +15 -0
- package/dist/features/chart/plotly-compat.js +124 -0
- package/dist/i18n/messages.d.ts +17 -0
- package/dist/i18n/messages.js +26 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/public.d.ts +1 -0
- package/dist/public.js +1 -0
- package/dist/schema/visibility-rules.d.ts +7 -1
- package/dist/schema/visibility-rules.js +17 -0
- package/dist/styles/base.css +100 -86
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/package.json +31 -23
- package/src/lib/components/ErrorScreen.svelte +1 -1
- package/src/lib/components/compute/AppLayout.svelte +231 -86
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +6 -2
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +4 -4
- package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
- package/src/lib/components/compute/SolveMessages.svelte +81 -90
- package/src/lib/components/layout/AppShell.svelte +2 -2
- package/src/lib/components/layout/FooterItemRenderer.svelte +2 -2
- package/src/lib/components/layout/PageContent.svelte +3 -2
- package/src/lib/components/layout/PageFooter.svelte +9 -6
- package/src/lib/components/layout/PageHeader.svelte +3 -3
- package/src/lib/components/layout/SideNav.svelte +4 -4
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +141 -50
- package/src/lib/components/preview/Group.svelte +9 -9
- package/src/lib/components/preview/HelpButton.svelte +1 -1
- package/src/lib/components/preview/ImageOutput.svelte +13 -10
- package/src/lib/components/preview/InputControl.svelte +13 -12
- package/src/lib/components/preview/OutputDisplay.svelte +26 -17
- package/src/lib/components/preview/TabBar.svelte +8 -6
- package/src/lib/components/preview/TabContent.svelte +8 -8
- package/src/lib/components/preview/TabLayout.svelte +6 -7
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +5 -5
- package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
- package/src/lib/components/preview/inputs/DropdownInput.svelte +3 -3
- package/src/lib/components/preview/inputs/FileInput.svelte +17 -12
- package/src/lib/components/preview/inputs/GeometryInput.svelte +4 -4
- package/src/lib/components/preview/inputs/NumberInput.svelte +8 -8
- package/src/lib/components/preview/inputs/OptionGlyph.svelte +2 -2
- package/src/lib/components/preview/inputs/SegmentedInput.svelte +3 -2
- package/src/lib/components/preview/inputs/TextInput.svelte +5 -5
- package/src/lib/components/preview/inputs/TileInput.svelte +8 -5
- package/src/lib/components/primitives/CalculateButton.svelte +10 -4
- package/src/lib/components/primitives/Callout.svelte +9 -7
- package/src/lib/components/primitives/DataTable.svelte +1 -1
- package/src/lib/components/primitives/FilterableDropdown.svelte +14 -2
- package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
- package/src/lib/components/primitives/IssueList.svelte +1 -1
- package/src/lib/components/primitives/SeverityIcon.svelte +1 -1
- package/src/lib/components/primitives/SolvingIndicator.svelte +242 -41
- package/src/lib/components/primitives/StateDisplay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +1 -1
- package/src/lib/components/primitives/badge/badge.svelte +3 -3
- package/src/lib/components/primitives/button/button.svelte +7 -8
- package/src/lib/components/primitives/button-group/button-group-separator.svelte +2 -2
- package/src/lib/components/primitives/button-group/button-group-text.svelte +1 -1
- package/src/lib/components/primitives/button-group/button-group.svelte +1 -1
- package/src/lib/components/primitives/card/card-content.svelte +1 -1
- package/src/lib/components/primitives/card/card-description.svelte +1 -1
- package/src/lib/components/primitives/card/card-footer.svelte +1 -1
- package/src/lib/components/primitives/card/card-header.svelte +1 -1
- package/src/lib/components/primitives/card/card-title.svelte +1 -1
- package/src/lib/components/primitives/card/card.svelte +2 -2
- package/src/lib/components/primitives/checkbox/checkbox.svelte +2 -2
- package/src/lib/components/primitives/command/command-dialog.svelte +2 -2
- package/src/lib/components/primitives/command/command-empty.svelte +1 -1
- package/src/lib/components/primitives/command/command-group.svelte +1 -1
- package/src/lib/components/primitives/command/command-input.svelte +3 -3
- package/src/lib/components/primitives/command/command-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-link-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-list.svelte +1 -1
- package/src/lib/components/primitives/command/command-separator.svelte +1 -1
- package/src/lib/components/primitives/command/command-shortcut.svelte +1 -1
- package/src/lib/components/primitives/command/command.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-label.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/dialog/dialog-content.svelte +4 -4
- package/src/lib/components/primitives/dialog/dialog-description.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-header.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-title.svelte +1 -1
- package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +32 -12
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +6 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +5 -3
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/empty/empty-content.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-description.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-header.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-media.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-title.svelte +1 -1
- package/src/lib/components/primitives/empty/empty.svelte +1 -1
- package/src/lib/components/primitives/field/field-content.svelte +1 -1
- package/src/lib/components/primitives/field/field-description.svelte +1 -1
- package/src/lib/components/primitives/field/field-error.svelte +1 -1
- package/src/lib/components/primitives/field/field-group.svelte +1 -1
- package/src/lib/components/primitives/field/field-label.svelte +2 -2
- package/src/lib/components/primitives/field/field-legend.svelte +1 -1
- package/src/lib/components/primitives/field/field-separator.svelte +2 -2
- package/src/lib/components/primitives/field/field-set.svelte +1 -1
- package/src/lib/components/primitives/field/field-title.svelte +1 -1
- package/src/lib/components/primitives/field/field.svelte +1 -1
- package/src/lib/components/primitives/index.ts +1 -1
- package/src/lib/components/primitives/input/input.svelte +3 -3
- package/src/lib/components/primitives/input-group/input-group-addon.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-button.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-input.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-text.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-textarea.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group.svelte +2 -2
- package/src/lib/components/primitives/label/label.svelte +1 -1
- package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-content.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-description.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-header.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-title.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-trigger.svelte +1 -1
- package/src/lib/components/primitives/resizable/resizable-handle.svelte +3 -3
- package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
- package/src/lib/components/primitives/search/search.svelte +2 -2
- package/src/lib/components/primitives/select/select-content.svelte +2 -2
- package/src/lib/components/primitives/select/select-group-heading.svelte +1 -1
- package/src/lib/components/primitives/select/select-item.svelte +2 -2
- package/src/lib/components/primitives/select/select-label.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-down-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-up-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-separator.svelte +2 -2
- package/src/lib/components/primitives/select/select-trigger.svelte +2 -2
- package/src/lib/components/primitives/separator/separator.svelte +1 -1
- package/src/lib/components/primitives/slider/slider.svelte +2 -2
- package/src/lib/components/primitives/spinner/spinner.svelte +1 -1
- package/src/lib/components/primitives/switch/switch.svelte +2 -2
- package/src/lib/components/primitives/tabs/tabs-content.svelte +1 -1
- package/src/lib/components/primitives/tabs/tabs-list.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs-trigger.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs.svelte +1 -1
- package/src/lib/components/primitives/textarea/textarea.svelte +2 -2
- package/src/lib/components/primitives/toggle/toggle.svelte +9 -3
- package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +3 -3
- package/src/lib/components/primitives/toggle-group/toggle-group.svelte +3 -3
- package/src/lib/components/primitives/tooltip/index.ts +19 -0
- package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
- package/src/lib/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/src/lib/components/viewer/SceneManager.svelte +32 -21
- package/src/lib/components/viewer/Viewer.svelte +129 -179
- package/src/lib/components/viewer/ViewerDock.svelte +452 -0
- package/src/lib/composables/useFooterItem.svelte.ts +1 -1
- package/src/lib/compute/liveProgress.svelte.ts +103 -0
- package/src/lib/compute/solving.svelte.ts +56 -55
- package/src/lib/constants.ts +8 -11
- package/src/lib/contexts/hostContext.svelte.ts +1 -1
- package/src/lib/features/chart/plotly-compat.ts +141 -0
- package/src/lib/i18n/messages.ts +43 -0
- package/src/lib/index.ts +2 -0
- package/src/lib/public.ts +1 -0
- package/src/lib/schema/visibility-rules.ts +27 -1
- package/src/lib/styles/base.css +100 -86
- package/src/lib/utils/color-space.ts +107 -0
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
- package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
- package/dist/components/primitives/theme-switcher/index.js +0 -1
- package/dist/styles/themes/cyberpunk.css +0 -98
- package/dist/styles/themes/neutral.css +0 -72
- package/dist/styles/themes/ocean.css +0 -75
- package/dist/styles/themes/selva.css +0 -105
- package/dist/theme/themeStore.svelte.d.ts +0 -12
- package/dist/theme/themeStore.svelte.js +0 -40
- package/dist/theme/themes.d.ts +0 -5
- package/dist/theme/themes.js +0 -13
- package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
- package/src/lib/styles/themes/cyberpunk.css +0 -98
- package/src/lib/styles/themes/neutral.css +0 -72
- package/src/lib/styles/themes/ocean.css +0 -75
- package/src/lib/styles/themes/selva.css +0 -105
- package/src/lib/theme/themeStore.svelte.ts +0 -50
- package/src/lib/theme/themes.ts +0 -18
package/README.md
CHANGED
|
@@ -57,9 +57,6 @@ In your `app.css`:
|
|
|
57
57
|
@import '@selvajs/ui/styles/base.css';
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Themes are available under `@selvajs/ui/styles/themes/*` — `selva`, `neutral`, `ocean`, and
|
|
61
|
-
`cyberpunk`.
|
|
62
|
-
|
|
63
60
|
## Schema types
|
|
64
61
|
|
|
65
62
|
Types generated from `packages/schemas/ui-schema.json` are published by `@selvajs/schemas`, not
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import * as Card from './primitives/card/index.js';
|
|
4
4
|
import { Button } from './primitives/button/index.js';
|
|
5
5
|
import Callout from './primitives/Callout.svelte';
|
|
6
|
-
import { getLocaleContext } from '../i18n/localeContext.svelte';
|
|
6
|
+
import { getLocaleContext } from '../i18n/localeContext.svelte.js';
|
|
7
7
|
|
|
8
8
|
interface Props {
|
|
9
9
|
status?: number;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { UISchema, SupportedTypes, ParameterPreset } from '@selvajs/schemas';
|
|
4
|
-
import type { SolveSettlement } from '@selvajs/solve/client';
|
|
4
|
+
import type { LiveSolveState, SolveSettlement } from '@selvajs/solve/client';
|
|
5
5
|
import type { ActionButton } from '../../types/actionButton';
|
|
6
6
|
import type { PresetLabels } from '../../types/presetLabels';
|
|
7
|
-
import { ChevronUp, Download, Ellipsis, Upload } from '@lucide/svelte';
|
|
7
|
+
import { ChevronLeft, ChevronUp, Download, Ellipsis, Upload } from '@lucide/svelte';
|
|
8
8
|
import type { ThreeViewer } from '@selvajs/visualization/render';
|
|
9
9
|
import Viewer, { type ViewerConfig } from '../viewer/Viewer.svelte';
|
|
10
10
|
import CalculateButton from '../primitives/CalculateButton.svelte';
|
|
11
11
|
import SolvingIndicator from '../primitives/SolvingIndicator.svelte';
|
|
12
12
|
import TabLayout from '../preview/TabLayout.svelte';
|
|
13
13
|
import CollapsedPanelStrip from './CollapsedPanelStrip.svelte';
|
|
14
|
-
import * as Resizable from '../primitives/resizable';
|
|
14
|
+
import * as Resizable from '../primitives/resizable/index.js';
|
|
15
15
|
import * as DropdownMenu from '../primitives/dropdown-menu/index.js';
|
|
16
|
-
import { Button } from '
|
|
16
|
+
import { Button } from '../../index.js';
|
|
17
17
|
import ParameterPresetManager from './ParameterPresetManager.svelte';
|
|
18
18
|
import { runPanelAction } from '../../compute/run-panel-action';
|
|
19
19
|
import { getLocaleContext } from '../../i18n/localeContext.svelte';
|
|
@@ -34,8 +34,20 @@
|
|
|
34
34
|
showViewer: boolean;
|
|
35
35
|
meshes?: any[];
|
|
36
36
|
isSolving: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* `createSolvingIndicator(...).show`, not `isSolving`: grows the action row's solve status,
|
|
39
|
+
* which would otherwise flash on every sub-second solve.
|
|
40
|
+
*/
|
|
37
41
|
showSolvingIndicator?: boolean;
|
|
38
|
-
/** `
|
|
42
|
+
/** `createSolvingIndicator(...).slow`: the solve status grows into a card with progress. */
|
|
43
|
+
solveIsSlow?: boolean;
|
|
44
|
+
/** The session's live channel: step, count and bar for that card. */
|
|
45
|
+
live?: LiveSolveState;
|
|
46
|
+
/** Abort in that card. The host's `SolveMessages` should then take `progressShownByHost`. */
|
|
47
|
+
onabort?: () => void;
|
|
48
|
+
/** As passed to `createSolvingIndicator`. */
|
|
49
|
+
freezesDuringSolve?: boolean;
|
|
50
|
+
/** @deprecated Ignored: the solving status always sits in the action row. */
|
|
39
51
|
solvingIndicatorPlacement?: 'floating' | 'inline';
|
|
40
52
|
/** Rendered above the action row, for a host that keeps the solve's messages in the flow. */
|
|
41
53
|
solveMessages?: Snippet;
|
|
@@ -68,7 +80,10 @@
|
|
|
68
80
|
meshes = [],
|
|
69
81
|
isSolving,
|
|
70
82
|
showSolvingIndicator = false,
|
|
71
|
-
|
|
83
|
+
solveIsSlow = false,
|
|
84
|
+
live,
|
|
85
|
+
onabort,
|
|
86
|
+
freezesDuringSolve = false,
|
|
72
87
|
solveMessages,
|
|
73
88
|
hasPendingChanges = false,
|
|
74
89
|
hasNeverSolved = false,
|
|
@@ -140,16 +155,37 @@
|
|
|
140
155
|
// With several tabs the first tab's name would mislabel whichever one is showing.
|
|
141
156
|
const drawerLabel = $derived(leftTabs.length === 1 ? leftTabs[0].label : t.parametersTab);
|
|
142
157
|
|
|
158
|
+
// A phone on its side is wide enough for the desktop columns but far too short for them, and a
|
|
159
|
+
// bottom drawer would leave the model a strip. It gets the phone layout with the drawer moved to
|
|
160
|
+
// the right edge instead.
|
|
161
|
+
let sideSheet = $state(false);
|
|
162
|
+
|
|
143
163
|
$effect(() => {
|
|
144
|
-
const
|
|
164
|
+
const mqNarrow = window.matchMedia('(max-width: 639px)');
|
|
165
|
+
const mqPhoneLandscape = window.matchMedia(
|
|
166
|
+
'(pointer: coarse) and (orientation: landscape) and (max-height: 500px)'
|
|
167
|
+
);
|
|
145
168
|
function update() {
|
|
146
|
-
|
|
169
|
+
sideSheet = mqPhoneLandscape.matches;
|
|
170
|
+
isMobile = mqNarrow.matches || sideSheet;
|
|
147
171
|
}
|
|
148
172
|
update();
|
|
149
|
-
|
|
150
|
-
|
|
173
|
+
mqNarrow.addEventListener('change', update);
|
|
174
|
+
mqPhoneLandscape.addEventListener('change', update);
|
|
175
|
+
return () => {
|
|
176
|
+
mqNarrow.removeEventListener('change', update);
|
|
177
|
+
mqPhoneLandscape.removeEventListener('change', update);
|
|
178
|
+
};
|
|
151
179
|
});
|
|
152
180
|
|
|
181
|
+
// Without a viewer there's nothing to sit beside, so a narrow host (a docked Rhino panel) gets
|
|
182
|
+
// the phone's single edge-to-edge column instead of a card floating in its own margins.
|
|
183
|
+
const STACK_BELOW_WIDTH = 900;
|
|
184
|
+
let rootWidth = $state(0);
|
|
185
|
+
const stacked = $derived(
|
|
186
|
+
isMobile || (!hasViewer && rootWidth > 0 && rootWidth < STACK_BELOW_WIDTH)
|
|
187
|
+
);
|
|
188
|
+
|
|
153
189
|
let leftCollapsed = $state(false);
|
|
154
190
|
let rightCollapsed = $state(false);
|
|
155
191
|
let leftPaneRef = $state<{ expand: () => void } | null>(null);
|
|
@@ -166,30 +202,39 @@
|
|
|
166
202
|
await onLoadValues?.(loadedValues);
|
|
167
203
|
}
|
|
168
204
|
|
|
169
|
-
let
|
|
205
|
+
let touchStart = { x: 0, y: 0 };
|
|
170
206
|
|
|
207
|
+
// The side sheet beside the model has no half state: it is open or closed.
|
|
171
208
|
function stepDrawer(by: number) {
|
|
209
|
+
if (sideSheet) {
|
|
210
|
+
drawer = by > 0 ? 'full' : 'closed';
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
172
213
|
const index = DRAWER_STATES.indexOf(drawer) + by;
|
|
173
214
|
drawer = DRAWER_STATES[Math.max(0, Math.min(DRAWER_STATES.length - 1, index))];
|
|
174
215
|
}
|
|
175
216
|
|
|
176
217
|
function onDrawerTouchStart(e: TouchEvent) {
|
|
177
|
-
|
|
218
|
+
touchStart = { x: e.touches[0].clientX, y: e.touches[0].clientY };
|
|
178
219
|
}
|
|
179
220
|
|
|
221
|
+
// Toward the open side opens: up for the bottom drawer, left for the side sheet.
|
|
180
222
|
function onDrawerTouchEnd(e: TouchEvent) {
|
|
181
|
-
const
|
|
223
|
+
const delta = sideSheet
|
|
224
|
+
? e.changedTouches[0].clientX - touchStart.x
|
|
225
|
+
: e.changedTouches[0].clientY - touchStart.y;
|
|
182
226
|
const SWIPE_THRESHOLD = 40;
|
|
183
|
-
if (Math.abs(
|
|
227
|
+
if (Math.abs(delta) > SWIPE_THRESHOLD) {
|
|
184
228
|
// Suppresses the click a short swipe can still end in, which would step the drawer twice.
|
|
185
229
|
e.preventDefault();
|
|
186
|
-
stepDrawer(
|
|
230
|
+
stepDrawer(delta < 0 ? 1 : -1);
|
|
187
231
|
}
|
|
188
232
|
}
|
|
189
233
|
|
|
190
|
-
// A tap walks closed → half → full → closed.
|
|
234
|
+
// A tap walks closed → half → full → closed; the side sheet just toggles.
|
|
191
235
|
function onDrawerHandleClick() {
|
|
192
|
-
drawer = drawer === '
|
|
236
|
+
if (sideSheet) drawer = drawer === 'closed' ? 'full' : 'closed';
|
|
237
|
+
else drawer = drawer === 'full' ? 'closed' : DRAWER_STATES[DRAWER_STATES.indexOf(drawer) + 1];
|
|
193
238
|
}
|
|
194
239
|
</script>
|
|
195
240
|
|
|
@@ -255,9 +300,9 @@
|
|
|
255
300
|
<!-- One primary action and one menu. A definition that solves on every change has no Calculate,
|
|
256
301
|
so the menu sits alone at the end of the row. -->
|
|
257
302
|
{#snippet footer()}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
{
|
|
303
|
+
<!-- No wrapper: it would always render (the messages' live region is never empty) and pick up
|
|
304
|
+
the drawer footer's row padding, leaving a gap above Calculate with nothing in it. -->
|
|
305
|
+
{@render solveMessages?.()}
|
|
261
306
|
{#if schema.instanceSolve === false}
|
|
262
307
|
<CalculateButton
|
|
263
308
|
{hasPendingChanges}
|
|
@@ -266,13 +311,18 @@
|
|
|
266
311
|
{oncalculate}
|
|
267
312
|
trailing={hasMenu ? actionsMenu : undefined}
|
|
268
313
|
/>
|
|
269
|
-
{:else
|
|
270
|
-
<div class="mt-3 pb-3 pt-2 px-2 gap-2 flex items-center border-t border-border
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
314
|
+
{:else}
|
|
315
|
+
<div class="mt-3 pb-3 pt-2 px-2 gap-2 flex items-center border-t border-border">
|
|
316
|
+
<SolvingIndicator
|
|
317
|
+
{isSolving}
|
|
318
|
+
show={showSolvingIndicator}
|
|
319
|
+
slow={solveIsSlow}
|
|
320
|
+
{live}
|
|
321
|
+
{onabort}
|
|
322
|
+
{freezesDuringSolve}
|
|
323
|
+
/>
|
|
274
324
|
{#if hasMenu}
|
|
275
|
-
|
|
325
|
+
{@render actionsMenu()}
|
|
276
326
|
{/if}
|
|
277
327
|
</div>
|
|
278
328
|
{/if}
|
|
@@ -287,9 +337,9 @@
|
|
|
287
337
|
)}
|
|
288
338
|
<div class="panel-content-wrapper">
|
|
289
339
|
{#if schema.layout.type === 'tabbed'}
|
|
290
|
-
<TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={
|
|
340
|
+
<TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={stacked} />
|
|
291
341
|
{/if}
|
|
292
|
-
{#if hostsFooter && !
|
|
342
|
+
{#if hostsFooter && !stacked}
|
|
293
343
|
<div class="panel-footer px-1">
|
|
294
344
|
{@render footer()}
|
|
295
345
|
</div>
|
|
@@ -306,15 +356,17 @@
|
|
|
306
356
|
|
|
307
357
|
<main
|
|
308
358
|
data-layout-root
|
|
309
|
-
class="min-h-0
|
|
310
|
-
? '
|
|
311
|
-
: 'sm:pl-
|
|
359
|
+
class="min-h-0 flex flex-1 flex-col overflow-hidden {stacked
|
|
360
|
+
? ''
|
|
361
|
+
: `sm:flex-row sm:py-2 ${leftCollapsed ? 'sm:pl-0' : 'sm:pl-2'} ${rightCollapsed ? 'sm:pr-0' : 'sm:pr-2'}`}"
|
|
312
362
|
class:fullscreen-layout={isViewerFullscreen}
|
|
313
363
|
class:relative={isMobile}
|
|
314
|
-
class:mobile-root={
|
|
364
|
+
class:mobile-root={stacked}
|
|
365
|
+
class:side-sheet={isMobile && sideSheet}
|
|
366
|
+
bind:clientWidth={rootWidth}
|
|
315
367
|
>
|
|
316
|
-
{#if
|
|
317
|
-
{#if hasViewer}
|
|
368
|
+
{#if stacked}
|
|
369
|
+
{#if isMobile && hasViewer}
|
|
318
370
|
<!-- Ends above the drawer rather than behind it, so the model stays centred in what is
|
|
319
371
|
visible. It jumps straight to its new size: animating it would resize the canvas,
|
|
320
372
|
and its render targets, on every frame of the drawer's slide. -->
|
|
@@ -322,20 +374,22 @@
|
|
|
322
374
|
<Viewer
|
|
323
375
|
{meshes}
|
|
324
376
|
bind:isFullscreen={isViewerFullscreen}
|
|
325
|
-
{
|
|
326
|
-
drawerOpen={drawer === 'full'}
|
|
377
|
+
drawerOpen={!sideSheet && drawer === 'full'}
|
|
327
378
|
{logoUrl}
|
|
328
379
|
{onViewerReady}
|
|
329
380
|
viewerConfig={{
|
|
330
381
|
...viewerConfig,
|
|
331
|
-
backgroundColor: schema?.viewerOptions?.backgroundColor,
|
|
382
|
+
backgroundColor: schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
|
|
383
|
+
look: schema?.viewerOptions?.look ?? viewerConfig.look,
|
|
332
384
|
showSceneManager: false
|
|
333
385
|
}}
|
|
334
386
|
/>
|
|
335
387
|
</div>
|
|
336
388
|
|
|
337
389
|
<div
|
|
338
|
-
class="drawer-container
|
|
390
|
+
class="drawer-container z-40 bg-background shadow-sheet drawer-{drawer} {sideSheet
|
|
391
|
+
? 'rounded-l-xl border-l'
|
|
392
|
+
: 'rounded-t-xl border-t'}"
|
|
339
393
|
>
|
|
340
394
|
<!-- Named by its visible label; aria-expanded carries the open/closed state. -->
|
|
341
395
|
<button
|
|
@@ -346,42 +400,57 @@
|
|
|
346
400
|
aria-expanded={drawer !== 'closed'}
|
|
347
401
|
>
|
|
348
402
|
<div class="drawer-pill"></div>
|
|
349
|
-
<span class="text-sm font-medium
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
403
|
+
<span class="drawer-label text-sm font-medium text-foreground">{drawerLabel}</span>
|
|
404
|
+
{#if sideSheet}
|
|
405
|
+
<ChevronLeft
|
|
406
|
+
size={16}
|
|
407
|
+
class="text-muted-foreground transition-transform duration-300 {drawer !== 'closed'
|
|
408
|
+
? 'rotate-180'
|
|
409
|
+
: ''}"
|
|
410
|
+
/>
|
|
411
|
+
{:else}
|
|
412
|
+
<ChevronUp
|
|
413
|
+
size={16}
|
|
414
|
+
class="ml-auto text-muted-foreground transition-transform duration-300 {drawer ===
|
|
415
|
+
'full'
|
|
416
|
+
? 'rotate-180'
|
|
417
|
+
: ''}"
|
|
418
|
+
/>
|
|
419
|
+
{/if}
|
|
357
420
|
</button>
|
|
358
421
|
|
|
359
|
-
|
|
422
|
+
<div class="drawer-body">
|
|
423
|
+
<!-- Inert while closed: the fields are clipped out of view, and tabbing into them
|
|
360
424
|
would scroll the drawer's insides around behind the handle. -->
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
425
|
+
<div class="drawer-content" inert={drawer === 'closed'}>
|
|
426
|
+
<div class="px-2 pb-4">
|
|
427
|
+
{#if hasLeftPanel}
|
|
428
|
+
{@render panelContent(
|
|
429
|
+
hasRightPanel ? 'left' : undefined,
|
|
430
|
+
requestedLeftTabId,
|
|
431
|
+
false
|
|
432
|
+
)}
|
|
433
|
+
{/if}
|
|
434
|
+
{#if hasRightPanel}
|
|
435
|
+
<!-- Decorative: the section below names itself with a heading. -->
|
|
436
|
+
<div class="my-4 gap-2 flex items-center" aria-hidden="true">
|
|
437
|
+
<div class="h-px flex-1 bg-border"></div>
|
|
438
|
+
<span class="text-xs font-medium px-1 text-muted-foreground">
|
|
439
|
+
{rightTabs[0]?.label ?? t.moreTab}
|
|
440
|
+
</span>
|
|
441
|
+
<div class="h-px flex-1 bg-border"></div>
|
|
442
|
+
</div>
|
|
443
|
+
{@render panelContent('right', requestedRightTabId, false)}
|
|
444
|
+
{/if}
|
|
445
|
+
</div>
|
|
377
446
|
</div>
|
|
378
|
-
</div>
|
|
379
447
|
|
|
380
|
-
|
|
448
|
+
{@render drawerFooter(drawer === 'closed')}
|
|
449
|
+
</div>
|
|
381
450
|
</div>
|
|
382
451
|
{:else}
|
|
383
452
|
<div class="flex flex-1 flex-col overflow-hidden">
|
|
384
|
-
<div class="px-3 pt-3 flex-1 overflow-y-auto">
|
|
453
|
+
<div class="px-3 pt-3 sm:px-5 flex-1 overflow-y-auto">
|
|
385
454
|
{#if hasLeftPanel}
|
|
386
455
|
{@render panelContent(hasRightPanel ? 'left' : undefined, requestedLeftTabId, false)}
|
|
387
456
|
{/if}
|
|
@@ -401,7 +470,7 @@
|
|
|
401
470
|
{/if}
|
|
402
471
|
{:else if !hasViewer && !isTwoPanelMode && hasLeftPanel !== hasRightPanel}
|
|
403
472
|
<!-- Single centered panel (left-only or right-only), no viewer -->
|
|
404
|
-
<div class="min-h-0 flex h-full flex-1 justify-center">
|
|
473
|
+
<div class="min-h-0 p-1 flex h-full flex-1 justify-center">
|
|
405
474
|
<div class="min-h-0 flex h-full w-4/5 flex-col">
|
|
406
475
|
{@render panelContent(
|
|
407
476
|
hasRightPanel ? 'right' : undefined,
|
|
@@ -428,7 +497,7 @@
|
|
|
428
497
|
<Resizable.PaneGroup
|
|
429
498
|
direction="horizontal"
|
|
430
499
|
autoSaveId="selva-layout-{layoutKey}"
|
|
431
|
-
class="min-h-0 flex-1"
|
|
500
|
+
class="min-h-0 m-1 flex-1"
|
|
432
501
|
>
|
|
433
502
|
{#if hasLeftPanel}
|
|
434
503
|
<Resizable.Pane
|
|
@@ -441,7 +510,6 @@
|
|
|
441
510
|
collapsedSize={0}
|
|
442
511
|
onCollapse={() => (leftCollapsed = true)}
|
|
443
512
|
onExpand={() => (leftCollapsed = false)}
|
|
444
|
-
class="ml-1"
|
|
445
513
|
>
|
|
446
514
|
<div
|
|
447
515
|
class="min-h-0 flex h-full flex-col {isViewerFullscreen || leftCollapsed
|
|
@@ -454,6 +522,7 @@
|
|
|
454
522
|
<Resizable.Handle
|
|
455
523
|
withHandle
|
|
456
524
|
line={false}
|
|
525
|
+
class="translate-x-1.5 z-20"
|
|
457
526
|
data-collapsed={leftCollapsed}
|
|
458
527
|
onclick={() => {
|
|
459
528
|
if (leftCollapsed) leftPaneRef?.expand();
|
|
@@ -462,30 +531,34 @@
|
|
|
462
531
|
{/if}
|
|
463
532
|
|
|
464
533
|
{#if hasViewer}
|
|
465
|
-
<Resizable.Pane order={2} minSize={20} class="min-h-0
|
|
534
|
+
<Resizable.Pane order={2} minSize={20} class="min-h-0 flex flex-col">
|
|
466
535
|
<Viewer
|
|
467
536
|
{meshes}
|
|
468
537
|
bind:isFullscreen={isViewerFullscreen}
|
|
469
|
-
{isSolving}
|
|
470
538
|
{logoUrl}
|
|
471
539
|
{onViewerReady}
|
|
472
540
|
viewerConfig={{
|
|
473
541
|
...viewerConfig,
|
|
474
|
-
backgroundColor:
|
|
542
|
+
backgroundColor:
|
|
543
|
+
schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
|
|
544
|
+
look: schema?.viewerOptions?.look ?? viewerConfig.look
|
|
475
545
|
}}
|
|
476
546
|
/>
|
|
477
547
|
</Resizable.Pane>
|
|
478
548
|
{/if}
|
|
479
549
|
|
|
480
550
|
{#if hasRightPanel}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
551
|
+
{#if hasViewer || !hasLeftPanel}
|
|
552
|
+
<Resizable.Handle
|
|
553
|
+
withHandle
|
|
554
|
+
line={false}
|
|
555
|
+
class="-translate-x-1.5 z-20"
|
|
556
|
+
data-collapsed={rightCollapsed}
|
|
557
|
+
onclick={() => {
|
|
558
|
+
if (rightCollapsed) rightPaneRef?.expand();
|
|
559
|
+
}}
|
|
560
|
+
/>
|
|
561
|
+
{/if}
|
|
489
562
|
<Resizable.Pane
|
|
490
563
|
bind:this={rightPaneRef}
|
|
491
564
|
order={3}
|
|
@@ -496,7 +569,6 @@
|
|
|
496
569
|
collapsedSize={0}
|
|
497
570
|
onCollapse={() => (rightCollapsed = true)}
|
|
498
571
|
onExpand={() => (rightCollapsed = false)}
|
|
499
|
-
class="mr-1"
|
|
500
572
|
>
|
|
501
573
|
<div
|
|
502
574
|
class="min-h-0 flex h-full flex-col {isViewerFullscreen || rightCollapsed
|
|
@@ -523,10 +595,6 @@
|
|
|
523
595
|
{/if}
|
|
524
596
|
</div>
|
|
525
597
|
{/if}
|
|
526
|
-
|
|
527
|
-
{#if solvingIndicatorPlacement === 'floating'}
|
|
528
|
-
<SolvingIndicator show={showSolvingIndicator} />
|
|
529
|
-
{/if}
|
|
530
598
|
</main>
|
|
531
599
|
|
|
532
600
|
<!-- The save, load and validation dialogs; the footer's menu opens them. -->
|
|
@@ -592,6 +660,12 @@
|
|
|
592
660
|
bottom: var(--drawer-half-h);
|
|
593
661
|
}
|
|
594
662
|
|
|
663
|
+
/* The viewer's own minimum height is for a page that scrolls; here the region sets it, and
|
|
664
|
+
anything taller would run under the drawer and take the viewer's dock with it. */
|
|
665
|
+
.viewer-region > :global(*) {
|
|
666
|
+
min-height: 0;
|
|
667
|
+
}
|
|
668
|
+
|
|
595
669
|
.drawer-container {
|
|
596
670
|
position: absolute;
|
|
597
671
|
bottom: 0;
|
|
@@ -645,6 +719,77 @@
|
|
|
645
719
|
opacity: 0.4;
|
|
646
720
|
}
|
|
647
721
|
|
|
722
|
+
.drawer-body {
|
|
723
|
+
flex: 1;
|
|
724
|
+
min-height: 0;
|
|
725
|
+
display: flex;
|
|
726
|
+
flex-direction: column;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
.drawer-label {
|
|
730
|
+
margin-left: 0.5rem;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/* Phone on its side: the drawer becomes a sheet on the right, its handle a strip down its edge. */
|
|
734
|
+
.side-sheet {
|
|
735
|
+
--sheet-closed-w: 3.25rem;
|
|
736
|
+
/* vw, not %: the drawer body resolves this against the sheet, not the layout. */
|
|
737
|
+
--sheet-open-w: min(22rem, 55vw);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.side-sheet .viewer-region {
|
|
741
|
+
inset: 0 var(--sheet-closed-w) 0 0;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.side-sheet .viewer-region-raised {
|
|
745
|
+
right: var(--sheet-open-w);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.side-sheet .drawer-container {
|
|
749
|
+
top: 0;
|
|
750
|
+
left: auto;
|
|
751
|
+
height: auto;
|
|
752
|
+
flex-direction: row;
|
|
753
|
+
transition: width 0.35s cubic-bezier(0.32, 0.72, 0, 1);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
.side-sheet .drawer-closed {
|
|
757
|
+
width: var(--sheet-closed-w);
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
.side-sheet .drawer-half,
|
|
761
|
+
.side-sheet .drawer-full {
|
|
762
|
+
width: var(--sheet-open-w);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.side-sheet .drawer-handle-bar {
|
|
766
|
+
width: var(--sheet-closed-w);
|
|
767
|
+
height: auto;
|
|
768
|
+
padding: 0 0 0 0.75rem;
|
|
769
|
+
flex-direction: column;
|
|
770
|
+
justify-content: center;
|
|
771
|
+
gap: 0.75rem;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
.side-sheet .drawer-pill {
|
|
775
|
+
top: 50%;
|
|
776
|
+
left: 8px;
|
|
777
|
+
transform: translateY(-50%);
|
|
778
|
+
width: 4px;
|
|
779
|
+
height: 2.5rem;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
.side-sheet .drawer-label {
|
|
783
|
+
margin-left: 0;
|
|
784
|
+
writing-mode: vertical-rl;
|
|
785
|
+
transform: rotate(180deg);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/* Holds its open width while the sheet slides, so the fields don't reflow on every frame. */
|
|
789
|
+
.side-sheet .drawer-body {
|
|
790
|
+
min-width: calc(var(--sheet-open-w) - var(--sheet-closed-w));
|
|
791
|
+
}
|
|
792
|
+
|
|
648
793
|
.drawer-content {
|
|
649
794
|
flex: 1;
|
|
650
795
|
overflow-y: auto;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { UISchema, SupportedTypes, ParameterPreset } from '@selvajs/schemas';
|
|
3
|
-
import type { SolveSettlement } from '@selvajs/solve/client';
|
|
3
|
+
import type { LiveSolveState, SolveSettlement } from '@selvajs/solve/client';
|
|
4
4
|
import type { ActionButton } from '../../types/actionButton';
|
|
5
5
|
import type { PresetLabels } from '../../types/presetLabels';
|
|
6
6
|
import type { ThreeViewer } from '@selvajs/visualization/render';
|
|
@@ -14,8 +14,20 @@ interface Props {
|
|
|
14
14
|
showViewer: boolean;
|
|
15
15
|
meshes?: any[];
|
|
16
16
|
isSolving: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* `createSolvingIndicator(...).show`, not `isSolving`: grows the action row's solve status,
|
|
19
|
+
* which would otherwise flash on every sub-second solve.
|
|
20
|
+
*/
|
|
17
21
|
showSolvingIndicator?: boolean;
|
|
18
|
-
/** `
|
|
22
|
+
/** `createSolvingIndicator(...).slow`: the solve status grows into a card with progress. */
|
|
23
|
+
solveIsSlow?: boolean;
|
|
24
|
+
/** The session's live channel: step, count and bar for that card. */
|
|
25
|
+
live?: LiveSolveState;
|
|
26
|
+
/** Abort in that card. The host's `SolveMessages` should then take `progressShownByHost`. */
|
|
27
|
+
onabort?: () => void;
|
|
28
|
+
/** As passed to `createSolvingIndicator`. */
|
|
29
|
+
freezesDuringSolve?: boolean;
|
|
30
|
+
/** @deprecated Ignored: the solving status always sits in the action row. */
|
|
19
31
|
solvingIndicatorPlacement?: 'floating' | 'inline';
|
|
20
32
|
/** Rendered above the action row, for a host that keeps the solve's messages in the flow. */
|
|
21
33
|
solveMessages?: Snippet;
|
|
@@ -20,12 +20,14 @@
|
|
|
20
20
|
[
|
|
21
21
|
'gap-1 py-2 lg:py-3 lg:flex-col lg:w-auto px-2 lg:px-0',
|
|
22
22
|
'flex w-full shrink-0 flex-row items-center',
|
|
23
|
-
'backdrop-blur-sm bg-background/90 cursor-pointer'
|
|
23
|
+
'backdrop-blur-sm bg-background/90 cursor-pointer',
|
|
24
|
+
side === 'left' ? 'lg:border-r' : 'lg:border-l',
|
|
25
|
+
'border-border'
|
|
24
26
|
].join(' ')
|
|
25
27
|
);
|
|
26
28
|
|
|
27
29
|
const tabButtonClass =
|
|
28
|
-
'w-8 h-8 rounded cursor-pointer flex shrink-0 items-center justify-center text-muted-foreground transition-colors hover:bg-
|
|
30
|
+
'w-8 h-8 rounded-md cursor-pointer flex shrink-0 items-center justify-center text-muted-foreground transition-colors hover:bg-hover hover:text-foreground';
|
|
29
31
|
</script>
|
|
30
32
|
|
|
31
33
|
<div
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
footerText?: string;
|
|
58
58
|
/**
|
|
59
59
|
* How long one solve may take before the client aborts it (ms). Pass the same value the
|
|
60
|
-
* server enforces
|
|
60
|
+
* server enforces for this definition's compute server, or the client aborts solves that would
|
|
61
61
|
* have finished.
|
|
62
62
|
*/
|
|
63
63
|
solveDeadlineMs: number;
|
|
@@ -286,7 +286,10 @@
|
|
|
286
286
|
showViewer={!!schema.viewerOptions?.enableRemote}
|
|
287
287
|
meshes={session.meshes}
|
|
288
288
|
isSolving={session.isSolving}
|
|
289
|
-
showSolvingIndicator={
|
|
289
|
+
showSolvingIndicator={solvingIndicator.show}
|
|
290
|
+
solveIsSlow={solvingIndicator.slow}
|
|
291
|
+
live={session.live}
|
|
292
|
+
onabort={() => session.abort()}
|
|
290
293
|
hasPendingChanges={session.hasPendingChanges}
|
|
291
294
|
hasNeverSolved={session.hasNeverSolved}
|
|
292
295
|
bind:isViewerFullscreen
|
|
@@ -317,4 +320,5 @@
|
|
|
317
320
|
onabort={() => session.abort()}
|
|
318
321
|
onconfirm={() => session.acknowledge()}
|
|
319
322
|
ondiscard={() => session.discard()}
|
|
323
|
+
progressShownByHost={schema?.instanceSolve !== false}
|
|
320
324
|
/>
|
|
@@ -36,7 +36,7 @@ interface Props {
|
|
|
36
36
|
footerText?: string;
|
|
37
37
|
/**
|
|
38
38
|
* How long one solve may take before the client aborts it (ms). Pass the same value the
|
|
39
|
-
* server enforces
|
|
39
|
+
* server enforces for this definition's compute server, or the client aborts solves that would
|
|
40
40
|
* have finished.
|
|
41
41
|
*/
|
|
42
42
|
solveDeadlineMs: number;
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
import type { Snippet } from 'svelte';
|
|
10
10
|
import type { SolveDiagnostic } from '@selvajs/solve/shared';
|
|
11
|
-
import * as Dialog from '../primitives/dialog';
|
|
11
|
+
import * as Dialog from '../primitives/dialog/index.js';
|
|
12
12
|
import IssueList, { type Issue } from '../primitives/IssueList.svelte';
|
|
13
|
-
import { getLocaleContext } from '../../i18n/localeContext.svelte';
|
|
14
|
-
import { formatCount } from '../../i18n/messages';
|
|
13
|
+
import { getLocaleContext } from '../../i18n/localeContext.svelte.js';
|
|
14
|
+
import { formatCount } from '../../i18n/messages.js';
|
|
15
15
|
|
|
16
16
|
interface Props {
|
|
17
17
|
/** The last solve's messages. Preferred over `errors`/`warnings` when both are given. */
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
<button
|
|
204
204
|
type="button"
|
|
205
205
|
onclick={() => selectListedState(preset)}
|
|
206
|
-
class="p-3 w-full rounded-lg border text-left transition-colors hover:bg-
|
|
206
|
+
class="p-3 w-full rounded-lg border text-left transition-colors hover:bg-hover"
|
|
207
207
|
>
|
|
208
208
|
<div class="text-sm font-medium">{preset.name}</div>
|
|
209
209
|
{#if preset.description}
|