@svgrid/grid 2.2.35 → 2.5.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 +199 -199
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +178 -178
- package/dist/GridMenus.svelte +705 -705
- package/dist/SvAutoComplete.svelte +165 -165
- package/dist/SvAvatar.svelte +75 -75
- package/dist/SvCalendar.svelte +503 -503
- package/dist/SvCarousel.svelte +141 -141
- package/dist/SvCheckBox.svelte +102 -102
- package/dist/SvCircularProgress.svelte +109 -109
- package/dist/SvColorInput.svelte +181 -181
- package/dist/SvComboBox.svelte +275 -275
- package/dist/SvContextMenu.svelte +116 -116
- package/dist/SvCountryInput.svelte +160 -160
- package/dist/SvDrawer.svelte +254 -254
- package/dist/SvDropDownList.svelte +374 -374
- package/dist/SvDurationInput.svelte +126 -126
- package/dist/SvField.svelte +293 -293
- package/dist/SvForm.svelte +437 -437
- package/dist/SvGrid.css +2814 -2814
- package/dist/SvGrid.svelte +3490 -3490
- package/dist/SvGridChart.svelte +1716 -1716
- package/dist/SvGridChartPanel.svelte +485 -485
- package/dist/SvGridChartView.svelte +70 -70
- package/dist/SvGridDropdown.svelte +728 -728
- package/dist/SvGridSelect.svelte +266 -266
- package/dist/SvGroupCell.svelte +116 -116
- package/dist/SvListBox.svelte +326 -326
- package/dist/SvMaskedInput.svelte +122 -122
- package/dist/SvMenu.svelte +124 -124
- package/dist/SvMenuList.svelte +146 -146
- package/dist/SvMultiSelect.svelte +289 -289
- package/dist/SvNumberInput.svelte +168 -168
- package/dist/SvOtpInput.svelte +158 -158
- package/dist/SvPasswordInput.svelte +151 -151
- package/dist/SvPhoneInput.svelte +133 -133
- package/dist/SvPopover.svelte +197 -197
- package/dist/SvProgress.svelte +116 -116
- package/dist/SvRadioGroup.svelte +107 -107
- package/dist/SvRating.svelte +112 -112
- package/dist/SvResult.svelte +73 -73
- package/dist/SvRichText.svelte +211 -211
- package/dist/SvRowGroupPanel.svelte +170 -170
- package/dist/SvScrollArea.svelte +61 -61
- package/dist/SvSlider.svelte +200 -200
- package/dist/SvSwitchButton.svelte +108 -108
- package/dist/SvTagsInput.svelte +112 -112
- package/dist/SvTextInput.svelte +147 -147
- package/dist/SvTimePicker.svelte +245 -245
- package/dist/SvToaster.svelte +159 -159
- package/dist/SvToggleButton.svelte +85 -85
- package/dist/SvTooltip.svelte +161 -161
- package/dist/SvTour.svelte +208 -208
- package/dist/SvTree.svelte +444 -444
- package/dist/SvTreeSelect.svelte +235 -235
- package/dist/cdn/{GridMenus-oQYElQll.js → GridMenus-BpVcKyUr.js} +2 -2
- package/dist/cdn/{GridMenus-T-bZNprc.js → GridMenus-CeXL5IW4.js} +2 -2
- package/dist/cdn/{SvDateTimePicker-CHnUkWcH.js → SvDateTimePicker-DSUhIta8.js} +2 -2
- package/dist/cdn/{SvDateTimePicker-CRQH_U7E.js → SvDateTimePicker-h9kPyszT.js} +2 -2
- package/dist/cdn/{SvGridChart-BwVos976.js → SvGridChart-Bs2GIR2Q.js} +1 -1
- package/dist/cdn/{SvGridChart-BEJmNNx9.js → SvGridChart-CwhFz7GV.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-BOknOkrP.js → SvGridChartPanel-1WXuStzM.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-D2PjII4O.js → SvGridChartPanel-e5_nqNP9.js} +1 -1
- package/dist/cdn/{SvGridChartView-00LPUHL1.js → SvGridChartView-SmPW10dI.js} +1 -1
- package/dist/cdn/{SvGridChartView-BhUEJ5ki.js → SvGridChartView-eSPuJE6g.js} +1 -1
- package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
- package/dist/cdn/{SvGridDropdown-D13MtJ2j.js → SvGridDropdown-CtdbHcIS.js} +1 -1
- package/dist/cdn/{src-Cm7C_WOZ.js → src-DbeN1ReZ.js} +24 -24
- package/dist/cdn/{src-72QTH8lh.js → src-DmEQFW5_.js} +23 -23
- package/dist/cdn/svgrid.js +5 -5
- package/dist/cdn/svgrid.svelte-external.js +5 -5
- package/dist/chart-export.js +8 -8
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/dist/themes/index.js +28 -9
- package/package.json +11 -11
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +178 -178
- package/src/GridMenus.svelte +705 -705
- package/src/SvAutoComplete.svelte +165 -165
- package/src/SvAvatar.svelte +75 -75
- package/src/SvCalendar.svelte +503 -503
- package/src/SvCalendar.test.ts +226 -226
- package/src/SvCarousel.svelte +141 -141
- package/src/SvCheckBox.svelte +102 -102
- package/src/SvCircularProgress.svelte +109 -109
- package/src/SvColorInput.svelte +181 -181
- package/src/SvComboBox.svelte +275 -275
- package/src/SvContextMenu.svelte +116 -116
- package/src/SvCountryInput.svelte +160 -160
- package/src/SvDrawer.svelte +254 -254
- package/src/SvDropDownList.svelte +374 -374
- package/src/SvDurationInput.svelte +126 -126
- package/src/SvField.svelte +293 -293
- package/src/SvForm.svelte +437 -437
- package/src/SvForm.test.ts +411 -411
- package/src/SvGrid.controller.svelte.ts +3680 -3680
- package/src/SvGrid.css +2814 -2814
- package/src/SvGrid.svelte +3490 -3490
- package/src/SvGrid.types.ts +1708 -1708
- package/src/SvGridChart.svelte +1716 -1716
- package/src/SvGridChartPanel.svelte +485 -485
- package/src/SvGridChartView.svelte +70 -70
- package/src/SvGridDropdown.svelte +728 -728
- package/src/SvGridSelect.svelte +266 -266
- package/src/SvGroupCell.svelte +116 -116
- package/src/SvListBox.svelte +326 -326
- package/src/SvMaskedInput.svelte +122 -122
- package/src/SvMenu.svelte +124 -124
- package/src/SvMenu.test.ts +97 -97
- package/src/SvMenuList.svelte +146 -146
- package/src/SvMultiSelect.svelte +289 -289
- package/src/SvNumberInput.svelte +168 -168
- package/src/SvOtpInput.svelte +158 -158
- package/src/SvPasswordInput.svelte +151 -151
- package/src/SvPhoneInput.svelte +133 -133
- package/src/SvPopover.svelte +197 -197
- package/src/SvProgress.svelte +116 -116
- package/src/SvRadioGroup.svelte +107 -107
- package/src/SvRating.svelte +112 -112
- package/src/SvResult.svelte +73 -73
- package/src/SvRichText.svelte +211 -211
- package/src/SvRowGroupPanel.svelte +170 -170
- package/src/SvScrollArea.svelte +61 -61
- package/src/SvSlider.svelte +200 -200
- package/src/SvSwitchButton.svelte +108 -108
- package/src/SvTagsInput.svelte +112 -112
- package/src/SvTextInput.svelte +147 -147
- package/src/SvTimePicker.svelte +245 -245
- package/src/SvToaster.svelte +159 -159
- package/src/SvToaster.test.ts +95 -95
- package/src/SvToggleButton.svelte +85 -85
- package/src/SvTooltip.svelte +161 -161
- package/src/SvTour.svelte +208 -208
- package/src/SvTree.svelte +444 -444
- package/src/SvTreeSelect.svelte +235 -235
- package/src/a11y/dismissable.test.ts +119 -119
- package/src/a11y/dismissable.ts +114 -114
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/ai.test.ts +502 -502
- package/src/ai.ts +1391 -1391
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +805 -805
- package/src/builtin-editors.grid.test.ts +85 -85
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.test.ts +513 -513
- package/src/cell-render.ts +496 -496
- package/src/cell-values.ts +118 -118
- package/src/chart-export.ts +201 -201
- package/src/chart-view.svelte.ts +36 -36
- package/src/chart.ts +2295 -2295
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/core.performance.test.ts +30 -30
- package/src/core.ts +1261 -1261
- package/src/createAutocomplete.svelte.ts +132 -132
- package/src/createCombobox.svelte.ts +191 -191
- package/src/createCountryInput.svelte.ts +157 -157
- package/src/createDropdownList.svelte.ts +168 -168
- package/src/createForm.svelte.ts +386 -386
- 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 +250 -250
- package/src/createMenu.svelte.ts +224 -224
- package/src/createPopoverSelect.svelte.ts +213 -213
- package/src/createSlider.svelte.ts +191 -191
- package/src/createTooltip.svelte.ts +144 -144
- package/src/createTree.svelte.ts +319 -319
- package/src/editing.test.ts +949 -949
- package/src/editing.ts +606 -606
- package/src/editor-contract.ts +164 -164
- package/src/editor-registry.grid.test.ts +144 -144
- package/src/editor-registry.ts +122 -122
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +601 -601
- package/src/filter-operators.ts +157 -157
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/index.ts +724 -724
- package/src/js-scroller.svelte.ts +173 -173
- package/src/keyboard-handlers.ts +270 -270
- package/src/keyboard.test.ts +59 -59
- package/src/keyboard.ts +97 -97
- package/src/list-nav.test.ts +49 -49
- package/src/list-nav.ts +29 -29
- package/src/list-option.test.ts +56 -56
- package/src/list-option.ts +172 -172
- package/src/menus.ts +567 -567
- package/src/merge-objects.ts +48 -48
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/src/overlays.test.ts +90 -90
- package/src/render-component.ts +28 -28
- package/src/row-resize.ts +210 -210
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +872 -872
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +491 -491
- package/src/server-data-source.test.ts +289 -289
- package/src/server-data-source.ts +413 -413
- package/src/sparkline.test.ts +68 -68
- package/src/sparkline.ts +169 -169
- package/src/spreadsheet.test.ts +488 -488
- package/src/spreadsheet.ts +312 -312
- package/src/static-functions.ts +11 -11
- package/src/subscribe.ts +38 -38
- package/src/svgrid-wrapper.types.ts +526 -526
- package/src/svgrid.async-editor-options.test.ts +271 -271
- package/src/svgrid.auto-row-height.test.ts +204 -204
- package/src/svgrid.behavior.test.ts +705 -705
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.comments-autocomplete.test.ts +123 -123
- package/src/svgrid.context-menu.test.ts +147 -147
- package/src/svgrid.features.test.ts +157 -157
- package/src/svgrid.filter-depth.test.ts +163 -163
- package/src/svgrid.filter-menu-listbox.svelte.test.ts +331 -322
- package/src/svgrid.filter-menu-scroll.test.ts +112 -112
- package/src/svgrid.grand-total.test.ts +188 -188
- package/src/svgrid.group-display-mode.test.ts +171 -171
- package/src/svgrid.group-footers.test.ts +121 -121
- package/src/svgrid.group-pagination.test.ts +153 -153
- package/src/svgrid.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.tree-data.test.ts +186 -186
- package/src/svgrid.wrapper.test.ts +40 -40
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +278 -257
- package/src/toast-store.svelte.ts +246 -246
- package/src/toast-store.test.ts +147 -147
- package/src/tree-row-model.test.ts +168 -168
- package/src/ui-buttons.test.ts +144 -144
- package/src/ui-inputs.test.ts +118 -118
- package/src/ui-localization.test.ts +113 -113
- package/src/ui-range.test.ts +70 -70
- package/src/ui-selection.test.ts +155 -155
- package/src/ui-tier1.test.ts +142 -142
- package/src/virtual.test.ts +88 -88
- 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
- package/themes/ag-alpine.css +2 -2
- package/themes/antd.css +4 -4
- package/themes/atlassian.css +1 -1
- package/themes/ember.css +2 -2
- package/themes/fluent.css +1 -1
- package/themes/github.css +1 -1
- package/themes/nord.css +2 -2
- package/themes/notion.css +2 -2
- package/themes/salesforce.css +1 -1
- package/themes/tailwind.css +1 -1
- package/themes/vercel.css +1 -1
package/src/list-option.ts
CHANGED
|
@@ -1,172 +1,172 @@
|
|
|
1
|
-
/** Shared option shape for the SvGrid UI-kit selection controls. */
|
|
2
|
-
export type ListOption = {
|
|
3
|
-
value: string | number
|
|
4
|
-
label: string
|
|
5
|
-
disabled?: boolean
|
|
6
|
-
/** Optional group heading this option belongs under. */
|
|
7
|
-
group?: string
|
|
8
|
-
/** Optional color swatch (any CSS color) shown before the label. */
|
|
9
|
-
color?: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Coerce a raw options array into well-formed ListOptions. A primitive item
|
|
14
|
-
* (`1`, `'a'`) becomes `{ value, label: String(value) }`; an object missing a
|
|
15
|
-
* `label` or `value` gets the other filled in. This makes a caller who passes
|
|
16
|
-
* e.g. `[1, 2, 3]` or `['a', 'b']` render sensibly instead of crashing a keyed
|
|
17
|
-
* `#each` on `undefined`/duplicate `value`s.
|
|
18
|
-
*/
|
|
19
|
-
export function normalizeOptions(raw: ReadonlyArray<ListOption | string | number> | null | undefined): ListOption[] {
|
|
20
|
-
if (!raw) return []
|
|
21
|
-
return raw.map((o) => {
|
|
22
|
-
if (o != null && typeof o === 'object') {
|
|
23
|
-
const opt = o as Partial<ListOption>
|
|
24
|
-
const value = opt.value ?? opt.label ?? ''
|
|
25
|
-
return { ...(opt as ListOption), value, label: opt.label ?? String(value) }
|
|
26
|
-
}
|
|
27
|
-
return { value: o, label: String(o) }
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Case-insensitive substring filter over option labels. */
|
|
32
|
-
export function filterOptions(options: ReadonlyArray<ListOption>, query: string): ListOption[] {
|
|
33
|
-
const q = query.trim().toLowerCase()
|
|
34
|
-
if (!q) return [...options]
|
|
35
|
-
return options.filter((o) => o.label.toLowerCase().includes(q))
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** An option carrying its position in the flat source array (for prop-getters). */
|
|
39
|
-
export type IndexedOption = ListOption & { index: number }
|
|
40
|
-
/** A section of options that share a `group` heading (null = ungrouped). */
|
|
41
|
-
export type OptionGroup = { group: string | null; options: IndexedOption[] }
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Bucket options by their `group` heading, preserving each option's flat index
|
|
45
|
-
* so grouped rendering still drives `optionProps(index)` etc. Groups appear in
|
|
46
|
-
* first-seen order. When no option sets `group`, the result is a single
|
|
47
|
-
* `group: null` section (render it flat).
|
|
48
|
-
*/
|
|
49
|
-
export function groupOptions(options: ReadonlyArray<ListOption>): OptionGroup[] {
|
|
50
|
-
const groups: OptionGroup[] = []
|
|
51
|
-
const byName = new Map<string | null, OptionGroup>()
|
|
52
|
-
options.forEach((o, index) => {
|
|
53
|
-
const key = o.group ?? null
|
|
54
|
-
let g = byName.get(key)
|
|
55
|
-
if (!g) { g = { group: key, options: [] }; byName.set(key, g); groups.push(g) }
|
|
56
|
-
g.options.push({ ...o, index })
|
|
57
|
-
})
|
|
58
|
-
return groups
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Whether any option declares a `group` (so headings are worth rendering). */
|
|
62
|
-
export function hasGroups(options: ReadonlyArray<ListOption>): boolean {
|
|
63
|
-
return options.some((o) => o.group != null)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** Fixed px, or a per-option function - lets a virtualized list mix row heights. */
|
|
67
|
-
export type RowHeight = number | ((opt: IndexedOption, index: number) => number)
|
|
68
|
-
|
|
69
|
-
/** One row of the flattened virtualization model: a group heading or an option. */
|
|
70
|
-
export type VirtualListRow =
|
|
71
|
-
| { type: 'group'; label: string; size: number }
|
|
72
|
-
| { type: 'option'; opt: IndexedOption; size: number }
|
|
73
|
-
|
|
74
|
-
export type FlatVirtualModel = {
|
|
75
|
-
/** Group headings + options in render order, each with its px height. */
|
|
76
|
-
entries: VirtualListRow[]
|
|
77
|
-
/** Whether any group heading rows are present. */
|
|
78
|
-
hasGroups: boolean
|
|
79
|
-
/** Height (px) of the entry at flat index `i` - feeds the virtualizer's `estimateSize`. */
|
|
80
|
-
sizeAt: (i: number) => number
|
|
81
|
-
/** Maps an OPTION index (position in the source options array, as used by
|
|
82
|
-
* `optionProps(index)`) to its flat entry index - so the active option can
|
|
83
|
-
* be scrolled into view even with group rows interleaved. */
|
|
84
|
-
optionFlatIndex: number[]
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Flatten a (possibly grouped) option list into a single virtualization model:
|
|
89
|
-
* group headings become rows interleaved with their options, and each row
|
|
90
|
-
* carries its pixel height. This is what lets the selection controls window a
|
|
91
|
-
* GROUPED list (previously they fell back to rendering every node) and support
|
|
92
|
-
* variable row heights, while reusing the shared `createSvelteVirtualizer`.
|
|
93
|
-
*
|
|
94
|
-
* Pure - no DOM. Builds on `groupOptions`, which already tags each option with
|
|
95
|
-
* its flat `index` (the value `optionProps(index)` expects).
|
|
96
|
-
*/
|
|
97
|
-
export function flattenForVirtual(
|
|
98
|
-
options: ReadonlyArray<ListOption>,
|
|
99
|
-
opts: { rowHeight: RowHeight; groupHeaderHeight?: number },
|
|
100
|
-
): FlatVirtualModel {
|
|
101
|
-
const headerH = Math.max(1, opts.groupHeaderHeight ?? 28)
|
|
102
|
-
const rh = opts.rowHeight
|
|
103
|
-
const sizeOf = (o: IndexedOption) => Math.max(1, typeof rh === 'function' ? rh(o, o.index) : rh)
|
|
104
|
-
|
|
105
|
-
const entries: VirtualListRow[] = []
|
|
106
|
-
const optionFlatIndex = new Array<number>(options.length)
|
|
107
|
-
let anyGroups = false
|
|
108
|
-
|
|
109
|
-
for (const g of groupOptions(options)) {
|
|
110
|
-
if (g.group != null) {
|
|
111
|
-
anyGroups = true
|
|
112
|
-
entries.push({ type: 'group', label: g.group, size: headerH })
|
|
113
|
-
}
|
|
114
|
-
for (const opt of g.options) {
|
|
115
|
-
optionFlatIndex[opt.index] = entries.length
|
|
116
|
-
entries.push({ type: 'option', opt, size: sizeOf(opt) })
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
entries,
|
|
122
|
-
hasGroups: anyGroups,
|
|
123
|
-
sizeAt: (i) => entries[i]?.size ?? 0,
|
|
124
|
-
optionFlatIndex,
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Next enabled option index whose label starts with `buffer` (type-ahead),
|
|
130
|
-
* searching forward from just after `from` and wrapping. Returns -1 for no
|
|
131
|
-
* match / empty buffer. Case-insensitive.
|
|
132
|
-
*/
|
|
133
|
-
export function nextTypeaheadIndex(
|
|
134
|
-
options: ReadonlyArray<ListOption>,
|
|
135
|
-
buffer: string,
|
|
136
|
-
from: number,
|
|
137
|
-
): number {
|
|
138
|
-
const b = buffer.trim().toLowerCase()
|
|
139
|
-
if (!b || !options.length) return -1
|
|
140
|
-
const n = options.length
|
|
141
|
-
for (let k = 1; k <= n; k++) {
|
|
142
|
-
const i = (from + k) % n
|
|
143
|
-
const o = options[i]
|
|
144
|
-
if (o && !o.disabled && o.label.toLowerCase().startsWith(b)) return i
|
|
145
|
-
}
|
|
146
|
-
return -1
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* A tiny type-ahead buffer: accumulates printable characters within `timeout`
|
|
151
|
-
* ms of each other, then resets. Frameworkfree; the caller supplies scheduling.
|
|
152
|
-
*/
|
|
153
|
-
export function createTypeaheadBuffer(timeout = 600) {
|
|
154
|
-
let buffer = ''
|
|
155
|
-
let timer: ReturnType<typeof setTimeout> | undefined
|
|
156
|
-
return {
|
|
157
|
-
get value() { return buffer },
|
|
158
|
-
/** Append a character and (re)arm the reset timer. Returns the new buffer. */
|
|
159
|
-
push(char: string): string {
|
|
160
|
-
buffer += char
|
|
161
|
-
if (timer) clearTimeout(timer)
|
|
162
|
-
timer = setTimeout(() => { buffer = '' }, timeout)
|
|
163
|
-
return buffer
|
|
164
|
-
},
|
|
165
|
-
clear() { buffer = ''; if (timer) clearTimeout(timer) },
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/** Whether a keydown is a bare printable character (a type-ahead candidate). */
|
|
170
|
-
export function isTypeaheadKey(e: KeyboardEvent): boolean {
|
|
171
|
-
return e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && e.key !== ' '
|
|
172
|
-
}
|
|
1
|
+
/** Shared option shape for the SvGrid UI-kit selection controls. */
|
|
2
|
+
export type ListOption = {
|
|
3
|
+
value: string | number
|
|
4
|
+
label: string
|
|
5
|
+
disabled?: boolean
|
|
6
|
+
/** Optional group heading this option belongs under. */
|
|
7
|
+
group?: string
|
|
8
|
+
/** Optional color swatch (any CSS color) shown before the label. */
|
|
9
|
+
color?: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Coerce a raw options array into well-formed ListOptions. A primitive item
|
|
14
|
+
* (`1`, `'a'`) becomes `{ value, label: String(value) }`; an object missing a
|
|
15
|
+
* `label` or `value` gets the other filled in. This makes a caller who passes
|
|
16
|
+
* e.g. `[1, 2, 3]` or `['a', 'b']` render sensibly instead of crashing a keyed
|
|
17
|
+
* `#each` on `undefined`/duplicate `value`s.
|
|
18
|
+
*/
|
|
19
|
+
export function normalizeOptions(raw: ReadonlyArray<ListOption | string | number> | null | undefined): ListOption[] {
|
|
20
|
+
if (!raw) return []
|
|
21
|
+
return raw.map((o) => {
|
|
22
|
+
if (o != null && typeof o === 'object') {
|
|
23
|
+
const opt = o as Partial<ListOption>
|
|
24
|
+
const value = opt.value ?? opt.label ?? ''
|
|
25
|
+
return { ...(opt as ListOption), value, label: opt.label ?? String(value) }
|
|
26
|
+
}
|
|
27
|
+
return { value: o, label: String(o) }
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Case-insensitive substring filter over option labels. */
|
|
32
|
+
export function filterOptions(options: ReadonlyArray<ListOption>, query: string): ListOption[] {
|
|
33
|
+
const q = query.trim().toLowerCase()
|
|
34
|
+
if (!q) return [...options]
|
|
35
|
+
return options.filter((o) => o.label.toLowerCase().includes(q))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** An option carrying its position in the flat source array (for prop-getters). */
|
|
39
|
+
export type IndexedOption = ListOption & { index: number }
|
|
40
|
+
/** A section of options that share a `group` heading (null = ungrouped). */
|
|
41
|
+
export type OptionGroup = { group: string | null; options: IndexedOption[] }
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Bucket options by their `group` heading, preserving each option's flat index
|
|
45
|
+
* so grouped rendering still drives `optionProps(index)` etc. Groups appear in
|
|
46
|
+
* first-seen order. When no option sets `group`, the result is a single
|
|
47
|
+
* `group: null` section (render it flat).
|
|
48
|
+
*/
|
|
49
|
+
export function groupOptions(options: ReadonlyArray<ListOption>): OptionGroup[] {
|
|
50
|
+
const groups: OptionGroup[] = []
|
|
51
|
+
const byName = new Map<string | null, OptionGroup>()
|
|
52
|
+
options.forEach((o, index) => {
|
|
53
|
+
const key = o.group ?? null
|
|
54
|
+
let g = byName.get(key)
|
|
55
|
+
if (!g) { g = { group: key, options: [] }; byName.set(key, g); groups.push(g) }
|
|
56
|
+
g.options.push({ ...o, index })
|
|
57
|
+
})
|
|
58
|
+
return groups
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Whether any option declares a `group` (so headings are worth rendering). */
|
|
62
|
+
export function hasGroups(options: ReadonlyArray<ListOption>): boolean {
|
|
63
|
+
return options.some((o) => o.group != null)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Fixed px, or a per-option function - lets a virtualized list mix row heights. */
|
|
67
|
+
export type RowHeight = number | ((opt: IndexedOption, index: number) => number)
|
|
68
|
+
|
|
69
|
+
/** One row of the flattened virtualization model: a group heading or an option. */
|
|
70
|
+
export type VirtualListRow =
|
|
71
|
+
| { type: 'group'; label: string; size: number }
|
|
72
|
+
| { type: 'option'; opt: IndexedOption; size: number }
|
|
73
|
+
|
|
74
|
+
export type FlatVirtualModel = {
|
|
75
|
+
/** Group headings + options in render order, each with its px height. */
|
|
76
|
+
entries: VirtualListRow[]
|
|
77
|
+
/** Whether any group heading rows are present. */
|
|
78
|
+
hasGroups: boolean
|
|
79
|
+
/** Height (px) of the entry at flat index `i` - feeds the virtualizer's `estimateSize`. */
|
|
80
|
+
sizeAt: (i: number) => number
|
|
81
|
+
/** Maps an OPTION index (position in the source options array, as used by
|
|
82
|
+
* `optionProps(index)`) to its flat entry index - so the active option can
|
|
83
|
+
* be scrolled into view even with group rows interleaved. */
|
|
84
|
+
optionFlatIndex: number[]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Flatten a (possibly grouped) option list into a single virtualization model:
|
|
89
|
+
* group headings become rows interleaved with their options, and each row
|
|
90
|
+
* carries its pixel height. This is what lets the selection controls window a
|
|
91
|
+
* GROUPED list (previously they fell back to rendering every node) and support
|
|
92
|
+
* variable row heights, while reusing the shared `createSvelteVirtualizer`.
|
|
93
|
+
*
|
|
94
|
+
* Pure - no DOM. Builds on `groupOptions`, which already tags each option with
|
|
95
|
+
* its flat `index` (the value `optionProps(index)` expects).
|
|
96
|
+
*/
|
|
97
|
+
export function flattenForVirtual(
|
|
98
|
+
options: ReadonlyArray<ListOption>,
|
|
99
|
+
opts: { rowHeight: RowHeight; groupHeaderHeight?: number },
|
|
100
|
+
): FlatVirtualModel {
|
|
101
|
+
const headerH = Math.max(1, opts.groupHeaderHeight ?? 28)
|
|
102
|
+
const rh = opts.rowHeight
|
|
103
|
+
const sizeOf = (o: IndexedOption) => Math.max(1, typeof rh === 'function' ? rh(o, o.index) : rh)
|
|
104
|
+
|
|
105
|
+
const entries: VirtualListRow[] = []
|
|
106
|
+
const optionFlatIndex = new Array<number>(options.length)
|
|
107
|
+
let anyGroups = false
|
|
108
|
+
|
|
109
|
+
for (const g of groupOptions(options)) {
|
|
110
|
+
if (g.group != null) {
|
|
111
|
+
anyGroups = true
|
|
112
|
+
entries.push({ type: 'group', label: g.group, size: headerH })
|
|
113
|
+
}
|
|
114
|
+
for (const opt of g.options) {
|
|
115
|
+
optionFlatIndex[opt.index] = entries.length
|
|
116
|
+
entries.push({ type: 'option', opt, size: sizeOf(opt) })
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
entries,
|
|
122
|
+
hasGroups: anyGroups,
|
|
123
|
+
sizeAt: (i) => entries[i]?.size ?? 0,
|
|
124
|
+
optionFlatIndex,
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Next enabled option index whose label starts with `buffer` (type-ahead),
|
|
130
|
+
* searching forward from just after `from` and wrapping. Returns -1 for no
|
|
131
|
+
* match / empty buffer. Case-insensitive.
|
|
132
|
+
*/
|
|
133
|
+
export function nextTypeaheadIndex(
|
|
134
|
+
options: ReadonlyArray<ListOption>,
|
|
135
|
+
buffer: string,
|
|
136
|
+
from: number,
|
|
137
|
+
): number {
|
|
138
|
+
const b = buffer.trim().toLowerCase()
|
|
139
|
+
if (!b || !options.length) return -1
|
|
140
|
+
const n = options.length
|
|
141
|
+
for (let k = 1; k <= n; k++) {
|
|
142
|
+
const i = (from + k) % n
|
|
143
|
+
const o = options[i]
|
|
144
|
+
if (o && !o.disabled && o.label.toLowerCase().startsWith(b)) return i
|
|
145
|
+
}
|
|
146
|
+
return -1
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A tiny type-ahead buffer: accumulates printable characters within `timeout`
|
|
151
|
+
* ms of each other, then resets. Frameworkfree; the caller supplies scheduling.
|
|
152
|
+
*/
|
|
153
|
+
export function createTypeaheadBuffer(timeout = 600) {
|
|
154
|
+
let buffer = ''
|
|
155
|
+
let timer: ReturnType<typeof setTimeout> | undefined
|
|
156
|
+
return {
|
|
157
|
+
get value() { return buffer },
|
|
158
|
+
/** Append a character and (re)arm the reset timer. Returns the new buffer. */
|
|
159
|
+
push(char: string): string {
|
|
160
|
+
buffer += char
|
|
161
|
+
if (timer) clearTimeout(timer)
|
|
162
|
+
timer = setTimeout(() => { buffer = '' }, timeout)
|
|
163
|
+
return buffer
|
|
164
|
+
},
|
|
165
|
+
clear() { buffer = ''; if (timer) clearTimeout(timer) },
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Whether a keydown is a bare printable character (a type-ahead candidate). */
|
|
170
|
+
export function isTypeaheadKey(e: KeyboardEvent): boolean {
|
|
171
|
+
return e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && e.key !== ' '
|
|
172
|
+
}
|