From a44fc6cfd996ab93c5bad6a190719e4ef0b2b9f0 Mon Sep 17 00:00:00 2001 From: paoloredis Date: Tue, 15 Sep 2026 11:00:06 +0200 Subject: [PATCH] Keep the pinned sidebar and ToC from scrolling away under the widget The Qualified widget stamps its overflow trap on
with contain: layout !important. Layout containment makes
the containing block for every position: fixed descendant, so the pinned left sidebar (nav#sidebar, position: fixed) and the right table of contents scroll away with the page content on every browser where the widget runs. This is why the rails stay pinned in a Firefox profile with tracking protection (widget blocked) but vanish in Chrome. The widget adds the containment to keep float-based layouts from collapsing under its overflow: clip override. Our
has no floated children (verified: zero floats, main height identical with and without containment), so dropping it is safe. The rule is element-qualified (main[data-q-overflow-trap]) to out-rank the widget's attribute-only selector, and only matches while the widget has marked the element. Verified on the live staging page in both Chrome and Firefox: with the rule injected, the sidebar and ToC stay pinned at their offsets while the page scrolls; without it they leave the viewport. Page height and scroll range unchanged. Co-Authored-By: Claude Fable 5 --- assets/css/index.css | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/assets/css/index.css b/assets/css/index.css index d677cabeb2..3998ef92d2 100644 --- a/assets/css/index.css +++ b/assets/css/index.css @@ -1900,6 +1900,17 @@ html[q-docked-target] { scrollbar-gutter: auto !important; } +/* The widget also stamps its "overflow trap" on
with + contain: layout, which makes
the containing block for every + position: fixed descendant — so the pinned left sidebar and right table + of contents scroll away with the content. The containment exists to keep + float layouts from collapsing under the trap's overflow: clip;
has + no floated children, so it is safe to drop. Element-qualified to out-rank + the widget's attribute-only selector. */ +main[data-q-overflow-trap] { + contain: none !important; +} + /* While the chat is closed, the widget's invisible #q-messenger-frame iframe overlays page content near the right edge with pointer events enabled, stealing clicks and hovers from whatever is underneath —