@svgrid/grid 2.6.21 → 2.7.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.
Files changed (358) hide show
  1. package/CHANGELOG.md +150 -88
  2. package/README.md +221 -199
  3. package/dist/FlexRender.svelte +96 -96
  4. package/dist/GridFooter.svelte +181 -181
  5. package/dist/GridMenus.svelte +201 -18
  6. package/dist/SvAutoComplete.svelte +169 -165
  7. package/dist/SvAvatar.svelte +75 -75
  8. package/dist/SvCalendar.svelte +503 -503
  9. package/dist/SvCarousel.svelte +141 -141
  10. package/dist/SvCheckBox.svelte +102 -102
  11. package/dist/SvCircularProgress.svelte +109 -109
  12. package/dist/SvColorInput.svelte +181 -181
  13. package/dist/SvComboBox.svelte +279 -275
  14. package/dist/SvContextMenu.svelte +116 -116
  15. package/dist/SvCountryInput.svelte +163 -163
  16. package/dist/SvDateRangeInput.svelte +25 -3
  17. package/dist/SvDrawer.svelte +254 -254
  18. package/dist/SvDropDownList.svelte +378 -374
  19. package/dist/SvDurationInput.svelte +126 -126
  20. package/dist/SvField.svelte +293 -293
  21. package/dist/SvForm.svelte +437 -437
  22. package/dist/SvGrid.controller.svelte.d.ts +61 -9
  23. package/dist/SvGrid.controller.svelte.js +363 -123
  24. package/dist/SvGrid.css +222 -1
  25. package/dist/SvGrid.helpers.d.ts +55 -0
  26. package/dist/SvGrid.helpers.js +83 -0
  27. package/dist/SvGrid.svelte +255 -56
  28. package/dist/SvGrid.types.d.ts +146 -1
  29. package/dist/SvGridCellEditor.svelte +744 -662
  30. package/dist/SvGridChart.svelte +1716 -1716
  31. package/dist/SvGridChartPanel.svelte +485 -485
  32. package/dist/SvGridChartView.svelte +70 -70
  33. package/dist/SvGridDropdown.svelte +728 -728
  34. package/dist/SvGridSelect.svelte +270 -266
  35. package/dist/SvGridSelect.svelte.d.ts +1 -1
  36. package/dist/SvGroupCell.svelte +116 -116
  37. package/dist/SvListBox.svelte +334 -326
  38. package/dist/SvMaskedInput.svelte +122 -122
  39. package/dist/SvMenu.svelte +124 -124
  40. package/dist/SvMenuList.svelte +146 -146
  41. package/dist/SvMultiSelect.svelte +293 -289
  42. package/dist/SvMultiSelect.svelte.d.ts +1 -1
  43. package/dist/SvNumberInput.svelte +172 -168
  44. package/dist/SvOtpInput.svelte +158 -158
  45. package/dist/SvPasswordInput.svelte +151 -151
  46. package/dist/SvPhoneInput.svelte +133 -133
  47. package/dist/SvPopover.svelte +197 -197
  48. package/dist/SvProgress.svelte +116 -116
  49. package/dist/SvRadioGroup.svelte +107 -107
  50. package/dist/SvRating.svelte +112 -112
  51. package/dist/SvResult.svelte +73 -73
  52. package/dist/SvRichCell.svelte +125 -0
  53. package/dist/SvRichCell.svelte.d.ts +15 -0
  54. package/dist/SvRichText.svelte +211 -211
  55. package/dist/SvRowGroupPanel.svelte +170 -170
  56. package/dist/SvScrollArea.svelte +61 -61
  57. package/dist/SvSlider.svelte +203 -203
  58. package/dist/SvSwitchButton.svelte +108 -108
  59. package/dist/SvTagsInput.svelte +115 -115
  60. package/dist/SvTextArea.svelte +5 -1
  61. package/dist/SvTextInput.svelte +147 -147
  62. package/dist/SvTimePicker.svelte +245 -245
  63. package/dist/SvToaster.svelte +159 -159
  64. package/dist/SvToggleButton.svelte +85 -85
  65. package/dist/SvTooltip.svelte +161 -161
  66. package/dist/SvTour.svelte +208 -208
  67. package/dist/SvTree.svelte +444 -444
  68. package/dist/SvTreeSelect.svelte +239 -235
  69. package/dist/SvTreeSelect.svelte.d.ts +1 -1
  70. package/dist/builtin-editors.d.ts +2 -2
  71. package/dist/builtin-editors.js +19 -3
  72. package/dist/cdn/GridMenus-C4oLsJyj.js +600 -0
  73. package/dist/cdn/GridMenus-yEivjNwl.js +601 -0
  74. package/dist/cdn/SvDateRangeInput-Bh0A0JkF.js +199 -0
  75. package/dist/cdn/SvDateRangeInput-DflbiP7N.js +198 -0
  76. package/dist/cdn/SvDateTimePicker-BWwpfB_o.js +812 -0
  77. package/dist/cdn/SvDateTimePicker-Bivn8dAP.js +816 -0
  78. package/dist/cdn/SvGridCellEditor-AXL8cHGO.js +550 -0
  79. package/dist/cdn/SvGridCellEditor-Ba7rY3eu.js +549 -0
  80. package/dist/cdn/{SvGridChart-BwVos976.js → SvGridChart-Bs2GIR2Q.js} +1 -1
  81. package/dist/cdn/{SvGridChart-BEJmNNx9.js → SvGridChart-CwhFz7GV.js} +1 -1
  82. package/dist/cdn/{SvGridChartPanel-BOknOkrP.js → SvGridChartPanel-1WXuStzM.js} +1 -1
  83. package/dist/cdn/{SvGridChartPanel-D2PjII4O.js → SvGridChartPanel-e5_nqNP9.js} +1 -1
  84. package/dist/cdn/{SvGridChartView-00LPUHL1.js → SvGridChartView-SmPW10dI.js} +1 -1
  85. package/dist/cdn/{SvGridChartView-BhUEJ5ki.js → SvGridChartView-eSPuJE6g.js} +1 -1
  86. package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
  87. package/dist/cdn/{SvGridDropdown-D13MtJ2j.js → SvGridDropdown-CtdbHcIS.js} +1 -1
  88. package/dist/cdn/column-resize-DsfNXMom.js +102 -0
  89. package/dist/cdn/date-format-CcP1tafP.js +1395 -0
  90. package/dist/cdn/date-format-DZT7T1wf.js +1393 -0
  91. package/dist/cdn/{editor-registry-CiI0xlKg.js → editor-registry-BhgE3S84.js} +51 -25
  92. package/dist/cdn/row-resize-BRcimkUT.js +95 -0
  93. package/dist/cdn/{src-BYq-qyrp.js → src-COC0vnpg.js} +7846 -7317
  94. package/dist/cdn/{src-DBel9wRZ.js → src-pYGV2rMR.js} +10033 -9504
  95. package/dist/cdn/svgrid.js +15 -11
  96. package/dist/cdn/svgrid.svelte-external.js +15 -11
  97. package/dist/cell-values.d.ts +16 -0
  98. package/dist/cell-values.js +28 -0
  99. package/dist/chart-export.js +8 -8
  100. package/dist/clipboard.d.ts +22 -0
  101. package/dist/clipboard.js +405 -27
  102. package/dist/column-groups.js +1 -1
  103. package/dist/column-resize.d.ts +46 -0
  104. package/dist/column-resize.js +205 -0
  105. package/dist/columns.d.ts +0 -3
  106. package/dist/columns.js +0 -57
  107. package/dist/core.d.ts +19 -4
  108. package/dist/core.js +460 -119
  109. package/dist/editing.js +12 -7
  110. package/dist/editors/cell-editors.d.ts +11 -0
  111. package/dist/editors/cell-editors.js +18 -1
  112. package/dist/filtering/excel-filters.js +28 -0
  113. package/dist/grid-messages.d.ts +15 -0
  114. package/dist/grid-messages.js +15 -0
  115. package/dist/group-display.d.ts +1 -1
  116. package/dist/index.d.ts +6 -1
  117. package/dist/index.js +10 -0
  118. package/dist/list-option.d.ts +6 -0
  119. package/dist/menus.js +41 -8
  120. package/dist/row-resize.d.ts +11 -0
  121. package/dist/row-resize.js +7 -1
  122. package/dist/sanitize-html.d.ts +37 -0
  123. package/dist/sanitize-html.js +234 -0
  124. package/dist/selection-bar-view.svelte.d.ts +25 -0
  125. package/dist/selection-bar-view.svelte.js +13 -0
  126. package/dist/selection.d.ts +2 -1
  127. package/dist/selection.js +133 -8
  128. package/dist/spreadsheet.d.ts +1 -1
  129. package/dist/spreadsheet.js +1 -1
  130. package/package.json +11 -11
  131. package/src/FlexRender.svelte +96 -96
  132. package/src/GridFooter.svelte +181 -181
  133. package/src/GridMenus.svelte +201 -18
  134. package/src/SvAutoComplete.svelte +169 -165
  135. package/src/SvAvatar.svelte +75 -75
  136. package/src/SvCalendar.svelte +503 -503
  137. package/src/SvCalendar.test.ts +226 -226
  138. package/src/SvCarousel.svelte +141 -141
  139. package/src/SvCheckBox.svelte +102 -102
  140. package/src/SvCircularProgress.svelte +109 -109
  141. package/src/SvColorInput.svelte +181 -181
  142. package/src/SvComboBox.svelte +279 -275
  143. package/src/SvContextMenu.svelte +116 -116
  144. package/src/SvCountryInput.svelte +163 -163
  145. package/src/SvDateRangeInput.svelte +25 -3
  146. package/src/SvDrawer.svelte +254 -254
  147. package/src/SvDropDownList.svelte +378 -374
  148. package/src/SvDurationInput.svelte +126 -126
  149. package/src/SvField.svelte +293 -293
  150. package/src/SvForm.svelte +437 -437
  151. package/src/SvForm.test.ts +411 -411
  152. package/src/SvGrid.controller.svelte.ts +404 -133
  153. package/src/SvGrid.css +222 -1
  154. package/src/SvGrid.helpers.ts +87 -0
  155. package/src/SvGrid.svelte +255 -56
  156. package/src/SvGrid.types.ts +2092 -1940
  157. package/src/SvGridCellEditor.svelte +744 -662
  158. package/src/SvGridChart.svelte +1716 -1716
  159. package/src/SvGridChartPanel.svelte +485 -485
  160. package/src/SvGridChartView.svelte +70 -70
  161. package/src/SvGridDropdown.svelte +728 -728
  162. package/src/SvGridSelect.svelte +270 -266
  163. package/src/SvGroupCell.svelte +116 -116
  164. package/src/SvListBox.svelte +334 -326
  165. package/src/SvMaskedInput.svelte +122 -122
  166. package/src/SvMenu.svelte +124 -124
  167. package/src/SvMenu.test.ts +97 -97
  168. package/src/SvMenuList.svelte +146 -146
  169. package/src/SvMultiSelect.svelte +293 -289
  170. package/src/SvNumberInput.svelte +172 -168
  171. package/src/SvOtpInput.svelte +158 -158
  172. package/src/SvPasswordInput.svelte +151 -151
  173. package/src/SvPhoneInput.svelte +133 -133
  174. package/src/SvPopover.svelte +197 -197
  175. package/src/SvProgress.svelte +116 -116
  176. package/src/SvRadioGroup.svelte +107 -107
  177. package/src/SvRating.svelte +112 -112
  178. package/src/SvResult.svelte +73 -73
  179. package/src/SvRichCell.svelte +125 -0
  180. package/src/SvRichText.svelte +211 -211
  181. package/src/SvRowGroupPanel.svelte +170 -170
  182. package/src/SvScrollArea.svelte +61 -61
  183. package/src/SvSlider.svelte +203 -203
  184. package/src/SvSwitchButton.svelte +108 -108
  185. package/src/SvTagsInput.svelte +115 -115
  186. package/src/SvTextArea.svelte +5 -1
  187. package/src/SvTextInput.svelte +147 -147
  188. package/src/SvTimePicker.svelte +245 -245
  189. package/src/SvToaster.svelte +159 -159
  190. package/src/SvToaster.test.ts +95 -95
  191. package/src/SvToggleButton.svelte +85 -85
  192. package/src/SvTooltip.svelte +161 -161
  193. package/src/SvTour.svelte +208 -208
  194. package/src/SvTree.svelte +444 -444
  195. package/src/SvTreeSelect.svelte +239 -235
  196. package/src/a11y/dismissable.test.ts +119 -119
  197. package/src/a11y/dismissable.ts +114 -114
  198. package/src/a11y.contract.test.ts +49 -49
  199. package/src/a11y.test.ts +59 -59
  200. package/src/a11y.ts +61 -61
  201. package/src/ai.test.ts +502 -502
  202. package/src/ai.ts +1419 -1419
  203. package/src/build-api.coverage.test.ts +633 -633
  204. package/src/build-api.ts +846 -846
  205. package/src/builtin-editors.grid.test.ts +83 -83
  206. package/src/builtin-editors.test.ts +18 -1
  207. package/src/builtin-editors.ts +19 -3
  208. package/src/cell-formatting.ts +171 -171
  209. package/src/cell-render.test.ts +513 -513
  210. package/src/cell-render.ts +496 -496
  211. package/src/cell-values.ts +148 -118
  212. package/src/chart-export.ts +202 -202
  213. package/src/chart-view.svelte.ts +36 -36
  214. package/src/chart.ts +2321 -2321
  215. package/src/clipboard.test.ts +93 -20
  216. package/src/clipboard.ts +433 -33
  217. package/src/collaboration.test.ts +104 -104
  218. package/src/collaboration.ts +167 -167
  219. package/src/column-groups.ts +78 -78
  220. package/src/column-resize.test.ts +381 -0
  221. package/src/column-resize.ts +227 -0
  222. package/src/columns.test.ts +0 -103
  223. package/src/columns.ts +0 -58
  224. package/src/core.aggregate.test.ts +134 -0
  225. package/src/core.filter.test.ts +156 -0
  226. package/src/core.grouping.test.ts +146 -0
  227. package/src/core.performance.test.ts +30 -30
  228. package/src/core.row-shape.test.ts +119 -0
  229. package/src/core.rowmodel-cache.test.ts +121 -0
  230. package/src/core.sort.test.ts +293 -0
  231. package/src/core.ts +1865 -1468
  232. package/src/createAutocomplete.svelte.ts +132 -132
  233. package/src/createCombobox.svelte.ts +191 -191
  234. package/src/createCountryInput.svelte.ts +157 -157
  235. package/src/createDropdownList.svelte.ts +168 -168
  236. package/src/createForm.svelte.ts +386 -386
  237. package/src/createGrid.svelte.ts +42 -42
  238. package/src/createGrid.test.ts +10 -10
  239. package/src/createGridState.svelte.ts +17 -17
  240. package/src/createListbox.svelte.ts +250 -250
  241. package/src/createMenu.svelte.ts +224 -224
  242. package/src/createPopoverSelect.svelte.ts +213 -213
  243. package/src/createSlider.svelte.ts +191 -191
  244. package/src/createTooltip.svelte.ts +144 -144
  245. package/src/createTree.svelte.ts +322 -322
  246. package/src/date-string-column.test.ts +87 -0
  247. package/src/datetime/date-core.ts +206 -206
  248. package/src/datetime/date-restrict.ts +61 -61
  249. package/src/datetime/timezone.ts +135 -135
  250. package/src/dock-manager-model.ts +596 -596
  251. package/src/dock-model.ts +374 -374
  252. package/src/editing.test.ts +974 -949
  253. package/src/editing.ts +609 -606
  254. package/src/editor-block-prop.test.ts +132 -0
  255. package/src/editor-contract.ts +171 -171
  256. package/src/editor-registry.grid.test.ts +144 -144
  257. package/src/editor-registry.ts +122 -122
  258. package/src/editors/cell-editors.ts +27 -1
  259. package/src/export-data-api.test.ts +126 -126
  260. package/src/export-format.test.ts +107 -107
  261. package/src/export-format.ts +601 -601
  262. package/src/filter-operators.ts +160 -160
  263. package/src/filtering/excel-filters.ts +325 -295
  264. package/src/filtering/normalize-fast-path.test.ts +104 -0
  265. package/src/flex-render.ts +3 -3
  266. package/src/form-field.ts +127 -127
  267. package/src/grid-messages.ts +34 -0
  268. package/src/group-display.test.ts +167 -167
  269. package/src/group-display.ts +200 -200
  270. package/src/headless.ts +87 -87
  271. package/src/index.ts +25 -1
  272. package/src/js-scroller.svelte.ts +173 -173
  273. package/src/keyboard-handlers.ts +270 -270
  274. package/src/keyboard.test.ts +59 -59
  275. package/src/keyboard.ts +97 -97
  276. package/src/list-nav.test.ts +49 -49
  277. package/src/list-nav.ts +29 -29
  278. package/src/list-option.test.ts +56 -56
  279. package/src/list-option.ts +179 -173
  280. package/src/menus.test.ts +43 -0
  281. package/src/menus.ts +597 -567
  282. package/src/merge-objects.ts +48 -48
  283. package/src/move-cells.test.ts +850 -0
  284. package/src/number-editor-literal.test.ts +84 -0
  285. package/src/number-editor.grid.test.ts +160 -0
  286. package/src/overlays.test.ts +90 -90
  287. package/src/positioning.ts +268 -268
  288. package/src/render-component.ts +28 -28
  289. package/src/resize-props.test.ts +361 -0
  290. package/src/row-drag-touch.ts +211 -211
  291. package/src/row-drag.test.ts +353 -353
  292. package/src/row-drag.ts +415 -415
  293. package/src/row-resize.test.ts +524 -493
  294. package/src/row-resize.ts +228 -210
  295. package/src/sanitize-html.test.ts +182 -0
  296. package/src/sanitize-html.ts +235 -0
  297. package/src/scheduler-ical.ts +181 -181
  298. package/src/scheduler-model.test.ts +562 -562
  299. package/src/scheduler-model.ts +873 -873
  300. package/src/selection-bar-view.svelte.ts +36 -0
  301. package/src/selection.test.ts +900 -743
  302. package/src/selection.ts +135 -8
  303. package/src/server-data-source.test.ts +383 -383
  304. package/src/server-data-source.ts +469 -469
  305. package/src/sparkline.test.ts +68 -68
  306. package/src/sparkline.ts +169 -169
  307. package/src/spreadsheet.test.ts +488 -488
  308. package/src/spreadsheet.ts +312 -312
  309. package/src/static-functions.ts +11 -11
  310. package/src/subscribe.ts +38 -38
  311. package/src/summaries.ts +113 -113
  312. package/src/svgrid-wrapper.types.ts +563 -563
  313. package/src/svgrid.async-editor-options.test.ts +273 -273
  314. package/src/svgrid.auto-row-height.test.ts +204 -204
  315. package/src/svgrid.behavior.test.ts +910 -910
  316. package/src/svgrid.charting.test.ts +534 -534
  317. package/src/svgrid.comments-autocomplete.test.ts +127 -127
  318. package/src/svgrid.context-menu.test.ts +147 -147
  319. package/src/svgrid.features.test.ts +157 -157
  320. package/src/svgrid.filter-depth.test.ts +163 -163
  321. package/src/svgrid.filter-menu-listbox.svelte.test.ts +377 -331
  322. package/src/svgrid.filter-menu-scroll.test.ts +112 -112
  323. package/src/svgrid.grand-total.test.ts +188 -188
  324. package/src/svgrid.group-display-mode.test.ts +171 -171
  325. package/src/svgrid.group-footers.test.ts +121 -121
  326. package/src/svgrid.group-pagination.test.ts +153 -153
  327. package/src/svgrid.in-suggest-snapshot.svelte.test.ts +91 -0
  328. package/src/svgrid.menu-scroll-close.test.ts +204 -0
  329. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  330. package/src/svgrid.selection-bar-seam.test.ts +185 -0
  331. package/src/svgrid.tree-data.test.ts +186 -186
  332. package/src/svgrid.upsell-license.test.ts +117 -0
  333. package/src/svgrid.wrapper.test.ts +63 -63
  334. package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
  335. package/src/test-setup.ts +62 -62
  336. package/src/themes/index.ts +288 -288
  337. package/src/toast-store.svelte.ts +250 -250
  338. package/src/toast-store.test.ts +147 -147
  339. package/src/tree-row-model.test.ts +168 -168
  340. package/src/ui-buttons.test.ts +144 -144
  341. package/src/ui-inputs.test.ts +118 -118
  342. package/src/ui-localization.test.ts +113 -113
  343. package/src/ui-range.test.ts +70 -70
  344. package/src/ui-selection.test.ts +155 -155
  345. package/src/ui-tier1.test.ts +142 -142
  346. package/src/virtual.test.ts +88 -88
  347. package/src/virtualization/column-virtualizer.test.ts +27 -27
  348. package/src/virtualization/column-virtualizer.ts +30 -30
  349. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  350. package/src/virtualization/types.ts +30 -30
  351. package/src/virtualization/virtualizer.test.ts +47 -47
  352. package/src/virtualization/virtualizer.ts +322 -322
  353. package/dist/cdn/GridMenus-BfTAKn84.js +0 -488
  354. package/dist/cdn/GridMenus-C3bJd7w8.js +0 -489
  355. package/dist/cdn/SvDateTimePicker-CHnUkWcH.js +0 -2206
  356. package/dist/cdn/SvDateTimePicker-CRQH_U7E.js +0 -2201
  357. package/dist/cdn/SvGridCellEditor-BGUCzuPB.js +0 -523
  358. package/dist/cdn/SvGridCellEditor-G8IMWIws.js +0 -522
