From 562b859174916cf6cf531cdff56c9c5777fc0cd4 Mon Sep 17 00:00:00 2001 From: Jonathon Leight Date: Sun, 9 Aug 2026 18:05:59 -0400 Subject: [PATCH] Fix scrollbar gutter --- .claude/CLAUDE.md | 10 ++++ internal/e2e/page_gutter_test.go | 79 ++++++++++++++++++++++++++++++++ internal/web/static/app.css | 26 +++++++++++ 3 files changed, 115 insertions(+) create mode 100644 internal/e2e/page_gutter_test.go diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 807b96d..19b7cfe 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -121,6 +121,16 @@ markup for it. The one that has already bitten us: this; it parses the templates structurally, so extend it there if you find another flex-container component with the same trap. +- **Tabler shifts the whole page sideways when a scrollbar appears.** It ships + `@media (min-width:992px) { :root { margin-left: calc(100vw - 100%) } }`; `100vw` + counts the scrollbar and `100%` doesn't, so any page tall enough to scroll slides + right by the scrollbar width with an unpainted strip down the left edge. It reads + as page-specific (the tall tabs of a section show it, the short ones don't), but + it's every scrollable page. `app.css` overrides it and reserves the space with + `scrollbar-gutter: stable` instead; `TestE2ENoLeftGutterWhenScrollbarAppears` + locks it in. Override in `app.css` rather than editing `tabler.min.css` — that + file's hash is pinned by `internal/licenses`. + - **A `