@svgrid/grid 3.0.3 → 3.0.5

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 (325) hide show
  1. package/README.md +6 -5
  2. package/dist/GridMenus.svelte +44 -2
  3. package/dist/SvChartMenu.svelte +69 -0
  4. package/dist/SvChartMenu.svelte.d.ts +11 -0
  5. package/dist/SvChartPanes.svelte +113 -0
  6. package/dist/SvChartPanes.svelte.d.ts +20 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +122 -41
  8. package/dist/SvGrid.controller.svelte.js +846 -207
  9. package/dist/SvGrid.css +178 -2
  10. package/dist/SvGrid.svelte +717 -720
  11. package/dist/SvGrid.types.d.ts +566 -12
  12. package/dist/SvGridCellEditor.svelte +17 -0
  13. package/dist/SvGridChart.svelte +2257 -329
  14. package/dist/SvGridChart.svelte.d.ts +6 -106
  15. package/dist/SvGridChart.types.d.ts +338 -0
  16. package/dist/SvGridChart.types.js +1 -0
  17. package/dist/SvGridChartBuilder.svelte +323 -0
  18. package/dist/SvGridChartBuilder.svelte.d.ts +34 -0
  19. package/dist/SvGridChartPanel.svelte +221 -275
  20. package/dist/SvGridChartPickers.svelte +417 -0
  21. package/dist/SvGridChartPickers.svelte.d.ts +70 -0
  22. package/dist/SvGridChartView.svelte +13 -14
  23. package/dist/SvModal.svelte +7 -1
  24. package/dist/SvModal.svelte.d.ts +5 -0
  25. package/dist/ai.d.ts +40 -8
  26. package/dist/ai.js +135 -24
  27. package/dist/aria.d.ts +11 -0
  28. package/dist/build-api.js +119 -28
  29. package/dist/cdn/GridMenus-CID62rlI.js +636 -0
  30. package/dist/cdn/GridMenus-DLL-qZeu.js +635 -0
  31. package/dist/cdn/SvChartMenu-Bl6PBbkT.js +58 -0
  32. package/dist/cdn/SvChartMenu-FBSMINA6.js +59 -0
  33. package/dist/cdn/{SvDateRangeInput-DMLKmGEc.js → SvDateRangeInput-BeU_TkbQ.js} +15 -14
  34. package/dist/cdn/{SvDateRangeInput-CaOuMs8O.js → SvDateRangeInput-yX8vzleW.js} +38 -37
  35. package/dist/cdn/{SvDateTimePicker-sonaH0oh.js → SvDateTimePicker-DQwt4UAs.js} +139 -180
  36. package/dist/cdn/SvDateTimePicker-vNU6bZ-q.js +775 -0
  37. package/dist/cdn/{SvGridCellEditor-CjEJMJKc.js → SvGridCellEditor-B1p-vCK5.js} +188 -178
  38. package/dist/cdn/{SvGridCellEditor-BWnTi2N7.js → SvGridCellEditor-D_0q4xAu.js} +98 -88
  39. package/dist/cdn/SvGridChart-C3EWAZaM.js +3574 -0
  40. package/dist/cdn/SvGridChart-DzLkSwCH.js +3572 -0
  41. package/dist/cdn/SvGridChartBuilder-BE2T1ykB.js +783 -0
  42. package/dist/cdn/SvGridChartBuilder-CfII62sZ.js +784 -0
  43. package/dist/cdn/SvGridChartPanel-CCX5_Wgd.js +675 -0
  44. package/dist/cdn/SvGridChartPanel-xf4sWVTo.js +699 -0
  45. package/dist/cdn/SvGridChartView-CfuXmY5I.js +48 -0
  46. package/dist/cdn/SvGridChartView-DYwabQWj.js +47 -0
  47. package/dist/cdn/SvMenuList-CLN8OuIK.js +452 -0
  48. package/dist/cdn/SvMenuList-DkGhNKjf.js +451 -0
  49. package/dist/cdn/SvModal-BAE-pjZX.js +396 -0
  50. package/dist/cdn/SvModal-CIZWCcad.js +397 -0
  51. package/dist/cdn/chart-Dz7SqMXH.js +4341 -0
  52. package/dist/cdn/chart-export-BXqueeWJ.js +135 -0
  53. package/dist/cdn/chart-export-pdf-DONFUnNY.js +110 -0
  54. package/dist/cdn/chart-panel-messages-CUbf2R4i.js +1052 -0
  55. package/dist/cdn/chart-panel-messages-CmNrMdsr.js +1053 -0
  56. package/dist/cdn/chart-summary-BJW_tg_X.js +138 -0
  57. package/dist/cdn/chart-trend-CaN9mDEV.js +50 -0
  58. package/dist/cdn/chart-validate-HcOVFAfJ.js +188 -0
  59. package/dist/cdn/{column-resize-DsfNXMom.js → column-resize-DpmOLfRp.js} +3 -3
  60. package/dist/cdn/{date-format-BnnHlqGw.js → date-format-CtquV-p3.js} +583 -603
  61. package/dist/cdn/{date-format-BNii4zeD.js → date-format-D6KFzU_W.js} +347 -367
  62. package/dist/cdn/dismissable-DAHetSNk.js +44 -0
  63. package/dist/cdn/editor-contract-LXgQJAgd.js +22 -0
  64. package/dist/cdn/focus-trap-BBOQYBma.js +65 -0
  65. package/dist/cdn/{row-resize-BRcimkUT.js → row-resize-niQCp040.js} +44 -36
  66. package/dist/cdn/server-block-cache-CGoWz-87.js +237 -0
  67. package/dist/cdn/{src-D6XvA1Ij.js → src-Bklofsad.js} +10615 -10155
  68. package/dist/cdn/{src-Bugf5XlI.js → src-jcFMkBnN.js} +7111 -6651
  69. package/dist/cdn/svgrid.js +27 -15
  70. package/dist/cdn/svgrid.svelte-external.js +27 -15
  71. package/dist/cdn/validate-C7Rn_Bns.js +76 -0
  72. package/dist/chart-axes.d.ts +53 -0
  73. package/dist/chart-axes.js +351 -0
  74. package/dist/chart-cartesian.d.ts +88 -0
  75. package/dist/chart-cartesian.js +1862 -0
  76. package/dist/chart-decimate.d.ts +51 -0
  77. package/dist/chart-decimate.js +199 -0
  78. package/dist/chart-export-pdf.d.ts +47 -0
  79. package/dist/chart-export-pdf.js +187 -0
  80. package/dist/chart-export.d.ts +2 -1
  81. package/dist/chart-export.js +18 -3
  82. package/dist/chart-financial.d.ts +91 -0
  83. package/dist/chart-financial.js +175 -0
  84. package/dist/chart-flow.d.ts +10 -0
  85. package/dist/chart-flow.js +298 -0
  86. package/dist/chart-format.d.ts +18 -0
  87. package/dist/chart-format.js +65 -0
  88. package/dist/chart-grid.d.ts +8 -0
  89. package/dist/chart-grid.js +190 -0
  90. package/dist/chart-hierarchy.d.ts +17 -0
  91. package/dist/chart-hierarchy.js +146 -0
  92. package/dist/chart-indicators.d.ts +115 -0
  93. package/dist/chart-indicators.js +389 -0
  94. package/dist/chart-messages.d.ts +95 -0
  95. package/dist/chart-messages.js +92 -0
  96. package/dist/chart-motion.d.ts +16 -0
  97. package/dist/chart-motion.js +141 -0
  98. package/dist/chart-panel-messages.d.ts +265 -0
  99. package/dist/chart-panel-messages.js +285 -0
  100. package/dist/chart-pivot.d.ts +87 -0
  101. package/dist/chart-pivot.js +156 -0
  102. package/dist/chart-polar.d.ts +25 -0
  103. package/dist/chart-polar.js +700 -0
  104. package/dist/chart-samples.d.ts +16 -0
  105. package/dist/chart-samples.js +153 -0
  106. package/dist/chart-scale.d.ts +113 -0
  107. package/dist/chart-scale.js +405 -0
  108. package/dist/chart-stats.d.ts +111 -0
  109. package/dist/chart-stats.js +419 -0
  110. package/dist/chart-stream.d.ts +45 -0
  111. package/dist/chart-stream.js +91 -0
  112. package/dist/chart-summary.d.ts +27 -0
  113. package/dist/chart-summary.js +205 -0
  114. package/dist/chart-sync.svelte.d.ts +32 -0
  115. package/dist/chart-sync.svelte.js +23 -0
  116. package/dist/chart-table.d.ts +35 -0
  117. package/dist/chart-table.js +165 -0
  118. package/dist/chart-trend.d.ts +19 -0
  119. package/dist/chart-trend.js +61 -0
  120. package/dist/chart-types.d.ts +1456 -0
  121. package/dist/chart-types.js +6 -0
  122. package/dist/chart-validate.d.ts +43 -0
  123. package/dist/chart-validate.js +272 -0
  124. package/dist/chart-zoom.d.ts +40 -0
  125. package/dist/chart-zoom.js +145 -0
  126. package/dist/chart.d.ts +186 -865
  127. package/dist/chart.js +460 -2204
  128. package/dist/clipboard.d.ts +1 -0
  129. package/dist/clipboard.js +137 -18
  130. package/dist/column-resize.d.ts +3 -0
  131. package/dist/column-resize.js +4 -1
  132. package/dist/columns.js +3 -0
  133. package/dist/command-context.d.ts +19 -0
  134. package/dist/command-context.js +116 -0
  135. package/dist/core.d.ts +7 -0
  136. package/dist/core.js +36 -13
  137. package/dist/createPopoverSelect.svelte.d.ts +2 -2
  138. package/dist/editing.d.ts +2 -8
  139. package/dist/editing.js +272 -33
  140. package/dist/fill-patterns.d.ts +0 -5
  141. package/dist/fill-patterns.js +56 -2
  142. package/dist/gantt-view.svelte.d.ts +24 -0
  143. package/dist/gantt-view.svelte.js +13 -0
  144. package/dist/grid-icons.d.ts +2 -2
  145. package/dist/grid-icons.js +2 -2
  146. package/dist/grid-messages.d.ts +16 -3
  147. package/dist/grid-messages.js +10 -0
  148. package/dist/history.d.ts +83 -0
  149. package/dist/history.js +133 -0
  150. package/dist/index.d.ts +29 -10
  151. package/dist/index.js +23 -5
  152. package/dist/keyboard-handlers.js +88 -31
  153. package/dist/keyboard.d.ts +55 -0
  154. package/dist/keyboard.js +132 -0
  155. package/dist/menus.d.ts +3 -1
  156. package/dist/menus.js +7 -2
  157. package/dist/merges.d.ts +97 -0
  158. package/dist/merges.js +147 -0
  159. package/dist/row-model.d.ts +133 -0
  160. package/dist/row-model.js +16 -0
  161. package/dist/row-resize.d.ts +3 -0
  162. package/dist/row-resize.js +14 -0
  163. package/dist/scroll-sync.d.ts +1 -0
  164. package/dist/scroll-sync.js +24 -0
  165. package/dist/selection.d.ts +18 -1
  166. package/dist/selection.js +138 -18
  167. package/dist/server-block-cache.d.ts +214 -0
  168. package/dist/server-block-cache.js +531 -0
  169. package/dist/server-data-source.d.ts +240 -6
  170. package/dist/server-data-source.js +220 -20
  171. package/dist/server.d.ts +13 -0
  172. package/dist/server.js +13 -0
  173. package/dist/shortcut-registry.d.ts +145 -0
  174. package/dist/shortcut-registry.js +44 -0
  175. package/dist/svgrid-wrapper.types.d.ts +213 -22
  176. package/dist/validate.d.ts +4 -0
  177. package/dist/validate.js +21 -3
  178. package/dist/virtualization/virtualizer.js +38 -17
  179. package/package.json +11 -1
  180. package/src/GridMenus.svelte +44 -2
  181. package/src/SvChartMenu.svelte +69 -0
  182. package/src/SvChartPanes.svelte +113 -0
  183. package/src/SvChartPanes.test.ts +66 -0
  184. package/src/SvGrid.controller.svelte.ts +819 -179
  185. package/src/SvGrid.css +178 -2
  186. package/src/SvGrid.svelte +717 -720
  187. package/src/SvGrid.types.ts +564 -11
  188. package/src/SvGridCellEditor.svelte +17 -0
  189. package/src/SvGridChart.svelte +2257 -329
  190. package/src/SvGridChart.test.ts +1419 -1
  191. package/src/SvGridChart.types.ts +336 -0
  192. package/src/SvGridChartBuilder.svelte +323 -0
  193. package/src/SvGridChartPanel.svelte +221 -275
  194. package/src/SvGridChartPickers.svelte +417 -0
  195. package/src/SvGridChartView.svelte +13 -14
  196. package/src/SvModal.svelte +7 -1
  197. package/src/SvModal.test.ts +9 -0
  198. package/src/ai.test.ts +57 -2
  199. package/src/ai.ts +166 -22
  200. package/src/aria.d.ts +11 -0
  201. package/src/build-api.coverage.test.ts +184 -0
  202. package/src/build-api.ts +118 -22
  203. package/src/chart-axes.test.ts +573 -0
  204. package/src/chart-axes.ts +342 -0
  205. package/src/chart-cartesian.ts +1863 -0
  206. package/src/chart-decimate.test.ts +249 -0
  207. package/src/chart-decimate.ts +186 -0
  208. package/src/chart-export-pdf.test.ts +91 -0
  209. package/src/chart-export-pdf.ts +207 -0
  210. package/src/chart-export.test.ts +14 -0
  211. package/src/chart-export.ts +13 -3
  212. package/src/chart-financial.ts +208 -0
  213. package/src/chart-flow.ts +286 -0
  214. package/src/chart-format.ts +67 -0
  215. package/src/chart-grid.ts +179 -0
  216. package/src/chart-hierarchy.ts +135 -0
  217. package/src/chart-indicators.test.ts +443 -0
  218. package/src/chart-indicators.ts +384 -0
  219. package/src/chart-messages.test.ts +21 -0
  220. package/src/chart-messages.ts +184 -0
  221. package/src/chart-motion.test.ts +71 -0
  222. package/src/chart-motion.ts +148 -0
  223. package/src/chart-panel-messages.test.ts +29 -0
  224. package/src/chart-panel-messages.ts +550 -0
  225. package/src/chart-pivot.test.ts +54 -0
  226. package/src/chart-pivot.ts +225 -0
  227. package/src/chart-polar.ts +674 -0
  228. package/src/chart-samples.ts +106 -0
  229. package/src/chart-scale.ts +394 -0
  230. package/src/chart-series-types.test.ts +714 -0
  231. package/src/chart-stats.ts +409 -0
  232. package/src/chart-stream.test.ts +75 -0
  233. package/src/chart-stream.ts +114 -0
  234. package/src/chart-summary.test.ts +90 -0
  235. package/src/chart-summary.ts +197 -0
  236. package/src/chart-sync.svelte.ts +41 -0
  237. package/src/chart-table.test.ts +76 -0
  238. package/src/chart-table.ts +178 -0
  239. package/src/chart-trend.ts +47 -0
  240. package/src/chart-types.ts +1309 -0
  241. package/src/chart-validate.test.ts +100 -0
  242. package/src/chart-validate.ts +247 -0
  243. package/src/chart-zoom.test.ts +137 -0
  244. package/src/chart-zoom.ts +124 -0
  245. package/src/chart.coverage.test.ts +81 -0
  246. package/src/chart.test.ts +56 -3
  247. package/src/chart.ts +557 -2784
  248. package/src/clipboard.test.ts +151 -0
  249. package/src/clipboard.ts +145 -16
  250. package/src/column-resize.ts +7 -1
  251. package/src/columns.ts +2 -0
  252. package/src/command-context.test.ts +200 -0
  253. package/src/command-context.ts +137 -0
  254. package/src/core.rowmodel-cache.test.ts +51 -0
  255. package/src/core.ts +40 -12
  256. package/src/editing.test.ts +281 -3
  257. package/src/editing.ts +264 -38
  258. package/src/fill-patterns.test.ts +35 -0
  259. package/src/fill-patterns.ts +56 -2
  260. package/src/gantt-stub.test.svelte +38 -0
  261. package/src/gantt-view.svelte.ts +35 -0
  262. package/src/grid-icons.ts +2 -2
  263. package/src/grid-messages.ts +28 -3
  264. package/src/history.test.ts +196 -0
  265. package/src/history.ts +162 -0
  266. package/src/icon-seam.test.ts +5 -6
  267. package/src/index.ts +186 -12
  268. package/src/keyboard-handlers.coverage.test.ts +126 -6
  269. package/src/keyboard-handlers.ts +91 -30
  270. package/src/keyboard-shortcuts.seam.test.ts +200 -0
  271. package/src/keyboard.test.ts +124 -1
  272. package/src/keyboard.ts +142 -0
  273. package/src/menus.test.ts +26 -0
  274. package/src/menus.ts +10 -3
  275. package/src/merges.test.ts +112 -0
  276. package/src/merges.ts +168 -0
  277. package/src/pivot.grid.test.ts +40 -5
  278. package/src/row-model.ts +146 -0
  279. package/src/row-resize.test.ts +44 -0
  280. package/src/row-resize.ts +17 -0
  281. package/src/scroll-sync.test.ts +42 -1
  282. package/src/scroll-sync.ts +25 -0
  283. package/src/selection.multi-range.test.ts +34 -0
  284. package/src/selection.test.ts +33 -2
  285. package/src/selection.ts +143 -21
  286. package/src/server-block-cache.test.ts +645 -0
  287. package/src/server-block-cache.ts +677 -0
  288. package/src/server-data-source.infinite.test.ts +343 -0
  289. package/src/server-data-source.ts +450 -27
  290. package/src/server.ts +47 -0
  291. package/src/shortcut-registry.test.ts +97 -0
  292. package/src/shortcut-registry.ts +181 -0
  293. package/src/svgrid-wrapper.types.ts +184 -13
  294. package/src/svgrid.behavior.test.ts +135 -0
  295. package/src/svgrid.charting.test.ts +513 -3
  296. package/src/svgrid.context-menu.test.ts +31 -0
  297. package/src/svgrid.gantt-seam.test.ts +199 -0
  298. package/src/svgrid.new-features.wrapper.test.ts +10 -3
  299. package/src/svgrid.row-model-prop.svelte.test.ts +352 -0
  300. package/src/svgrid.row-model-seam.svelte.test.ts +289 -0
  301. package/src/svgrid.upsell-license.test.ts +7 -4
  302. package/src/validate.test.ts +29 -0
  303. package/src/validate.ts +28 -3
  304. package/src/virtualization/virtualizer.ts +39 -17
  305. package/dist/SvGroupCell.svelte +0 -141
  306. package/dist/SvGroupCell.svelte.d.ts +0 -49
  307. package/dist/SvRowGroupPanel.svelte +0 -186
  308. package/dist/SvRowGroupPanel.svelte.d.ts +0 -25
  309. package/dist/cdn/GridMenus-CHOMnW-c.js +0 -602
  310. package/dist/cdn/GridMenus-DhdPF700.js +0 -603
  311. package/dist/cdn/SvDateTimePicker-CCbDZNZB.js +0 -816
  312. package/dist/cdn/SvGridChart-1PMSp2LZ.js +0 -1481
  313. package/dist/cdn/SvGridChart-D02avhyr.js +0 -1480
  314. package/dist/cdn/SvGridChartPanel-DJnViOv4.js +0 -834
  315. package/dist/cdn/SvGridChartPanel-vPTNerFZ.js +0 -810
  316. package/dist/cdn/SvGridChartView-C--HhdUo.js +0 -56
  317. package/dist/cdn/SvGridChartView-KyyFG-wY.js +0 -55
  318. package/dist/cdn/chart-DLg3_zTQ.js +0 -1652
  319. package/dist/cdn/validate-_CDJzgIo.js +0 -75
  320. package/dist/server-group-model.d.ts +0 -98
  321. package/dist/server-group-model.js +0 -263
  322. package/src/SvGroupCell.svelte +0 -141
  323. package/src/SvRowGroupPanel.svelte +0 -186
  324. package/src/server-group-model.test.ts +0 -294
  325. package/src/server-group-model.ts +0 -370
