Let the Scheduler's views shrink so the assistant can grow into them

Flex items default to min-height:auto, so a view holding a log ignored the height it was given
and pushed the composer out of a panel that clips instead of scrolling.
This commit is contained in:
Gmer4Lfe
2026-08-09 12:42:32 -04:00
parent 1370a29233
commit 455fb55857
2 changed files with 21 additions and 4 deletions
+6
View File
@@ -145,6 +145,12 @@ body.vv-fullscreen #displaybox { padding-left: 1rem !important; padding-top: .5r
#vv-sched-left { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-self: flex-start; } #vv-sched-left { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-self: flex-start; }
#vv-sched-cards { flex: 1; } #vv-sched-cards { flex: 1; }
#vv-sched-right { display: none; flex: 1 1 0; min-width: 0; flex-direction: column; overflow: hidden; align-self: flex-start; } #vv-sched-right { display: none; flex: 1 1 0; min-width: 0; flex-direction: column; overflow: hidden; align-self: flex-start; }
/* Flex items default to min-height:auto, which resolves to their content size — so a view with a
long log in it refuses to shrink. The assistant below it is flex-shrink:0 and this panel is a
fixed height with overflow:hidden, so whatever will not fit is not scrolled, it is clipped off
the bottom: the assistant's own composer, which is the last thing in the panel. vvFitRight()
sizes these explicitly and this is what lets that size actually take effect. */
#vv-sched-right > * { min-height: 0; }
#vv-sched-right.vv-panel-visible { display: flex; } #vv-sched-right.vv-panel-visible { display: flex; }
.vv-log-card { flex: 1; display: flex; flex-direction: column; padding-bottom: 0; } .vv-log-card { flex: 1; display: flex; flex-direction: column; padding-bottom: 0; }
.vv-log-right-pre { max-height: none; overflow-y: auto; } .vv-log-right-pre { max-height: none; overflow-y: auto; }
+15 -4
View File
@@ -1237,12 +1237,23 @@ function vvFitRight() {
// expanded at the new panel size instead of snapping back to the resting share. The floors keep // expanded at the new panel size instead of snapping back to the resting share. The floors keep
// the same 1:2 relationship, or on a very short viewport the two states would clamp to the same // the same 1:2 relationship, or on a very short viewport the two states would clamp to the same
// number and the control would appear to do nothing. // number and the control would appear to do nothing.
if (vvSchedChat) { const dock = document.getElementById('vv-ai-dock');
vvSchedChat.setHeights(Math.max(70, Math.round(availH * 0.20)) + 'px', if (vvSchedChat && dock) {
Math.max(140, Math.round(availH * 0.40)) + 'px'); // The share is of the transcript, but what the panel has to find room for is the whole
// assistant — composer, control row, padding. Measured rather than assumed, because it is a
// wrapped row of buttons whose height depends on how narrow the panel is.
const chatBox = document.getElementById('vv-sched-ai-chat');
const chrome = chatBox ? Math.max(0, dock.offsetHeight - chatBox.offsetHeight) : 0;
// Hard ceiling, not a preference. This panel is a fixed height with overflow:hidden, so a
// transcript that asks for more than is left is not scrolled into place — it pushes its own
// composer out of the panel and the panel cuts it off. VIEW_MIN keeps the thing being
// discussed on screen too; a chat that covers it entirely is not worth the room it took.
const VIEW_MIN = 90;
const room = Math.max(60, availH - VIEW_MIN - chrome);
vvSchedChat.setHeights(Math.min(room, Math.max(70, Math.round(availH * 0.20))) + 'px',
Math.min(room, Math.max(140, Math.round(availH * 0.40))) + 'px');
} }
// Measured after the heights are applied, so this reads the clamped height, not the natural one. // Measured after the heights are applied, so this reads the clamped height, not the natural one.
const dock = document.getElementById('vv-ai-dock');
const dockH = dock ? dock.offsetHeight : 0; const dockH = dock ? dock.offsetHeight : 0;
const contentH = Math.max(80, availH - dockH); const contentH = Math.max(80, availH - dockH);
if (pre.style.display !== 'none') { if (pre.style.display !== 'none') {