@selvajs/ui 0.9.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/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/components/ErrorScreen.svelte +53 -0
- package/dist/components/ErrorScreen.svelte.d.ts +9 -0
- package/dist/components/compute/AppLayout.svelte +470 -0
- package/dist/components/compute/AppLayout.svelte.d.ts +23 -0
- package/dist/components/compute/CollapsedPanelStrip.svelte +64 -0
- package/dist/components/compute/CollapsedPanelStrip.svelte.d.ts +11 -0
- package/dist/components/compute/ComputeApp.svelte +243 -0
- package/dist/components/compute/ComputeApp.svelte.d.ts +29 -0
- package/dist/components/compute/ComputeMessages.svelte +169 -0
- package/dist/components/compute/ComputeMessages.svelte.d.ts +7 -0
- package/dist/components/compute/ParameterPresetManager.svelte +326 -0
- package/dist/components/compute/ParameterPresetManager.svelte.d.ts +13 -0
- package/dist/components/compute/index.d.ts +5 -0
- package/dist/components/compute/index.js +5 -0
- package/dist/components/layout/AppShell.svelte +110 -0
- package/dist/components/layout/AppShell.svelte.d.ts +24 -0
- package/dist/components/layout/EmptyState.svelte +48 -0
- package/dist/components/layout/EmptyState.svelte.d.ts +15 -0
- package/dist/components/layout/FooterItemRenderer.svelte +20 -0
- package/dist/components/layout/FooterItemRenderer.svelte.d.ts +7 -0
- package/dist/components/layout/PageContent.svelte +12 -0
- package/dist/components/layout/PageContent.svelte.d.ts +7 -0
- package/dist/components/layout/PageFooter.svelte +222 -0
- package/dist/components/layout/PageFooter.svelte.d.ts +9 -0
- package/dist/components/layout/PageHeader.svelte +67 -0
- package/dist/components/layout/PageHeader.svelte.d.ts +14 -0
- package/dist/components/layout/SectionHeader.svelte +38 -0
- package/dist/components/layout/SectionHeader.svelte.d.ts +11 -0
- package/dist/components/layout/SideNav.svelte +82 -0
- package/dist/components/layout/SideNav.svelte.d.ts +19 -0
- package/dist/components/layout/SubNav.svelte +45 -0
- package/dist/components/layout/SubNav.svelte.d.ts +14 -0
- package/dist/components/layout/index.d.ts +10 -0
- package/dist/components/layout/index.js +9 -0
- package/dist/components/preview/ChartOutput.svelte +222 -0
- package/dist/components/preview/ChartOutput.svelte.d.ts +8 -0
- package/dist/components/preview/Group.svelte +134 -0
- package/dist/components/preview/Group.svelte.d.ts +25 -0
- package/dist/components/preview/ImageOutput.svelte +156 -0
- package/dist/components/preview/ImageOutput.svelte.d.ts +8 -0
- package/dist/components/preview/InputControl.svelte +130 -0
- package/dist/components/preview/InputControl.svelte.d.ts +11 -0
- package/dist/components/preview/OutputDisplay.svelte +297 -0
- package/dist/components/preview/OutputDisplay.svelte.d.ts +9 -0
- package/dist/components/preview/TabBar.svelte +36 -0
- package/dist/components/preview/TabBar.svelte.d.ts +8 -0
- package/dist/components/preview/TabContent.svelte +125 -0
- package/dist/components/preview/TabContent.svelte.d.ts +13 -0
- package/dist/components/preview/TabLayout.svelte +109 -0
- package/dist/components/preview/TabLayout.svelte.d.ts +13 -0
- package/dist/components/preview/index.d.ts +3 -0
- package/dist/components/preview/index.js +4 -0
- package/dist/components/preview/inputs/CheckboxInput.svelte +29 -0
- package/dist/components/preview/inputs/CheckboxInput.svelte.d.ts +10 -0
- package/dist/components/preview/inputs/ChecklistInput.svelte +50 -0
- package/dist/components/preview/inputs/ChecklistInput.svelte.d.ts +11 -0
- package/dist/components/preview/inputs/ColorInput.svelte +21 -0
- package/dist/components/preview/inputs/ColorInput.svelte.d.ts +7 -0
- package/dist/components/preview/inputs/DropdownInput.svelte +40 -0
- package/dist/components/preview/inputs/DropdownInput.svelte.d.ts +10 -0
- package/dist/components/preview/inputs/FileInput.svelte +368 -0
- package/dist/components/preview/inputs/FileInput.svelte.d.ts +10 -0
- package/dist/components/preview/inputs/NumberInput.svelte +152 -0
- package/dist/components/preview/inputs/NumberInput.svelte.d.ts +11 -0
- package/dist/components/preview/inputs/TextInput.svelte +74 -0
- package/dist/components/preview/inputs/TextInput.svelte.d.ts +11 -0
- package/dist/components/preview/inputs/index.d.ts +7 -0
- package/dist/components/preview/inputs/index.js +7 -0
- package/dist/components/primitives/CalculateButton.svelte +40 -0
- package/dist/components/primitives/CalculateButton.svelte.d.ts +9 -0
- package/dist/components/primitives/DataTable.svelte +39 -0
- package/dist/components/primitives/DataTable.svelte.d.ts +36 -0
- package/dist/components/primitives/ImageUploadField.svelte +84 -0
- package/dist/components/primitives/ImageUploadField.svelte.d.ts +15 -0
- package/dist/components/primitives/SolvingIndicator.svelte +54 -0
- package/dist/components/primitives/SolvingIndicator.svelte.d.ts +6 -0
- package/dist/components/primitives/StateDisplay.svelte +106 -0
- package/dist/components/primitives/StateDisplay.svelte.d.ts +10 -0
- package/dist/components/primitives/ViewToggle.svelte +47 -0
- package/dist/components/primitives/ViewToggle.svelte.d.ts +9 -0
- package/dist/components/primitives/alert/alert-description.svelte +23 -0
- package/dist/components/primitives/alert/alert-description.svelte.d.ts +5 -0
- package/dist/components/primitives/alert/alert-title.svelte +20 -0
- package/dist/components/primitives/alert/alert-title.svelte.d.ts +5 -0
- package/dist/components/primitives/alert/alert.svelte +44 -0
- package/dist/components/primitives/alert/alert.svelte.d.ts +26 -0
- package/dist/components/primitives/alert/index.d.ts +5 -0
- package/dist/components/primitives/alert/index.js +7 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte +18 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-action.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-cancel.svelte +18 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-cancel.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +27 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte.d.ts +8 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-description.svelte +17 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-description.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-footer.svelte +20 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-footer.svelte.d.ts +5 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-header.svelte +20 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-header.svelte.d.ts +5 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte +20 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-title.svelte +17 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-title.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-trigger.svelte +7 -0
- package/dist/components/primitives/alert-dialog/alert-dialog-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/alert-dialog/index.d.ts +12 -0
- package/dist/components/primitives/alert-dialog/index.js +15 -0
- package/dist/components/primitives/badge/badge.svelte +49 -0
- package/dist/components/primitives/badge/badge.svelte.d.ts +32 -0
- package/dist/components/primitives/badge/index.d.ts +2 -0
- package/dist/components/primitives/badge/index.js +2 -0
- package/dist/components/primitives/button/button.svelte +83 -0
- package/dist/components/primitives/button/button.svelte.d.ts +67 -0
- package/dist/components/primitives/button/index.d.ts +2 -0
- package/dist/components/primitives/button/index.js +4 -0
- package/dist/components/primitives/button-group/button-group-separator.svelte +20 -0
- package/dist/components/primitives/button-group/button-group-separator.svelte.d.ts +13 -0
- package/dist/components/primitives/button-group/button-group-text.svelte +30 -0
- package/dist/components/primitives/button-group/button-group-text.svelte.d.ts +11 -0
- package/dist/components/primitives/button-group/button-group.svelte +46 -0
- package/dist/components/primitives/button-group/button-group.svelte.d.ts +26 -0
- package/dist/components/primitives/button-group/index.d.ts +4 -0
- package/dist/components/primitives/button-group/index.js +6 -0
- package/dist/components/primitives/card/card-action.svelte +20 -0
- package/dist/components/primitives/card/card-action.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card-content.svelte +15 -0
- package/dist/components/primitives/card/card-content.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card-description.svelte +20 -0
- package/dist/components/primitives/card/card-description.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card-footer.svelte +20 -0
- package/dist/components/primitives/card/card-footer.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card-header.svelte +23 -0
- package/dist/components/primitives/card/card-header.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card-title.svelte +20 -0
- package/dist/components/primitives/card/card-title.svelte.d.ts +5 -0
- package/dist/components/primitives/card/card.svelte +23 -0
- package/dist/components/primitives/card/card.svelte.d.ts +5 -0
- package/dist/components/primitives/card/index.d.ts +8 -0
- package/dist/components/primitives/card/index.js +10 -0
- package/dist/components/primitives/checkbox/checkbox.svelte +36 -0
- package/dist/components/primitives/checkbox/checkbox.svelte.d.ts +4 -0
- package/dist/components/primitives/checkbox/index.d.ts +2 -0
- package/dist/components/primitives/checkbox/index.js +4 -0
- package/dist/components/primitives/collapsible/collapsible-content.svelte +7 -0
- package/dist/components/primitives/collapsible/collapsible-content.svelte.d.ts +4 -0
- package/dist/components/primitives/collapsible/collapsible-trigger.svelte +7 -0
- package/dist/components/primitives/collapsible/collapsible-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/collapsible/collapsible.svelte +11 -0
- package/dist/components/primitives/collapsible/collapsible.svelte.d.ts +4 -0
- package/dist/components/primitives/collapsible/index.d.ts +4 -0
- package/dist/components/primitives/collapsible/index.js +6 -0
- package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +38 -0
- package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte.d.ts +9 -0
- package/dist/components/primitives/context-menu/context-menu-content.svelte +25 -0
- package/dist/components/primitives/context-menu/context-menu-content.svelte.d.ts +7 -0
- package/dist/components/primitives/context-menu/context-menu-group-heading.svelte +21 -0
- package/dist/components/primitives/context-menu/context-menu-group-heading.svelte.d.ts +7 -0
- package/dist/components/primitives/context-menu/context-menu-group.svelte +7 -0
- package/dist/components/primitives/context-menu/context-menu-group.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/context-menu-item.svelte +27 -0
- package/dist/components/primitives/context-menu/context-menu-item.svelte.d.ts +8 -0
- package/dist/components/primitives/context-menu/context-menu-label.svelte +24 -0
- package/dist/components/primitives/context-menu/context-menu-label.svelte.d.ts +8 -0
- package/dist/components/primitives/context-menu/context-menu-radio-group.svelte +16 -0
- package/dist/components/primitives/context-menu/context-menu-radio-group.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +31 -0
- package/dist/components/primitives/context-menu/context-menu-radio-item.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/context-menu-separator.svelte +17 -0
- package/dist/components/primitives/context-menu/context-menu-separator.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/context-menu-shortcut.svelte +20 -0
- package/dist/components/primitives/context-menu/context-menu-shortcut.svelte.d.ts +5 -0
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +20 -0
- package/dist/components/primitives/context-menu/context-menu-sub-content.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +29 -0
- package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte.d.ts +8 -0
- package/dist/components/primitives/context-menu/context-menu-trigger.svelte +7 -0
- package/dist/components/primitives/context-menu/context-menu-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/context-menu/index.d.ts +16 -0
- package/dist/components/primitives/context-menu/index.js +19 -0
- package/dist/components/primitives/dialog/dialog-close.svelte +7 -0
- package/dist/components/primitives/dialog/dialog-close.svelte.d.ts +4 -0
- package/dist/components/primitives/dialog/dialog-content.svelte +43 -0
- package/dist/components/primitives/dialog/dialog-content.svelte.d.ts +11 -0
- package/dist/components/primitives/dialog/dialog-description.svelte +17 -0
- package/dist/components/primitives/dialog/dialog-description.svelte.d.ts +4 -0
- package/dist/components/primitives/dialog/dialog-footer.svelte +20 -0
- package/dist/components/primitives/dialog/dialog-footer.svelte.d.ts +5 -0
- package/dist/components/primitives/dialog/dialog-header.svelte +20 -0
- package/dist/components/primitives/dialog/dialog-header.svelte.d.ts +5 -0
- package/dist/components/primitives/dialog/dialog-overlay.svelte +20 -0
- package/dist/components/primitives/dialog/dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/primitives/dialog/dialog-title.svelte +17 -0
- package/dist/components/primitives/dialog/dialog-title.svelte.d.ts +4 -0
- package/dist/components/primitives/dialog/dialog-trigger.svelte +7 -0
- package/dist/components/primitives/dialog/dialog-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/dialog/index.d.ts +11 -0
- package/dist/components/primitives/dialog/index.js +14 -0
- package/dist/components/primitives/drawer/Drawer.svelte +32 -0
- package/dist/components/primitives/drawer/Drawer.svelte.d.ts +10 -0
- package/dist/components/primitives/drawer/index.d.ts +1 -0
- package/dist/components/primitives/drawer/index.js +1 -0
- package/dist/components/primitives/field/field-content.svelte +20 -0
- package/dist/components/primitives/field/field-content.svelte.d.ts +5 -0
- package/dist/components/primitives/field/field-description.svelte +25 -0
- package/dist/components/primitives/field/field-description.svelte.d.ts +5 -0
- package/dist/components/primitives/field/field-error.svelte +58 -0
- package/dist/components/primitives/field/field-error.svelte.d.ts +12 -0
- package/dist/components/primitives/field/field-group.svelte +23 -0
- package/dist/components/primitives/field/field-group.svelte.d.ts +5 -0
- package/dist/components/primitives/field/field-label.svelte +26 -0
- package/dist/components/primitives/field/field-label.svelte.d.ts +10 -0
- package/dist/components/primitives/field/field-legend.svelte +29 -0
- package/dist/components/primitives/field/field-legend.svelte.d.ts +8 -0
- package/dist/components/primitives/field/field-separator.svelte +35 -0
- package/dist/components/primitives/field/field-separator.svelte.d.ts +9 -0
- package/dist/components/primitives/field/field-set.svelte +24 -0
- package/dist/components/primitives/field/field-set.svelte.d.ts +5 -0
- package/dist/components/primitives/field/field-title.svelte +23 -0
- package/dist/components/primitives/field/field-title.svelte.d.ts +5 -0
- package/dist/components/primitives/field/field.svelte +53 -0
- package/dist/components/primitives/field/field.svelte.d.ts +29 -0
- package/dist/components/primitives/field/index.d.ts +11 -0
- package/dist/components/primitives/field/index.js +13 -0
- package/dist/components/primitives/index.d.ts +29 -0
- package/dist/components/primitives/index.js +32 -0
- package/dist/components/primitives/input/index.d.ts +2 -0
- package/dist/components/primitives/input/index.js +4 -0
- package/dist/components/primitives/input/input.svelte +52 -0
- package/dist/components/primitives/input/input.svelte.d.ts +13 -0
- package/dist/components/primitives/label/index.d.ts +2 -0
- package/dist/components/primitives/label/index.js +4 -0
- package/dist/components/primitives/label/label.svelte +20 -0
- package/dist/components/primitives/label/label.svelte.d.ts +4 -0
- package/dist/components/primitives/mode-toggle/index.d.ts +1 -0
- package/dist/components/primitives/mode-toggle/index.js +1 -0
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte +16 -0
- package/dist/components/primitives/mode-toggle/mode-toggle.svelte.d.ts +18 -0
- package/dist/components/primitives/resizable/index.d.ts +4 -0
- package/dist/components/primitives/resizable/index.js +6 -0
- package/dist/components/primitives/resizable/resizable-handle.svelte +27 -0
- package/dist/components/primitives/resizable/resizable-handle.svelte.d.ts +8 -0
- package/dist/components/primitives/resizable/resizable-pane-group.svelte +24 -0
- package/dist/components/primitives/resizable/resizable-pane-group.svelte.d.ts +7 -0
- package/dist/components/primitives/scroll-area/index.d.ts +3 -0
- package/dist/components/primitives/scroll-area/index.js +5 -0
- package/dist/components/primitives/scroll-area/scroll-area-scrollbar.svelte +31 -0
- package/dist/components/primitives/scroll-area/scroll-area-scrollbar.svelte.d.ts +4 -0
- package/dist/components/primitives/scroll-area/scroll-area.svelte +43 -0
- package/dist/components/primitives/scroll-area/scroll-area.svelte.d.ts +11 -0
- package/dist/components/primitives/search/index.d.ts +2 -0
- package/dist/components/primitives/search/index.js +4 -0
- package/dist/components/primitives/search/search.svelte +79 -0
- package/dist/components/primitives/search/search.svelte.d.ts +13 -0
- package/dist/components/primitives/select/index.d.ts +11 -0
- package/dist/components/primitives/select/index.js +14 -0
- package/dist/components/primitives/select/select-content.svelte +40 -0
- package/dist/components/primitives/select/select-content.svelte.d.ts +8 -0
- package/dist/components/primitives/select/select-group-heading.svelte +21 -0
- package/dist/components/primitives/select/select-group-heading.svelte.d.ts +10 -0
- package/dist/components/primitives/select/select-group.svelte +7 -0
- package/dist/components/primitives/select/select-group.svelte.d.ts +4 -0
- package/dist/components/primitives/select/select-item.svelte +38 -0
- package/dist/components/primitives/select/select-item.svelte.d.ts +4 -0
- package/dist/components/primitives/select/select-label.svelte +20 -0
- package/dist/components/primitives/select/select-label.svelte.d.ts +6 -0
- package/dist/components/primitives/select/select-scroll-down-button.svelte +20 -0
- package/dist/components/primitives/select/select-scroll-down-button.svelte.d.ts +4 -0
- package/dist/components/primitives/select/select-scroll-up-button.svelte +20 -0
- package/dist/components/primitives/select/select-scroll-up-button.svelte.d.ts +4 -0
- package/dist/components/primitives/select/select-separator.svelte +18 -0
- package/dist/components/primitives/select/select-separator.svelte.d.ts +4 -0
- package/dist/components/primitives/select/select-trigger.svelte +29 -0
- package/dist/components/primitives/select/select-trigger.svelte.d.ts +8 -0
- package/dist/components/primitives/separator/index.d.ts +2 -0
- package/dist/components/primitives/separator/index.js +4 -0
- package/dist/components/primitives/separator/separator.svelte +21 -0
- package/dist/components/primitives/separator/separator.svelte.d.ts +4 -0
- package/dist/components/primitives/slider/index.d.ts +2 -0
- package/dist/components/primitives/slider/index.js +4 -0
- package/dist/components/primitives/slider/slider.svelte +52 -0
- package/dist/components/primitives/slider/slider.svelte.d.ts +5 -0
- package/dist/components/primitives/sonner/index.d.ts +2 -0
- package/dist/components/primitives/sonner/index.js +2 -0
- package/dist/components/primitives/sonner/sonner.svelte +13 -0
- package/dist/components/primitives/sonner/sonner.svelte.d.ts +4 -0
- package/dist/components/primitives/switch/index.d.ts +2 -0
- package/dist/components/primitives/switch/index.js +4 -0
- package/dist/components/primitives/switch/switch.svelte +29 -0
- package/dist/components/primitives/switch/switch.svelte.d.ts +4 -0
- package/dist/components/primitives/tabs/index.d.ts +5 -0
- package/dist/components/primitives/tabs/index.js +7 -0
- package/dist/components/primitives/tabs/tabs-content.svelte +17 -0
- package/dist/components/primitives/tabs/tabs-content.svelte.d.ts +4 -0
- package/dist/components/primitives/tabs/tabs-list.svelte +16 -0
- package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +4 -0
- package/dist/components/primitives/tabs/tabs-trigger.svelte +20 -0
- package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +4 -0
- package/dist/components/primitives/tabs/tabs.svelte +19 -0
- package/dist/components/primitives/tabs/tabs.svelte.d.ts +4 -0
- package/dist/components/primitives/textarea/index.d.ts +2 -0
- package/dist/components/primitives/textarea/index.js +4 -0
- package/dist/components/primitives/textarea/textarea.svelte +23 -0
- package/dist/components/primitives/textarea/textarea.svelte.d.ts +5 -0
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +39 -0
- package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +3 -0
- package/dist/components/primitives/theme-switcher/index.d.ts +1 -0
- package/dist/components/primitives/theme-switcher/index.js +1 -0
- package/dist/components/viewer/MeshMetadataDialog.svelte +122 -0
- package/dist/components/viewer/MeshMetadataDialog.svelte.d.ts +10 -0
- package/dist/components/viewer/SceneManager.svelte +297 -0
- package/dist/components/viewer/SceneManager.svelte.d.ts +8 -0
- package/dist/components/viewer/Viewer.svelte +311 -0
- package/dist/components/viewer/Viewer.svelte.d.ts +18 -0
- package/dist/components/viewer/index.d.ts +3 -0
- package/dist/components/viewer/index.js +3 -0
- package/dist/composables/useFooterItem.svelte.d.ts +15 -0
- package/dist/composables/useFooterItem.svelte.js +33 -0
- package/dist/compute/computeThrottle.svelte.d.ts +24 -0
- package/dist/compute/computeThrottle.svelte.js +70 -0
- package/dist/compute/solving.svelte.d.ts +12 -0
- package/dist/compute/solving.svelte.js +68 -0
- package/dist/constants.d.ts +28 -0
- package/dist/constants.js +32 -0
- package/dist/contexts/footerContext.svelte.d.ts +18 -0
- package/dist/contexts/footerContext.svelte.js +24 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +20 -0
- package/dist/schema/defaults.d.ts +1 -0
- package/dist/schema/defaults.js +13 -0
- package/dist/schema/param-exporter.d.ts +15 -0
- package/dist/schema/param-exporter.js +120 -0
- package/dist/schema/visibility-rules.d.ts +12 -0
- package/dist/schema/visibility-rules.js +63 -0
- package/dist/styles/base.css +145 -0
- package/dist/styles/themes/cyberpunk.css +98 -0
- package/dist/styles/themes/neutral.css +72 -0
- package/dist/styles/themes/ocean.css +75 -0
- package/dist/styles/themes/selva.css +105 -0
- package/dist/theme/themeStore.svelte.d.ts +12 -0
- package/dist/theme/themeStore.svelte.js +40 -0
- package/dist/theme/themes.d.ts +5 -0
- package/dist/theme/themes.js +13 -0
- package/dist/types/actionButton.d.ts +33 -0
- package/dist/types/actionButton.js +1 -0
- package/dist/types/solveFn.d.ts +26 -0
- package/dist/types/solveFn.js +1 -0
- package/dist/utils/color.d.ts +1 -0
- package/dist/utils/color.js +38 -0
- package/dist/utils/debounce.d.ts +14 -0
- package/dist/utils/debounce.js +30 -0
- package/dist/utils/file-download.d.ts +22 -0
- package/dist/utils/file-download.js +93 -0
- package/dist/utils/loadScript.d.ts +14 -0
- package/dist/utils/loadScript.js +38 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.js +5 -0
- package/package.json +100 -0
- package/src/lib/components/ErrorScreen.svelte +53 -0
- package/src/lib/components/compute/AppLayout.svelte +470 -0
- package/src/lib/components/compute/CollapsedPanelStrip.svelte +64 -0
- package/src/lib/components/compute/ComputeApp.svelte +243 -0
- package/src/lib/components/compute/ComputeMessages.svelte +169 -0
- package/src/lib/components/compute/ParameterPresetManager.svelte +326 -0
- package/src/lib/components/compute/index.ts +5 -0
- package/src/lib/components/layout/AppShell.svelte +110 -0
- package/src/lib/components/layout/EmptyState.svelte +48 -0
- package/src/lib/components/layout/FooterItemRenderer.svelte +20 -0
- package/src/lib/components/layout/PageContent.svelte +12 -0
- package/src/lib/components/layout/PageFooter.svelte +222 -0
- package/src/lib/components/layout/PageHeader.svelte +67 -0
- package/src/lib/components/layout/SectionHeader.svelte +38 -0
- package/src/lib/components/layout/SideNav.svelte +82 -0
- package/src/lib/components/layout/SubNav.svelte +45 -0
- package/src/lib/components/layout/index.ts +11 -0
- package/src/lib/components/preview/ChartOutput.svelte +222 -0
- package/src/lib/components/preview/Group.svelte +134 -0
- package/src/lib/components/preview/ImageOutput.svelte +156 -0
- package/src/lib/components/preview/InputControl.svelte +130 -0
- package/src/lib/components/preview/OutputDisplay.svelte +297 -0
- package/src/lib/components/preview/TabBar.svelte +36 -0
- package/src/lib/components/preview/TabContent.svelte +125 -0
- package/src/lib/components/preview/TabLayout.svelte +109 -0
- package/src/lib/components/preview/index.ts +4 -0
- package/src/lib/components/preview/inputs/CheckboxInput.svelte +29 -0
- package/src/lib/components/preview/inputs/ChecklistInput.svelte +50 -0
- package/src/lib/components/preview/inputs/ColorInput.svelte +21 -0
- package/src/lib/components/preview/inputs/DropdownInput.svelte +40 -0
- package/src/lib/components/preview/inputs/FileInput.svelte +368 -0
- package/src/lib/components/preview/inputs/NumberInput.svelte +152 -0
- package/src/lib/components/preview/inputs/TextInput.svelte +74 -0
- package/src/lib/components/preview/inputs/index.ts +7 -0
- package/src/lib/components/primitives/CalculateButton.svelte +40 -0
- package/src/lib/components/primitives/DataTable.svelte +39 -0
- package/src/lib/components/primitives/ImageUploadField.svelte +84 -0
- package/src/lib/components/primitives/SolvingIndicator.svelte +54 -0
- package/src/lib/components/primitives/StateDisplay.svelte +106 -0
- package/src/lib/components/primitives/ViewToggle.svelte +47 -0
- package/src/lib/components/primitives/alert/alert-description.svelte +23 -0
- package/src/lib/components/primitives/alert/alert-title.svelte +20 -0
- package/src/lib/components/primitives/alert/alert.svelte +44 -0
- package/src/lib/components/primitives/alert/index.ts +14 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-action.svelte +18 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-cancel.svelte +18 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +27 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-description.svelte +17 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-footer.svelte +20 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-header.svelte +20 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-overlay.svelte +20 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-title.svelte +17 -0
- package/src/lib/components/primitives/alert-dialog/alert-dialog-trigger.svelte +7 -0
- package/src/lib/components/primitives/alert-dialog/index.ts +39 -0
- package/src/lib/components/primitives/badge/badge.svelte +49 -0
- package/src/lib/components/primitives/badge/index.ts +2 -0
- package/src/lib/components/primitives/button/button.svelte +83 -0
- package/src/lib/components/primitives/button/index.ts +17 -0
- package/src/lib/components/primitives/button-group/button-group-separator.svelte +20 -0
- package/src/lib/components/primitives/button-group/button-group-text.svelte +30 -0
- package/src/lib/components/primitives/button-group/button-group.svelte +46 -0
- package/src/lib/components/primitives/button-group/index.ts +13 -0
- package/src/lib/components/primitives/card/card-action.svelte +20 -0
- package/src/lib/components/primitives/card/card-content.svelte +15 -0
- package/src/lib/components/primitives/card/card-description.svelte +20 -0
- package/src/lib/components/primitives/card/card-footer.svelte +20 -0
- package/src/lib/components/primitives/card/card-header.svelte +23 -0
- package/src/lib/components/primitives/card/card-title.svelte +20 -0
- package/src/lib/components/primitives/card/card.svelte +23 -0
- package/src/lib/components/primitives/card/index.ts +25 -0
- package/src/lib/components/primitives/checkbox/checkbox.svelte +36 -0
- package/src/lib/components/primitives/checkbox/index.ts +6 -0
- package/src/lib/components/primitives/collapsible/collapsible-content.svelte +7 -0
- package/src/lib/components/primitives/collapsible/collapsible-trigger.svelte +7 -0
- package/src/lib/components/primitives/collapsible/collapsible.svelte +11 -0
- package/src/lib/components/primitives/collapsible/index.ts +13 -0
- package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +38 -0
- package/src/lib/components/primitives/context-menu/context-menu-content.svelte +25 -0
- package/src/lib/components/primitives/context-menu/context-menu-group-heading.svelte +21 -0
- package/src/lib/components/primitives/context-menu/context-menu-group.svelte +7 -0
- package/src/lib/components/primitives/context-menu/context-menu-item.svelte +27 -0
- package/src/lib/components/primitives/context-menu/context-menu-label.svelte +24 -0
- package/src/lib/components/primitives/context-menu/context-menu-radio-group.svelte +16 -0
- package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +31 -0
- package/src/lib/components/primitives/context-menu/context-menu-separator.svelte +17 -0
- package/src/lib/components/primitives/context-menu/context-menu-shortcut.svelte +20 -0
- package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +20 -0
- package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +29 -0
- package/src/lib/components/primitives/context-menu/context-menu-trigger.svelte +7 -0
- package/src/lib/components/primitives/context-menu/index.ts +51 -0
- package/src/lib/components/primitives/dialog/dialog-close.svelte +7 -0
- package/src/lib/components/primitives/dialog/dialog-content.svelte +43 -0
- package/src/lib/components/primitives/dialog/dialog-description.svelte +17 -0
- package/src/lib/components/primitives/dialog/dialog-footer.svelte +20 -0
- package/src/lib/components/primitives/dialog/dialog-header.svelte +20 -0
- package/src/lib/components/primitives/dialog/dialog-overlay.svelte +20 -0
- package/src/lib/components/primitives/dialog/dialog-title.svelte +17 -0
- package/src/lib/components/primitives/dialog/dialog-trigger.svelte +7 -0
- package/src/lib/components/primitives/dialog/index.ts +37 -0
- package/src/lib/components/primitives/drawer/Drawer.svelte +32 -0
- package/src/lib/components/primitives/drawer/index.ts +1 -0
- package/src/lib/components/primitives/field/field-content.svelte +20 -0
- package/src/lib/components/primitives/field/field-description.svelte +25 -0
- package/src/lib/components/primitives/field/field-error.svelte +58 -0
- package/src/lib/components/primitives/field/field-group.svelte +23 -0
- package/src/lib/components/primitives/field/field-label.svelte +26 -0
- package/src/lib/components/primitives/field/field-legend.svelte +29 -0
- package/src/lib/components/primitives/field/field-separator.svelte +35 -0
- package/src/lib/components/primitives/field/field-set.svelte +24 -0
- package/src/lib/components/primitives/field/field-title.svelte +23 -0
- package/src/lib/components/primitives/field/field.svelte +53 -0
- package/src/lib/components/primitives/field/index.ts +33 -0
- package/src/lib/components/primitives/index.ts +41 -0
- package/src/lib/components/primitives/input/index.ts +7 -0
- package/src/lib/components/primitives/input/input.svelte +52 -0
- package/src/lib/components/primitives/label/index.ts +7 -0
- package/src/lib/components/primitives/label/label.svelte +20 -0
- package/src/lib/components/primitives/mode-toggle/index.ts +1 -0
- package/src/lib/components/primitives/mode-toggle/mode-toggle.svelte +16 -0
- package/src/lib/components/primitives/resizable/index.ts +13 -0
- package/src/lib/components/primitives/resizable/resizable-handle.svelte +27 -0
- package/src/lib/components/primitives/resizable/resizable-pane-group.svelte +24 -0
- package/src/lib/components/primitives/scroll-area/index.ts +10 -0
- package/src/lib/components/primitives/scroll-area/scroll-area-scrollbar.svelte +31 -0
- package/src/lib/components/primitives/scroll-area/scroll-area.svelte +43 -0
- package/src/lib/components/primitives/search/index.ts +7 -0
- package/src/lib/components/primitives/search/search.svelte +79 -0
- package/src/lib/components/primitives/select/index.ts +37 -0
- package/src/lib/components/primitives/select/select-content.svelte +40 -0
- package/src/lib/components/primitives/select/select-group-heading.svelte +21 -0
- package/src/lib/components/primitives/select/select-group.svelte +7 -0
- package/src/lib/components/primitives/select/select-item.svelte +38 -0
- package/src/lib/components/primitives/select/select-label.svelte +20 -0
- package/src/lib/components/primitives/select/select-scroll-down-button.svelte +20 -0
- package/src/lib/components/primitives/select/select-scroll-up-button.svelte +20 -0
- package/src/lib/components/primitives/select/select-separator.svelte +18 -0
- package/src/lib/components/primitives/select/select-trigger.svelte +29 -0
- package/src/lib/components/primitives/separator/index.ts +7 -0
- package/src/lib/components/primitives/separator/separator.svelte +21 -0
- package/src/lib/components/primitives/slider/index.ts +7 -0
- package/src/lib/components/primitives/slider/slider.svelte +52 -0
- package/src/lib/components/primitives/sonner/index.ts +2 -0
- package/src/lib/components/primitives/sonner/sonner.svelte +13 -0
- package/src/lib/components/primitives/switch/index.ts +7 -0
- package/src/lib/components/primitives/switch/switch.svelte +29 -0
- package/src/lib/components/primitives/tabs/index.ts +16 -0
- package/src/lib/components/primitives/tabs/tabs-content.svelte +17 -0
- package/src/lib/components/primitives/tabs/tabs-list.svelte +16 -0
- package/src/lib/components/primitives/tabs/tabs-trigger.svelte +20 -0
- package/src/lib/components/primitives/tabs/tabs.svelte +19 -0
- package/src/lib/components/primitives/textarea/index.ts +7 -0
- package/src/lib/components/primitives/textarea/textarea.svelte +23 -0
- package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +39 -0
- package/src/lib/components/primitives/theme-switcher/index.ts +1 -0
- package/src/lib/components/viewer/MeshMetadataDialog.svelte +122 -0
- package/src/lib/components/viewer/SceneManager.svelte +297 -0
- package/src/lib/components/viewer/Viewer.svelte +311 -0
- package/src/lib/components/viewer/index.ts +3 -0
- package/src/lib/composables/useFooterItem.svelte.ts +40 -0
- package/src/lib/compute/computeThrottle.svelte.ts +97 -0
- package/src/lib/compute/solving.svelte.ts +77 -0
- package/src/lib/constants.ts +35 -0
- package/src/lib/contexts/footerContext.svelte.ts +54 -0
- package/src/lib/index.ts +31 -0
- package/src/lib/schema/defaults.ts +13 -0
- package/src/lib/schema/param-exporter.ts +160 -0
- package/src/lib/schema/visibility-rules.ts +94 -0
- package/src/lib/styles/base.css +145 -0
- package/src/lib/styles/themes/cyberpunk.css +98 -0
- package/src/lib/styles/themes/neutral.css +72 -0
- package/src/lib/styles/themes/ocean.css +75 -0
- package/src/lib/styles/themes/selva.css +105 -0
- package/src/lib/theme/themeStore.svelte.ts +50 -0
- package/src/lib/theme/themes.ts +18 -0
- package/src/lib/types/actionButton.ts +33 -0
- package/src/lib/types/solveFn.ts +29 -0
- package/src/lib/utils/color.ts +45 -0
- package/src/lib/utils/debounce.ts +36 -0
- package/src/lib/utils/file-download.ts +108 -0
- package/src/lib/utils/loadScript.ts +48 -0
- package/src/lib/utils.ts +13 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute throttle utility for managing async compute requests.
|
|
3
|
+
*
|
|
4
|
+
* - Only one request in-flight at a time
|
|
5
|
+
* - Latest values always win (no queue)
|
|
6
|
+
* - AbortController support to cancel stale requests
|
|
7
|
+
* - Configurable timeout with automatic abort
|
|
8
|
+
*/
|
|
9
|
+
interface ComputeThrottleOptions {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Fallback per-solve abort timeout (ms) when the caller doesn't pass one.
|
|
15
|
+
* Used only by callers without a deployment-specific limit (e.g. builder-app
|
|
16
|
+
* over WebSocket); compute-app supplies `MAX_SOLVE_DURATION_MS` from its
|
|
17
|
+
* server config via `ComputeApp`'s `solveTimeoutMs` prop.
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creates a throttled compute handler that keeps only one request in-flight.
|
|
23
|
+
* If a new value arrives while one is running, it overwrites the single pending
|
|
24
|
+
* slot — older pending values are dropped. The pending value runs once the
|
|
25
|
+
* current request finishes (or aborts).
|
|
26
|
+
*/
|
|
27
|
+
export function createComputeThrottle<T>(
|
|
28
|
+
computeFn: (values: T, signal: AbortSignal) => Promise<void>,
|
|
29
|
+
options: ComputeThrottleOptions = {}
|
|
30
|
+
): {
|
|
31
|
+
trigger: (values: T) => void;
|
|
32
|
+
readonly isComputing: boolean;
|
|
33
|
+
readonly hasPending: boolean;
|
|
34
|
+
cancel: () => void;
|
|
35
|
+
} {
|
|
36
|
+
const { timeout = DEFAULT_TIMEOUT_MS } = options;
|
|
37
|
+
|
|
38
|
+
let isComputing = $state(false);
|
|
39
|
+
let pendingValues = $state<T | null>(null);
|
|
40
|
+
let currentAbortController: AbortController | null = null;
|
|
41
|
+
|
|
42
|
+
function abortCurrent() {
|
|
43
|
+
currentAbortController?.abort();
|
|
44
|
+
currentAbortController = null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function executeCompute(values: T) {
|
|
48
|
+
abortCurrent();
|
|
49
|
+
|
|
50
|
+
currentAbortController = new AbortController();
|
|
51
|
+
const { signal } = currentAbortController;
|
|
52
|
+
const timeoutId = setTimeout(() => currentAbortController?.abort(), timeout);
|
|
53
|
+
|
|
54
|
+
isComputing = true;
|
|
55
|
+
try {
|
|
56
|
+
await computeFn(values, signal);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
if (!(err instanceof Error && err.name === 'AbortError')) {
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
} finally {
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
isComputing = false;
|
|
64
|
+
currentAbortController = null;
|
|
65
|
+
|
|
66
|
+
if (pendingValues !== null) {
|
|
67
|
+
const next = pendingValues;
|
|
68
|
+
pendingValues = null;
|
|
69
|
+
executeCompute(next);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function trigger(values: T) {
|
|
75
|
+
if (isComputing) {
|
|
76
|
+
pendingValues = values;
|
|
77
|
+
} else {
|
|
78
|
+
executeCompute(values);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function cancel() {
|
|
83
|
+
pendingValues = null;
|
|
84
|
+
abortCurrent();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
trigger,
|
|
89
|
+
get isComputing() {
|
|
90
|
+
return isComputing;
|
|
91
|
+
},
|
|
92
|
+
get hasPending() {
|
|
93
|
+
return pendingValues !== null;
|
|
94
|
+
},
|
|
95
|
+
cancel
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { untrack } from 'svelte';
|
|
2
|
+
import { APP_DEFAULTS } from '../constants';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates an adaptive solving indicator that measures actual solve durations
|
|
6
|
+
* and adjusts its visibility delay accordingly.
|
|
7
|
+
*
|
|
8
|
+
* - Fast solves (<200ms avg): indicator never shown (avoids flicker)
|
|
9
|
+
* - Slow solves (>600ms avg): indicator shown immediately
|
|
10
|
+
* - In between: indicator shown after a proportional delay
|
|
11
|
+
* - First solve: shows immediately (no history yet)
|
|
12
|
+
*/
|
|
13
|
+
export function createSolvingIndicator(isSolving: () => boolean): { readonly show: boolean } {
|
|
14
|
+
const { FAST_THRESHOLD_MS, SLOW_THRESHOLD_MS, HISTORY_SIZE, ANIMATION_DELAY } =
|
|
15
|
+
APP_DEFAULTS.SOLVING_INDICATOR;
|
|
16
|
+
|
|
17
|
+
let show = $state(false);
|
|
18
|
+
let timeout: ReturnType<typeof setTimeout> | null = null;
|
|
19
|
+
let solveStartTime: number | null = null;
|
|
20
|
+
const solveHistory: number[] = [];
|
|
21
|
+
|
|
22
|
+
$effect(() => {
|
|
23
|
+
const solving = isSolving();
|
|
24
|
+
|
|
25
|
+
untrack(() => {
|
|
26
|
+
if (solving) {
|
|
27
|
+
solveStartTime = performance.now();
|
|
28
|
+
|
|
29
|
+
const avg =
|
|
30
|
+
solveHistory.length === 0
|
|
31
|
+
? Infinity
|
|
32
|
+
: solveHistory.reduce((a, b) => a + b, 0) / solveHistory.length;
|
|
33
|
+
|
|
34
|
+
if (solveHistory.length > 0 && avg < FAST_THRESHOLD_MS) return;
|
|
35
|
+
|
|
36
|
+
const delay =
|
|
37
|
+
avg === Infinity || avg >= SLOW_THRESHOLD_MS
|
|
38
|
+
? 0
|
|
39
|
+
: ((avg - FAST_THRESHOLD_MS) / (SLOW_THRESHOLD_MS - FAST_THRESHOLD_MS)) *
|
|
40
|
+
ANIMATION_DELAY;
|
|
41
|
+
|
|
42
|
+
if (!timeout) {
|
|
43
|
+
if (delay === 0) {
|
|
44
|
+
show = true;
|
|
45
|
+
} else {
|
|
46
|
+
timeout = setTimeout(() => {
|
|
47
|
+
show = true;
|
|
48
|
+
timeout = null;
|
|
49
|
+
}, delay);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
if (solveStartTime !== null) {
|
|
54
|
+
solveHistory.push(performance.now() - solveStartTime);
|
|
55
|
+
if (solveHistory.length > HISTORY_SIZE) solveHistory.shift();
|
|
56
|
+
solveStartTime = null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (timeout) {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
timeout = null;
|
|
62
|
+
}
|
|
63
|
+
show = false;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return () => {
|
|
68
|
+
if (timeout) clearTimeout(timeout);
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
get show() {
|
|
74
|
+
return show;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const APP_DEFAULTS = {
|
|
2
|
+
// File upload limits
|
|
3
|
+
FILE_UPLOAD: {
|
|
4
|
+
MAX_SIZE_MB: 150,
|
|
5
|
+
MAX_SIZE_BYTES: 150 * 1024 * 1024
|
|
6
|
+
},
|
|
7
|
+
|
|
8
|
+
// Timing & performance thresholds
|
|
9
|
+
TIMEOUTS: {
|
|
10
|
+
/** Duration to show solving state (ms) */
|
|
11
|
+
SOLVE_STATE_DURATION: 3500,
|
|
12
|
+
/** Parameter export callback delay (ms) */
|
|
13
|
+
PARAM_EXPORT_DELAY: 100,
|
|
14
|
+
/** Viewer initialization delay (ms) */
|
|
15
|
+
VIEWER_INIT_DELAY: 350
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
// Solving indicator adaptive thresholds
|
|
19
|
+
SOLVING_INDICATOR: {
|
|
20
|
+
/** If solve is faster than this, don't show indicator (ms) */
|
|
21
|
+
FAST_THRESHOLD_MS: 200,
|
|
22
|
+
/** If solve is slower than this, show indicator immediately (ms) */
|
|
23
|
+
SLOW_THRESHOLD_MS: 600,
|
|
24
|
+
/** Animation delay for solve indicator (ms) */
|
|
25
|
+
ANIMATION_DELAY: 300,
|
|
26
|
+
/** Number of solve durations to keep in history for averaging */
|
|
27
|
+
HISTORY_SIZE: 3
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
// File size formatting
|
|
31
|
+
FILE_SIZE: {
|
|
32
|
+
/** Bytes per kilobyte */
|
|
33
|
+
BYTES_PER_KB: 1024
|
|
34
|
+
}
|
|
35
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
import { SvelteMap } from 'svelte/reactivity';
|
|
3
|
+
|
|
4
|
+
export interface FooterItem {
|
|
5
|
+
id: string;
|
|
6
|
+
component: any;
|
|
7
|
+
/** Called on every render — return reactive state to keep footer in sync */
|
|
8
|
+
getProps: () => Record<string, any>;
|
|
9
|
+
position: 'left' | 'right';
|
|
10
|
+
priority: number;
|
|
11
|
+
onClick?: () => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface FooterStore {
|
|
15
|
+
items: SvelteMap<string, FooterItem>;
|
|
16
|
+
register(
|
|
17
|
+
id: string,
|
|
18
|
+
component: any,
|
|
19
|
+
getProps: () => Record<string, any>,
|
|
20
|
+
position?: 'left' | 'right',
|
|
21
|
+
priority?: number,
|
|
22
|
+
onClick?: () => void
|
|
23
|
+
): void;
|
|
24
|
+
unregister(id: string): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const FOOTER_CONTEXT_KEY = Symbol('footer-context');
|
|
28
|
+
|
|
29
|
+
export function initializeFooterContext(): FooterStore {
|
|
30
|
+
const items = new SvelteMap<string, FooterItem>();
|
|
31
|
+
|
|
32
|
+
const store: FooterStore = {
|
|
33
|
+
items,
|
|
34
|
+
register(id, component, getProps, position = 'left', priority = 0, onClick) {
|
|
35
|
+
items.set(id, { id, component, getProps, position, priority, onClick });
|
|
36
|
+
},
|
|
37
|
+
unregister(id) {
|
|
38
|
+
items.delete(id);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
setContext(FOOTER_CONTEXT_KEY, store);
|
|
43
|
+
return store;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function useFooter(): FooterStore {
|
|
47
|
+
const store = getContext<FooterStore | undefined>(FOOTER_CONTEXT_KEY);
|
|
48
|
+
if (!store) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
'useFooter must be called within a component that is a descendant of the root layout'
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
return store;
|
|
54
|
+
}
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Layout components (page chrome: shell, header, footer, nav)
|
|
2
|
+
export * from './components/layout';
|
|
3
|
+
|
|
4
|
+
// Compute app (schema + viewer + solve controls composed into a runnable app)
|
|
5
|
+
export { default as AppLayout } from './components/compute/AppLayout.svelte';
|
|
6
|
+
export { default as ComputeApp } from './components/compute/ComputeApp.svelte';
|
|
7
|
+
|
|
8
|
+
// Error screen
|
|
9
|
+
export { default as ErrorScreen } from './components/ErrorScreen.svelte';
|
|
10
|
+
|
|
11
|
+
// Design-system primitives (shadcn-svelte + custom)
|
|
12
|
+
export * from './components/primitives';
|
|
13
|
+
export { default as StateDisplay } from './components/primitives/StateDisplay.svelte';
|
|
14
|
+
|
|
15
|
+
// 3D viewer
|
|
16
|
+
export { default as Viewer } from './components/viewer/Viewer.svelte';
|
|
17
|
+
|
|
18
|
+
// Utilities
|
|
19
|
+
export * from './schema/defaults';
|
|
20
|
+
export * from './compute/solving.svelte';
|
|
21
|
+
|
|
22
|
+
// Contexts & Composables
|
|
23
|
+
export * from './contexts/footerContext.svelte';
|
|
24
|
+
export * from './composables/useFooterItem.svelte';
|
|
25
|
+
|
|
26
|
+
// Utils (cn function)
|
|
27
|
+
export * from './utils';
|
|
28
|
+
|
|
29
|
+
// UI-specific runtime types (not from schema)
|
|
30
|
+
export type { ActionButton } from './types/actionButton';
|
|
31
|
+
export type { SolveFn } from './types/solveFn';
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { APP_DEFAULTS } from '../constants';
|
|
2
|
+
import type {
|
|
3
|
+
UISchema,
|
|
4
|
+
ParameterPreset,
|
|
5
|
+
ParameterState,
|
|
6
|
+
ValidationIssueMessage
|
|
7
|
+
} from '@selvajs/schemas';
|
|
8
|
+
|
|
9
|
+
function getGroups(schema: UISchema) {
|
|
10
|
+
if (!schema.layout) return [];
|
|
11
|
+
if (schema.layout.type === 'tabbed') return schema.layout.tabs.flatMap((t) => t.groups ?? []);
|
|
12
|
+
if (schema.layout.type === 'flat') return schema.layout.groups ?? [];
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function createSavedState(
|
|
17
|
+
schema: UISchema,
|
|
18
|
+
currentValues: Record<string, unknown>,
|
|
19
|
+
metadata: {
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
author?: string;
|
|
23
|
+
tags?: string[];
|
|
24
|
+
}
|
|
25
|
+
): ParameterPreset {
|
|
26
|
+
const parameters: ParameterState[] = [];
|
|
27
|
+
|
|
28
|
+
for (const group of getGroups(schema)) {
|
|
29
|
+
for (const item of group.items ?? []) {
|
|
30
|
+
if (item.type !== 'input') continue;
|
|
31
|
+
const value = currentValues[item.paramId];
|
|
32
|
+
const inputDef = schema.inputs.find((i) => i.id === item.paramId);
|
|
33
|
+
if (value !== undefined && inputDef) {
|
|
34
|
+
parameters.push({
|
|
35
|
+
paramId: item.paramId,
|
|
36
|
+
nickname: inputDef.nickname,
|
|
37
|
+
displayName: item.displayName || inputDef.nickname,
|
|
38
|
+
paramType: inputDef.paramType,
|
|
39
|
+
value,
|
|
40
|
+
groupName: group.label
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id: crypto.randomUUID(),
|
|
48
|
+
name: metadata.name,
|
|
49
|
+
description: metadata.description,
|
|
50
|
+
timestamp: new Date().toISOString(),
|
|
51
|
+
schemaId: schema.id,
|
|
52
|
+
documentId: schema.documentId ?? '',
|
|
53
|
+
projectFileName: schema.projectFileName ?? '',
|
|
54
|
+
pluginVersion: schema.pluginVersion ?? '',
|
|
55
|
+
author: metadata.author,
|
|
56
|
+
tags: metadata.tags ?? [],
|
|
57
|
+
parameters
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function validateSavedState(
|
|
62
|
+
savedState: ParameterPreset,
|
|
63
|
+
currentSchema: UISchema
|
|
64
|
+
): {
|
|
65
|
+
isValid: boolean;
|
|
66
|
+
issues: ValidationIssueMessage[];
|
|
67
|
+
canLoad: boolean;
|
|
68
|
+
} {
|
|
69
|
+
const issues: ValidationIssueMessage[] = [];
|
|
70
|
+
|
|
71
|
+
if (savedState.documentId !== (currentSchema.documentId ?? '')) {
|
|
72
|
+
issues.push({
|
|
73
|
+
paramId: '__document__',
|
|
74
|
+
severity: 'error',
|
|
75
|
+
message: 'Document ID mismatch - this state was saved for a different document',
|
|
76
|
+
details: { expected: currentSchema.documentId ?? '', actual: savedState.documentId }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (savedState.schemaId !== currentSchema.id) {
|
|
81
|
+
issues.push({
|
|
82
|
+
paramId: '__schema__',
|
|
83
|
+
severity: 'warning',
|
|
84
|
+
message: 'Schema has changed since this state was saved',
|
|
85
|
+
details: { expected: currentSchema.id, actual: savedState.schemaId }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
for (const paramState of savedState.parameters) {
|
|
90
|
+
const inputDef = currentSchema.inputs.find((i) => i.id === paramState.paramId);
|
|
91
|
+
|
|
92
|
+
if (!inputDef) {
|
|
93
|
+
issues.push({
|
|
94
|
+
paramId: paramState.paramId,
|
|
95
|
+
severity: 'error',
|
|
96
|
+
message: `Parameter "${paramState.nickname}" no longer exists in the schema`
|
|
97
|
+
});
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (inputDef.nickname !== paramState.nickname) {
|
|
102
|
+
issues.push({
|
|
103
|
+
paramId: paramState.paramId,
|
|
104
|
+
severity: 'warning',
|
|
105
|
+
message: 'Parameter nickname changed',
|
|
106
|
+
details: { expected: paramState.nickname, actual: inputDef.nickname }
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const hasErrors = issues.some((i) => i.severity === 'error');
|
|
112
|
+
return { isValid: issues.length === 0, issues, canLoad: !hasErrors };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function extractLoadableValues(
|
|
116
|
+
savedState: ParameterPreset,
|
|
117
|
+
currentSchema: UISchema,
|
|
118
|
+
validation: ReturnType<typeof validateSavedState>
|
|
119
|
+
): Record<string, unknown> {
|
|
120
|
+
const errorParamIds = new Set(
|
|
121
|
+
validation.issues
|
|
122
|
+
.filter((i) => i.severity === 'error' && !i.paramId.startsWith('__'))
|
|
123
|
+
.map((i) => i.paramId)
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const values: Record<string, unknown> = {};
|
|
127
|
+
for (const paramState of savedState.parameters) {
|
|
128
|
+
const exists = currentSchema.inputs.some((i) => i.id === paramState.paramId);
|
|
129
|
+
if (!errorParamIds.has(paramState.paramId) && exists) {
|
|
130
|
+
values[paramState.paramId] = paramState.value;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return values;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function exportStateAsJson(savedState: ParameterPreset): void {
|
|
137
|
+
const blob = new Blob([JSON.stringify(savedState, null, 2)], { type: 'application/json' });
|
|
138
|
+
const url = URL.createObjectURL(blob);
|
|
139
|
+
const link = document.createElement('a');
|
|
140
|
+
link.href = url;
|
|
141
|
+
link.download = `${savedState.name.replace(/[^a-z0-9]/gi, '_')}_${savedState.timestamp.split('T')[0].replace(/-/g, '_')}.sps`;
|
|
142
|
+
link.style.display = 'none';
|
|
143
|
+
document.body.appendChild(link);
|
|
144
|
+
|
|
145
|
+
setTimeout(() => {
|
|
146
|
+
link.click();
|
|
147
|
+
setTimeout(() => {
|
|
148
|
+
document.body.removeChild(link);
|
|
149
|
+
URL.revokeObjectURL(url);
|
|
150
|
+
}, APP_DEFAULTS.TIMEOUTS.PARAM_EXPORT_DELAY);
|
|
151
|
+
}, 0);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function importStateFromJson(file: File): Promise<ParameterPreset> {
|
|
155
|
+
const state = JSON.parse(await file.text()) as ParameterPreset;
|
|
156
|
+
if (!state.id || !state.name || !state.documentId || !state.parameters) {
|
|
157
|
+
throw new Error('Invalid saved state file format');
|
|
158
|
+
}
|
|
159
|
+
return state;
|
|
160
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
LayoutItem,
|
|
3
|
+
VisibilityRule,
|
|
4
|
+
VisibilityCondition,
|
|
5
|
+
GroupVisibilityCondition
|
|
6
|
+
} from '@selvajs/schemas';
|
|
7
|
+
|
|
8
|
+
export interface VisibilityResult {
|
|
9
|
+
visible: boolean;
|
|
10
|
+
disabled: boolean;
|
|
11
|
+
defaultValue?: unknown;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type RuleOperatorFn = (a: unknown, b: unknown, values?: unknown[]) => boolean;
|
|
15
|
+
|
|
16
|
+
const toStringArray = (value: unknown): string[] => {
|
|
17
|
+
if (Array.isArray(value)) return value.map(String);
|
|
18
|
+
if (value === undefined || value === null || value === '') return [];
|
|
19
|
+
return [String(value)];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const RULE_OPERATORS: Record<string, RuleOperatorFn> = {
|
|
23
|
+
equals: (a, b) => a === b,
|
|
24
|
+
notEquals: (a, b) => a !== b,
|
|
25
|
+
greaterThan: (a, b) => Number(a) > Number(b),
|
|
26
|
+
lessThan: (a, b) => Number(a) < Number(b),
|
|
27
|
+
greaterThanOrEqual: (a, b) => Number(a) >= Number(b),
|
|
28
|
+
lessThanOrEqual: (a, b) => Number(a) <= Number(b),
|
|
29
|
+
between: (a, _, vals) =>
|
|
30
|
+
vals?.length === 2 && Number(a) >= Number(vals[0]) && Number(a) <= Number(vals[1]),
|
|
31
|
+
in: (a, _, vals) => vals?.includes(String(a)) ?? false,
|
|
32
|
+
notIn: (a, _, vals) => !(vals?.includes(String(a)) ?? false),
|
|
33
|
+
matches: (a, b) => {
|
|
34
|
+
try {
|
|
35
|
+
return new RegExp(String(b)).test(String(a));
|
|
36
|
+
} catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
contains: (a, b) => toStringArray(a).includes(String(b)),
|
|
41
|
+
containsAny: (a, _, vals) => {
|
|
42
|
+
const arr = toStringArray(a);
|
|
43
|
+
return vals?.some((v) => arr.includes(String(v))) ?? false;
|
|
44
|
+
},
|
|
45
|
+
isEmpty: (a) => toStringArray(a).length === 0,
|
|
46
|
+
isNotEmpty: (a) => toStringArray(a).length > 0
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export function evaluateRule(rule: VisibilityRule, values: Record<string, unknown>): boolean {
|
|
50
|
+
const fn = RULE_OPERATORS[rule.operator];
|
|
51
|
+
return fn ? fn(values[rule.paramId], rule.value, rule.values) : false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function evaluateCondition(
|
|
55
|
+
condition: VisibilityCondition | GroupVisibilityCondition,
|
|
56
|
+
values: Record<string, unknown>
|
|
57
|
+
): boolean {
|
|
58
|
+
const results = condition.rules.map((rule) => evaluateRule(rule, values));
|
|
59
|
+
return condition.mode === 'any' ? results.some(Boolean) : results.every(Boolean);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type ActionFn = (met: boolean, defaultValue?: unknown) => VisibilityResult;
|
|
63
|
+
|
|
64
|
+
const ACTIONS: Record<string, ActionFn> = {
|
|
65
|
+
show: (met) => ({ visible: met, disabled: false }),
|
|
66
|
+
hide: (met, dv) => ({ visible: !met, disabled: false, defaultValue: dv }),
|
|
67
|
+
disable: (met, dv) => ({ visible: true, disabled: met, defaultValue: met ? dv : undefined })
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export function evaluateVisibility(
|
|
71
|
+
item: LayoutItem,
|
|
72
|
+
values: Record<string, unknown>
|
|
73
|
+
): VisibilityResult {
|
|
74
|
+
if (item.type === 'linebreak') return { visible: true, disabled: false };
|
|
75
|
+
if (!item.visibilityCondition?.rules) return { visible: true, disabled: false };
|
|
76
|
+
|
|
77
|
+
const { action = 'show', defaultValue } = item.visibilityCondition;
|
|
78
|
+
const met = evaluateCondition(item.visibilityCondition, values);
|
|
79
|
+
const actionFn = ACTIONS[action] ?? ACTIONS.show;
|
|
80
|
+
|
|
81
|
+
return actionFn(met, defaultValue);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function evaluateGroupVisibility(
|
|
85
|
+
group: { visibilityCondition?: GroupVisibilityCondition },
|
|
86
|
+
values: Record<string, unknown>
|
|
87
|
+
): boolean {
|
|
88
|
+
if (!group.visibilityCondition?.rules) return true;
|
|
89
|
+
|
|
90
|
+
const { action = 'show' } = group.visibilityCondition;
|
|
91
|
+
const met = evaluateCondition(group.visibilityCondition, values);
|
|
92
|
+
|
|
93
|
+
return action === 'hide' ? !met : met;
|
|
94
|
+
}
|