Files
dogfather-universe/workspace/material.html
T
DogFatherGitandClaude Opus 5 4e67f8a6c2 Der schwarze Bildschirm: der Dialog stand ausserhalb des Fensters
Patrick ueber den Support: „Sophie kann Abschnitt 3 und 4 nicht
bestaetigen, beim druecken kommt ein schwarzer Bildschirm."

DER DIALOG WAR DIE GANZE ZEIT DA -- nur nicht im Bild. Nachgebaut auf
einer KOPIE der echten Datenbank, mit einem echten Browser, und dann
gemessen statt vermutet:

    position         absolute    statt fixed
    oben im Fenster   -143 px    also oberhalb des Sichtbaren

`module.css` setzte `.dialog { position: relative }`. Damit war die
Zentrierung des Browsers ueberschrieben: Ein Dialog aus `showModal()`
gehoert mit `position: fixed` in die Mitte des SICHTBAREN FENSTERS,
mit `relative` landet er im Dokumentfluss nahe dem SEITENANFANG. Wer
nach unten gescrollt hatte, sah nur noch den abdunkelnden Schleier --
einen schwarzen Bildschirm.

WARUM AUSGERECHNET „ABSCHNITT 3 UND 4"

Gar nicht wegen dieser beiden. Sophie hatte 1 und 2 schon bestaetigt,
dort gibt es keinen Knopf mehr -- 3 und 4 waren die einzigen, die sie
ueberhaupt noch druecken konnte, und sie stehen am weitesten unten.
Der Fehler hing nie an den Abschnitten, sondern an der Scrollhoehe.
Haette ich die Meldung woertlich genommen und in den Unterweisungen
gesucht, haette ich an der falschen Stelle gegraben.

ES BETRAF JEDEN DIALOG IM HAUS

22 Aufrufe von `showModal()` in 10 Dateien -- vom Loeschen einer Datei
ueber das Bearbeiten einer Aufgabe bis zum Eintragen eines
Monatsziels. Auf kurzen Seiten fiel es nie auf, weil dort niemand
scrollt. Keine einzige Pruefung im Haus hatte je einen Dialog
geoeffnet, NACHDEM sie gescrollt hat.

`relative` stand dort fuer die beiden Pseudo-Elemente (Leuchtschiene
und Lichtsaum) -- die brauchen einen positionierten Vorfahren, und
`fixed` ist ebenfalls einer. `inset: 0` und `margin: auto` schreiben
die Zentrierung jetzt ausdruecklich hin, statt sich auf eine Vorgabe
zu verlassen, die diese Datei selbst ueberschreibt.

WAS ICH FAST KAPUTT GEMACHT HAETTE

Mein erster Entwurf setzte zusaetzlich `max-height` und
`overflow: auto` auf den Dialog. Das waere ein Rueckschritt gewesen:
Das Rollen ist eine Ebene tiefer laengst geloest (`.dialog > form`),
gemessen am 25.09.2026 ueber vier Bildschirmgroessen, nachdem Miss
gemeldet hatte, dass sie aus einem Fenster nicht mehr herauskam. Dort
haengen auch die festen Kopf- und Fusszeilen -- und `position: sticky`
gilt immer zum naechsten rollenden Vorfahren. Ein zweiter Rollbereich
darueber haette genau die wieder geloest. Wieder entfernt;
`mess-dialog-ausgang` meldet unveraendert auf allen vier Groessen
„Kommt man heraus? JA".

NEU: pruef-dialog-sichtbar.mjs (18 Pruefungen, 0 Fehler)

Drei Ebenen, und die unterste allein waere zu wenig:

  * Im Quelltext: keine Regel darf `.dialog` wieder aus dem Fenster
    nehmen -- in ALLEN Stilvorlagen, nicht nur in module.css.
  * Am echten Bildschirm: zwei verschiedene Dialoge auf zwei
    verschiedenen Seiten, je auf Computer und Handy, jedes Mal ganz
    nach unten gescrollt (663 bis 1216 px).
  * Die Gegenprobe: Ein aus dem Fenster geschobener Dialog MUSS
    auffallen. Ohne sie waere „er steht im Bild" womoeglich eine
    Zeile, die immer wahr ist.

DREI MEINER EIGENEN MESSUNGEN WAREN ZUERST FALSCH, nicht der Code:
Die Textsuche fand Kommentare und `.dialog > *` (die Kinder DUERFEN
relativ sein); die Schulungstabellen entstehen erst beim ersten
Zugriff; und die Auswahl fuer den zweiten Dialog war seit dem
Schnell-Eintrag veraltet -- der erste Knopf oeffnet dort gar keinen
Dialog mehr. Alle drei berichtigt, bevor sie als Befund durchgingen.

NICHT VON MIR, aber beim Nachmessen aufgefallen: pruef-css-klassen
meldet 44 statt 42 Schriftgroessen unter 11,5 px (uebersicht.css,
wissen.css). Meine Aenderung fasst keine einzige Schriftgroesse an --
module.css hat vorher wie nachher denselben Wert. Der Befund ist
aelter und gehoert nicht hierher.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-05 19:32:53 +02:00

152 lines
6.6 KiB
HTML

