From 11935d419a4e18d5e7a07a73ecfb8b25547759d5 Mon Sep 17 00:00:00 2001 From: MarekWo Date: Thu, 1 Jan 2026 17:31:44 +0100 Subject: [PATCH] fix: Resolve PWA viewport corruption on page navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: Bootstrap offcanvas leaves backdrop/body classes in DOM when navigating via window.location.href, causing viewport issues. Changes: - Remove hamburger menu button from DM navbar (caused overflow) - Reduce menu button icon size on channels (remove font-size override) - Add global navigateTo() function in app.js and contacts.js - Function closes offcanvas, removes backdrops, clears body classes - Replace all window.location.href calls with navigateTo() - Updated navigation in: base.html, contacts*.html templates - Add 100ms delay before navigation to ensure cleanup completes This fixes the issue where: 1. Opening offcanvas menu on main page 2. Navigating to DM or Contact Management 3. Returning to main page Results in corrupted viewport with hidden status bar 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- app/static/js/app.js | 29 ++++++++++++++++++++++++++++ app/static/js/contacts.js | 24 +++++++++++++++++++++++ app/templates/base.html | 6 +++--- app/templates/contacts-existing.html | 4 ++-- app/templates/contacts-manage.html | 6 +++--- app/templates/contacts-pending.html | 4 ++-- app/templates/contacts_base.html | 2 +- app/templates/dm.html | 3 --- 8 files changed, 64 insertions(+), 14 deletions(-) diff --git a/app/static/js/app.js b/app/static/js/app.js index 8af400d..dd7f966 100644 --- a/app/static/js/app.js +++ b/app/static/js/app.js @@ -16,6 +16,35 @@ let unreadCounts = {}; // Track unread message counts per channel let dmLastSeenTimestamps = {}; // Track last seen DM timestamp per conversation let dmUnreadCounts = {}; // Track unread DM counts per conversation +/** + * Global navigation function - closes offcanvas and cleans up before navigation + * This prevents Bootstrap backdrop/body classes from persisting after page change + */ +window.navigateTo = function(url) { + // Close offcanvas if open + const offcanvasEl = document.getElementById('mainMenu'); + if (offcanvasEl) { + const offcanvas = bootstrap.Offcanvas.getInstance(offcanvasEl); + if (offcanvas) { + offcanvas.hide(); + } + } + + // Remove any lingering Bootstrap classes/backdrops + document.body.classList.remove('modal-open', 'offcanvas-open'); + document.body.style.overflow = ''; + document.body.style.paddingRight = ''; + + // Remove any backdrops + const backdrops = document.querySelectorAll('.offcanvas-backdrop, .modal-backdrop'); + backdrops.forEach(backdrop => backdrop.remove()); + + // Navigate after cleanup + setTimeout(() => { + window.location.href = url; + }, 100); +}; + // Initialize on page load document.addEventListener('DOMContentLoaded', async function() { console.log('mc-webui initialized'); diff --git a/app/static/js/contacts.js b/app/static/js/contacts.js index d851aba..2554e60 100644 --- a/app/static/js/contacts.js +++ b/app/static/js/contacts.js @@ -10,6 +10,30 @@ * - Mobile-first design */ +// ============================================================================= +// Global Navigation Helper +// ============================================================================= + +/** + * Global navigation function - cleans up DOM before navigation + * This prevents viewport issues when navigating between pages + */ +window.navigateTo = function(url) { + // Remove any lingering Bootstrap classes/backdrops + document.body.classList.remove('modal-open', 'offcanvas-open'); + document.body.style.overflow = ''; + document.body.style.paddingRight = ''; + + // Remove any backdrops + const backdrops = document.querySelectorAll('.offcanvas-backdrop, .modal-backdrop'); + backdrops.forEach(backdrop => backdrop.remove()); + + // Navigate after cleanup + setTimeout(() => { + window.location.href = url; + }, 100); +}; + // ============================================================================= // State Management // ============================================================================= diff --git a/app/templates/base.html b/app/templates/base.html index 15de2bf..ca6a654 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -41,7 +41,7 @@ @@ -63,14 +63,14 @@ Manage Channels - - diff --git a/app/templates/contacts-existing.html b/app/templates/contacts-existing.html index 0a021ac..7efdcbd 100644 --- a/app/templates/contacts-existing.html +++ b/app/templates/contacts-existing.html @@ -18,10 +18,10 @@
- -
diff --git a/app/templates/contacts-manage.html b/app/templates/contacts-manage.html index bd94443..b1a0007 100644 --- a/app/templates/contacts-manage.html +++ b/app/templates/contacts-manage.html @@ -7,7 +7,7 @@ Contact Management
-
@@ -44,7 +44,7 @@ -