Compare commits

...
1 Commits
Author SHA1 Message Date
alientimandClaude Sonnet 5 0074e48e09 Responsive-Fixes per echtem Playwright/DevTools-Test verifiziert, zwei Bugs behoben
Auf Nachfrage tatsaechlich mit Browser-DevTools (Playwright/Chromium,
lokal installiert) statt nur per CSS-Analyse geprueft -- echte
Screenshots + automatisierte Overflow-Pruefung auf iPhone-16-Pro- (393x852),
iPad- (820x1180 Hoch-/1180x820 Querformat) und Desktop-Viewport (1440x900)
gegen die echte Live-Instanz auf Testsystem-Update-Restart.

Dabei zwei echte Bugs gefunden und behoben:

1. Topbar-Ueberlappung (ALLE Seiten, jeder eingeloggte Nutzer, jedes
   iPhone/kleine Handy): .topbar-left (Seitentitel) und .topbar-right
   (Pruef-Countdown- + DHCP-Pille) sind beide flex:1 ohne Zeilenumbruch --
   auf 393px Breite quetscht das den Titel auf eine Breite, die kleiner
   ist als sein eigener Inhalt braucht, wodurch der Titeltext sichtbar
   ueber seine Spalte hinauslief und mit der Pille kollidierte (per
   getBoundingClientRect nachgewiesen: 24.5px Ueberlauf). Fix: ab 560px
   Breite bricht die Topbar um, Titel und Pillen bekommen je eine eigene
   Zeile.

2. HTTP-/HTTPS-Port-Felder auf der NGINX-Seite stapelten trotz
   entsprechender Media-Query-Regel nicht auf Handy-Breite -- Ursache:
   inline style="flex:1" auf den .field-Divs hat Vorrang vor jeder externen
   @media-Regel, ganz gleich wie spezifisch. Fix: inline style entfernt,
   neue Klasse .field--half stattdessen -- die Mobile-Stapel-Regel greift
   jetzt wie vorgesehen.

Zusaetzlich EINE eigene Aenderung aus v1.0.9 wieder zurueckgenommen, weil
sie sich beim Testen als unnoetig und riskant herausstellte:
- .table-wrap: overflow-x:auto (aus v1.0.9) wieder auf overflow:hidden
  zurueckgesetzt. Grund: JEDES Template mit .table-wrap hat bereits einen
  eigenen <div style="overflow-x:auto;"> exakt um die <table> -- die
  zusaetzliche Scroll-Faehigkeit der Karte selbst war komplett redundant
  und erzeugte einen verschachtelten doppelten Scroll-Container um
  denselben Inhalt. Beim Testen der aufklappbaren Rechte-Tabelle
  (Gruppen-Seite) fuehrte das zu Inhalten, die bei negativem x dauerhaft
  unsichtbar wurden. table.data-table { min-width: 560px; } bleibt
  bestehen (harmlos, der jeweils vorhandene innere Wrapper scrollt
  weiterhin korrekt).

Eine dritte vermutete Ursache (aufgeklappte Rechte-Tabelle "verschwindet"
beim Anklicken des Chevrons) stellte sich NICHT als echter App-Bug heraus,
sondern als Artefakt von Playwrights eigenem automatischem
"scroll-into-view-vor-Klick"-Verhalten (der Chevron sitzt in der letzten
Tabellenspalte) -- per direktem JS-Aufruf von toggleDetail() ohne
Playwright-Klick liess sich das nicht reproduzieren, die Seite verhaelt
sich für echte Nutzer korrekt.

Alle 8 getesteten Seiten x 4 Viewports (32 Kombinationen) zeigen nach den
Fixes keinerlei horizontalen Overflow mehr (dokumentseitenweite
scrollWidth == clientWidth in jedem Fall).

