diff --git a/web/html/app.css b/web/html/app.css index cc29512..3096023 100644 --- a/web/html/app.css +++ b/web/html/app.css @@ -42,7 +42,19 @@ body { #app { max-width: 30rem; margin: 0 auto; - padding: 1.5rem 1rem calc(2rem + env(safe-area-inset-bottom)); + /* Sicherheitsabstände von iOS mit einrechnen. + Zusammen mit viewport-fit=cover und + apple-mobile-web-app-status-bar-style=black-translucent zeichnet + die installierte App UNTER Uhrzeit, WLAN- und Batteriesymbol. + Ohne den oberen Abstand liegt die Kopfleiste darunter und ist + nicht mehr antippbar. + + Die Seitenabstände sind für das Querformat: Dort liegt die + Aussparung der Frontkamera links oder rechts. */ + padding-top: calc(1.5rem + env(safe-area-inset-top)); + padding-right: calc(1rem + env(safe-area-inset-right)); + padding-bottom: calc(2rem + env(safe-area-inset-bottom)); + padding-left: calc(1rem + env(safe-area-inset-left)); } .loading { color: var(--muted); text-align: center; padding: 3rem 0; } @@ -139,6 +151,31 @@ a { color: var(--accent); } gap: .75rem; margin-bottom: 1rem; min-height: 2.6rem; + + /* Beim Scrollen oben stehen bleiben. + Bei installierten iOS-Apps ist die Statusleiste durchsichtig - + ohne diese Regel liefe der Listeninhalt sichtbar hinter Uhrzeit + und Batteriesymbol durch. Der negative Versatz und das Auffüllen + darüber sorgen dafür, dass die Fläche bis zum oberen Bildschirmrand + eingefärbt bleibt. */ + position: sticky; + top: 0; + z-index: 20; + margin-top: calc(-1 * env(safe-area-inset-top)); + padding-top: env(safe-area-inset-top); + background: var(--bg); +} + +/* Ein weicher Übergang statt einer harten Kante beim Scrollen. */ +.app-bar::after { + content: ""; + position: absolute; + left: 0; + right: 0; + bottom: -.6rem; + height: .6rem; + background: linear-gradient(to bottom, var(--bg), transparent); + pointer-events: none; } /* Drei Bereiche mit festem Verhalten: links zurück, Mitte der Titel @@ -239,6 +276,10 @@ ul.menu-panel { z-index: 30; top: calc(100% + .3rem); right: 0; + /* Bei sehr langen Menüs nicht über den unteren Bildschirmrand + hinauslaufen. */ + max-height: calc(100vh - 8rem - env(safe-area-inset-top)); + overflow-y: auto; min-width: 15rem; max-width: min(20rem, calc(100vw - 2rem)); list-style: none; @@ -898,7 +939,8 @@ body.scanning { overflow: hidden; } display: flex; flex-direction: column; gap: 1rem; - padding: 1rem calc(1rem + env(safe-area-inset-right)) + padding: calc(1rem + env(safe-area-inset-top)) + calc(1rem + env(safe-area-inset-right)) calc(1rem + env(safe-area-inset-bottom)) calc(1rem + env(safe-area-inset-left)); overflow-y: auto; @@ -1477,7 +1519,9 @@ button.archive-head .chev { color: var(--muted); } .app-footer { max-width: 30rem; margin: 0 auto; - padding: 1.5rem 1rem calc(1.5rem + env(safe-area-inset-bottom)); + padding: 1.5rem calc(1rem + env(safe-area-inset-right)) + calc(1.5rem + env(safe-area-inset-bottom)) + calc(1rem + env(safe-area-inset-left)); text-align: center; font-size: .82rem; color: var(--muted); @@ -1586,8 +1630,8 @@ select.category-select:not([data-empty]) { border-color: var(--accent); } .update-banner { position: fixed; z-index: 80; - left: 1rem; - right: 1rem; + left: calc(1rem + env(safe-area-inset-left)); + right: calc(1rem + env(safe-area-inset-right)); bottom: calc(1rem + env(safe-area-inset-bottom)); max-width: 28rem; margin: 0 auto; diff --git a/web/html/datenschutz.html b/web/html/datenschutz.html index d790574..da17bb1 100644 --- a/web/html/datenschutz.html +++ b/web/html/datenschutz.html @@ -2,7 +2,7 @@
- +