package/dist/SvGrid.css CHANGED
@@ -463,6 +463,79 @@
463
463
  user-select: text;
464
464
  }
465
465
 
466
+ /* Rows whose data has not arrived yet (server-side / infinite loading).
467
+
468
+ The shimmer is per CELL, not per row, so the columns keep their widths
469
+ and the table does not reflow as blocks land. Widths vary a little by
470
+ column position so a screenful of them reads as text rather than as a
471
+ barcode - the same trick every skeleton screen uses. */
472
+ .sv-grid-placeholder-cell {
473
+ user-select: none;
474
+ cursor: default;
475
+ }
476
+ /* The per-cell shimmer of a placeholder row. Its own name: `.sv-grid-skeleton`
477
+ above is the full-body loading overlay, absolutely positioned under the
478
+ header, and sharing it pulled every placeholder cell's bar up there. */
479
+ .sv-grid-placeholder-skeleton {
480
+ display: inline-block;
481
+ width: 72%;
482
+ height: 9px;
483
+ border-radius: 5px;
484
+ vertical-align: middle;
485
+ background: linear-gradient(
486
+ 90deg,
487
+ color-mix(in srgb, var(--sg-fg, #0f172a) 8%, transparent) 25%,
488
+ color-mix(in srgb, var(--sg-fg, #0f172a) 3%, transparent) 50%,
489
+ color-mix(in srgb, var(--sg-fg, #0f172a) 8%, transparent) 75%
490
+ );
491
+ background-size: 200% 100%;
492
+ animation: sv-grid-skeleton-shimmer 1.2s linear infinite;
493
+ }
494
+ .sv-grid-placeholder-cell:nth-child(2n) .sv-grid-placeholder-skeleton { width: 54%; }
495
+ .sv-grid-placeholder-cell:nth-child(3n) .sv-grid-placeholder-skeleton { width: 84%; }
496
+ @keyframes sv-grid-skeleton-shimmer {
497
+ from { background-position: 200% 0; }
498
+ to { background-position: -200% 0; }
499
+ }
500
+ @media (prefers-reduced-motion: reduce) {
501
+ .sv-grid-placeholder-skeleton { animation: none; }
502
+ }
503
+
504
+ /* A block that failed to load: one message across the row, and a way out.
505
+ The cell stays a table cell so its colspan holds; the flex box is inside
506
+ it (a flex `td` stops spanning and the tint shrank to the text). Rows
507
+ that continue a failed run are the same band without the message. */
508
+ .sv-grid-placeholder-failed .sv-grid-placeholder-cell {
509
+ background: color-mix(in srgb, var(--sg-danger, #dc2626) 6%, transparent);
510
+ }
511
+ .sv-grid-placeholder-failed-body {
512
+ display: flex;
513
+ align-items: center;
514
+ gap: 10px;
515
+ min-height: 100%;
516
+ padding-left: var(--sg-cell-px, 7px);
517
+ }
518
+ .sv-grid-placeholder-failed-cont .sv-grid-placeholder-cell {
519
+ border-top-color: transparent;
520
+ }
521
+ .sv-grid-placeholder-error {
522
+ color: var(--sg-danger, #dc2626);
523
+ font-size: 13px;
524
+ }
525
+ .sv-grid-placeholder-retry {
526
+ background: none;
527
+ border: 1px solid var(--sg-border, #e2e8f0);
528
+ border-radius: var(--sg-radius, 6px);
529
+ padding: 2px 10px;
530
+ font: inherit;
531
+ font-size: 12px;
532
+ color: var(--sg-fg, #0f172a);
533
+ cursor: pointer;
534
+ }
535
+ .sv-grid-placeholder-retry:hover {
536
+ background: color-mix(in srgb, var(--sg-fg, #0f172a) 6%, transparent);
537
+ }
538
+
466
539
  /* Pinned columns read as "frozen" via three layered cues:
467
540
  1. A distinct fill (slightly stronger than the header) so the
468
541
  pinned strip is visible even before you scroll. Themes with a
@@ -873,7 +946,7 @@
873
946
  `--sg-thead-h` pixels of the scroll container. `scrollIntoView`
874
947
  and friends use this to avoid scrolling a row underneath the
875
948
  sticky header - critical for Excel-style keyboard nav. */
876
- scroll-padding-top: var(--sg-thead-h, 36px);
949
+ scroll-padding-top: calc(var(--sg-thead-h, 36px) + var(--sg-frozen-h, 0px));
877
950
  }
878
951
 
879
952
  .sv-grid-container.sv-grid-container-custom-scrollbars {
@@ -1446,6 +1519,24 @@ select.sv-grid-fr-editor {
1446
1519
  padding: 0;
1447
1520
  }
1448
1521
 
1522
+ /* ---- Collapsed columns and rows -------------------------------------------
1523
+ A column folded away by `api.setColumnCollapsed` is laid out at 0px (its
1524
+ width resolves to 0), and here it stops painting: no padding to push the
1525
+ box open, nothing visible, so its neighbours' borders meet at the seam the
1526
+ way they do in a sheet with a hidden column. A collapsed row leaves the
1527
+ flow entirely; a table row can, a table cell cannot. */
1528
+ .sv-grid-column.sv-grid-column-collapsed,
1529
+ .sv-grid-cell.sv-grid-cell-collapsed {
1530
+ padding: 0;
1531
+ border-left-width: 0;
1532
+ border-right-width: 0;
1533
+ overflow: hidden;
1534
+ visibility: hidden;
1535
+ }
1536
+ .sv-grid-row.sv-grid-row-collapsed {
1537
+ display: none;
1538
+ }
1539
+
1449
1540
  /* The four CSS variables let us compose a single box-shadow that draws the
1450
1541
  selection rectangle outline only on the cells that sit on its edges. */
1451
1542
  .sv-grid-cell[data-selected-range="true"] {
@@ -1514,6 +1605,36 @@ select.sv-grid-fr-editor {
1514
1605
  color: inherit;
1515
1606
  padding: 0 8px;
1516
1607
  }
1608
+ /* Frozen rows (`frozenRows`): the grid's own rows, stuck under the header.
1609
+ Each carries its own `top`, set inline from the heights of the frozen rows
1610
+ above it. Below the header in the stacking order, above the body's rows,
1611
+ with the row's own background so the rows scrolling under it do not show
1612
+ through. */
1613
+ .sv-grid-row.sv-grid-row-frozen {
1614
+ position: sticky;
1615
+ /* Above the body rows' pinned cells (z 30) and row numbers (z 4), which
1616
+ scroll under the band; below the header (z 35) and the scrollbars. */
1617
+ z-index: 31;
1618
+ background: var(--sg-bg, #fff);
1619
+ }
1620
+ .sv-grid-row.sv-grid-row-frozen > .sv-grid-cell {
1621
+ background: var(--sg-bg, #fff);
1622
+ }
1623
+ /* The band's lower edge, so the frozen rows read as a pane. */
1624
+ .sv-grid-row.sv-grid-row-frozen-last > .sv-grid-cell {
1625
+ border-bottom: 1px solid var(--sg-frozen-edge, var(--sg-border, #94a3b8));
1626
+ }
1627
+
1628
+ /* The multiline text editor sizes itself by its lines and keeps the
1629
+ input's single-line look until a break is typed. */
1630
+ .sv-grid-cell-editor-multiline {
1631
+ height: auto;
1632
+ min-height: 100%;
1633
+ resize: none;
1634
+ overflow: hidden;
1635
+ white-space: pre-wrap;
1636
+ line-height: inherit;
1637
+ }
1517
1638
 
1518
1639
  /* Base look for the filter inputs (header filter row, per-column filter, the
1519
1640
  global search box, and the menu's search / condition inputs). The inline cell
@@ -2113,6 +2234,21 @@ select.sv-grid-fr-editor {
2113
2234
  .sv-grid-context-menu {
2114
2235
  min-width: 180px;
2115
2236
  }
2237
+ /* The icon gutter of a context-menu item: 16px, in the text colour, so a
2238
+ consumer's own glyphs (a spreadsheet's Cut / Copy / Paste) read as one
2239
+ set with the label. Empty on items without an icon, keeping the labels
2240
+ in one column. */
2241
+ .sv-grid-menu-icon {
2242
+ display: inline-flex;
2243
+ flex: none;
2244
+ width: 16px;
2245
+ height: 16px;
2246
+ align-items: center;
2247
+ justify-content: center;
2248
+ }
2249
+ .sv-grid-menu-icon > svg {
2250
+ display: block;
2251
+ }
2116
2252
 
2117
2253
  .sv-grid-comment-editor {
2118
2254
  width: 240px;
@@ -3107,6 +3243,18 @@ select.sv-grid-fr-editor {
3107
3243
  .sv-grid-chart-actions { display: inline-flex; align-items: center; gap: 6px; }
3108
3244
  .sv-grid-chart-controls { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
3109
3245
  .sv-grid-chart-controls:empty { display: none; }
3246
+ /* The same pickers on the builder's Data tab, as a labelled form: one control
3247
+ per row, the label in the builder's 110px column. */
3248
+ .sv-grid-chart-controls.is-form { flex-direction: column; align-items: stretch; gap: 8px; }
3249
+ .sv-grid-chart-controls.is-form .sv-grid-chart-ctl,
3250
+ .sv-grid-chart-controls.is-form .sv-grid-chart-toggle {
3251
+ display: grid; grid-template-columns: 110px 1fr; align-items: center; gap: 8px; font-weight: 400; font-size: 12px;
3252
+ }
3253
+ .sv-grid-chart-controls.is-form .sv-grid-chart-toggle { grid-template-columns: 110px auto; justify-content: start; }
3254
+ .sv-grid-chart-controls.is-form .sv-grid-chart-toggle > input { order: 1; justify-self: start; }
3255
+ .sv-grid-chart-controls.is-form .sv-grid-chart-ctl-lbl { font-size: 12px; font-weight: 400; }
3256
+ .sv-grid-chart-controls.is-form .sv-grid-chart-indicators { flex-basis: auto; }
3257
+ .sv-grid-chart-controls.is-form .sv-grid-chart-hint { flex-basis: auto; }
3110
3258
  /* Says why the chosen chart type cannot draw yet - a missing Split by, too few
3111
3259
  groups. The picker deliberately does NOT hide such a type: options that come
3112
3260
  and go as the user filters are worse than one sentence of explanation. */
@@ -3118,12 +3266,14 @@ select.sv-grid-fr-editor {
3118
3266
  color: var(--sg-muted, #64748b);
3119
3267
  }
3120
3268
  .sv-grid-chart-ctl { display: flex; flex-direction: column; gap: 2px; font-size: 11px; font-weight: 600; color: var(--sg-muted, #64748b); }
3121
- .sv-grid-chart-ctl select {
3269
+ .sv-grid-chart-ctl select,
3270
+ .sv-grid-chart-ctl .sv-grid-chart-num {
3122
3271
  font: inherit; font-size: 12.5px; font-weight: 400; color: var(--sg-fg, #0f172a);
3123
3272
  background: var(--sg-input-bg, var(--sg-bg, #fff));
3124
3273
  border: 1px solid var(--sg-input-border, var(--sg-border, #e2e8f0));
3125
3274
  border-radius: var(--sg-radius, 6px); padding: 4px 8px;
3126
3275
  }
3276
+ .sv-grid-chart-ctl .sv-grid-chart-num { width: 64px; }
3127
3277
  .sv-grid-chart-toggle {
3128
3278
  display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600;
3129
3279
  color: var(--sg-muted, #64748b); cursor: pointer; white-space: nowrap;
@@ -3148,6 +3298,18 @@ select.sv-grid-fr-editor {
3148
3298
  display: flex; align-items: stretch; justify-content: center;
3149
3299
  }
3150
3300
  .sv-grid-chart-panel-body > .sv-grid-chart { width: 100%; justify-content: center; }
3301
+ .sv-grid-chart-panes-host { width: 100%; height: 100%; overflow: auto; }
3302
+ .sv-grid-chart-build-btn { display: inline-flex; align-items: center; gap: 4px; }
3303
+ .sv-grid-chart-link-btn.is-unlinked { color: #b45309; border-color: color-mix(in srgb, #b45309 40%, transparent 60%); }
3304
+ /* Indicator chips on a price chart */
3305
+ .sv-grid-chart-indicators { flex-basis: 100%; }
3306
+ .sv-grid-chart-chips { display: flex; flex-wrap: wrap; gap: 3px; }
3307
+ .sv-grid-chart-chip {
3308
+ font: inherit; font-size: 11px; line-height: 1; padding: 3px 7px;
3309
+ border: 1px solid var(--sg-border, #e2e8f0); border-radius: 999px;
3310
+ background: var(--sg-bg, #fff); color: var(--sg-fg, #0f172a); cursor: pointer;
3311
+ }
3312
+ .sv-grid-chart-chip.is-on { background: var(--sg-accent, #2563eb); border-color: var(--sg-accent, #2563eb); color: #fff; }
3151
3313
  .sv-grid-chart-empty { margin: 0; font-size: 13px; color: var(--sg-muted, #64748b); text-align: center; max-width: 42ch; }
3152
3314
  /* Export menu */
3153
3315
  .sv-grid-chart-export { position: relative; display: inline-flex; }
@@ -3163,6 +3325,20 @@ select.sv-grid-fr-editor {
3163
3325
  }
3164
3326
  .sv-grid-chart-export-menu button:hover:not(:disabled) { background: var(--sg-hover-bg, color-mix(in srgb, var(--sg-accent, #2563eb) 10%, transparent)); }
3165
3327
  .sv-grid-chart-export-menu button:disabled { opacity: 0.45; cursor: default; }
3328
+ /* Saved charts: name the active tab, apply or remove a saved one */
3329
+ .sv-grid-chart-saved-menu { min-width: 220px; gap: 4px; }
3330
+ .sv-grid-chart-saved-row { display: flex; gap: 4px; padding: 2px; }
3331
+ .sv-grid-chart-saved-name {
3332
+ flex: 1; min-width: 0; font: inherit; font-size: 12.5px; color: var(--sg-fg, #0f172a);
3333
+ background: var(--sg-input-bg, var(--sg-bg, #fff)); border: 1px solid var(--sg-input-border, var(--sg-border, #e2e8f0));
3334
+ border-radius: var(--sg-radius, 6px); padding: 4px 8px;
3335
+ }
3336
+ .sv-grid-chart-saved-name:focus { outline: none; border-color: var(--sg-accent, #2563eb); }
3337
+ .sv-grid-chart-saved-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
3338
+ .sv-grid-chart-saved-item { display: flex; align-items: center; }
3339
+ .sv-grid-chart-saved-item .sv-grid-chart-saved-apply { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
3340
+ .sv-grid-chart-saved-item .sv-grid-chart-saved-x { flex: none; padding: 4px 8px; color: var(--sg-muted, #64748b); }
3341
+ .sv-grid-chart-saved-empty { margin: 0; padding: 4px 8px; font-size: 12px; color: var(--sg-muted, #64748b); }
3166
3342
  /* AI "chart this" */
3167
3343
  .sv-grid-chart-ai-btn { display: inline-flex; align-items: center; gap: 4px; }
3168
3344
  .sv-grid-chart-ai-btn.is-active { border-color: var(--sg-accent, #2563eb); color: var(--sg-accent, #2563eb); }