@selvajs/ui 6.6.0-beta.9 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -3
- package/dist/components/ErrorScreen.svelte +1 -1
- package/dist/components/compute/AppLayout.svelte +73 -45
- package/dist/components/compute/AppLayout.svelte.d.ts +14 -2
- package/dist/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/dist/components/compute/ComputeApp.svelte +6 -2
- package/dist/components/compute/ComputeApp.svelte.d.ts +1 -1
- package/dist/components/compute/ComputeMessagesDialog.svelte +3 -3
- package/dist/components/compute/ParameterPresetManager.svelte +1 -1
- package/dist/components/compute/SolveMessages.svelte +79 -88
- package/dist/components/compute/SolveMessages.svelte.d.ts +5 -0
- package/dist/components/layout/AppShell.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte +2 -2
- package/dist/components/layout/FooterItemRenderer.svelte.d.ts +1 -1
- package/dist/components/layout/PageContent.svelte +3 -2
- package/dist/components/layout/PageFooter.svelte +5 -5
- package/dist/components/layout/PageHeader.svelte +3 -3
- package/dist/components/layout/SideNav.svelte +3 -3
- package/dist/components/layout/SubNav.svelte +2 -2
- package/dist/components/preview/ChartOutput.svelte +141 -50
- package/dist/components/preview/Group.svelte +9 -9
- package/dist/components/preview/HelpButton.svelte +1 -1
- package/dist/components/preview/ImageOutput.svelte +13 -10
- package/dist/components/preview/InputControl.svelte +13 -12
- package/dist/components/preview/OutputDisplay.svelte +26 -17
- package/dist/components/preview/TabBar.svelte +8 -6
- package/dist/components/preview/TabBar.svelte.d.ts +2 -0
- package/dist/components/preview/TabContent.svelte +8 -8
- package/dist/components/preview/TabLayout.svelte +6 -7
- package/dist/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/dist/components/preview/inputs/ChecklistInput.svelte +5 -5
- package/dist/components/preview/inputs/ColorInput.svelte +356 -14
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +3 -3
- package/dist/components/preview/inputs/FileInput.svelte +17 -12
- package/dist/components/preview/inputs/GeometryInput.svelte +4 -4
- package/dist/components/preview/inputs/GeometryInput.svelte.d.ts +1 -1
- package/dist/components/preview/inputs/NumberInput.svelte +8 -8
- package/dist/components/preview/inputs/OptionGlyph.svelte +1 -1
- package/dist/components/preview/inputs/OptionGlyph.svelte.d.ts +1 -1
- package/dist/components/preview/inputs/SegmentedInput.svelte +3 -2
- package/dist/components/preview/inputs/TextInput.svelte +5 -5
- package/dist/components/preview/inputs/TileInput.svelte +8 -5
- package/dist/components/primitives/CalculateButton.svelte +10 -4
- package/dist/components/primitives/Callout.svelte +8 -6
- package/dist/components/primitives/Callout.svelte.d.ts +4 -4
- package/dist/components/primitives/DataTable.svelte +1 -1
- package/dist/components/primitives/FilterableDropdown.svelte +13 -1
- package/dist/components/primitives/FilterableDropdown.svelte.d.ts +5 -0
- package/dist/components/primitives/ImageUploadField.svelte +1 -1
- package/dist/components/primitives/SolvingIndicator.svelte +242 -41
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +13 -5
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/components/primitives/badge/badge.svelte +2 -2
- package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
- package/dist/components/primitives/button/button.svelte +7 -8
- package/dist/components/primitives/button/button.svelte.d.ts +19 -19
- package/dist/components/primitives/card/card.svelte +1 -1
- package/dist/components/primitives/card/card.svelte.d.ts +1 -1
- package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
- package/dist/components/primitives/command/command-input.svelte +1 -1
- package/dist/components/primitives/command/command-item.svelte +1 -1
- package/dist/components/primitives/command/command-link-item.svelte +1 -1
- package/dist/components/primitives/command/command.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/dialog/dialog-content.svelte +3 -3
- package/dist/components/primitives/drawer/Drawer.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
- package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
- package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/index.js +1 -1
- package/dist/components/primitives/input/input.svelte +2 -2
- package/dist/components/primitives/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/primitives/input-group/input-group.svelte +1 -1
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/dist/components/primitives/popover/popover-content.svelte +1 -1
- package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
- package/dist/components/primitives/search/search.svelte +1 -1
- package/dist/components/primitives/select/select-content.svelte +1 -1
- package/dist/components/primitives/select/select-item.svelte +1 -1
- package/dist/components/primitives/select/select-trigger.svelte +1 -1
- package/dist/components/primitives/slider/slider.svelte +1 -1
- package/dist/components/primitives/switch/switch.svelte +1 -1
- package/dist/components/primitives/tabs/tabs-list.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +6 -6
- package/dist/components/primitives/tabs/tabs-trigger.svelte +2 -2
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +6 -6
- package/dist/components/primitives/textarea/textarea.svelte +1 -1
- package/dist/components/primitives/toggle/toggle.svelte +8 -2
- package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -4
- package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
- package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
- package/dist/components/primitives/tooltip/index.d.ts +6 -0
- package/dist/components/primitives/tooltip/index.js +8 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
- package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
- package/dist/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/dist/components/viewer/SceneManager.svelte +32 -21
- package/dist/components/viewer/SceneManager.svelte.d.ts +3 -1
- package/dist/components/viewer/Viewer.svelte +128 -178
- package/dist/components/viewer/Viewer.svelte.d.ts +7 -2
- package/dist/components/viewer/ViewerDock.svelte +404 -0
- package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
- package/dist/composables/useFooterItem.svelte.d.ts +1 -1
- package/dist/composables/useFooterItem.svelte.js +1 -1
- package/dist/compute/liveProgress.svelte.d.ts +16 -0
- package/dist/compute/liveProgress.svelte.js +90 -0
- package/dist/compute/solving.svelte.d.ts +7 -9
- package/dist/compute/solving.svelte.js +56 -48
- package/dist/constants.d.ts +6 -8
- package/dist/constants.js +8 -11
- package/dist/contexts/hostContext.svelte.d.ts +1 -1
- package/dist/features/chart/plotly-compat.d.ts +15 -0
- package/dist/features/chart/plotly-compat.js +124 -0
- package/dist/i18n/messages.d.ts +17 -0
- package/dist/i18n/messages.js +26 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/public.d.ts +1 -0
- package/dist/public.js +1 -0
- package/dist/schema/visibility-rules.d.ts +7 -1
- package/dist/schema/visibility-rules.js +17 -0
- package/dist/styles/base.css +93 -86
- package/dist/utils/color-space.d.ts +21 -0
- package/dist/utils/color-space.js +90 -0
- package/package.json +31 -23
- package/src/lib/components/ErrorScreen.svelte +1 -1
- package/src/lib/components/compute/AppLayout.svelte +74 -46
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +4 -2
- package/src/lib/components/compute/ComputeApp.svelte +6 -2
- package/src/lib/components/compute/ComputeMessagesDialog.svelte +4 -4
- package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
- package/src/lib/components/compute/SolveMessages.svelte +81 -90
- package/src/lib/components/layout/AppShell.svelte +2 -2
- package/src/lib/components/layout/FooterItemRenderer.svelte +2 -2
- package/src/lib/components/layout/PageContent.svelte +3 -2
- package/src/lib/components/layout/PageFooter.svelte +5 -5
- package/src/lib/components/layout/PageHeader.svelte +3 -3
- package/src/lib/components/layout/SideNav.svelte +4 -4
- package/src/lib/components/layout/SubNav.svelte +2 -2
- package/src/lib/components/preview/ChartOutput.svelte +141 -50
- package/src/lib/components/preview/Group.svelte +9 -9
- package/src/lib/components/preview/HelpButton.svelte +1 -1
- package/src/lib/components/preview/ImageOutput.svelte +13 -10
- package/src/lib/components/preview/InputControl.svelte +13 -12
- package/src/lib/components/preview/OutputDisplay.svelte +26 -17
- package/src/lib/components/preview/TabBar.svelte +8 -6
- package/src/lib/components/preview/TabContent.svelte +8 -8
- package/src/lib/components/preview/TabLayout.svelte +6 -7
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +1 -1
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +5 -5
- package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
- package/src/lib/components/preview/inputs/DropdownInput.svelte +3 -3
- package/src/lib/components/preview/inputs/FileInput.svelte +17 -12
- package/src/lib/components/preview/inputs/GeometryInput.svelte +4 -4
- package/src/lib/components/preview/inputs/NumberInput.svelte +8 -8
- package/src/lib/components/preview/inputs/OptionGlyph.svelte +2 -2
- package/src/lib/components/preview/inputs/SegmentedInput.svelte +3 -2
- package/src/lib/components/preview/inputs/TextInput.svelte +5 -5
- package/src/lib/components/preview/inputs/TileInput.svelte +8 -5
- package/src/lib/components/primitives/CalculateButton.svelte +10 -4
- package/src/lib/components/primitives/Callout.svelte +9 -7
- package/src/lib/components/primitives/DataTable.svelte +1 -1
- package/src/lib/components/primitives/FilterableDropdown.svelte +14 -2
- package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
- package/src/lib/components/primitives/IssueList.svelte +1 -1
- package/src/lib/components/primitives/SeverityIcon.svelte +1 -1
- package/src/lib/components/primitives/SolvingIndicator.svelte +242 -41
- package/src/lib/components/primitives/StateDisplay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +2 -2
- package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +1 -1
- package/src/lib/components/primitives/badge/badge.svelte +3 -3
- package/src/lib/components/primitives/button/button.svelte +7 -8
- package/src/lib/components/primitives/button-group/button-group-separator.svelte +2 -2
- package/src/lib/components/primitives/button-group/button-group-text.svelte +1 -1
- package/src/lib/components/primitives/button-group/button-group.svelte +1 -1
- package/src/lib/components/primitives/card/card-content.svelte +1 -1
- package/src/lib/components/primitives/card/card-description.svelte +1 -1
- package/src/lib/components/primitives/card/card-footer.svelte +1 -1
- package/src/lib/components/primitives/card/card-header.svelte +1 -1
- package/src/lib/components/primitives/card/card-title.svelte +1 -1
- package/src/lib/components/primitives/card/card.svelte +2 -2
- package/src/lib/components/primitives/checkbox/checkbox.svelte +2 -2
- package/src/lib/components/primitives/command/command-dialog.svelte +2 -2
- package/src/lib/components/primitives/command/command-empty.svelte +1 -1
- package/src/lib/components/primitives/command/command-group.svelte +1 -1
- package/src/lib/components/primitives/command/command-input.svelte +3 -3
- package/src/lib/components/primitives/command/command-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-link-item.svelte +2 -2
- package/src/lib/components/primitives/command/command-list.svelte +1 -1
- package/src/lib/components/primitives/command/command-separator.svelte +1 -1
- package/src/lib/components/primitives/command/command-shortcut.svelte +1 -1
- package/src/lib/components/primitives/command/command.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-label.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +1 -1
- package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/dialog/dialog-content.svelte +4 -4
- package/src/lib/components/primitives/dialog/dialog-description.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-footer.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-header.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-overlay.svelte +1 -1
- package/src/lib/components/primitives/dialog/dialog-title.svelte +1 -1
- package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +32 -12
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +6 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +5 -3
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-label.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-separator.svelte +1 -1
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +2 -2
- package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
- package/src/lib/components/primitives/empty/empty-content.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-description.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-header.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-media.svelte +1 -1
- package/src/lib/components/primitives/empty/empty-title.svelte +1 -1
- package/src/lib/components/primitives/empty/empty.svelte +1 -1
- package/src/lib/components/primitives/field/field-content.svelte +1 -1
- package/src/lib/components/primitives/field/field-description.svelte +1 -1
- package/src/lib/components/primitives/field/field-error.svelte +1 -1
- package/src/lib/components/primitives/field/field-group.svelte +1 -1
- package/src/lib/components/primitives/field/field-label.svelte +2 -2
- package/src/lib/components/primitives/field/field-legend.svelte +1 -1
- package/src/lib/components/primitives/field/field-separator.svelte +2 -2
- package/src/lib/components/primitives/field/field-set.svelte +1 -1
- package/src/lib/components/primitives/field/field-title.svelte +1 -1
- package/src/lib/components/primitives/field/field.svelte +1 -1
- package/src/lib/components/primitives/index.ts +1 -1
- package/src/lib/components/primitives/input/input.svelte +3 -3
- package/src/lib/components/primitives/input-group/input-group-addon.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-button.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-input.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group-text.svelte +1 -1
- package/src/lib/components/primitives/input-group/input-group-textarea.svelte +2 -2
- package/src/lib/components/primitives/input-group/input-group.svelte +2 -2
- package/src/lib/components/primitives/label/label.svelte +1 -1
- package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-content.svelte +2 -2
- package/src/lib/components/primitives/popover/popover-description.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-header.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-title.svelte +1 -1
- package/src/lib/components/primitives/popover/popover-trigger.svelte +1 -1
- package/src/lib/components/primitives/resizable/resizable-handle.svelte +3 -3
- package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +1 -1
- package/src/lib/components/primitives/scroll-area/scroll-area.svelte +1 -1
- package/src/lib/components/primitives/search/search.svelte +2 -2
- package/src/lib/components/primitives/select/select-content.svelte +2 -2
- package/src/lib/components/primitives/select/select-group-heading.svelte +1 -1
- package/src/lib/components/primitives/select/select-item.svelte +2 -2
- package/src/lib/components/primitives/select/select-label.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-down-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-scroll-up-button.svelte +1 -1
- package/src/lib/components/primitives/select/select-separator.svelte +2 -2
- package/src/lib/components/primitives/select/select-trigger.svelte +2 -2
- package/src/lib/components/primitives/separator/separator.svelte +1 -1
- package/src/lib/components/primitives/slider/slider.svelte +2 -2
- package/src/lib/components/primitives/spinner/spinner.svelte +1 -1
- package/src/lib/components/primitives/switch/switch.svelte +2 -2
- package/src/lib/components/primitives/tabs/tabs-content.svelte +1 -1
- package/src/lib/components/primitives/tabs/tabs-list.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs-trigger.svelte +3 -3
- package/src/lib/components/primitives/tabs/tabs.svelte +1 -1
- package/src/lib/components/primitives/textarea/textarea.svelte +2 -2
- package/src/lib/components/primitives/toggle/toggle.svelte +9 -3
- package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +3 -3
- package/src/lib/components/primitives/toggle-group/toggle-group.svelte +3 -3
- package/src/lib/components/primitives/tooltip/index.ts +19 -0
- package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
- package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
- package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
- package/src/lib/components/viewer/MeshMetadataPanel.svelte +2 -2
- package/src/lib/components/viewer/SceneManager.svelte +32 -21
- package/src/lib/components/viewer/Viewer.svelte +129 -179
- package/src/lib/components/viewer/ViewerDock.svelte +404 -0
- package/src/lib/composables/useFooterItem.svelte.ts +1 -1
- package/src/lib/compute/liveProgress.svelte.ts +103 -0
- package/src/lib/compute/solving.svelte.ts +56 -55
- package/src/lib/constants.ts +8 -11
- package/src/lib/contexts/hostContext.svelte.ts +1 -1
- package/src/lib/features/chart/plotly-compat.ts +141 -0
- package/src/lib/i18n/messages.ts +43 -0
- package/src/lib/index.ts +2 -0
- package/src/lib/public.ts +1 -0
- package/src/lib/schema/visibility-rules.ts +27 -1
- package/src/lib/styles/base.css +93 -86
- package/src/lib/utils/color-space.ts +107 -0
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
- package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
- package/dist/components/primitives/theme-switcher/index.js +0 -1
- package/dist/styles/themes/cyberpunk.css +0 -98
- package/dist/styles/themes/neutral.css +0 -72
- package/dist/styles/themes/ocean.css +0 -75
- package/dist/styles/themes/selva.css +0 -105
- package/dist/theme/themeStore.svelte.d.ts +0 -12
- package/dist/theme/themeStore.svelte.js +0 -40
- package/dist/theme/themes.d.ts +0 -5
- package/dist/theme/themes.js +0 -13
- package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
- package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
- package/src/lib/styles/themes/cyberpunk.css +0 -98
- package/src/lib/styles/themes/neutral.css +0 -72
- package/src/lib/styles/themes/ocean.css +0 -75
- package/src/lib/styles/themes/selva.css +0 -105
- package/src/lib/theme/themeStore.svelte.ts +0 -50
- package/src/lib/theme/themes.ts +0 -18
package/src/lib/constants.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export const APP_DEFAULTS = {
|
|
2
2
|
// File upload limits
|
|
3
3
|
// TEMP (dev): raised 150 MB → 300 MB so large dev file-widget inputs aren't
|
|
4
|
-
// blocked client-side. The server request cap
|
|
5
|
-
// still defaults to 256 MB, and base64 inflates a raw file by ~4/3, so
|
|
4
|
+
// blocked client-side. The server request cap is 256 MB, and base64 inflates a raw file by ~4/3, so
|
|
6
5
|
// anything over ~192 MB is rejected with a 413 after the client accepts it.
|
|
7
6
|
// Revert to 150 before release.
|
|
8
7
|
FILE_UPLOAD: {
|
|
@@ -18,16 +17,14 @@ export const APP_DEFAULTS = {
|
|
|
18
17
|
DRAWER_ANIMATION_MS: 350
|
|
19
18
|
},
|
|
20
19
|
|
|
21
|
-
//
|
|
20
|
+
// See createSolvingIndicator.
|
|
22
21
|
SOLVING_INDICATOR: {
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
/** Number of solve durations to keep in history for averaging */
|
|
30
|
-
HISTORY_SIZE: 3
|
|
22
|
+
/** A solve that ends sooner shows no indicator (ms) */
|
|
23
|
+
SHOW_AFTER_MS: 400,
|
|
24
|
+
/** Once shown, the indicator stays at least this long (ms) */
|
|
25
|
+
MIN_VISIBLE_MS: 500,
|
|
26
|
+
/** Past this a solve counts as slow and the viewer dims its stale result (ms) */
|
|
27
|
+
SLOW_AFTER_MS: 2000
|
|
31
28
|
},
|
|
32
29
|
|
|
33
30
|
// File size formatting
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getContext, setContext } from 'svelte';
|
|
2
2
|
import type { GeometryKind } from '@selvajs/schemas';
|
|
3
|
-
import type { UIHost } from '
|
|
3
|
+
import type { UIHost } from '#lib/schema/host-support.js';
|
|
4
4
|
|
|
5
5
|
// Tells InputControl which host it renders in and how to reach the host's own actions, without
|
|
6
6
|
// threading a prop through every layout layer. Without a provider the host is Selva.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { hsvToRgb } from '#lib/utils/color-space.js';
|
|
2
|
+
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Plotly 3 → 4 figure compatibility
|
|
5
|
+
// ============================================================================
|
|
6
|
+
//
|
|
7
|
+
// Chart outputs come from whatever plugin version solved them, often one written against
|
|
8
|
+
// Plotly 3. This rewrites the parts Plotly 4 draws differently or rejects, so those figures
|
|
9
|
+
// keep their look. Figures that are already compatible pass through unchanged.
|
|
10
|
+
|
|
11
|
+
type Json = Record<string, unknown>;
|
|
12
|
+
|
|
13
|
+
export interface PlotlyFigure {
|
|
14
|
+
data: Json[];
|
|
15
|
+
layout?: Json;
|
|
16
|
+
config?: Json;
|
|
17
|
+
frames?: Json[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const REMOVED_MAP_TRACES: Record<string, string> = {
|
|
21
|
+
scattermapbox: 'scattermap',
|
|
22
|
+
choroplethmapbox: 'choroplethmap',
|
|
23
|
+
densitymapbox: 'densitymap'
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const MAPBOX_SUBPLOT = /^mapbox(\d*)$/;
|
|
27
|
+
const BARE_HEX = /^(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
|
|
28
|
+
const HSV_FUNCTION =
|
|
29
|
+
/^hsva?[\s(]+([-+\d.]+)%?[\s,]+([\d.]+)(%?)[\s,]+([\d.]+)(%?)(?:[\s,/]+([\d.]+)(%?))?[\s)]*$/i;
|
|
30
|
+
|
|
31
|
+
const isObject = (v: unknown): v is Json =>
|
|
32
|
+
typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
33
|
+
|
|
34
|
+
/** Returns a rewritten copy; the input is not modified. */
|
|
35
|
+
export function upgradePlotlyFigure(figure: PlotlyFigure): PlotlyFigure {
|
|
36
|
+
const out = structuredClone(figure);
|
|
37
|
+
const layout = out.layout ?? {};
|
|
38
|
+
normalizeColors(layout);
|
|
39
|
+
|
|
40
|
+
let migratedMaps = false;
|
|
41
|
+
for (const trace of out.data ?? []) {
|
|
42
|
+
if (!isObject(trace)) continue;
|
|
43
|
+
normalizeColors(trace);
|
|
44
|
+
|
|
45
|
+
const replacement = REMOVED_MAP_TRACES[trace.type as string];
|
|
46
|
+
if (replacement) {
|
|
47
|
+
trace.type = replacement;
|
|
48
|
+
if (typeof trace.subplot === 'string')
|
|
49
|
+
trace.subplot = trace.subplot.replace(MAPBOX_SUBPLOT, 'map$1');
|
|
50
|
+
migratedMaps = true;
|
|
51
|
+
} else if (trace.type === 'splom') {
|
|
52
|
+
keepSplomAxesUnlinked(trace);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (migratedMaps) migrateMapLayout(layout);
|
|
57
|
+
// Frame data replaces trace data during playback, so it needs the same colour fixes.
|
|
58
|
+
for (const frame of out.frames ?? []) if (isObject(frame)) normalizeColors(frame);
|
|
59
|
+
return { ...out, layout };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Plotly 4 links each dimension's x and y axes by default.
|
|
63
|
+
function keepSplomAxesUnlinked(trace: Json) {
|
|
64
|
+
if (!Array.isArray(trace.dimensions)) return;
|
|
65
|
+
for (const dim of trace.dimensions) {
|
|
66
|
+
if (!isObject(dim)) continue;
|
|
67
|
+
const axis = isObject(dim.axis) ? dim.axis : (dim.axis = {});
|
|
68
|
+
if (!('matches' in axis)) axis.matches = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function migrateMapLayout(layout: Json) {
|
|
73
|
+
for (const key of Object.keys(layout)) {
|
|
74
|
+
const match = MAPBOX_SUBPLOT.exec(key);
|
|
75
|
+
if (!match) continue;
|
|
76
|
+
|
|
77
|
+
const map = layout[key];
|
|
78
|
+
delete layout[key];
|
|
79
|
+
const newKey = `map${match[1]}`;
|
|
80
|
+
if (newKey in layout || !isObject(map)) continue;
|
|
81
|
+
|
|
82
|
+
delete map.accesstoken;
|
|
83
|
+
// Stamen and mapbox:// styles have no map equivalent.
|
|
84
|
+
if (typeof map.style === 'string' && /^(stamen|mapbox:\/\/)/.test(map.style))
|
|
85
|
+
map.style = 'open-street-map';
|
|
86
|
+
layout[newKey] = map;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Plotly attributes that hold colours: *color, colorway, colorscale and pie's marker.colors.
|
|
91
|
+
const isColorKey = (key: string) =>
|
|
92
|
+
key.toLowerCase().endsWith('color') ||
|
|
93
|
+
key === 'colors' ||
|
|
94
|
+
key === 'colorway' ||
|
|
95
|
+
key === 'colorscale';
|
|
96
|
+
|
|
97
|
+
function normalizeColors(props: Json) {
|
|
98
|
+
for (const [key, value] of Object.entries(props)) {
|
|
99
|
+
if (isColorKey(key)) props[key] = normalizeColorValue(value, false);
|
|
100
|
+
else if (isObject(value)) normalizeColors(value);
|
|
101
|
+
else if (Array.isArray(value))
|
|
102
|
+
for (const item of value) if (isObject(item)) normalizeColors(item);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Covers a single colour, a per-point list and colorscale stops ([[0, "ff0000"], ...]).
|
|
107
|
+
function normalizeColorValue(value: unknown, inList: boolean): unknown {
|
|
108
|
+
if (Array.isArray(value)) return value.map((v) => normalizeColorValue(v, true));
|
|
109
|
+
if (typeof value !== 'string') return value;
|
|
110
|
+
// Plotly reads numeric strings in a per-point list as numbers for the colorscale.
|
|
111
|
+
if (inList && /^\s*\d+\s*$/.test(value)) return value;
|
|
112
|
+
return normalizePlotlyColor(value);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Rewrites colour spellings Plotly 3 accepted but Plotly 4 rejects (hex without `#`, `hsv()`)
|
|
117
|
+
* into valid CSS. Anything else is returned unchanged.
|
|
118
|
+
*/
|
|
119
|
+
export function normalizePlotlyColor(color: string): string {
|
|
120
|
+
const value = color.trim();
|
|
121
|
+
if (BARE_HEX.test(value)) return `#${value}`;
|
|
122
|
+
|
|
123
|
+
const hsv = HSV_FUNCTION.exec(value);
|
|
124
|
+
if (!hsv) return color;
|
|
125
|
+
|
|
126
|
+
const { r, g, b } = hsvToRgb({
|
|
127
|
+
h: Number(hsv[1]),
|
|
128
|
+
s: unit(hsv[2], hsv[3] === '%'),
|
|
129
|
+
v: unit(hsv[4], hsv[5] === '%')
|
|
130
|
+
});
|
|
131
|
+
const rgb = `${Math.round(r)},${Math.round(g)},${Math.round(b)}`;
|
|
132
|
+
if (hsv[6] === undefined) return `rgb(${rgb})`;
|
|
133
|
+
return `rgba(${rgb},${+unit(hsv[6], hsv[7] === '%').toFixed(3)})`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Plotly 3 (TinyColor) read 0..1 as a fraction and anything above 1 as a percentage.
|
|
137
|
+
function unit(s: string, percent: boolean): number {
|
|
138
|
+
let x = Number(s);
|
|
139
|
+
if (percent || x > 1) x /= 100;
|
|
140
|
+
return Math.min(1, Math.max(0, x));
|
|
141
|
+
}
|
package/src/lib/i18n/messages.ts
CHANGED
|
@@ -40,6 +40,8 @@ export interface ViewerMessages {
|
|
|
40
40
|
lookTechnical: string;
|
|
41
41
|
lookStudio: string;
|
|
42
42
|
lookShowcase: string;
|
|
43
|
+
lookNight: string;
|
|
44
|
+
nightMode: string;
|
|
43
45
|
lookArctic: string;
|
|
44
46
|
lookXray: string;
|
|
45
47
|
lookLineart: string;
|
|
@@ -77,6 +79,10 @@ export interface ViewerMessages {
|
|
|
77
79
|
solveMessagesEscHint: string;
|
|
78
80
|
solveMessagesDismiss: string;
|
|
79
81
|
solveSolving: string;
|
|
82
|
+
/** A visible solve has landed; followed by how long it took. */
|
|
83
|
+
solveDone: string;
|
|
84
|
+
/** A visible solve was aborted; the previous result stays. */
|
|
85
|
+
solveStopped: string;
|
|
80
86
|
parametersTab: string;
|
|
81
87
|
moreTab: string;
|
|
82
88
|
scrollTabsBack: string;
|
|
@@ -131,6 +137,16 @@ export interface ViewerMessages {
|
|
|
131
137
|
/** `{max}` is replaced with the field's character limit. */
|
|
132
138
|
maxLength: string;
|
|
133
139
|
invalidFormat: string;
|
|
140
|
+
/** Trigger label; `{color}` is the current hex value. */
|
|
141
|
+
colorPick: string;
|
|
142
|
+
colorArea: string;
|
|
143
|
+
/** `{s}` and `{v}` are percentages. */
|
|
144
|
+
colorAreaValue: string;
|
|
145
|
+
colorHue: string;
|
|
146
|
+
colorHex: string;
|
|
147
|
+
colorHexInvalid: string;
|
|
148
|
+
colorPresets: string;
|
|
149
|
+
colorEyedropper: string;
|
|
134
150
|
invalidPattern: string;
|
|
135
151
|
|
|
136
152
|
// Geometry input (Rhino only)
|
|
@@ -219,6 +235,7 @@ export interface ViewerMessages {
|
|
|
219
235
|
copied: string;
|
|
220
236
|
chartReceiving: string;
|
|
221
237
|
chartRenderFailed: string;
|
|
238
|
+
downloadChartImage: string;
|
|
222
239
|
/** `{error}` is replaced with the browser's reason. */
|
|
223
240
|
fullscreenUnavailable: string;
|
|
224
241
|
/** `{error}` is replaced with the browser's reason. */
|
|
@@ -268,6 +285,8 @@ const en: ViewerMessages = {
|
|
|
268
285
|
lookTechnical: 'Technical',
|
|
269
286
|
lookStudio: 'Studio',
|
|
270
287
|
lookShowcase: 'Showcase',
|
|
288
|
+
lookNight: 'Night',
|
|
289
|
+
nightMode: 'Night mode',
|
|
271
290
|
lookArctic: 'Arctic',
|
|
272
291
|
lookXray: 'X-Ray',
|
|
273
292
|
lookLineart: 'Line Art',
|
|
@@ -300,6 +319,8 @@ const en: ViewerMessages = {
|
|
|
300
319
|
solveMessagesEscHint: 'Esc aborts the solve',
|
|
301
320
|
solveMessagesDismiss: 'Dismiss',
|
|
302
321
|
solveSolving: 'Solving…',
|
|
322
|
+
solveDone: 'Done',
|
|
323
|
+
solveStopped: 'Stopped',
|
|
303
324
|
parametersTab: 'Parameters',
|
|
304
325
|
moreTab: 'More',
|
|
305
326
|
scrollTabsBack: 'Previous tabs',
|
|
@@ -340,6 +361,14 @@ const en: ViewerMessages = {
|
|
|
340
361
|
fineDragHint: 'Hold Shift to drag finely',
|
|
341
362
|
maxLength: 'Maximum {max} characters allowed',
|
|
342
363
|
invalidFormat: 'Invalid format',
|
|
364
|
+
colorPick: 'Choose color, currently {color}',
|
|
365
|
+
colorArea: 'Saturation and brightness',
|
|
366
|
+
colorAreaValue: 'Saturation {s}%, brightness {v}%',
|
|
367
|
+
colorHue: 'Hue',
|
|
368
|
+
colorHex: 'Hex color',
|
|
369
|
+
colorHexInvalid: 'Enter a hex color such as #2f6fd6',
|
|
370
|
+
colorPresets: 'Presets',
|
|
371
|
+
colorEyedropper: 'Pick a color from the screen',
|
|
343
372
|
invalidPattern: 'Invalid validation pattern configured',
|
|
344
373
|
|
|
345
374
|
geometryPickAnyOne: 'Pick an object',
|
|
@@ -417,6 +446,7 @@ const en: ViewerMessages = {
|
|
|
417
446
|
copied: 'Copied!',
|
|
418
447
|
chartReceiving: 'Receiving chart data...',
|
|
419
448
|
chartRenderFailed: 'Failed to render chart',
|
|
449
|
+
downloadChartImage: 'Download plot as image',
|
|
420
450
|
fullscreenUnavailable: 'Fullscreen unavailable: {error}',
|
|
421
451
|
exitFullscreenFailed: 'Exit fullscreen failed: {error}',
|
|
422
452
|
|
|
@@ -461,6 +491,8 @@ const de: ViewerMessages = {
|
|
|
461
491
|
lookTechnical: 'Technisch',
|
|
462
492
|
lookStudio: 'Studio',
|
|
463
493
|
lookShowcase: 'Präsentation',
|
|
494
|
+
lookNight: 'Nacht',
|
|
495
|
+
nightMode: 'Nachtmodus',
|
|
464
496
|
lookArctic: 'Arktis',
|
|
465
497
|
lookXray: 'Röntgen',
|
|
466
498
|
lookLineart: 'Strichzeichnung',
|
|
@@ -494,6 +526,8 @@ const de: ViewerMessages = {
|
|
|
494
526
|
solveMessagesEscHint: 'Esc bricht die Berechnung ab',
|
|
495
527
|
solveMessagesDismiss: 'Schliessen',
|
|
496
528
|
solveSolving: 'Berechnung läuft…',
|
|
529
|
+
solveDone: 'Fertig',
|
|
530
|
+
solveStopped: 'Abgebrochen',
|
|
497
531
|
parametersTab: 'Parameter',
|
|
498
532
|
moreTab: 'Mehr',
|
|
499
533
|
scrollTabsBack: 'Vorherige Tabs',
|
|
@@ -534,6 +568,14 @@ const de: ViewerMessages = {
|
|
|
534
568
|
fineDragHint: 'Umschalttaste halten für feine Schritte',
|
|
535
569
|
maxLength: 'Höchstens {max} Zeichen erlaubt',
|
|
536
570
|
invalidFormat: 'Ungültiges Format',
|
|
571
|
+
colorPick: 'Farbe wählen, aktuell {color}',
|
|
572
|
+
colorArea: 'Sättigung und Helligkeit',
|
|
573
|
+
colorAreaValue: 'Sättigung {s} %, Helligkeit {v} %',
|
|
574
|
+
colorHue: 'Farbton',
|
|
575
|
+
colorHex: 'Hex-Farbe',
|
|
576
|
+
colorHexInvalid: 'Hex-Farbe eingeben, z. B. #2f6fd6',
|
|
577
|
+
colorPresets: 'Vorgaben',
|
|
578
|
+
colorEyedropper: 'Farbe vom Bildschirm aufnehmen',
|
|
537
579
|
invalidPattern: 'Ungültiges Prüfmuster hinterlegt',
|
|
538
580
|
|
|
539
581
|
geometryPickAnyOne: 'Objekt wählen',
|
|
@@ -612,6 +654,7 @@ const de: ViewerMessages = {
|
|
|
612
654
|
copied: 'Kopiert!',
|
|
613
655
|
chartReceiving: 'Diagrammdaten werden empfangen…',
|
|
614
656
|
chartRenderFailed: 'Diagramm konnte nicht dargestellt werden',
|
|
657
|
+
downloadChartImage: 'Diagramm als Bild herunterladen',
|
|
615
658
|
fullscreenUnavailable: 'Vollbild nicht verfügbar: {error}',
|
|
616
659
|
exitFullscreenFailed: 'Vollbild konnte nicht beendet werden: {error}',
|
|
617
660
|
|
package/src/lib/index.ts
CHANGED
|
@@ -13,12 +13,14 @@ export { default as ErrorScreen } from './components/ErrorScreen.svelte';
|
|
|
13
13
|
// Design-system primitives (shadcn-svelte + custom)
|
|
14
14
|
export * from './components/primitives';
|
|
15
15
|
export { default as StateDisplay } from './components/primitives/StateDisplay.svelte';
|
|
16
|
+
export { default as ColorInput } from './components/preview/inputs/ColorInput.svelte';
|
|
16
17
|
|
|
17
18
|
export { default as Viewer } from './components/viewer/Viewer.svelte';
|
|
18
19
|
|
|
19
20
|
export * from './schema/defaults';
|
|
20
21
|
export * from './schema/dynamic-value-list';
|
|
21
22
|
export * from './schema/traversal';
|
|
23
|
+
export { visibleInputItems } from './schema/visibility-rules';
|
|
22
24
|
export {
|
|
23
25
|
type UIHost,
|
|
24
26
|
type ElementKind,
|
package/src/lib/public.ts
CHANGED
|
@@ -80,6 +80,7 @@ export {
|
|
|
80
80
|
export * from './schema/defaults';
|
|
81
81
|
export * from './schema/traversal';
|
|
82
82
|
export * from './schema/dynamic-value-list';
|
|
83
|
+
export { visibleInputItems } from './schema/visibility-rules';
|
|
83
84
|
|
|
84
85
|
// UI-facing runtime types (not from schema)
|
|
85
86
|
export type { ActionButton } from './types/actionButton';
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
InputLayoutItem,
|
|
2
3
|
LayoutItem,
|
|
3
4
|
OutputLayoutItem,
|
|
4
5
|
VisibilityRule,
|
|
5
6
|
VisibilityCondition,
|
|
6
7
|
GroupVisibilityCondition,
|
|
7
|
-
TabConfig
|
|
8
|
+
TabConfig,
|
|
9
|
+
UISchema
|
|
8
10
|
} from '@selvajs/schemas';
|
|
9
11
|
import { isFileData } from '../utils/file-download';
|
|
10
12
|
|
|
@@ -148,6 +150,30 @@ export function isTabVisible(tab: TabConfig, values: Record<string, unknown>): b
|
|
|
148
150
|
);
|
|
149
151
|
}
|
|
150
152
|
|
|
153
|
+
/**
|
|
154
|
+
* The input items the form shows for these values: each passes its own condition, inside a
|
|
155
|
+
* shown group and, when tabbed, a shown tab. For a host that repeats the form back, such as a
|
|
156
|
+
* summary before a commit, without re-deriving the renderer's rules.
|
|
157
|
+
*/
|
|
158
|
+
export function visibleInputItems(
|
|
159
|
+
schema: UISchema,
|
|
160
|
+
values: Record<string, unknown>
|
|
161
|
+
): InputLayoutItem[] {
|
|
162
|
+
const layout = schema?.layout;
|
|
163
|
+
const groups =
|
|
164
|
+
layout?.type === 'tabbed'
|
|
165
|
+
? (layout.tabs ?? []).filter((t) => isTabVisible(t, values)).flatMap((t) => t.groups ?? [])
|
|
166
|
+
: layout?.type === 'flat'
|
|
167
|
+
? (layout.groups ?? [])
|
|
168
|
+
: [];
|
|
169
|
+
return groups
|
|
170
|
+
.filter((g) => evaluateGroupVisibility(g, values))
|
|
171
|
+
.flatMap((g) => g.items ?? [])
|
|
172
|
+
.filter(
|
|
173
|
+
(i): i is InputLayoutItem => i.type === 'input' && evaluateVisibility(i, values).visible
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
151
177
|
/**
|
|
152
178
|
* A linebreak is always "visible" but renders as a divider only, so a group left with
|
|
153
179
|
* nothing but separators counts as empty.
|
package/src/lib/styles/base.css
CHANGED
|
@@ -1,80 +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;
|
|
9
|
+
--below-header-h: calc(100svh - var(--header-h));
|
|
6
10
|
--page-px: 1rem;
|
|
7
11
|
--page-py: 1.75rem;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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);
|
|
12
16
|
--card: oklch(1 0 0);
|
|
13
|
-
--
|
|
14
|
-
|
|
15
|
-
--
|
|
16
|
-
/*
|
|
17
|
-
|
|
18
|
-
--
|
|
19
|
-
--
|
|
20
|
-
--
|
|
21
|
-
--
|
|
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. */
|
|
22
27
|
--muted-foreground: oklch(0.5 0 0);
|
|
23
|
-
|
|
24
|
-
--
|
|
25
|
-
/*
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
--
|
|
33
|
-
|
|
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;
|
|
34
53
|
--success-foreground: oklch(0.99 0 0);
|
|
35
|
-
--warning:
|
|
54
|
+
--warning: #bd8630;
|
|
36
55
|
--warning-foreground: oklch(0.25 0.04 75);
|
|
37
|
-
--info:
|
|
56
|
+
--info: #5399d1;
|
|
38
57
|
--info-foreground: oklch(0.99 0 0);
|
|
39
58
|
--chart-1: oklch(0.65 0.14 135);
|
|
40
59
|
--chart-2: oklch(0.7 0.11 200);
|
|
41
60
|
--chart-3: oklch(0.6 0.13 260);
|
|
42
61
|
--chart-4: oklch(0.78 0.13 80);
|
|
43
62
|
--chart-5: oklch(0.68 0.15 30);
|
|
44
|
-
--sidebar: oklch(0.96 0 0);
|
|
45
|
-
--sidebar-foreground: oklch(0.25 0 0);
|
|
46
|
-
--sidebar-primary: oklch(0.52 0.07 135);
|
|
47
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
48
|
-
--sidebar-accent: oklch(0.93 0 0);
|
|
49
|
-
--sidebar-accent-foreground: oklch(0.3 0 0);
|
|
50
|
-
--sidebar-border: oklch(0.88 0 0);
|
|
51
|
-
--sidebar-ring: oklch(0.55 0 0);
|
|
52
|
-
--inputparam: oklch(1 0 0);
|
|
53
|
-
--outputparam: oklch(1 0 0);
|
|
54
63
|
/* Scrim behind modal dialogs and drawers. */
|
|
55
64
|
--overlay: oklch(0 0 0 / 50%);
|
|
56
65
|
}
|
|
57
66
|
|
|
58
67
|
.dark {
|
|
59
|
-
--background: oklch(0.
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--
|
|
63
|
-
--
|
|
64
|
-
--
|
|
65
|
-
--
|
|
66
|
-
--
|
|
67
|
-
--
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
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. */
|
|
73
91
|
--destructive: oklch(0.7 0.17 22);
|
|
74
|
-
--destructive-foreground: oklch(0.
|
|
75
|
-
--border: oklch(1 0 0 / 14%);
|
|
76
|
-
--input: oklch(1 0 0 / 36%);
|
|
77
|
-
--ring: oklch(0.74 0 0);
|
|
92
|
+
--destructive-foreground: oklch(0.18 0 0);
|
|
78
93
|
--success: oklch(0.74 0.15 145);
|
|
79
94
|
--success-foreground: oklch(0.18 0.03 145);
|
|
80
95
|
--warning: oklch(0.8 0.14 75);
|
|
@@ -86,41 +101,39 @@
|
|
|
86
101
|
--chart-3: oklch(0.68 0.14 260);
|
|
87
102
|
--chart-4: oklch(0.78 0.14 80);
|
|
88
103
|
--chart-5: oklch(0.7 0.16 30);
|
|
89
|
-
--sidebar: oklch(0.21 0 0);
|
|
90
|
-
--sidebar-foreground: oklch(0.96 0 0);
|
|
91
|
-
--sidebar-primary: oklch(0.74 0.07 135);
|
|
92
|
-
--sidebar-primary-foreground: oklch(0.18 0 0);
|
|
93
|
-
--sidebar-accent: oklch(0.32 0 0);
|
|
94
|
-
--sidebar-accent-foreground: oklch(0.92 0 0);
|
|
95
|
-
--sidebar-border: oklch(1 0 0 / 10%);
|
|
96
|
-
--sidebar-ring: oklch(0.74 0 0);
|
|
97
|
-
--inputparam: oklch(0.15 0 0);
|
|
98
|
-
--outputparam: oklch(0.25 0 0);
|
|
99
104
|
}
|
|
100
105
|
|
|
101
106
|
@theme inline {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
--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;
|
|
106
115
|
--color-background: var(--background);
|
|
107
116
|
--color-foreground: var(--foreground);
|
|
108
117
|
--color-card: var(--card);
|
|
109
118
|
--color-card-foreground: var(--card-foreground);
|
|
110
|
-
--color-
|
|
119
|
+
--color-raised: var(--raised);
|
|
120
|
+
--color-popover: var(--raised);
|
|
111
121
|
--color-popover-foreground: var(--popover-foreground);
|
|
112
|
-
--color-
|
|
113
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
114
|
-
--color-secondary: var(--secondary);
|
|
115
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
122
|
+
--color-field: var(--field);
|
|
116
123
|
--color-muted: var(--muted);
|
|
117
124
|
--color-muted-foreground: var(--muted-foreground);
|
|
118
|
-
--color-
|
|
119
|
-
--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);
|
|
120
132
|
--color-destructive: var(--destructive);
|
|
121
133
|
--color-destructive-foreground: var(--destructive-foreground);
|
|
122
134
|
--color-overlay: var(--overlay);
|
|
123
135
|
--color-border: var(--border);
|
|
136
|
+
--color-border-strong: var(--border-strong);
|
|
124
137
|
--color-input: var(--input);
|
|
125
138
|
--color-ring: var(--ring);
|
|
126
139
|
--color-success: var(--success);
|
|
@@ -134,21 +147,15 @@
|
|
|
134
147
|
--color-chart-3: var(--chart-3);
|
|
135
148
|
--color-chart-4: var(--chart-4);
|
|
136
149
|
--color-chart-5: var(--chart-5);
|
|
137
|
-
--
|
|
138
|
-
--
|
|
139
|
-
--color-sidebar-primary: var(--sidebar-primary);
|
|
140
|
-
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
141
|
-
--color-sidebar-accent: var(--sidebar-accent);
|
|
142
|
-
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
143
|
-
--color-sidebar-border: var(--sidebar-border);
|
|
144
|
-
--color-sidebar-ring: var(--sidebar-ring);
|
|
145
|
-
--color-inputparam: var(--inputparam);
|
|
146
|
-
--color-outputparam: var(--outputparam);
|
|
150
|
+
--shadow-raised: var(--elevation-raised);
|
|
151
|
+
--shadow-popover: var(--elevation-popover);
|
|
147
152
|
}
|
|
148
153
|
|
|
149
154
|
/* Design tokens beyond Tailwind's defaults. Reach for these before an arbitrary value: the
|
|
150
155
|
design-system lint rejects `text-[10px]`, `max-h-[85dvh]` and the like. */
|
|
151
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;
|
|
152
159
|
/* Type tags, counters and other dense labels. */
|
|
153
160
|
--text-2xs: 0.625rem;
|
|
154
161
|
--text-2xs--line-height: calc(0.875 / 0.625);
|