Surfaced by ChatGPT review pass 2 of PR #596 (#586, phase 1 of #593), verified against the code.
Deliberately not fixed in #586 — see "Why deferred".
What
#586 made the docked inspector's displayed width dock-aware: its ceiling reserves
CENTRE_MIN_PX for the centre surface plus reservedPx = state.sidebarPx + 2 * HANDLE_PX
(src/ui/app-shell.ts:174). The re-clamp (app.dom.reclampInspectorWidth) runs at three moments:
- shell construction (
app-shell.ts:252),
- inspector unfold (called from
showInInspector),
window resize.
A live left-sidebar drag is not one of them. dragCtx.apply (src/ui/app-shell.ts:182-186)
handles the 'col' axis by setting sidebar.style.width only:
apply: (axis, value) => {
if (axis === 'col') sidebar.style.width = value + 'px';
else if (axis === 'rightInspector') inspectorHost.style.width = value + 'px';
else schemaPane.style.height = value + '%';
},
So while both panels are visible, widening the sidebar silently invalidates the reservation the
inspector's width was chosen against.
Reproduction
At a 1280px viewport:
- Open Cell, Rows or Reference and size the inspector to 600px (default sidebar 248px →
reservedPx 262 → centre ≈ 418px).
- Drag
.col-resize to the sidebar's maximum 420px (dragValue's clamp(ev.clientX, 180, 420),
src/ui/splitters.ts:108) → reservedPx becomes 434.
- The inspector stays 600px, so the centre falls to ≈ 246px — below
CENTRE_MIN_PX (320) — and
stays there until an unrelated window resize or a fold/unfold happens to re-clamp it.
Why the existing tests miss it
Both new tests avoid the live transition:
- the e2e sidebar test closes the inspector, changes the sidebar, then reopens it (so the unfold
hook does the work);
- the unit test changes
state.sidebarPx while the inspector is folded.
Neither drags the sidebar while the inspector is open, which is the only path that exposes this.
Why deferred
It is a small, self-contained fix, but it shares a root cause with the centre-minimum policy
question (filed separately): both are about what the shell does when the row's three columns
cannot all keep their minima. Fixing the re-clamp alone would keep the centre at
CENTRE_MIN_PX only while that is feasible, so the two are best resolved together. It is also
not a regression — pre-#586 the surface was a position: fixed overlay that the sidebar's width
did not interact with at all.
Acceptance
Surfaced by ChatGPT review pass 2 of PR #596 (#586, phase 1 of #593), verified against the code.
Deliberately not fixed in #586 — see "Why deferred".
What
#586 made the docked inspector's displayed width dock-aware: its ceiling reserves
CENTRE_MIN_PXfor the centre surface plusreservedPx = state.sidebarPx + 2 * HANDLE_PX(
src/ui/app-shell.ts:174). The re-clamp (app.dom.reclampInspectorWidth) runs at three moments:app-shell.ts:252),showInInspector),window resize.A live left-sidebar drag is not one of them.
dragCtx.apply(src/ui/app-shell.ts:182-186)handles the
'col'axis by settingsidebar.style.widthonly:So while both panels are visible, widening the sidebar silently invalidates the reservation the
inspector's width was chosen against.
Reproduction
At a 1280px viewport:
reservedPx262 → centre ≈ 418px)..col-resizeto the sidebar's maximum 420px (dragValue'sclamp(ev.clientX, 180, 420),src/ui/splitters.ts:108) →reservedPxbecomes 434.CENTRE_MIN_PX(320) — andstays there until an unrelated
window resizeor a fold/unfold happens to re-clamp it.Why the existing tests miss it
Both new tests avoid the live transition:
hook does the work);
state.sidebarPxwhile the inspector is folded.Neither drags the sidebar while the inspector is open, which is the only path that exposes this.
Why deferred
It is a small, self-contained fix, but it shares a root cause with the centre-minimum policy
question (filed separately): both are about what the shell does when the row's three columns
cannot all keep their minima. Fixing the re-clamp alone would keep the centre at
CENTRE_MIN_PXonly while that is feasible, so the two are best resolved together. It is alsonot a regression — pre-#586 the surface was a
position: fixedoverlay that the sidebar's widthdid not interact with at all.
Acceptance
'col'apply path re-clamps the displayed inspector width, without mutating thesaved
rightInspectorPxpreference (the same displayed-vs-preferred split refactor(shell): one SurfaceLifecycle primitive and a docked right-inspector slot #586 established)..col-resizewhile the inspector stays open and asserts thecentre against
CENTRE_MIN_PX. happy-dom evaluates no CSS layout, so a unit test cannotstand in for this.
npm test,npm run check:types,npm run check:arch,npm run buildpass.