Fix UpdateBanner pushing the composer off the bottom of the screen

Every top-level page independently hardcoded a full-viewport height
(.chat-shell: 100vh, .admin-page: 100%, .login-screen family: min-height
100vh), assuming it alone owned the whole viewport. UpdateBanner renders
globally above all of them (App.tsx), so its height just stacked on top
instead of the page shrinking to make room -- on ChatShellPage specifically
(overflow: hidden), that clipped the bottom of the screen and hid the
composer behind the visible edge.

Made #root a flex column shared by the banner and whichever page is
routed, with each page now using flex: 1; min-height: 0 to fill whatever
space is actually left instead of assuming the full viewport.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 13:53:47 -06:00
co-authored by Claude Sonnet 5
parent 5527b25e52
commit 7022b63e9e
4 changed files with 32 additions and 3 deletions
+6 -1
View File
@@ -1,5 +1,10 @@
.admin-page { .admin-page {
height: 100%; /* Fills whatever's left in #root's flex column after UpdateBanner --
see tokens.css. height:100% resolved to the full viewport regardless
of the banner, causing the same off-screen-content bug ChatShellPage
had. */
flex: 1;
min-height: 0;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: var(--ds-void); background: var(--ds-void);
+5 -1
View File
@@ -1,5 +1,9 @@
.chat-shell { .chat-shell {
height: 100vh; /* Fills whatever's left in #root's flex column after UpdateBanner --
see tokens.css. Not height:100vh: that ignored the banner entirely and
pushed the composer off the bottom of the screen whenever it showed. */
flex: 1;
min-height: 0;
width: 100%; width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
+7 -1
View File
@@ -1,5 +1,11 @@
.login-screen { .login-screen {
min-height: 100vh; /* Fills whatever's left in #root's flex column after UpdateBanner -- see
tokens.css. min-height:100vh ignored the banner and could grow the
whole page taller than the viewport instead of just filling what's
actually left, which also meant this stopped being vertically
centered on the space the user could see without scrolling. */
flex: 1;
min-height: 0;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
+14
View File
@@ -58,6 +58,20 @@ body,
height: 100%; height: 100%;
} }
/* #root's direct children are UpdateBanner (App.tsx renders it globally,
above every route, so it can prompt for a reload from any page) and
whichever page is currently routed. A flex column here, with the banner
as flex:none (already set on .update-banner) and each page's root
filling the rest via flex:1, lets the banner's height come out of the
page's available space instead of adding on top of a page that
separately hardcodes height:100vh/100% -- that additive stacking was
pushing chat's composer off the bottom of the screen whenever the
banner was showing. */
#root {
display: flex;
flex-direction: column;
}
body { body {
margin: 0; margin: 0;
background: var(--ds-void); background: var(--ds-void);