@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
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export interface Rgb {
|
|
2
|
+
r: number;
|
|
3
|
+
g: number;
|
|
4
|
+
b: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** h in [0, 360), s and v in [0, 1]. */
|
|
8
|
+
export interface Hsv {
|
|
9
|
+
h: number;
|
|
10
|
+
s: number;
|
|
11
|
+
v: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));
|
|
15
|
+
|
|
16
|
+
/** Accepts `#rgb`, `#rrggbb` and the same without `#`. Returns lowercase `#rrggbb`, or null. */
|
|
17
|
+
export function normalizeHex(input: string): string | null {
|
|
18
|
+
const raw = input.trim().replace(/^#/, '');
|
|
19
|
+
if (/^[0-9a-f]{3}$/i.test(raw)) {
|
|
20
|
+
return `#${raw
|
|
21
|
+
.split('')
|
|
22
|
+
.map((c) => c + c)
|
|
23
|
+
.join('')
|
|
24
|
+
.toLowerCase()}`;
|
|
25
|
+
}
|
|
26
|
+
if (/^[0-9a-f]{6}$/i.test(raw)) return `#${raw.toLowerCase()}`;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function hexToRgb(hex: string): Rgb | null {
|
|
31
|
+
const normalized = normalizeHex(hex);
|
|
32
|
+
if (!normalized) return null;
|
|
33
|
+
return {
|
|
34
|
+
r: parseInt(normalized.slice(1, 3), 16),
|
|
35
|
+
g: parseInt(normalized.slice(3, 5), 16),
|
|
36
|
+
b: parseInt(normalized.slice(5, 7), 16)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function rgbToHex({ r, g, b }: Rgb): string {
|
|
41
|
+
const channel = (n: number) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');
|
|
42
|
+
return `#${channel(r)}${channel(g)}${channel(b)}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function rgbToHsv({ r, g, b }: Rgb): Hsv {
|
|
46
|
+
const rn = r / 255;
|
|
47
|
+
const gn = g / 255;
|
|
48
|
+
const bn = b / 255;
|
|
49
|
+
const max = Math.max(rn, gn, bn);
|
|
50
|
+
const delta = max - Math.min(rn, gn, bn);
|
|
51
|
+
|
|
52
|
+
let h = 0;
|
|
53
|
+
if (delta !== 0) {
|
|
54
|
+
if (max === rn) h = ((gn - bn) / delta) % 6;
|
|
55
|
+
else if (max === gn) h = (bn - rn) / delta + 2;
|
|
56
|
+
else h = (rn - gn) / delta + 4;
|
|
57
|
+
h *= 60;
|
|
58
|
+
if (h < 0) h += 360;
|
|
59
|
+
}
|
|
60
|
+
return { h, s: max === 0 ? 0 : delta / max, v: max };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function hsvToRgb({ h, s, v }: Hsv): Rgb {
|
|
64
|
+
const c = v * s;
|
|
65
|
+
const hp = (((h % 360) + 360) % 360) / 60;
|
|
66
|
+
const x = c * (1 - Math.abs((hp % 2) - 1));
|
|
67
|
+
const [r1, g1, b1] =
|
|
68
|
+
hp < 1
|
|
69
|
+
? [c, x, 0]
|
|
70
|
+
: hp < 2
|
|
71
|
+
? [x, c, 0]
|
|
72
|
+
: hp < 3
|
|
73
|
+
? [0, c, x]
|
|
74
|
+
: hp < 4
|
|
75
|
+
? [0, x, c]
|
|
76
|
+
: hp < 5
|
|
77
|
+
? [x, 0, c]
|
|
78
|
+
: [c, 0, x];
|
|
79
|
+
const m = v - c;
|
|
80
|
+
return { r: (r1 + m) * 255, g: (g1 + m) * 255, b: (b1 + m) * 255 };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const hexToHsv = (hex: string): Hsv | null => {
|
|
84
|
+
const rgb = hexToRgb(hex);
|
|
85
|
+
return rgb ? rgbToHsv(rgb) : null;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const hsvToHex = (hsv: Hsv): string => rgbToHex(hsvToRgb(hsv));
|
|
89
|
+
|
|
90
|
+
/** WCAG relative luminance of an sRGB color. */
|
|
91
|
+
function luminance({ r, g, b }: Rgb): number {
|
|
92
|
+
const lin = (c: number) => {
|
|
93
|
+
const n = c / 255;
|
|
94
|
+
return n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
|
|
95
|
+
};
|
|
96
|
+
return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** WCAG contrast ratio between two hex colors, 1 to 21. Null if either isn't a hex color. */
|
|
100
|
+
export function contrastRatio(a: string, b: string): number | null {
|
|
101
|
+
const ra = hexToRgb(a);
|
|
102
|
+
const rb = hexToRgb(b);
|
|
103
|
+
if (!ra || !rb) return null;
|
|
104
|
+
const la = luminance(ra);
|
|
105
|
+
const lb = luminance(rb);
|
|
106
|
+
return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
|
|
107
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { downloadFileDataByRoot, type FileData } from '@selvajs/compute/core';
|
|
1
|
+
import { decodeBase64ToBinary, downloadFileDataByRoot, type FileData } from '@selvajs/compute/core';
|
|
2
2
|
import { SvelteMap } from 'svelte/reactivity';
|
|
3
3
|
import { APP_DEFAULTS } from '../constants';
|
|
4
|
+
import { saveBlob } from './host-files';
|
|
4
5
|
|
|
5
6
|
export const MIME_BY_EXT: Record<string, string> = {
|
|
6
7
|
'.png': 'image/png',
|
|
@@ -19,26 +20,15 @@ export const MIME_BY_EXT: Record<string, string> = {
|
|
|
19
20
|
'.stl': 'model/stl'
|
|
20
21
|
};
|
|
21
22
|
|
|
22
|
-
function saveSingleFile(file: FileData):
|
|
23
|
+
function saveSingleFile(file: FileData): Promise<boolean> {
|
|
23
24
|
const ext = (file.fileType ?? '').toLowerCase();
|
|
24
25
|
const mime = MIME_BY_EXT[ext] ?? 'application/octet-stream';
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const bytes = new Uint8Array(binary.length);
|
|
30
|
-
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
31
|
-
blob = new Blob([bytes], { type: mime });
|
|
32
|
-
} else {
|
|
33
|
-
blob = new Blob([file.data], { type: mime });
|
|
34
|
-
}
|
|
27
|
+
const content = file.isBase64Encoded ? decodeBase64ToBinary(file.data) : file.data;
|
|
28
|
+
// decodeBase64ToBinary returns an ArrayBuffer-backed copy, never a SharedArrayBuffer view.
|
|
29
|
+
const blob = new Blob([content as BlobPart], { type: mime });
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
const a = document.createElement('a');
|
|
38
|
-
a.href = URL.createObjectURL(blob);
|
|
39
|
-
a.download = fullName;
|
|
40
|
-
a.click();
|
|
41
|
-
URL.revokeObjectURL(a.href);
|
|
31
|
+
return saveBlob(blob, `${file.fileName}${file.fileType ?? ''}`);
|
|
42
32
|
}
|
|
43
33
|
|
|
44
34
|
export async function downloadFiles(
|
|
@@ -53,14 +43,14 @@ export async function downloadFiles(
|
|
|
53
43
|
return;
|
|
54
44
|
}
|
|
55
45
|
|
|
56
|
-
// A lone file is saved as itself rather than zipped
|
|
57
|
-
//
|
|
46
|
+
// A lone file is saved as itself rather than zipped. Everything else, including the
|
|
47
|
+
// per-root archive split, belongs to compute.
|
|
58
48
|
if (filesArray.length === 1) {
|
|
59
|
-
saveSingleFile(filesArray[0]);
|
|
49
|
+
await saveSingleFile(filesArray[0]);
|
|
60
50
|
return;
|
|
61
51
|
}
|
|
62
52
|
|
|
63
|
-
await downloadFileDataByRoot(filesArray, fileName);
|
|
53
|
+
await downloadFileDataByRoot(filesArray, fileName, null, { saveBlob });
|
|
64
54
|
} catch (error) {
|
|
65
55
|
console.error('[FileDownload] Error downloading files:', error);
|
|
66
56
|
throw error;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Where a file the page offers goes, and where a file the page asks for comes from. A browser
|
|
2
|
+
// gets an <a download> click and a hidden <input type=file>. A host whose WebView can't do
|
|
3
|
+
// either safely (the Rhino panel) installs its own once at start-up, before the first save or pick.
|
|
4
|
+
|
|
5
|
+
/** Resolves false when the user cancelled. An anchor download always resolves true: it can't tell. */
|
|
6
|
+
export type BlobSaver = (blob: Blob, fileName: string) => Promise<boolean>;
|
|
7
|
+
|
|
8
|
+
/** `accept` is what `<input accept>` takes: `.slvp,.sps`, `image/*`. Resolves null on cancel. */
|
|
9
|
+
export type FilePicker = (options: { accept: string }) => Promise<File | null>;
|
|
10
|
+
|
|
11
|
+
let saver: BlobSaver = saveWithAnchor;
|
|
12
|
+
let picker: FilePicker = pickWithInput;
|
|
13
|
+
|
|
14
|
+
export function setBlobSaver(next: BlobSaver): void {
|
|
15
|
+
saver = next;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function setFilePicker(next: FilePicker): void {
|
|
19
|
+
picker = next;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function saveBlob(blob: Blob, fileName: string): Promise<boolean> {
|
|
23
|
+
return saver(blob, fileName);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function pickFile(options: { accept: string }): Promise<File | null> {
|
|
27
|
+
return picker(options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function saveWithAnchor(blob: Blob, fileName: string): Promise<boolean> {
|
|
31
|
+
const url = URL.createObjectURL(blob);
|
|
32
|
+
const a = document.createElement('a');
|
|
33
|
+
a.href = url;
|
|
34
|
+
a.download = fileName;
|
|
35
|
+
// Firefox only downloads from an anchor that is in the document.
|
|
36
|
+
document.body.appendChild(a);
|
|
37
|
+
a.click();
|
|
38
|
+
a.remove();
|
|
39
|
+
// Revoking synchronously can abort the download: the browser pins the blob only once it starts.
|
|
40
|
+
setTimeout(() => URL.revokeObjectURL(url), 10_000);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function pickWithInput({ accept }: { accept: string }): Promise<File | null> {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
const input = document.createElement('input');
|
|
47
|
+
input.type = 'file';
|
|
48
|
+
input.accept = accept;
|
|
49
|
+
input.style.display = 'none';
|
|
50
|
+
|
|
51
|
+
const settle = (file: File | null) => {
|
|
52
|
+
input.remove();
|
|
53
|
+
resolve(file);
|
|
54
|
+
};
|
|
55
|
+
input.addEventListener('change', () => settle(input.files?.[0] ?? null), { once: true });
|
|
56
|
+
input.addEventListener('cancel', () => settle(null), { once: true });
|
|
57
|
+
|
|
58
|
+
document.body.appendChild(input);
|
|
59
|
+
input.click();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
@@ -8,6 +8,8 @@ export function loadScript(
|
|
|
8
8
|
src: string,
|
|
9
9
|
options?: {
|
|
10
10
|
crossOrigin?: string;
|
|
11
|
+
/** Subresource Integrity hash. A cross-origin script also needs `crossOrigin`. */
|
|
12
|
+
integrity?: string;
|
|
11
13
|
async?: boolean;
|
|
12
14
|
defer?: boolean;
|
|
13
15
|
}
|
|
@@ -26,6 +28,7 @@ export function loadScript(
|
|
|
26
28
|
const script = document.createElement('script');
|
|
27
29
|
script.src = src;
|
|
28
30
|
if (options?.crossOrigin) script.crossOrigin = options.crossOrigin;
|
|
31
|
+
if (options?.integrity) script.integrity = options.integrity;
|
|
29
32
|
if (options?.async !== undefined) script.async = options.async;
|
|
30
33
|
if (options?.defer !== undefined) script.defer = options.defer;
|
|
31
34
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Grasshopper's PDF export can't read WebP: the plugin's PDF library has no WebP decoder, and
|
|
2
|
+
// nothing on Windows or Rhino.Compute decodes it reliably. The browser can, so a WebP picked for
|
|
3
|
+
// an input that also takes PNG is re-encoded here. PNG rather than JPEG keeps transparency.
|
|
4
|
+
|
|
5
|
+
/** True when a WebP should go out as PNG: the input takes PNG, so a PNG is a valid value. */
|
|
6
|
+
export function shouldConvertWebp(fileEnding: string, acceptedFormats: readonly string[]): boolean {
|
|
7
|
+
return fileEnding === '.webp' && acceptedFormats.includes('.png');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Whether the input takes a file with this ending, counting a WebP it would get as PNG. */
|
|
11
|
+
export function acceptsFileEnding(fileEnding: string, acceptedFormats: readonly string[]): boolean {
|
|
12
|
+
const ending = fileEnding.toLowerCase();
|
|
13
|
+
if (acceptedFormats.length === 0 || acceptedFormats.includes(ending)) return true;
|
|
14
|
+
return shouldConvertWebp(ending, acceptedFormats);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const ascii = (bytes: Uint8Array, start: number, end: number) =>
|
|
18
|
+
String.fromCharCode(...bytes.subarray(start, end));
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* By content, not name: image CDNs serve WebP from URLs with no extension or one naming another
|
|
22
|
+
* format. A WebP file starts `RIFF`, a 4-byte size, then `WEBP`.
|
|
23
|
+
*/
|
|
24
|
+
export async function isWebp(blob: Blob): Promise<boolean> {
|
|
25
|
+
if (blob.type === 'image/webp') return true;
|
|
26
|
+
const head = new Uint8Array(await blob.slice(0, 12).arrayBuffer());
|
|
27
|
+
return head.length === 12 && ascii(head, 0, 4) === 'RIFF' && ascii(head, 8, 12) === 'WEBP';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function webpToPng(blob: Blob): Promise<Blob> {
|
|
31
|
+
const bitmap = await createImageBitmap(blob);
|
|
32
|
+
try {
|
|
33
|
+
const canvas = document.createElement('canvas');
|
|
34
|
+
canvas.width = bitmap.width;
|
|
35
|
+
canvas.height = bitmap.height;
|
|
36
|
+
const context = canvas.getContext('2d');
|
|
37
|
+
if (!context) throw new Error('Canvas 2D context unavailable');
|
|
38
|
+
context.drawImage(bitmap, 0, 0);
|
|
39
|
+
return await new Promise<Blob>((resolve, reject) =>
|
|
40
|
+
canvas.toBlob(
|
|
41
|
+
(png) => (png ? resolve(png) : reject(new Error('PNG encoding failed'))),
|
|
42
|
+
'image/png'
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
} finally {
|
|
46
|
+
bitmap.close();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { themeStore, type Theme } from '../../../theme/themeStore.svelte';
|
|
3
|
-
import * as Select from '../select';
|
|
4
|
-
import { Palette } from '@lucide/svelte';
|
|
5
|
-
|
|
6
|
-
const themes: { value: Theme; label: string; description: string }[] = [
|
|
7
|
-
{ value: 'neutral', label: 'Neutral', description: 'Classic grayscale' },
|
|
8
|
-
{ value: 'selva', label: 'Selva', description: 'Forest green' },
|
|
9
|
-
{ value: 'ocean', label: 'Ocean', description: 'Calm blue tones' },
|
|
10
|
-
{ value: 'cyberpunk', label: 'Cyberpunk', description: 'Vibrant neon colors' }
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
let value = $state(themeStore.current);
|
|
14
|
-
|
|
15
|
-
$effect(() => {
|
|
16
|
-
if (value) {
|
|
17
|
-
themeStore.set(value as Theme);
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const triggerContent = $derived(themes.find((t) => t.value === value)?.label ?? 'Select theme');
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<Select.Root type="single" bind:value>
|
|
25
|
-
<Select.Trigger class="gap-2 w-35">
|
|
26
|
-
<Palette size={14} />
|
|
27
|
-
<span>{triggerContent}</span>
|
|
28
|
-
</Select.Trigger>
|
|
29
|
-
<Select.Content>
|
|
30
|
-
{#each themes as theme (theme.value)}
|
|
31
|
-
<Select.Item value={theme.value} label={theme.label}>
|
|
32
|
-
<div class="flex flex-col items-start">
|
|
33
|
-
<span class="font-medium text-sm">{theme.label}</span>
|
|
34
|
-
<span class="text-xs text-muted-foreground">{theme.description}</span>
|
|
35
|
-
</div>
|
|
36
|
-
</Select.Item>
|
|
37
|
-
{/each}
|
|
38
|
-
</Select.Content>
|
|
39
|
-
</Select.Root>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import * as Dialog from '../primitives/dialog/index.js';
|
|
3
|
-
import { getLocaleContext } from '../../i18n/localeContext.svelte';
|
|
4
|
-
|
|
5
|
-
const locale = getLocaleContext();
|
|
6
|
-
const t = $derived(locale.messages);
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
open: boolean;
|
|
10
|
-
metadata: Record<string, any> | null;
|
|
11
|
-
meshName: string | null;
|
|
12
|
-
onOpenChange: (open: boolean) => void;
|
|
13
|
-
isFullscreen?: boolean;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const EXCLUDED_KEYS = new Set(['name', 'layer', 'id']);
|
|
17
|
-
|
|
18
|
-
let {
|
|
19
|
-
open = $bindable(),
|
|
20
|
-
metadata,
|
|
21
|
-
meshName,
|
|
22
|
-
onOpenChange,
|
|
23
|
-
isFullscreen = false
|
|
24
|
-
}: Props = $props();
|
|
25
|
-
|
|
26
|
-
$effect(() => {
|
|
27
|
-
document.body.toggleAttribute('data-viewer-fullscreen', isFullscreen);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const getFilteredMetadata = () => {
|
|
31
|
-
if (!metadata) return {};
|
|
32
|
-
const entries = Object.entries(metadata).filter(([key]) => !EXCLUDED_KEYS.has(key));
|
|
33
|
-
const result: Record<string, unknown> = {};
|
|
34
|
-
for (const [key, value] of entries) {
|
|
35
|
-
if (
|
|
36
|
-
key === 'metadata' &&
|
|
37
|
-
typeof value === 'object' &&
|
|
38
|
-
value !== null &&
|
|
39
|
-
!Array.isArray(value)
|
|
40
|
-
) {
|
|
41
|
-
Object.assign(result, value);
|
|
42
|
-
} else {
|
|
43
|
-
result[key] = value;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return result;
|
|
47
|
-
};
|
|
48
|
-
</script>
|
|
49
|
-
|
|
50
|
-
<Dialog.Root bind:open {onOpenChange}>
|
|
51
|
-
<Dialog.Content variant="flush" class="min-w-60 max-w-xs w-auto">
|
|
52
|
-
{#if meshName}
|
|
53
|
-
<div class="px-4 pt-3 pb-2 border-b">
|
|
54
|
-
<Dialog.Title size="sm">{meshName}</Dialog.Title>
|
|
55
|
-
</div>
|
|
56
|
-
{:else}
|
|
57
|
-
<Dialog.Title class="sr-only">{t.objectFallbackName}</Dialog.Title>
|
|
58
|
-
{/if}
|
|
59
|
-
|
|
60
|
-
<div class="max-h-80 overflow-y-auto">
|
|
61
|
-
{#if !metadata || Object.keys(getFilteredMetadata()).length === 0}
|
|
62
|
-
<p class="px-4 py-3 text-xs text-muted-foreground">{t.noMetadata}</p>
|
|
63
|
-
{:else}
|
|
64
|
-
<table class="text-xs w-full border-collapse">
|
|
65
|
-
<tbody>
|
|
66
|
-
{#each Object.entries(getFilteredMetadata()) as [key, value] (key)}
|
|
67
|
-
<tr class="border-b border-border/60 transition-colors hover:bg-muted/40">
|
|
68
|
-
<th
|
|
69
|
-
scope="row"
|
|
70
|
-
class="px-4 py-2 font-normal text-left align-top whitespace-nowrap text-muted-foreground"
|
|
71
|
-
>{key}</th
|
|
72
|
-
>
|
|
73
|
-
<td class="px-4 py-2 text-right align-top text-foreground">
|
|
74
|
-
{#if typeof value === 'object' && value !== null}
|
|
75
|
-
{#if Array.isArray(value)}
|
|
76
|
-
<div class="space-y-1 text-left">
|
|
77
|
-
{#each value as item, index (index)}
|
|
78
|
-
{#if typeof item === 'object'}
|
|
79
|
-
<div class="space-y-0.5">
|
|
80
|
-
{#each Object.entries(item) as [k, v] (k)}
|
|
81
|
-
<div class="gap-2 flex">
|
|
82
|
-
<span class="shrink-0 text-muted-foreground">{k}:</span>
|
|
83
|
-
<span>{v}</span>
|
|
84
|
-
</div>
|
|
85
|
-
{/each}
|
|
86
|
-
</div>
|
|
87
|
-
{:else}
|
|
88
|
-
<div>{item}</div>
|
|
89
|
-
{/if}
|
|
90
|
-
{/each}
|
|
91
|
-
</div>
|
|
92
|
-
{:else}
|
|
93
|
-
<div class="space-y-0.5 text-left">
|
|
94
|
-
{#each Object.entries(value) as [k, v] (k)}
|
|
95
|
-
<div class="gap-2 flex">
|
|
96
|
-
<span class="shrink-0 text-muted-foreground">{k}:</span>
|
|
97
|
-
<span>{v}</span>
|
|
98
|
-
</div>
|
|
99
|
-
{/each}
|
|
100
|
-
</div>
|
|
101
|
-
{/if}
|
|
102
|
-
{:else if typeof value === 'number'}
|
|
103
|
-
<span class="font-mono">{value}</span>
|
|
104
|
-
{:else if typeof value === 'boolean'}
|
|
105
|
-
<span class={value ? 'text-success' : 'text-muted-foreground'}
|
|
106
|
-
>{value ? 'true' : 'false'}</span
|
|
107
|
-
>
|
|
108
|
-
{:else}
|
|
109
|
-
<span class="break-all">{value}</span>
|
|
110
|
-
{/if}
|
|
111
|
-
</td>
|
|
112
|
-
</tr>
|
|
113
|
-
{/each}
|
|
114
|
-
</tbody>
|
|
115
|
-
</table>
|
|
116
|
-
{/if}
|
|
117
|
-
</div>
|
|
118
|
-
</Dialog.Content>
|
|
119
|
-
</Dialog.Root>
|
|
120
|
-
|
|
121
|
-
<style>
|
|
122
|
-
:global([data-viewer-fullscreen] [data-slot='dialog-content']),
|
|
123
|
-
:global([data-viewer-fullscreen] [data-slot='dialog-overlay']) {
|
|
124
|
-
z-index: 10001;
|
|
125
|
-
}
|
|
126
|
-
</style>
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
interface Props {
|
|
2
|
-
open: boolean;
|
|
3
|
-
metadata: Record<string, any> | null;
|
|
4
|
-
meshName: string | null;
|
|
5
|
-
onOpenChange: (open: boolean) => void;
|
|
6
|
-
isFullscreen?: boolean;
|
|
7
|
-
}
|
|
8
|
-
declare const MeshMetadataDialog: import("svelte").Component<Props, {}, "open">;
|
|
9
|
-
type MeshMetadataDialog = ReturnType<typeof MeshMetadataDialog>;
|
|
10
|
-
export default MeshMetadataDialog;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--radius: 0.625rem;
|
|
3
|
-
|
|
4
|
-
--background: oklch(0.98 0.01 300);
|
|
5
|
-
--foreground: oklch(0.18 0.05 300);
|
|
6
|
-
|
|
7
|
-
--card: oklch(0.97 0.015 300);
|
|
8
|
-
--card-foreground: oklch(0.18 0.05 300);
|
|
9
|
-
|
|
10
|
-
--popover: oklch(0.97 0.015 300);
|
|
11
|
-
--popover-foreground: oklch(0.18 0.05 300);
|
|
12
|
-
|
|
13
|
-
--primary: oklch(0.7 0.28 295);
|
|
14
|
-
--primary-foreground: oklch(0.98 0 0);
|
|
15
|
-
|
|
16
|
-
--secondary: oklch(0.9 0.05 300);
|
|
17
|
-
--secondary-foreground: oklch(0.18 0.05 300);
|
|
18
|
-
|
|
19
|
-
--muted: oklch(0.92 0.015 300);
|
|
20
|
-
--muted-foreground: oklch(0.5 0.03 300);
|
|
21
|
-
|
|
22
|
-
--accent: oklch(0.78 0.2 305);
|
|
23
|
-
--accent-foreground: oklch(0.12 0.05 300);
|
|
24
|
-
|
|
25
|
-
--destructive: oklch(0.62 0.25 20);
|
|
26
|
-
--destructive-foreground: oklch(0.98 0 0);
|
|
27
|
-
|
|
28
|
-
--border: oklch(0.86 0.02 300);
|
|
29
|
-
--input: oklch(0.92 0.015 300);
|
|
30
|
-
--ring: oklch(0.75 0.18 295);
|
|
31
|
-
|
|
32
|
-
--chart-1: oklch(0.7 0.28 295);
|
|
33
|
-
--chart-2: oklch(0.8 0.24 305);
|
|
34
|
-
--chart-3: oklch(0.65 0.22 310);
|
|
35
|
-
--chart-4: oklch(0.55 0.18 290);
|
|
36
|
-
--chart-5: oklch(0.85 0.15 300);
|
|
37
|
-
|
|
38
|
-
--sidebar: oklch(0.97 0.015 300);
|
|
39
|
-
--sidebar-foreground: oklch(0.18 0.05 300);
|
|
40
|
-
--sidebar-primary: oklch(0.7 0.28 295);
|
|
41
|
-
--sidebar-primary-foreground: oklch(0.98 0 0);
|
|
42
|
-
--sidebar-accent: oklch(0.92 0.015 300);
|
|
43
|
-
--sidebar-accent-foreground: oklch(0.18 0.05 300);
|
|
44
|
-
--sidebar-border: oklch(0.86 0.02 300);
|
|
45
|
-
--sidebar-ring: oklch(0.75 0.18 295);
|
|
46
|
-
|
|
47
|
-
--inputparam: oklch(0.86 0.02 300);
|
|
48
|
-
--outputparam: oklch(0.86 0.04 305);
|
|
49
|
-
--downloadparam: oklch(0.86 0.05 295);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.dark {
|
|
53
|
-
--background: oklch(0.18 0.05 300);
|
|
54
|
-
--foreground: oklch(0.98 0 0);
|
|
55
|
-
|
|
56
|
-
--card: oklch(0.22 0.05 300);
|
|
57
|
-
--card-foreground: oklch(0.98 0 0);
|
|
58
|
-
|
|
59
|
-
--popover: oklch(0.22 0.05 300);
|
|
60
|
-
--popover-foreground: oklch(0.98 0 0);
|
|
61
|
-
|
|
62
|
-
--primary: oklch(0.7 0.28 295);
|
|
63
|
-
--primary-foreground: oklch(0.18 0.05 300);
|
|
64
|
-
|
|
65
|
-
--secondary: oklch(0.28 0.03 300);
|
|
66
|
-
--secondary-foreground: oklch(0.98 0 0);
|
|
67
|
-
|
|
68
|
-
--muted: oklch(0.28 0.03 300);
|
|
69
|
-
--muted-foreground: oklch(0.75 0.04 300);
|
|
70
|
-
|
|
71
|
-
--accent: oklch(0.22 0.05 305);
|
|
72
|
-
--accent-foreground: oklch(0.98 0 0);
|
|
73
|
-
|
|
74
|
-
--destructive: oklch(0.55 0.22 20);
|
|
75
|
-
--destructive-foreground: oklch(0.18 0.05 300);
|
|
76
|
-
|
|
77
|
-
--border: oklch(0.35 0.04 300);
|
|
78
|
-
--input: oklch(0.3 0.03 300);
|
|
79
|
-
--ring: oklch(0.75 0.18 295);
|
|
80
|
-
|
|
81
|
-
--chart-1: oklch(0.7 0.28 295);
|
|
82
|
-
--chart-2: oklch(0.8 0.24 305);
|
|
83
|
-
--chart-3: oklch(0.65 0.22 310);
|
|
84
|
-
--chart-4: oklch(0.32 0.03 300);
|
|
85
|
-
--chart-5: oklch(0.85 0.15 300);
|
|
86
|
-
|
|
87
|
-
--sidebar: oklch(0.18 0.05 300);
|
|
88
|
-
--sidebar-foreground: oklch(0.98 0 0);
|
|
89
|
-
--sidebar-primary: oklch(0.7 0.28 295);
|
|
90
|
-
--sidebar-primary-foreground: oklch(0.18 0.05 300);
|
|
91
|
-
--sidebar-accent: oklch(0.28 0.03 300);
|
|
92
|
-
--sidebar-accent-foreground: oklch(0.98 0 0);
|
|
93
|
-
--sidebar-border: oklch(0.35 0.04 300);
|
|
94
|
-
--sidebar-ring: oklch(0.75 0.18 295);
|
|
95
|
-
|
|
96
|
-
--inputparam: oklch(0.12 0.03 300);
|
|
97
|
-
--outputparam: oklch(0.32 0.04 305);
|
|
98
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--radius: 0.625rem;
|
|
3
|
-
--background: oklch(1 0 0);
|
|
4
|
-
--foreground: oklch(0.145 0 0);
|
|
5
|
-
--card: oklch(1 0 0);
|
|
6
|
-
--card-foreground: oklch(0.145 0 0);
|
|
7
|
-
--popover: oklch(1 0 0);
|
|
8
|
-
--popover-foreground: oklch(0.145 0 0);
|
|
9
|
-
--primary: oklch(0.205 0 0);
|
|
10
|
-
--primary-foreground: oklch(0.985 0 0);
|
|
11
|
-
--secondary: oklch(0.97 0 0);
|
|
12
|
-
--secondary-foreground: oklch(0.205 0 0);
|
|
13
|
-
--muted: oklch(0.97 0 0);
|
|
14
|
-
--muted-foreground: oklch(0.556 0 0);
|
|
15
|
-
--accent: oklch(0.97 0 0);
|
|
16
|
-
--accent-foreground: oklch(0.205 0 0);
|
|
17
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
18
|
-
--border: oklch(87.61% 0.0001 271.152);
|
|
19
|
-
--input: oklch(0.922 0 0);
|
|
20
|
-
--ring: oklch(0.708 0 0);
|
|
21
|
-
--chart-1: oklch(0.646 0.222 41.116);
|
|
22
|
-
--chart-2: oklch(0.6 0.118 184.704);
|
|
23
|
-
--chart-3: oklch(0.398 0.07 227.392);
|
|
24
|
-
--chart-4: oklch(0.828 0.189 84.429);
|
|
25
|
-
--chart-5: oklch(0.769 0.188 70.08);
|
|
26
|
-
--sidebar: oklch(0.985 0 0);
|
|
27
|
-
--sidebar-foreground: oklch(0.145 0 0);
|
|
28
|
-
--sidebar-primary: oklch(0.205 0 0);
|
|
29
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
30
|
-
--sidebar-accent: oklch(0.97 0 0);
|
|
31
|
-
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
32
|
-
--sidebar-border: oklch(0.922 0 0);
|
|
33
|
-
--sidebar-ring: oklch(0.708 0 0);
|
|
34
|
-
--inputparam: oklch(100% 0.00011 271.152);
|
|
35
|
-
--outputparam: oklch(100% 0.00011 271.152);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
.dark {
|
|
39
|
-
--background: oklch(0.145 0 0);
|
|
40
|
-
--foreground: oklch(0.985 0 0);
|
|
41
|
-
--card: oklch(0.205 0 0);
|
|
42
|
-
--card-foreground: oklch(0.985 0 0);
|
|
43
|
-
--popover: oklch(0.205 0 0);
|
|
44
|
-
--popover-foreground: oklch(0.985 0 0);
|
|
45
|
-
--primary: oklch(0.922 0 0);
|
|
46
|
-
--primary-foreground: oklch(0.205 0 0);
|
|
47
|
-
--secondary: oklch(0.269 0 0);
|
|
48
|
-
--secondary-foreground: oklch(0.985 0 0);
|
|
49
|
-
--muted: oklch(0.269 0 0);
|
|
50
|
-
--muted-foreground: oklch(0.708 0 0);
|
|
51
|
-
--accent: oklch(0.269 0 0);
|
|
52
|
-
--accent-foreground: oklch(0.985 0 0);
|
|
53
|
-
--destructive: oklch(0.704 0.191 22.216);
|
|
54
|
-
--border: oklch(1 0 0 / 10%);
|
|
55
|
-
--input: oklch(1 0 0 / 15%);
|
|
56
|
-
--ring: oklch(0.556 0 0);
|
|
57
|
-
--chart-1: oklch(0.488 0.243 264.376);
|
|
58
|
-
--chart-2: oklch(0.696 0.17 162.48);
|
|
59
|
-
--chart-3: oklch(0.769 0.188 70.08);
|
|
60
|
-
--chart-4: oklch(0.627 0.265 303.9);
|
|
61
|
-
--chart-5: oklch(0.645 0.246 16.439);
|
|
62
|
-
--sidebar: oklch(0.205 0 0);
|
|
63
|
-
--sidebar-foreground: oklch(0.985 0 0);
|
|
64
|
-
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
65
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
66
|
-
--sidebar-accent: oklch(0.269 0 0);
|
|
67
|
-
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
68
|
-
--sidebar-border: oklch(1 0 0 / 10%);
|
|
69
|
-
--sidebar-ring: oklch(0.556 0 0);
|
|
70
|
-
--inputparam: oklch(0% 0 271.152);
|
|
71
|
-
--outputparam: oklch(23.574% 0.00241 67.461);
|
|
72
|
-
}
|