VERSION 1.0.9 -> 1.0.10.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 14:29:48 +02:00
3 changed files with 32 additions and 11 deletions
+1 -1
View File
@@ -1 +1 @@
1.0.9
1.0.10
+29 -8
View File
@@ -693,14 +693,17 @@ button { font-family: inherit; }
background: var(--bg-card);
border: 1px solid var(--border-soft);
border-radius: var(--radius);
/* overflow-x:auto statt hidden -- Tabellen mit vielen Spalten (Geräte,
Switche, Papierkorb, ...) würden auf Handy/Tablet sonst entweder die
ganze Seite waagerecht aufreißen oder (mit overflow:hidden) Spalten
einfach lautlos abschneiden. Scrollt jetzt NUR die Tabelle selbst,
der Rest der Seite bleibt an Ort und Stelle -- dasselbe Muster wie
Bootstraps .table-responsive. */
overflow-x: auto;
overflow-y: hidden;
/* Zurück auf overflow:hidden (nur für die abgerundeten Ecken) --
JEDES Template, das .table-wrap verwendet, hat bereits einen eigenen
<div style="overflow-x:auto;"> exakt um die <table> herum (nicht um
die ganze Karte). overflow-x:auto zusätzlich HIER hätte einen zweiten,
verschachtelten Scroll-Container um denselben Inhalt erzeugt -- live
auf einem iPhone-Viewport nachgewiesen: bei der aufklappbaren
Rechte-Tabelle (Gruppen-Seite) landete der Inhalt dadurch dauerhaft
unsichtbar bei negativem x. Die Tabellen scrollen also weiterhin
horizontal, nur über den bereits vorhandenen inneren Wrapper, nicht
zusätzlich über die Karte selbst. */
overflow: hidden;
}
.table-wrap table.data-table { min-width: 560px; }
@@ -810,6 +813,12 @@ table.data-table {
========================================================================== */
.field { margin-bottom: 15px; }
/* Zwei .field nebeneinander in einer .flex-Zeile (z.B. HTTP-/HTTPS-Port
bei NGINX) -- als Klasse statt inline style="flex:1", damit die
Mobile-Stapel-Regel (siehe @media max-width:640px weiter unten) sie
per externem Stylesheet überschreiben kann; ein inline style gewinnt
sonst grundsätzlich gegen jede @media-Regel, ganz gleich wie spezifisch. */
.field--half { flex: 1; min-width: 0; }
.field label {
display: block;
font-size: 12.5px;
@@ -1351,4 +1360,16 @@ select {
Breite ein statt als schmaler Block rechts zu kleben. */
.section-head > .btn,
.section-head > .btn-sm { flex: 1 1 100%; }
/* Auf einem iPhone quetschen die beiden rechten Topbar-Pillen (Prüf-
Countdown + DHCP) .topbar-left (flex:1 1 0%, min-width:0) so weit
zusammen, dass der Seitentitel über seine eigene Spaltenbreite
hinausläuft und sichtbar mit der Pille kollidiert (per Playwright-
Screenshot auf 393px Breite nachgewiesen: .topbar-title ragte 24.5px
über .topbar-lefts berechnete Breite hinaus). Titel und Pillen
bekommen ab hier je eine eigene Zeile statt sich einen Platz zu
teilen, der für beide zusammen nicht reicht. */
.topbar { flex-wrap: wrap; row-gap: 6px; }
.topbar-left { flex: 1 1 100%; }
.topbar-right { flex: 1 1 100%; justify-content: flex-start; }
}
+2 -2
View File
@@ -43,11 +43,11 @@
<div class="field-hint">"_" ist nginx' Catch-all (Standard für interne Instanzen ohne eigene Domain) — für Let's Encrypt muss hier die tatsächliche, öffentlich auflösbare Domain stehen.</div>
</div>
<div class="flex gap-2">
<div class="field" style="flex:1;">
<div class="field field--half">
<label for="http_port">HTTP-Port</label>
<input type="number" name="http_port" id="http_port" min="1" max="65535" value="{{ http_port }}" required>
</div>
<div class="field" style="flex:1;">
<div class="field field--half">
<label for="https_port">HTTPS-Port</label>
<input type="number" name="https_port" id="https_port" min="1" max="65535" value="{{ https_port }}" required>
</div>