A scrollbar 17px in from the edge is still a scrollbar the dock must not cover

Fixkamo-internal
Shipped
September 7, 2026 at 5:44 AM UTC
Author
Kamo
Commit
ef388ed

The tool dock reserved the right edge for a page's vertical scrollbar only when that bar was AT the edge — within two pixels, for sub-pixel rounding. Almost no bar in this app is. Measured in a real browser at 1440px on the nesting /account actually renders: ag-Grid's scrollbar strip occupies x from 1391 to 1423, seventeen pixels short, because the page root is `p: 2` and the card around the grid has a border. A MUI DataGrid in a `p: 3` card lands twenty-five short. Both were skipped, and the right-most docked window was drawn with its right edge at 1435 — straight over the whole bar. The member could see the content behind the window and had nothing left to scroll it with. So the question rightEdgeReserve asks is no longer "is this bar at the edge" but "is what stands between this bar and the edge chrome" — padding, a border, a grid's own strip, which nobody reads and nobody scrolls. Those two cases are nowhere near each other: the chrome ones measure 17 and 25, the roomiest padding in the codebase (`p: 6`) is 48, and the first layout with something real out there — a pane with a 320px rail beside it — measures 352. NEAR_EDGE_REACH is drawn at 96, through the middle of that gap. A bar within reach is dodged WITH the gap behind it. Reserving only the bar's own width would have shifted the window thirty-two pixels left and left it covering the same bar, so the reserve now runs from the viewport edge to the bar's LEFT side, rounded up because DOMRect.right is routinely fractional and half a pixel short is half a pixel of window on the bar. Every window that answers to the dock is fixed by the one number: the open placement, the row re-pack, the free-slot scan, the overflow cascade and the drag drop all read the same readViewport(). Deliberately unchanged: floating windows, which go wherever they were dropped; maximized ones, which own the viewport on purpose; and the hexheads, which are thrown and bounce off the viewport's real edges. Verified end to end rather than argued. A probe reproducing each nesting, driven by puppeteer in both overlay and classic-scrollbar mode, drew a stand-in window at exactly the geometry layoutDock returns and hit-tested the bar's centre with elementFromPoint: ag-Grid (/account) reserve 0 -> 49 window right edge 1435 -> 1386 bar covered -> clear DataGrid (p: 3) reserve 0 -> 57 window right edge 1435 -> 1378 bar covered -> clear pane + 320px rail reserve 0 -> 0 window right edge 1435 -> 1435 correctly ignored

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing