@svgrid/grid 1.2.33 → 2.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 +6 -5
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +178 -178
- package/dist/SvAccordion.svelte +109 -0
- package/dist/SvAccordion.svelte.d.ts +28 -0
- package/dist/SvAlert.svelte +92 -0
- package/dist/SvAlert.svelte.d.ts +27 -0
- package/dist/SvAutoComplete.svelte +47 -18
- package/dist/SvAutoComplete.svelte.d.ts +2 -5
- package/dist/SvAvatar.svelte +75 -0
- package/dist/SvAvatar.svelte.d.ts +14 -0
- package/dist/SvAvatarGroup.svelte +48 -0
- package/dist/SvAvatarGroup.svelte.d.ts +16 -0
- package/dist/SvBadge.svelte +54 -0
- package/dist/SvBadge.svelte.d.ts +23 -0
- package/dist/SvBreadcrumb.svelte +88 -0
- package/dist/SvBreadcrumb.svelte.d.ts +23 -0
- package/dist/SvButtonGroup.svelte +121 -0
- package/dist/SvButtonGroup.svelte.d.ts +16 -0
- package/dist/SvCalendar.svelte +72 -9
- package/dist/SvCalendar.svelte.d.ts +34 -1
- package/dist/SvCard.svelte +71 -0
- package/dist/SvCard.svelte.d.ts +28 -0
- package/dist/SvCarousel.svelte +134 -0
- package/dist/SvCarousel.svelte.d.ts +28 -0
- package/dist/SvCheckBox.svelte +36 -21
- package/dist/SvCheckBox.svelte.d.ts +2 -5
- package/dist/SvChip.svelte +88 -0
- package/dist/SvChip.svelte.d.ts +31 -0
- package/dist/SvCircularProgress.svelte +109 -0
- package/dist/SvCircularProgress.svelte.d.ts +31 -0
- package/dist/SvColorInput.svelte +54 -27
- package/dist/SvColorInput.svelte.d.ts +10 -6
- package/dist/SvComboBox.svelte +119 -33
- package/dist/SvComboBox.svelte.d.ts +18 -6
- package/dist/SvCommand.svelte +197 -0
- package/dist/SvCommand.svelte.d.ts +26 -0
- package/dist/SvContextMenu.svelte +96 -0
- package/dist/SvContextMenu.svelte.d.ts +25 -0
- package/dist/SvCountryInput.svelte +56 -21
- package/dist/SvCountryInput.svelte.d.ts +9 -5
- package/dist/SvDateRangeInput.svelte +256 -0
- package/dist/SvDateRangeInput.svelte.d.ts +37 -0
- package/dist/SvDateTimePicker.svelte +57 -20
- package/dist/SvDateTimePicker.svelte.d.ts +12 -4
- package/dist/SvDivider.svelte +61 -0
- package/dist/SvDivider.svelte.d.ts +22 -0
- package/dist/SvDrawer.svelte +226 -0
- package/dist/SvDrawer.svelte.d.ts +43 -0
- package/dist/SvDropDownList.svelte +114 -35
- package/dist/SvDropDownList.svelte.d.ts +7 -6
- package/dist/SvDurationInput.svelte +108 -0
- package/dist/SvDurationInput.svelte.d.ts +15 -0
- package/dist/SvEmptyState.svelte +59 -0
- package/dist/SvEmptyState.svelte.d.ts +25 -0
- package/dist/SvField.svelte +85 -0
- package/dist/SvField.svelte.d.ts +30 -0
- package/dist/SvFileUpload.svelte +169 -0
- package/dist/SvFileUpload.svelte.d.ts +24 -0
- package/dist/SvForm.svelte +7 -1
- package/dist/SvForm.svelte.d.ts +3 -0
- package/dist/SvGauge.svelte +7 -1
- package/dist/SvGauge.svelte.d.ts +11 -0
- package/dist/SvGrid.controller.svelte.d.ts +6 -0
- package/dist/SvGrid.controller.svelte.js +64 -9
- package/dist/SvGrid.css +2376 -2343
- package/dist/SvGrid.svelte +2764 -2651
- package/dist/SvGrid.types.d.ts +366 -0
- package/dist/SvGridBoard.svelte +2281 -0
- package/dist/SvGridBoard.svelte.d.ts +31 -0
- package/dist/SvGridDropdown.svelte +666 -665
- package/dist/SvGridSelect.svelte +255 -0
- package/dist/SvGridSelect.svelte.d.ts +32 -0
- package/dist/SvGroupCell.svelte +109 -0
- package/dist/SvGroupCell.svelte.d.ts +41 -0
- package/dist/SvListBox.svelte +123 -36
- package/dist/SvListBox.svelte.d.ts +12 -8
- package/dist/SvMaskedInput.svelte +53 -13
- package/dist/SvMaskedInput.svelte.d.ts +16 -6
- package/dist/SvMenu.svelte +101 -0
- package/dist/SvMenu.svelte.d.ts +26 -0
- package/dist/SvMenuList.svelte +143 -0
- package/dist/SvMenuList.svelte.d.ts +24 -0
- package/dist/SvModal.svelte +220 -0
- package/dist/SvModal.svelte.d.ts +31 -0
- package/dist/SvMultiSelect.svelte +277 -0
- package/dist/SvMultiSelect.svelte.d.ts +31 -0
- package/dist/SvNavPane.svelte +314 -0
- package/dist/SvNavPane.svelte.d.ts +59 -0
- package/dist/SvNumberInput.svelte +23 -9
- package/dist/SvNumberInput.svelte.d.ts +2 -0
- package/dist/SvOtpInput.svelte +157 -0
- package/dist/SvOtpInput.svelte.d.ts +16 -0
- package/dist/SvPagination.svelte +100 -0
- package/dist/SvPagination.svelte.d.ts +16 -0
- package/dist/SvPasswordInput.svelte +42 -12
- package/dist/SvPasswordInput.svelte.d.ts +13 -6
- package/dist/SvPhoneInput.svelte +43 -11
- package/dist/SvPhoneInput.svelte.d.ts +10 -11
- package/dist/SvPopover.svelte +127 -0
- package/dist/SvPopover.svelte.d.ts +35 -0
- package/dist/SvProgress.svelte +116 -0
- package/dist/SvProgress.svelte.d.ts +32 -0
- package/dist/SvRadioGroup.svelte +40 -22
- package/dist/SvRadioGroup.svelte.d.ts +2 -10
- package/dist/SvRating.svelte +51 -30
- package/dist/SvRating.svelte.d.ts +10 -7
- package/dist/SvRichText.svelte +192 -0
- package/dist/SvRichText.svelte.d.ts +16 -0
- package/dist/SvRowGroupPanel.svelte +147 -0
- package/dist/SvRowGroupPanel.svelte.d.ts +17 -0
- package/dist/SvScrollArea.svelte +50 -0
- package/dist/SvScrollArea.svelte.d.ts +22 -0
- package/dist/SvSkeleton.svelte +76 -0
- package/dist/SvSkeleton.svelte.d.ts +25 -0
- package/dist/SvSlider.svelte +41 -9
- package/dist/SvSlider.svelte.d.ts +4 -4
- package/dist/SvSparkline.svelte +77 -0
- package/dist/SvSparkline.svelte.d.ts +28 -0
- package/dist/SvSplitter.svelte +138 -0
- package/dist/SvSplitter.svelte.d.ts +32 -0
- package/dist/SvStat.svelte +86 -0
- package/dist/SvStat.svelte.d.ts +30 -0
- package/dist/SvStepper.svelte +91 -0
- package/dist/SvStepper.svelte.d.ts +24 -0
- package/dist/SvSwitchButton.svelte +39 -24
- package/dist/SvSwitchButton.svelte.d.ts +2 -5
- package/dist/SvTabs.svelte +147 -28
- package/dist/SvTabs.svelte.d.ts +16 -4
- package/dist/SvTagsInput.svelte +59 -22
- package/dist/SvTagsInput.svelte.d.ts +9 -4
- package/dist/SvTextArea.svelte +113 -0
- package/dist/SvTextArea.svelte.d.ts +18 -0
- package/dist/SvTextInput.svelte +115 -0
- package/dist/SvTextInput.svelte.d.ts +20 -0
- package/dist/SvTimePicker.svelte +19 -5
- package/dist/SvTimePicker.svelte.d.ts +12 -0
- package/dist/SvTimeline.svelte +75 -0
- package/dist/SvTimeline.svelte.d.ts +24 -0
- package/dist/SvToaster.svelte +124 -0
- package/dist/SvToaster.svelte.d.ts +10 -0
- package/dist/SvToggleButton.svelte +37 -12
- package/dist/SvToggleButton.svelte.d.ts +2 -4
- package/dist/SvTooltip.svelte +113 -0
- package/dist/SvTooltip.svelte.d.ts +22 -0
- package/dist/SvTour.svelte +151 -0
- package/dist/SvTour.svelte.d.ts +25 -0
- package/dist/SvTree.svelte +286 -44
- package/dist/SvTree.svelte.d.ts +26 -9
- package/dist/SvTreeSelect.svelte +222 -0
- package/dist/SvTreeSelect.svelte.d.ts +24 -0
- package/dist/a11y/dismissable.d.ts +32 -0
- package/dist/a11y/dismissable.js +54 -0
- package/dist/a11y/focus-trap.d.ts +39 -0
- package/dist/a11y/focus-trap.js +142 -0
- package/dist/a11y/live-region.d.ts +8 -0
- package/dist/a11y/live-region.js +60 -0
- package/dist/a11y/scroll-lock.d.ts +4 -0
- package/dist/a11y/scroll-lock.js +41 -0
- package/dist/a11y.d.ts +3 -1
- package/dist/a11y.js +1 -1
- package/dist/avatar.d.ts +10 -0
- package/dist/avatar.js +22 -0
- package/dist/builtin-editors.d.ts +5 -0
- package/dist/builtin-editors.js +55 -0
- package/dist/cdn/svgrid.js +16022 -8235
- package/dist/cdn/svgrid.svelte-external.js +14543 -6765
- package/dist/columns.js +3 -2
- package/dist/core.d.ts +7 -1
- package/dist/countries.d.ts +12 -0
- package/dist/countries.js +24 -0
- package/dist/createAccordion.svelte.d.ts +71 -0
- package/dist/createAccordion.svelte.js +99 -0
- package/dist/createAutocomplete.svelte.d.ts +13 -4
- package/dist/createAutocomplete.svelte.js +11 -1
- package/dist/createButtonGroup.svelte.d.ts +62 -0
- package/dist/createButtonGroup.svelte.js +154 -0
- package/dist/createCalendar.svelte.d.ts +5 -0
- package/dist/createCalendar.svelte.js +2 -0
- package/dist/createCheckbox.svelte.d.ts +9 -17
- package/dist/createCheckbox.svelte.js +28 -1
- package/dist/createColorInput.svelte.d.ts +12 -22
- package/dist/createColorInput.svelte.js +13 -0
- package/dist/createCombobox.svelte.d.ts +16 -5
- package/dist/createCombobox.svelte.js +13 -2
- package/dist/createCountryInput.svelte.d.ts +14 -3
- package/dist/createCountryInput.svelte.js +12 -2
- package/dist/createDateTimePicker.svelte.d.ts +17 -2
- package/dist/createDateTimePicker.svelte.js +12 -2
- package/dist/createDropdownList.svelte.d.ts +14 -5
- package/dist/createDropdownList.svelte.js +50 -1
- package/dist/createFileUpload.svelte.d.ts +68 -0
- package/dist/createFileUpload.svelte.js +122 -0
- package/dist/createListbox.svelte.d.ts +10 -1
- package/dist/createListbox.svelte.js +48 -1
- package/dist/createMaskedInput.svelte.d.ts +11 -2
- package/dist/createMaskedInput.svelte.js +11 -1
- package/dist/createNumberInput.svelte.d.ts +1 -0
- package/dist/createNumberInput.svelte.js +1 -0
- package/dist/createPasswordInput.svelte.d.ts +19 -21
- package/dist/createPasswordInput.svelte.js +16 -4
- package/dist/createPhoneInput.svelte.d.ts +26 -7
- package/dist/createPhoneInput.svelte.js +24 -3
- package/dist/createPopoverSelect.svelte.d.ts +86 -0
- package/dist/createPopoverSelect.svelte.js +196 -0
- package/dist/createRadioGroup.svelte.d.ts +9 -0
- package/dist/createRadioGroup.svelte.js +11 -1
- package/dist/createRating.svelte.d.ts +11 -0
- package/dist/createRating.svelte.js +12 -1
- package/dist/createSlider.svelte.d.ts +2 -0
- package/dist/createSlider.svelte.js +16 -5
- package/dist/createSplitter.svelte.d.ts +67 -0
- package/dist/createSplitter.svelte.js +99 -0
- package/dist/createSwitch.svelte.d.ts +9 -16
- package/dist/createSwitch.svelte.js +28 -1
- package/dist/createTabs.svelte.d.ts +7 -0
- package/dist/createTabs.svelte.js +17 -2
- package/dist/createTagsInput.svelte.d.ts +13 -1
- package/dist/createTagsInput.svelte.js +12 -3
- package/dist/createToggle.svelte.d.ts +9 -0
- package/dist/createToggle.svelte.js +12 -1
- package/dist/createTree.svelte.d.ts +19 -0
- package/dist/createTree.svelte.js +108 -15
- package/dist/debounce.d.ts +11 -0
- package/dist/debounce.js +30 -0
- package/dist/duration.d.ts +15 -0
- package/dist/duration.js +51 -0
- package/dist/editor-contract.d.ts +62 -7
- package/dist/editor-contract.js +45 -5
- package/dist/editor-registry.d.ts +67 -0
- package/dist/editor-registry.js +38 -0
- package/dist/editors/cell-editors.d.ts +1 -1
- package/dist/editors/cell-editors.js +5 -0
- package/dist/fuzzy.d.ts +3 -0
- package/dist/fuzzy.js +41 -0
- package/dist/grid-select.d.ts +9 -0
- package/dist/grid-select.js +8 -0
- package/dist/index.d.ts +79 -6
- package/dist/index.js +78 -4
- package/dist/keyboard-handlers.js +19 -0
- package/dist/list-option.d.ts +36 -0
- package/dist/list-option.js +68 -0
- package/dist/otp.d.ts +16 -0
- package/dist/otp.js +26 -0
- package/dist/paginate.d.ts +20 -0
- package/dist/paginate.js +40 -0
- package/dist/popover.d.ts +15 -1
- package/dist/popover.js +29 -3
- package/dist/recurrence.d.ts +36 -0
- package/dist/recurrence.js +90 -0
- package/dist/server-data-source.d.ts +89 -0
- package/dist/server-data-source.js +4 -0
- package/dist/server-group-model.d.ts +98 -0
- package/dist/server-group-model.js +263 -0
- package/dist/toast-store.svelte.d.ts +41 -0
- package/dist/toast-store.svelte.js +113 -0
- package/dist/tree-select.d.ts +19 -0
- package/dist/tree-select.js +40 -0
- package/dist/ui-app.types.d.ts +80 -0
- package/dist/ui-app.types.js +7 -0
- package/dist/validators.d.ts +43 -0
- package/dist/validators.js +53 -0
- package/dist/virtual.d.ts +35 -0
- package/dist/virtual.js +34 -0
- package/package.json +85 -85
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +178 -178
- package/src/SvAccordion.svelte +109 -0
- package/src/SvAccordion.test.ts +66 -0
- package/src/SvAlert.svelte +92 -0
- package/src/SvAutoComplete.svelte +47 -18
- package/src/SvAvatar.svelte +75 -0
- package/src/SvAvatarGroup.svelte +48 -0
- package/src/SvBadge.svelte +54 -0
- package/src/SvBreadcrumb.svelte +88 -0
- package/src/SvButtonGroup.svelte +121 -0
- package/src/SvButtonGroup.test.ts +72 -0
- package/src/SvCalendar.svelte +72 -9
- package/src/SvCard.svelte +71 -0
- package/src/SvCarousel.svelte +134 -0
- package/src/SvCheckBox.svelte +36 -21
- package/src/SvChip.svelte +88 -0
- package/src/SvCircularProgress.svelte +109 -0
- package/src/SvColorInput.svelte +54 -27
- package/src/SvComboBox.svelte +119 -33
- package/src/SvCommand.svelte +197 -0
- package/src/SvContextMenu.svelte +96 -0
- package/src/SvCountryInput.svelte +56 -21
- package/src/SvDateRangeInput.svelte +256 -0
- package/src/SvDateRangeInput.test.ts +80 -0
- package/src/SvDateTimePicker.svelte +57 -20
- package/src/SvDivider.svelte +61 -0
- package/src/SvDrawer.svelte +226 -0
- package/src/SvDrawer.test.ts +125 -0
- package/src/SvDropDownList.svelte +114 -35
- package/src/SvDurationInput.svelte +108 -0
- package/src/SvEmptyState.svelte +59 -0
- package/src/SvField.svelte +85 -0
- package/src/SvFileUpload.svelte +169 -0
- package/src/SvFileUpload.test.ts +59 -0
- package/src/SvForm.svelte +7 -1
- package/src/SvGauge.svelte +7 -1
- package/src/SvGrid.controller.svelte.ts +2553 -2494
- package/src/SvGrid.css +2376 -2343
- package/src/SvGrid.svelte +2764 -2651
- package/src/SvGrid.types.ts +944 -570
- package/src/SvGridBoard.svelte +2281 -0
- package/src/SvGridDropdown.svelte +666 -665
- package/src/SvGridSelect.svelte +255 -0
- package/src/SvGridSelect.test.ts +100 -0
- package/src/SvGroupCell.svelte +109 -0
- package/src/SvListBox.svelte +123 -36
- package/src/SvMaskedInput.svelte +53 -13
- package/src/SvMenu.svelte +101 -0
- package/src/SvMenu.test.ts +73 -0
- package/src/SvMenuList.svelte +143 -0
- package/src/SvModal.svelte +220 -0
- package/src/SvMultiSelect.svelte +277 -0
- package/src/SvMultiSelect.test.ts +167 -0
- package/src/SvNavPane.svelte +314 -0
- package/src/SvNavPane.test.ts +70 -0
- package/src/SvNumberInput.svelte +23 -9
- package/src/SvOtpInput.svelte +157 -0
- package/src/SvPagination.svelte +100 -0
- package/src/SvPasswordInput.svelte +42 -12
- package/src/SvPhoneInput.svelte +43 -11
- package/src/SvPopover.svelte +127 -0
- package/src/SvProgress.svelte +116 -0
- package/src/SvRadioGroup.svelte +40 -22
- package/src/SvRating.svelte +51 -30
- package/src/SvRichText.svelte +192 -0
- package/src/SvRowGroupPanel.svelte +147 -0
- package/src/SvScrollArea.svelte +50 -0
- package/src/SvSkeleton.svelte +76 -0
- package/src/SvSlider.svelte +41 -9
- package/src/SvSparkline.svelte +77 -0
- package/src/SvSplitter.svelte +138 -0
- package/src/SvSplitter.test.ts +55 -0
- package/src/SvStat.svelte +86 -0
- package/src/SvStepper.svelte +91 -0
- package/src/SvSwitchButton.svelte +39 -24
- package/src/SvTabs.svelte +147 -28
- package/src/SvTagsInput.svelte +59 -22
- package/src/SvTextArea.svelte +113 -0
- package/src/SvTextInput.svelte +115 -0
- package/src/SvTimePicker.svelte +19 -5
- package/src/SvTimeline.svelte +75 -0
- package/src/SvToaster.svelte +124 -0
- package/src/SvToaster.test.ts +63 -0
- package/src/SvToggleButton.svelte +37 -12
- package/src/SvTooltip.svelte +113 -0
- package/src/SvTour.svelte +151 -0
- package/src/SvTree.svelte +286 -44
- package/src/SvTreeSelect.svelte +222 -0
- package/src/SvTreeSelect.test.ts +87 -0
- package/src/a11y/dismissable.test.ts +95 -0
- package/src/a11y/dismissable.ts +94 -0
- package/src/a11y/focus-trap.test.ts +110 -0
- package/src/a11y/focus-trap.ts +134 -0
- package/src/a11y/live-region.test.ts +40 -0
- package/src/a11y/live-region.ts +65 -0
- package/src/a11y/scroll-lock.test.ts +38 -0
- package/src/a11y/scroll-lock.ts +41 -0
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -59
- package/src/avatar.test.ts +32 -0
- package/src/avatar.ts +21 -0
- package/src/board.test.ts +927 -0
- package/src/build-api.ts +798 -798
- package/src/builtin-editors.grid.test.ts +85 -0
- package/src/builtin-editors.test.ts +58 -0
- package/src/builtin-editors.ts +56 -0
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.ts +469 -469
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/columns.ts +3 -2
- package/src/core.performance.test.ts +30 -30
- package/src/core.ts +1111 -1101
- package/src/countries.ts +25 -0
- package/src/createAccordion.svelte.ts +126 -0
- package/src/createAutocomplete.svelte.ts +18 -1
- package/src/createButtonGroup.svelte.ts +166 -0
- package/src/createCalendar.svelte.ts +6 -0
- package/src/createCheckbox.svelte.ts +23 -1
- package/src/createColorInput.svelte.ts +20 -0
- package/src/createCombobox.svelte.ts +22 -2
- package/src/createCountryInput.svelte.ts +21 -2
- package/src/createDateTimePicker.svelte.ts +23 -2
- package/src/createDropdownList.svelte.ts +31 -2
- package/src/createFileUpload.svelte.ts +144 -0
- package/src/createGrid.svelte.ts +42 -42
- package/src/createGrid.test.ts +10 -10
- package/src/createGridState.svelte.ts +17 -17
- package/src/createListbox.svelte.ts +35 -3
- package/src/createMaskedInput.svelte.ts +18 -1
- package/src/createNumberInput.svelte.ts +2 -0
- package/src/createPasswordInput.svelte.ts +31 -5
- package/src/createPhoneInput.svelte.ts +38 -4
- package/src/createPopoverSelect.svelte.ts +208 -0
- package/src/createRadioGroup.svelte.ts +23 -1
- package/src/createRating.svelte.ts +26 -1
- package/src/createSlider.svelte.ts +14 -3
- package/src/createSplitter.svelte.ts +119 -0
- package/src/createSwitch.svelte.ts +26 -3
- package/src/createTabs.svelte.ts +20 -3
- package/src/createTagsInput.svelte.ts +24 -3
- package/src/createToggle.svelte.ts +25 -2
- package/src/createTree.svelte.ts +104 -14
- package/src/debounce.test.ts +50 -0
- package/src/debounce.ts +41 -0
- package/src/duration.test.ts +41 -0
- package/src/duration.ts +51 -0
- package/src/editing.test.ts +859 -859
- package/src/editing.ts +675 -675
- package/src/editor-contract.ts +87 -8
- package/src/editor-registry.grid.test.ts +98 -0
- package/src/editor-registry.test.ts +86 -0
- package/src/editor-registry.ts +106 -0
- package/src/editors/cell-editors.ts +10 -1
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +598 -598
- package/src/flex-render.ts +3 -3
- package/src/fuzzy.test.ts +40 -0
- package/src/fuzzy.ts +39 -0
- package/src/grid-select.test.ts +28 -0
- package/src/grid-select.ts +20 -0
- package/src/index.ts +463 -318
- package/src/keyboard-handlers.ts +20 -0
- package/src/keyboard.test.ts +59 -59
- package/src/keyboard.ts +97 -97
- package/src/list-option.ts +74 -0
- package/src/list-power.test.ts +71 -0
- package/src/menus.ts +582 -582
- package/src/merge-objects.ts +48 -48
- package/src/otp.test.ts +28 -0
- package/src/otp.ts +28 -0
- package/src/overlays.test.ts +85 -0
- package/src/paginate.test.ts +41 -0
- package/src/paginate.ts +61 -0
- package/src/phone-valid.test.ts +26 -0
- package/src/popover.ts +31 -3
- package/src/progress.test.ts +55 -0
- package/src/recurrence.test.ts +91 -0
- package/src/recurrence.ts +111 -0
- package/src/render-component.ts +28 -28
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +600 -600
- package/src/server-data-source.test.ts +289 -289
- package/src/server-data-source.ts +413 -311
- package/src/server-group-model.test.ts +294 -0
- package/src/server-group-model.ts +370 -0
- package/src/sparkline.test.ts +68 -68
- package/src/sparkline.ts +169 -169
- package/src/spreadsheet.test.ts +489 -489
- package/src/spreadsheet.ts +304 -304
- package/src/static-functions.ts +11 -11
- package/src/subscribe.ts +38 -38
- package/src/svgrid-wrapper.types.ts +439 -439
- package/src/svgrid.behavior.test.ts +706 -706
- package/src/svgrid.features.test.ts +157 -157
- package/src/svgrid.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.responsive.test.ts +72 -0
- package/src/svgrid.wrapper.test.ts +40 -40
- package/src/toast-store.svelte.ts +148 -0
- package/src/toast-store.test.ts +86 -0
- package/src/tree-edit.test.ts +49 -0
- package/src/tree-filter.test.ts +56 -0
- package/src/tree-select.test.ts +48 -0
- package/src/tree-select.ts +62 -0
- package/src/ui-app.test.ts +130 -0
- package/src/ui-app.types.ts +88 -0
- package/src/ui-display.test.ts +79 -0
- package/src/ui-inputs.test.ts +1 -1
- package/src/ui-status.test.ts +141 -0
- package/src/ui-tier1.test.ts +142 -0
- package/src/ui-tier2.test.ts +124 -0
- package/src/ui-tier3.test.ts +139 -0
- package/src/validators.test.ts +58 -0
- package/src/validators.ts +105 -0
- package/src/virtual.test.ts +72 -0
- package/src/virtual.ts +67 -0
- package/src/virtualization/column-virtualizer.test.ts +27 -27
- package/src/virtualization/column-virtualizer.ts +30 -30
- package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
- package/src/virtualization/types.ts +30 -30
- package/src/virtualization/virtualizer.test.ts +47 -47
- package/src/virtualization/virtualizer.ts +296 -296
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SvScrollArea - a scroll container with the kit's themed custom scrollbars
|
|
4
|
+
* (Firefox `scrollbar-color` + Chromium `::-webkit-scrollbar`) consuming the
|
|
5
|
+
* `--sg-scrollbar-*` tokens, so any panel matches the grid/demos without
|
|
6
|
+
* hand-rolling scrollbar CSS. The fallbacks derive from `--sg-fg` so it also
|
|
7
|
+
* adapts to light/dark when no preset defines the tokens.
|
|
8
|
+
*
|
|
9
|
+
* ```svelte
|
|
10
|
+
* <SvScrollArea maxHeight="240px">…long content…</SvScrollArea>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
import type { Snippet } from 'svelte'
|
|
14
|
+
|
|
15
|
+
type Props = {
|
|
16
|
+
maxHeight?: string
|
|
17
|
+
height?: string
|
|
18
|
+
/** Scroll horizontally instead of vertically. */
|
|
19
|
+
horizontal?: boolean
|
|
20
|
+
children?: Snippet
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let { maxHeight, height, horizontal = false, children }: Props = $props()
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<div class="sv-scroll" class:is-x={horizontal} style:max-height={maxHeight} style:height={height}>
|
|
27
|
+
{@render children?.()}
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<style>
|
|
31
|
+
.sv-scroll {
|
|
32
|
+
overflow: auto; overscroll-behavior: contain; min-height: 0;
|
|
33
|
+
scrollbar-width: thin;
|
|
34
|
+
scrollbar-color: var(--sg-scrollbar-thumb, color-mix(in srgb, var(--sg-fg, #0f172a) 26%, transparent)) var(--sg-scrollbar-bg, transparent);
|
|
35
|
+
}
|
|
36
|
+
.sv-scroll.is-x { overflow: auto hidden; }
|
|
37
|
+
.sv-scroll::-webkit-scrollbar { width: 12px; height: 12px; }
|
|
38
|
+
.sv-scroll::-webkit-scrollbar-track {
|
|
39
|
+
background: var(--sg-scrollbar-bg, transparent);
|
|
40
|
+
box-shadow: inset 1px 0 0 0 var(--sg-scrollbar-border, transparent);
|
|
41
|
+
}
|
|
42
|
+
.sv-scroll::-webkit-scrollbar-thumb {
|
|
43
|
+
background: var(--sg-scrollbar-thumb, color-mix(in srgb, var(--sg-fg, #0f172a) 26%, transparent));
|
|
44
|
+
border-radius: var(--sg-scrollbar-thumb-radius, 6px);
|
|
45
|
+
border: 3px solid transparent; background-clip: padding-box;
|
|
46
|
+
}
|
|
47
|
+
.sv-scroll::-webkit-scrollbar-thumb:hover { background: var(--sg-scrollbar-thumb-hover, color-mix(in srgb, var(--sg-fg, #0f172a) 38%, transparent)); }
|
|
48
|
+
.sv-scroll::-webkit-scrollbar-thumb:active { background: var(--sg-scrollbar-thumb-active, color-mix(in srgb, var(--sg-fg, #0f172a) 50%, transparent)); }
|
|
49
|
+
.sv-scroll::-webkit-scrollbar-corner { background: var(--sg-scrollbar-bg, transparent); }
|
|
50
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SvScrollArea - a scroll container with the kit's themed custom scrollbars
|
|
3
|
+
* (Firefox `scrollbar-color` + Chromium `::-webkit-scrollbar`) consuming the
|
|
4
|
+
* `--sg-scrollbar-*` tokens, so any panel matches the grid/demos without
|
|
5
|
+
* hand-rolling scrollbar CSS. The fallbacks derive from `--sg-fg` so it also
|
|
6
|
+
* adapts to light/dark when no preset defines the tokens.
|
|
7
|
+
*
|
|
8
|
+
* ```svelte
|
|
9
|
+
* <SvScrollArea maxHeight="240px">…long content…</SvScrollArea>
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import type { Snippet } from 'svelte';
|
|
13
|
+
type Props = {
|
|
14
|
+
maxHeight?: string;
|
|
15
|
+
height?: string;
|
|
16
|
+
/** Scroll horizontally instead of vertically. */
|
|
17
|
+
horizontal?: boolean;
|
|
18
|
+
children?: Snippet;
|
|
19
|
+
};
|
|
20
|
+
declare const SvScrollArea: import("svelte").Component<Props, {}, "">;
|
|
21
|
+
type SvScrollArea = ReturnType<typeof SvScrollArea>;
|
|
22
|
+
export default SvScrollArea;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SvSkeleton - a shimmering loading placeholder. Use it while data is in
|
|
4
|
+
* flight; it respects `prefers-reduced-motion` (falls back to a static tint).
|
|
5
|
+
* Parity: Smart skeleton / loading indicators.
|
|
6
|
+
*
|
|
7
|
+
* ```svelte
|
|
8
|
+
* <SvSkeleton variant="text" lines={3} />
|
|
9
|
+
* <SvSkeleton variant="circle" width="40px" height="40px" />
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
type Props = {
|
|
13
|
+
variant?: 'text' | 'rect' | 'circle'
|
|
14
|
+
/** Any CSS length. Defaults suit the variant. */
|
|
15
|
+
width?: string
|
|
16
|
+
height?: string
|
|
17
|
+
/** Corner radius (rect/text). */
|
|
18
|
+
radius?: string
|
|
19
|
+
/** Number of text lines (variant="text" only). The last line is shorter. */
|
|
20
|
+
lines?: number
|
|
21
|
+
/** Turn the shimmer off (static tint only). */
|
|
22
|
+
animated?: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { variant = 'text', width, height, radius, lines = 1, animated = true }: Props = $props()
|
|
26
|
+
|
|
27
|
+
const isText = $derived(variant === 'text')
|
|
28
|
+
const rowCount = $derived(isText ? Math.max(1, lines) : 1)
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<div class="sv-skel" role="status" aria-busy="true" aria-live="polite">
|
|
32
|
+
<span class="sv-skel__sr">Loading</span>
|
|
33
|
+
{#each Array(rowCount) as _, i (i)}
|
|
34
|
+
<span
|
|
35
|
+
class="sv-skel__box sv-skel__box--{variant}"
|
|
36
|
+
class:is-animated={animated}
|
|
37
|
+
class:is-last={isText && i === rowCount - 1 && rowCount > 1}
|
|
38
|
+
style:width={width}
|
|
39
|
+
style:height={height}
|
|
40
|
+
style:border-radius={variant === 'circle' ? '50%' : radius}
|
|
41
|
+
aria-hidden="true"
|
|
42
|
+
></span>
|
|
43
|
+
{/each}
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<style>
|
|
47
|
+
.sv-skel { display: flex; flex-direction: column; gap: 8px; }
|
|
48
|
+
.sv-skel__sr {
|
|
49
|
+
position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
|
|
50
|
+
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
|
|
51
|
+
}
|
|
52
|
+
.sv-skel__box {
|
|
53
|
+
display: block;
|
|
54
|
+
background: var(--sg-skeleton-bg, var(--sg-row-hover-bg, #e2e8f0));
|
|
55
|
+
border-radius: var(--sg-radius, 8px);
|
|
56
|
+
}
|
|
57
|
+
.sv-skel__box--text { width: 100%; height: 0.85em; }
|
|
58
|
+
.sv-skel__box--rect { width: 100%; height: 120px; }
|
|
59
|
+
.sv-skel__box--circle { width: 40px; height: 40px; border-radius: 50%; }
|
|
60
|
+
.sv-skel__box.is-last { width: 60%; }
|
|
61
|
+
|
|
62
|
+
.sv-skel__box.is-animated {
|
|
63
|
+
background: linear-gradient(
|
|
64
|
+
90deg,
|
|
65
|
+
var(--sg-skeleton-bg, var(--sg-row-hover-bg, #e2e8f0)) 25%,
|
|
66
|
+
color-mix(in srgb, var(--sg-skeleton-bg, var(--sg-row-hover-bg, #e2e8f0)) 55%, var(--sg-bg, #fff)) 37%,
|
|
67
|
+
var(--sg-skeleton-bg, var(--sg-row-hover-bg, #e2e8f0)) 63%
|
|
68
|
+
);
|
|
69
|
+
background-size: 400% 100%;
|
|
70
|
+
animation: sv-skel-shimmer 1.4s ease-in-out infinite;
|
|
71
|
+
}
|
|
72
|
+
@keyframes sv-skel-shimmer { 0% { background-position: 100% 0 } 100% { background-position: 0 0 } }
|
|
73
|
+
@media (prefers-reduced-motion: reduce) {
|
|
74
|
+
.sv-skel__box.is-animated { animation: none; background: var(--sg-skeleton-bg, var(--sg-row-hover-bg, #e2e8f0)); }
|
|
75
|
+
}
|
|
76
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SvSkeleton - a shimmering loading placeholder. Use it while data is in
|
|
3
|
+
* flight; it respects `prefers-reduced-motion` (falls back to a static tint).
|
|
4
|
+
* Parity: Smart skeleton / loading indicators.
|
|
5
|
+
*
|
|
6
|
+
* ```svelte
|
|
7
|
+
* <SvSkeleton variant="text" lines={3} />
|
|
8
|
+
* <SvSkeleton variant="circle" width="40px" height="40px" />
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
type Props = {
|
|
12
|
+
variant?: 'text' | 'rect' | 'circle';
|
|
13
|
+
/** Any CSS length. Defaults suit the variant. */
|
|
14
|
+
width?: string;
|
|
15
|
+
height?: string;
|
|
16
|
+
/** Corner radius (rect/text). */
|
|
17
|
+
radius?: string;
|
|
18
|
+
/** Number of text lines (variant="text" only). The last line is shorter. */
|
|
19
|
+
lines?: number;
|
|
20
|
+
/** Turn the shimmer off (static tint only). */
|
|
21
|
+
animated?: boolean;
|
|
22
|
+
};
|
|
23
|
+
declare const SvSkeleton: import("svelte").Component<Props, {}, "">;
|
|
24
|
+
type SvSkeleton = ReturnType<typeof SvSkeleton>;
|
|
25
|
+
export default SvSkeleton;
|
package/dist/SvSlider.svelte
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* The behavior lives in the headless `createSlider` core; this component is
|
|
8
8
|
* just one styled renderer over it (it only owns pointer/DOM measurement).
|
|
9
9
|
*/
|
|
10
|
+
import SvField from './SvField.svelte'
|
|
11
|
+
import { nextEditorId, type SvEditorProps } from './editor-contract'
|
|
10
12
|
import { createSlider } from './createSlider.svelte'
|
|
11
13
|
|
|
12
|
-
type Props = {
|
|
14
|
+
type Props = SvEditorProps & {
|
|
13
15
|
value?: number | [number, number]
|
|
14
16
|
onChange?: (value: any) => void
|
|
15
17
|
min?: number
|
|
@@ -18,12 +20,11 @@
|
|
|
18
20
|
range?: boolean
|
|
19
21
|
/** Show evenly spaced tick marks (count or explicit values). */
|
|
20
22
|
ticks?: number | number[]
|
|
23
|
+
/** Numeric scale labels under the track: 'endpoints' (min/max), 'all' (per tick), or 'none'. */
|
|
24
|
+
labels?: 'none' | 'endpoints' | 'all'
|
|
21
25
|
/** Show the value bubble above the thumb. */
|
|
22
26
|
showValue?: boolean
|
|
23
|
-
disabled?: boolean
|
|
24
27
|
orientation?: 'horizontal' | 'vertical'
|
|
25
|
-
name?: string
|
|
26
|
-
ariaLabel?: string
|
|
27
28
|
formatValue?: (v: number) => string
|
|
28
29
|
}
|
|
29
30
|
|
|
@@ -35,14 +36,26 @@
|
|
|
35
36
|
step = 1,
|
|
36
37
|
range = false,
|
|
37
38
|
ticks,
|
|
39
|
+
labels = 'none',
|
|
38
40
|
showValue = false,
|
|
39
41
|
disabled = false,
|
|
40
42
|
orientation = 'horizontal',
|
|
41
43
|
name,
|
|
42
44
|
ariaLabel,
|
|
45
|
+
invalid = false,
|
|
46
|
+
required = false,
|
|
47
|
+
error,
|
|
48
|
+
label,
|
|
49
|
+
hint,
|
|
50
|
+
dir,
|
|
51
|
+
id,
|
|
43
52
|
formatValue,
|
|
44
53
|
}: Props = $props()
|
|
45
54
|
|
|
55
|
+
const autoId = nextEditorId('sv-slider')
|
|
56
|
+
const uid = $derived(id ?? autoId)
|
|
57
|
+
const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
|
|
58
|
+
|
|
46
59
|
// Behavior (value<->position math, stepping, keyboard, drag state, ARIA) lives
|
|
47
60
|
// in the headless `createSlider` core; the component keeps the DOM measuring.
|
|
48
61
|
const slider = createSlider({
|
|
@@ -54,7 +67,8 @@
|
|
|
54
67
|
range: () => range,
|
|
55
68
|
orientation: () => orientation,
|
|
56
69
|
disabled: () => disabled,
|
|
57
|
-
ariaLabel: () => ariaLabel,
|
|
70
|
+
ariaLabel: () => ariaLabel ?? label,
|
|
71
|
+
rtl: () => resolvedDir === 'rtl',
|
|
58
72
|
})
|
|
59
73
|
const lo = $derived(slider.lo)
|
|
60
74
|
const hi = $derived(slider.hi)
|
|
@@ -65,6 +79,10 @@
|
|
|
65
79
|
if (Array.isArray(ticks)) return ticks
|
|
66
80
|
return Array.from({ length: ticks }, (_, i) => min + ((max - min) / (ticks - 1)) * i)
|
|
67
81
|
})
|
|
82
|
+
const labelValues = $derived.by<number[]>(() => {
|
|
83
|
+
if (labels === 'all') return tickValues.length ? tickValues : [min, max]
|
|
84
|
+
return [] // 'endpoints' renders min/max directly; 'none' renders nothing
|
|
85
|
+
})
|
|
68
86
|
|
|
69
87
|
// The rect is measured here (a DOM concern) and passed INTO the core.
|
|
70
88
|
let trackEl: HTMLDivElement | null = null
|
|
@@ -82,10 +100,11 @@
|
|
|
82
100
|
const fmt = (v: number) => (formatValue ? formatValue(v) : String(v))
|
|
83
101
|
</script>
|
|
84
102
|
|
|
103
|
+
<SvField id={uid} {label} {hint} {error} {required} {dir}>
|
|
85
104
|
<div
|
|
86
105
|
class="sv-slider sv-slider--{orientation}"
|
|
87
106
|
class:is-disabled={disabled}
|
|
88
|
-
|
|
107
|
+
dir={resolvedDir}
|
|
89
108
|
>
|
|
90
109
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
91
110
|
<div
|
|
@@ -119,8 +138,18 @@
|
|
|
119
138
|
</div>
|
|
120
139
|
{/if}
|
|
121
140
|
</div>
|
|
141
|
+
{#if labels !== 'none' && orientation === 'horizontal'}
|
|
142
|
+
{#if labels === 'endpoints'}
|
|
143
|
+
<div class="sv-slider__scale sv-slider__scale--ends" aria-hidden="true"><span>{fmt(min)}</span><span>{fmt(max)}</span></div>
|
|
144
|
+
{:else}
|
|
145
|
+
<div class="sv-slider__scale" aria-hidden="true">
|
|
146
|
+
{#each labelValues as lv (lv)}<span class="sv-slider__scale-lbl" style:--p={`${pct(lv)}%`}>{fmt(lv)}</span>{/each}
|
|
147
|
+
</div>
|
|
148
|
+
{/if}
|
|
149
|
+
{/if}
|
|
122
150
|
{#if name}<input type="hidden" {name} value={range ? `${lo},${hi}` : hi} />{/if}
|
|
123
151
|
</div>
|
|
152
|
+
</SvField>
|
|
124
153
|
|
|
125
154
|
<style>
|
|
126
155
|
.sv-slider { --_accent: var(--sg-accent, #2563eb); --_track: var(--sg-border, #e2e8f0); padding: 10px; }
|
|
@@ -132,15 +161,18 @@
|
|
|
132
161
|
}
|
|
133
162
|
.sv-slider--horizontal .sv-slider__track { height: 6px; }
|
|
134
163
|
.sv-slider--vertical .sv-slider__track { width: 6px; height: 100%; margin: 0 auto; }
|
|
164
|
+
.sv-slider__scale { position: relative; height: 15px; margin-top: 8px; font-size: 11px; color: var(--sg-muted, #64748b); font-variant-numeric: tabular-nums; }
|
|
165
|
+
.sv-slider__scale--ends { display: flex; justify-content: space-between; }
|
|
166
|
+
.sv-slider__scale-lbl { position: absolute; inset-inline-start: var(--p); transform: translateX(-50%); white-space: nowrap; }
|
|
135
167
|
.sv-slider__fill { position: absolute; background: var(--_accent); border-radius: 999px; }
|
|
136
|
-
.sv-slider--horizontal .sv-slider__fill {
|
|
168
|
+
.sv-slider--horizontal .sv-slider__fill { inset-inline-start: var(--a); inset-inline-end: calc(100% - var(--b)); top: 0; bottom: 0; }
|
|
137
169
|
.sv-slider--vertical .sv-slider__fill { bottom: var(--a); top: calc(100% - var(--b)); left: 0; right: 0; }
|
|
138
170
|
.sv-slider__thumb {
|
|
139
171
|
position: absolute; width: 16px; height: 16px; border-radius: 50%;
|
|
140
172
|
background: #fff; border: 2px solid var(--_accent); box-shadow: 0 1px 3px rgba(0,0,0,0.25);
|
|
141
173
|
cursor: grab; touch-action: none;
|
|
142
174
|
}
|
|
143
|
-
.sv-slider--horizontal .sv-slider__thumb {
|
|
175
|
+
.sv-slider--horizontal .sv-slider__thumb { inset-inline-start: var(--p); top: 50%; transform: translate(-50%, -50%); }
|
|
144
176
|
.sv-slider--vertical .sv-slider__thumb { bottom: var(--p); left: 50%; transform: translate(-50%, 50%); }
|
|
145
177
|
.sv-slider__thumb:focus-visible { outline: 2px solid var(--sg-focus-ring, var(--_accent)); outline-offset: 2px; }
|
|
146
178
|
.sv-slider__thumb:active { cursor: grabbing; }
|
|
@@ -150,6 +182,6 @@
|
|
|
150
182
|
padding: 2px 6px; border-radius: 5px; white-space: nowrap;
|
|
151
183
|
}
|
|
152
184
|
.sv-slider__tick { position: absolute; width: 2px; height: 2px; border-radius: 50%; background: var(--sg-muted, #94a3b8); }
|
|
153
|
-
.sv-slider--horizontal .sv-slider__tick {
|
|
185
|
+
.sv-slider--horizontal .sv-slider__tick { inset-inline-start: var(--p); top: 50%; transform: translate(-50%, -50%); }
|
|
154
186
|
.sv-slider--vertical .sv-slider__tick { bottom: var(--p); left: 50%; transform: translate(-50%, 50%); }
|
|
155
187
|
</style>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
type
|
|
1
|
+
import { type SvEditorProps } from './editor-contract';
|
|
2
|
+
type Props = SvEditorProps & {
|
|
2
3
|
value?: number | [number, number];
|
|
3
4
|
onChange?: (value: any) => void;
|
|
4
5
|
min?: number;
|
|
@@ -7,12 +8,11 @@ type Props = {
|
|
|
7
8
|
range?: boolean;
|
|
8
9
|
/** Show evenly spaced tick marks (count or explicit values). */
|
|
9
10
|
ticks?: number | number[];
|
|
11
|
+
/** Numeric scale labels under the track: 'endpoints' (min/max), 'all' (per tick), or 'none'. */
|
|
12
|
+
labels?: 'none' | 'endpoints' | 'all';
|
|
10
13
|
/** Show the value bubble above the thumb. */
|
|
11
14
|
showValue?: boolean;
|
|
12
|
-
disabled?: boolean;
|
|
13
15
|
orientation?: 'horizontal' | 'vertical';
|
|
14
|
-
name?: string;
|
|
15
|
-
ariaLabel?: string;
|
|
16
16
|
formatValue?: (v: number) => string;
|
|
17
17
|
};
|
|
18
18
|
declare const SvSlider: import("svelte").Component<Props, {}, "">;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SvSparkline - a tiny inline chart (line / area / bar / win-loss) from a number
|
|
4
|
+
* array. A thin SVG renderer over the pure `buildSparkline` geometry (shared
|
|
5
|
+
* with the grid's sparkline cell). Theme-driven (defaults to `--sg-accent`).
|
|
6
|
+
*
|
|
7
|
+
* ```svelte
|
|
8
|
+
* <SvSparkline data={[3, 7, 4, 9, 6, 11, 8]} type="area" />
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
import { buildSparkline, type SparklineType } from './sparkline'
|
|
12
|
+
|
|
13
|
+
type Props = {
|
|
14
|
+
data: ReadonlyArray<number>
|
|
15
|
+
type?: SparklineType
|
|
16
|
+
width?: number
|
|
17
|
+
height?: number
|
|
18
|
+
color?: string
|
|
19
|
+
negativeColor?: string
|
|
20
|
+
lineWidth?: number
|
|
21
|
+
/** Fix the value scale instead of deriving it from the data. */
|
|
22
|
+
min?: number
|
|
23
|
+
max?: number
|
|
24
|
+
/** End-cap dot on the last point (line / area). Default true. */
|
|
25
|
+
lastPoint?: boolean
|
|
26
|
+
ariaLabel?: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let {
|
|
30
|
+
data,
|
|
31
|
+
type = 'line',
|
|
32
|
+
width = 88,
|
|
33
|
+
height = 22,
|
|
34
|
+
color,
|
|
35
|
+
negativeColor,
|
|
36
|
+
lineWidth,
|
|
37
|
+
min,
|
|
38
|
+
max,
|
|
39
|
+
lastPoint = true,
|
|
40
|
+
ariaLabel,
|
|
41
|
+
}: Props = $props()
|
|
42
|
+
|
|
43
|
+
const geo = $derived(
|
|
44
|
+
buildSparkline([...data], { type, width, height, color, negativeColor, lineWidth, min, max, lastPoint }),
|
|
45
|
+
)
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
{#if geo}
|
|
49
|
+
<svg
|
|
50
|
+
class="sv-spark"
|
|
51
|
+
width={geo.width}
|
|
52
|
+
height={geo.height}
|
|
53
|
+
viewBox={`0 0 ${geo.width} ${geo.height}`}
|
|
54
|
+
preserveAspectRatio="none"
|
|
55
|
+
role="img"
|
|
56
|
+
aria-label={ariaLabel ?? 'sparkline'}
|
|
57
|
+
>
|
|
58
|
+
{#if type === 'area' && geo.areaPath}
|
|
59
|
+
<path d={geo.areaPath} fill={geo.color} fill-opacity="0.15" stroke="none" />
|
|
60
|
+
{/if}
|
|
61
|
+
{#if (type === 'line' || type === 'area') && geo.linePath}
|
|
62
|
+
<path d={geo.linePath} fill="none" stroke={geo.color} stroke-width={geo.lineWidth} stroke-linejoin="round" stroke-linecap="round" />
|
|
63
|
+
{/if}
|
|
64
|
+
{#if type === 'bar' || type === 'winloss'}
|
|
65
|
+
{#each geo.bars as b, i (i)}
|
|
66
|
+
<rect x={b.x} y={b.y} width={b.w} height={b.h} rx="0.5" fill={b.negative ? geo.negativeColor : geo.color} />
|
|
67
|
+
{/each}
|
|
68
|
+
{/if}
|
|
69
|
+
{#if lastPoint && geo.lastPoint && (type === 'line' || type === 'area')}
|
|
70
|
+
<circle cx={geo.lastPoint.x} cy={geo.lastPoint.y} r={geo.lineWidth + 0.8} fill={geo.color} />
|
|
71
|
+
{/if}
|
|
72
|
+
</svg>
|
|
73
|
+
{/if}
|
|
74
|
+
|
|
75
|
+
<style>
|
|
76
|
+
.sv-spark { display: inline-block; vertical-align: middle; overflow: visible; }
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SvSparkline - a tiny inline chart (line / area / bar / win-loss) from a number
|
|
3
|
+
* array. A thin SVG renderer over the pure `buildSparkline` geometry (shared
|
|
4
|
+
* with the grid's sparkline cell). Theme-driven (defaults to `--sg-accent`).
|
|
5
|
+
*
|
|
6
|
+
* ```svelte
|
|
7
|
+
* <SvSparkline data={[3, 7, 4, 9, 6, 11, 8]} type="area" />
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
import { type SparklineType } from './sparkline';
|
|
11
|
+
type Props = {
|
|
12
|
+
data: ReadonlyArray<number>;
|
|
13
|
+
type?: SparklineType;
|
|
14
|
+
width?: number;
|
|
15
|
+
height?: number;
|
|
16
|
+
color?: string;
|
|
17
|
+
negativeColor?: string;
|
|
18
|
+
lineWidth?: number;
|
|
19
|
+
/** Fix the value scale instead of deriving it from the data. */
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
/** End-cap dot on the last point (line / area). Default true. */
|
|
23
|
+
lastPoint?: boolean;
|
|
24
|
+
ariaLabel?: string;
|
|
25
|
+
};
|
|
26
|
+
declare const SvSparkline: import("svelte").Component<Props, {}, "">;
|
|
27
|
+
type SvSparkline = ReturnType<typeof SvSparkline>;
|
|
28
|
+
export default SvSparkline;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export type { SplitterOrientation } from './createSplitter.svelte'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
/**
|
|
7
|
+
* SvSplitter - two resizable panes with a draggable separator (WAI-ARIA
|
|
8
|
+
* `separator`), pointer drag + keyboard resize. Parity: Smart `smart-splitter`.
|
|
9
|
+
* Controlled via `fraction` (0..1 of the first pane) + `onChange`; the two panes
|
|
10
|
+
* are the `start` and `end` snippets.
|
|
11
|
+
*
|
|
12
|
+
* Behavior (clamp, keyboard, ARIA, RTL) lives in the headless `createSplitter`
|
|
13
|
+
* core; this component owns only the container measurement for pointer drags.
|
|
14
|
+
*/
|
|
15
|
+
import type { Snippet } from 'svelte'
|
|
16
|
+
import { type EditorDir } from './editor-contract'
|
|
17
|
+
import { createSplitter, type SplitterOrientation } from './createSplitter.svelte'
|
|
18
|
+
|
|
19
|
+
type Props = {
|
|
20
|
+
/** Size of the first pane as a fraction of the container (0..1). */
|
|
21
|
+
fraction?: number
|
|
22
|
+
onChange?: (fraction: number) => void
|
|
23
|
+
/** 'horizontal' = left/right panes (default); 'vertical' = top/bottom. */
|
|
24
|
+
orientation?: SplitterOrientation
|
|
25
|
+
min?: number
|
|
26
|
+
max?: number
|
|
27
|
+
/** Keyboard resize step as a fraction (default 0.02 = 2%). */
|
|
28
|
+
step?: number
|
|
29
|
+
disabled?: boolean
|
|
30
|
+
dir?: EditorDir
|
|
31
|
+
ariaLabel?: string
|
|
32
|
+
start?: Snippet
|
|
33
|
+
end?: Snippet
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let {
|
|
37
|
+
fraction = $bindable(0.5),
|
|
38
|
+
onChange,
|
|
39
|
+
orientation = 'horizontal',
|
|
40
|
+
min = 0.1,
|
|
41
|
+
max = 0.9,
|
|
42
|
+
step = 0.02,
|
|
43
|
+
disabled = false,
|
|
44
|
+
dir,
|
|
45
|
+
ariaLabel,
|
|
46
|
+
start,
|
|
47
|
+
end,
|
|
48
|
+
}: Props = $props()
|
|
49
|
+
|
|
50
|
+
const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
|
|
51
|
+
|
|
52
|
+
const sp = createSplitter({
|
|
53
|
+
fraction: () => fraction,
|
|
54
|
+
onChange: (f) => { fraction = f; onChange?.(f) },
|
|
55
|
+
orientation: () => orientation,
|
|
56
|
+
min: () => min,
|
|
57
|
+
max: () => max,
|
|
58
|
+
step: () => step,
|
|
59
|
+
disabled: () => disabled,
|
|
60
|
+
dir: () => dir,
|
|
61
|
+
ariaLabel: () => ariaLabel,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
// The container rect is measured here (a DOM concern) and passed INTO the core.
|
|
65
|
+
let rootEl: HTMLDivElement | null = null
|
|
66
|
+
let sepEl: HTMLDivElement | null = null
|
|
67
|
+
|
|
68
|
+
function onSepDown(e: PointerEvent) {
|
|
69
|
+
if (disabled) return
|
|
70
|
+
sp.pointerDown()
|
|
71
|
+
sepEl?.setPointerCapture(e.pointerId)
|
|
72
|
+
}
|
|
73
|
+
function onMove(e: PointerEvent) {
|
|
74
|
+
if (!sp.dragging || !rootEl) return
|
|
75
|
+
sp.setFromPointer({ x: e.clientX, y: e.clientY }, rootEl.getBoundingClientRect())
|
|
76
|
+
}
|
|
77
|
+
function onUp(e: PointerEvent) {
|
|
78
|
+
if (!sp.dragging) return
|
|
79
|
+
sp.endDrag()
|
|
80
|
+
sepEl?.releasePointerCapture(e.pointerId)
|
|
81
|
+
}
|
|
82
|
+
</script>
|
|
83
|
+
|
|
84
|
+
<div
|
|
85
|
+
bind:this={rootEl}
|
|
86
|
+
class="sv-split sv-split--{orientation}"
|
|
87
|
+
class:is-disabled={disabled}
|
|
88
|
+
class:is-dragging={sp.dragging}
|
|
89
|
+
dir={resolvedDir}
|
|
90
|
+
>
|
|
91
|
+
<div class="sv-split__pane" style:flex-basis={`${sp.percent}%`}>
|
|
92
|
+
{#if start}{@render start()}{/if}
|
|
93
|
+
</div>
|
|
94
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
95
|
+
<div
|
|
96
|
+
bind:this={sepEl}
|
|
97
|
+
class="sv-split__sep"
|
|
98
|
+
{...sp.separatorProps()}
|
|
99
|
+
onpointerdown={onSepDown}
|
|
100
|
+
onpointermove={onMove}
|
|
101
|
+
onpointerup={onUp}
|
|
102
|
+
onpointercancel={onUp}
|
|
103
|
+
><span class="sv-split__grip" aria-hidden="true"></span></div>
|
|
104
|
+
<div class="sv-split__pane sv-split__pane--end">
|
|
105
|
+
{#if end}{@render end()}{/if}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<style>
|
|
110
|
+
.sv-split {
|
|
111
|
+
--_accent: var(--sg-accent, #2563eb);
|
|
112
|
+
--_border: var(--sg-border, #e2e8f0);
|
|
113
|
+
display: flex; width: 100%; height: 100%; min-height: 0; overflow: hidden;
|
|
114
|
+
}
|
|
115
|
+
.sv-split--vertical { flex-direction: column; }
|
|
116
|
+
.sv-split.is-disabled { opacity: 0.7; }
|
|
117
|
+
.sv-split__pane { flex-grow: 0; flex-shrink: 0; min-width: 0; min-height: 0; overflow: auto; }
|
|
118
|
+
.sv-split__pane--end { flex: 1 1 0; }
|
|
119
|
+
/* The gutter is a solid divider-toned bar (--sg-border is the one token that
|
|
120
|
+
reliably contrasts against panes in BOTH light and dark themes - it draws the
|
|
121
|
+
visible card outline too). It turns accent on hover / drag. */
|
|
122
|
+
.sv-split__sep {
|
|
123
|
+
flex: 0 0 auto; position: relative; background: var(--sg-border, #cbd5e1);
|
|
124
|
+
display: grid; place-items: center; touch-action: none; transition: background 0.12s;
|
|
125
|
+
}
|
|
126
|
+
/* Orientation rules MUST target the splitter's OWN separator only (direct
|
|
127
|
+
child). With a descendant combinator a nested splitter of the opposite
|
|
128
|
+
orientation inherits the wrong sizing - e.g. a vertical split inside a
|
|
129
|
+
horizontal one would get width:8px and collapse its horizontal bar. */
|
|
130
|
+
.sv-split--horizontal > .sv-split__sep { width: 8px; min-width: 8px; cursor: col-resize; }
|
|
131
|
+
.sv-split--vertical > .sv-split__sep { height: 8px; min-height: 8px; cursor: row-resize; }
|
|
132
|
+
.sv-split__sep:hover, .sv-split.is-dragging > .sv-split__sep { background: var(--_accent); }
|
|
133
|
+
.sv-split__sep:focus-visible { outline: 2px solid var(--sg-focus-ring, var(--_accent)); outline-offset: 1px; z-index: 1; }
|
|
134
|
+
/* Grip dots: the pane background color, so they read as notches cut into the bar. */
|
|
135
|
+
.sv-split__grip { background: var(--sg-bg, #fff); border-radius: 3px; opacity: 0.9; transition: background 0.12s; }
|
|
136
|
+
.sv-split--horizontal > .sv-split__sep > .sv-split__grip { width: 2px; height: 24px; }
|
|
137
|
+
.sv-split--vertical > .sv-split__sep > .sv-split__grip { width: 24px; height: 2px; }
|
|
138
|
+
</style>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type { SplitterOrientation } from './createSplitter.svelte';
|
|
2
|
+
/**
|
|
3
|
+
* SvSplitter - two resizable panes with a draggable separator (WAI-ARIA
|
|
4
|
+
* `separator`), pointer drag + keyboard resize. Parity: Smart `smart-splitter`.
|
|
5
|
+
* Controlled via `fraction` (0..1 of the first pane) + `onChange`; the two panes
|
|
6
|
+
* are the `start` and `end` snippets.
|
|
7
|
+
*
|
|
8
|
+
* Behavior (clamp, keyboard, ARIA, RTL) lives in the headless `createSplitter`
|
|
9
|
+
* core; this component owns only the container measurement for pointer drags.
|
|
10
|
+
*/
|
|
11
|
+
import type { Snippet } from 'svelte';
|
|
12
|
+
import { type EditorDir } from './editor-contract';
|
|
13
|
+
import { type SplitterOrientation } from './createSplitter.svelte';
|
|
14
|
+
type Props = {
|
|
15
|
+
/** Size of the first pane as a fraction of the container (0..1). */
|
|
16
|
+
fraction?: number;
|
|
17
|
+
onChange?: (fraction: number) => void;
|
|
18
|
+
/** 'horizontal' = left/right panes (default); 'vertical' = top/bottom. */
|
|
19
|
+
orientation?: SplitterOrientation;
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
/** Keyboard resize step as a fraction (default 0.02 = 2%). */
|
|
23
|
+
step?: number;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
dir?: EditorDir;
|
|
26
|
+
ariaLabel?: string;
|
|
27
|
+
start?: Snippet;
|
|
28
|
+
end?: Snippet;
|
|
29
|
+
};
|
|
30
|
+
declare const SvSplitter: import("svelte").Component<Props, {}, "fraction">;
|
|
31
|
+
type SvSplitter = ReturnType<typeof SvSplitter>;
|
|
32
|
+
export default SvSplitter;
|