fix(web): scroll the sidebar independently of the page #489

Merged
Claude-Run merged 1 commit from fix/BUNYIP-368-sidebar-independent-scroll into main 2026-08-06 05:38:20 +02:00
Member

The authenticated shells wrapped the sidebar and the content column in a flex min-h-screen container, so the shell grew with whatever <main> rendered and the document itself was the only scroll container. main's overflow-auto never engaged, and a wheel/trackpad gesture over the sidebar scrolled the entire page instead of the nav.

The shell is now viewport-height with its overflow clipped from the md breakpoint up (the breakpoint at which the sidebar is rendered at all), the sidebar fills that height, pins its brand row and scrolls only its nav, and <main> scrolls itself. Below md there is no sidebar, so the page keeps its natural full-document scroll. The three wrapper class strings are shared constants so dashboard_shell and admin_shell cannot drift apart.

A new test asserts the contract on every authenticated shell: viewport-locked root, a sidebar that clips its own overflow, a flex-1 overflow-y-auto nav, and a self-scrolling <main>. Re-introducing a document-scrolling shell fails it.

#BUNYIP-368

The authenticated shells wrapped the sidebar and the content column in a `flex min-h-screen` container, so the shell grew with whatever `<main>` rendered and the document itself was the only scroll container. `main`'s `overflow-auto` never engaged, and a wheel/trackpad gesture over the sidebar scrolled the entire page instead of the nav. The shell is now viewport-height with its overflow clipped from the `md` breakpoint up (the breakpoint at which the sidebar is rendered at all), the sidebar fills that height, pins its brand row and scrolls only its nav, and `<main>` scrolls itself. Below `md` there is no sidebar, so the page keeps its natural full-document scroll. The three wrapper class strings are shared constants so `dashboard_shell` and `admin_shell` cannot drift apart. A new test asserts the contract on every authenticated shell: viewport-locked root, a sidebar that clips its own overflow, a `flex-1 overflow-y-auto` nav, and a self-scrolling `<main>`. Re-introducing a document-scrolling shell fails it. #BUNYIP-368
fix(web): scroll the sidebar independently of the page
All checks were successful
E2E PR gate / E2E / PR gate (pull_request) Successful in 16s
Check / fmt + clippy + build + tests (pull_request) Successful in 4m12s
Create release / Create release from merged PR (pull_request) Has been skipped
f9e0d34e08
The authenticated shells wrapped the sidebar and the content column in a `flex min-h-screen` container, so the shell grew with whatever `<main>` rendered and the document itself was the only scroll container. `main`'s `overflow-auto` never engaged, and a wheel/trackpad gesture over the sidebar scrolled the entire page instead of the nav.

The shell is now viewport-height with its overflow clipped from the `md` breakpoint up (the breakpoint at which the sidebar is rendered at all), the sidebar fills that height, pins its brand row and scrolls only its nav, and `<main>` scrolls itself. Below `md` there is no sidebar, so the page keeps its natural full-document scroll. The three wrapper class strings are shared constants so `dashboard_shell` and `admin_shell` cannot drift apart.

A new test asserts the contract on every authenticated shell: viewport-locked root, a sidebar that clips its own overflow, a `flex-1 overflow-y-auto` nav, and a self-scrolling `<main>`. Re-introducing a document-scrolling shell fails it.

#BUNYIP-368
Claude-Run deleted branch fix/BUNYIP-368-sidebar-independent-scroll 2026-08-06 05:38:20 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/bunyip!489
No description provided.