@svgrid/grid 3.0.4 → 3.0.6

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 (176) hide show
  1. package/README.md +32 -11
  2. package/dist/GridMenus.svelte +34 -4
  3. package/dist/SvGrid.controller.svelte.d.ts +33 -5
  4. package/dist/SvGrid.controller.svelte.js +397 -58
  5. package/dist/SvGrid.css +200 -2
  6. package/dist/SvGrid.svelte +350 -40
  7. package/dist/SvGrid.types.d.ts +433 -7
  8. package/dist/SvGridDropdown.svelte +20 -0
  9. package/dist/SvGridDropdown.svelte.d.ts +12 -0
  10. package/dist/SvModal.svelte +22 -0
  11. package/dist/SvModal.svelte.d.ts +7 -0
  12. package/dist/a11y/dismissable.d.ts +10 -0
  13. package/dist/a11y/dismissable.js +24 -2
  14. package/dist/build-api.js +92 -37
  15. package/dist/cdn/{GridMenus-BL7ZgQvU.js → GridMenus-C-NtjlrJ.js} +155 -146
  16. package/dist/cdn/GridMenus-TssHej3q.js +644 -0
  17. package/dist/cdn/{SvChartMenu-FBSMINA6.js → SvChartMenu-BFSTpvB-.js} +1 -1
  18. package/dist/cdn/{SvChartMenu-Bl6PBbkT.js → SvChartMenu-BZ1Iwv0y.js} +1 -1
  19. package/dist/cdn/{SvDateTimePicker-DQwt4UAs.js → SvDateTimePicker-D9u_cOf8.js} +1 -1
  20. package/dist/cdn/{SvDateTimePicker-vNU6bZ-q.js → SvDateTimePicker-s_6IUpI7.js} +1 -1
  21. package/dist/cdn/{SvGridCellEditor-B1p-vCK5.js → SvGridCellEditor-BlyCSp0q.js} +1 -1
  22. package/dist/cdn/{SvGridCellEditor-D_0q4xAu.js → SvGridCellEditor-ClRRA9lW.js} +1 -1
  23. package/dist/cdn/{SvGridChart-DzLkSwCH.js → SvGridChart-B4EV8U6t.js} +4 -4
  24. package/dist/cdn/{SvGridChart-C3EWAZaM.js → SvGridChart-DsmwTyZF.js} +4 -4
  25. package/dist/cdn/{SvGridChartBuilder-CfII62sZ.js → SvGridChartBuilder-cHloHobN.js} +4 -4
  26. package/dist/cdn/{SvGridChartBuilder-BE2T1ykB.js → SvGridChartBuilder-vOl7C0Za.js} +4 -4
  27. package/dist/cdn/{SvGridChartPanel-xf4sWVTo.js → SvGridChartPanel-AcqF-Ll5.js} +5 -5
  28. package/dist/cdn/{SvGridChartPanel-CCX5_Wgd.js → SvGridChartPanel-biMtSBPA.js} +5 -5
  29. package/dist/cdn/{SvGridChartView-DYwabQWj.js → SvGridChartView-Dx_GmZuL.js} +2 -2
  30. package/dist/cdn/{SvGridChartView-CfuXmY5I.js → SvGridChartView-I3rDHXAq.js} +2 -2
  31. package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-BWeM3lMe.js} +46 -46
  32. package/dist/cdn/{SvGridDropdown-D13MtJ2j.js → SvGridDropdown-CJ6QqTxu.js} +67 -67
  33. package/dist/cdn/{SvModal-CIZWCcad.js → SvModal-ClxGmpAc.js} +187 -186
  34. package/dist/cdn/{SvModal-BAE-pjZX.js → SvModal-DhB_VMFR.js} +148 -147
  35. package/dist/cdn/{cell-formatting-C2Hf5gqd.js → cell-formatting-DVVKOSI9.js} +1 -1
  36. package/dist/cdn/{chart-Dz7SqMXH.js → chart-DEZxwC0i.js} +1 -1
  37. package/dist/cdn/{chart-panel-messages-CUbf2R4i.js → chart-panel-messages-D12XcTZJ.js} +1 -1
  38. package/dist/cdn/{chart-panel-messages-CmNrMdsr.js → chart-panel-messages-DguS7gC5.js} +1 -1
  39. package/dist/cdn/{chart-summary-BJW_tg_X.js → chart-summary-CMAXBGY-.js} +1 -1
  40. package/dist/cdn/{chart-trend-CaN9mDEV.js → chart-trend-BkEp61Gj.js} +1 -1
  41. package/dist/cdn/{dismissable-DAHetSNk.js → dismissable-Brc4EZU1.js} +5 -1
  42. package/dist/cdn/{export-format-CUDLy2yn.js → export-format-YzdwBww2.js} +1 -1
  43. package/dist/cdn/{row-resize-niQCp040.js → row-resize-DtOS1KG6.js} +41 -32
  44. package/dist/cdn/server-block-cache-DIqb3VZn.js +241 -0
  45. package/dist/cdn/{src-V1uu8iE9.js → src-CgoeSM8k.js} +5339 -4753
  46. package/dist/cdn/{src-BKhZ6eXd.js → src-DfwxB1TH.js} +9817 -9231
  47. package/dist/cdn/svgrid.js +28 -27
  48. package/dist/cdn/svgrid.svelte-external.js +28 -27
  49. package/dist/cdn/validate-AZoD8BoR.js +80 -0
  50. package/dist/cell-formatting.js +18 -1
  51. package/dist/cell-render.js +25 -6
  52. package/dist/clipboard.d.ts +2 -2
  53. package/dist/clipboard.js +72 -23
  54. package/dist/columns.js +7 -2
  55. package/dist/conditional-formatting.d.ts +2 -0
  56. package/dist/conditional-formatting.js +2 -0
  57. package/dist/core.d.ts +22 -6
  58. package/dist/core.js +401 -38
  59. package/dist/editing.js +34 -0
  60. package/dist/gantt-view.svelte.d.ts +24 -0
  61. package/dist/gantt-view.svelte.js +13 -0
  62. package/dist/grid-icons.d.ts +2 -2
  63. package/dist/grid-icons.js +2 -2
  64. package/dist/grid-messages.d.ts +10 -0
  65. package/dist/grid-messages.js +9 -0
  66. package/dist/headless.d.ts +5 -0
  67. package/dist/headless.js +12 -0
  68. package/dist/history.d.ts +21 -0
  69. package/dist/history.js +34 -4
  70. package/dist/index.d.ts +5 -4
  71. package/dist/index.js +3 -3
  72. package/dist/keyboard-handlers.js +24 -1
  73. package/dist/keyboard.js +4 -0
  74. package/dist/row-drag-touch.d.ts +1 -1
  75. package/dist/row-drag.js +35 -1
  76. package/dist/row-model.d.ts +139 -0
  77. package/dist/row-model.js +16 -0
  78. package/dist/row-resize.js +22 -1
  79. package/dist/selection.d.ts +2 -1
  80. package/dist/selection.js +31 -3
  81. package/dist/server-block-cache.d.ts +219 -0
  82. package/dist/server-block-cache.js +539 -0
  83. package/dist/server-data-source.d.ts +274 -8
  84. package/dist/server-data-source.js +229 -20
  85. package/dist/server.d.ts +13 -0
  86. package/dist/server.js +13 -0
  87. package/dist/sparkline.js +7 -5
  88. package/dist/svgrid-wrapper.types.d.ts +33 -0
  89. package/dist/validate.d.ts +4 -0
  90. package/dist/validate.js +29 -3
  91. package/package.json +11 -1
  92. package/src/GridMenus.svelte +34 -4
  93. package/src/SvGrid.controller.svelte.ts +397 -61
  94. package/src/SvGrid.css +200 -2
  95. package/src/SvGrid.svelte +350 -40
  96. package/src/SvGrid.types.ts +453 -7
  97. package/src/SvGridDropdown.svelte +20 -0
  98. package/src/SvModal.svelte +22 -0
  99. package/src/SvModal.test.ts +30 -1
  100. package/src/a11y/dismissable.test.ts +10 -1
  101. package/src/a11y/dismissable.ts +22 -2
  102. package/src/build-api.ts +96 -31
  103. package/src/cell-formatting.test.ts +17 -0
  104. package/src/cell-formatting.ts +18 -1
  105. package/src/cell-render.test.ts +24 -2
  106. package/src/cell-render.ts +24 -8
  107. package/src/clipboard.test.ts +107 -0
  108. package/src/clipboard.ts +62 -23
  109. package/src/columns.test.ts +4 -4
  110. package/src/columns.ts +7 -2
  111. package/src/conditional-formatting.test.ts +8 -0
  112. package/src/conditional-formatting.ts +3 -0
  113. package/src/core.rowmodel-cache.test.ts +51 -0
  114. package/src/core.tick-repair.test.ts +287 -0
  115. package/src/core.ts +407 -38
  116. package/src/editing.test.ts +52 -0
  117. package/src/editing.ts +33 -0
  118. package/src/gantt-stub.test.svelte +38 -0
  119. package/src/gantt-view.svelte.ts +35 -0
  120. package/src/grid-icons.ts +2 -2
  121. package/src/grid-messages.test.ts +7 -0
  122. package/src/grid-messages.ts +22 -0
  123. package/src/headless.ts +24 -0
  124. package/src/history.test.ts +49 -1
  125. package/src/history.ts +48 -2
  126. package/src/icon-seam.test.ts +2 -4
  127. package/src/index.ts +38 -10
  128. package/src/keyboard-handlers.coverage.test.ts +65 -0
  129. package/src/keyboard-handlers.ts +26 -1
  130. package/src/keyboard.ts +3 -0
  131. package/src/row-drag-touch.ts +2 -2
  132. package/src/row-drag.test.ts +51 -0
  133. package/src/row-drag.ts +35 -2
  134. package/src/row-model.ts +152 -0
  135. package/src/row-resize.ts +24 -1
  136. package/src/selection.test.ts +3 -0
  137. package/src/selection.ts +33 -3
  138. package/src/server-block-cache.test.ts +672 -0
  139. package/src/server-block-cache.ts +690 -0
  140. package/src/server-data-source.infinite.test.ts +405 -0
  141. package/src/server-data-source.test.ts +19 -0
  142. package/src/server-data-source.ts +496 -29
  143. package/src/server.ts +49 -0
  144. package/src/sparkline.test.ts +7 -0
  145. package/src/sparkline.ts +6 -4
  146. package/src/svgrid-wrapper.types.ts +32 -0
  147. package/src/svgrid.api.test.ts +21 -0
  148. package/src/svgrid.charting.test.ts +12 -4
  149. package/src/svgrid.context-menu.test.ts +12 -0
  150. package/src/svgrid.detail-rows.svelte.test.ts +187 -0
  151. package/src/svgrid.filter-menu-scroll.test.ts +9 -0
  152. package/src/svgrid.gantt-seam.test.ts +199 -0
  153. package/src/svgrid.live-update-paths.svelte.test.ts +184 -0
  154. package/src/svgrid.menu-scroll-close.test.ts +10 -0
  155. package/src/svgrid.row-model-prop.svelte.test.ts +352 -0
  156. package/src/svgrid.row-model-seam.svelte.test.ts +305 -0
  157. package/src/svgrid.row-pinning.test.ts +15 -1
  158. package/src/svgrid.selection-bar-seam.test.ts +1 -1
  159. package/src/svgrid.sticky-groups.svelte.test.ts +145 -0
  160. package/src/svgrid.upsell-license.test.ts +8 -5
  161. package/src/test-setup.ts +12 -0
  162. package/src/transaction.test.ts +58 -0
  163. package/src/validate.test.ts +29 -0
  164. package/src/validate.ts +34 -3
  165. package/dist/SvGroupCell.svelte +0 -141
  166. package/dist/SvGroupCell.svelte.d.ts +0 -49
  167. package/dist/SvRowGroupPanel.svelte +0 -186
  168. package/dist/SvRowGroupPanel.svelte.d.ts +0 -25
  169. package/dist/cdn/GridMenus-7kbpnnBW.js +0 -635
  170. package/dist/cdn/validate-_CDJzgIo.js +0 -75
  171. package/dist/server-group-model.d.ts +0 -98
  172. package/dist/server-group-model.js +0 -263
  173. package/src/SvGroupCell.svelte +0 -141
  174. package/src/SvRowGroupPanel.svelte +0 -186
  175. package/src/server-group-model.test.ts +0 -294
  176. package/src/server-group-model.ts +0 -370
