@selvajs/ui 6.6.0-beta.9 → 7.0.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 +73 -45
- 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 +5 -5
- 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 +404 -0
- package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
- package/dist/composables/useFooterItem.svelte.d.ts +1 -1
- package/dist/composables/useFooterItem.svelte.js +1 -1
- package/dist/compute/liveProgress.svelte.d.ts +16 -0
- package/dist/compute/liveProgress.svelte.js +90 -0
- package/dist/compute/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 +93 -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 +74 -46
- 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 +5 -5
- 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 +404 -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 +93 -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
|
@@ -1,7 +1,7 @@
|
|
|
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
7
|
import { ChevronUp, Download, Ellipsis, Upload } from '@lucide/svelte';
|
|
@@ -11,9 +11,9 @@
|
|
|
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 '
|
|
15
|
-
import * as DropdownMenu from '
|
|
16
|
-
import { Button } from '
|
|
14
|
+
import * as Resizable from '#lib/components/primitives/resizable/index.js';
|
|
15
|
+
import * as DropdownMenu from '#lib/components/primitives/dropdown-menu/index.js';
|
|
16
|
+
import { Button } from '#lib';
|
|
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,
|
|
@@ -150,6 +165,14 @@
|
|
|
150
165
|
return () => mqMobile.removeEventListener('change', update);
|
|
151
166
|
});
|
|
152
167
|
|
|
168
|
+
// Without a viewer there's nothing to sit beside, so a narrow host (a docked Rhino panel) gets
|
|
169
|
+
// the phone's single edge-to-edge column instead of a card floating in its own margins.
|
|
170
|
+
const STACK_BELOW_WIDTH = 900;
|
|
171
|
+
let rootWidth = $state(0);
|
|
172
|
+
const stacked = $derived(
|
|
173
|
+
isMobile || (!hasViewer && rootWidth > 0 && rootWidth < STACK_BELOW_WIDTH)
|
|
174
|
+
);
|
|
175
|
+
|
|
153
176
|
let leftCollapsed = $state(false);
|
|
154
177
|
let rightCollapsed = $state(false);
|
|
155
178
|
let leftPaneRef = $state<{ expand: () => void } | null>(null);
|
|
@@ -255,9 +278,9 @@
|
|
|
255
278
|
<!-- One primary action and one menu. A definition that solves on every change has no Calculate,
|
|
256
279
|
so the menu sits alone at the end of the row. -->
|
|
257
280
|
{#snippet footer()}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
{
|
|
281
|
+
<!-- No wrapper: it would always render (the messages' live region is never empty) and pick up
|
|
282
|
+
the drawer footer's row padding, leaving a gap above Calculate with nothing in it. -->
|
|
283
|
+
{@render solveMessages?.()}
|
|
261
284
|
{#if schema.instanceSolve === false}
|
|
262
285
|
<CalculateButton
|
|
263
286
|
{hasPendingChanges}
|
|
@@ -266,13 +289,18 @@
|
|
|
266
289
|
{oncalculate}
|
|
267
290
|
trailing={hasMenu ? actionsMenu : undefined}
|
|
268
291
|
/>
|
|
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
|
-
|
|
292
|
+
{:else}
|
|
293
|
+
<div class="mt-3 pb-3 pt-2 px-2 gap-2 flex items-center border-t border-border">
|
|
294
|
+
<SolvingIndicator
|
|
295
|
+
{isSolving}
|
|
296
|
+
show={showSolvingIndicator}
|
|
297
|
+
slow={solveIsSlow}
|
|
298
|
+
{live}
|
|
299
|
+
{onabort}
|
|
300
|
+
{freezesDuringSolve}
|
|
301
|
+
/>
|
|
274
302
|
{#if hasMenu}
|
|
275
|
-
|
|
303
|
+
{@render actionsMenu()}
|
|
276
304
|
{/if}
|
|
277
305
|
</div>
|
|
278
306
|
{/if}
|
|
@@ -287,9 +315,9 @@
|
|
|
287
315
|
)}
|
|
288
316
|
<div class="panel-content-wrapper">
|
|
289
317
|
{#if schema.layout.type === 'tabbed'}
|
|
290
|
-
<TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={
|
|
318
|
+
<TabLayout {schema} {values} {onValueChange} {panelFilter} {requestedTabId} bare={stacked} />
|
|
291
319
|
{/if}
|
|
292
|
-
{#if hostsFooter && !
|
|
320
|
+
{#if hostsFooter && !stacked}
|
|
293
321
|
<div class="panel-footer px-1">
|
|
294
322
|
{@render footer()}
|
|
295
323
|
</div>
|
|
@@ -306,15 +334,16 @@
|
|
|
306
334
|
|
|
307
335
|
<main
|
|
308
336
|
data-layout-root
|
|
309
|
-
class="min-h-0
|
|
310
|
-
? '
|
|
311
|
-
: 'sm:pl-
|
|
337
|
+
class="min-h-0 flex flex-1 flex-col overflow-hidden {stacked
|
|
338
|
+
? ''
|
|
339
|
+
: `sm:flex-row sm:py-2 ${leftCollapsed ? 'sm:pl-0' : 'sm:pl-2'} ${rightCollapsed ? 'sm:pr-0' : 'sm:pr-2'}`}"
|
|
312
340
|
class:fullscreen-layout={isViewerFullscreen}
|
|
313
341
|
class:relative={isMobile}
|
|
314
|
-
class:mobile-root={
|
|
342
|
+
class:mobile-root={stacked}
|
|
343
|
+
bind:clientWidth={rootWidth}
|
|
315
344
|
>
|
|
316
|
-
{#if
|
|
317
|
-
{#if hasViewer}
|
|
345
|
+
{#if stacked}
|
|
346
|
+
{#if isMobile && hasViewer}
|
|
318
347
|
<!-- Ends above the drawer rather than behind it, so the model stays centred in what is
|
|
319
348
|
visible. It jumps straight to its new size: animating it would resize the canvas,
|
|
320
349
|
and its render targets, on every frame of the drawer's slide. -->
|
|
@@ -322,20 +351,20 @@
|
|
|
322
351
|
<Viewer
|
|
323
352
|
{meshes}
|
|
324
353
|
bind:isFullscreen={isViewerFullscreen}
|
|
325
|
-
{isSolving}
|
|
326
354
|
drawerOpen={drawer === 'full'}
|
|
327
355
|
{logoUrl}
|
|
328
356
|
{onViewerReady}
|
|
329
357
|
viewerConfig={{
|
|
330
358
|
...viewerConfig,
|
|
331
|
-
backgroundColor: schema?.viewerOptions?.backgroundColor,
|
|
359
|
+
backgroundColor: schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
|
|
360
|
+
look: schema?.viewerOptions?.look ?? viewerConfig.look,
|
|
332
361
|
showSceneManager: false
|
|
333
362
|
}}
|
|
334
363
|
/>
|
|
335
364
|
</div>
|
|
336
365
|
|
|
337
366
|
<div
|
|
338
|
-
class="drawer-container rounded-t-
|
|
367
|
+
class="drawer-container z-40 rounded-t-xl border-t bg-background shadow-sheet drawer-{drawer}"
|
|
339
368
|
>
|
|
340
369
|
<!-- Named by its visible label; aria-expanded carries the open/closed state. -->
|
|
341
370
|
<button
|
|
@@ -381,7 +410,7 @@
|
|
|
381
410
|
</div>
|
|
382
411
|
{:else}
|
|
383
412
|
<div class="flex flex-1 flex-col overflow-hidden">
|
|
384
|
-
<div class="px-3 pt-3 flex-1 overflow-y-auto">
|
|
413
|
+
<div class="px-3 pt-3 sm:px-5 flex-1 overflow-y-auto">
|
|
385
414
|
{#if hasLeftPanel}
|
|
386
415
|
{@render panelContent(hasRightPanel ? 'left' : undefined, requestedLeftTabId, false)}
|
|
387
416
|
{/if}
|
|
@@ -401,7 +430,7 @@
|
|
|
401
430
|
{/if}
|
|
402
431
|
{:else if !hasViewer && !isTwoPanelMode && hasLeftPanel !== hasRightPanel}
|
|
403
432
|
<!-- Single centered panel (left-only or right-only), no viewer -->
|
|
404
|
-
<div class="min-h-0 flex h-full flex-1 justify-center">
|
|
433
|
+
<div class="min-h-0 p-1 flex h-full flex-1 justify-center">
|
|
405
434
|
<div class="min-h-0 flex h-full w-4/5 flex-col">
|
|
406
435
|
{@render panelContent(
|
|
407
436
|
hasRightPanel ? 'right' : undefined,
|
|
@@ -428,7 +457,7 @@
|
|
|
428
457
|
<Resizable.PaneGroup
|
|
429
458
|
direction="horizontal"
|
|
430
459
|
autoSaveId="selva-layout-{layoutKey}"
|
|
431
|
-
class="min-h-0 flex-1"
|
|
460
|
+
class="min-h-0 m-1 flex-1"
|
|
432
461
|
>
|
|
433
462
|
{#if hasLeftPanel}
|
|
434
463
|
<Resizable.Pane
|
|
@@ -441,7 +470,6 @@
|
|
|
441
470
|
collapsedSize={0}
|
|
442
471
|
onCollapse={() => (leftCollapsed = true)}
|
|
443
472
|
onExpand={() => (leftCollapsed = false)}
|
|
444
|
-
class="ml-1"
|
|
445
473
|
>
|
|
446
474
|
<div
|
|
447
475
|
class="min-h-0 flex h-full flex-col {isViewerFullscreen || leftCollapsed
|
|
@@ -454,6 +482,7 @@
|
|
|
454
482
|
<Resizable.Handle
|
|
455
483
|
withHandle
|
|
456
484
|
line={false}
|
|
485
|
+
class="translate-x-1.5 z-20"
|
|
457
486
|
data-collapsed={leftCollapsed}
|
|
458
487
|
onclick={() => {
|
|
459
488
|
if (leftCollapsed) leftPaneRef?.expand();
|
|
@@ -462,30 +491,34 @@
|
|
|
462
491
|
{/if}
|
|
463
492
|
|
|
464
493
|
{#if hasViewer}
|
|
465
|
-
<Resizable.Pane order={2} minSize={20} class="min-h-0
|
|
494
|
+
<Resizable.Pane order={2} minSize={20} class="min-h-0 flex flex-col">
|
|
466
495
|
<Viewer
|
|
467
496
|
{meshes}
|
|
468
497
|
bind:isFullscreen={isViewerFullscreen}
|
|
469
|
-
{isSolving}
|
|
470
498
|
{logoUrl}
|
|
471
499
|
{onViewerReady}
|
|
472
500
|
viewerConfig={{
|
|
473
501
|
...viewerConfig,
|
|
474
|
-
backgroundColor:
|
|
502
|
+
backgroundColor:
|
|
503
|
+
schema?.viewerOptions?.backgroundColor ?? viewerConfig.backgroundColor,
|
|
504
|
+
look: schema?.viewerOptions?.look ?? viewerConfig.look
|
|
475
505
|
}}
|
|
476
506
|
/>
|
|
477
507
|
</Resizable.Pane>
|
|
478
508
|
{/if}
|
|
479
509
|
|
|
480
510
|
{#if hasRightPanel}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
511
|
+
{#if hasViewer || !hasLeftPanel}
|
|
512
|
+
<Resizable.Handle
|
|
513
|
+
withHandle
|
|
514
|
+
line={false}
|
|
515
|
+
class="-translate-x-1.5 z-20"
|
|
516
|
+
data-collapsed={rightCollapsed}
|
|
517
|
+
onclick={() => {
|
|
518
|
+
if (rightCollapsed) rightPaneRef?.expand();
|
|
519
|
+
}}
|
|
520
|
+
/>
|
|
521
|
+
{/if}
|
|
489
522
|
<Resizable.Pane
|
|
490
523
|
bind:this={rightPaneRef}
|
|
491
524
|
order={3}
|
|
@@ -496,7 +529,6 @@
|
|
|
496
529
|
collapsedSize={0}
|
|
497
530
|
onCollapse={() => (rightCollapsed = true)}
|
|
498
531
|
onExpand={() => (rightCollapsed = false)}
|
|
499
|
-
class="mr-1"
|
|
500
532
|
>
|
|
501
533
|
<div
|
|
502
534
|
class="min-h-0 flex h-full flex-col {isViewerFullscreen || rightCollapsed
|
|
@@ -523,10 +555,6 @@
|
|
|
523
555
|
{/if}
|
|
524
556
|
</div>
|
|
525
557
|
{/if}
|
|
526
|
-
|
|
527
|
-
{#if solvingIndicatorPlacement === 'floating'}
|
|
528
|
-
<SolvingIndicator show={showSolvingIndicator} />
|
|
529
|
-
{/if}
|
|
530
558
|
</main>
|
|
531
559
|
|
|
532
560
|
<!-- The save, load and validation dialogs; the footer's menu opens them. -->
|
|
@@ -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
|
/>
|
|
@@ -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 '
|
|
12
|
-
import IssueList, { type Issue } from '
|
|
13
|
-
import { getLocaleContext } from '
|
|
14
|
-
import { formatCount } from '
|
|
11
|
+
import * as Dialog from '#lib/components/primitives/dialog/index.js';
|
|
12
|
+
import IssueList, { type Issue } from '#lib/components/primitives/IssueList.svelte';
|
|
13
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
14
|
+
import { formatCount } from '#lib/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}
|
|
@@ -16,10 +16,11 @@
|
|
|
16
16
|
import { LoaderCircle } from '@lucide/svelte';
|
|
17
17
|
import type { SolveDiagnostic } from '@selvajs/solve/shared';
|
|
18
18
|
import type { LiveSolveState, SolvePhase } from '@selvajs/solve/client';
|
|
19
|
-
import { Button } from '
|
|
20
|
-
import IssueList, { type Issue } from '
|
|
21
|
-
import SeverityIcon from '
|
|
22
|
-
import { getLocaleContext } from '
|
|
19
|
+
import { Button } from '#lib/components/primitives/button/index.js';
|
|
20
|
+
import IssueList, { type Issue } from '#lib/components/primitives/IssueList.svelte';
|
|
21
|
+
import SeverityIcon from '#lib/components/primitives/SeverityIcon.svelte';
|
|
22
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
23
|
+
import { createLiveProgress } from '#lib/compute/liveProgress.svelte.js';
|
|
23
24
|
|
|
24
25
|
interface Props {
|
|
25
26
|
/** What the running (or most recent) solve has said over the live channel. */
|
|
@@ -38,6 +39,11 @@
|
|
|
38
39
|
freezesDuringSolve?: boolean;
|
|
39
40
|
/** `floating` overlays the bottom centre; `inline` sits in the flow below the host's content. */
|
|
40
41
|
placement?: 'floating' | 'inline';
|
|
42
|
+
/**
|
|
43
|
+
* The host shows progress and Abort itself (`AppLayout`'s solve status), so the live view
|
|
44
|
+
* keeps only the messages that arrive mid-solve.
|
|
45
|
+
*/
|
|
46
|
+
progressShownByHost?: boolean;
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
let {
|
|
@@ -48,7 +54,8 @@
|
|
|
48
54
|
onconfirm,
|
|
49
55
|
ondiscard,
|
|
50
56
|
freezesDuringSolve = false,
|
|
51
|
-
placement = 'floating'
|
|
57
|
+
placement = 'floating',
|
|
58
|
+
progressShownByHost = false
|
|
52
59
|
}: Props = $props();
|
|
53
60
|
|
|
54
61
|
const locale = getLocaleContext();
|
|
@@ -56,50 +63,10 @@
|
|
|
56
63
|
|
|
57
64
|
const REMARK_LINGER_MS = 6000;
|
|
58
65
|
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// bar runs linearly to where the step will end, over that time. Steps are weighted by time, so
|
|
64
|
-
// linear gives one steady speed across the solve; any easing curve visibly speeds up and
|
|
65
|
-
// crawls within each step. A slower run waits at the step's end; a faster one snaps ahead.
|
|
66
|
-
let bars = $state.raw<Record<string, { width: number; ms: number }>>({});
|
|
67
|
-
// Any live event re-runs the effect below. Only a source with a new report may re-snap;
|
|
68
|
-
// the rest keep easing where they are.
|
|
69
|
-
let seen = new Map<string, unknown>();
|
|
70
|
-
let targets: Record<string, { width: number; ms: number }> = {};
|
|
71
|
-
$effect(() => {
|
|
72
|
-
const snapped: Record<string, { width: number; ms: number }> = {};
|
|
73
|
-
const eased: Record<string, { width: number; ms: number }> = {};
|
|
74
|
-
const current = untrack(() => bars);
|
|
75
|
-
// eslint-disable-next-line svelte/prefer-svelte-reactivity -- bookkeeping for this effect; reactive reads here would re-trigger it
|
|
76
|
-
const nextSeen = new Map<string, unknown>();
|
|
77
|
-
for (const p of progress) {
|
|
78
|
-
if (p.fraction === undefined) continue;
|
|
79
|
-
const key = p.source ?? '';
|
|
80
|
-
nextSeen.set(key, p);
|
|
81
|
-
if (seen.get(key) === p && current[key]) {
|
|
82
|
-
snapped[key] = current[key];
|
|
83
|
-
// This run's cleanup cancelled the frame that would have started the ease.
|
|
84
|
-
if (targets[key] && current[key] !== targets[key]) eased[key] = targets[key];
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
snapped[key] = { width: p.fraction, ms: 150 };
|
|
88
|
-
if (p.nextFraction !== undefined && p.stepMs !== undefined) {
|
|
89
|
-
eased[key] = { width: p.nextFraction, ms: p.stepMs };
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
seen = nextSeen;
|
|
93
|
-
targets = eased;
|
|
94
|
-
bars = snapped;
|
|
95
|
-
if (Object.keys(eased).length === 0) return;
|
|
96
|
-
// Two frames: the snapped width must be painted before the eased one is set, or the
|
|
97
|
-
// browser folds both into one style change and there is nothing to transition from.
|
|
98
|
-
let frame = requestAnimationFrame(() => {
|
|
99
|
-
frame = requestAnimationFrame(() => (bars = { ...snapped, ...eased }));
|
|
100
|
-
});
|
|
101
|
-
return () => cancelAnimationFrame(frame);
|
|
102
|
-
});
|
|
66
|
+
const liveProgress = createLiveProgress(() => live);
|
|
67
|
+
const progress = $derived(liveProgress.progress);
|
|
68
|
+
const bars = $derived(liveProgress.bars);
|
|
69
|
+
const headline = $derived(liveProgress.headline);
|
|
103
70
|
// Grasshopper's own complaints stay in the footer log; this panel shows what the author wrote.
|
|
104
71
|
const authored = $derived(diagnostics.filter((d) => d.isGate));
|
|
105
72
|
|
|
@@ -126,16 +93,30 @@
|
|
|
126
93
|
// Keyed on the diagnostics array's identity, which every report renews, rather than on a
|
|
127
94
|
// solve id: only the live channel has one, and on the Compute path remarks arrive with the
|
|
128
95
|
// result. Once per array, so remarks that sat behind a review do not reappear after Continue.
|
|
96
|
+
//
|
|
97
|
+
// A remark is shown once while it stays raised, not after every solve. Every report repeats
|
|
98
|
+
// it: Grasshopper keeps runtime messages on a Message component an input change did not
|
|
99
|
+
// reach, and Compute re-solves the whole definition. It shows again once a solve stops
|
|
100
|
+
// raising it and a later one raises it anew.
|
|
129
101
|
let lingering = $state(false);
|
|
130
102
|
let lingeredFor: SolveDiagnostic[] | null = null;
|
|
103
|
+
let shownRemarks: ReadonlySet<string> = new Set();
|
|
104
|
+
let freshRemarks = $state.raw<SolveDiagnostic[]>([]);
|
|
105
|
+
const remarkKey = (d: SolveDiagnostic) => `${d.source ?? ''}\u0000${d.message}`;
|
|
131
106
|
$effect(() => {
|
|
132
107
|
if (phase === 'live') {
|
|
133
108
|
lingering = false;
|
|
134
109
|
return;
|
|
135
110
|
}
|
|
136
|
-
if (
|
|
111
|
+
if (lingeredFor === diagnostics) return;
|
|
137
112
|
lingeredFor = diagnostics;
|
|
138
|
-
|
|
113
|
+
const raised = authoredRemarks.map(remarkKey);
|
|
114
|
+
const stillShown = raised.filter((k) => shownRemarks.has(k));
|
|
115
|
+
const fresh = authoredRemarks.filter((d) => !shownRemarks.has(remarkKey(d)));
|
|
116
|
+
const showNow = phase === 'idle' && fresh.length > 0;
|
|
117
|
+
shownRemarks = new Set(showNow ? [...stillShown, ...fresh.map(remarkKey)] : stillShown);
|
|
118
|
+
if (!showNow) return;
|
|
119
|
+
freshRemarks = fresh;
|
|
139
120
|
lingering = true;
|
|
140
121
|
const timer = setTimeout(() => (lingering = false), REMARK_LINGER_MS);
|
|
141
122
|
return () => clearTimeout(timer);
|
|
@@ -181,7 +162,7 @@
|
|
|
181
162
|
// While solving, the live channel is all there is. Once the result lands it is authoritative
|
|
182
163
|
// — it carries remarks too — so the live list is dropped entirely and nothing is shown twice.
|
|
183
164
|
const rows = $derived<SolveDiagnostic[]>(
|
|
184
|
-
view === 'live' ? [...live.diagnostics] : view === 'idle' ?
|
|
165
|
+
view === 'live' ? [...live.diagnostics] : view === 'idle' ? freshRemarks : authoredGating
|
|
185
166
|
);
|
|
186
167
|
|
|
187
168
|
// A remark states something without asking anything, so it reads as a quiet note.
|
|
@@ -193,37 +174,11 @@
|
|
|
193
174
|
}))
|
|
194
175
|
);
|
|
195
176
|
|
|
196
|
-
// Steps a few milliseconds long would swap the headline faster than it can be read. Each one
|
|
197
|
-
// stays up for at least this long; steps that end sooner are skipped in the label but still
|
|
198
|
-
// count in the bar. The label and its step count move together so they never disagree.
|
|
199
|
-
const HEADLINE_MIN_MS = 200;
|
|
200
|
-
let headline = $state.raw<(typeof progress)[number] | undefined>(undefined);
|
|
201
|
-
let headlineAt = 0;
|
|
202
|
-
$effect(() => {
|
|
203
|
-
const next = progress[0];
|
|
204
|
-
const shown = untrack(() => headline);
|
|
205
|
-
if (next?.label === shown?.label && next?.done === shown?.done) {
|
|
206
|
-
headline = next;
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
const show = () => {
|
|
210
|
-
headline = next;
|
|
211
|
-
headlineAt = performance.now();
|
|
212
|
-
};
|
|
213
|
-
const wait = HEADLINE_MIN_MS - (performance.now() - headlineAt);
|
|
214
|
-
if (!shown || wait <= 0) {
|
|
215
|
-
show();
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
const timer = setTimeout(show, wait);
|
|
219
|
-
return () => clearTimeout(timer);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
177
|
const visible = $derived(
|
|
223
178
|
view === 'review' || view === 'blocked'
|
|
224
179
|
? true
|
|
225
180
|
: view === 'live'
|
|
226
|
-
? revealed && (rows.length > 0 || progress.length > 0)
|
|
181
|
+
? revealed && (rows.length > 0 || (!progressShownByHost && progress.length > 0))
|
|
227
182
|
: rows.length > 0 && lingering
|
|
228
183
|
);
|
|
229
184
|
|
|
@@ -245,10 +200,14 @@
|
|
|
245
200
|
}
|
|
246
201
|
|
|
247
202
|
// Escape resolves to the safe side — discard, keeping what is on screen — never to silently
|
|
248
|
-
// applying a result the user has not accepted.
|
|
203
|
+
// applying a result the user has not accepted. A frozen host gets no keydown until the solve
|
|
204
|
+
// ends; there the plugin aborts on the key state, which only counts while Rhino is in front, so
|
|
205
|
+
// a browser tab (local or Compute) has to abort from the page.
|
|
249
206
|
function handleKeydown(e: KeyboardEvent) {
|
|
250
207
|
if (e.key !== 'Escape') return;
|
|
251
|
-
if (phase === '
|
|
208
|
+
if (phase === 'live') {
|
|
209
|
+
if (!freezesDuringSolve) onabort();
|
|
210
|
+
} else if (phase === 'review') ondiscard();
|
|
252
211
|
else if (phase === 'blocked') dismiss();
|
|
253
212
|
}
|
|
254
213
|
</script>
|
|
@@ -269,18 +228,17 @@
|
|
|
269
228
|
</p>
|
|
270
229
|
{/if}
|
|
271
230
|
{:else if visible}
|
|
231
|
+
<!-- Inline, it is a row of the host's footer like the Calculate row under it, not a card: a
|
|
232
|
+
framed box inside an edge-to-edge column reads as a dialog glued into the page. -->
|
|
272
233
|
<div
|
|
273
|
-
class=
|
|
274
|
-
?
|
|
275
|
-
:
|
|
276
|
-
'blocked'
|
|
277
|
-
? 'border-destructive/50'
|
|
278
|
-
: ''}"
|
|
234
|
+
class={placement === 'inline'
|
|
235
|
+
? `px-2 py-2 border-t ${view === 'blocked' ? 'border-destructive/40' : 'border-border'}`
|
|
236
|
+
: `p-3 bottom-4 shadow-lg w-lg fixed left-1/2 z-50 max-w-screen-inset -translate-x-1/2 rounded-lg border bg-background ${view === 'blocked' ? 'border-destructive/50' : ''}`}
|
|
279
237
|
role={view === 'review' || view === 'blocked' ? 'alert' : undefined}
|
|
280
238
|
data-testid="solve-messages"
|
|
281
239
|
data-view={view}
|
|
282
240
|
>
|
|
283
|
-
{#if view === 'live'}
|
|
241
|
+
{#if view === 'live' && !progressShownByHost}
|
|
284
242
|
{@const head = headline ?? progress[0]}
|
|
285
243
|
<div>
|
|
286
244
|
<div>
|
|
@@ -298,8 +256,13 @@
|
|
|
298
256
|
class="-my-1 shrink-0"
|
|
299
257
|
disabled={finishing}
|
|
300
258
|
onclick={onabort}
|
|
259
|
+
aria-keyshortcuts="Escape"
|
|
260
|
+
title={t.solveMessagesEscHint}
|
|
301
261
|
>
|
|
302
262
|
{t.solveMessagesAbort}
|
|
263
|
+
<kbd class="px-1 rounded-sm border border-border font-sans text-2xs opacity-70">
|
|
264
|
+
Esc
|
|
265
|
+
</kbd>
|
|
303
266
|
</Button>
|
|
304
267
|
</div>
|
|
305
268
|
{#each progress as p, i (p.source ?? '')}
|
|
@@ -338,6 +301,30 @@
|
|
|
338
301
|
{/each}
|
|
339
302
|
</div>
|
|
340
303
|
</div>
|
|
304
|
+
{:else if (view === 'review' || view === 'blocked') && placement === 'inline'}
|
|
305
|
+
<!-- Each message carries its own icon, so the label goes without one; the buttons share
|
|
306
|
+
its row rather than adding one under a single line of text. -->
|
|
307
|
+
<div class="mb-1.5 gap-2 flex items-center">
|
|
308
|
+
<span
|
|
309
|
+
class="min-w-0 text-xs font-medium flex-1 truncate {view === 'blocked'
|
|
310
|
+
? 'text-destructive'
|
|
311
|
+
: 'text-muted-foreground'}"
|
|
312
|
+
>
|
|
313
|
+
{view === 'blocked' ? t.solveBlockedTitle : t.solveMessagesTitle}
|
|
314
|
+
</span>
|
|
315
|
+
{#if view === 'blocked'}
|
|
316
|
+
<Button variant="ghost" size="xs" class="-my-1 shrink-0" onclick={dismiss}>
|
|
317
|
+
{t.solveMessagesDismiss}
|
|
318
|
+
</Button>
|
|
319
|
+
{:else}
|
|
320
|
+
<Button variant="ghost" size="xs" class="-my-1 shrink-0" onclick={ondiscard}>
|
|
321
|
+
{t.solveMessagesDiscard}
|
|
322
|
+
</Button>
|
|
323
|
+
<Button size="xs" class="-my-1 shrink-0" onclick={onconfirm}>
|
|
324
|
+
{t.solveMessagesConfirm}
|
|
325
|
+
</Button>
|
|
326
|
+
{/if}
|
|
327
|
+
</div>
|
|
341
328
|
{:else if view === 'review' || view === 'blocked'}
|
|
342
329
|
<div class="mb-2">
|
|
343
330
|
<div class="gap-2 text-sm font-medium flex items-center">
|
|
@@ -356,12 +343,16 @@
|
|
|
356
343
|
{/if}
|
|
357
344
|
|
|
358
345
|
{#if rows.length > 0}
|
|
359
|
-
<div
|
|
346
|
+
<div
|
|
347
|
+
class="max-h-40 overflow-y-auto {view === 'live' && !progressShownByHost
|
|
348
|
+
? 'mt-3 pt-3 border-t'
|
|
349
|
+
: ''}"
|
|
350
|
+
>
|
|
360
351
|
<IssueList {issues} variant="plain" />
|
|
361
352
|
</div>
|
|
362
353
|
{/if}
|
|
363
354
|
|
|
364
|
-
{#if view === 'review' || view === 'blocked'}
|
|
355
|
+
{#if (view === 'review' || view === 'blocked') && placement === 'floating'}
|
|
365
356
|
<div class="mt-3 gap-2 flex justify-end">
|
|
366
357
|
{#if view === 'blocked'}
|
|
367
358
|
<Button variant="outline" size="sm" onclick={dismiss}>{t.solveMessagesDismiss}</Button>
|
|
@@ -94,14 +94,14 @@
|
|
|
94
94
|
const sidenavWrapClass = $derived(
|
|
95
95
|
_mode === 'fixed'
|
|
96
96
|
? 'flex shrink-0'
|
|
97
|
-
: 'flex shrink-0 sm:self-start sm:sticky sm:top-(--header-h) sm:max-h-
|
|
97
|
+
: 'flex shrink-0 sm:self-start sm:sticky sm:top-(--header-h) sm:max-h-(--below-header-h)'
|
|
98
98
|
);
|
|
99
99
|
|
|
100
100
|
// The sticky wrapper is only as tall as its content, so in scroll mode the divider comes
|
|
101
101
|
// from the main column's left edge — that one spans the full body height.
|
|
102
102
|
const mainClass = $derived(
|
|
103
103
|
_mode === 'fixed'
|
|
104
|
-
? 'min-h-0 flex-1 overflow-y-auto'
|
|
104
|
+
? 'min-h-0 min-w-0 flex-1 overflow-y-auto'
|
|
105
105
|
: 'min-w-0 flex-1 overflow-y-auto border-border sm:border-l'
|
|
106
106
|
);
|
|
107
107
|
</script>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { FooterItem } from '
|
|
2
|
+
import type { FooterItem } from '#lib/contexts/footerContext.svelte.js';
|
|
3
3
|
|
|
4
4
|
let { item }: { item: FooterItem } = $props();
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
{#if item.onClick}
|
|
10
10
|
<button
|
|
11
11
|
onclick={item.onClick}
|
|
12
|
-
class="gap-1.5 px-2 py-0.5
|
|
12
|
+
class="gap-1.5 px-2 py-0.5 flex cursor-pointer items-center rounded-sm transition-colors hover:bg-hover"
|
|
13
13
|
>
|
|
14
14
|
<item.component {...itemProps} />
|
|
15
15
|
</button>
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
let { class: className = '', children }: PageContentProps = $props();
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
<!-- One content width for every page, so moving between pages doesn't change the frame. -->
|
|
11
|
+
<div class={`max-w-6xl min-w-0 mx-auto w-full px-(--page-px) py-(--page-py) ${className}`}>
|
|
11
12
|
{@render children?.()}
|
|
12
|
-
</
|
|
13
|
+
</div>
|