@selvajs/ui 6.6.0-beta.8 → 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 +95 -37
- package/dist/components/compute/AppLayout.svelte.d.ts +18 -1
- 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 +9 -21
- package/dist/components/compute/SolveMessages.svelte +101 -87
- package/dist/components/compute/SolveMessages.svelte.d.ts +12 -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 +8 -6
- package/dist/components/layout/PageHeader.svelte +3 -3
- package/dist/components/layout/SideNav.svelte +56 -15
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +158 -62
- package/dist/components/preview/Group.svelte +14 -9
- package/dist/components/preview/HelpButton.svelte +1 -1
- package/dist/components/preview/ImageOutput.svelte +16 -11
- package/dist/components/preview/InputControl.svelte +115 -50
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- 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 +65 -33
- package/dist/components/preview/TabContent.svelte.d.ts +5 -1
- package/dist/components/preview/TabLayout.svelte +29 -8
- package/dist/components/preview/TabLayout.svelte.d.ts +5 -0
- package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/dist/components/preview/inputs/ChecklistInput.svelte +11 -6
- package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +2 -1
- 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 +18 -6
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/FileInput.svelte +71 -75
- package/dist/components/preview/inputs/GeometryInput.svelte +128 -0
- package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +21 -0
- package/dist/components/preview/inputs/NumberInput.svelte +8 -8
- package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte +45 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/TextInput.svelte +5 -5
- package/dist/components/preview/inputs/TileInput.svelte +83 -0
- package/dist/components/preview/inputs/TileInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/index.d.ts +3 -0
- package/dist/components/preview/inputs/index.js +3 -0
- package/dist/components/primitives/CalculateButton.svelte +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 +245 -19
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +15 -0
- 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 +9 -7
- package/dist/components/primitives/button/button.svelte.d.ts +19 -16
- 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 +11 -3
- package/dist/components/primitives/toggle/toggle.svelte.d.ts +13 -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 +135 -185
- 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 +11 -7
- package/dist/compute/solving.svelte.js +64 -45
- package/dist/constants.d.ts +6 -8
- package/dist/constants.js +8 -11
- package/dist/contexts/hostContext.svelte.d.ts +39 -0
- package/dist/contexts/hostContext.svelte.js +9 -0
- 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 +50 -0
- package/dist/i18n/messages.js +84 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/public.d.ts +1 -0
- package/dist/public.js +1 -0
- package/dist/schema/host-support.d.ts +29 -0
- package/dist/schema/host-support.js +97 -0
- package/dist/schema/option-display.d.ts +12 -0
- package/dist/schema/option-display.js +29 -0
- package/dist/schema/param-exporter.d.ts +4 -1
- package/dist/schema/param-exporter.js +10 -6
- package/dist/schema/visibility-rules.d.ts +7 -1
- package/dist/schema/visibility-rules.js +17 -0
- package/dist/styles/base.css +94 -84
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/dist/utils/file-download.js +6 -10
- package/dist/utils/host-files.d.ts +12 -0
- package/dist/utils/host-files.js +46 -0
- package/dist/utils/webp-to-png.d.ts +10 -0
- package/dist/utils/webp-to-png.js +41 -0
- package/package.json +31 -23
- package/src/lib/components/ErrorScreen.svelte +1 -1
- package/src/lib/components/compute/AppLayout.svelte +96 -38
- 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 +9 -21
- package/src/lib/components/compute/SolveMessages.svelte +103 -89
- 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 +8 -6
- package/src/lib/components/layout/PageHeader.svelte +3 -3
- package/src/lib/components/layout/SideNav.svelte +56 -15
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +158 -62
- package/src/lib/components/preview/Group.svelte +14 -9
- package/src/lib/components/preview/HelpButton.svelte +1 -1
- package/src/lib/components/preview/ImageOutput.svelte +16 -11
- package/src/lib/components/preview/InputControl.svelte +115 -50
- 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 +65 -33
- package/src/lib/components/preview/TabLayout.svelte +29 -8
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +11 -6
- package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
- package/src/lib/components/preview/inputs/DropdownInput.svelte +18 -6
- package/src/lib/components/preview/inputs/FileInput.svelte +71 -75
- package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +8 -8
- package/src/lib/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/src/lib/components/preview/inputs/SegmentedInput.svelte +45 -0
- package/src/lib/components/preview/inputs/TextInput.svelte +5 -5
- package/src/lib/components/preview/inputs/TileInput.svelte +83 -0
- package/src/lib/components/preview/inputs/index.ts +3 -0
- 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 +245 -19
- 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 +9 -7
- 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 +12 -4
- 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 +136 -186
- 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 +66 -50
- package/src/lib/constants.ts +8 -11
- package/src/lib/contexts/hostContext.svelte.ts +51 -0
- package/src/lib/features/chart/plotly-compat.ts +141 -0
- package/src/lib/i18n/messages.ts +139 -0
- package/src/lib/index.ts +22 -0
- package/src/lib/public.ts +1 -0
- package/src/lib/schema/host-support.ts +129 -0
- package/src/lib/schema/option-display.ts +44 -0
- package/src/lib/schema/param-exporter.ts +10 -7
- package/src/lib/schema/visibility-rules.ts +27 -1
- package/src/lib/styles/base.css +94 -84
- package/src/lib/utils/color-space.ts +107 -0
- package/src/lib/utils/file-download.ts +7 -11
- package/src/lib/utils/host-files.ts +61 -0
- package/src/lib/utils/webp-to-png.ts +48 -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
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
variants: {
|
|
9
9
|
tone: {
|
|
10
10
|
info: 'border-info/40 bg-info/10',
|
|
11
|
-
tip: 'border-border bg-muted
|
|
11
|
+
tip: 'border-border bg-muted',
|
|
12
12
|
success: 'border-success/40 bg-success/10',
|
|
13
13
|
warning: 'border-warning/40 bg-warning/10',
|
|
14
14
|
danger: 'border-destructive/40 bg-destructive/10'
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
title?: string;
|
|
39
39
|
/** Replaces the tone's default icon. `null` drops the icon entirely. */
|
|
40
40
|
icon?: Component | null;
|
|
41
|
-
children
|
|
41
|
+
children?: Snippet;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
let { tone = 'info', title, icon, class: className, children, ...restProps }: Props = $props();
|
|
@@ -55,12 +55,14 @@
|
|
|
55
55
|
{#if Icon}
|
|
56
56
|
<Icon class={cn('mt-0.5 h-4 w-4 shrink-0', accent)} />
|
|
57
57
|
{/if}
|
|
58
|
-
<div class="min-w-0 space-y-1">
|
|
58
|
+
<div class="min-w-0 space-y-1 wrap-anywhere">
|
|
59
59
|
{#if title}
|
|
60
60
|
<p class={cn('leading-tight font-medium', accent)}>{title}</p>
|
|
61
61
|
{/if}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
{#if children}
|
|
63
|
+
<div class="leading-relaxed text-muted-foreground [&_a]:underline [&_strong]:text-foreground">
|
|
64
|
+
{@render children()}
|
|
65
|
+
</div>
|
|
66
|
+
{/if}
|
|
65
67
|
</div>
|
|
66
68
|
</div>
|
|
@@ -3,7 +3,7 @@ import type { Component } from 'svelte';
|
|
|
3
3
|
export declare const calloutVariants: import("tailwind-variants").TVReturnType<{
|
|
4
4
|
tone: {
|
|
5
5
|
info: "border-info/40 bg-info/10";
|
|
6
|
-
tip: "border-border bg-muted
|
|
6
|
+
tip: "border-border bg-muted";
|
|
7
7
|
success: "border-success/40 bg-success/10";
|
|
8
8
|
warning: "border-warning/40 bg-warning/10";
|
|
9
9
|
danger: "border-destructive/40 bg-destructive/10";
|
|
@@ -11,7 +11,7 @@ export declare const calloutVariants: import("tailwind-variants").TVReturnType<{
|
|
|
11
11
|
}, undefined, "flex items-start gap-2.5 rounded-lg border px-3.5 py-3 text-sm", {
|
|
12
12
|
tone: {
|
|
13
13
|
info: "border-info/40 bg-info/10";
|
|
14
|
-
tip: "border-border bg-muted
|
|
14
|
+
tip: "border-border bg-muted";
|
|
15
15
|
success: "border-success/40 bg-success/10";
|
|
16
16
|
warning: "border-warning/40 bg-warning/10";
|
|
17
17
|
danger: "border-destructive/40 bg-destructive/10";
|
|
@@ -19,7 +19,7 @@ export declare const calloutVariants: import("tailwind-variants").TVReturnType<{
|
|
|
19
19
|
}, undefined, import("tailwind-variants").TVReturnTypeLike<{
|
|
20
20
|
tone: {
|
|
21
21
|
info: "border-info/40 bg-info/10";
|
|
22
|
-
tip: "border-border bg-muted
|
|
22
|
+
tip: "border-border bg-muted";
|
|
23
23
|
success: "border-success/40 bg-success/10";
|
|
24
24
|
warning: "border-warning/40 bg-warning/10";
|
|
25
25
|
danger: "border-destructive/40 bg-destructive/10";
|
|
@@ -33,7 +33,7 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
|
|
|
33
33
|
title?: string;
|
|
34
34
|
/** Replaces the tone's default icon. `null` drops the icon entirely. */
|
|
35
35
|
icon?: Component | null;
|
|
36
|
-
children
|
|
36
|
+
children?: Snippet;
|
|
37
37
|
}
|
|
38
38
|
declare const Callout: Component<Props, {}, "">;
|
|
39
39
|
type Callout = ReturnType<typeof Callout>;
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
style:--table-cols-sm={mobileTemplate}
|
|
42
42
|
>
|
|
43
43
|
<div
|
|
44
|
-
class="data-table-row gap-4 px-4 py-2 text-xs font-medium tracking-wide sm:grid-cols-(--table-cols) grid grid-cols-(--table-cols-sm) bg-muted
|
|
44
|
+
class="data-table-row gap-4 px-4 py-2 text-xs font-medium tracking-wide sm:grid-cols-(--table-cols) grid grid-cols-(--table-cols-sm) bg-muted text-muted-foreground uppercase {hiddenCols}"
|
|
45
45
|
>
|
|
46
46
|
{#each columns as col (col.label)}
|
|
47
47
|
<span class={col.align === 'right' ? 'text-right' : ''}>{col.label}</span>
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
label: string;
|
|
12
12
|
icon?: Component;
|
|
13
13
|
iconClass?: string;
|
|
14
|
+
disabled?: boolean;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
interface Props {
|
|
@@ -24,6 +25,10 @@
|
|
|
24
25
|
/** Above this many items the list gets a filter box. */
|
|
25
26
|
searchThreshold?: number;
|
|
26
27
|
disabled?: boolean;
|
|
28
|
+
/** Submits the picked id with a plain <form>, like a native select's name. */
|
|
29
|
+
name?: string;
|
|
30
|
+
size?: 'default' | 'sm';
|
|
31
|
+
'aria-label'?: string;
|
|
27
32
|
class?: string;
|
|
28
33
|
}
|
|
29
34
|
|
|
@@ -37,6 +42,9 @@
|
|
|
37
42
|
searchPlaceholder = 'Filter...',
|
|
38
43
|
searchThreshold = 4,
|
|
39
44
|
disabled = false,
|
|
45
|
+
name,
|
|
46
|
+
size = 'default',
|
|
47
|
+
'aria-label': ariaLabel,
|
|
40
48
|
class: className
|
|
41
49
|
}: Props = $props();
|
|
42
50
|
|
|
@@ -51,14 +59,17 @@
|
|
|
51
59
|
}
|
|
52
60
|
</script>
|
|
53
61
|
|
|
62
|
+
{#if name}<input type="hidden" {name} value={value ?? ''} />{/if}
|
|
63
|
+
|
|
54
64
|
<Popover.Root bind:open>
|
|
55
65
|
<Popover.Trigger
|
|
56
66
|
{id}
|
|
57
67
|
{disabled}
|
|
58
68
|
role="combobox"
|
|
59
69
|
aria-expanded={open}
|
|
70
|
+
aria-label={ariaLabel}
|
|
60
71
|
class={cn(
|
|
61
|
-
buttonVariants({ variant: 'outline' }),
|
|
72
|
+
buttonVariants({ variant: 'outline', size }),
|
|
62
73
|
'font-normal w-full justify-start',
|
|
63
74
|
className
|
|
64
75
|
)}
|
|
@@ -85,6 +96,7 @@
|
|
|
85
96
|
value={item.id}
|
|
86
97
|
keywords={[item.label]}
|
|
87
98
|
data-checked={item.id === value}
|
|
99
|
+
disabled={item.disabled}
|
|
88
100
|
onSelect={() => pick(item)}
|
|
89
101
|
>
|
|
90
102
|
{#if ItemIcon}
|
|
@@ -4,6 +4,7 @@ export interface FilterableDropdownItem {
|
|
|
4
4
|
label: string;
|
|
5
5
|
icon?: Component;
|
|
6
6
|
iconClass?: string;
|
|
7
|
+
disabled?: boolean;
|
|
7
8
|
}
|
|
8
9
|
interface Props {
|
|
9
10
|
items: FilterableDropdownItem[];
|
|
@@ -16,6 +17,10 @@ interface Props {
|
|
|
16
17
|
/** Above this many items the list gets a filter box. */
|
|
17
18
|
searchThreshold?: number;
|
|
18
19
|
disabled?: boolean;
|
|
20
|
+
/** Submits the picked id with a plain <form>, like a native select's name. */
|
|
21
|
+
name?: string;
|
|
22
|
+
size?: 'default' | 'sm';
|
|
23
|
+
'aria-label'?: string;
|
|
19
24
|
class?: string;
|
|
20
25
|
}
|
|
21
26
|
declare const FilterableDropdown: Component<Props, {}, "">;
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
accept="image/*"
|
|
61
61
|
{disabled}
|
|
62
62
|
onchange={onFileSelected}
|
|
63
|
-
class="h-10 px-3 py-2 text-sm file:text-sm file:font-medium flex flex-1 rounded-md border border-input bg-
|
|
63
|
+
class="h-10 px-3 py-2 text-sm file:text-sm file:font-medium flex flex-1 rounded-md border border-input bg-field file:border-0 file:bg-transparent focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:opacity-50"
|
|
64
64
|
/>
|
|
65
65
|
<Button
|
|
66
66
|
size="sm"
|
|
@@ -1,35 +1,261 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { untrack } from 'svelte';
|
|
3
|
+
import { fade } from 'svelte/transition';
|
|
4
|
+
import { Check, LoaderCircle } from '@lucide/svelte';
|
|
5
|
+
import { EMPTY_LIVE_SOLVE, type LiveSolveState } from '@selvajs/solve/client';
|
|
6
|
+
import { Button } from './button/index.js';
|
|
7
|
+
import { createLiveProgress } from '../../compute/liveProgress.svelte.js';
|
|
2
8
|
import { getLocaleContext } from '../../i18n/localeContext.svelte';
|
|
3
9
|
|
|
10
|
+
// The solve status in a panel's action row. It grows only as far as the solve needs: a quiet
|
|
11
|
+
// "up to date" row, a pill once a solve is visible, a card with progress and Abort once it is
|
|
12
|
+
// slow. It grows upward over the fields, so the footer never changes height.
|
|
4
13
|
interface Props {
|
|
14
|
+
/** The raw flag: times the solve, and acknowledges one too short to show. */
|
|
15
|
+
isSolving: boolean;
|
|
16
|
+
/** `createSolvingIndicator(...).show`. */
|
|
5
17
|
show: boolean;
|
|
18
|
+
/** `createSolvingIndicator(...).slow`. */
|
|
19
|
+
slow?: boolean;
|
|
20
|
+
/** Live progress for the card. Without it the card's bar is indeterminate. */
|
|
21
|
+
live?: LiveSolveState;
|
|
22
|
+
/** Without it the card has no Abort button; Esc still works where the host handles it. */
|
|
23
|
+
onabort?: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* The page can't repaint mid-solve (see `createSolvingIndicator`): the pill says Esc aborts
|
|
26
|
+
* instead of counting seconds, and never grows into the card.
|
|
27
|
+
*/
|
|
28
|
+
freezesDuringSolve?: boolean;
|
|
6
29
|
}
|
|
7
30
|
|
|
8
|
-
let {
|
|
31
|
+
let {
|
|
32
|
+
isSolving,
|
|
33
|
+
show,
|
|
34
|
+
slow = false,
|
|
35
|
+
live,
|
|
36
|
+
onabort,
|
|
37
|
+
freezesDuringSolve = false
|
|
38
|
+
}: Props = $props();
|
|
9
39
|
|
|
10
40
|
const locale = getLocaleContext();
|
|
11
41
|
const t = $derived(locale.messages);
|
|
42
|
+
|
|
43
|
+
const DONE_VISIBLE_MS = 1400;
|
|
44
|
+
// A drag fires a solve per step; one acknowledgement per this many ms is enough.
|
|
45
|
+
const PING_EVERY_MS = 500;
|
|
46
|
+
|
|
47
|
+
const progress = createLiveProgress(() => live ?? EMPTY_LIVE_SOLVE);
|
|
48
|
+
const head = $derived(progress.headline ?? progress.progress[0]);
|
|
49
|
+
const bar = $derived(
|
|
50
|
+
head?.fraction === undefined
|
|
51
|
+
? undefined
|
|
52
|
+
: (progress.bars[head.source ?? ''] ?? { width: head.fraction, ms: 150 })
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
let startedAt = 0;
|
|
56
|
+
let elapsed = $state(0);
|
|
57
|
+
let finished = $state<{ ms: number; aborted: boolean } | null>(null);
|
|
58
|
+
let ping = $state(0);
|
|
59
|
+
let lastPingAt = 0;
|
|
60
|
+
// Not `show` itself at the solve's end: the host's indicator may already have dropped it.
|
|
61
|
+
let shownThisSolve = false;
|
|
62
|
+
|
|
63
|
+
$effect(() => {
|
|
64
|
+
if (show) shownThisSolve = true;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
$effect(() => {
|
|
68
|
+
const solving = isSolving;
|
|
69
|
+
untrack(() => {
|
|
70
|
+
if (solving) {
|
|
71
|
+
startedAt = performance.now();
|
|
72
|
+
shownThisSolve = show;
|
|
73
|
+
elapsed = 0;
|
|
74
|
+
finished = null;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!startedAt) return;
|
|
78
|
+
const ms = performance.now() - startedAt;
|
|
79
|
+
startedAt = 0;
|
|
80
|
+
if (shownThisSolve) {
|
|
81
|
+
finished = { ms, aborted: live?.ended?.kind === 'aborted' };
|
|
82
|
+
} else if (performance.now() - lastPingAt > PING_EVERY_MS) {
|
|
83
|
+
lastPingAt = performance.now();
|
|
84
|
+
ping++;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
$effect(() => {
|
|
90
|
+
if (!finished) return;
|
|
91
|
+
const timer = setTimeout(() => (finished = null), DONE_VISIBLE_MS);
|
|
92
|
+
return () => clearTimeout(timer);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
$effect(() => {
|
|
96
|
+
if (!isSolving || !show || freezesDuringSolve) return;
|
|
97
|
+
const tick = () => (elapsed = performance.now() - startedAt);
|
|
98
|
+
tick();
|
|
99
|
+
const id = setInterval(tick, 100);
|
|
100
|
+
return () => clearInterval(id);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Done wins over a held `show`: the indicator outlives the solve by up to its minimum time,
|
|
104
|
+
// and saying "Solving" over a result that has already landed would be wrong.
|
|
105
|
+
const mode = $derived<'idle' | 'work' | 'card' | 'done'>(
|
|
106
|
+
finished ? 'done' : show ? (slow && !freezesDuringSolve ? 'card' : 'work') : 'idle'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const seconds = $derived(
|
|
110
|
+
new Intl.NumberFormat(locale.locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 })
|
|
111
|
+
);
|
|
112
|
+
const fmt = (ms: number) => `${seconds.format(ms / 1000)} s`;
|
|
113
|
+
|
|
114
|
+
const announcement = $derived(
|
|
115
|
+
mode === 'work' || mode === 'card'
|
|
116
|
+
? t.solvingEllipsis
|
|
117
|
+
: mode === 'done'
|
|
118
|
+
? finished?.aborted
|
|
119
|
+
? t.solveStopped
|
|
120
|
+
: t.solveDone
|
|
121
|
+
: ''
|
|
122
|
+
);
|
|
12
123
|
</script>
|
|
13
124
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
125
|
+
<div class="h-10 min-w-0 relative flex-1">
|
|
126
|
+
<!-- The live region stays mounted: a screen reader only announces text that changes inside a
|
|
127
|
+
region it already knows about, so one created together with its text says nothing. -->
|
|
128
|
+
<div role="status" aria-live="polite" aria-atomic="true" class="sr-only">{announcement}</div>
|
|
129
|
+
|
|
130
|
+
<div
|
|
131
|
+
class="inset-x-0 bottom-0 backdrop-blur-md ease-out absolute z-10 overflow-hidden border border-border-strong transition-all duration-300 motion-reduce:transition-none {mode ===
|
|
132
|
+
'card'
|
|
133
|
+
? 'h-24 shadow-md rounded-lg bg-card/75'
|
|
134
|
+
: mode === 'idle'
|
|
135
|
+
? 'h-10 shadow-sm rounded-md bg-card/90'
|
|
136
|
+
: 'h-10 shadow-md rounded-md bg-card/75'}"
|
|
137
|
+
data-testid="solve-status"
|
|
138
|
+
data-state={mode}
|
|
139
|
+
>
|
|
140
|
+
{#if mode === 'card'}
|
|
141
|
+
<div
|
|
142
|
+
class="px-3 gap-2 flex h-full flex-col justify-center"
|
|
143
|
+
in:fade={{ duration: 150, delay: 80 }}
|
|
144
|
+
>
|
|
145
|
+
<div class="gap-2 min-w-0 flex items-center">
|
|
146
|
+
<LoaderCircle
|
|
147
|
+
class="size-4 animate-spin shrink-0 text-muted-foreground"
|
|
148
|
+
aria-hidden="true"
|
|
149
|
+
/>
|
|
150
|
+
<span class="text-sm font-medium min-w-0 flex-1 truncate">{head?.label ?? t.solving}</span
|
|
151
|
+
>
|
|
152
|
+
{#if head?.done !== undefined && head?.total !== undefined}
|
|
153
|
+
<span class="text-xs shrink-0 text-muted-foreground tabular-nums">
|
|
154
|
+
{head.done} / {head.total}
|
|
155
|
+
</span>
|
|
156
|
+
{/if}
|
|
157
|
+
</div>
|
|
25
158
|
<div
|
|
26
|
-
class="h-
|
|
27
|
-
|
|
159
|
+
class="h-1 overflow-hidden rounded-full bg-muted"
|
|
160
|
+
role="progressbar"
|
|
161
|
+
aria-label={head?.label ?? t.solving}
|
|
162
|
+
aria-valuemin={0}
|
|
163
|
+
aria-valuemax={100}
|
|
164
|
+
aria-valuenow={bar ? Math.round(bar.width * 100) : undefined}
|
|
165
|
+
>
|
|
166
|
+
{#if bar}
|
|
167
|
+
<div
|
|
168
|
+
class="h-full w-(--bar-width) rounded-full bg-primary transition-all duration-(--bar-ms) ease-linear"
|
|
169
|
+
style:--bar-width="{bar.width * 100}%"
|
|
170
|
+
style:--bar-ms="{bar.ms}ms"
|
|
171
|
+
></div>
|
|
172
|
+
{:else}
|
|
173
|
+
<div class="animate-pulse h-full w-1/3 rounded-full bg-primary/60"></div>
|
|
174
|
+
{/if}
|
|
175
|
+
</div>
|
|
176
|
+
<div class="gap-2 flex items-center">
|
|
177
|
+
<span class="text-xs text-muted-foreground tabular-nums">{fmt(elapsed)}</span>
|
|
178
|
+
{#if onabort}
|
|
179
|
+
<Button
|
|
180
|
+
variant="outline"
|
|
181
|
+
size="xs"
|
|
182
|
+
class="ml-auto shrink-0"
|
|
183
|
+
onclick={onabort}
|
|
184
|
+
aria-keyshortcuts="Escape"
|
|
185
|
+
title={t.solveMessagesEscHint}
|
|
186
|
+
>
|
|
187
|
+
{t.solveMessagesAbort}
|
|
188
|
+
<kbd
|
|
189
|
+
class="px-1 rounded-sm border border-border font-sans text-2xs text-muted-foreground"
|
|
190
|
+
>
|
|
191
|
+
Esc
|
|
192
|
+
</kbd>
|
|
193
|
+
</Button>
|
|
194
|
+
{/if}
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
{:else if mode === 'work'}
|
|
198
|
+
<div class="px-3 gap-2 flex h-full items-center" in:fade={{ duration: 150, delay: 80 }}>
|
|
199
|
+
<LoaderCircle
|
|
200
|
+
class="size-4 animate-spin shrink-0 text-muted-foreground"
|
|
201
|
+
aria-hidden="true"
|
|
202
|
+
/>
|
|
203
|
+
{#if freezesDuringSolve}
|
|
204
|
+
<span class="text-sm font-medium shrink-0">{t.solvingEllipsis}</span>
|
|
205
|
+
<span class="text-xs min-w-0 truncate text-muted-foreground" data-testid="solve-esc-hint">
|
|
206
|
+
{t.solveMessagesEscHint}
|
|
207
|
+
</span>
|
|
208
|
+
{:else}
|
|
209
|
+
<span class="text-sm font-medium shrink-0">{t.solving}</span>
|
|
210
|
+
<span class="text-xs text-muted-foreground tabular-nums">{fmt(elapsed)}</span>
|
|
211
|
+
{/if}
|
|
28
212
|
</div>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
213
|
+
{:else if mode === 'done' && finished}
|
|
214
|
+
<div class="px-3 gap-2 flex h-full items-center" in:fade={{ duration: 150, delay: 80 }}>
|
|
215
|
+
{#if finished.aborted}
|
|
216
|
+
<span class="text-sm font-medium min-w-0 truncate">{t.solveStopped}</span>
|
|
217
|
+
{:else}
|
|
218
|
+
<Check class="size-4 shrink-0 text-success" aria-hidden="true" />
|
|
219
|
+
<span class="text-sm font-medium shrink-0">{t.solveDone}</span>
|
|
220
|
+
<span class="text-xs text-muted-foreground tabular-nums">{fmt(finished.ms)}</span>
|
|
221
|
+
{/if}
|
|
32
222
|
</div>
|
|
33
|
-
|
|
34
|
-
|
|
223
|
+
{:else}
|
|
224
|
+
<div class="px-3 gap-2 flex h-full items-center" in:fade={{ duration: 150 }}>
|
|
225
|
+
<span class="size-1.5 relative shrink-0 rounded-full bg-success">
|
|
226
|
+
{#key ping}
|
|
227
|
+
{#if ping > 0}
|
|
228
|
+
<span class="solve-ping inset-0 absolute rounded-full border-2 border-success"></span>
|
|
229
|
+
{/if}
|
|
230
|
+
{/key}
|
|
231
|
+
</span>
|
|
232
|
+
<span class="text-sm min-w-0 truncate text-muted-foreground">{t.upToDate}</span>
|
|
233
|
+
</div>
|
|
234
|
+
{/if}
|
|
235
|
+
</div>
|
|
35
236
|
</div>
|
|
237
|
+
|
|
238
|
+
<style>
|
|
239
|
+
/* One ring that grows and fades: the result landed faster than an indicator could show. */
|
|
240
|
+
.solve-ping {
|
|
241
|
+
animation: solve-ping 0.6s ease-out forwards;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
@keyframes solve-ping {
|
|
245
|
+
from {
|
|
246
|
+
transform: scale(1);
|
|
247
|
+
opacity: 0.9;
|
|
248
|
+
}
|
|
249
|
+
to {
|
|
250
|
+
transform: scale(3.2);
|
|
251
|
+
opacity: 0;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@media (prefers-reduced-motion: reduce) {
|
|
256
|
+
.solve-ping {
|
|
257
|
+
animation: none;
|
|
258
|
+
opacity: 0;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
</style>
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
import { type LiveSolveState } from '@selvajs/solve/client';
|
|
1
2
|
interface Props {
|
|
3
|
+
/** The raw flag: times the solve, and acknowledges one too short to show. */
|
|
4
|
+
isSolving: boolean;
|
|
5
|
+
/** `createSolvingIndicator(...).show`. */
|
|
2
6
|
show: boolean;
|
|
7
|
+
/** `createSolvingIndicator(...).slow`. */
|
|
8
|
+
slow?: boolean;
|
|
9
|
+
/** Live progress for the card. Without it the card's bar is indeterminate. */
|
|
10
|
+
live?: LiveSolveState;
|
|
11
|
+
/** Without it the card has no Abort button; Esc still works where the host handles it. */
|
|
12
|
+
onabort?: () => void;
|
|
13
|
+
/**
|
|
14
|
+
* The page can't repaint mid-solve (see `createSolvingIndicator`): the pill says Esc aborts
|
|
15
|
+
* instead of counting seconds, and never grows into the card.
|
|
16
|
+
*/
|
|
17
|
+
freezesDuringSolve?: boolean;
|
|
3
18
|
}
|
|
4
19
|
declare const SolvingIndicator: import("svelte").Component<Props, {}, "">;
|
|
5
20
|
type SolvingIndicator = ReturnType<typeof SolvingIndicator>;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
bind:ref
|
|
20
20
|
data-slot="alert-dialog-content"
|
|
21
21
|
class={cn(
|
|
22
|
-
'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 gap-4 p-6
|
|
22
|
+
'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 gap-4 p-6 sm:max-w-lg fixed start-1/2 top-1/2 z-50 grid max-h-dialog w-screen-inset -translate-x-1/2 -translate-y-1/2 overflow-y-auto rounded-xl border bg-raised shadow-popover duration-200',
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
{...restProps}
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
variant: {
|
|
8
8
|
default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent',
|
|
9
9
|
secondary:
|
|
10
|
-
'bg-secondary text-secondary-foreground [a&]:hover:bg-
|
|
10
|
+
'bg-secondary text-secondary-foreground [a&]:hover:bg-selected border-transparent',
|
|
11
11
|
destructive:
|
|
12
12
|
'bg-destructive [a&]:hover:bg-destructive/90 dark:bg-destructive/70 border-transparent text-destructive-foreground',
|
|
13
|
-
outline: 'text-foreground [a&]:hover:bg-
|
|
13
|
+
outline: 'text-foreground [a&]:hover:bg-hover [a&]:hover:text-foreground'
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
defaultVariants: {
|
|
@@ -2,23 +2,23 @@ import { type VariantProps } from 'tailwind-variants';
|
|
|
2
2
|
export declare const badgeVariants: import("tailwind-variants").TVReturnType<{
|
|
3
3
|
variant: {
|
|
4
4
|
default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent";
|
|
5
|
-
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-
|
|
5
|
+
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-selected border-transparent";
|
|
6
6
|
destructive: "bg-destructive [a&]:hover:bg-destructive/90 dark:bg-destructive/70 border-transparent text-destructive-foreground";
|
|
7
|
-
outline: "text-foreground [a&]:hover:bg-
|
|
7
|
+
outline: "text-foreground [a&]:hover:bg-hover [a&]:hover:text-foreground";
|
|
8
8
|
};
|
|
9
9
|
}, undefined, "focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition focus-visible:ring-3 [&>svg]:pointer-events-none [&>svg]:size-3", {
|
|
10
10
|
variant: {
|
|
11
11
|
default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent";
|
|
12
|
-
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-
|
|
12
|
+
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-selected border-transparent";
|
|
13
13
|
destructive: "bg-destructive [a&]:hover:bg-destructive/90 dark:bg-destructive/70 border-transparent text-destructive-foreground";
|
|
14
|
-
outline: "text-foreground [a&]:hover:bg-
|
|
14
|
+
outline: "text-foreground [a&]:hover:bg-hover [a&]:hover:text-foreground";
|
|
15
15
|
};
|
|
16
16
|
}, undefined, import("tailwind-variants").TVReturnTypeLike<{
|
|
17
17
|
variant: {
|
|
18
18
|
default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent";
|
|
19
|
-
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-
|
|
19
|
+
secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-selected border-transparent";
|
|
20
20
|
destructive: "bg-destructive [a&]:hover:bg-destructive/90 dark:bg-destructive/70 border-transparent text-destructive-foreground";
|
|
21
|
-
outline: "text-foreground [a&]:hover:bg-
|
|
21
|
+
outline: "text-foreground [a&]:hover:bg-hover [a&]:hover:text-foreground";
|
|
22
22
|
};
|
|
23
23
|
}, undefined>>;
|
|
24
24
|
export type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
-
import { cn, type WithElementRef } from '../../../utils';
|
|
2
|
+
import { cn, type WithElementRef } from '../../../utils.js';
|
|
3
3
|
import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
|
|
4
4
|
import { type VariantProps, tv } from 'tailwind-variants';
|
|
5
5
|
|
|
@@ -8,14 +8,16 @@
|
|
|
8
8
|
variants: {
|
|
9
9
|
variant: {
|
|
10
10
|
default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',
|
|
11
|
-
destructive:
|
|
12
|
-
'bg-destructive shadow-xs hover:bg-destructive/90 dark:bg-destructive/60 text-destructive-foreground',
|
|
11
|
+
destructive: 'bg-destructive shadow-xs hover:bg-destructive/90 text-destructive-foreground',
|
|
13
12
|
outline:
|
|
14
|
-
'bg-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
'border border-border-strong bg-transparent shadow-xs hover:bg-hover hover:text-foreground',
|
|
14
|
+
// Outline with an opaque dark fill: the translucent one washes out over the light 3D canvas.
|
|
15
|
+
overlay:
|
|
16
|
+
'border border-border-strong bg-raised shadow-raised hover:bg-muted hover:text-foreground',
|
|
17
|
+
secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-selected',
|
|
18
|
+
ghost: 'hover:bg-hover hover:text-foreground',
|
|
17
19
|
dashed:
|
|
18
|
-
'border border-dashed border-
|
|
20
|
+
'border border-dashed border-border-strong bg-transparent text-muted-foreground hover:border-input hover:bg-hover hover:text-foreground',
|
|
19
21
|
link: 'text-primary underline-offset-4 hover:underline'
|
|
20
22
|
},
|
|
21
23
|
size: {
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { type WithElementRef } from '../../../utils';
|
|
1
|
+
import { type WithElementRef } from '../../../utils.js';
|
|
2
2
|
import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
|
|
3
3
|
import { type VariantProps } from 'tailwind-variants';
|
|
4
4
|
export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
5
5
|
variant: {
|
|
6
6
|
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90";
|
|
7
|
-
destructive: "bg-destructive shadow-xs hover:bg-destructive/90
|
|
8
|
-
outline: "bg-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
destructive: "bg-destructive shadow-xs hover:bg-destructive/90 text-destructive-foreground";
|
|
8
|
+
outline: "border border-border-strong bg-transparent shadow-xs hover:bg-hover hover:text-foreground";
|
|
9
|
+
overlay: "border border-border-strong bg-raised shadow-raised hover:bg-muted hover:text-foreground";
|
|
10
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-selected";
|
|
11
|
+
ghost: "hover:bg-hover hover:text-foreground";
|
|
12
|
+
dashed: "border border-dashed border-border-strong bg-transparent text-muted-foreground hover:border-input hover:bg-hover hover:text-foreground";
|
|
12
13
|
link: "text-primary underline-offset-4 hover:underline";
|
|
13
14
|
};
|
|
14
15
|
size: {
|
|
@@ -23,11 +24,12 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
|
23
24
|
}, undefined, "focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
|
|
24
25
|
variant: {
|
|
25
26
|
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90";
|
|
26
|
-
destructive: "bg-destructive shadow-xs hover:bg-destructive/90
|
|
27
|
-
outline: "bg-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
destructive: "bg-destructive shadow-xs hover:bg-destructive/90 text-destructive-foreground";
|
|
28
|
+
outline: "border border-border-strong bg-transparent shadow-xs hover:bg-hover hover:text-foreground";
|
|
29
|
+
overlay: "border border-border-strong bg-raised shadow-raised hover:bg-muted hover:text-foreground";
|
|
30
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-selected";
|
|
31
|
+
ghost: "hover:bg-hover hover:text-foreground";
|
|
32
|
+
dashed: "border border-dashed border-border-strong bg-transparent text-muted-foreground hover:border-input hover:bg-hover hover:text-foreground";
|
|
31
33
|
link: "text-primary underline-offset-4 hover:underline";
|
|
32
34
|
};
|
|
33
35
|
size: {
|
|
@@ -42,11 +44,12 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
|
|
|
42
44
|
}, undefined, import("tailwind-variants").TVReturnTypeLike<{
|
|
43
45
|
variant: {
|
|
44
46
|
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90";
|
|
45
|
-
destructive: "bg-destructive shadow-xs hover:bg-destructive/90
|
|
46
|
-
outline: "bg-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
destructive: "bg-destructive shadow-xs hover:bg-destructive/90 text-destructive-foreground";
|
|
48
|
+
outline: "border border-border-strong bg-transparent shadow-xs hover:bg-hover hover:text-foreground";
|
|
49
|
+
overlay: "border border-border-strong bg-raised shadow-raised hover:bg-muted hover:text-foreground";
|
|
50
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-selected";
|
|
51
|
+
ghost: "hover:bg-hover hover:text-foreground";
|
|
52
|
+
dashed: "border border-dashed border-border-strong bg-transparent text-muted-foreground hover:border-input hover:bg-hover hover:text-foreground";
|
|
50
53
|
link: "text-primary underline-offset-4 hover:underline";
|
|
51
54
|
};
|
|
52
55
|
size: {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { tv, type VariantProps } from 'tailwind-variants';
|
|
3
3
|
|
|
4
4
|
export const cardVariants = tv({
|
|
5
|
-
base: 'shadow-
|
|
5
|
+
base: 'shadow-raised flex flex-col rounded-xl border bg-card text-card-foreground',
|
|
6
6
|
variants: {
|
|
7
7
|
variant: {
|
|
8
8
|
default: 'gap-6 py-6',
|
|
@@ -5,7 +5,7 @@ export declare const cardVariants: import("tailwind-variants").TVReturnType<{
|
|
|
5
5
|
/** No padding or gap: for a card whose children draw their own edges, like a tab panel. */
|
|
6
6
|
flush: "gap-0 overflow-hidden";
|
|
7
7
|
};
|
|
8
|
-
}, undefined, "shadow-
|
|
8
|
+
}, undefined, "shadow-raised flex flex-col rounded-xl border bg-card text-card-foreground", {
|
|
9
9
|
variant: {
|
|
10
10
|
default: "gap-6 py-6";
|
|
11
11
|
/** No padding or gap: for a card whose children draw their own edges, like a tab panel. */
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
bind:ref
|
|
18
18
|
data-slot="checkbox"
|
|
19
19
|
class={cn(
|
|
20
|
-
'peer size-4 shadow-xs flex shrink-0 items-center justify-center rounded-sm border border-input transition-shadow outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:
|
|
20
|
+
'peer size-4 shadow-xs flex shrink-0 items-center justify-center rounded-sm border border-input bg-field transition-shadow outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary',
|
|
21
21
|
className
|
|
22
22
|
)}
|
|
23
23
|
bind:checked
|