28e2ca6b01
pwa.css safe-area padding-bottom rule and body::after fill-overlay commented out. glass.css nav-bottom uses margin-bottom: 0 instead; --hidden state uses translateY(100%) + negative margin so the bar disappears without leaving a gap. layout.css removes redundant padding-bottom from .nav-bottom rule.
100 lines
3.4 KiB
CSS
100 lines
3.4 KiB
CSS
/**
|
|
* Modul: PWA Native Feel
|
|
* Zweck: Natives Touch- und Scrollverhalten, Safe Areas, Touch-Targets
|
|
* Abhängigkeiten: tokens.css, layout.css
|
|
*/
|
|
|
|
/* ── Kein Rubber-Banding, kein Body-Scroll ──
|
|
* overflow: hidden verhindert, dass body scrollbar wird, falls ein
|
|
* Element minimal überläuft. overscroll-behavior: none deaktiviert
|
|
* Pull-to-Refresh und Rubber-Banding. */
|
|
html, body {
|
|
overflow: hidden;
|
|
overscroll-behavior: none;
|
|
}
|
|
|
|
/* ── Kein Tap-Highlight auf allen Elementen (Android Chrome) ──
|
|
* reset.css setzt es nur auf html; hier global für alle Elemente */
|
|
* {
|
|
-webkit-tap-highlight-color: transparent;
|
|
}
|
|
|
|
/* ── Safe Area Insets (Notch, Dynamic Island, Gesture Bar) ──
|
|
* Nur horizontale Safe Areas auf body. Vertikale Safe Areas werden über
|
|
* .app-shell (padding-top im Standalone-Modus) und die Seiten-/Nav-Berechnungen
|
|
* (padding-bottom via --safe-area-inset-bottom) gehandhabt.
|
|
* KEIN body padding-top/bottom - das würde .app-shell (height: 100dvh)
|
|
* um den Safe-Area-Betrag aus dem Viewport schieben und Scroll-Bleed erzeugen. */
|
|
body {
|
|
padding-left: env(safe-area-inset-left);
|
|
padding-right: env(safe-area-inset-right);
|
|
}
|
|
|
|
/* ── Bottom Nav über der Gesture Bar ──
|
|
* layout.css nutzt --safe-area-inset-bottom Token;
|
|
* hier als Fallback direkt via env() */
|
|
/*.nav-bottom {
|
|
padding-bottom: env(safe-area-inset-bottom);
|
|
}*/
|
|
|
|
/* Touch-Targets werden über tokens.css (--target-sm/md/lg) und
|
|
* komponentenspezifische Styles gehandhabt - siehe Redesign Phase E.
|
|
* Keine globale min-size-Regel hier, da sie mit dem bestehenden
|
|
* Touch-Target-System kollidiert (::before-Expansion auf kleinen Elementen). */
|
|
|
|
/* ── Smooth Momentum-Scrolling in scrollbaren Containern ── */
|
|
.scroll-container,
|
|
.nav-bottom__scroll {
|
|
overflow-y: auto;
|
|
-webkit-overflow-scrolling: touch;
|
|
overscroll-behavior-y: contain;
|
|
}
|
|
|
|
/* ── Kein Text-Selection in UI-Elementen (nur in Content-Bereichen) ── */
|
|
nav,
|
|
.nav-bottom,
|
|
.nav-sidebar,
|
|
.cal-toolbar,
|
|
.tasks-toolbar,
|
|
.notes-toolbar,
|
|
.contacts-toolbar,
|
|
.modal-panel__header {
|
|
-webkit-user-select: none;
|
|
user-select: none;
|
|
}
|
|
|
|
/* ── Standalone-Modus: Status-Bar-Bereich berücksichtigen ── */
|
|
@media (display-mode: standalone) {
|
|
/* padding-top auf .app-shell (nicht body): So bleibt app-shell exakt 100dvh
|
|
* hoch und überläuft den Viewport nicht - body-padding hätte .app-shell
|
|
* nach unten verschoben und Scroll-Bleed verursacht. */
|
|
.app-shell {
|
|
padding-top: env(safe-area-inset-top);
|
|
}
|
|
|
|
/* Kein Scroll-Bleed - Content bleibt in seinem Container */
|
|
.app-content {
|
|
overscroll-behavior-y: contain;
|
|
}
|
|
|
|
/* iOS PWA: Schwarzen Streifen unter der Nav verhindern.
|
|
* iOS reserviert den Home-Indicator-Bereich unterhalb des CSS-Viewports.
|
|
* body::after füllt diesen Bereich mit dem gleichen Glass-Hintergrund wie die Nav.
|
|
* z-index: z-nav - 1 (unter der Nav) - dadurch rendert die Nav immer oben.
|
|
* Im Überlappungsbereich (Nav-Padding = Safe-Area) liegt die Nav darüber;
|
|
* in einem eventuellen Spalt zwischen Nav-Unterkante und Displayrand liegt
|
|
* body::after sichtbar - optisch identisch mit der Nav. */
|
|
/* body::after {
|
|
content: '';
|
|
position: fixed;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: env(safe-area-inset-bottom, 0px);
|
|
background-color: var(--glass-bg);
|
|
backdrop-filter: var(--blur-md) saturate(180%);
|
|
-webkit-backdrop-filter: var(--blur-md) saturate(180%);
|
|
z-index: calc(var(--z-nav) - 1);
|
|
}*/
|
|
}
|