package/dist/SvGrid.css CHANGED
@@ -14,6 +14,34 @@
14
14
  position: relative;
15
15
  font-family: var(--sg-font, inherit);
16
16
  }
17
+
18
+ /*
19
+ * Room for the selection bar, INSIDE the scroll area.
20
+ *
21
+ * The bar floats - it must not resize the grid, or every layout holding one
22
+ * jumps the moment a checkbox is ticked. So the grid keeps its exact size and
23
+ * the SCROLLER gains bottom padding instead: scrollable space under the last
24
+ * row, the height of the bar. The bar then floats over padding rather than
25
+ * over data, and every row can still be scrolled into clear view.
26
+ *
27
+ * Shrinking the grid instead (padding on the root) was the first attempt. It
28
+ * kept rows visible but made the table resize under the user, which is worse.
29
+ *
30
+ * Only while the bar is up, so an unselected grid scrolls exactly as before.
31
+ */
32
+ .sv-grid-root[data-selbar] {
33
+ --sg-selbar-reserve: 68px;
34
+ }
35
+ /* The upsell note is prose, so it is taller than the bar it stands in for. */
36
+ .sv-grid-root[data-selbar^='upsell'] {
37
+ --sg-selbar-reserve: 116px;
38
+ }
39
+ .sv-grid-root[data-selbar$='bottom'] .sv-grid-container {
40
+ padding-bottom: var(--sg-selbar-reserve);
41
+ }
42
+ .sv-grid-root[data-selbar$='top'] .sv-grid-container {
43
+ padding-top: var(--sg-selbar-reserve);
44
+ }
17
45
  .sv-grid-sr-only {
18
46
  position: absolute;
19
47
  width: 1px;
@@ -928,6 +956,18 @@
928
956
  padding: 5px var(--sg-filter-cell-px, var(--sg-cell-px, 7px));
929
957
  }
