fix(ui): Kopfleiste auf dem Handy hatte 0px Abstand nach oben

Die Regeln der schmalen Ansicht griffen nie: Ein Inline-Stil schlägt
jede Klassenregel, und `padding: '0 14px'` samt `paddingTop:
var(--safe-top)` stand genau dort. Gemessen kam padding-top als 0px an
statt als 8px - Titel und Nutzerbereich klebten am oberen Fensterrand.
Alle Abstaende stehen jetzt im CSS-Block, schmal 14px oben und 10px
unten.

Dazu das mitgelieferte App-Symbol neu gezeichnet: Die drei PNG lagen
als Graustufen vor, der indigo Verlauf war zu Schwarz eingeebnet. Die
Wolke besteht jetzt aus drei Kreisen und einem Rechteck dazwischen -
gerade Unterkante, keine Kerben in der Silhouette.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-24 14:26:49 +02:00
1 parent 9f44215698
commit 9a2f90c89b
6 files changed
+58 -12

No files matched your search

+27
View File
@@ -1309,6 +1309,33 @@ Geprüft mit Go-Tests, nicht am laufenden Anbieter:
- [ ] Bild in PocketID entfernen → das alte bleibt hier stehen (so gebaut:
gelöscht wird nur beim Austausch, nicht auf Verdacht)
## Kopfleiste auf dem Handy (24.08.2026)
Gemessen bei 412×915, angemeldet:
| | vorher | nachher |
|---|---|---|
| `padding-top` | **0px** | 14px |
| `padding-bottom` | **0px** | 10px |
| Oberkante Titel | 8px | 22px |
Ursache war nicht der gewählte Wert, sondern dass die Regel nie griff: Der
Inline-Stil (`padding: '0 14px'`, `paddingTop: 'var(--safe-top)'`) schlug die
Klassenregel der schmalen Ansicht. Alle Abstände stehen jetzt im CSS-Block.
- [ ] Auf dem Handy gegenprüfen, installiert **und** im Browser-Tab – nur
installiert ist `--safe-top` ungleich 0.
## Mitgeliefertes App-Symbol (24.08.2026)
Die drei PNG lagen als **Graustufen** vor: Der indigo Verlauf war zu Schwarz
eingeebnet, die Unterkante der Wolke lief schief aus. Neu gezeichnet (drei
Kreise plus Rechteck dazwischen, keine Freihandkurve) und in RGBA gerendert.
- [ ] Nach `docker compose pull` erscheint das neue Symbol im Tab
- [ ] Auf dem Startbildschirm frühestens nach Neu-Installieren (Chrome hält
eine eigene Kopie)
## Automatisiert geprüft (22.08.2026)
Diese Punkte hat Claude per API/`curl` gegen Wegwerf-Konten durchgespielt; sie
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

+12 -3
View File
@@ -6,7 +6,16 @@
</linearGradient>
</defs>
<rect width="512" height="512" rx="114" fill="url(#bg)"/>
<!-- Wolke: zwei Kuppen auf einer Grundfläche, bewusst flächig statt Kontur,
damit das Motiv auch bei 48 px noch als Wolke lesbar bleibt. -->
<path fill="#ffffff" d="M170 356q-46 0-78-32t-32-78q0-42 27-73t68-37q19-36 54-58t77-22q54 0 93 36t44 89q35 4 58 30t23 61q0 38-27 66t-66 28z"/>
<!-- Wolke aus drei Kreisen und einem Rechteck dazwischen.
Der Trick gegen Kerben in der Silhouette: Das Rechteck reicht **von
Mittelpunkt zu Mittelpunkt** der beiden äußeren Kreise und endet unten
auf derselben Höhe wie sie. So kreuzen sich nirgends zwei Ränder – die
Unterkante ist gerade, die Seiten sind rund. Eine abgerundete
Grundfläche ergab genau dort zwei kleine Dellen. -->
<g fill="#ffffff" transform="translate(0 17)">
<rect x="164" y="280" width="186" height="62"/>
<circle cx="256" cy="228" r="92"/>
<circle cx="164" cy="280" r="62"/>
<circle cx="350" cy="280" r="62"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 649 B

After

Width:  |  Height:  |  Size: 1004 B

+19 -9
View File
@@ -42,12 +42,14 @@ export default function PageHeader({ icon, title, meta, left, children }: Props)
const openSidebar = useSidebarToggle()
return (
<div className="aether-header" style={{
// Feste Höhe nur auf breiten Schirmen (siehe CSS unten). Auf dem Handy
// wächst die Leiste auf zwei Zeilen, statt ihren Inhalt zu verstecken.
padding: '0 14px',
// Statusleiste der installierten App. Die Kopfleiste ist jetzt die
// oberste Zeile der Anwendung – vorher lag darüber noch eine zweite.
paddingTop: 'var(--safe-top)',
// **Kein padding hier.** Die Abstände stehen samt und sonders im
// CSS-Block unten.
//
// Grund, gemessen: Ein Inline-Stil schlägt jede Klassenregel. Solange
// hier `padding: '0 14px'` und `paddingTop: 'var(--safe-top)'` standen,
// waren die Regeln der schmalen Ansicht wirkungslos – `padding-top`
// kam als 0px an statt als 8px, und die Titelzeile klebte am oberen
// Rand des Fensters. Im Browser fiel es auf, weil dort --safe-top 0 ist.
background: 'var(--color-surface)',
borderBottom: '1px solid var(--color-border)',
display: 'flex', alignItems: 'center', gap: 10,
@@ -146,7 +148,13 @@ export default function PageHeader({ icon, title, meta, left, children }: Props)
</div>
<style>{`
.aether-header { min-height: ${headerHeight - 1}px; }
/* Grundabstände. Oben kommt der Bereich der Statusleiste dazu –
in der installierten App ist die Kopfleiste die oberste Zeile. */
.aether-header {
min-height: ${headerHeight - 1}px;
padding: 0 14px;
padding-top: var(--safe-top);
}
/* Breit: erst die Bedienelemente der Ansicht, dann – durch eine
Trennlinie abgesetzt – der Nutzerbereich, ganz rechts. */
@@ -157,9 +165,11 @@ export default function PageHeader({ icon, title, meta, left, children }: Props)
}
@media not all and ${wideEnough} {
/* Schmal braucht die Zeile echte Luft: Ohne sie stoßen Titel und
Nutzerbereich direkt an die Adressleiste des Browsers. */
.aether-header {
padding-top: calc(8px + var(--safe-top));
padding-bottom: 8px;
padding-top: calc(14px + var(--safe-top));
padding-bottom: 10px;
}
/* Schmal: Nutzerbereich noch in der Titelzeile ganz rechts, die
Bedienelemente darunter über die volle Breite.