@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,97 @@
|
|
|
1
|
+
// Which elements of a schema each host renders. Worked out from the schema on every read and
|
|
2
|
+
// never stored in it: a stored copy goes stale the way a saved paramType does. Making an element
|
|
3
|
+
// work on Selva later is a change to SUPPORT, with no schema change and no migration.
|
|
4
|
+
import { getGroups } from '@selvajs/schemas';
|
|
5
|
+
const SUPPORT = {
|
|
6
|
+
value: ['rhino', 'selva'],
|
|
7
|
+
geometry: ['rhino'],
|
|
8
|
+
trigger: ['rhino'],
|
|
9
|
+
unknown: []
|
|
10
|
+
};
|
|
11
|
+
export const HOST_LABELS = { rhino: 'Rhino', selva: 'Selva' };
|
|
12
|
+
const GEOMETRY_PARAM_TYPES = new Set(['geometry', 'point', 'line', 'plane']);
|
|
13
|
+
// Keyed by the schema's own widget unions, so a widget added to the schema fails to compile here
|
|
14
|
+
// until someone decides which hosts render it.
|
|
15
|
+
const INPUT_WIDGETS = {
|
|
16
|
+
number: true,
|
|
17
|
+
text: true,
|
|
18
|
+
dropdown: true,
|
|
19
|
+
dynamicValueList: true,
|
|
20
|
+
checkbox: true,
|
|
21
|
+
file: true,
|
|
22
|
+
color: true
|
|
23
|
+
};
|
|
24
|
+
const OUTPUT_WIDGETS = {
|
|
25
|
+
text: true,
|
|
26
|
+
number: true,
|
|
27
|
+
file: true,
|
|
28
|
+
chart: true,
|
|
29
|
+
image: true,
|
|
30
|
+
dynamicValueList: true
|
|
31
|
+
};
|
|
32
|
+
const KNOWN_WIDGETS = {
|
|
33
|
+
input: new Set(Object.keys(INPUT_WIDGETS)),
|
|
34
|
+
output: new Set(Object.keys(OUTPUT_WIDGETS))
|
|
35
|
+
};
|
|
36
|
+
/** The control comes from this, whatever the saved widgetType says: saved ones hold `text`. */
|
|
37
|
+
export function isGeometryParamType(paramType) {
|
|
38
|
+
return paramType !== undefined && GEOMETRY_PARAM_TYPES.has(paramType);
|
|
39
|
+
}
|
|
40
|
+
export function isTriggerItem(item) {
|
|
41
|
+
return (item.type === 'input' &&
|
|
42
|
+
item.widgetType === 'checkbox' &&
|
|
43
|
+
item.config?.displayAs === 'button');
|
|
44
|
+
}
|
|
45
|
+
export function layoutItemKind(item, inputs) {
|
|
46
|
+
if (item.type === 'linebreak')
|
|
47
|
+
return 'value';
|
|
48
|
+
if (item.type !== 'input' && item.type !== 'output')
|
|
49
|
+
return 'unknown';
|
|
50
|
+
if (item.type === 'input') {
|
|
51
|
+
const paramType = inputs.find((i) => i.id === item.paramId)?.paramType;
|
|
52
|
+
if (isGeometryParamType(paramType))
|
|
53
|
+
return 'geometry';
|
|
54
|
+
}
|
|
55
|
+
if (!KNOWN_WIDGETS[item.type].has(item.widgetType))
|
|
56
|
+
return 'unknown';
|
|
57
|
+
return isTriggerItem(item) ? 'trigger' : 'value';
|
|
58
|
+
}
|
|
59
|
+
export function hostsFor(kind) {
|
|
60
|
+
return SUPPORT[kind];
|
|
61
|
+
}
|
|
62
|
+
export function isSupportedOn(host, kind) {
|
|
63
|
+
return SUPPORT[kind].includes(host);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Inputs the form keeps no value for: geometry lives on the Grasshopper param after a pick, and a
|
|
67
|
+
* button only sends a press. Value updates and presets skip them; holding a button's `true` would
|
|
68
|
+
* fire its action again on every solve.
|
|
69
|
+
*/
|
|
70
|
+
export function isValuelessInput(item, input) {
|
|
71
|
+
return isGeometryParamType(input?.paramType) || isTriggerItem(item);
|
|
72
|
+
}
|
|
73
|
+
export function valuelessInputIds(schema) {
|
|
74
|
+
const ids = new Set();
|
|
75
|
+
for (const input of schema.inputs) {
|
|
76
|
+
if (isGeometryParamType(input.paramType))
|
|
77
|
+
ids.add(input.id);
|
|
78
|
+
}
|
|
79
|
+
for (const group of getGroups(schema)) {
|
|
80
|
+
for (const item of group.items ?? []) {
|
|
81
|
+
if (isTriggerItem(item))
|
|
82
|
+
ids.add(item.paramId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return ids;
|
|
86
|
+
}
|
|
87
|
+
/** The placed items a host won't render, for the builder's summary of where the UI runs. */
|
|
88
|
+
export function unsupportedItems(schema, host) {
|
|
89
|
+
const items = [];
|
|
90
|
+
for (const group of getGroups(schema)) {
|
|
91
|
+
for (const item of group.items ?? []) {
|
|
92
|
+
if (!isSupportedOn(host, layoutItemKind(item, schema.inputs)))
|
|
93
|
+
items.push(item);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return items;
|
|
97
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DropdownWidgetConfig, OptionMedia, UISchema } from '@selvajs/schemas';
|
|
2
|
+
export type OptionDisplay = NonNullable<DropdownWidgetConfig['displayAs']>;
|
|
3
|
+
export declare function resolveOptionDisplay(displayAs: string | undefined, optionCount: number): OptionDisplay;
|
|
4
|
+
export type GlyphSource = {
|
|
5
|
+
kind: 'icon';
|
|
6
|
+
d: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'image';
|
|
9
|
+
src: string;
|
|
10
|
+
};
|
|
11
|
+
/** What to draw beside an option: its thumbnail, else its icon. */
|
|
12
|
+
export declare function optionGlyph(media: OptionMedia | undefined, assets: UISchema['assets'] | undefined): GlyphSource | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Past this a button row no longer fits a panel column. A computed list can grow past it at
|
|
2
|
+
// runtime, so the row turns back into a dropdown instead of wrapping.
|
|
3
|
+
const MAX_SEGMENTED_OPTIONS = 6;
|
|
4
|
+
export function resolveOptionDisplay(displayAs, optionCount) {
|
|
5
|
+
switch (displayAs) {
|
|
6
|
+
case 'checklist':
|
|
7
|
+
case 'tiles':
|
|
8
|
+
return displayAs;
|
|
9
|
+
case 'segmented':
|
|
10
|
+
return optionCount <= MAX_SEGMENTED_OPTIONS ? 'segmented' : 'dropdown';
|
|
11
|
+
default:
|
|
12
|
+
return 'dropdown';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// The schema can come from any .gh, so an image reaches <img> only as an inline raster data URI.
|
|
16
|
+
// Anything else could be a URL that makes every viewer's browser call wherever the file points.
|
|
17
|
+
const RASTER_DATA_URI = /^data:image\/(webp|jpeg|png);base64,[A-Za-z0-9+/=]+$/;
|
|
18
|
+
/** What to draw beside an option: its thumbnail, else its icon. */
|
|
19
|
+
export function optionGlyph(media, assets) {
|
|
20
|
+
if (!media || !assets)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (media.image) {
|
|
23
|
+
const src = assets[media.image]?.img;
|
|
24
|
+
if (src && RASTER_DATA_URI.test(src))
|
|
25
|
+
return { kind: 'image', src };
|
|
26
|
+
}
|
|
27
|
+
const d = media.icon ? assets[media.icon]?.d : undefined;
|
|
28
|
+
return d ? { kind: 'icon', d } : undefined;
|
|
29
|
+
}
|
|
@@ -14,6 +14,8 @@ export declare function validateSavedState(savedState: ParameterPreset, currentS
|
|
|
14
14
|
* Params the current schema no longer has are dropped. That's the same condition
|
|
15
15
|
* `validateSavedState` flags as an error, but the rule is re-derived from the schema here
|
|
16
16
|
* rather than read back off the issue list — nothing couples to how sentinel ids are encoded.
|
|
17
|
+
* Valueless inputs are dropped too: a preset saved before an input became a button or a
|
|
18
|
+
* geometry input still holds a value for it.
|
|
17
19
|
*/
|
|
18
20
|
export declare function extractLoadableValues(savedState: ParameterPreset, currentSchema: UISchema): Record<string, unknown>;
|
|
19
21
|
export interface PresetLoadResult {
|
|
@@ -28,5 +30,6 @@ export interface PresetLoadResult {
|
|
|
28
30
|
}
|
|
29
31
|
/** Validates and computes the loadable values in one pass, so callers thread one object. */
|
|
30
32
|
export declare function loadPreset(savedState: ParameterPreset, currentSchema: UISchema): PresetLoadResult;
|
|
31
|
-
|
|
33
|
+
/** Resolves false when the user cancelled the save. */
|
|
34
|
+
export declare function exportStateAsJson(savedState: ParameterPreset): Promise<boolean>;
|
|
32
35
|
export declare function importStateFromJson(file: File): Promise<ParameterPreset>;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { randomId } from '../utils/randomId';
|
|
2
|
+
import { saveBlob } from '../utils/host-files';
|
|
2
3
|
import { getGroups } from '@selvajs/schemas';
|
|
4
|
+
import { isValuelessInput, valuelessInputIds } from './host-support';
|
|
3
5
|
export function createSavedState(schema, currentValues, metadata) {
|
|
4
6
|
const parameters = [];
|
|
5
7
|
for (const group of getGroups(schema)) {
|
|
@@ -8,6 +10,8 @@ export function createSavedState(schema, currentValues, metadata) {
|
|
|
8
10
|
continue;
|
|
9
11
|
const value = currentValues[item.paramId];
|
|
10
12
|
const inputDef = schema.inputs.find((i) => i.id === item.paramId);
|
|
13
|
+
if (isValuelessInput(item, inputDef))
|
|
14
|
+
continue;
|
|
11
15
|
if (value !== undefined && inputDef) {
|
|
12
16
|
parameters.push({
|
|
13
17
|
paramId: item.paramId,
|
|
@@ -78,12 +82,15 @@ export function validateSavedState(savedState, currentSchema) {
|
|
|
78
82
|
* Params the current schema no longer has are dropped. That's the same condition
|
|
79
83
|
* `validateSavedState` flags as an error, but the rule is re-derived from the schema here
|
|
80
84
|
* rather than read back off the issue list — nothing couples to how sentinel ids are encoded.
|
|
85
|
+
* Valueless inputs are dropped too: a preset saved before an input became a button or a
|
|
86
|
+
* geometry input still holds a value for it.
|
|
81
87
|
*/
|
|
82
88
|
export function extractLoadableValues(savedState, currentSchema) {
|
|
83
89
|
const values = {};
|
|
90
|
+
const valueless = valuelessInputIds(currentSchema);
|
|
84
91
|
for (const paramState of savedState.parameters) {
|
|
85
92
|
const exists = currentSchema.inputs.some((i) => i.id === paramState.paramId);
|
|
86
|
-
if (exists) {
|
|
93
|
+
if (exists && !valueless.has(paramState.paramId)) {
|
|
87
94
|
values[paramState.paramId] = paramState.value;
|
|
88
95
|
}
|
|
89
96
|
}
|
|
@@ -99,17 +106,14 @@ export function loadPreset(savedState, currentSchema) {
|
|
|
99
106
|
canLoad: validation.canLoad
|
|
100
107
|
};
|
|
101
108
|
}
|
|
109
|
+
/** Resolves false when the user cancelled the save. */
|
|
102
110
|
export function exportStateAsJson(savedState) {
|
|
103
111
|
const blob = new Blob([JSON.stringify(savedState, null, 2)], { type: 'application/json' });
|
|
104
112
|
const safeName = savedState.name.replace(/[^a-z0-9]/gi, '_');
|
|
105
113
|
const date = savedState.timestamp.split('T')[0].replace(/-/g, '_');
|
|
106
|
-
const link = document.createElement('a');
|
|
107
|
-
link.href = URL.createObjectURL(blob);
|
|
108
114
|
// .slvp = Selva parameter preset. Import still accepts the pre-rename .sps — same JSON,
|
|
109
115
|
// only the writer's extension changed.
|
|
110
|
-
|
|
111
|
-
link.click();
|
|
112
|
-
URL.revokeObjectURL(link.href);
|
|
116
|
+
return saveBlob(blob, `${safeName}_${date}.slvp`);
|
|
113
117
|
}
|
|
114
118
|
export async function importStateFromJson(file) {
|
|
115
119
|
const state = JSON.parse(await file.text());
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LayoutItem, VisibilityRule, VisibilityCondition, GroupVisibilityCondition, TabConfig } from '@selvajs/schemas';
|
|
1
|
+
import type { InputLayoutItem, LayoutItem, VisibilityRule, VisibilityCondition, GroupVisibilityCondition, TabConfig, UISchema } from '@selvajs/schemas';
|
|
2
2
|
export interface VisibilityResult {
|
|
3
3
|
visible: boolean;
|
|
4
4
|
disabled: boolean;
|
|
@@ -20,6 +20,12 @@ export declare function evaluateGroupVisibility(group: {
|
|
|
20
20
|
items?: LayoutItem[];
|
|
21
21
|
}, values: Record<string, unknown>): boolean;
|
|
22
22
|
export declare function isTabVisible(tab: TabConfig, values: Record<string, unknown>): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The input items the form shows for these values: each passes its own condition, inside a
|
|
25
|
+
* shown group and, when tabbed, a shown tab. For a host that repeats the form back, such as a
|
|
26
|
+
* summary before a commit, without re-deriving the renderer's rules.
|
|
27
|
+
*/
|
|
28
|
+
export declare function visibleInputItems(schema: UISchema, values: Record<string, unknown>): InputLayoutItem[];
|
|
23
29
|
/**
|
|
24
30
|
* A linebreak is always "visible" but renders as a divider only, so a group left with
|
|
25
31
|
* nothing but separators counts as empty.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isFileData } from '../utils/file-download';
|
|
1
2
|
const toStringArray = (value) => {
|
|
2
3
|
if (Array.isArray(value))
|
|
3
4
|
return value.map(String);
|
|
@@ -50,6 +51,9 @@ export function evaluateVisibility(item, values) {
|
|
|
50
51
|
if ('visible' in item && item.visible === false) {
|
|
51
52
|
return { visible: false, disabled: false };
|
|
52
53
|
}
|
|
54
|
+
if (item.type === 'output' && drawsNothing(item, values[item.paramId])) {
|
|
55
|
+
return { visible: false, disabled: false };
|
|
56
|
+
}
|
|
53
57
|
if (!item.visibilityCondition?.rules)
|
|
54
58
|
return { visible: true, disabled: false };
|
|
55
59
|
const { action = 'show', defaultValue } = item.visibilityCondition;
|
|
@@ -57,6 +61,23 @@ export function evaluateVisibility(item, values) {
|
|
|
57
61
|
const actionFn = ACTIONS[action] ?? ACTIONS.show;
|
|
58
62
|
return actionFn(met, defaultValue);
|
|
59
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* An image or chart output has nothing to draw until a solve returns its data, and an empty
|
|
66
|
+
* preview box would hold its group, tab and pane open; it counts as hidden until then. A dynamic
|
|
67
|
+
* value list output never draws: it only feeds the options of an input.
|
|
68
|
+
*/
|
|
69
|
+
function drawsNothing(item, value) {
|
|
70
|
+
switch (item.widgetType) {
|
|
71
|
+
case 'image':
|
|
72
|
+
return !(Array.isArray(value) ? value.some(isFileData) : isFileData(value));
|
|
73
|
+
case 'chart':
|
|
74
|
+
return value === undefined || value === null || value === '';
|
|
75
|
+
case 'dynamicValueList':
|
|
76
|
+
return true;
|
|
77
|
+
default:
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
60
81
|
/** Must stay identical to the key the renderers use in their `{#each}` blocks. */
|
|
61
82
|
export function itemKey(item) {
|
|
62
83
|
return item.type === 'linebreak' ? item.id : item.paramId;
|
|
@@ -85,6 +106,23 @@ export function evaluateGroupVisibility(group, values) {
|
|
|
85
106
|
export function isTabVisible(tab, values) {
|
|
86
107
|
return (tab.visible !== false && tab.groups.some((group) => evaluateGroupVisibility(group, values)));
|
|
87
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* The input items the form shows for these values: each passes its own condition, inside a
|
|
111
|
+
* shown group and, when tabbed, a shown tab. For a host that repeats the form back, such as a
|
|
112
|
+
* summary before a commit, without re-deriving the renderer's rules.
|
|
113
|
+
*/
|
|
114
|
+
export function visibleInputItems(schema, values) {
|
|
115
|
+
const layout = schema?.layout;
|
|
116
|
+
const groups = layout?.type === 'tabbed'
|
|
117
|
+
? (layout.tabs ?? []).filter((t) => isTabVisible(t, values)).flatMap((t) => t.groups ?? [])
|
|
118
|
+
: layout?.type === 'flat'
|
|
119
|
+
? (layout.groups ?? [])
|
|
120
|
+
: [];
|
|
121
|
+
return groups
|
|
122
|
+
.filter((g) => evaluateGroupVisibility(g, values))
|
|
123
|
+
.flatMap((g) => g.items ?? [])
|
|
124
|
+
.filter((i) => i.type === 'input' && evaluateVisibility(i, values).visible);
|
|
125
|
+
}
|
|
88
126
|
/**
|
|
89
127
|
* A linebreak is always "visible" but renders as a divider only, so a group left with
|
|
90
128
|
* nothing but separators counts as empty.
|
package/dist/styles/base.css
CHANGED
|
@@ -1,74 +1,95 @@
|
|
|
1
|
+
@import '@fontsource-variable/hanken-grotesk';
|
|
2
|
+
|
|
1
3
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
2
4
|
|
|
5
|
+
/* Surfaces, edges and states share one set of names in both modes; each mode only changes the
|
|
6
|
+
values. Ratios are WCAG 2.x. The roles and when to use each: docs/contributing/design-system.md. */
|
|
3
7
|
:root {
|
|
4
|
-
--radius: 0.625rem;
|
|
5
8
|
--header-h: 3.5rem;
|
|
6
|
-
--
|
|
9
|
+
--below-header-h: calc(100svh - var(--header-h));
|
|
10
|
+
--page-px: 1rem;
|
|
7
11
|
--page-py: 1.75rem;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
--
|
|
12
|
-
--
|
|
13
|
-
--
|
|
14
|
-
|
|
15
|
-
--
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
--
|
|
12
|
+
/* Canvas, then surface (cards, panels), then raised (rows, menus, popovers). Light can't go
|
|
13
|
+
lighter than white, so raised is white too and lifts with a border and a shadow instead.
|
|
14
|
+
Values follow stock shadcn neutral. */
|
|
15
|
+
--background: oklch(0.985 0 0);
|
|
16
|
+
--card: oklch(1 0 0);
|
|
17
|
+
--raised: oklch(1 0 0);
|
|
18
|
+
/* Recessed fill for trays, table heads, code and skeletons: darker than the surface around it. */
|
|
19
|
+
--muted: oklch(0.97 0 0);
|
|
20
|
+
/* Fill of anything you type into, on a card: recessed, the same step as muted, in both modes.
|
|
21
|
+
The edge (`--input`) carries the boundary. */
|
|
22
|
+
--field: var(--muted);
|
|
23
|
+
--foreground: oklch(0.145 0 0);
|
|
24
|
+
--card-foreground: oklch(0.145 0 0);
|
|
25
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
26
|
+
/* 4.5:1 on every surface. */
|
|
19
27
|
--muted-foreground: oklch(0.5 0 0);
|
|
20
|
-
|
|
21
|
-
--
|
|
22
|
-
|
|
23
|
-
--
|
|
24
|
-
--
|
|
25
|
-
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
+
/* Icons, placeholders, disabled text: 3:1 on every surface. */
|
|
29
|
+
--faint-foreground: oklch(0.6 0 0);
|
|
30
|
+
/* State overlays, laid over whatever surface is underneath. */
|
|
31
|
+
--hover: oklch(0 0 0 / 4%);
|
|
32
|
+
--selected: oklch(0 0 0 / 8%);
|
|
33
|
+
/* Rest fill of a neutral filled control; its hover is `selected`. */
|
|
34
|
+
--secondary: oklch(0.97 0 0);
|
|
35
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
36
|
+
/* Outlines and separators. */
|
|
37
|
+
--border: oklch(0 0 0 / 8%);
|
|
38
|
+
/* Popovers, outline buttons, dashed drop zones. */
|
|
39
|
+
--border-strong: oklch(0 0 0 / 14%);
|
|
40
|
+
/* Edge of anything you type into or toggle, slider tracks included. Softer than the 3:1 WCAG
|
|
41
|
+
boundary minimum in both modes: the recessed field fill carries the rest of the boundary. */
|
|
42
|
+
--input: oklch(0 0 0 / 10%);
|
|
43
|
+
--ring: oklch(0.708 0 0);
|
|
44
|
+
--elevation-raised: 0 1px 2px oklch(0 0 0 / 5%);
|
|
45
|
+
--elevation-popover: 0 8px 24px oklch(0 0 0 / 10%);
|
|
46
|
+
/* 4.5:1 as text on a card and under its foreground; 3:1 as a fill on every surface. */
|
|
47
|
+
--primary: oklch(0.205 0 0);
|
|
48
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
49
|
+
--destructive: #c9302d;
|
|
50
|
+
--destructive-foreground: #fbfbfb;
|
|
51
|
+
/* 3:1 on every surface, as icons and dots. */
|
|
52
|
+
--success: #51a556;
|
|
28
53
|
--success-foreground: oklch(0.99 0 0);
|
|
29
|
-
--warning:
|
|
54
|
+
--warning: #bd8630;
|
|
30
55
|
--warning-foreground: oklch(0.25 0.04 75);
|
|
31
|
-
--info:
|
|
56
|
+
--info: #5399d1;
|
|
32
57
|
--info-foreground: oklch(0.99 0 0);
|
|
33
58
|
--chart-1: oklch(0.65 0.14 135);
|
|
34
59
|
--chart-2: oklch(0.7 0.11 200);
|
|
35
60
|
--chart-3: oklch(0.6 0.13 260);
|
|
36
61
|
--chart-4: oklch(0.78 0.13 80);
|
|
37
62
|
--chart-5: oklch(0.68 0.15 30);
|
|
38
|
-
--sidebar: oklch(0.96 0 0);
|
|
39
|
-
--sidebar-foreground: oklch(0.25 0 0);
|
|
40
|
-
--sidebar-primary: oklch(0.57 0.07 135);
|
|
41
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
42
|
-
--sidebar-accent: oklch(0.93 0 0);
|
|
43
|
-
--sidebar-accent-foreground: oklch(0.3 0 0);
|
|
44
|
-
--sidebar-border: oklch(0.88 0 0);
|
|
45
|
-
--sidebar-ring: oklch(0.67 0 0);
|
|
46
|
-
--inputparam: oklch(1 0 0);
|
|
47
|
-
--outputparam: oklch(1 0 0);
|
|
48
63
|
/* Scrim behind modal dialogs and drawers. */
|
|
49
64
|
--overlay: oklch(0 0 0 / 50%);
|
|
50
65
|
}
|
|
51
66
|
|
|
52
67
|
.dark {
|
|
53
|
-
--background: oklch(0.
|
|
54
|
-
--
|
|
55
|
-
--
|
|
56
|
-
--
|
|
57
|
-
--
|
|
58
|
-
--
|
|
59
|
-
--
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
63
|
-
--
|
|
64
|
-
--
|
|
65
|
-
--
|
|
66
|
-
--
|
|
68
|
+
--background: oklch(0.145 0 0);
|
|
69
|
+
--card: oklch(0.205 0 0);
|
|
70
|
+
--raised: oklch(0.24 0 0);
|
|
71
|
+
--muted: oklch(0.269 0 0);
|
|
72
|
+
--foreground: oklch(0.985 0 0);
|
|
73
|
+
--card-foreground: oklch(0.985 0 0);
|
|
74
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
75
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
76
|
+
--faint-foreground: oklch(0.556 0 0);
|
|
77
|
+
--hover: oklch(1 0 0 / 6%);
|
|
78
|
+
--selected: oklch(1 0 0 / 10%);
|
|
79
|
+
--secondary: oklch(0.269 0 0);
|
|
80
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
81
|
+
--border: oklch(1 0 0 / 10%);
|
|
82
|
+
--border-strong: oklch(1 0 0 / 18%);
|
|
83
|
+
--input: oklch(1 0 0 / 15%);
|
|
84
|
+
--ring: oklch(0.556 0 0);
|
|
85
|
+
/* Shadows barely show on a dark canvas, so raised things lean on the border instead. */
|
|
86
|
+
--elevation-raised: none;
|
|
87
|
+
--elevation-popover: 0 8px 24px oklch(0 0 0 / 50%);
|
|
88
|
+
--primary: oklch(0.922 0 0);
|
|
89
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
90
|
+
/* White text can't reach 4.5:1 on a red light enough to also be text on the dark card. */
|
|
67
91
|
--destructive: oklch(0.7 0.17 22);
|
|
68
|
-
--destructive-foreground: oklch(0.
|
|
69
|
-
--border: oklch(1 0 0 / 14%);
|
|
70
|
-
--input: oklch(1 0 0 / 12%);
|
|
71
|
-
--ring: oklch(0.74 0 0);
|
|
92
|
+
--destructive-foreground: oklch(0.18 0 0);
|
|
72
93
|
--success: oklch(0.74 0.15 145);
|
|
73
94
|
--success-foreground: oklch(0.18 0.03 145);
|
|
74
95
|
--warning: oklch(0.8 0.14 75);
|
|
@@ -80,41 +101,39 @@
|
|
|
80
101
|
--chart-3: oklch(0.68 0.14 260);
|
|
81
102
|
--chart-4: oklch(0.78 0.14 80);
|
|
82
103
|
--chart-5: oklch(0.7 0.16 30);
|
|
83
|
-
--sidebar: oklch(0.21 0 0);
|
|
84
|
-
--sidebar-foreground: oklch(0.96 0 0);
|
|
85
|
-
--sidebar-primary: oklch(0.74 0.07 135);
|
|
86
|
-
--sidebar-primary-foreground: oklch(0.18 0 0);
|
|
87
|
-
--sidebar-accent: oklch(0.32 0 0);
|
|
88
|
-
--sidebar-accent-foreground: oklch(0.92 0 0);
|
|
89
|
-
--sidebar-border: oklch(1 0 0 / 10%);
|
|
90
|
-
--sidebar-ring: oklch(0.74 0 0);
|
|
91
|
-
--inputparam: oklch(0.15 0 0);
|
|
92
|
-
--outputparam: oklch(0.25 0 0);
|
|
93
104
|
}
|
|
94
105
|
|
|
95
106
|
@theme inline {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
--radius-
|
|
107
|
+
/* Concentric: an item inside a padded container takes the container's radius minus the
|
|
108
|
+
padding. A 12px menu with 4px padding holds 8px items; a 10px control with 2px padding
|
|
109
|
+
holds 8px segments. */
|
|
110
|
+
--radius-sm: 6px;
|
|
111
|
+
--radius-inner: 8px;
|
|
112
|
+
--radius-md: 10px;
|
|
113
|
+
--radius-lg: 12px;
|
|
114
|
+
--radius-xl: 16px;
|
|
100
115
|
--color-background: var(--background);
|
|
101
116
|
--color-foreground: var(--foreground);
|
|
102
117
|
--color-card: var(--card);
|
|
103
118
|
--color-card-foreground: var(--card-foreground);
|
|
104
|
-
--color-
|
|
119
|
+
--color-raised: var(--raised);
|
|
120
|
+
--color-popover: var(--raised);
|
|
105
121
|
--color-popover-foreground: var(--popover-foreground);
|
|
106
|
-
--color-
|
|
107
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
108
|
-
--color-secondary: var(--secondary);
|
|
109
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
122
|
+
--color-field: var(--field);
|
|
110
123
|
--color-muted: var(--muted);
|
|
111
124
|
--color-muted-foreground: var(--muted-foreground);
|
|
112
|
-
--color-
|
|
113
|
-
--color-
|
|
125
|
+
--color-faint-foreground: var(--faint-foreground);
|
|
126
|
+
--color-hover: var(--hover);
|
|
127
|
+
--color-selected: var(--selected);
|
|
128
|
+
--color-secondary: var(--secondary);
|
|
129
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
130
|
+
--color-primary: var(--primary);
|
|
131
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
114
132
|
--color-destructive: var(--destructive);
|
|
115
133
|
--color-destructive-foreground: var(--destructive-foreground);
|
|
116
134
|
--color-overlay: var(--overlay);
|
|
117
135
|
--color-border: var(--border);
|
|
136
|
+
--color-border-strong: var(--border-strong);
|
|
118
137
|
--color-input: var(--input);
|
|
119
138
|
--color-ring: var(--ring);
|
|
120
139
|
--color-success: var(--success);
|
|
@@ -128,21 +147,15 @@
|
|
|
128
147
|
--color-chart-3: var(--chart-3);
|
|
129
148
|
--color-chart-4: var(--chart-4);
|
|
130
149
|
--color-chart-5: var(--chart-5);
|
|
131
|
-
--
|
|
132
|
-
--
|
|
133
|
-
--color-sidebar-primary: var(--sidebar-primary);
|
|
134
|
-
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
135
|
-
--color-sidebar-accent: var(--sidebar-accent);
|
|
136
|
-
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
137
|
-
--color-sidebar-border: var(--sidebar-border);
|
|
138
|
-
--color-sidebar-ring: var(--sidebar-ring);
|
|
139
|
-
--color-inputparam: var(--inputparam);
|
|
140
|
-
--color-outputparam: var(--outputparam);
|
|
150
|
+
--shadow-raised: var(--elevation-raised);
|
|
151
|
+
--shadow-popover: var(--elevation-popover);
|
|
141
152
|
}
|
|
142
153
|
|
|
143
154
|
/* Design tokens beyond Tailwind's defaults. Reach for these before an arbitrary value: the
|
|
144
155
|
design-system lint rejects `text-[10px]`, `max-h-[85dvh]` and the like. */
|
|
145
156
|
@theme {
|
|
157
|
+
/* Hanken Grotesk (OFL), self-hosted via Fontsource: the plugin UI runs offline from the .gha. */
|
|
158
|
+
--font-sans: 'Hanken Grotesk Variable', ui-sans-serif, system-ui, sans-serif;
|
|
146
159
|
/* Type tags, counters and other dense labels. */
|
|
147
160
|
--text-2xs: 0.625rem;
|
|
148
161
|
--text-2xs--line-height: calc(0.875 / 0.625);
|
|
@@ -177,9 +190,29 @@
|
|
|
177
190
|
border-radius: inherit;
|
|
178
191
|
}
|
|
179
192
|
|
|
193
|
+
/* Phones keep a narrower gutter: at 390px every 8px of side padding is 2% of the width. */
|
|
194
|
+
@media (min-width: 40rem) {
|
|
195
|
+
:root {
|
|
196
|
+
--page-px: 1.5rem;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* A native select draws its arrow inside the right padding, so with the `px-2`/`px-3` every
|
|
201
|
+
caller uses it sits on the border. A drawn chevron with its own gutter fixes them all. Unlayered
|
|
202
|
+
on purpose: the gutter has to beat the callers' `px-*` utilities. Mid-grey reads on both themes,
|
|
203
|
+
since a data URI can't take `currentColor`. */
|
|
204
|
+
select:not([multiple]):not([size]) {
|
|
205
|
+
appearance: none;
|
|
206
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
|
|
207
|
+
background-repeat: no-repeat;
|
|
208
|
+
background-position: right 0.625rem center;
|
|
209
|
+
background-size: 1.1em;
|
|
210
|
+
padding-inline-end: calc(1.1em + 1rem);
|
|
211
|
+
}
|
|
212
|
+
|
|
180
213
|
@layer base {
|
|
181
214
|
* {
|
|
182
|
-
@apply border-border outline-ring
|
|
215
|
+
@apply border-border outline-ring;
|
|
183
216
|
}
|
|
184
217
|
html,
|
|
185
218
|
body {
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
import type { SolveSettlement } from '@selvajs/solve/client';
|
|
2
|
+
/** A host action, listed in the panel footer's ⋯ menu after saving and loading inputs. */
|
|
1
3
|
export interface ActionButton {
|
|
2
4
|
id: string;
|
|
3
5
|
label: string;
|
|
4
6
|
/** A Svelte component, rendered before the label. */
|
|
5
7
|
icon?: any;
|
|
6
|
-
variant?: 'default' | '
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
variant?: 'default' | 'destructive';
|
|
9
|
+
/** Shows the action as unavailable instead of hiding it. Pair it with a `hint` saying why. */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** A short line under the label: why it is disabled, or what it does. */
|
|
12
|
+
hint?: string;
|
|
13
|
+
/**
|
|
14
|
+
* The action needs the result for the current inputs: picking it solves first when inputs
|
|
15
|
+
* changed, waits for a solve that is running or under review, and runs `onclick` only if
|
|
16
|
+
* that solve is applied. `onclick` then receives it. A refused or failed solve already shows
|
|
17
|
+
* its messages, so the action just doesn't run.
|
|
18
|
+
*/
|
|
19
|
+
solvesFirst?: boolean;
|
|
20
|
+
onclick: (settled?: Extract<SolveSettlement, {
|
|
21
|
+
status: 'applied';
|
|
22
|
+
}>) => void | Promise<void>;
|
|
9
23
|
}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* unset keys fall back to `DEFAULT_PRESET_LABELS`.
|
|
4
4
|
*/
|
|
5
5
|
export interface PresetLabels {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
saveMenuItem: string;
|
|
7
|
+
loadMenuItem: string;
|
|
8
8
|
saveDialogTitle: string;
|
|
9
9
|
saveDialogDescription: string;
|
|
10
10
|
saveNameLabel: string;
|
|
@@ -16,6 +16,7 @@ export interface PresetLabels {
|
|
|
16
16
|
saveTagsLabel: string;
|
|
17
17
|
saveTagsPlaceholder: string;
|
|
18
18
|
saveNameRequired: string;
|
|
19
|
+
saveConfirmButton: string;
|
|
19
20
|
loadDialogTitle: string;
|
|
20
21
|
loadDialogDescription: string;
|
|
21
22
|
loadFromFileButton: string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export const DEFAULT_PRESET_LABELS = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
saveDialogTitle: 'Save
|
|
5
|
-
saveDialogDescription: 'Save the current
|
|
6
|
-
saveNameLabel: '
|
|
2
|
+
saveMenuItem: 'Save inputs…',
|
|
3
|
+
loadMenuItem: 'Load inputs…',
|
|
4
|
+
saveDialogTitle: 'Save inputs',
|
|
5
|
+
saveDialogDescription: 'Save the current input values as a .slvp file',
|
|
6
|
+
saveNameLabel: 'Name *',
|
|
7
7
|
saveNamePlaceholder: 'e.g., Design Option A',
|
|
8
8
|
saveDescriptionLabel: 'Description',
|
|
9
9
|
saveDescriptionPlaceholder: 'Optional description of this state',
|
|
@@ -11,9 +11,10 @@ export const DEFAULT_PRESET_LABELS = {
|
|
|
11
11
|
saveAuthorPlaceholder: 'Your name or email',
|
|
12
12
|
saveTagsLabel: 'Tags',
|
|
13
13
|
saveTagsPlaceholder: 'facade, option-a, client-approved (comma-separated)',
|
|
14
|
-
saveNameRequired: 'Please enter a name for
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
saveNameRequired: 'Please enter a name for these inputs',
|
|
15
|
+
saveConfirmButton: 'Save',
|
|
16
|
+
loadDialogTitle: 'Load inputs',
|
|
17
|
+
loadDialogDescription: 'Select a .slvp file from your drive to load',
|
|
17
18
|
loadFromFileButton: 'Select .slvp File',
|
|
18
19
|
loadEmptyList: 'No saved states found',
|
|
19
20
|
loadImportError: 'Failed to import state: ',
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface Rgb {
|
|
2
|
+
r: number;
|
|
3
|
+
g: number;
|
|
4
|
+
b: number;
|
|
5
|
+
}
|
|
6
|
+
/** h in [0, 360), s and v in [0, 1]. */
|
|
7
|
+
export interface Hsv {
|
|
8
|
+
h: number;
|
|
9
|
+
s: number;
|
|
10
|
+
v: number;
|
|
11
|
+
}
|
|
12
|
+
/** Accepts `#rgb`, `#rrggbb` and the same without `#`. Returns lowercase `#rrggbb`, or null. */
|
|
13
|
+
export declare function normalizeHex(input: string): string | null;
|
|
14
|
+
export declare function hexToRgb(hex: string): Rgb | null;
|
|
15
|
+
export declare function rgbToHex({ r, g, b }: Rgb): string;
|
|
16
|
+
export declare function rgbToHsv({ r, g, b }: Rgb): Hsv;
|
|
17
|
+
export declare function hsvToRgb({ h, s, v }: Hsv): Rgb;
|
|
18
|
+
export declare const hexToHsv: (hex: string) => Hsv | null;
|
|
19
|
+
export declare const hsvToHex: (hsv: Hsv) => string;
|
|
20
|
+
/** WCAG contrast ratio between two hex colors, 1 to 21. Null if either isn't a hex color. */
|
|
21
|
+
export declare function contrastRatio(a: string, b: string): number | null;
|