930
958
 
959
+ /* The rich date picker in the filter row. It enters `.sv-grid-filter-row-control`
960
+ as a `.sv-field`, which carries none of the flex sizing every other filter
961
+ control has, so it laid itself out at the full cell width NEXT TO the
962
+ operator button: the box was cut off at the column line and the calendar
963
+ toggle ended up outside the cell, underneath the next column's filter, where
964
+ no click could reach it. Size it like `.sv-grid-filter-value` so it shares
965
+ the row instead of overflowing it. */
966
+ .sv-grid-filter-row-control > .sv-field {
967
+ flex: 3 1 0;
968
+ min-width: 0;
969
+ }
970
+
931
971
  .sv-grid-filter-operator {
932
972
  flex: 2 1 0;
933
973
  min-width: 0;
@@ -1196,6 +1236,57 @@ select.sv-grid-fr-editor {
1196
1236
  overflow: visible;
1197
1237
  }
1198
1238
 
1239
+ /* ---- The editing cell's border -------------------------------------------
1240
+ One ring for every editor, drawn by the CELL rather than by each editor.
1241
+ They used to draw their own and they disagreed: the text/number/date inputs
1242
+ put a 2px accent-at-30% halo OUTSIDE the cell, the dropdown trigger put a
1243
+ solid 2px outline INSIDE it (outline-offset: -2px), and the checkbox drew
1244
+ nothing - so the border was single, double or missing depending on which
1245
+ column you happened to be editing.
1246
+
1247
+ Excel's shape: a 2px band centred on the cell's own grid line, so half of it
1248
+ covers the line and half sits inside the cell. `inset: -1px` with a 2px
1249
+ border straddles exactly that way. It is a pseudo-element, not the cell's
1250
+ `box-shadow`, because every editor fills the cell with an opaque background
1251
+ and would paint over an inset shadow; ::after is the cell's last child, so
1252
+ it lands on top of the editor. `pointer-events: none` keeps it out of the
1253
+ way of clicks on the editor underneath. */
1254
+ .sv-grid-cell.sv-grid-cell-editing::after {
1255
+ content: "";
1256
+ position: absolute;
1257
+ inset: -1px;
1258
+ border: 2px solid var(--sg-accent, #0b63f3);
1259
+ pointer-events: none;
1260
+ }
1261
+ /* The shared active/editing rule paints an inset ring. For an editing cell the
1262
+ ::after above replaces it - keeping both would show two lines through any
1263
+ editor that does not fill the cell (the checkbox). */
1264
+ .sv-grid-cell.sv-grid-cell-editing {
1265
+ box-shadow: none;
1266
+ }
1267
+ /* Each editor's own focus ring, off while it is the in-cell editor. Elsewhere
1268
+ (filter row, standalone use) they keep it. Three class selectors so these win
1269
+ over the dropdown's and the picker's component-scoped `:focus` rules. */
1270
+ .sv-grid-cell.sv-grid-cell-editing .sv-grid-cell-editor:focus,
1271
+ .sv-grid-cell.sv-grid-cell-editing .sv-grid-dropdown-trigger:focus,
1272
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp__field:focus-within {
1273
+ box-shadow: none;
1274
+ outline: none;
1275
+ }
1276
+ /* The checkbox editor's own focus outline, plus any ring a host page puts on
1277
+ focused buttons (both demo shells do, via a global `button:focus-visible`).
1278
+ Either one is a second border around the only control in the cell, which the
1279
+ cell already frames. Outside an editing cell - the row-selection checkbox,
1280
+ read-only cells - the outline stays.
1281
+
1282
+ The rating stars deliberately keep their focus ring: with five buttons in a
1283
+ radiogroup it is what shows which star the arrow keys are on. */
1284
+ .sv-grid-cell.sv-grid-cell-editing .sv-grid-checkbox:focus-visible {
1285
+ box-shadow: none;
1286
+ outline: none;
1287
+ }
1288
+
1289
+
1199
1290
  /* Excel-style fill handle: a 7×7 blue square anchored to the bottom-
1200
1291
  right corner of the active cell or selection range. The parent
1201
1292
  `.sv-grid-cell` is `position: relative` (sticky cells override
@@ -1246,6 +1337,44 @@ select.sv-grid-fr-editor {
1246
1337
  transform-origin: bottom right;
1247
1338
  }
1248
1339
 
1340
+ /* Placement for the selection-bar upsell note. The BAR itself is an Enterprise
1341
+ component and carries its own scoped styles - this is only the stand-in the
1342
+ free grid shows when no renderer is registered, positioned on the same edge
1343
+ the real bar would use so the layout does not jump once it is installed. */
1344
+ .sv-grid-selection-bar-upsell {
1345
+ position: absolute;
1346
+ left: 50%;
1347
+ transform: translateX(-50%);
1348
+ /* Same slot as the real bar: above the custom scrollbars (40/41/42), below
1349
+ find-in-grid (60) and the menus (900+). Sharing the value matters because
1350
+ installing enterprise must not change where this sits in the stack. */
1351
+ z-index: 45;
1352
+ max-width: calc(100% - 24px);
1353
+ }
1354
+ .sv-grid-selection-bar-upsell[data-position="bottom"] { bottom: 16px; }
1355
+ .sv-grid-selection-bar-upsell[data-position="top"] { top: 16px; }
1356
+
1357
+ /* Excel-style range drag-and-drop (`moveCells`). The grab target is the outer
1358
+ 4px of the selection border, which is PAINTED (an inset box-shadow) rather
1359
+ than an element, so there is nothing to hang `cursor` off per cell. Instead
1360
+ the controller flips one attribute on the root while the pointer is over the
1361
+ strip, and this turns the whole grid's cursor for as long as that lasts -
1362
+ the cursor is on the border anyway, so the effect is identical to a hit
1363
+ target and costs nothing per cell. `!important` because several cell states
1364
+ (editing, checkbox, link) set their own cursor at higher specificity, and
1365
+ during a grab the move cursor has to win over all of them. */
1366
+ .sv-grid-root[data-move-grab="true"],
1367
+ .sv-grid-root[data-move-grab="true"] .sv-grid-cell {
1368
+ cursor: move !important;
1369
+ }
1370
+ /* The fill handle keeps its own crosshair: it sits in the bottom-right corner,
1371
+ inside the grab strip's territory, and it is a real element that captures
1372
+ the pointerdown first. Letting it read as "move" would promise the wrong
1373
+ gesture. */
1374
+ .sv-grid-root[data-move-grab="true"] .sv-grid-fill-handle {
1375
+ cursor: crosshair !important;
1376
+ }
1377
+
1249
1378
  /* Excel-style fill-handle drag marquee: ONE thin dashed rectangle around the
1250
1379
  whole target range (source + fill-into area), not a thick per-cell border or
1251
1380
  fill tint. Drawn as four background-image layers on the boundary cells - no
@@ -1435,6 +1564,76 @@ select.sv-grid-fr-editor {
1435
1564
  height: 100%;
1436
1565
  }
1437
1566
 
1567
+ /* Rich date / datetime / time editor (SvDateTimePicker) inside a cell.
1568
+ The picker is a standalone UI-kit control: a fixed 34px pill with its own
1569
+ 1px border, radius and outer focus ring. Dropped into a cell it stayed in
1570
+ flow, so that pill drew a second, smaller box inside the cell's editing
1571
+ ring, its radius pulled the corners away from the grid lines, and its ring
1572
+ bled past the cell - the borders never lined up with the column. In-cell it
1573
+ gets the same treatment as `.sv-grid-cell-editor`: taken out of flow, pinned
1574
+ to the cell box and stripped of its own chrome - the cell draws the single
1575
+ editing ring for every editor. Scoped to the editing cell, so the filter row
1576
+ and standalone pickers keep their box.
1577
+ Three class selectors (not two) so these win over the component's own
1578
+ scoped rules whatever order the two stylesheets land in. */
1579
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp {
1580
+ position: absolute;
1581
+ inset: 0;
1582
+ display: block;
1583
+ width: auto;
1584
+ }
1585
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp__field {
1586
+ height: 100%;
1587
+ border: 0;
1588
+ border-radius: 0;
1589
+ box-shadow: none;
1590
+ /* The compact buttons below carry their own breathing room. */
1591
+ padding-inline: 0;
1592
+ }
1593
+ /* Match the cell's own type instead of the control's fixed 13px, so the value
1594
+ doesn't change size the moment the cell goes into edit. */
1595
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp__input {
1596
+ font: inherit;
1597
+ }
1598
+ /* Date columns are narrow and the two 26px buttons ate enough of them to clip
1599
+ the value. Trimmed wherever the picker sits inside a column's width - the
1600
+ cell editor and the filter row - but not for standalone pickers. */
1601
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp__clear,
1602
+ .sv-grid-cell.sv-grid-cell-editing .sv-dtp__toggle,
1603
+ .sv-grid-filter-row-control > .sv-field .sv-dtp__toggle {
1604
+ width: 20px;
1605
+ height: 20px;
1606
+ }
1607
+ /* Safety valve for a very narrow date column: the toggle keeps its 20px while
1608
+ there is room and gives some back rather than spilling over the column line
1609
+ onto the next filter, where no click could reach it. */
1610
+ .sv-grid-filter-row-control > .sv-field .sv-dtp__toggle {
1611
+ flex: 0 1 auto;
1612
+ min-width: 0;
1613
+ }
1614
+ /* The filter row drops the picker's clear button. It costs ~20px of a filter
1615
+ cell that has none to spare, next to the operator button and the calendar
1616
+ toggle, and a date column is usually narrow. Nothing is lost: emptying the
1617
+ text clears the filter, as does Clear filter in the column menu. */
1618
+ .sv-grid-filter-row-control > .sv-field .sv-dtp__clear {
1619
+ display: none;
1620
+ }
1621
+
1622
+ /* The range field `between` uses (SvDateRangeInput). Its stock chrome - a 10px
1623
+ inset, a 15px icon, two 6px gaps and a 24px clear - adds up to more than a
1624
+ narrow date column has, and the clear button hung out past the field's own
1625
+ border. Trimmed to fit; the clear can shrink further before anything spills. */
1626
+ .sv-grid-filter-row-control > .sv-field .sv-dri__field {
1627
+ padding-inline: 4px 2px;
1628
+ gap: 3px;
1629
+ }
1630
+ .sv-grid-filter-row-control > .sv-field .sv-dri__clear {
1631
+ width: 20px;
1632
+ height: 20px;
1633
+ flex: 0 1 auto;
1634
+ min-width: 0;
1635
+ }
1636
+
1438
1637
  /* List editor: native <select>. For multi-select it grows into a
1439
1638
  small popup-style listbox that hangs over the cell. */
1440
1639
  .sv-grid-cell-editor-list {
@@ -1573,7 +1772,7 @@ select.sv-grid-fr-editor {
1573
1772
  position: relative;
1574
1773
  }
1575
1774
  /* Declarative cell validation (column `validate` hook). Invalid cells get a
1576
- * soft red wash and a red inset ring - Handsontable's `htInvalid` look. The
1775
+ * soft red wash and a red inset ring - the conventional spreadsheet invalid-cell look. The
1577
1776
  * value keeps rendering as-is; the message (if any) shows as the tooltip. */
1578
1777
  .sv-grid-cell-invalid {
1579
1778
  background-color: var(--sg-invalid-bg, rgba(239, 68, 68, 0.14)) !important;
@@ -1981,6 +2180,16 @@ select.sv-grid-fr-editor {
1981
2180
  font-weight: 600;
1982
2181
  color: var(--sg-muted, #475569);
1983
2182
  }
2183
+ /* Trailing status on a section heading: how much of the list is selected, or
2184
+ that a condition is ANDed with it. Pushed to the far edge and de-emphasised
2185
+ so it reads as state, not as part of the heading. */
2186
+ .sv-grid-menu-head-note {
2187
+ margin-inline-start: auto;
2188
+ font-weight: 500;
2189
+ font-size: 0.85em;
2190
+ color: var(--sg-muted, #64748b);
2191
+ opacity: 0.85;
2192
+ }
1984
2193
 
1985
2194
  .sv-grid-menu-search {
1986
2195
  width: 100%;
@@ -2745,6 +2954,18 @@ select.sv-grid-fr-editor {
2745
2954
  }
2746
2955
  .sv-grid-scheduler-upsell strong { font-size: 0.95rem; }
2747
2956
  .sv-grid-scheduler-upsell p { margin: 0; font-size: 0.85rem; max-width: 42ch; }
2957
+ /* The licensing line sits under the "how to install it" line, quieter than it:
2958
+ the first sentence is what unblocks the developer looking at this, the second
2959
+ is what they need before shipping. */
2960
+ .sv-grid-upsell-license {
2961
+ font-size: 0.8rem;
2962
+ opacity: 0.85;
2963
+ }
2964
+ .sv-grid-upsell-license a {
2965
+ color: inherit;
2966
+ text-decoration: underline;
2967
+ text-underline-offset: 2px;
2968
+ }
2748
2969
  .sv-grid-scheduler-upsell code {
2749
2970
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
2750
2971
  font-size: 0.82em;
@@ -18,6 +18,61 @@ export declare function timeStringToDate(value: unknown): Date | null;
18
18
  export declare function dateToTimeString(d: Date | null): string | null;
19
19
  export declare function getEditableInputValue(editorType: CellEditorType, value: unknown): string;
20
20
  export declare function getEditorInputType(editorType: CellEditorType): "number" | "date" | "text" | "time" | "password" | "color" | "datetime-local";
21
+ /**
22
+ * Input type for the CELL EDITOR specifically, which differs from
23
+ * {@link getEditorInputType} in one place: `number` becomes a text input.
24
+ *
25
+ * `<input type="number">` runs the HTML value-sanitization algorithm, so it
26
+ * only ever reports a value that parses as a valid float. Every intermediate
27
+ * state on the way to `12.5` - `12.` - is not one, and the element reports the
28
+ * empty string instead. The editor reads `event.currentTarget.value` into its
29
+ * draft, so the decimal point the user just typed disappeared. Same for a lone
30
+ * `-` on the way to a negative and `1e` on the way to `1e3`.
31
+ *
32
+ * A text input keeps the raw keystrokes, and the draft is coerced to a number
33
+ * at commit by `parseEditorValue` - which the editor already did. Pair it with
34
+ * `inputmode="decimal"` for the mobile keypad and
35
+ * {@link isNumericEditorInput} for the character filtering that
36
+ * `type="number"` used to provide.
37
+ *
38
+ * The filter-row and filter-menu inputs deliberately still use
39
+ * {@link getEditorInputType}: they feed a different pipeline, and changing
40
+ * them is a separate decision.
41
+ */
42
+ /**
43
+ * Should this column filter with the grid own date picker rather than the
44
+ * browser one?
45
+ *
46
+ * The grid convention is rich-by-default with an explicit `-native` opt-out,
47
+ * which the cell editor follows. The filter row did not: a `date` column
48
+ * edited through SvDateTimePicker was FILTERED through a native
49
+ * `<input type="date">`, so the same column offered two different date UIs.
50
+ */
51
+ /**
52
+ * A Date to the 'YYYY-MM-DD' a date filter compares against, using LOCAL
53
+ * parts. `toISOString()` would convert through UTC, so picking the 1st in a
54
+ * negative-offset zone would filter for the 31st of the month before.
55
+ */
56
+ export declare function toIsoDateLocal(value: Date | null | undefined): string;
57
+ /**
58
+ * The inverse of {@link toIsoDateLocal}: read a 'YYYY-MM-DD' filter value back
59
+ * as that LOCAL calendar day. `new Date('2026-09-10')` is parsed as UTC
60
+ * midnight, which is the 9th anywhere west of Greenwich - so handing the raw
61
+ * string to a date control and writing it back through `toIsoDateLocal` walks
62
+ * the value backwards a day per round trip.
63
+ */
64
+ export declare function fromIsoDateLocal(value: string | null | undefined): Date | null;
65
+ export declare function usesRichDateFilter(editorType: CellEditorType | undefined): boolean;
66
+ export declare function getCellEditorInputType(editorType: CellEditorType): "number" | "date" | "text" | "time" | "password" | "color" | "datetime-local";
67
+ /**
68
+ * Is `value` something the user could still be typing towards a number?
69
+ *
70
+ * Deliberately permissive about INTERMEDIATE states - `''`, `'-'`, `'12.'` and
71
+ * `'1e'` all pass, because rejecting them is the exact bug this replaces. It
72
+ * only rejects text that can never become a number, which is the guarantee
73
+ * `type="number"` used to give.
74
+ */
75
+ export declare function isNumericEditorInput(value: string): boolean;
21
76
  /** Resolve a stored value to an array form (for list/chips multi-select). */
22
77
  export declare function toValueArray(value: unknown): Array<string | number>;
23
78
  /** Look up the display label for a given option value. */
@@ -106,6 +106,89 @@ export function getEditorInputType(editorType) {
106
106
  return "color";
107
107
  return "text";
108
108
  }
109
+ /**
110
+ * Input type for the CELL EDITOR specifically, which differs from
111
+ * {@link getEditorInputType} in one place: `number` becomes a text input.
112
+ *
113
+ * `<input type="number">` runs the HTML value-sanitization algorithm, so it
114
+ * only ever reports a value that parses as a valid float. Every intermediate
115
+ * state on the way to `12.5` - `12.` - is not one, and the element reports the
116
+ * empty string instead. The editor reads `event.currentTarget.value` into its
117
+ * draft, so the decimal point the user just typed disappeared. Same for a lone
118
+ * `-` on the way to a negative and `1e` on the way to `1e3`.
119
+ *
120
+ * A text input keeps the raw keystrokes, and the draft is coerced to a number
121
+ * at commit by `parseEditorValue` - which the editor already did. Pair it with
122
+ * `inputmode="decimal"` for the mobile keypad and
123
+ * {@link isNumericEditorInput} for the character filtering that
124
+ * `type="number"` used to provide.
125
+ *
126
+ * The filter-row and filter-menu inputs deliberately still use
127
+ * {@link getEditorInputType}: they feed a different pipeline, and changing
128
+ * them is a separate decision.
129
+ */
130
+ /**
131
+ * Should this column filter with the grid own date picker rather than the
132
+ * browser one?
133
+ *
134
+ * The grid convention is rich-by-default with an explicit `-native` opt-out,
135
+ * which the cell editor follows. The filter row did not: a `date` column
136
+ * edited through SvDateTimePicker was FILTERED through a native
137
+ * `<input type="date">`, so the same column offered two different date UIs.
138
+ */
139
+ /**
140
+ * A Date to the 'YYYY-MM-DD' a date filter compares against, using LOCAL
141
+ * parts. `toISOString()` would convert through UTC, so picking the 1st in a
142
+ * negative-offset zone would filter for the 31st of the month before.
143
+ */
144
+ export function toIsoDateLocal(value) {
145
+ if (!value || Number.isNaN(value.getTime()))
146
+ return "";
147
+ const pad = (n) => String(n).padStart(2, "0");
148
+ return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`;
149
+ }
150
+ /**
151
+ * The inverse of {@link toIsoDateLocal}: read a 'YYYY-MM-DD' filter value back
152
+ * as that LOCAL calendar day. `new Date('2026-09-10')` is parsed as UTC
153
+ * midnight, which is the 9th anywhere west of Greenwich - so handing the raw
154
+ * string to a date control and writing it back through `toIsoDateLocal` walks
155
+ * the value backwards a day per round trip.
156
+ */
157
+ export function fromIsoDateLocal(value) {
158
+ if (!value)
159
+ return null;
160
+ const parts = /^(\d{4})-(\d{2})-(\d{2})/.exec(value);
161
+ if (!parts) {
162
+ const loose = new Date(value);
163
+ return Number.isNaN(loose.getTime()) ? null : loose;
164
+ }
165
+ const local = new Date(Number(parts[1]), Number(parts[2]) - 1, Number(parts[3]));
166
+ return Number.isNaN(local.getTime()) ? null : local;
167
+ }
168
+ export function usesRichDateFilter(editorType) {
169
+ if (!editorType)
170
+ return false;
171
+ if (String(editorType).endsWith("-native"))
172
+ return false;
173
+ const base = baseEditor(editorType);
174
+ return base === "date" || base === "datetime" || base === "time";
175
+ }
176
+ export function getCellEditorInputType(editorType) {
177
+ if (baseEditor(editorType) === "number")
178
+ return "text";
179
+ return getEditorInputType(editorType);
180
+ }
181
+ /**
182
+ * Is `value` something the user could still be typing towards a number?
183
+ *
184
+ * Deliberately permissive about INTERMEDIATE states - `''`, `'-'`, `'12.'` and
185
+ * `'1e'` all pass, because rejecting them is the exact bug this replaces. It
186
+ * only rejects text that can never become a number, which is the guarantee
187
+ * `type="number"` used to give.
188
+ */
189
+ export function isNumericEditorInput(value) {
190
+ return /^-?(\d*\.?\d*)(e-?\d*)?$/i.test(value);
191
+ }
109
192
  /** Resolve a stored value to an array form (for list/chips multi-select). */
110
193
  export function toValueArray(value) {
111
194
  if (value == null || value === "")