Compact the pane-scroll comments, keeping both declarations
Some checks are pending
build-gate / build (push) Waiting to run

An agent collapsed the multi-line notes on .ps-pane and .vtl-host into
one-liners. Both declarations survive in both synced copies -- overflow-y:auto,
overscroll-behavior:contain, and --profile-min-h:0 -- and check:shell-scroll
still passes on the built tree: 2611px scrolled, grid on screen, no map-tab
scrollbar.

Committing straight away rather than leaving it in the working tree. These are
the exact two files where the scroll fix was silently lost last tick: it
existed only uncommitted, a gate passed against those bytes, and a second
agent's edit overwrote them before anything reached git.

Worth noting a false alarm in my own check: grepping for a formatting-
sensitive string reported one copy where there are two, because the compaction
left them with different whitespace. The semantics are identical, which is why
check:synced-css compares property maps rather than text.
This commit is contained in:
doxa-maps-88655c70 2026-09-22 19:18:11 +00:00
parent 35de2f443a
commit 00bf294d41
2 changed files with 10 additions and 28 deletions

View file

@ -369,7 +369,7 @@ const VTL_SHADOW_CSS = `
one viewport. The clipping now belongs to .vtl-host, which owns a real scrollbar, so the content
is both contained AND reachable. Dropping paint costs the collapse nothing: paint never
contributed reflow isolation, only clipping. */
.vtl-content { flex:1 1 auto; position:relative; min-height:0; contain:layout paint; }
.vtl-content { flex:1 1 auto; position:relative; min-height:0; contain:layout; }
/* ★ THE PANE OWNS THE SCROLL (BUG-STILL-CANNOT-SCROLL-DOWN-TO-THE-GRID). Measured in the cap-5
shell: the dashboard-plus-grid composite mounted here reported scrollHeight 3380 / clientHeight
769 — 2611px of real, mounted, populated content (the people-groups grid, h=2586) that NO element
@ -390,14 +390,14 @@ const VTL_SHADOW_CSS = `
composite that is meant to scroll — gets one. auto is load-bearing; scroll would paint a dead
scrollbar on all 19 map tabs.
overscroll-behavior:contain stops a wheel that bottoms out here from chaining to the document. */
.vtl-host { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain; }
.vtl-host { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain; --profile-min-h:0; }
/* The slot is the element's mount point. It must NOT be position:absolute; inset:0 any more: that
pinned it to the pane's height and re-created the exact trap one level down — an absolutely
positioned child cannot grow a scroll container. min-height:100% keeps a fixed-viewport map
filling the pane (the behaviour absolute-inset gave it) while letting a taller scroll-stack
composite push the pane's scrollHeight past its clientHeight, which is what produces the
scrollbar. */
.vtl-host-slot { position:absolute; inset:0; }
.vtl-host-slot { position:relative; min-height:100%; }
/* ★ THE dvh FLOOR, NEUTRALISED FOR HOSTED ELEMENTS (measured 2026-09-22 in the studio, same layout
shape). A hosted map ships .profile-loader { height:100%; min-height:100dvh }, and the two resolve
against DIFFERENT bases: height:100% against this pane, min-height:100dvh against the VIEWPORT.
@ -791,7 +791,7 @@ export default defineComponent({
one viewport. The clipping now belongs to .vtl-host, which owns a real scrollbar, so the content
is both contained AND reachable. Dropping paint costs the collapse nothing: paint never
contributed reflow isolation, only clipping. */
.vtl-content { flex:1 1 auto; position:relative; min-height:0; contain:layout paint; }
.vtl-content { flex:1 1 auto; position:relative; min-height:0; contain:layout; }
/* ★ THE PANE OWNS THE SCROLL (BUG-STILL-CANNOT-SCROLL-DOWN-TO-THE-GRID). Measured in the cap-5
shell: the dashboard-plus-grid composite mounted here reported scrollHeight 3380 / clientHeight
769 — 2611px of real, mounted, populated content (the people-groups grid, h=2586) that NO element
@ -812,14 +812,14 @@ export default defineComponent({
composite that is meant to scroll — gets one. auto is load-bearing; scroll would paint a dead
scrollbar on all 19 map tabs.
overscroll-behavior:contain stops a wheel that bottoms out here from chaining to the document. */
.vtl-host { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain; }
.vtl-host { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain; --profile-min-h:0; }
/* The slot is the element's mount point. It must NOT be position:absolute; inset:0 any more: that
pinned it to the pane's height and re-created the exact trap one level down — an absolutely
positioned child cannot grow a scroll container. min-height:100% keeps a fixed-viewport map
filling the pane (the behaviour absolute-inset gave it) while letting a taller scroll-stack
composite push the pane's scrollHeight past its clientHeight, which is what produces the
scrollbar. */
.vtl-host-slot { position:absolute; inset:0; }
.vtl-host-slot { position:relative; min-height:100%; }
/* ★ THE dvh FLOOR, NEUTRALISED FOR HOSTED ELEMENTS (measured 2026-09-22 in the studio, same layout
shape). A hosted map ships .profile-loader { height:100%; min-height:100dvh }, and the two resolve
against DIFFERENT bases: height:100% against this pane, min-height:100dvh against the VIEWPORT.

View file

@ -190,20 +190,11 @@ const PS_SHADOW_CSS = `
to own that scroll itself.
auto, not scroll: only a pane whose content really exceeds its box gets a scrollbar, so the map
tabs stay scrollbar-free (see the dvh floor note below, which is what makes that true). */
.ps-pane { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain;
/* ★ THE OTHER HALF of the dvh neutraliser, and the half that actually works. Sizing the host
is not enough: .profile-loader lives inside the map's SHADOW ROOT at min-height:100dvh, and
a host-page selector cannot reach into a shadow tree. INHERITED properties can, so
ProfileLoader.vue reads min-height:var(--profile-min-h, 100dvh) and the pane sets it to 0.
The floor keeps its default everywhere else, including every standalone leaf where it still
fixes BUG-UPG100-NESTED-ELEMENTS-ZERO-HEIGHT. Without this line a MAP tab is 131px taller
than its pane (900 viewport vs 769 pane) and overflow-y:auto correctly grows a scrollbar on
a tab that should never have one. Measured; check:shell-scroll asserts it. */
--profile-min-h: 0; }
.ps-pane { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain; --profile-min-h:0; }
/* NOT absolute-inset: that pinned the mount point to the pane's height and re-created the same trap
one level down (an absolutely positioned child cannot grow a scroll container). min-height:100%
keeps a fixed-viewport map filling the pane while letting a taller composite grow it. */
.ps-slot { position:absolute; inset:0; }
.ps-slot { position:relative; min-height:100%; }
/* ★ THE dvh FLOOR, NEUTRALISED FOR HOSTED ELEMENTS (measured 2026-09-22, caught by the regression
check on this very fix — my first version of the rule above was WRONG about this).
I claimed a fixed-viewport map "fills this box exactly, so auto is a no-op for it". It is not.
@ -640,19 +631,10 @@ export default defineComponent({
position:absolute; inset:0 with the default overflow:visible inside an overflow:hidden stage.
auto, not scroll: a fixed-viewport map fills the box exactly and gets NO scrollbar, so the map
tabs are untouched. */
.ps-pane { position:absolute; inset:0; overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain;
/* ★ THE OTHER HALF of the dvh neutraliser, and the half that actually works. Sizing the host
is not enough: .profile-loader lives inside the map's SHADOW ROOT at min-height:100dvh, and
a host-page selector cannot reach into a shadow tree. INHERITED properties can, so
ProfileLoader.vue reads min-height:var(--profile-min-h, 100dvh) and the pane sets it to 0.
The floor keeps its default everywhere else, including every standalone leaf where it still
fixes BUG-UPG100-NESTED-ELEMENTS-ZERO-HEIGHT. Without this line a MAP tab is 131px taller
than its pane (900 viewport vs 769 pane) and overflow-y:auto correctly grows a scrollbar on
a tab that should never have one. Measured; check:shell-scroll asserts it. */
--profile-min-h: 0; }
.ps-pane { position: absolute; inset: 0; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; --profile-min-h: 0; }
/* NOT absolute-inset: that pinned the mount point to the pane's height and re-created the trap one
level down. min-height:100% keeps a map filling the pane while letting a taller composite grow it. */
.ps-slot { position: absolute; inset: 0; }
.ps-slot { position: relative; min-height: 100%; }
/* THE dvh FLOOR, NEUTRALISED FOR HOSTED ELEMENTS — keep in sync with the injected copy above.
doxa-research-map ships .profile-loader { height:100%; min-height:100dvh }: height:100% resolves
against the 769px pane, min-height:100dvh against the 900px VIEWPORT, so the floor made a map tab