diff --git a/public/app.js b/public/app.js index 236b8ac..e2a6bb7 100644 --- a/public/app.js +++ b/public/app.js @@ -1678,6 +1678,20 @@ function preventIosFocusZoom() { } preventIosFocusZoom() +// Installierte App auf dem iPhone: Mit durchsichtiger Statusleiste (black-translucent) ist der +// Layout-Bereich oft um die Hoehe der Statusleiste kuerzer als der Bildschirm (bekannter WebKit-Fehler). +// Ist die Seite kuerzer als der Bildschirm, haengen fixierte Leisten dann so weit ueber dem unteren Rand. +// Abhilfe: Seite mindestens bildschirmhoch (--kb-screen-h in login.css/kundenbereich.css). Die Hoehe +// kommt aus screen.*, weil innerHeight/100dvh in diesem Zustand selbst zu kurz sein koennen. +function syncIosStandaloneHeight() { + if (!isIosDevice() || !isStandaloneApp()) return + const landscape = window.matchMedia('(orientation: landscape)').matches + const full = landscape ? Math.min(screen.width, screen.height) : Math.max(screen.width, screen.height) + if (full > 0) document.documentElement.style.setProperty('--kb-screen-h', `${full}px`) +} +syncIosStandaloneHeight() +window.addEventListener('resize', syncIosStandaloneHeight) + // App-Installation (Homescreen) und Offline-Seite; zwischengespeichert wird nur die Offline-Seite (sw.js) if ('serviceWorker' in navigator && window.isSecureContext) { window.addEventListener('load', () => { diff --git a/public/kundenbereich.css b/public/kundenbereich.css index aa9954e..c3733ea 100644 --- a/public/kundenbereich.css +++ b/public/kundenbereich.css @@ -590,11 +590,12 @@ button.kb-avatar:disabled { cursor: default; box-shadow: none; } .kb-invoices .inv-actions .btn-link:first-child:not(:last-child) { flex: 1.7; } /* Chat: fuellt den Platz zwischen App-Leiste und Tab-Leiste. 100dvh folgt auf Android der Tastatur - (interactive-widget=resizes-content); auf iOS bleibt die Hoehe, Safari schiebt das Feld selbst hoch */ + (interactive-widget=resizes-content); auf iOS bleibt die Hoehe, Safari schiebt das Feld selbst hoch. + Installierte App auf dem iPhone: Bildschirmhoehe (--kb-screen-h), dvh ist dort teils zu kurz */ #view-chat.active { display: flex; flex-direction: column; height: calc(100vh - var(--kb-appbar-h) - var(--kb-tabbar-h) - 20px); - height: calc(100dvh - var(--kb-appbar-h) - var(--kb-tabbar-h) - 20px); + height: calc(max(100dvh, var(--kb-screen-h, 0px)) - var(--kb-appbar-h) - var(--kb-tabbar-h) - 20px); } #view-chat .kb-head { flex: none; margin-bottom: 12px; } #view-chat .chat-box { flex: 1 1 auto; min-height: 0; height: auto; padding: 10px; border-radius: 20px; } diff --git a/public/login.css b/public/login.css index 8db3562..c602f14 100644 --- a/public/login.css +++ b/public/login.css @@ -11,6 +11,9 @@ --glass: rgba(255, 255, 255, 0.25); --glass-border: rgba(255, 255, 255, 0.12); min-height: 100svh; + /* Installierte App auf dem iPhone: mindestens bildschirmhoch, sonst haengen fixierte Leisten + ueber dem unteren Rand (iOS-Fehler bei black-translucent, siehe syncIosStandaloneHeight in app.js) */ + min-height: max(100svh, var(--kb-screen-h, 0px)); margin: 0; background: #0a0a0a; color: #fff;