@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/SvField.svelte
CHANGED
|
@@ -1,293 +1,293 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
* SvField - the shared field chrome for every value-bearing editor in the kit.
|
|
4
|
-
* It renders an optional `label` (wired to the control via `for`/`id`), the
|
|
5
|
-
* control itself (passed as children), and an optional `hint` / `error` line
|
|
6
|
-
* whose ids match `editorHintId` / `editorErrorId` for `aria-describedby`.
|
|
7
|
-
*
|
|
8
|
-
* Two modes:
|
|
9
|
-
*
|
|
10
|
-
* 1. Default (`frame` unset) - SvField renders only the label / children / hint
|
|
11
|
-
* / error rows; the editor draws its own bordered control box. This is the
|
|
12
|
-
* original behavior and is byte-identical for every existing call site.
|
|
13
|
-
*
|
|
14
|
-
* ```svelte
|
|
15
|
-
* <SvField {id} {label} {hint} {error} {required} {dir}>
|
|
16
|
-
* <div class="sv-num">...control...</div>
|
|
17
|
-
* </SvField>
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* 2. Framed (`frame`) - SvField OWNS the bordered control box, so it applies
|
|
21
|
-
* `invalid` + `size` styling, the shared leading/trailing adornments and
|
|
22
|
-
* prefix/suffix affixes, and the shared clear button ONCE, and the editor
|
|
23
|
-
* passes only its bare control (an `<input>` / `<button>` / etc.):
|
|
24
|
-
*
|
|
25
|
-
* ```svelte
|
|
26
|
-
* <SvField frame {id} {label} {size} {invalid} clearable showClear={!!value}
|
|
27
|
-
* onclear={() => set('')}>
|
|
28
|
-
* {#snippet leading()}<SearchIcon />{/snippet}
|
|
29
|
-
* <input class="sv-field__native" ... />
|
|
30
|
-
* </SvField>
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* In framed mode the editor's bare `<input>` / `<textarea>` / `<select>`
|
|
34
|
-
* inherits borderless chrome automatically (see the scoped `:global` rule),
|
|
35
|
-
* so editors no longer re-implement the box / focus ring / invalid / size.
|
|
36
|
-
*/
|
|
37
|
-
import type { Snippet } from 'svelte'
|
|
38
|
-
import { editorErrorId, editorHintId, type EditorAction, type EditorDir, type EditorSize } from './editor-contract'
|
|
39
|
-
|
|
40
|
-
let {
|
|
41
|
-
id,
|
|
42
|
-
label,
|
|
43
|
-
hint,
|
|
44
|
-
error,
|
|
45
|
-
required = false,
|
|
46
|
-
dir,
|
|
47
|
-
/** Stretch the field (and its control) to the container width. */
|
|
48
|
-
block = false,
|
|
49
|
-
/** Busy state - shows a small spinner beside the label. */
|
|
50
|
-
loading = false,
|
|
51
|
-
/**
|
|
52
|
-
* Own the bordered control box (invalid/size/adornments/clear). Opt-in so
|
|
53
|
-
* existing editors that draw their own box are unaffected.
|
|
54
|
-
*/
|
|
55
|
-
frame = false,
|
|
56
|
-
/** Framed mode: invalid styling on the box + border. */
|
|
57
|
-
invalid = false,
|
|
58
|
-
/** Framed mode: control size / density. */
|
|
59
|
-
size = 'md',
|
|
60
|
-
/** Framed mode: dim + block interaction styling. */
|
|
61
|
-
disabled = false,
|
|
62
|
-
/** Framed mode: read-only styling. */
|
|
63
|
-
readonly = false,
|
|
64
|
-
/** Framed mode: leading adornment (icon/button) at the start of the box. */
|
|
65
|
-
leading,
|
|
66
|
-
/** Framed mode: trailing adornment (icon/button) at the end of the box. */
|
|
67
|
-
trailing,
|
|
68
|
-
/** Framed mode: plain-text affix at the start (units like `$`). */
|
|
69
|
-
prefix,
|
|
70
|
-
/** Framed mode: plain-text affix at the end (units like `kg`). */
|
|
71
|
-
suffix,
|
|
72
|
-
/** Framed mode: render the shared clear button when {@link showClear}. */
|
|
73
|
-
clearable = false,
|
|
74
|
-
/** Framed mode: whether there is a value to clear right now. */
|
|
75
|
-
showClear = false,
|
|
76
|
-
/** Framed mode: invoked when the shared clear button is pressed. */
|
|
77
|
-
onclear,
|
|
78
|
-
/** Framed mode: accessible label for the clear button. */
|
|
79
|
-
clearLabel = 'Clear',
|
|
80
|
-
/** Framed mode: control width (number = px). Default 220; `block` overrides to 100%. */
|
|
81
|
-
width,
|
|
82
|
-
/** `floating` overlays the label in the box and animates it up on focus/value
|
|
83
|
-
* (framed mode only). Default `static` (label above the control). */
|
|
84
|
-
labelMode = 'static',
|
|
85
|
-
/** Floating mode: whether the control currently holds a value (keeps the
|
|
86
|
-
* label up). Focus is detected via `:focus-within`. */
|
|
87
|
-
filled = false,
|
|
88
|
-
/** Framed mode: compact in-field action buttons (lookup/generate/copy...). */
|
|
89
|
-
actions,
|
|
90
|
-
children,
|
|
91
|
-
}: {
|
|
92
|
-
id?: string
|
|
93
|
-
label?: string
|
|
94
|
-
hint?: string
|
|
95
|
-
error?: string
|
|
96
|
-
required?: boolean
|
|
97
|
-
dir?: EditorDir
|
|
98
|
-
block?: boolean
|
|
99
|
-
loading?: boolean
|
|
100
|
-
frame?: boolean
|
|
101
|
-
invalid?: boolean
|
|
102
|
-
size?: EditorSize
|
|
103
|
-
disabled?: boolean
|
|
104
|
-
readonly?: boolean
|
|
105
|
-
leading?: Snippet
|
|
106
|
-
trailing?: Snippet
|
|
107
|
-
prefix?: string
|
|
108
|
-
suffix?: string
|
|
109
|
-
clearable?: boolean
|
|
110
|
-
showClear?: boolean
|
|
111
|
-
onclear?: () => void
|
|
112
|
-
clearLabel?: string
|
|
113
|
-
width?: number | string
|
|
114
|
-
labelMode?: 'static' | 'floating'
|
|
115
|
-
filled?: boolean
|
|
116
|
-
actions?: EditorAction[]
|
|
117
|
-
children: Snippet
|
|
118
|
-
} = $props()
|
|
119
|
-
|
|
120
|
-
const controlWidth = $derived(width == null ? undefined : typeof width === 'number' ? `${width}px` : width)
|
|
121
|
-
// Floating labels need the framed box to anchor to and an actual label.
|
|
122
|
-
const floating = $derived(labelMode === 'floating' && frame && !!label)
|
|
123
|
-
|
|
124
|
-
// 'auto'/undefined -> inherit from the document (no dir attribute).
|
|
125
|
-
const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
|
|
126
|
-
</script>
|
|
127
|
-
|
|
128
|
-
<div class="sv-field" class:sv-field--block={block} class:sv-field--floating={floating} dir={resolvedDir}>
|
|
129
|
-
{#if (label && !floating) || loading}
|
|
130
|
-
<span class="sv-field__labelrow">
|
|
131
|
-
{#if label && !floating}
|
|
132
|
-
<label class="sv-field__label" for={id}>
|
|
133
|
-
{label}{#if required}<span class="sv-field__req" aria-hidden="true">*</span>{/if}
|
|
134
|
-
</label>
|
|
135
|
-
{/if}
|
|
136
|
-
{#if loading}<span class="sv-field__spinner" role="status" aria-label="Loading"></span>{/if}
|
|
137
|
-
</span>
|
|
138
|
-
{/if}
|
|
139
|
-
{#if frame}
|
|
140
|
-
<div
|
|
141
|
-
class="sv-field__control sv-field--{size}"
|
|
142
|
-
class:is-invalid={invalid}
|
|
143
|
-
class:is-disabled={disabled}
|
|
144
|
-
class:is-readonly={readonly}
|
|
145
|
-
class:is-filled={filled}
|
|
146
|
-
style:width={block ? undefined : controlWidth}
|
|
147
|
-
>
|
|
148
|
-
{#if floating}
|
|
149
|
-
<label class="sv-field__float-label" for={id}>{label}{#if required}<span class="sv-field__req" aria-hidden="true">*</span>{/if}</label>
|
|
150
|
-
{/if}
|
|
151
|
-
{#if leading}<span class="sv-field__adorn sv-field__adorn--lead">{@render leading()}</span>{/if}
|
|
152
|
-
{#if prefix}<span class="sv-field__affix sv-field__affix--pre">{prefix}</span>{/if}
|
|
153
|
-
<span class="sv-field__slot">{@render children()}</span>
|
|
154
|
-
{#if suffix}<span class="sv-field__affix sv-field__affix--suf">{suffix}</span>{/if}
|
|
155
|
-
{#if trailing}<span class="sv-field__adorn sv-field__adorn--trail">{@render trailing()}</span>{/if}
|
|
156
|
-
{#if actions?.length}
|
|
157
|
-
{#each actions as a (a.label)}
|
|
158
|
-
<button class="sv-field__action" type="button" tabindex="-1" aria-label={a.label} title={a.label} disabled={disabled || a.disabled} onclick={() => a.onClick()}>
|
|
159
|
-
{#if a.icon}{@render a.icon()}{:else}<span class="sv-field__action-txt">{a.label}</span>{/if}
|
|
160
|
-
</button>
|
|
161
|
-
{/each}
|
|
162
|
-
{/if}
|
|
163
|
-
{#if clearable && showClear && !disabled && !readonly}
|
|
164
|
-
<button class="sv-field__clear" type="button" tabindex="-1" aria-label={clearLabel} onclick={() => onclear?.()}>×</button>
|
|
165
|
-
{/if}
|
|
166
|
-
</div>
|
|
167
|
-
{:else}
|
|
168
|
-
{@render children()}
|
|
169
|
-
{/if}
|
|
170
|
-
{#if error}
|
|
171
|
-
<span class="sv-field__error" id={editorErrorId(id)} role="alert">{error}</span>
|
|
172
|
-
{:else if hint}
|
|
173
|
-
<span class="sv-field__hint" id={editorHintId(id)}>{hint}</span>
|
|
174
|
-
{/if}
|
|
175
|
-
</div>
|
|
176
|
-
|
|
177
|
-
<style>
|
|
178
|
-
.sv-field {
|
|
179
|
-
display: inline-flex;
|
|
180
|
-
flex-direction: column;
|
|
181
|
-
gap: 3px;
|
|
182
|
-
text-align: start;
|
|
183
|
-
}
|
|
184
|
-
.sv-field--block { display: flex; width: 100%; }
|
|
185
|
-
.sv-field__labelrow { display: inline-flex; align-items: center; gap: 6px; }
|
|
186
|
-
.sv-field__label {
|
|
187
|
-
font-size: 12.5px;
|
|
188
|
-
font-weight: 550;
|
|
189
|
-
color: var(--sg-fg, #0f172a);
|
|
190
|
-
line-height: 1.3;
|
|
191
|
-
}
|
|
192
|
-
.sv-field__spinner {
|
|
193
|
-
width: 12px; height: 12px; flex: none; border-radius: 50%;
|
|
194
|
-
border: 2px solid color-mix(in srgb, var(--sg-accent, #2563eb) 30%, transparent);
|
|
195
|
-
border-top-color: var(--sg-accent, #2563eb);
|
|
196
|
-
animation: sv-field-spin 0.6s linear infinite;
|
|
197
|
-
}
|
|
198
|
-
@keyframes sv-field-spin { to { transform: rotate(360deg); } }
|
|
199
|
-
@media (prefers-reduced-motion: reduce) { .sv-field__spinner { animation: none; } }
|
|
200
|
-
.sv-field__req { color: var(--sg-danger, #dc2626); margin-inline-start: 2px; }
|
|
201
|
-
.sv-field__hint {
|
|
202
|
-
font-size: 11.5px;
|
|
203
|
-
color: var(--sg-muted, #64748b);
|
|
204
|
-
line-height: 1.35;
|
|
205
|
-
}
|
|
206
|
-
.sv-field__error {
|
|
207
|
-
font-size: 11.5px;
|
|
208
|
-
font-weight: 500;
|
|
209
|
-
color: var(--sg-danger, #dc2626);
|
|
210
|
-
line-height: 1.35;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/* ---- Framed mode: the shared control box (opt-in via `frame`) ---- */
|
|
214
|
-
.sv-field__control {
|
|
215
|
-
--_accent: var(--sg-accent, #2563eb);
|
|
216
|
-
display: flex; align-items: center; width: 220px;
|
|
217
|
-
background: var(--sg-input-bg, #fff); color: var(--sg-fg, #0f172a);
|
|
218
|
-
border: 1px solid var(--sg-input-border, var(--sg-border, #cbd5e1));
|
|
219
|
-
border-radius: var(--sg-radius, 8px);
|
|
220
|
-
}
|
|
221
|
-
.sv-field--block .sv-field__control { width: 100%; }
|
|
222
|
-
.sv-field__control:focus-within {
|
|
223
|
-
border-color: var(--_accent);
|
|
224
|
-
box-shadow: 0 0 0 2px color-mix(in srgb, var(--_accent) 22%, transparent);
|
|
225
|
-
}
|
|
226
|
-
.sv-field__control.is-invalid { border-color: var(--sg-danger, #dc2626); }
|
|
227
|
-
.sv-field__control.is-invalid:focus-within {
|
|
228
|
-
box-shadow: 0 0 0 2px color-mix(in srgb, var(--sg-danger, #dc2626) 22%, transparent);
|
|
229
|
-
}
|
|
230
|
-
.sv-field__control.is-disabled { opacity: 0.6; }
|
|
231
|
-
.sv-field__control.is-readonly { background: var(--sg-muted-bg, color-mix(in srgb, var(--sg-fg, #0f172a) 4%, var(--sg-input-bg, #fff))); }
|
|
232
|
-
|
|
233
|
-
/* ---- Floating label ---- */
|
|
234
|
-
.sv-field--floating .sv-field__control { position: relative; }
|
|
235
|
-
.sv-field__float-label {
|
|
236
|
-
position: absolute; inset-inline-start: 11px; top: 50%; transform: translateY(-50%);
|
|
237
|
-
font-size: 13px; color: var(--sg-muted, #64748b); pointer-events: none;
|
|
238
|
-
background: var(--sg-input-bg, #fff); padding: 0 4px; max-width: calc(100% - 24px);
|
|
239
|
-
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; z-index: 1;
|
|
240
|
-
transition: top 0.14s ease, font-size 0.14s ease, color 0.14s ease;
|
|
241
|
-
}
|
|
242
|
-
.sv-field__control:focus-within .sv-field__float-label,
|
|
243
|
-
.sv-field__control.is-filled .sv-field__float-label {
|
|
244
|
-
top: 0; font-size: 10.5px; color: var(--_accent, var(--sg-accent, #2563eb));
|
|
245
|
-
}
|
|
246
|
-
.sv-field__control.is-invalid .sv-field__float-label { color: var(--sg-danger, #dc2626); }
|
|
247
|
-
@media (prefers-reduced-motion: reduce) { .sv-field__float-label { transition: none; } }
|
|
248
|
-
|
|
249
|
-
.sv-field__slot { display: flex; flex: 1; min-width: 0; }
|
|
250
|
-
/* Bare form controls passed as children inherit borderless chrome so editors
|
|
251
|
-
no longer re-implement the box. Scoped to the framed control only. */
|
|
252
|
-
.sv-field__slot :global(input),
|
|
253
|
-
.sv-field__slot :global(textarea),
|
|
254
|
-
.sv-field__slot :global(select) {
|
|
255
|
-
flex: 1; min-width: 0; width: 100%;
|
|
256
|
-
border: 0; background: none; outline: none;
|
|
257
|
-
color: inherit; font: inherit; padding: 0 10px;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.sv-field__adorn { display: inline-flex; align-items: center; color: var(--sg-muted, #64748b); }
|
|
261
|
-
.sv-field__adorn--lead { padding-inline-start: 10px; }
|
|
262
|
-
.sv-field__adorn--trail { padding-inline-end: 10px; }
|
|
263
|
-
.sv-field__affix { display: inline-flex; align-items: center; color: var(--sg-muted, #64748b); white-space: nowrap; }
|
|
264
|
-
.sv-field__affix--pre { padding-inline-start: 10px; }
|
|
265
|
-
.sv-field__affix--suf { padding-inline-end: 10px; }
|
|
266
|
-
/* When an affix/adornment sits next to the control, drop the control's own
|
|
267
|
-
edge padding so text hugs the affix. */
|
|
268
|
-
.sv-field__adorn--lead + .sv-field__slot :global(input),
|
|
269
|
-
.sv-field__affix--pre + .sv-field__slot :global(input) { padding-inline-start: 6px; }
|
|
270
|
-
|
|
271
|
-
.sv-field__clear {
|
|
272
|
-
display: grid; place-items: center; width: 28px; align-self: stretch;
|
|
273
|
-
background: none; border: 0; color: var(--sg-muted, #64748b); cursor: pointer;
|
|
274
|
-
font-size: 17px; line-height: 1;
|
|
275
|
-
}
|
|
276
|
-
.sv-field__clear:hover { color: var(--sg-fg, #0f172a); }
|
|
277
|
-
.sv-field__action {
|
|
278
|
-
display: inline-grid; place-items: center; align-self: center; flex: none;
|
|
279
|
-
min-width: 24px; height: 24px; margin-inline-end: 3px; padding: 0 5px;
|
|
280
|
-
background: none; border: 0; border-radius: 5px; color: var(--sg-muted, #64748b);
|
|
281
|
-
cursor: pointer; font: inherit; font-size: 12px;
|
|
282
|
-
}
|
|
283
|
-
.sv-field__action:hover:not([disabled]) { background: var(--sg-row-hover-bg, #f1f5f9); color: var(--sg-accent, #2563eb); }
|
|
284
|
-
.sv-field__action[disabled] { opacity: 0.5; cursor: default; }
|
|
285
|
-
.sv-field__action-txt { font-weight: 600; white-space: nowrap; }
|
|
286
|
-
|
|
287
|
-
.sv-field--sm .sv-field__control,
|
|
288
|
-
.sv-field__control.sv-field--sm { height: 28px; font-size: 12px; }
|
|
289
|
-
.sv-field--md .sv-field__control,
|
|
290
|
-
.sv-field__control.sv-field--md { height: 34px; font-size: 13px; }
|
|
291
|
-
.sv-field--lg .sv-field__control,
|
|
292
|
-
.sv-field__control.sv-field--lg { height: 40px; font-size: 15px; }
|
|
293
|
-
</style>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* SvField - the shared field chrome for every value-bearing editor in the kit.
|
|
4
|
+
* It renders an optional `label` (wired to the control via `for`/`id`), the
|
|
5
|
+
* control itself (passed as children), and an optional `hint` / `error` line
|
|
6
|
+
* whose ids match `editorHintId` / `editorErrorId` for `aria-describedby`.
|
|
7
|
+
*
|
|
8
|
+
* Two modes:
|
|
9
|
+
*
|
|
10
|
+
* 1. Default (`frame` unset) - SvField renders only the label / children / hint
|
|
11
|
+
* / error rows; the editor draws its own bordered control box. This is the
|
|
12
|
+
* original behavior and is byte-identical for every existing call site.
|
|
13
|
+
*
|
|
14
|
+
* ```svelte
|
|
15
|
+
* <SvField {id} {label} {hint} {error} {required} {dir}>
|
|
16
|
+
* <div class="sv-num">...control...</div>
|
|
17
|
+
* </SvField>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* 2. Framed (`frame`) - SvField OWNS the bordered control box, so it applies
|
|
21
|
+
* `invalid` + `size` styling, the shared leading/trailing adornments and
|
|
22
|
+
* prefix/suffix affixes, and the shared clear button ONCE, and the editor
|
|
23
|
+
* passes only its bare control (an `<input>` / `<button>` / etc.):
|
|
24
|
+
*
|
|
25
|
+
* ```svelte
|
|
26
|
+
* <SvField frame {id} {label} {size} {invalid} clearable showClear={!!value}
|
|
27
|
+
* onclear={() => set('')}>
|
|
28
|
+
* {#snippet leading()}<SearchIcon />{/snippet}
|
|
29
|
+
* <input class="sv-field__native" ... />
|
|
30
|
+
* </SvField>
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* In framed mode the editor's bare `<input>` / `<textarea>` / `<select>`
|
|
34
|
+
* inherits borderless chrome automatically (see the scoped `:global` rule),
|
|
35
|
+
* so editors no longer re-implement the box / focus ring / invalid / size.
|
|
36
|
+
*/
|
|
37
|
+
import type { Snippet } from 'svelte'
|
|
38
|
+
import { editorErrorId, editorHintId, type EditorAction, type EditorDir, type EditorSize } from './editor-contract'
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
id,
|
|
42
|
+
label,
|
|
43
|
+
hint,
|
|
44
|
+
error,
|
|
45
|
+
required = false,
|
|
46
|
+
dir,
|
|
47
|
+
/** Stretch the field (and its control) to the container width. */
|
|
48
|
+
block = false,
|
|
49
|
+
/** Busy state - shows a small spinner beside the label. */
|
|
50
|
+
loading = false,
|
|
51
|
+
/**
|
|
52
|
+
* Own the bordered control box (invalid/size/adornments/clear). Opt-in so
|
|
53
|
+
* existing editors that draw their own box are unaffected.
|
|
54
|
+
*/
|
|
55
|
+
frame = false,
|
|
56
|
+
/** Framed mode: invalid styling on the box + border. */
|
|
57
|
+
invalid = false,
|
|
58
|
+
/** Framed mode: control size / density. */
|
|
59
|
+
size = 'md',
|
|
60
|
+
/** Framed mode: dim + block interaction styling. */
|
|
61
|
+
disabled = false,
|
|
62
|
+
/** Framed mode: read-only styling. */
|
|
63
|
+
readonly = false,
|
|
64
|
+
/** Framed mode: leading adornment (icon/button) at the start of the box. */
|
|
65
|
+
leading,
|
|
66
|
+
/** Framed mode: trailing adornment (icon/button) at the end of the box. */
|
|
67
|
+
trailing,
|
|
68
|
+
/** Framed mode: plain-text affix at the start (units like `$`). */
|
|
69
|
+
prefix,
|
|
70
|
+
/** Framed mode: plain-text affix at the end (units like `kg`). */
|
|
71
|
+
suffix,
|
|
72
|
+
/** Framed mode: render the shared clear button when {@link showClear}. */
|
|
73
|
+
clearable = false,
|
|
74
|
+
/** Framed mode: whether there is a value to clear right now. */
|
|
75
|
+
showClear = false,
|
|
76
|
+
/** Framed mode: invoked when the shared clear button is pressed. */
|
|
77
|
+
onclear,
|
|
78
|
+
/** Framed mode: accessible label for the clear button. */
|
|
79
|
+
clearLabel = 'Clear',
|
|
80
|
+
/** Framed mode: control width (number = px). Default 220; `block` overrides to 100%. */
|
|
81
|
+
width,
|
|
82
|
+
/** `floating` overlays the label in the box and animates it up on focus/value
|
|
83
|
+
* (framed mode only). Default `static` (label above the control). */
|
|
84
|
+
labelMode = 'static',
|
|
85
|
+
/** Floating mode: whether the control currently holds a value (keeps the
|
|
86
|
+
* label up). Focus is detected via `:focus-within`. */
|
|
87
|
+
filled = false,
|
|
88
|
+
/** Framed mode: compact in-field action buttons (lookup/generate/copy...). */
|
|
89
|
+
actions,
|
|
90
|
+
children,
|
|
91
|
+
}: {
|
|
92
|
+
id?: string
|
|
93
|
+
label?: string
|
|
94
|
+
hint?: string
|
|
95
|
+
error?: string
|
|
96
|
+
required?: boolean
|
|
97
|
+
dir?: EditorDir
|
|
98
|
+
block?: boolean
|
|
99
|
+
loading?: boolean
|
|
100
|
+
frame?: boolean
|
|
101
|
+
invalid?: boolean
|
|
102
|
+
size?: EditorSize
|
|
103
|
+
disabled?: boolean
|
|
104
|
+
readonly?: boolean
|
|
105
|
+
leading?: Snippet
|
|
106
|
+
trailing?: Snippet
|
|
107
|
+
prefix?: string
|
|
108
|
+
suffix?: string
|
|
109
|
+
clearable?: boolean
|
|
110
|
+
showClear?: boolean
|
|
111
|
+
onclear?: () => void
|
|
112
|
+
clearLabel?: string
|
|
113
|
+
width?: number | string
|
|
114
|
+
labelMode?: 'static' | 'floating'
|
|
115
|
+
filled?: boolean
|
|
116
|
+
actions?: EditorAction[]
|
|
117
|
+
children: Snippet
|
|
118
|
+
} = $props()
|
|
119
|
+
|
|
120
|
+
const controlWidth = $derived(width == null ? undefined : typeof width === 'number' ? `${width}px` : width)
|
|
121
|
+
// Floating labels need the framed box to anchor to and an actual label.
|
|
122
|
+
const floating = $derived(labelMode === 'floating' && frame && !!label)
|
|
123
|
+
|
|
124
|
+
// 'auto'/undefined -> inherit from the document (no dir attribute).
|
|
125
|
+
const resolvedDir = $derived(dir === 'ltr' || dir === 'rtl' ? dir : undefined)
|
|
126
|
+
</script>
|
|
127
|
+
|
|
128
|
+
<div class="sv-field" class:sv-field--block={block} class:sv-field--floating={floating} dir={resolvedDir}>
|
|
129
|
+
{#if (label && !floating) || loading}
|
|
130
|
+
<span class="sv-field__labelrow">
|
|
131
|
+
{#if label && !floating}
|
|
132
|
+
<label class="sv-field__label" for={id}>
|
|
133
|
+
{label}{#if required}<span class="sv-field__req" aria-hidden="true">*</span>{/if}
|
|
134
|
+
</label>
|
|
135
|
+
{/if}
|
|
136
|
+
{#if loading}<span class="sv-field__spinner" role="status" aria-label="Loading"></span>{/if}
|
|
137
|
+
</span>
|
|
138
|
+
{/if}
|
|
139
|
+
{#if frame}
|
|
140
|
+
<div
|
|
141
|
+
class="sv-field__control sv-field--{size}"
|
|
142
|
+
class:is-invalid={invalid}
|
|
143
|
+
class:is-disabled={disabled}
|
|
144
|
+
class:is-readonly={readonly}
|
|
145
|
+
class:is-filled={filled}
|
|
146
|
+
style:width={block ? undefined : controlWidth}
|
|
147
|
+
>
|
|
148
|
+
{#if floating}
|
|
149
|
+
<label class="sv-field__float-label" for={id}>{label}{#if required}<span class="sv-field__req" aria-hidden="true">*</span>{/if}</label>
|
|
150
|
+
{/if}
|
|
151
|
+
{#if leading}<span class="sv-field__adorn sv-field__adorn--lead">{@render leading()}</span>{/if}
|
|
152
|
+
{#if prefix}<span class="sv-field__affix sv-field__affix--pre">{prefix}</span>{/if}
|
|
153
|
+
<span class="sv-field__slot">{@render children()}</span>
|
|
154
|
+
{#if suffix}<span class="sv-field__affix sv-field__affix--suf">{suffix}</span>{/if}
|
|
155
|
+
{#if trailing}<span class="sv-field__adorn sv-field__adorn--trail">{@render trailing()}</span>{/if}
|
|
156
|
+
{#if actions?.length}
|
|
157
|
+
{#each actions as a (a.label)}
|
|
158
|
+
<button class="sv-field__action" type="button" tabindex="-1" aria-label={a.label} title={a.label} disabled={disabled || a.disabled} onclick={() => a.onClick()}>
|
|
159
|
+
{#if a.icon}{@render a.icon()}{:else}<span class="sv-field__action-txt">{a.label}</span>{/if}
|
|
160
|
+
</button>
|
|
161
|
+
{/each}
|
|
162
|
+
{/if}
|
|
163
|
+
{#if clearable && showClear && !disabled && !readonly}
|
|
164
|
+
<button class="sv-field__clear" type="button" tabindex="-1" aria-label={clearLabel} onclick={() => onclear?.()}>×</button>
|
|
165
|
+
{/if}
|
|
166
|
+
</div>
|
|
167
|
+
{:else}
|
|
168
|
+
{@render children()}
|
|
169
|
+
{/if}
|
|
170
|
+
{#if error}
|
|
171
|
+
<span class="sv-field__error" id={editorErrorId(id)} role="alert">{error}</span>
|
|
172
|
+
{:else if hint}
|
|
173
|
+
<span class="sv-field__hint" id={editorHintId(id)}>{hint}</span>
|
|
174
|
+
{/if}
|
|
175
|
+
</div>
|
|
176
|
+
|
|
177
|
+
<style>
|
|
178
|
+
.sv-field {
|
|
179
|
+
display: inline-flex;
|
|
180
|
+
flex-direction: column;
|
|
181
|
+
gap: 3px;
|
|
182
|
+
text-align: start;
|
|
183
|
+
}
|
|
184
|
+
.sv-field--block { display: flex; width: 100%; }
|
|
185
|
+
.sv-field__labelrow { display: inline-flex; align-items: center; gap: 6px; }
|
|
186
|
+
.sv-field__label {
|
|
187
|
+
font-size: 12.5px;
|
|
188
|
+
font-weight: 550;
|
|
189
|
+
color: var(--sg-fg, #0f172a);
|
|
190
|
+
line-height: 1.3;
|
|
191
|
+
}
|
|
192
|
+
.sv-field__spinner {
|
|
193
|
+
width: 12px; height: 12px; flex: none; border-radius: 50%;
|
|
194
|
+
border: 2px solid color-mix(in srgb, var(--sg-accent, #2563eb) 30%, transparent);
|
|
195
|
+
border-top-color: var(--sg-accent, #2563eb);
|
|
196
|
+
animation: sv-field-spin 0.6s linear infinite;
|
|
197
|
+
}
|
|
198
|
+
@keyframes sv-field-spin { to { transform: rotate(360deg); } }
|
|
199
|
+
@media (prefers-reduced-motion: reduce) { .sv-field__spinner { animation: none; } }
|
|
200
|
+
.sv-field__req { color: var(--sg-danger, #dc2626); margin-inline-start: 2px; }
|
|
201
|
+
.sv-field__hint {
|
|
202
|
+
font-size: 11.5px;
|
|
203
|
+
color: var(--sg-muted, #64748b);
|
|
204
|
+
line-height: 1.35;
|
|
205
|
+
}
|
|
206
|
+
.sv-field__error {
|
|
207
|
+
font-size: 11.5px;
|
|
208
|
+
font-weight: 500;
|
|
209
|
+
color: var(--sg-danger, #dc2626);
|
|
210
|
+
line-height: 1.35;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* ---- Framed mode: the shared control box (opt-in via `frame`) ---- */
|
|
214
|
+
.sv-field__control {
|
|
215
|
+
--_accent: var(--sg-accent, #2563eb);
|
|
216
|
+
display: flex; align-items: center; width: 220px;
|
|
217
|
+
background: var(--sg-input-bg, #fff); color: var(--sg-fg, #0f172a);
|
|
218
|
+
border: 1px solid var(--sg-input-border, var(--sg-border, #cbd5e1));
|
|
219
|
+
border-radius: var(--sg-radius, 8px);
|
|
220
|
+
}
|
|
221
|
+
.sv-field--block .sv-field__control { width: 100%; }
|
|
222
|
+
.sv-field__control:focus-within {
|
|
223
|
+
border-color: var(--_accent);
|
|
224
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--_accent) 22%, transparent);
|
|
225
|
+
}
|
|
226
|
+
.sv-field__control.is-invalid { border-color: var(--sg-danger, #dc2626); }
|
|
227
|
+
.sv-field__control.is-invalid:focus-within {
|
|
228
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--sg-danger, #dc2626) 22%, transparent);
|
|
229
|
+
}
|
|
230
|
+
.sv-field__control.is-disabled { opacity: 0.6; }
|
|
231
|
+
.sv-field__control.is-readonly { background: var(--sg-muted-bg, color-mix(in srgb, var(--sg-fg, #0f172a) 4%, var(--sg-input-bg, #fff))); }
|
|
232
|
+
|
|
233
|
+
/* ---- Floating label ---- */
|
|
234
|
+
.sv-field--floating .sv-field__control { position: relative; }
|
|
235
|
+
.sv-field__float-label {
|
|
236
|
+
position: absolute; inset-inline-start: 11px; top: 50%; transform: translateY(-50%);
|
|
237
|
+
font-size: 13px; color: var(--sg-muted, #64748b); pointer-events: none;
|
|
238
|
+
background: var(--sg-input-bg, #fff); padding: 0 4px; max-width: calc(100% - 24px);
|
|
239
|
+
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; z-index: 1;
|
|
240
|
+
transition: top 0.14s ease, font-size 0.14s ease, color 0.14s ease;
|
|
241
|
+
}
|
|
242
|
+
.sv-field__control:focus-within .sv-field__float-label,
|
|
243
|
+
.sv-field__control.is-filled .sv-field__float-label {
|
|
244
|
+
top: 0; font-size: 10.5px; color: var(--_accent, var(--sg-accent, #2563eb));
|
|
245
|
+
}
|
|
246
|
+
.sv-field__control.is-invalid .sv-field__float-label { color: var(--sg-danger, #dc2626); }
|
|
247
|
+
@media (prefers-reduced-motion: reduce) { .sv-field__float-label { transition: none; } }
|
|
248
|
+
|
|
249
|
+
.sv-field__slot { display: flex; flex: 1; min-width: 0; }
|
|
250
|
+
/* Bare form controls passed as children inherit borderless chrome so editors
|
|
251
|
+
no longer re-implement the box. Scoped to the framed control only. */
|
|
252
|
+
.sv-field__slot :global(input),
|
|
253
|
+
.sv-field__slot :global(textarea),
|
|
254
|
+
.sv-field__slot :global(select) {
|
|
255
|
+
flex: 1; min-width: 0; width: 100%;
|
|
256
|
+
border: 0; background: none; outline: none;
|
|
257
|
+
color: inherit; font: inherit; padding: 0 10px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.sv-field__adorn { display: inline-flex; align-items: center; color: var(--sg-muted, #64748b); }
|
|
261
|
+
.sv-field__adorn--lead { padding-inline-start: 10px; }
|
|
262
|
+
.sv-field__adorn--trail { padding-inline-end: 10px; }
|
|
263
|
+
.sv-field__affix { display: inline-flex; align-items: center; color: var(--sg-muted, #64748b); white-space: nowrap; }
|
|
264
|
+
.sv-field__affix--pre { padding-inline-start: 10px; }
|
|
265
|
+
.sv-field__affix--suf { padding-inline-end: 10px; }
|
|
266
|
+
/* When an affix/adornment sits next to the control, drop the control's own
|
|
267
|
+
edge padding so text hugs the affix. */
|
|
268
|
+
.sv-field__adorn--lead + .sv-field__slot :global(input),
|
|
269
|
+
.sv-field__affix--pre + .sv-field__slot :global(input) { padding-inline-start: 6px; }
|
|
270
|
+
|
|
271
|
+
.sv-field__clear {
|
|
272
|
+
display: grid; place-items: center; width: 28px; align-self: stretch;
|
|
273
|
+
background: none; border: 0; color: var(--sg-muted, #64748b); cursor: pointer;
|
|
274
|
+
font-size: 17px; line-height: 1;
|
|
275
|
+
}
|
|
276
|
+
.sv-field__clear:hover { color: var(--sg-fg, #0f172a); }
|
|
277
|
+
.sv-field__action {
|
|
278
|
+
display: inline-grid; place-items: center; align-self: center; flex: none;
|
|
279
|
+
min-width: 24px; height: 24px; margin-inline-end: 3px; padding: 0 5px;
|
|
280
|
+
background: none; border: 0; border-radius: 5px; color: var(--sg-muted, #64748b);
|
|
281
|
+
cursor: pointer; font: inherit; font-size: 12px;
|
|
282
|
+
}
|
|
283
|
+
.sv-field__action:hover:not([disabled]) { background: var(--sg-row-hover-bg, #f1f5f9); color: var(--sg-accent, #2563eb); }
|
|
284
|
+
.sv-field__action[disabled] { opacity: 0.5; cursor: default; }
|
|
285
|
+
.sv-field__action-txt { font-weight: 600; white-space: nowrap; }
|
|
286
|
+
|
|
287
|
+
.sv-field--sm .sv-field__control,
|
|
288
|
+
.sv-field__control.sv-field--sm { height: 28px; font-size: 12px; }
|
|
289
|
+
.sv-field--md .sv-field__control,
|
|
290
|
+
.sv-field__control.sv-field--md { height: 34px; font-size: 13px; }
|
|
291
|
+
.sv-field--lg .sv-field__control,
|
|
292
|
+
.sv-field__control.sv-field--lg { height: 40px; font-size: 15px; }
|
|
293
|
+
</style>
|