From 8f372d13f897970c9b970d0a135d749eeae77c85 Mon Sep 17 00:00:00 2001 From: claude Date: Sat, 13 Jun 2026 20:38:00 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Lumi=C3=A8re=20layout/navbar=20on=20sett?= =?UTF-8?q?ings+404,=20drop=20proxy=5Frequest=5Fbuffering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move min-height:100vh from body to html:has(body[data-lumiere]) so the gradient fills the viewport on short pages without inflating document height or pushing the footer below the fold - Remove min-height:60vh from .error-container (was causing scrollbar on 404 when combined with thin footer) - Replace Bootstrap 3 navbar selectors (.navbar-nav > li > a) with CSS custom property overrides (--navbar-link-color, --navbar-link-hover-*, --navbar-bg, etc.) consumed by navbar.scss — fixes header button colours - Remove position:relative from .navbar-default override; base CSS already has position:absolute which provides the stacking context for ::before - Drop proxy_request_buffering off from upload location: buffered mode + global client_body_timeout 15m (nginx.conf.template) is more compatible with multer's multipart stream handling on slow connections Co-Authored-By: Claude Sonnet 4.6 --- server-ce/nginx/overleaf.conf | 6 ++-- .../stylesheets/pages/error-pages.scss | 1 - .../pages/project-list-lumiere.scss | 31 +++++++++++++------ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/server-ce/nginx/overleaf.conf b/server-ce/nginx/overleaf.conf index 616b5084b9..db63a58d88 100644 --- a/server-ce/nginx/overleaf.conf +++ b/server-ce/nginx/overleaf.conf @@ -9,8 +9,9 @@ server { internal; } - # File upload endpoints: stream directly to Node.js with generous timeouts - # for large files on slow / unreliable connections. + # File upload endpoints: extended timeouts for large files on slow connections. + # client_body_timeout 15m is set globally in nginx.conf.template; repeated + # here explicitly and client_max_body_size raised to 550m for this path. location ~ ^/project/[^/]+/upload$ { proxy_pass http://127.0.0.1:4000; proxy_http_version 1.1; @@ -21,7 +22,6 @@ server { proxy_send_timeout 15m; client_body_timeout 15m; client_max_body_size 550m; - proxy_request_buffering off; } location / { diff --git a/services/web/frontend/stylesheets/pages/error-pages.scss b/services/web/frontend/stylesheets/pages/error-pages.scss index 76f93c6868..52b0c0e02e 100644 --- a/services/web/frontend/stylesheets/pages/error-pages.scss +++ b/services/web/frontend/stylesheets/pages/error-pages.scss @@ -3,7 +3,6 @@ // earlier in all.scss, so they are available here. [data-lumiere='true'] { .error-container { - min-height: 60vh; justify-content: center; } diff --git a/services/web/frontend/stylesheets/pages/project-list-lumiere.scss b/services/web/frontend/stylesheets/pages/project-list-lumiere.scss index 7a07804b32..e3695f109a 100644 --- a/services/web/frontend/stylesheets/pages/project-list-lumiere.scss +++ b/services/web/frontend/stylesheets/pages/project-list-lumiere.scss @@ -989,18 +989,35 @@ $lum-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' wi } // ── Global Lumière rules (apply to every page when data-lumiere is set) ──── -// These cover pages that don't carry .project-list-lumiere (404, welcome). +// These cover pages that don't carry .project-list-lumiere (404, settings). + +// min-height on html (not body) so the gradient fills the viewport without +// adding artificial height that would push the footer below the fold. +html:has(body[data-lumiere='true']) { + min-height: 100vh; +} [data-lumiere='true'] { background: linear-gradient(160deg, #f0faf8 0%, #e4f4f1 50%, #daeef5 100%); - min-height: 100vh; - // Shared white navbar with teal accent stripe (marketing pages + welcome) + // Navbar: white background with teal accent stripe. + // Override CSS custom properties used by navbar.scss — no hard-coded + // class selectors needed, and position:absolute from base CSS is kept. .navbar-default { - background-color: #ffffff !important; + --navbar-bg: #ffffff; + --navbar-link-color: #{$lum-text-sub}; + --navbar-link-hover-color: #{$lum-teal}; + --navbar-link-hover-bg: rgba(42, 157, 143, 0.08); + --navbar-link-border-color: transparent; + --navbar-link-hover-border-color: rgba(42, 157, 143, 0.2); + --navbar-subdued-color: #{$lum-text}; + --navbar-subdued-hover-color: #{$lum-teal}; + --navbar-subdued-hover-bg: rgba(42, 157, 143, 0.08); + --navbar-title-color: #{$lum-text}; + --navbar-title-color-hover: #{$lum-teal}; + border-bottom: none !important; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06), 0 2px 8px rgba(0, 0, 0, 0.04); - position: relative; &::before { content: ''; @@ -1011,9 +1028,5 @@ $lum-noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' wi height: 3px; background: linear-gradient(90deg, $lum-teal 0%, $lum-blue 100%); } - - .navbar-brand { color: $lum-text !important; } - .navbar-nav > li > a { color: $lum-text-sub !important; } - .navbar-nav > li > a:hover { color: $lum-teal !important; } } }