Fix iOS-Ansicht Menüelemente

This commit is contained in:
2026-08-15 20:12:11 +02:00
parent fa64cbc4a4
commit 4c9f69dda1
4 changed files with 52 additions and 8 deletions

View File

@@ -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;