Demo images / Build & push demo images (push) Successful in 3m58s
The three tab panes carried max-h-72 xl:max-h-none, so at the xl breakpoint (where the Web5 row becomes two grid columns) the cap lifted with nothing to replace it: the visible pane grew to fit every row, stretched the grid row, and the scrollbar the user expects never appeared. Give each pane xl:flex-1 xl:basis-0 xl:max-h-none instead — zero flex-basis means the pane contributes no intrinsic height, so the grid row is sized by the Web5NodeVisibility sibling alone, grid's default align-items: stretch gives the card that height, and flex-1 hands the leftover height back to the pane, which scrolls inside it via the existing overflow-y-auto. The card root gets min-h-0 (so the flex column can shrink below content height) plus an xl:min-h-[20rem] floor so a short sibling still leaves a usable list area instead of collapsing to the header+tabs strip. Below the row breakpoint nothing changes: the stacked cap (max-h-72) and scroll are untouched, and dropping flex-auto (replaced by nothing, i.e. the default 0 1 auto) has no visible effect since single-column stacked cards have no extra flex space to distribute anyway. Adds Web5ConnectedNodesScroll.test.ts to pin the contract across all three tab panes and the card root so a future cleanup cannot reintroduce the grow-to-fit regression a third time. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>