@selvajs/ui 6.6.0-beta.2 → 6.6.0-beta.20
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 +7 -3
- package/dist/components/compute/AppLayout.svelte +307 -123
- package/dist/components/compute/AppLayout.svelte.d.ts +28 -0
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +46 -22
- package/dist/components/compute/ComputeApp.svelte.d.ts +20 -3
- package/dist/components/compute/ComputeMessagesDialog.svelte +31 -41
- package/dist/components/compute/ParameterPresetManager.svelte +16 -65
- package/dist/components/compute/ParameterPresetManager.svelte.d.ts +4 -5
- package/dist/components/compute/SolveMessages.svelte +128 -121
- package/dist/components/compute/SolveMessages.svelte.d.ts +12 -12
- package/dist/components/layout/AppShell.svelte +10 -6
- 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 +26 -14
- package/dist/components/layout/PageHeader.svelte +14 -10
- package/dist/components/layout/SectionHeader.svelte +4 -2
- package/dist/components/layout/SideNav.svelte +57 -8
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +131 -65
- package/dist/components/preview/Group.svelte +42 -22
- package/dist/components/preview/HelpButton.svelte +5 -3
- package/dist/components/preview/ImageOutput.svelte +435 -71
- package/dist/components/preview/InputControl.svelte +125 -51
- package/dist/components/preview/InputControl.svelte.d.ts +5 -1
- package/dist/components/preview/OutputDisplay.svelte +42 -28
- package/dist/components/preview/TabBar.svelte +8 -6
- package/dist/components/preview/TabBar.svelte.d.ts +2 -0
- package/dist/components/preview/TabContent.svelte +66 -31
- 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 +357 -13
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +2 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +20 -5
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +2 -1
- package/dist/components/preview/inputs/FileInput.svelte +115 -103
- 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 +98 -16
- package/dist/components/preview/inputs/NumberInput.svelte.d.ts +2 -0
- package/dist/components/preview/inputs/OptionGlyph.svelte +29 -0
- package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +8 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte +45 -0
- package/dist/components/preview/inputs/SegmentedInput.svelte.d.ts +12 -0
- package/dist/components/preview/inputs/TextInput.svelte +11 -6
- 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 +56 -24
- package/dist/components/primitives/CalculateButton.svelte.d.ts +3 -0
- package/dist/components/primitives/Callout.svelte +8 -6
- package/dist/components/primitives/Callout.svelte.d.ts +4 -4
- package/dist/components/primitives/DataTable.svelte +38 -4
- package/dist/components/primitives/DataTable.svelte.d.ts +2 -0
- 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 -15
- 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 +4 -4
- package/dist/components/primitives/badge/badge.svelte.d.ts +10 -10
- package/dist/components/primitives/button/button.svelte +10 -8
- package/dist/components/primitives/button/button.svelte.d.ts +20 -17
- 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 +7 -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 +4 -4
- 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 +5 -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/scroll-area/scroll-area.svelte +1 -1
- package/dist/components/primitives/search/search.svelte +2 -2
- 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 +8 -3
- package/dist/components/primitives/slider/slider.svelte.d.ts +5 -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 +3 -3
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +7 -7
- 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 +119 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte.d.ts +9 -0
- package/dist/components/viewer/SceneManager.svelte +32 -21
- package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
- package/dist/components/viewer/Viewer.svelte +195 -207
- 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/run-panel-action.d.ts +8 -0
- package/dist/compute/run-panel-action.js +12 -0
- package/dist/compute/solving.svelte.d.ts +11 -7
- package/dist/compute/solving.svelte.js +64 -45
- package/dist/compute/useSolveSession.svelte.js +3 -0
- package/dist/constants.d.ts +6 -8
- package/dist/constants.js +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/localeContext.svelte.d.ts +10 -3
- package/dist/i18n/localeContext.svelte.js +27 -5
- package/dist/i18n/messages.d.ts +164 -2
- package/dist/i18n/messages.js +281 -11
- package/dist/index.d.ts +6 -1
- package/dist/index.js +5 -0
- package/dist/public.d.ts +2 -1
- 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 +38 -0
- package/dist/styles/base.css +116 -83
- package/dist/types/actionButton.d.ts +17 -3
- package/dist/types/presetLabels.d.ts +3 -2
- package/dist/types/presetLabels.js +9 -8
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/dist/utils/file-download.js +10 -22
- package/dist/utils/host-files.d.ts +12 -0
- package/dist/utils/host-files.js +46 -0
- package/dist/utils/loadScript.d.ts +2 -0
- package/dist/utils/loadScript.js +2 -0
- package/dist/utils/webp-to-png.d.ts +10 -0
- package/dist/utils/webp-to-png.js +41 -0
- package/package.json +30 -22
- package/src/lib/components/ErrorScreen.svelte +7 -3
- package/src/lib/components/compute/AppLayout.svelte +307 -123
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +46 -22
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +32 -42
- package/src/lib/components/compute/ParameterPresetManager.svelte +16 -65
- package/src/lib/components/compute/SolveMessages.svelte +130 -123
- package/src/lib/components/layout/AppShell.svelte +10 -6
- 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 +26 -14
- package/src/lib/components/layout/PageHeader.svelte +14 -10
- package/src/lib/components/layout/SectionHeader.svelte +4 -2
- package/src/lib/components/layout/SideNav.svelte +57 -8
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +131 -65
- package/src/lib/components/preview/Group.svelte +42 -22
- package/src/lib/components/preview/HelpButton.svelte +5 -3
- package/src/lib/components/preview/ImageOutput.svelte +435 -71
- package/src/lib/components/preview/InputControl.svelte +125 -51
- package/src/lib/components/preview/OutputDisplay.svelte +42 -28
- package/src/lib/components/preview/TabBar.svelte +8 -6
- package/src/lib/components/preview/TabContent.svelte +66 -31
- 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 +357 -13
- package/src/lib/components/preview/inputs/DropdownInput.svelte +20 -5
- package/src/lib/components/preview/inputs/FileInput.svelte +115 -103
- package/src/lib/components/preview/inputs/GeometryInput.svelte +128 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +98 -16
- 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 +11 -6
- 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 +56 -24
- package/src/lib/components/primitives/Callout.svelte +9 -7
- package/src/lib/components/primitives/DataTable.svelte +38 -4
- 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 -15
- 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 +5 -5
- package/src/lib/components/primitives/button/button.svelte +10 -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 +8 -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 +5 -5
- 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 +5 -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 +2 -2
- package/src/lib/components/primitives/search/search.svelte +3 -3
- 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 +9 -4
- 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 +4 -4
- 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 +119 -0
- package/src/lib/components/viewer/SceneManager.svelte +32 -21
- package/src/lib/components/viewer/Viewer.svelte +196 -208
- 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/run-panel-action.ts +16 -0
- package/src/lib/compute/solving.svelte.ts +66 -50
- package/src/lib/compute/useSolveSession.svelte.ts +3 -0
- package/src/lib/constants.ts +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/localeContext.svelte.ts +40 -5
- package/src/lib/i18n/messages.ts +487 -13
- package/src/lib/index.ts +23 -0
- package/src/lib/public.ts +2 -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 +50 -1
- package/src/lib/styles/base.css +116 -83
- package/src/lib/types/actionButton.ts +16 -3
- package/src/lib/types/presetLabels.ts +13 -11
- package/src/lib/utils/color-space.ts +107 -0
- package/src/lib/utils/file-download.ts +11 -21
- package/src/lib/utils/host-files.ts +61 -0
- package/src/lib/utils/loadScript.ts +3 -0
- package/src/lib/utils/webp-to-png.ts +48 -0
- package/dist/components/primitives/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/components/viewer/MeshMetadataDialog.svelte +0 -126
- package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +0 -10
- 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/components/viewer/MeshMetadataDialog.svelte +0 -126
- 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
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
<script lang="ts">
|
|
14
14
|
import type { Snippet } from 'svelte';
|
|
15
15
|
import { page } from '$app/state';
|
|
16
|
+
import ChevronsUpDown from '@lucide/svelte/icons/chevrons-up-down';
|
|
17
|
+
import Check from '@lucide/svelte/icons/check';
|
|
18
|
+
import * as DropdownMenu from '#lib/components/primitives/dropdown-menu/index.js';
|
|
16
19
|
|
|
17
20
|
interface SideNavProps {
|
|
18
21
|
items: SideNavItem[];
|
|
@@ -41,15 +44,19 @@
|
|
|
41
44
|
if (item.match === 'prefix') return path.startsWith(item.href);
|
|
42
45
|
return path === item.href;
|
|
43
46
|
}
|
|
47
|
+
|
|
48
|
+
const activeItem = $derived(items.find(isActive));
|
|
44
49
|
</script>
|
|
45
50
|
|
|
51
|
+
<!-- On a phone a 240px column would leave the page ~150px, so the nav collapses to one switcher
|
|
52
|
+
naming the current section; the header and footer drop out. -->
|
|
46
53
|
<aside
|
|
47
|
-
class={`w-60 flex
|
|
48
|
-
border ? 'border-r
|
|
54
|
+
class={`sm:h-full sm:w-60 sm:overflow-y-auto sm:border-b-0 flex w-full shrink-0 flex-col border-b border-border bg-background ${
|
|
55
|
+
border ? 'sm:border-r' : ''
|
|
49
56
|
} ${className}`}
|
|
50
57
|
>
|
|
51
58
|
{#if eyebrow}
|
|
52
|
-
<div class="px-4 pt-5 pb-3">
|
|
59
|
+
<div class="px-4 pt-5 pb-3 sm:block hidden">
|
|
53
60
|
<span class="text-xs font-medium tracking-wider text-muted-foreground uppercase">
|
|
54
61
|
{eyebrow}
|
|
55
62
|
</span>
|
|
@@ -57,21 +64,63 @@
|
|
|
57
64
|
{/if}
|
|
58
65
|
|
|
59
66
|
{#if header}
|
|
60
|
-
<div class="px-3 pb-3">
|
|
67
|
+
<div class="px-3 pb-3 sm:block hidden">
|
|
61
68
|
{@render header()}
|
|
62
69
|
</div>
|
|
63
70
|
{/if}
|
|
64
71
|
|
|
65
|
-
<
|
|
72
|
+
<div class="py-2 sm:hidden px-(--page-px)">
|
|
73
|
+
<DropdownMenu.Root>
|
|
74
|
+
<DropdownMenu.Trigger>
|
|
75
|
+
{#snippet child({ props })}
|
|
76
|
+
<button
|
|
77
|
+
{...props}
|
|
78
|
+
class="min-h-11 gap-3 px-3 text-sm font-medium flex w-full items-center rounded-md border border-border bg-card text-left"
|
|
79
|
+
>
|
|
80
|
+
{#if activeItem?.icon}
|
|
81
|
+
{@const Icon = activeItem.icon}
|
|
82
|
+
<Icon class="size-4 shrink-0 opacity-70" />
|
|
83
|
+
{/if}
|
|
84
|
+
<span class="min-w-0 flex-1 truncate">
|
|
85
|
+
{#if eyebrow}<span class="text-muted-foreground">{eyebrow} /</span>{/if}
|
|
86
|
+
{activeItem?.label ?? ''}
|
|
87
|
+
</span>
|
|
88
|
+
<ChevronsUpDown class="size-4 shrink-0 opacity-60" />
|
|
89
|
+
</button>
|
|
90
|
+
{/snippet}
|
|
91
|
+
</DropdownMenu.Trigger>
|
|
92
|
+
<DropdownMenu.Content sideOffset={4}>
|
|
93
|
+
{#each items as item (item.href)}
|
|
94
|
+
{@const active = isActive(item)}
|
|
95
|
+
{@const Icon = item.icon}
|
|
96
|
+
<DropdownMenu.Item class="min-h-11">
|
|
97
|
+
{#snippet child({ props })}
|
|
98
|
+
<a href={item.href} aria-current={active ? 'page' : undefined} {...props}>
|
|
99
|
+
{#if Icon}<Icon class="size-4 opacity-70" />{/if}
|
|
100
|
+
<span class="flex-1">{item.label}</span>
|
|
101
|
+
{#if item.badge !== undefined}
|
|
102
|
+
<span class="font-mono text-2xs tabular-nums opacity-60">{item.badge}</span>
|
|
103
|
+
{/if}
|
|
104
|
+
{#if active}<Check class="size-4" aria-hidden="true" />{/if}
|
|
105
|
+
</a>
|
|
106
|
+
{/snippet}
|
|
107
|
+
</DropdownMenu.Item>
|
|
108
|
+
{/each}
|
|
109
|
+
</DropdownMenu.Content>
|
|
110
|
+
</DropdownMenu.Root>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<nav class="pb-4 pr-2 sm:block hidden flex-1 space-y-px">
|
|
66
114
|
{#each items as item (item.href)}
|
|
67
115
|
{@const active = isActive(item)}
|
|
68
116
|
{@const Icon = item.icon}
|
|
69
117
|
<a
|
|
70
118
|
href={item.href}
|
|
119
|
+
aria-current={active ? 'page' : undefined}
|
|
71
120
|
class={`group gap-2 py-1.5 pr-2.5 relative flex w-full items-center text-left transition-colors ${
|
|
72
121
|
active
|
|
73
|
-
? 'pl-4 rounded-r-md bg-
|
|
74
|
-
: 'mx-2 pl-2.5 rounded-md text-muted-foreground hover:bg-
|
|
122
|
+
? 'pl-4 rounded-r-md bg-selected text-foreground'
|
|
123
|
+
: 'mx-2 pl-2.5 rounded-md text-muted-foreground hover:bg-hover hover:text-foreground'
|
|
75
124
|
}`}
|
|
76
125
|
>
|
|
77
126
|
{#if active}
|
|
@@ -89,7 +138,7 @@
|
|
|
89
138
|
</nav>
|
|
90
139
|
|
|
91
140
|
{#if footer}
|
|
92
|
-
<div class="px-3 py-3 border-t border-border
|
|
141
|
+
<div class="px-3 py-3 sm:block hidden border-t border-border">
|
|
93
142
|
{@render footer()}
|
|
94
143
|
</div>
|
|
95
144
|
{/if}
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
class={[
|
|
32
32
|
'h-7 px-3 gap-1.5 text-sm font-medium flex items-center rounded-md transition-colors',
|
|
33
33
|
active
|
|
34
|
-
? 'bg-
|
|
35
|
-
: 'text-muted-foreground hover:bg-
|
|
34
|
+
? 'bg-selected text-foreground'
|
|
35
|
+
: 'text-muted-foreground hover:bg-hover hover:text-foreground'
|
|
36
36
|
].join(' ')}
|
|
37
37
|
>
|
|
38
38
|
{#if item.icon}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { OutputChartLayoutItem } from '@selvajs/schemas';
|
|
3
|
-
import { onMount } from 'svelte';
|
|
3
|
+
import { onMount, tick } from 'svelte';
|
|
4
|
+
import { mode } from 'mode-watcher';
|
|
4
5
|
import { Loader, Maximize, Minimize } from '@lucide/svelte';
|
|
5
|
-
import { loadScript } from '
|
|
6
|
+
import { loadScript } from '#lib/utils/loadScript.js';
|
|
7
|
+
import { getLocaleContext } from '#lib/i18n/localeContext.svelte.js';
|
|
8
|
+
import { formatMessage } from '#lib/i18n/messages.js';
|
|
9
|
+
import { upgradePlotlyFigure, type PlotlyFigure } from '#lib/features/chart/plotly-compat.js';
|
|
6
10
|
|
|
7
11
|
interface Props {
|
|
8
12
|
item: OutputChartLayoutItem;
|
|
@@ -11,19 +15,21 @@
|
|
|
11
15
|
|
|
12
16
|
let { item: _item, value }: Props = $props();
|
|
13
17
|
|
|
14
|
-
const
|
|
18
|
+
const locale = getLocaleContext();
|
|
19
|
+
const t = $derived(locale.messages);
|
|
15
20
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const MAP_TYPE_SET = new Set([
|
|
22
|
+
'scattermap',
|
|
23
|
+
'choroplethmap',
|
|
24
|
+
'densitymap',
|
|
25
|
+
'choropleth',
|
|
26
|
+
'scattergeo'
|
|
27
|
+
]);
|
|
22
28
|
|
|
23
29
|
const figData = $derived.by(() => {
|
|
24
30
|
if (!value) return null;
|
|
25
31
|
try {
|
|
26
|
-
return JSON.parse(value) as PlotlyFigure;
|
|
32
|
+
return upgradePlotlyFigure(JSON.parse(value) as PlotlyFigure);
|
|
27
33
|
} catch {
|
|
28
34
|
return null;
|
|
29
35
|
}
|
|
@@ -40,20 +46,40 @@
|
|
|
40
46
|
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
41
47
|
if (window.Plotly) return window.Plotly;
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
// Pinned by hash: the plugin's web UI runs this on the origin that holds its bridge secret.
|
|
50
|
+
await loadScript('https://cdn.plot.ly/plotly-4.1.2.min.js', {
|
|
51
|
+
crossOrigin: 'anonymous',
|
|
52
|
+
integrity: 'sha384-hHv6D3tTUUBpp4tVv6t2Dc3oGuRhphmWOTKUR8jWyN0Pnon1g3iebKCNDNmKmxo8'
|
|
53
|
+
});
|
|
44
54
|
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
45
55
|
return window.Plotly;
|
|
46
56
|
}
|
|
47
57
|
|
|
58
|
+
// Some embedded WebViews (WKWebView in the Rhino panel) ship without the Fullscreen API at all.
|
|
59
|
+
const fullscreenSupported = typeof document !== 'undefined' && !!document.fullscreenEnabled;
|
|
60
|
+
|
|
61
|
+
// `Plots.resize()`/`relayout({autosize: true})` ask Plotly to re-measure the container itself,
|
|
62
|
+
// which it silently fails to do across a Fullscreen transition — _fullLayout keeps the
|
|
63
|
+
// pre-toggle width/height even though clientWidth/clientHeight are already correct. Passing
|
|
64
|
+
// the measured size explicitly is the only call that actually takes.
|
|
65
|
+
function resizeChart() {
|
|
66
|
+
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
67
|
+
if (!containerEl || !window.Plotly) return;
|
|
68
|
+
const { width, height } = containerEl.getBoundingClientRect();
|
|
69
|
+
if (width === 0 || height === 0) return;
|
|
70
|
+
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
71
|
+
window.Plotly.relayout(containerEl, { width, height });
|
|
72
|
+
}
|
|
73
|
+
|
|
48
74
|
function toggleFullscreen() {
|
|
49
75
|
if (!wrapperEl) return;
|
|
50
76
|
if (!document.fullscreenElement) {
|
|
51
77
|
wrapperEl.requestFullscreen().catch((err) => {
|
|
52
|
-
error =
|
|
78
|
+
error = formatMessage(t.fullscreenUnavailable, { error: err.message });
|
|
53
79
|
});
|
|
54
80
|
} else {
|
|
55
81
|
document.exitFullscreen().catch((err) => {
|
|
56
|
-
error =
|
|
82
|
+
error = formatMessage(t.exitFullscreenFailed, { error: err.message });
|
|
57
83
|
});
|
|
58
84
|
}
|
|
59
85
|
}
|
|
@@ -61,27 +87,52 @@
|
|
|
61
87
|
$effect(() => {
|
|
62
88
|
function onFullscreenChange() {
|
|
63
89
|
isFullscreen = !!document.fullscreenElement;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
68
|
-
window.Plotly.Plots.resize(containerEl);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
90
|
+
// `tick()` waits for the h-dvh/h-95 class swap this state drives to actually reach the
|
|
91
|
+
// DOM before resizeChart measures it.
|
|
92
|
+
tick().then(resizeChart);
|
|
71
93
|
}
|
|
72
94
|
document.addEventListener('fullscreenchange', onFullscreenChange);
|
|
73
95
|
return () => document.removeEventListener('fullscreenchange', onFullscreenChange);
|
|
74
96
|
});
|
|
75
97
|
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
// Chromium's getComputedStyle returns color values in whatever function the CSS used to
|
|
99
|
+
// declare them — oklch() here, since base.css's theme tokens are oklch(). Plotly's own color
|
|
100
|
+
// parser doesn't recognize oklch() and silently falls back to its #444 default instead of
|
|
101
|
+
// erroring, so every chart read dark axis text even in dark mode. `fillStyle` alone just
|
|
102
|
+
// echoes the oklch() string back unconverted; actually rasterizing a pixel and reading its
|
|
103
|
+
// bytes is what forces a real rgb() value Plotly can parse.
|
|
104
|
+
function toRgb(cssColor: string): string {
|
|
105
|
+
const canvas = document.createElement('canvas');
|
|
106
|
+
canvas.width = 1;
|
|
107
|
+
canvas.height = 1;
|
|
108
|
+
const ctx = canvas.getContext('2d');
|
|
109
|
+
if (!ctx) return cssColor;
|
|
110
|
+
ctx.fillStyle = cssColor;
|
|
111
|
+
ctx.fillRect(0, 0, 1, 1);
|
|
112
|
+
const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;
|
|
113
|
+
return a === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${(a / 255).toFixed(3)})`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function getThemeColors(): {
|
|
117
|
+
textColor: string;
|
|
118
|
+
gridColor: string;
|
|
119
|
+
fontFamily: string;
|
|
120
|
+
colorway: string[];
|
|
121
|
+
} {
|
|
122
|
+
if (!containerEl) return { textColor: '#333', gridColor: '#eee', fontFamily: '', colorway: [] };
|
|
78
123
|
const style = getComputedStyle(containerEl);
|
|
79
|
-
const textColor = style.getPropertyValue('color').trim() || '#333';
|
|
80
|
-
const gridColor =
|
|
124
|
+
const textColor = toRgb(style.getPropertyValue('color').trim() || '#333');
|
|
125
|
+
const gridColor = toRgb(
|
|
81
126
|
style.getPropertyValue('--border')?.trim() ||
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
127
|
+
style.getPropertyValue('--color-border')?.trim() ||
|
|
128
|
+
'rgba(128,128,128,0.2)'
|
|
129
|
+
);
|
|
130
|
+
// Figures that leave colours unset take Selva's chart palette rather than Plotly's.
|
|
131
|
+
const colorway = [1, 2, 3, 4, 5]
|
|
132
|
+
.map((i) => style.getPropertyValue(`--chart-${i}`).trim())
|
|
133
|
+
.filter(Boolean)
|
|
134
|
+
.map(toRgb);
|
|
135
|
+
return { textColor, gridColor, fontFamily: style.fontFamily, colorway };
|
|
85
136
|
}
|
|
86
137
|
|
|
87
138
|
async function renderChart() {
|
|
@@ -90,7 +141,7 @@
|
|
|
90
141
|
loading = true;
|
|
91
142
|
try {
|
|
92
143
|
const Plotly = await loadPlotly();
|
|
93
|
-
const { textColor, gridColor } = getThemeColors();
|
|
144
|
+
const { textColor, gridColor, fontFamily, colorway } = getThemeColors();
|
|
94
145
|
const isMapFigure = figData.data?.some((t) => MAP_TYPE_SET.has(t.type as string));
|
|
95
146
|
|
|
96
147
|
const {
|
|
@@ -110,26 +161,39 @@
|
|
|
110
161
|
...layoutRest,
|
|
111
162
|
autosize: true,
|
|
112
163
|
margin: { t: 24, r: 8, b: 40, l: 60, pad: 0 },
|
|
113
|
-
font: { color: textColor },
|
|
164
|
+
font: { color: textColor, ...(fontFamily ? { family: fontFamily } : {}) },
|
|
165
|
+
...(colorway.length && !layoutRest.colorway ? { colorway } : {}),
|
|
114
166
|
paper_bgcolor: layoutRest.paper_bgcolor ?? 'transparent',
|
|
115
167
|
plot_bgcolor: layoutRest.plot_bgcolor ?? 'transparent',
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
168
|
+
// Plotly's axis tick/label color doesn't inherit the top-level `font.color`, so this
|
|
169
|
+
// has to be set even when the figure's own JSON never declared an xaxis/yaxis —
|
|
170
|
+
// which the mock's figures don't. Gating on `layoutRest.xaxis` existing left every
|
|
171
|
+
// axis on Plotly's built-in #444 default, light or dark mode.
|
|
172
|
+
...(!isMapFigure
|
|
173
|
+
? {
|
|
174
|
+
xaxis: { ...(layoutRest.xaxis as object), gridcolor: gridColor, color: textColor },
|
|
175
|
+
yaxis: { ...(layoutRest.yaxis as object), gridcolor: gridColor, color: textColor }
|
|
176
|
+
}
|
|
121
177
|
: {})
|
|
122
178
|
};
|
|
123
179
|
|
|
124
|
-
Plotly.react(containerEl,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
180
|
+
Plotly.react(containerEl, {
|
|
181
|
+
data: figData.data,
|
|
182
|
+
layout,
|
|
183
|
+
// Animated figures (e.g. Canopy's Animate) carry their frames here.
|
|
184
|
+
frames: figData.frames ?? [],
|
|
185
|
+
config: {
|
|
186
|
+
responsive: true,
|
|
187
|
+
displayModeBar: 'hover',
|
|
188
|
+
displaylogo: false,
|
|
189
|
+
// Plotly 4's "Share chart" button uploads the figure to Plotly's cloud.
|
|
190
|
+
showSendToCloud: false,
|
|
191
|
+
modeBarButtonsToRemove: ['sendDataToCloud', 'lasso2d', 'select2d'],
|
|
192
|
+
...figData.config
|
|
193
|
+
}
|
|
130
194
|
});
|
|
131
195
|
} catch (e) {
|
|
132
|
-
error = e instanceof Error ? e.message :
|
|
196
|
+
error = e instanceof Error ? e.message : t.chartRenderFailed;
|
|
133
197
|
} finally {
|
|
134
198
|
loading = false;
|
|
135
199
|
}
|
|
@@ -142,11 +206,7 @@
|
|
|
142
206
|
const ro = new ResizeObserver(() => {
|
|
143
207
|
if (resizeTimer) clearTimeout(resizeTimer);
|
|
144
208
|
resizeTimer = setTimeout(() => {
|
|
145
|
-
|
|
146
|
-
if (containerEl && window.Plotly) {
|
|
147
|
-
// @ts-expect-error — Plotly is loaded dynamically onto window
|
|
148
|
-
window.Plotly.Plots.resize(containerEl);
|
|
149
|
-
}
|
|
209
|
+
resizeChart();
|
|
150
210
|
resizeTimer = null;
|
|
151
211
|
}, 150);
|
|
152
212
|
});
|
|
@@ -163,6 +223,10 @@
|
|
|
163
223
|
let renderTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
164
224
|
|
|
165
225
|
$effect(() => {
|
|
226
|
+
// Re-reads mode.current so a theme toggle re-renders with the new axis/font colors —
|
|
227
|
+
// getThemeColors() only reads the DOM once, at render time, and nothing else repaints an
|
|
228
|
+
// already-drawn chart when the page's color scheme changes under it.
|
|
229
|
+
void mode.current;
|
|
166
230
|
if (!value || !mounted || !containerEl) return;
|
|
167
231
|
if (renderTimeout) clearTimeout(renderTimeout);
|
|
168
232
|
renderTimeout = setTimeout(() => {
|
|
@@ -177,44 +241,46 @@
|
|
|
177
241
|
|
|
178
242
|
<div
|
|
179
243
|
bind:this={wrapperEl}
|
|
180
|
-
class="group
|
|
244
|
+
class="group relative overflow-hidden rounded-lg border border-border-strong {isFullscreen
|
|
181
245
|
? 'bg-background'
|
|
182
246
|
: ''}"
|
|
183
247
|
>
|
|
184
248
|
{#if error}
|
|
185
249
|
<div class="px-4 py-3 text-sm text-destructive">{error}</div>
|
|
186
|
-
{:else if !figData && value}
|
|
187
|
-
<div class="px-4 py-8 text-sm text-center text-muted-foreground">Receiving chart data...</div>
|
|
188
250
|
{:else if !figData}
|
|
189
|
-
|
|
251
|
+
<!-- The layout hides this output while it has no data, so this is data that doesn't parse yet. -->
|
|
252
|
+
<div class="px-4 py-8 text-sm text-center text-muted-foreground">{t.chartReceiving}</div>
|
|
190
253
|
{:else}
|
|
191
|
-
<div bind:this={containerEl} class="w-full {isFullscreen ? 'h-
|
|
254
|
+
<div bind:this={containerEl} class="w-full {isFullscreen ? 'h-dvh' : 'h-95'}"></div>
|
|
192
255
|
|
|
193
256
|
<div
|
|
194
|
-
class="gap-1 left-2 top-2 absolute z-10 flex items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 {isFullscreen
|
|
257
|
+
class="gap-1 left-2 top-2 absolute z-10 flex items-center opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100 pointer-coarse:opacity-100 {isFullscreen
|
|
195
258
|
? 'opacity-100'
|
|
196
259
|
: ''}"
|
|
197
260
|
>
|
|
198
261
|
{#if loading}
|
|
199
262
|
<div
|
|
200
|
-
class="
|
|
263
|
+
class="p-1.5 backdrop-blur-sm flex items-center rounded-sm border border-border-strong bg-background/80 text-muted-foreground"
|
|
201
264
|
>
|
|
202
265
|
<Loader size={14} class="animate-spin" />
|
|
203
266
|
</div>
|
|
204
267
|
{/if}
|
|
205
268
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
269
|
+
{#if fullscreenSupported}
|
|
270
|
+
<button
|
|
271
|
+
onclick={toggleFullscreen}
|
|
272
|
+
disabled={loading}
|
|
273
|
+
title={isFullscreen ? t.exitFullscreen : t.fullscreen}
|
|
274
|
+
aria-label={isFullscreen ? t.exitFullscreen : t.fullscreen}
|
|
275
|
+
class="p-1.5 backdrop-blur-sm flex items-center rounded-sm border border-border-strong bg-background/80 text-foreground transition-colors hover:bg-background disabled:cursor-not-allowed disabled:opacity-50"
|
|
276
|
+
>
|
|
277
|
+
{#if isFullscreen}
|
|
278
|
+
<Minimize size={14} />
|
|
279
|
+
{:else}
|
|
280
|
+
<Maximize size={14} />
|
|
281
|
+
{/if}
|
|
282
|
+
</button>
|
|
283
|
+
{/if}
|
|
218
284
|
</div>
|
|
219
285
|
{/if}
|
|
220
286
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { LayoutItem, InputLayoutItem, OutputLayoutItem } from '@selvajs/schemas';
|
|
3
3
|
import type { Snippet } from 'svelte';
|
|
4
4
|
import { ChevronDown } from '@lucide/svelte';
|
|
5
|
-
import { buildVisibilityMap, itemKey } from '
|
|
5
|
+
import { buildVisibilityMap, itemKey } from '#lib/schema/visibility-rules.js';
|
|
6
6
|
|
|
7
7
|
interface Props {
|
|
8
8
|
label: string;
|
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
|
|
39
39
|
const visibilityMap = $derived(buildVisibilityMap(items, values));
|
|
40
40
|
|
|
41
|
+
const uid = $props.id();
|
|
42
|
+
const descriptionId = `${uid}-description`;
|
|
43
|
+
|
|
41
44
|
// Below this a label and its control stop fitting side by side, so a wide group
|
|
42
45
|
// sheds columns as its panel narrows instead of squeezing every input.
|
|
43
46
|
const MIN_COLUMN_WIDTH = 160;
|
|
@@ -66,33 +69,45 @@
|
|
|
66
69
|
</div>
|
|
67
70
|
{/snippet}
|
|
68
71
|
|
|
69
|
-
<section class="
|
|
72
|
+
<section class="rounded-xl border bg-card shadow-raised">
|
|
70
73
|
{#if flat}
|
|
71
74
|
<div class="p-4">
|
|
72
75
|
{@render grid()}
|
|
73
76
|
</div>
|
|
74
77
|
{:else}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
{
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
78
|
+
<!-- The host's page owns the h1 and the panel holds the h2. The description sits outside the
|
|
79
|
+
heading's button, so the heading and the button are named by the label alone. -->
|
|
80
|
+
<h3>
|
|
81
|
+
<button
|
|
82
|
+
type="button"
|
|
83
|
+
class="gap-3 px-4 pt-4 flex w-full items-start text-left outline-none select-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset {description
|
|
84
|
+
? 'pb-0'
|
|
85
|
+
: 'pb-3'}"
|
|
86
|
+
aria-expanded={!collapsed}
|
|
87
|
+
aria-describedby={description ? descriptionId : undefined}
|
|
88
|
+
onclick={onToggle}
|
|
89
|
+
>
|
|
90
|
+
<span class="min-w-0 text-sm font-semibold leading-snug flex-1 text-foreground"
|
|
91
|
+
>{label}</span
|
|
92
|
+
>
|
|
93
|
+
<ChevronDown
|
|
94
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-faint-foreground transition-transform duration-200 {collapsed
|
|
95
|
+
? '-rotate-90'
|
|
96
|
+
: ''}"
|
|
97
|
+
/>
|
|
98
|
+
</button>
|
|
99
|
+
</h3>
|
|
100
|
+
{#if description}
|
|
101
|
+
<p
|
|
102
|
+
id={descriptionId}
|
|
103
|
+
class="pl-4 pr-11 pt-0.5 pb-3 text-xs leading-snug text-muted-foreground"
|
|
104
|
+
>
|
|
105
|
+
{description}
|
|
106
|
+
</p>
|
|
107
|
+
{/if}
|
|
93
108
|
<div class="content-wrapper" class:collapsed inert={collapsed}>
|
|
94
109
|
<div class="content-inner">
|
|
95
|
-
<div class="px-4 pt-
|
|
110
|
+
<div class="px-4 pt-2 pb-5">
|
|
96
111
|
{@render grid()}
|
|
97
112
|
</div>
|
|
98
113
|
</div>
|
|
@@ -137,7 +152,7 @@
|
|
|
137
152
|
.schema-grid {
|
|
138
153
|
display: grid;
|
|
139
154
|
grid-template-columns: repeat(var(--schema-cols), minmax(0, 1fr));
|
|
140
|
-
gap:
|
|
155
|
+
gap: 1.25rem var(--column-gap);
|
|
141
156
|
align-items: start;
|
|
142
157
|
}
|
|
143
158
|
|
|
@@ -145,6 +160,11 @@
|
|
|
145
160
|
grid-column: span var(--span) / span var(--span);
|
|
146
161
|
}
|
|
147
162
|
|
|
163
|
+
/* A control with no label above it lines up with the controls beside it, not their labels. */
|
|
164
|
+
.grid-cell:has(:global([data-control-line])) {
|
|
165
|
+
align-self: end;
|
|
166
|
+
}
|
|
167
|
+
|
|
148
168
|
/* An empty full-width row: the two row gaps around it already read as a break. */
|
|
149
169
|
.grid-break {
|
|
150
170
|
grid-column: 1 / -1;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { HelpCircle } from '@lucide/svelte';
|
|
3
|
-
import * as Dialog from '
|
|
3
|
+
import * as Dialog from '#lib/components/primitives/dialog/index.js';
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
6
6
|
/** The field's label: the dialog title and the button's accessible name. */
|
|
@@ -12,13 +12,15 @@
|
|
|
12
12
|
</script>
|
|
13
13
|
|
|
14
14
|
<!-- Every field has one, so a column of them is noise. Where a fine pointer can hover, it shows
|
|
15
|
-
only while the pointer or focus is inside the enclosing `group/field`; touch keeps it visible.
|
|
15
|
+
only while the pointer or focus is inside the enclosing `group/field`; touch keeps it visible.
|
|
16
|
+
The box is 24px, touch gets a 44px hit area, and the negative margin keeps the label row from
|
|
17
|
+
growing. -->
|
|
16
18
|
<Dialog.Root>
|
|
17
19
|
<Dialog.Trigger>
|
|
18
20
|
{#snippet child({ props })}
|
|
19
21
|
<button
|
|
20
22
|
{...props}
|
|
21
|
-
class="-m-1
|
|
23
|
+
class="-m-1 size-6 pointer-coarse:after:-inset-2.5 relative flex shrink-0 cursor-help items-center justify-center rounded-sm text-muted-foreground transition hover:text-foreground pointer-coarse:after:absolute pointer-fine:opacity-0 pointer-fine:group-focus-within/field:opacity-100 pointer-fine:group-hover/field:opacity-100 pointer-fine:focus-visible:opacity-100"
|
|
22
24
|
aria-label={label}
|
|
23
25
|
>
|
|
24
26
|
<HelpCircle class="size-3.5" />
|