@svgrid/grid 1.2.34 → 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,169 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
export type { FileRejection, FileRejectReason } from './createFileUpload.svelte'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
/**
|
|
7
|
+
* SvFileUpload - a drag-and-drop file field with a click-to-browse fallback,
|
|
8
|
+
* accept / size / count validation and a selected-files list. Parity: Smart
|
|
9
|
+
* `smart-file-upload`. Controlled via `files` + `onChange`.
|
|
10
|
+
*
|
|
11
|
+
* Part of the editor kit: carries the shared contract (label, hint, error
|
|
12
|
+
* validation, `dir`/RTL and localizable `messages`) via `<SvField>`. The
|
|
13
|
+
* drag/validation/state live in the headless `createFileUpload` core.
|
|
14
|
+
*/
|
|
15
|
+
import SvField from './SvField.svelte'
|
|
16
|
+
import { nextEditorId, resolveMessages, type SvEditorProps } from './editor-contract'
|
|
17
|
+
import { createFileUpload, type FileRejection } from './createFileUpload.svelte'
|
|
18
|
+
|
|
19
|
+
/** User-facing strings (localizable via `messages`). */
|
|
20
|
+
type FileMessages = { prompt: string; browse: string; remove: string; hintTypes: string }
|
|
21
|
+
const DEFAULT_MESSAGES: FileMessages = {
|
|
22
|
+
prompt: 'Drag files here or', browse: 'browse', remove: 'Remove', hintTypes: 'Accepted:',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type Props = SvEditorProps & {
|
|
26
|
+
files?: File[]
|
|
27
|
+
onChange?: (files: File[]) => void
|
|
28
|
+
onReject?: (rejections: FileRejection[]) => void
|
|
29
|
+
accept?: string
|
|
30
|
+
multiple?: boolean
|
|
31
|
+
/** Max size per file in bytes. */
|
|
32
|
+
maxSize?: number
|
|
33
|
+
maxFiles?: number
|
|
34
|
+
messages?: Partial<FileMessages>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let {
|
|
38
|
+
files = $bindable([]),
|
|
39
|
+
onChange,
|
|
40
|
+
onReject,
|
|
41
|
+
accept,
|
|
42
|
+
multiple = false,
|
|
43
|
+
maxSize,
|
|
44
|
+
maxFiles,
|
|
45
|
+
disabled = false,
|
|
46
|
+
readonly = false,
|
|
47
|
+
ariaLabel,
|
|
48
|
+
invalid = false,
|
|
49
|
+
required = false,
|
|
50
|
+
error,
|
|
51
|
+
label,
|
|
52
|
+
hint,
|
|
53
|
+
dir,
|
|
54
|
+
id,
|
|
55
|
+
messages,
|
|
56
|
+
}: Props = $props()
|
|
57
|
+
|
|
58
|
+
const autoId = nextEditorId('sv-file')
|
|
59
|
+
const uid = $derived(id ?? autoId)
|
|
60
|
+
const M = $derived(resolveMessages(DEFAULT_MESSAGES, messages))
|
|
61
|
+
|
|
62
|
+
const fu = createFileUpload({
|
|
63
|
+
files: () => files,
|
|
64
|
+
onChange: (f) => { files = f; onChange?.(f) },
|
|
65
|
+
onReject: (r) => onReject?.(r),
|
|
66
|
+
accept: () => accept,
|
|
67
|
+
multiple: () => multiple,
|
|
68
|
+
maxSize: () => maxSize,
|
|
69
|
+
maxFiles: () => maxFiles,
|
|
70
|
+
disabled: () => disabled,
|
|
71
|
+
readonly: () => readonly,
|
|
72
|
+
id: () => uid,
|
|
73
|
+
invalid: () => invalid,
|
|
74
|
+
required: () => required,
|
|
75
|
+
error: () => error,
|
|
76
|
+
hint: () => hint,
|
|
77
|
+
ariaLabel: () => ariaLabel,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
let inputEl = $state<HTMLInputElement | null>(null)
|
|
81
|
+
|
|
82
|
+
function openPicker() { if (fu.isInteractive) inputEl?.click() }
|
|
83
|
+
function onDropzoneKey(e: KeyboardEvent) {
|
|
84
|
+
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openPicker() }
|
|
85
|
+
}
|
|
86
|
+
function onInputChange(e: Event) {
|
|
87
|
+
const list = (e.currentTarget as HTMLInputElement).files
|
|
88
|
+
if (list) fu.addFiles([...list])
|
|
89
|
+
;(e.currentTarget as HTMLInputElement).value = '' // allow re-selecting the same file
|
|
90
|
+
}
|
|
91
|
+
function onDrop(e: DragEvent) {
|
|
92
|
+
e.preventDefault()
|
|
93
|
+
fu.setDragging(false)
|
|
94
|
+
if (e.dataTransfer?.files) fu.addFiles([...e.dataTransfer.files])
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const fmtSize = (n: number) => (n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1048576).toFixed(1)} MB`)
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<SvField id={uid} {label} {hint} {error} {required} {dir}>
|
|
101
|
+
<div class="sv-file" class:is-disabled={disabled}>
|
|
102
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
103
|
+
<div
|
|
104
|
+
class="sv-file__zone"
|
|
105
|
+
class:is-dragging={fu.dragging}
|
|
106
|
+
class:is-invalid={invalid}
|
|
107
|
+
{...fu.dropzoneProps()}
|
|
108
|
+
onclick={openPicker}
|
|
109
|
+
onkeydown={onDropzoneKey}
|
|
110
|
+
ondragenter={(e) => { e.preventDefault(); fu.setDragging(true) }}
|
|
111
|
+
ondragover={(e) => { e.preventDefault(); fu.setDragging(true) }}
|
|
112
|
+
ondragleave={() => fu.setDragging(false)}
|
|
113
|
+
ondrop={onDrop}
|
|
114
|
+
>
|
|
115
|
+
<svg class="sv-file__icon" viewBox="0 0 24 24" width="26" height="26" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" /></svg>
|
|
116
|
+
<p class="sv-file__prompt">{M.prompt} <span class="sv-file__browse">{M.browse}</span></p>
|
|
117
|
+
{#if accept}<p class="sv-file__types">{M.hintTypes} {accept}</p>{/if}
|
|
118
|
+
<input bind:this={inputEl} class="sv-file__input" {...fu.inputProps()} onchange={onInputChange} />
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
{#if files.length}
|
|
122
|
+
<ul class="sv-file__list">
|
|
123
|
+
{#each files as file, i (file.name + file.size + i)}
|
|
124
|
+
<li class="sv-file__item">
|
|
125
|
+
<span class="sv-file__name" title={file.name}>{file.name}</span>
|
|
126
|
+
<span class="sv-file__size">{fmtSize(file.size)}</span>
|
|
127
|
+
{#if fu.isInteractive}
|
|
128
|
+
<button class="sv-file__remove" aria-label={`${M.remove} ${file.name}`} {...fu.removeProps(i)}>×</button>
|
|
129
|
+
{/if}
|
|
130
|
+
</li>
|
|
131
|
+
{/each}
|
|
132
|
+
</ul>
|
|
133
|
+
{/if}
|
|
134
|
+
</div>
|
|
135
|
+
</SvField>
|
|
136
|
+
|
|
137
|
+
<style>
|
|
138
|
+
.sv-file {
|
|
139
|
+
--_accent: var(--sg-accent, #2563eb);
|
|
140
|
+
--_border: var(--sg-input-border, var(--sg-border, #cbd5e1));
|
|
141
|
+
--_radius: var(--sg-radius, 8px);
|
|
142
|
+
display: flex; flex-direction: column; gap: 8px; width: 320px; color: var(--sg-fg, #0f172a);
|
|
143
|
+
}
|
|
144
|
+
.sv-file.is-disabled { opacity: 0.6; }
|
|
145
|
+
.sv-file__zone {
|
|
146
|
+
display: flex; flex-direction: column; align-items: center; gap: 4px;
|
|
147
|
+
padding: 22px 16px; text-align: center; cursor: pointer;
|
|
148
|
+
background: var(--sg-input-bg, #fff); color: var(--sg-muted, #64748b);
|
|
149
|
+
border: 1.5px dashed var(--_border); border-radius: var(--_radius); transition: border-color 0.15s, background 0.15s;
|
|
150
|
+
}
|
|
151
|
+
.sv-file__zone:hover, .sv-file__zone:focus-visible { border-color: var(--_accent); outline: none; }
|
|
152
|
+
.sv-file__zone.is-dragging { border-color: var(--_accent); background: color-mix(in srgb, var(--_accent) 8%, transparent); color: var(--_accent); }
|
|
153
|
+
.sv-file__zone.is-invalid { border-color: var(--sg-danger, #dc2626); }
|
|
154
|
+
.sv-file__icon { color: var(--_accent); }
|
|
155
|
+
.sv-file__prompt { margin: 0; font-size: 13px; }
|
|
156
|
+
.sv-file__browse { color: var(--_accent); font-weight: 650; text-decoration: underline; }
|
|
157
|
+
.sv-file__types { margin: 0; font-size: 11.5px; opacity: 0.8; }
|
|
158
|
+
.sv-file__input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }
|
|
159
|
+
|
|
160
|
+
.sv-file__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
|
|
161
|
+
.sv-file__item {
|
|
162
|
+
display: flex; align-items: center; gap: 8px; padding: 6px 8px; font-size: 12.5px;
|
|
163
|
+
background: var(--sg-header-bg, #f8fafc); border: 1px solid var(--sg-border, #e2e8f0); border-radius: 6px;
|
|
164
|
+
}
|
|
165
|
+
.sv-file__name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 550; }
|
|
166
|
+
.sv-file__size { color: var(--sg-muted, #64748b); flex: none; font-variant-numeric: tabular-nums; }
|
|
167
|
+
.sv-file__remove { flex: none; background: none; border: 0; color: var(--sg-muted, #64748b); cursor: pointer; font-size: 16px; line-height: 1; padding: 0 2px; }
|
|
168
|
+
.sv-file__remove:hover { color: var(--sg-danger, #dc2626); }
|
|
169
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type { FileRejection, FileRejectReason } from './createFileUpload.svelte';
|
|
2
|
+
import { type SvEditorProps } from './editor-contract';
|
|
3
|
+
import { type FileRejection } from './createFileUpload.svelte';
|
|
4
|
+
/** User-facing strings (localizable via `messages`). */
|
|
5
|
+
type FileMessages = {
|
|
6
|
+
prompt: string;
|
|
7
|
+
browse: string;
|
|
8
|
+
remove: string;
|
|
9
|
+
hintTypes: string;
|
|
10
|
+
};
|
|
11
|
+
type Props = SvEditorProps & {
|
|
12
|
+
files?: File[];
|
|
13
|
+
onChange?: (files: File[]) => void;
|
|
14
|
+
onReject?: (rejections: FileRejection[]) => void;
|
|
15
|
+
accept?: string;
|
|
16
|
+
multiple?: boolean;
|
|
17
|
+
/** Max size per file in bytes. */
|
|
18
|
+
maxSize?: number;
|
|
19
|
+
maxFiles?: number;
|
|
20
|
+
messages?: Partial<FileMessages>;
|
|
21
|
+
};
|
|
22
|
+
declare const SvFileUpload: import("svelte").Component<Props, {}, "files">;
|
|
23
|
+
type SvFileUpload = ReturnType<typeof SvFileUpload>;
|
|
24
|
+
export default SvFileUpload;
|
package/dist/SvForm.svelte
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
+
import type { Validator } from './validators'
|
|
3
|
+
|
|
2
4
|
export type FormFieldType =
|
|
3
5
|
| 'text' | 'email' | 'tel' | 'textarea' | 'number' | 'password'
|
|
4
6
|
| 'select' | 'checkbox' | 'switch' | 'date' | 'color' | 'rating'
|
|
@@ -10,6 +12,8 @@
|
|
|
10
12
|
required?: boolean
|
|
11
13
|
placeholder?: string
|
|
12
14
|
options?: Array<{ value: string | number; label: string }>
|
|
15
|
+
/** Declarative validation rules (see `rules` - email/pattern/min/compare...). */
|
|
16
|
+
rules?: ReadonlyArray<Validator>
|
|
13
17
|
/** Return an error message, or null/undefined when valid. */
|
|
14
18
|
validate?: (value: any, values: Record<string, any>) => string | null | undefined
|
|
15
19
|
/** Span full width in the grid. */
|
|
@@ -32,6 +36,7 @@
|
|
|
32
36
|
import SvColorInput from './SvColorInput.svelte'
|
|
33
37
|
import SvRating from './SvRating.svelte'
|
|
34
38
|
import SvButton from './SvButton.svelte'
|
|
39
|
+
import { runRules } from './validators'
|
|
35
40
|
|
|
36
41
|
type Props = {
|
|
37
42
|
fields: ReadonlyArray<FormField>
|
|
@@ -64,7 +69,8 @@
|
|
|
64
69
|
const v = values[name]
|
|
65
70
|
let err: string | null | undefined = null
|
|
66
71
|
if (field.required && (v == null || v === '' || (Array.isArray(v) && !v.length))) err = `${field.label} is required`
|
|
67
|
-
|
|
72
|
+
if (!err && field.rules) err = runRules(v, field.rules, values)
|
|
73
|
+
if (!err && field.validate) err = field.validate(v, values)
|
|
68
74
|
const next = { ...errors }
|
|
69
75
|
if (err) next[name] = err
|
|
70
76
|
else delete next[name]
|
package/dist/SvForm.svelte.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Validator } from './validators';
|
|
1
2
|
export type FormFieldType = 'text' | 'email' | 'tel' | 'textarea' | 'number' | 'password' | 'select' | 'checkbox' | 'switch' | 'date' | 'color' | 'rating';
|
|
2
3
|
export type FormField = {
|
|
3
4
|
name: string;
|
|
@@ -9,6 +10,8 @@ export type FormField = {
|
|
|
9
10
|
value: string | number;
|
|
10
11
|
label: string;
|
|
11
12
|
}>;
|
|
13
|
+
/** Declarative validation rules (see `rules` - email/pattern/min/compare...). */
|
|
14
|
+
rules?: ReadonlyArray<Validator>;
|
|
12
15
|
/** Return an error message, or null/undefined when valid. */
|
|
13
16
|
validate?: (value: any, values: Record<string, any>) => string | null | undefined;
|
|
14
17
|
/** Span full width in the grid. */
|
package/dist/SvGauge.svelte
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* The arc/needle geometry + `role="meter"` ARIA live in the headless
|
|
8
8
|
* `createGauge` core; this component is just one styled renderer over it.
|
|
9
9
|
*/
|
|
10
|
+
import { type EditorDir } from './editor-contract'
|
|
10
11
|
import { createGauge } from './createGauge.svelte'
|
|
11
12
|
|
|
12
13
|
type Band = { from: number; to: number; color: string }
|
|
@@ -28,6 +29,8 @@
|
|
|
28
29
|
thickness?: number
|
|
29
30
|
formatValue?: (v: number) => string
|
|
30
31
|
ariaLabel?: string
|
|
32
|
+
/** Text direction for the center label / unit. */
|
|
33
|
+
dir?: EditorDir
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
let {
|
|
@@ -43,8 +46,11 @@
|
|
|
43
46
|
thickness = 14,
|
|
44
47
|
formatValue,
|
|
45
48
|
ariaLabel,
|
|
49
|
+
dir,
|
|
46
50
|
}: Props = $props()
|
|
47
51
|
|
|
52
|
+
const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
|
|
53
|
+
|
|
48
54
|
const gauge = createGauge({
|
|
49
55
|
value: () => value,
|
|
50
56
|
min: () => min,
|
|
@@ -63,7 +69,7 @@
|
|
|
63
69
|
const display = $derived(label ?? `${formatValue ? formatValue(clamped) : Math.round(clamped)}${unit}`)
|
|
64
70
|
</script>
|
|
65
71
|
|
|
66
|
-
<div class="sv-gauge" {...gauge.rootProps()}>
|
|
72
|
+
<div class="sv-gauge" dir={resolvedDir} {...gauge.rootProps()}>
|
|
67
73
|
<svg viewBox={`0 0 ${size} ${size}`} width={size} height={size} class="sv-gauge__svg">
|
|
68
74
|
<!-- track -->
|
|
69
75
|
<path d={arcPath(min, max, r)} class="sv-gauge__track" fill="none" stroke-width={thickness} stroke-linecap="round" />
|
package/dist/SvGauge.svelte.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SvGauge - a radial arc gauge (SVG) that renders a value within [min, max]
|
|
3
|
+
* with optional colored threshold bands, a needle, and a center label. Parity:
|
|
4
|
+
* Smart `smart-gauge` (radial). Display control; theme-driven.
|
|
5
|
+
*
|
|
6
|
+
* The arc/needle geometry + `role="meter"` ARIA live in the headless
|
|
7
|
+
* `createGauge` core; this component is just one styled renderer over it.
|
|
8
|
+
*/
|
|
9
|
+
import { type EditorDir } from './editor-contract';
|
|
1
10
|
type Band = {
|
|
2
11
|
from: number;
|
|
3
12
|
to: number;
|
|
@@ -20,6 +29,8 @@ type Props = {
|
|
|
20
29
|
thickness?: number;
|
|
21
30
|
formatValue?: (v: number) => string;
|
|
22
31
|
ariaLabel?: string;
|
|
32
|
+
/** Text direction for the center label / unit. */
|
|
33
|
+
dir?: EditorDir;
|
|
23
34
|
};
|
|
24
35
|
declare const SvGauge: import("svelte").Component<Props, {}, "">;
|
|
25
36
|
type SvGauge = ReturnType<typeof SvGauge>;
|
|
@@ -98,6 +98,11 @@ export declare function createSvGridController<TFeatures extends TableFeatures =
|
|
|
98
98
|
left: Array<string>;
|
|
99
99
|
right: Array<string>;
|
|
100
100
|
};
|
|
101
|
+
readonly effectivePinning: {
|
|
102
|
+
left: Array<string>;
|
|
103
|
+
right: Array<string>;
|
|
104
|
+
};
|
|
105
|
+
readonly isNarrowResponsive: boolean;
|
|
101
106
|
columnVirtualizerVersion: number;
|
|
102
107
|
gridStateVersion: number;
|
|
103
108
|
readonly selectionColumnWidth: number;
|
|
@@ -472,6 +477,7 @@ export declare function createSvGridController<TFeatures extends TableFeatures =
|
|
|
472
477
|
readonly buildBuckets: typeof buildBuckets;
|
|
473
478
|
readonly isInBucket: typeof isInBucket;
|
|
474
479
|
readonly facetBucketsByColumn: Map<string, FacetBucket[]>;
|
|
480
|
+
readonly serverFacetLoading: string | null;
|
|
475
481
|
readonly columnMenuFacetValues: string[];
|
|
476
482
|
readonly columnMenuVisibleFacets: string[];
|
|
477
483
|
readonly isFacetChecked: (columnId: string, value: string) => any;
|
|
@@ -275,6 +275,24 @@ export function createSvGridController(props) {
|
|
|
275
275
|
viewportVersion;
|
|
276
276
|
return scrollContainer ? scrollContainer.clientHeight : 0;
|
|
277
277
|
});
|
|
278
|
+
// --- responsive (narrow-container) mode ---
|
|
279
|
+
const responsiveBreakpoint = $derived(props.responsive && typeof props.responsive === "object" && props.responsive.breakpoint != null
|
|
280
|
+
? props.responsive.breakpoint
|
|
281
|
+
: 640);
|
|
282
|
+
// Below the breakpoint: un-pin columns (pan the whole grid), suspend
|
|
283
|
+
// fitColumns, and hide `hideBelow` columns. Guarded on width > 0 so it never
|
|
284
|
+
// triggers before the grid has measured.
|
|
285
|
+
const isNarrowResponsive = $derived(!!props.responsive && viewportWidth > 0 && viewportWidth < responsiveBreakpoint);
|
|
286
|
+
const EMPTY_PINNING = { left: [], right: [] };
|
|
287
|
+
const effectivePinning = $derived(isNarrowResponsive ? EMPTY_PINNING : columnPinning);
|
|
288
|
+
// A column with `hideBelow: N` is dropped while `responsive` is on and the
|
|
289
|
+
// grid is narrower than N px (reads viewportWidth so it re-runs on resize).
|
|
290
|
+
function isHiddenByResponsive(column) {
|
|
291
|
+
if (!props.responsive)
|
|
292
|
+
return false;
|
|
293
|
+
const hb = column.columnDef?.hideBelow;
|
|
294
|
+
return hb != null && viewportWidth > 0 && viewportWidth < hb;
|
|
295
|
+
}
|
|
278
296
|
const scrollMetrics = $derived.by(() => {
|
|
279
297
|
scrollVersion;
|
|
280
298
|
viewportVersion;
|
|
@@ -498,7 +516,9 @@ export function createSvGridController(props) {
|
|
|
498
516
|
const allColumns = $derived.by(() => {
|
|
499
517
|
let raw = grid
|
|
500
518
|
.getAllColumns()
|
|
501
|
-
.filter((column) => !hiddenColumns[column.id] &&
|
|
519
|
+
.filter((column) => !hiddenColumns[column.id] &&
|
|
520
|
+
!hiddenByGroupCollapse[column.id] &&
|
|
521
|
+
!isHiddenByResponsive(column));
|
|
502
522
|
// Apply user reorder (if any). Unknown ids in userColumnOrder are
|
|
503
523
|
// skipped; columns not in userColumnOrder keep their original
|
|
504
524
|
// relative order after the user-ordered ones.
|
|
@@ -519,8 +539,8 @@ export function createSvGridController(props) {
|
|
|
519
539
|
}
|
|
520
540
|
raw = ordered;
|
|
521
541
|
}
|
|
522
|
-
const leftIds =
|
|
523
|
-
const rightIds =
|
|
542
|
+
const leftIds = effectivePinning.left;
|
|
543
|
+
const rightIds = effectivePinning.right;
|
|
524
544
|
if (!leftIds.length && !rightIds.length)
|
|
525
545
|
return raw;
|
|
526
546
|
const pinned = new Set([...leftIds, ...rightIds]);
|
|
@@ -659,14 +679,14 @@ export function createSvGridController(props) {
|
|
|
659
679
|
const selectionWidth = showRowSelectionEffective ? selectionColumnWidth : 0;
|
|
660
680
|
const left = {};
|
|
661
681
|
let leftAcc = rowNumberWidth + selectionWidth;
|
|
662
|
-
for (const id of
|
|
682
|
+
for (const id of effectivePinning.left) {
|
|
663
683
|
left[id] = leftAcc;
|
|
664
684
|
leftAcc += getColumnWidth(id);
|
|
665
685
|
}
|
|
666
686
|
const right = {};
|
|
667
687
|
let rightAcc = 0;
|
|
668
|
-
for (let i =
|
|
669
|
-
const id =
|
|
688
|
+
for (let i = effectivePinning.right.length - 1; i >= 0; i -= 1) {
|
|
689
|
+
const id = effectivePinning.right[i];
|
|
670
690
|
if (!id)
|
|
671
691
|
continue;
|
|
672
692
|
right[id] = rightAcc;
|
|
@@ -1150,8 +1170,8 @@ export function createSvGridController(props) {
|
|
|
1150
1170
|
// that edge and the window are also rendered; negligible for typical grids,
|
|
1151
1171
|
// and correctness beats shaving a few off-screen cells.)
|
|
1152
1172
|
const window = virtualColumns;
|
|
1153
|
-
const hasLeft =
|
|
1154
|
-
const hasRight =
|
|
1173
|
+
const hasLeft = effectivePinning.left.length > 0;
|
|
1174
|
+
const hasRight = effectivePinning.right.length > 0;
|
|
1155
1175
|
if ((!hasLeft && !hasRight) || window.length === 0)
|
|
1156
1176
|
return window;
|
|
1157
1177
|
const firstIdx = window[0].index;
|
|
@@ -1462,7 +1482,8 @@ export function createSvGridController(props) {
|
|
|
1462
1482
|
// Track viewport size (not scrollVersion) so we don't recompute on
|
|
1463
1483
|
// every scroll - only when the container actually resizes.
|
|
1464
1484
|
viewportVersion;
|
|
1465
|
-
|
|
1485
|
+
// Narrow responsive mode pans instead of scaling, so skip fit scaling.
|
|
1486
|
+
if (!props.fitColumns || isNarrowResponsive)
|
|
1466
1487
|
return null;
|
|
1467
1488
|
const cols = grid.getAllColumns().filter((c) => !hiddenColumns[c.id]);
|
|
1468
1489
|
if (!cols.length)
|
|
@@ -1581,12 +1602,43 @@ export function createSvGridController(props) {
|
|
|
1581
1602
|
}
|
|
1582
1603
|
return map;
|
|
1583
1604
|
});
|
|
1605
|
+
// Server-side set-filter values: when a column's filter menu opens and the
|
|
1606
|
+
// consumer provides `serverFilterValues`, fetch the distinct values from the
|
|
1607
|
+
// server once (cached per column) instead of deriving them from the loaded
|
|
1608
|
+
// page - so the checklist shows every value, not just what's on screen.
|
|
1609
|
+
let serverFacetValues = $state({});
|
|
1610
|
+
let serverFacetLoading = $state(null);
|
|
1611
|
+
$effect(() => {
|
|
1612
|
+
const columnId = filterMenuFor ?? columnMenuFor;
|
|
1613
|
+
const fetcher = props.serverFilterValues;
|
|
1614
|
+
if (!columnId || !fetcher || serverFacetValues[columnId])
|
|
1615
|
+
return;
|
|
1616
|
+
serverFacetLoading = columnId;
|
|
1617
|
+
let cancelled = false;
|
|
1618
|
+
void fetcher(columnId)
|
|
1619
|
+
.then((values) => {
|
|
1620
|
+
if (cancelled)
|
|
1621
|
+
return;
|
|
1622
|
+
serverFacetValues = { ...serverFacetValues, [columnId]: values };
|
|
1623
|
+
serverFacetLoading = null;
|
|
1624
|
+
})
|
|
1625
|
+
.catch(() => {
|
|
1626
|
+
if (!cancelled)
|
|
1627
|
+
serverFacetLoading = null;
|
|
1628
|
+
});
|
|
1629
|
+
return () => {
|
|
1630
|
+
cancelled = true;
|
|
1631
|
+
};
|
|
1632
|
+
});
|
|
1584
1633
|
const columnMenuFacetValues = $derived.by(() => {
|
|
1585
1634
|
// The funnel popover drives via `filterMenuFor`; the column menu's Filter
|
|
1586
1635
|
// tab drives via `columnMenuFor`. Support whichever is open.
|
|
1587
1636
|
const columnId = filterMenuFor ?? columnMenuFor;
|
|
1588
1637
|
if (!columnId)
|
|
1589
1638
|
return [];
|
|
1639
|
+
// Server-provided distinct values win (fetched + cached above).
|
|
1640
|
+
if (props.serverFilterValues)
|
|
1641
|
+
return serverFacetValues[columnId] ?? [];
|
|
1590
1642
|
const column = allColumns.find((entry) => entry.id === columnId);
|
|
1591
1643
|
if (!column)
|
|
1592
1644
|
return [];
|
|
@@ -1706,6 +1758,8 @@ export function createSvGridController(props) {
|
|
|
1706
1758
|
get MIN_COLUMN_WIDTH() { return MIN_COLUMN_WIDTH; },
|
|
1707
1759
|
get columnPinning() { return columnPinning; },
|
|
1708
1760
|
set columnPinning(v) { columnPinning = v; },
|
|
1761
|
+
get effectivePinning() { return effectivePinning; },
|
|
1762
|
+
get isNarrowResponsive() { return isNarrowResponsive; },
|
|
1709
1763
|
get columnVirtualizerVersion() { return columnVirtualizerVersion; },
|
|
1710
1764
|
set columnVirtualizerVersion(v) { columnVirtualizerVersion = v; },
|
|
1711
1765
|
get gridStateVersion() { return gridStateVersion; },
|
|
@@ -2006,6 +2060,7 @@ export function createSvGridController(props) {
|
|
|
2006
2060
|
get buildBuckets() { return buildBuckets; },
|
|
2007
2061
|
get isInBucket() { return isInBucket; },
|
|
2008
2062
|
get facetBucketsByColumn() { return facetBucketsByColumn; },
|
|
2063
|
+
get serverFacetLoading() { return serverFacetLoading; },
|
|
2009
2064
|
get columnMenuFacetValues() { return columnMenuFacetValues; },
|
|
2010
2065
|
get columnMenuVisibleFacets() { return columnMenuVisibleFacets; },
|
|
2011
2066
|
get isFacetChecked() { return isFacetChecked; },
|