<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Dogi-Media · Team Dogi</title>
<meta name="robots" content="noindex, nofollow" />
<!-- app.webmanifest, NICHT crew.webmanifest -- die Adresse biegt es um.
Der Server ersetzt den Pfad auf crew. an EINER Stelle
(crew-adresse.js). Wer hier das Crew-Manifest direkt nennt,
macht daraus eine zweite Stelle, die beim naechsten Umbau
vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610051932" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610051932" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610051932" />
<link rel="stylesheet" href="assets/css/start.css?v=202610051932" />
<link rel="stylesheet" href="assets/css/material.css?v=202610051932" />
<link rel="stylesheet" href="assets/css/module.css?v=202610051932" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610051932" />
</head>
<body class="start" data-ton="42" data-buehne="studio">
<div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5l-7 7 7 7"/></svg>
<span class="zurueck-knopf__text">Übersicht</span>
</button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Dogi-Media</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<main class="inhalt inhalt--breit" id="haupt" aria-busy="true">
<section class="kopf-zeile">
<div>
<p class="marke" id="ober">Community</p>
<h1 class="titel">Dogi-Media</h1>
<p class="unterzeile">
Bilder und Videos zum Posten. <strong>Jedes nur einmal</strong> — wer es
nimmt, hat es; danach ist es für alle anderen weg.
</p>
</div>
</section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- EINSTELLEN — nur für das Team. Der Kasten steht gar nicht erst
da, wenn jemand nicht darf: Ein Formular, das beim Absenden eine
Absage bringt, ist schlimmer als keines. -->
<section class="m-neu" id="neu-block" hidden>
<h2 class="m-neu__titel">Etwas bereitstellen</h2>
<p class="m-neu__satz">
Bild oder Video aussuchen, kurz dazuschreiben, wofür es gut ist.
Sobald jemand es nimmt, verschwindet es aus der Liste.
</p>
<div class="m-neu__zeile">
<label class="feld-schild" for="m-datei">Bild oder Video</label>
<input type="file" id="m-datei" accept="image/*,video/*" />
</div>
<div class="m-neu__zeile">
<label class="feld-schild" for="m-text">Wofür ist es? (freiwillig)</label>
<textarea id="m-text" rows="2"
placeholder="z. B. „Für TikTok, passt zum Stream von gestern“"></textarea>
</div>
<!-- VON WANN BIS WANN (22.09.2026). Filipe: "welche laufen von
wan bis wann, das muss man auch machen koennen."
BEIDES FREIWILLIG: Der haeufigste Fall ist "gilt einfach".
Ein Pflichtfeld erzwaenge ein erfundenes Datum, und ein
erfundenes Datum ist schlechter als keins.
STEHT AUSSERHALB VON .m-neu__knoepfe -- das ist eine
Flex-Reihe fuer Knopf und Stand. Zwei Datumsfelder und ein
Hinweissatz darin waeren vier Flex-Kinder nebeneinander und
auf dem Handy eine Treppe. -->
<div class="m-neu__zeile m-neu__fenster">
<div class="m-neu__fenster-feld">
<label class="feld-schild" for="m-ab">Gilt ab (freiwillig)</label>
<input type="date" id="m-ab" />
</div>
<div class="m-neu__fenster-feld">
<label class="feld-schild" for="m-bis">Gilt bis (freiwillig)</label>
<input type="date" id="m-bis" />
</div>
</div>
<p class="feld-hinweis m-neu__fenster-satz">
Ohne Datum gilt es einfach — bis es jemand nimmt.
</p>
<div class="m-neu__knoepfe">
<button type="button" class="knopf knopf--klein" id="m-hoch">Bereitstellen</button>
<span class="m-neu__stand" id="m-stand" aria-live="polite"></span>
</div>
<!-- Hierhin zeichnet der gemeinsame Hochlader seinen Balken. -->
<div id="m-fortschritt" hidden></div>
</section>
<!-- DIE FREIEN ZUERST. Wer hierherkommt, will etwas holen; was schon
weg ist, interessiert danach. -->
<section class="m-liste-block">
<div class="m-kopf">
<h2 class="m-kopf__titel" id="frei-titel">Zum Mitnehmen</h2>
<p class="m-kopf__satz" id="frei-satz"></p>
<!-- KATEGORIEN (22.09.2026). Filipe: "mach kategorien welche sind
benutzt welche nicht welche sind noch offen, welche laufen
von wan bis wann."
Die Knoepfe werden im Skript gebaut, damit die Zahl daneben
aus den echten Daten kommt und nicht aus dem HTML -- eine
Zahl im Markup waere die, die beim naechsten Stueck falsch
dasteht.
DIE LEISTE IST DIE DES HAUSES (.filter mit .schritt), nicht
eine eigene. Auf dateien.html und bereich.html steht dieselbe
Reihe; eine dritte Bauart haette dasselbe anders ausgesehen
und beim naechsten Umbau nur an zwei von drei Stellen
mitgeaendert. -->
<div class="filter" id="m-kat" role="group" aria-label="Kategorie"></div>
</div>
<div class="m-raster" id="frei" aria-busy="true"></div>
</section>
<section class="m-liste-block" id="weg-block" hidden>
<div class="m-kopf">
<h2 class="m-kopf__titel">Schon benutzt</h2>
<p class="m-kopf__satz" id="weg-satz">
Damit nichts zweimal gepostet wird.
</p>
</div>
<div class="m-raster m-raster--weg" id="weg"></div>
</section>
<p class="m-laedt" id="laedt">Einen Moment …</p>
</main>
<script src="assets/js/meldung.js?v=202610051932" defer></script>
<script src="assets/js/nachfrage.js?v=202610051932" defer></script>
<script src="assets/js/hochladen.js?v=202610051932" defer></script>
<script src="assets/js/wahl.js?v=202610051932" defer></script>
<script src="assets/js/bereiche.js?v=202610051932" defer></script>
<script src="assets/js/installieren.js?v=202610051932" defer></script>
<script src="assets/js/kopf.js?v=202610051932" defer></script>
<script src="assets/js/glocke.js?v=202610051932" defer></script>
<script src="assets/js/material.js?v=202610051932" defer></script>
</body>
</html>