- Shipped
- September 6, 2026 at 8:16 AM UTC
- Author
- Kamo
- Commit
- 7bca2f4
Every grid in the app drew two vertical bars — ours and the library's, side by side. Measured on /leads: ours at x∈[868,900], ag-Grid's at x∈[900,915]. ag-Grid and the MUI DataGrid do not scroll with a bar on their scrollport. Both hide that one and build a SECOND element beside it — `.ag-body-vertical-scroll`, **************** — with a real platform bar in it, syncing the two on every scroll. The marker list named the scrollports, so the app painted its bar over the last 32px of the cells while the library's kept drawing next to it. The gutter-widening rule could never have prevented that: ag-Grid sets `scrollbar-width: none !important` on the scrollport, so there was no gutter there to widen, which is also why our bar sat on the cells rather than beside them. Those second elements carry the marker now. Each is a real scroller whose scrollTop the library watches, so a bar painted over one drives the grid exactly as the platform's bar did, and it lands in a strip the grid already reserves. - Both grids are asked for a 32px strip — `provideGlobalGridOptions` in KamoAgGrid, **************** on the theme. As an option rather than CSS because the number is also what each grid subtracts from the space its columns are laid out in. - The platform's bar inside the strip is removed rather than coloured away: this gutter is the library's doing and does not need a native bar to hold it open. ag-Grid's two horizontal spacers go with it — `overflow-x: scroll` purely so the band reads as one bar across the pinned columns, and at 32px they were two stubs of platform scrollbar either side of ours, visible on /accounts. - Both libraries mark the widget `aria-hidden`, which is also this app's signal that something has been put in front of a scroller; overlayGeometry excludes these by name, and everything else aria-hidden still stands the bar down. - Where the platform floats its bars instead of reserving a column, ag-Grid follows suit; globals.css puts the column back, because a 32px opaque bar needs one. The DataGrid's strips float over the rows even then, so they are painted in the grid's own background token. Verified in a real browser (a probe page with six grids, classic and overlay scrollbars): one bar per axis, in its own strip, no native bar left; the bar drives the grid and follows it; no bar where nothing overflows; pinned columns clean. oneScrollbar now pins both halves of the invariant and fails if a marker falls off either list.