fix: allocate Console viewport space to processing controls

This commit is contained in:
2026-10-21 21:56:30 -05:00
parent 0f8235277e
commit 5cd32f4c1d
3 changed files with 41 additions and 2 deletions
@@ -392,3 +392,21 @@ Manifest ffb46fbdb875f97ff2eb7a7bed8bf6d5c4df53b8a63c738ffcde5fc5f6b7f6ad, 87 pa
with nothing carried. Sage-2345 counts the timer-fixture red as the first in
this 191 window; any second red stops and is escalated to Mos. Previous logs
are retained in gate-attempt-eaf/.
### mos-1248 / sage-2363: desktop viewport allocation (unrun static candidate)
The second red on 0f8235277 was shell.test.mjs:380 (1062 versus 1000).
The shell gives .frame a viewport-based minimum at packages/webui/src/public/shell.css:135;
processing.css:12-14 replaced that minimum but used a column flex body with only
min-height:100vh, so the new bar was not allocated a bounded share of the viewport.
The desktop body now uses explicit grid rows for the command bar, controls, optional
banner, frame and footer. The frame row is minmax(min-content,1fr): it takes the
remaining short-page space while long content may grow the document. No clipping,
overflow suppression, fixed body height, test viewport change or assertion removal.
The existing shell.test.mjs:380 equality stays byte-identical. Added assertions
check actual processing-bar visibility, positive height, viewport placement and
no document scroll at 1440x1000; the existing 1440x420 long-page checks remain.
KS59 reverts processing.css to 0f8235277's bytes and must fail that same shell
browser test. Total: 74 planned mutants. No test or mutant has run on this fix.
Webby must statically review this delta before Sage opens the full no-carry gate.
+12 -2
View File
@@ -9,9 +9,19 @@
viewport rather than adding a full viewport below the controls. Navigation
retains the shell's command-bar/footer bounds independently of this bar. */
@media (min-width:760px) {
body { --processing-nav:240px; display:flex; flex-direction:column; min-height:100vh; }
body {
--processing-nav:240px;
display:grid;
grid-template-columns:minmax(0,1fr);
grid-template-rows:auto auto auto minmax(min-content,1fr) auto;
min-height:100vh;
}
.cmdbar { grid-row:1; }
.processing-controls { grid-row:2; }
.processing-banner { grid-row:3; }
footer.foot { grid-row:5; }
.processing-controls, .processing-banner { margin-left:var(--processing-nav); }
.frame { flex:1; min-height:0; }
.frame { grid-row:4; min-height:0; }
.frame > .content { grid-column:2; }
.frame > .tree { position:fixed; width:var(--processing-nav); }
}
+11
View File
@@ -378,6 +378,17 @@ test('shell in a browser: System default, seeded states, 400px, focus and the Ct
const edges = 'JSON.stringify(["cmdbar","tree","foot"].map(c=>document.querySelector("."+c).getBoundingClientRect()).map(r=>[Math.round(r.top),Math.round(r.bottom)]).concat([[document.documentElement.scrollHeight,innerHeight]]))';
let [bar, tree, foot, [scrollH, innerH]] = JSON.parse(await b.evaluate(edges));
assert.equal(scrollH, innerH);
const processingBar = JSON.parse(await b.evaluate(`JSON.stringify((() => {
const el = document.querySelector('#processing-controls'), rect = el.getBoundingClientRect();
const style = getComputedStyle(el);
return { visible: el.getClientRects().length > 0 && style.display !== 'none' && style.visibility === 'visible',
top: rect.top, bottom: rect.bottom, height: rect.height, viewport: innerHeight,
scroll: document.documentElement.scrollHeight };
})())`));
assert.ok(processingBar.visible && processingBar.height > 0, 'the processing bar is visible on the short Board');
assert.ok(processingBar.top >= bar[1] && processingBar.bottom <= processingBar.viewport,
'the processing bar sits inside the viewport below the command bar');
assert.equal(processingBar.scroll, processingBar.viewport, 'the visible processing bar adds no short-page scroll');
assert.deepEqual([tree[0], tree[1]], [bar[1], foot[0]]);
await b.viewport(1440, 420); await b.evaluate('scrollTo(0, 1e5)'); await flat();
[bar, tree, foot, [scrollH, innerH]] = JSON.parse(await b.evaluate(edges));