package/dist/SvGrid.css CHANGED
@@ -463,6 +463,83 @@
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
+ .sv-grid-placeholder-retry:focus-visible {
539
+ outline: 2px solid var(--sg-accent, #2563eb);
540
+ outline-offset: 2px;
541
+ }
542
+
466
543
  /* Pinned columns read as "frozen" via three layered cues:
467
544
  1. A distinct fill (slightly stronger than the header) so the
468
545
  pinned strip is visible even before you scroll. Themes with a
@@ -740,6 +817,12 @@
740
817
  .sv-grid-row-drop-after > td {
741
818
  box-shadow: inset 0 -2px 0 0 var(--sg-accent, #6366f1);
742
819
  }
820
+ /* Landing inside a group or tree row (the row becomes its child): the
821
+ * whole row is the target, so it takes a tint and a ring rather than a line. */
822
+ .sv-grid-row-drop-into > td {
823
+ box-shadow: inset 0 2px 0 0 var(--sg-accent, #6366f1), inset 0 -2px 0 0 var(--sg-accent, #6366f1);
824
+ background: color-mix(in srgb, var(--sg-accent, #6366f1) 10%, transparent);
825
+ }
743
826
 
744
827
  /* Pinned rows (top / bottom). Each cell sticks individually so the
745
828
  * row tracks scroll on every browser. Top rows stick below the sticky
@@ -764,6 +847,27 @@
764
847
  .sv-grid-pinned-row-bottom[data-pinned-index="1"] td { bottom: var(--sg-pinned-row-h, 32px); }
765
848
  .sv-grid-pinned-row-bottom[data-pinned-index="2"] td { bottom: calc(var(--sg-pinned-row-h, 32px) * 2); }
766
849
  .sv-grid-pinned-row-bottom[data-pinned-index="3"] td { bottom: calc(var(--sg-pinned-row-h, 32px) * 3); }
850
+ /* While the selection bar is up the scroller carries bottom padding (see
851
+ --sg-selbar-reserve), and a sticky bottom edge is inset by that padding:
852
+ the lowest pinned row then holds 68px above the viewport's edge, with the
853
+ body rows scrolling through the strip beneath it, in and out from behind
854
+ the bar. That strip is meant to be the bar's own ground, so the lowest
855
+ pinned row paints it: a shadow in the body colour, spread by half the
856
+ reserve and pushed down by the same, fills the strip under each cell; the
857
+ clip cuts the spread's sideways spill at the cell's own edges so a later
858
+ cell's shadow never paints over its neighbour. The cells sit at z-index 4,
859
+ above the rows and under the floating bar. */
860
+ .sv-grid-root[data-selbar$='bottom'] .sv-grid-pinned-row-bottom[data-pinned-index="0"] td {
861
+ box-shadow: 0 calc(var(--sg-selbar-reserve) / 2) 0 calc(var(--sg-selbar-reserve) / 2) var(--sg-bg, #fff);
862
+ clip-path: inset(0 0 calc(-1 * var(--sg-selbar-reserve)) 0);
863
+ }
864
+ /* The same strip above a sticky header when the bar sits at the top: the
865
+ header holds under the reserve and rows scrolled up showed through above
866
+ it. The first header row's cells paint the strip the same way. */
867
+ .sv-grid-root[data-selbar$='top'] .sv-grid-head > tr:first-child > th {
868
+ box-shadow: 0 calc(-1 * var(--sg-selbar-reserve) / 2) 0 calc(var(--sg-selbar-reserve) / 2) var(--sg-bg, #fff);
869
+ clip-path: inset(calc(-1 * var(--sg-selbar-reserve)) 0 0 0);
870
+ }
767
871
  /* Sticky-left columns keep their left position; just override their
768
872
  * z so they sit above non-pinned pinned-row cells. */
769
873
  .sv-grid-pinned-row td[data-pinned] { z-index: 5; }
@@ -945,13 +1049,58 @@
945
1049
  z-index: 4;
946
1050
  }
947
1051
 
948
- /* Row-number column: sticks to the left edge of the scroll viewport. */
1052
+ /* Detail-toggle column (`showDetailToggle`): a row-header gutter of chevrons
1053
+ that open and close detail rows. Sticky beside the row numbers and the
1054
+ selection column, on the header band's colour so it reads as chrome, not
1055
+ data; no menu, no resize handle, outside the active cell. */
1056
+ .sv-grid-detail-toggle-column,
1057
+ .sv-grid-detail-toggle-cell {
1058
+ text-align: center;
1059
+ padding: 0;
1060
+ position: sticky;
1061
+ z-index: 4;
1062
+ background: var(--sg-header-bg, #f5f7fb);
1063
+ vertical-align: middle;
1064
+ }
1065
+ .sv-grid-detail-toggle {
1066
+ display: inline-flex;
1067
+ align-items: center;
1068
+ justify-content: center;
1069
+ width: 24px;
1070
+ height: 24px;
1071
+ padding: 0;
1072
+ border: 0;
1073
+ border-radius: 5px;
1074
+ background: transparent;
1075
+ color: var(--sg-muted, #64748b);
1076
+ cursor: pointer;
1077
+ vertical-align: middle;
1078
+ }
1079
+ .sv-grid-detail-toggle:hover {
1080
+ background: color-mix(in srgb, var(--sg-accent, #2563eb) 12%, transparent);
1081
+ color: var(--sg-accent, #2563eb);
1082
+ }
1083
+ .sv-grid-detail-toggle:focus-visible {
1084
+ outline: 2px solid var(--sg-accent, #2563eb);
1085
+ outline-offset: 1px;
1086
+ }
1087
+ .sv-grid-detail-toggle > .sv-grid-icon {
1088
+ width: 12px;
1089
+ height: 12px;
1090
+ transition: transform 0.15s ease;
1091
+ }
1092
+ .sv-grid-detail-toggle[aria-expanded="true"] > .sv-grid-icon {
1093
+ transform: rotate(90deg);
1094
+ }
1095
+
1096
+ /* Row-number column: sticks to the inline-start edge of the scroll viewport,
1097
+ which is the right edge under `dir="rtl"`. */
949
1098
  .sv-grid-row-number-column,
950
1099
  .sv-grid-row-number-cell {
951
1100
  text-align: right;
952
1101
  padding-inline: 8px;
953
1102
  position: sticky;
954
- left: 0;
1103
+ inset-inline-start: 0;
955
1104
  z-index: 4;
956
1105
  /* Match the column-header band so the row-number gutter and the column
957
1106
  headers form one continuous header chrome. */
@@ -1254,6 +1403,15 @@ select.sv-grid-fr-editor {
1254
1403
  overflow: hidden so the chips picker would otherwise be clipped). */
1255
1404
  overflow: visible;
1256
1405
  }
1406
+ /* The active cell a grid mounts with is seeded at (0,0), not chosen: no
1407
+ ring until a click, an arrow key or the api activates a cell (the same
1408
+ gate the fill handle has always had). Once activated it stays through a
1409
+ blur, so a toolbar acting on "the focused row" keeps its cue. A page with
1410
+ six grids on it, or a detail grid inside each open row, used to open
1411
+ with an accent ring in every one of them. */
1412
+ .sv-grid-active-seeded .sv-grid-cell-active {
1413
+ box-shadow: none;
1414
+ }
1257
1415
 
1258
1416
  /* ---- The editing cell's border -------------------------------------------
1259
1417
  One ring for every editor, drawn by the CELL rather than by each editor.
@@ -1552,6 +1710,40 @@ select.sv-grid-fr-editor {
1552
1710
  border-bottom: 1px solid var(--sg-frozen-edge, var(--sg-border, #94a3b8));
1553
1711
  }
1554
1712
 
1713
+ /* A detail row with a declared height (detailRowHeight): the row keeps the
1714
+ height the virtualizer counted on - the auto-height rule above must not
1715
+ win - and the panel's body, a block inside the cell, takes that height
1716
+ and scrolls what does not fit. (A table cell's own height is only a
1717
+ minimum, so the height goes on the block.) */
1718
+ .sv-grid-row.sv-grid-detail-row.sv-grid-detail-row-sized {
1719
+ height: var(--sv-detail-h) !important;
1720
+ }
1721
+ .sv-grid-row.sv-grid-detail-row-sized > .sv-grid-detail-cell {
1722
+ vertical-align: top;
1723
+ box-sizing: border-box;
1724
+ height: var(--sv-detail-h);
1725
+ }
1726
+ .sv-grid-detail-body {
1727
+ box-sizing: border-box;
1728
+ height: 100%;
1729
+ overflow: auto;
1730
+ }
1731
+
1732
+ /* Sticky group rows: the group a row belongs to, held under the header
1733
+ (and under the frozen band) while its rows scroll past. Same layer as
1734
+ the frozen band; the last one carries the band's edge. */
1735
+ .sv-grid-row.sv-grid-row-sticky-group {
1736
+ position: sticky;
1737
+ z-index: 31;
1738
+ background: var(--sg-bg, #fff);
1739
+ }
1740
+ .sv-grid-row.sv-grid-row-sticky-group > .sv-grid-cell {
1741
+ background: var(--sg-bg, #fff);
1742
+ }
1743
+ .sv-grid-row.sv-grid-row-sticky-group-last > .sv-grid-cell {
1744
+ border-bottom: 1px solid var(--sg-frozen-edge, var(--sg-border, #94a3b8));
1745
+ }
1746
+
1555
1747
  /* The multiline text editor sizes itself by its lines and keeps the
1556
1748
  input's single-line look until a break is typed. */
1557
1749
  .sv-grid-cell-editor-multiline {
@@ -3009,6 +3201,12 @@ select.sv-grid-fr-editor {
3009
3201
  .sv-grid-row-number-cell {
3010
3202
  border-right-color: var(--sg-header-bg, #f1f5f9);
3011
3203
  }
3204
+ /* The detail-toggle gutter fuses with the row numbers the same way; only
3205
+ its own right edge keeps a line, between the chrome and the data. */
3206
+ .sv-grid-row-number-cell:has(+ .sv-grid-detail-toggle-cell),
3207
+ .sv-grid-row-number-column:has(+ .sv-grid-detail-toggle-column) {
3208
+ border-right-color: var(--sg-header-bg, #f1f5f9);
3209
+ }
3012
3210
 
3013
3211
  /* Group row label colour. */
3014
3212
  .sv-grid-group-row > .sv-grid-cell {