ui(live-panels): wide live-news/live-webcams panel (764 px) overflows its two 200 px grid tracks, next row paints over the lower half (offline card buttons below the fold)
Symptom
On the Live News panel, when a viewer-picked channel has no live source, the offline card renders with only its icon visible at the bottom of the panel. The Retry, Play next channel and Open on YouTube buttons are below the visible fold and only reachable by scrolling inside the panel. Same layout also hides the second row of the Live Webcams 2x2 wall.
Seen while capturing UI evidence for #8166 (offline card introduced there), desktop 1600x1500, headless Chromium, VITE_E2E=1 VITE_VARIANT=full npm run dev, default layout, right-hand column.
Measurement
Measured with getBoundingClientRect() on both main (6edb8165) and the #8166 head (50e6faf5); numbers are identical, so the fold is pre-existing dashboard layout, not the card:
| panel | .panel box height |
.panel-content height |
next panel painted at | classes / grid-row |
|---|---|---|---|---|
| live-news | 764 px | 660 px (688 px on 8166) | +408 px from the panel top | panel panel-wide, span 2 |
| live-webcams | 764 px | 688 px | +408 px | panel panel-wide, span 2 |
--dashboard-panel-row-max = 380px, --dashboard-grid-gap = 4px (src/styles/main.css:1631); #panelsGrid grid-auto-rows: minmax(var(--dashboard-panel-row-min), var(--dashboard-panel-row-max)) (main.css:1640), computed as minmax(200px, 380px).
Reading
src/styles/main.css:1904gives the wide live-news panel a fixedheight: calc(var(--dashboard-panel-row-max) * 2 + var(--dashboard-grid-gap))= 764 px (the live-webcams wall has the siblingmin(...)rule just below).- The two grid tracks it spans resolve to their 200 px minimum (2 x 200 + gap = 408 px), so the panel box overflows its cell by ~356 px and the next row's panels are painted over the lower half.
- The offline card (
.live-offline,height: 100%) centres its icon/text/buttons in the 660 px.panel-content, i.e. around y = 330, which is right at the 408 px fold once the 70 px header is counted. The "Connecting…" cover does not suffer because it is absolutely positioned inside the 16:9.live-news-playerbox, and the "Ready when you are" shell fits in the top half.
Questions to study
- Why do the spanned tracks collapse to
minmax()'s 200 px minimum here while the panel keeps a 764 px explicit height? (grid-auto-rowsvs the fixed-height rule;content-visibility: autoandcontain: layout styleon.panel-contentmay be hiding the intrinsic size from track sizing.) - Should the wide live panels size their rows instead of themselves (drop the fixed height, let
span 2tracks grow), or should the tracks get a 380 px floor when a.panel-widelive panel is present? - Independent of the grid: should the offline card size itself to the 16:9 player box like the connecting cover does (
.live-news-playeraspect-ratio: 16 / 9), so its actions are always in the first screen even when a panel is short?
Repro
VITE_E2E=1 VITE_VARIANT=full npm run dev # or .agents/skills/verify-worldmonitor/scripts/wm-verify.sh launch
# 1600x1500 viewport, /dashboard, default layout
# Live News > gear > Custom channel: https://www.youtube.com/watch?v=aaaaaaaaaaa, name "Dead test video" > Add
# click the "Dead test video" channel button -> offline card; only the icon is visible without scrolling the panel
Related: #8166 (offline card), #8164 (webcam wall), review run 20260916-stack-8163-8168.
Source: koala73/worldmonitor