Files
dogfather-universe/workspace/unsere-seiten.html
T
DogFatherGitandClaude Opus 5 e7cd1984d8 Ein Rollenname im ausgelieferten Code, die Seite zu breit, und drei Pruefungen, die den Umbau verschlafen hatten
Filipe: "falls es noch was gibt was fehlt oder nicht richtig funktioniert,
auf dem handy oder auf dem pc, oder als installiert, ich will dass du das
alles abcheckst und machst dass jede seite reibungslos klappt."

Gemessen wurde der ganze Bestand: 26 Pruefdateien einzeln, dazu drei neue
Messungen fuer Dinge, die keine Pruefung ansieht. Von 37 roten Meldungen
aus dem Nachtlauf sind nach dieser Runde die haelfte erledigt -- und die
Haelfte davon war gar nicht kaputt.

=== ECHTE FEHLER ===

1. EIN ROLLENNAME STAND IM AUSGELIEFERTEN QUELLTEXT.
   `aufgaben.js` sagte "Modis moechten das uebernehmen -- du
   entscheidest". Diese Datei bekommt JEDER, der die Seite oeffnet:
   jeder Manager, jeder Scout, jeder Creator im anderen Haus. Der
   verborgene Zugang haelt genau so lange, wie der Name dort nicht
   steht. Er stammte aus der Bewerbungsspalte von gestern -- einen Tag
   alt, gefunden von pruef-modi-wortleck. Jetzt: "Jemand moechte das
   uebernehmen". Wer es ist, steht ohnehin mit Namen auf den Karten
   darunter, und die sieht nur, wer sie sehen darf.

2. DIE SUPPORT-SEITE WAR AUF JEDER BREITE UNTER 1440 px ZU BREIT --
   13 px auf dem Handy, 41 px auf dem Tablet quer, 30 px auf dem
   Laptop. Schuld war das weiche Licht, das ich in der Nacht eingebaut
   habe: `inset: -8% -4% 0`. Die vier Prozent rechts sahen nach einer
   Kleinigkeit aus; ein absolut gesetztes Element zaehlt aber zur
   Scrollbreite, auch mit `pointer-events: none` und `z-index: -1`.

   `pruef-breiten` hat es gemeldet und konnte nicht sagen, WAS es ist
   ("13px Ueberstand []") -- ein Pseudoelement hat keine Box im DOM.
   Gefunden hat es eine neue Messung, die JEDES echte Element abfragt:
   keines ragte heraus, und genau das war der Hinweis.
   Jetzt: 0 px auf allen neun Breiten, 38 Seiten, 84 252 Elemente.

3. EIN AUFGABENLINK IM REPORT WAR 27 x 18 px GROSS. Mit der Maus gut,
   mit dem Daumen nicht -- eine Fingerkuppe ist rund 45 px breit.
   Jetzt fuellt der Link die Zeile und ist 44 px hoch, aber nur auf
   schmalen Bildschirmen und an groben Zeigegeraeten. Die zweite
   Bedingung habe ich beim ersten Anlauf vergessen, und der Link blieb
   27 x 21 -- eine Regel, die nur unter idealen Bedingungen greift,
   hilft niemandem auf dem halben Weg dorthin.

4. EINE SEITE LUD DAS FALSCHE MANIFEST. `anruf-probe.html` verwies
   fest auf `crew.webmanifest`; die Seite ist aber fuer ALLE Rollen
   offen und damit auf beiden Adressen erreichbar. Wer sie im
   Agenturhaus oeffnet und die App installiert, bekam "DogFather
   Universe" mit dem Crew-Symbol auf den Startbildschirm. Alle anderen
   38 Seiten machen es richtig: `app.webmanifest`, und die Adresse
   biegt es um.

5. DER KNOPF "+ GIF HINZUFUEGEN" WAR 40 px HOCH, und der Kommentar
   daneben nannte das "die Hausgroesse". Die Hausgroesse sind 44 --
   fuenfmal in derselben Datei so begruendet. Die erste Reparatur
   griff nicht: Die Fingerregel stand 400 Zeilen VOR der Grundregel,
   und bei gleicher Staerke gewinnt die spaetere. Jetzt steht sie
   direkt dahinter, und der Knopf misst 133 x 44 am Finger, 133 x 40
   an der Maus.

   KEINE PRUEFUNG KONNTE DAS FINDEN: Die GIF-Tafel ist zu, solange
   niemand sie aufmacht, und alle Rundgaenge messen, was auf dem
   Bildschirm steht. Dafuer gibt es jetzt server/mess-gifs-handy.mjs.

6. ZWEI KLEINIGKEITEN AUS DER NACHT: eine Fehlerkennung ohne Satz
   (`unbekannter_punkt`) und eine Stelle in support.js, die den
   Serverfehler roh anzeigte statt durch `fehlerText` -- die zwei
   anderen Stellen derselben Datei machen es richtig. So entsteht eine
   Ausnahme: nicht aus Absicht, sondern weil man die Hausregel beim
   Neuschreiben nicht danebenliegen hatte.

7. TOTES CSS (.e-leerwahl, vier Regeln). Der Leerkasten ist am
   24.09. auf Filipes Wunsch wieder verschwunden, sein Stil blieb
   einen Tag laenger stehen.

=== ROT, ABER NICHT KAPUTT ===

Drei Pruefungen haben den Umbau vom 24.09. nicht mitbekommen:

  pruef-anruf meldete 31 Fehler und "ein Gespraech entsteht (403)".
  Sie meldete DogFather auf der AGENTUR-Adresse an und liess ihn dann
  die rechte Hand anrufen -- die es dort seit der Haustrennung nicht
  gibt. Der Server hatte recht. Jetzt telefoniert Team Dogi auf crew.,
  und der Creator bleibt auf workspace. -- seine Gegenprobe ist damit
  sogar schaerfer als vorher (ein Fremder aus dem ANDEREN Haus).
  96 -> 127 Pruefungen, 0 Fehler.

  pruef-crew-wand-bild erwartete vier Rollen auf der Zugangswand. Es
  sind fuenf, seit die linke Hand am 21.09. dazukam. Die Zeile stand
  unter einem Kommentar, der wortwoertlich vor festen Namen in
  Pruefungen warnt ("eine Zeitbombe mit Datum") -- und war selbst
  einer. Jetzt leitet sie die Rollen aus `rollenImHaus("crew")` ab,
  derselben Quelle, aus der der Server die Wand baut.

  pruef-entwicklung-kacheln rechnete noch mit "x von 68". Seit
  Filipes Wunsch ("es sollen nur die menge angezeigt werden die wir
  zutragen") ist das Ganze das, was jemandem zugetragen ist. Sie baut
  jetzt BEIDE Faelle -- eine Person mit vier zugetragenen Punkten und
  eine ohne -- und misst Ring, Bogen, Zeile und Vorleseschild gegen
  die Zuteilung. Dazu eine Gegenprobe mit einer Einschaetzung auf
  einem NICHT zugetragenen Punkt: zaehlt die Uebersicht sie mit,
  stuende dort 2 statt 1. 31 -> 34 Pruefungen, 0 Fehler.

=== WAS DIE BILDSCHAU ANGEHT ===

Meine eigene Messung meldete erst "Mitte 174 von 640" -- die Schau sah
kaputt aus. Sie war es nicht: `querySelector("img")` nahm das
Husky-Zeichen in der Kopfzeile statt des Bildes. Nachgemessen am
richtigen Element steht es auf 195 von 195 (Handy) und 640 von 640
(Rechner), und ein GIF oeffnet sich als GIF. Ein Messfehler, der wie
ein Befund aussieht, kostet mehr Zeit als gar keine Messung -- deshalb
steht die Begruendung jetzt im Quelltext der Messung.

GEMESSEN: pruef-breiten (9 Breiten, 38 Seiten, 84 252 Elemente),
pruef-support 63/0, pruef-gifs 17/0, pruef-chat 63/0, pruef-chat-optik
62/0, pruef-tippziele 11/0, pruef-css-klassen, pruef-struktur,
pruef-meldungen, pruef-modi-wortleck, pruef-crew-adresse,
pruef-installieren, pruef-aufgabenbrett, pruef-entwicklung -- alle 0
Fehler.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-25 12:31:21 +02:00

349 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Draußen · Das Rudel</title>
<meta name="robots" content="noindex, nofollow" />
<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=202609251230" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251230" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609251230" />
<link rel="stylesheet" href="assets/css/start.css?v=202609251230" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202609251230" />
<link rel="stylesheet" href="assets/css/module.css?v=202609251230" />
<link rel="stylesheet" href="assets/css/haus.css?v=202609251230" />
</head>
<body class="start">
<div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
<path d="M14.5 5.5 8 12l6.5 6.5" />
</svg>
<span class="zurueck-knopf__text">Zurück</span>
</button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Das&nbsp;Rudel</a> · Draußen</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">
<section class="kopf-zeile">
<div>
<p class="marke">Das Rudel · Draußen</p>
<h1 class="titel">Draußen</h1>
<p class="unterzeile">
Ob gerade gestreamt wird, wo du Dogi sonst findest — und wo dein
Rabatt wartet.
</p>
</div>
</section>
<!-- ==================================================================
WARUM DIESE SEITE AM 21.09.2026 UMGEBAUT WURDE
Filipe: "mach was anderes aus dieser seite oder mach es viel
krass und geiler, den wir haben ja jetzt den treff chat also ist
das schon fast unnoetig ... erstell was was mich von den socken
schmeisst. es soll wirklich sogar ein wow effekt fuer die
community ergeben." Dazu die eine Auflage: die Kachel bleibt.
WAS SIE VORHER WAR: zwei Karten mit zwei Adressen. Sauber
gebaut -- und trotzdem kam niemand ein zweites Mal wieder. Wer im
Rudel ist, kennt die Website. Den Rabattcode merkt man sich beim
ersten Mal.
DIE FRAGE, DIE WIRKLICH JEMAND HAT, IST EINE ANDERE: Laeuft er
gerade? Und wenn nicht -- wie lange noch? Darauf gab es im Rudel
bisher keine Antwort, obwohl das Haus sie seit dem 20.08. kennt:
postfach.dogfather-universe.com/live-status, derselbe Dienst, von
dem der oeffentliche Streamplan lebt.
DER PULS OBEN IST DESHALB KEIN SCHMUCK. Er ist der Grund, diese
Seite zu oeffnen -- und der Grund, morgen wiederzukommen.
============================================================== -->
<!-- ==================================================================
DER PULS
DREI LAGEN, NICHT ZWEI. Ein Ampelbauteil kennt ueblicherweise
"live" und "nicht live". Das ist eine Luege, sobald der Dienst
nicht erreichbar ist: Dann steht dort "nicht live", obwohl
niemand nachgesehen hat, und jemand verpasst einen Stream, weil
eine Seite so getan hat, als wuesste sie es.
Deshalb `data-lage` mit vier Werten:
laedt -- wir fragen gerade
live -- er sendet, mit Titel und Weg hin
wartet -- er sendet nicht, mit Countdown
unklar -- wir konnten nicht nachsehen, und sagen das
In "unklar" laeuft der Countdown WEITER. Er braucht kein Netz --
die naechste 20-Uhr-Marke ergibt sich aus der Uhr des Geraets.
Eine Stoerung beim Live-Dienst nimmt der Seite also nur die eine
Auskunft, die wirklich von ihm abhaengt, nicht den Rest.
Der Ring fuellt sich ueber den ganzen Tag bis zur naechsten
Sendezeit. Er zeigt damit dasselbe wie die Zahl, aber ohne Lesen:
Ein fast voller Ring heisst "gleich".
============================================================== -->
<section class="puls" id="puls" data-lage="laedt" aria-live="polite">
<div class="puls__aura" aria-hidden="true"></div>
<div class="puls__ring-feld">
<svg class="puls__ring" viewBox="0 0 120 120" aria-hidden="true">
<circle class="puls__ring-bahn" cx="60" cy="60" r="52" />
<circle class="puls__ring-fortschritt" id="puls-bogen" cx="60" cy="60" r="52" />
</svg>
<span class="puls__punkt" aria-hidden="true"></span>
</div>
<div class="puls__text">
<p class="puls__marke" id="puls-marke">DogFather auf TikTok</p>
<p class="puls__lage" id="puls-lage">Wir sehen gerade nach …</p>
<p class="puls__zahl" id="puls-zahl">–:–:–</p>
<p class="puls__klein" id="puls-klein">Alle Zeiten in deiner Ortszeit.</p>
</div>
<!-- DER KNOPF STEHT NEBEN DEM TEXT, NICHT DARIN (21.09.2026).
Am Rechner ist die Karte ueber 1200 px breit; lag der Knopf im
Textblock, klebte er links unten und rechts blieb die halbe
Karte leer. Als eigenes Geschwister rutscht er mit
`margin-left: auto` an den rechten Rand -- dorthin, wo der
Daumen am Handy und der Blick am Rechner ohnehin hinwandern.
Am Handy bricht die Karte in eine Spalte um, und er steht
wieder unter dem Text. Dafuer sorgt derselbe Umbruch, der auch
den Ring nach oben setzt -- keine zweite Regel. -->
<a class="puls__knopf" id="puls-knopf"
href="https://www.tiktok.com/@dogfather0804"
target="_blank" rel="noopener noreferrer" hidden>Jetzt zuschauen&nbsp;→</a>
</section>
<!-- ==================================================================
DAS BESONDERE EVENT
Dieselbe Quelle wie beim oeffentlichen Streamplan
(/special-event). Traegt die Verwaltung eines ein, erscheint
dieser Kasten; sonst ist er nicht da.
ER IST VERSTECKT UND NICHT LEER: Ein Kasten mit "kein Event
geplant" belegt jeden Tag Platz, um an den meisten Tagen nichts
zu sagen -- und genau deshalb liest ihn niemand mehr an dem Tag,
an dem doch etwas drinsteht.
============================================================== -->
<section class="event" id="event" hidden>
<span class="event__zeichen" aria-hidden="true">★</span>
<div class="event__text">
<p class="event__marke">Besonderes Live-Event</p>
<h2 class="event__titel" id="event-titel"></h2>
<p class="event__zahl" id="event-zahl"></p>
</div>
<a class="event__knopf" id="event-knopf" href="#"
target="_blank" rel="noopener noreferrer" hidden>Mehr erfahren&nbsp;→</a>
</section>
<!-- ==================================================================
DIE KANAELE
Die drei Accounts kommen vom Server (/workspace/api/draussen) und
stehen hier NICHT im Quelltext. Sie haengen dort an derselben
Liste, die auch die Aufgabenverteilung benutzt.
WARUM DAS WICHTIG IST: Am 21.09.2026 stand in dieser Liste
"@hasidog00804" -- eine Null zu viel, der Account existiert
nicht. Zwei Pruefungen hatten den Tippfehler abgeschrieben und
waren deshalb gruen. Eine dritte Abschrift hier waere ein toter
Link gewesen, den niemand meldet, weil niemand weiss, dass er
falsch ist.
SOLANGE NICHTS DA IST, STEHT HIER AUCH NICHTS -- kein Geruest aus
grauen Kaesten. Geht der Abruf schief, erscheint ein Satz, der
sagt, was los ist, statt einer leeren Reihe, die aussieht, als
gaebe es keine Kanaele.
============================================================== -->
<section class="kanaele" id="kanaele" hidden>
<h2 class="kanaele__titel">Wo du ihn sonst findest</h2>
<div class="kanaele__reihe" id="kanaele-reihe"></div>
<p class="kanaele__fehler" id="kanaele-fehler" hidden>
Die Kanäle konnten gerade nicht geladen werden. Versuch es später
noch einmal — an deinem Gerät liegt es nicht.
</p>
</section>
<!-- ==================================================================
DIE ZWEI SEITEN (seit 19.09.2026, unveraendert in der Sache)
DER CODE IST ECHT UND WURDE NACHGESEHEN, nicht abgeschrieben:
Er steht in partnercodes.json von VanVans Shop als DOGI10, 10
Prozent, aktiv, ohne Ablaufdatum, mit der Notiz "Zum weitergeben
an Community, Zuschauer, Freunde etc." -- und mit
"giltAufSale": false. Genau deshalb steht der Satz zu den
reduzierten Artikeln hier drunter. Ein Rabatt, der an der Kasse
anders ausfaellt als angekuendigt, kostet mehr Vertrauen, als
er Umsatz bringt.
Der zweite Code in derselben Datei ist als "Nur fuer Filipe
persoenlich" vermerkt und steht deshalb NIRGENDWO auf dieser
Seite.
============================================================== -->
<h2 class="seiten-titel">Unsere Seiten</h2>
<div class="seiten-gitter">
<!-- ---- DOGFATHER UNIVERSE ------------------------------------ -->
<article class="aussen aussen--dogi" data-weg="https://dogfather-universe.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<!-- DIE SCHWEBENDEN LOGOS (19.09.2026).
Filipe: "die sollen paar mal sein in der kacheln und so wie
schweben, sich ganz leicht bewegen."
VIER STUECK, VERSCHIEDEN GROSS UND VERSCHIEDEN SCHNELL. Alle
gleich waere ein Muster, und ein Muster sieht nach Tapete
aus. Verschieden heisst: Man nimmt Tiefe wahr, ohne dass
etwas ablenkt.
Sie tragen KEINE Farbe: Das PNG ist eine Maske, die Farbe
kommt aus dem CSS (--aussen-ton). Deshalb passt dasselbe
Logo in jede Kachel, egal welchen Ton sie hat.
`aria-hidden`, weil sie nichts sagen -- wer die Seite
vorlesen laesst, soll nicht viermal "Logo" hoeren. -->
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<circle cx="12" cy="12" r="8.4" />
<path d="M3.6 12h16.8M12 3.6c2.4 2.5 2.4 13.9 0 16.8M12 3.6c-2.4 2.5-2.4 13.9 0 16.8" />
</svg>
</span>
<div>
<p class="aussen__marke">Die Website</p>
<h3 class="aussen__titel">DogFather&nbsp;Universe</h3>
</div>
</div>
<p class="aussen__satz">
Die Heimat von DogFather als Streamer, der HasiDog-Community
und seiner Arbeit als Manager bei Spicy Media.
</p>
<!-- WAS ES DORT GIBT -- ABGELESEN, NICHT AUSGEDACHT.
Die Punkte stammen aus der Navigation von
dogfather-universe.com (streamplan.html, hasidog.html,
zeitreise.html, stimmen.html). Eine erfundene Aufzählung
wäre beim ersten Klick als Lüge aufgeflogen.
UND SIE SIND KEINE LINKS: Die ganze Karte führt zur
Startseite; einzelne Links darin würden diesen Klick
zerschneiden und wären auf dem Handy außerdem zu kleine
Ziele. -->
<ul class="aussen__liste">
<li>Der Streamplan – wann was läuft</li>
<li>HasiDog: die Community rund um Dogi</li>
<li>Die Zeitreise durch alles Bisherige</li>
<li>Stimmen von Leuten, die dabei waren</li>
</ul>
<p class="aussen__weg">
<span class="aussen__adresse">dogfather-universe.com</span>
<a class="aussen__knopf" href="https://dogfather-universe.com/"
target="_blank" rel="noopener noreferrer">Seite öffnen&nbsp;→</a>
</p>
</article>
<!-- ---- VANVANS SHOP ------------------------------------------ -->
<article class="aussen aussen--shop" data-weg="https://vans-diy-bastelbedarf.com/">
<div class="aussen__schein" aria-hidden="true"></div>
<div class="logo-feld" aria-hidden="true">
<span class="logo-feld__stueck" data-n="1"></span>
<span class="logo-feld__stueck" data-n="2"></span>
<span class="logo-feld__stueck" data-n="3"></span>
<span class="logo-feld__stueck" data-n="4"></span>
</div>
<div class="aussen__kopf">
<span class="aussen__zeichen" aria-hidden="true">
<svg viewBox="0 0 24 24">
<path d="M5 8h14l-1.1 11.2a1.4 1.4 0 0 1-1.4 1.3H7.5a1.4 1.4 0 0 1-1.4-1.3z" />
<path d="M9 8V6.4a3 3 0 0 1 6 0V8" />
</svg>
</span>
<div>
<p class="aussen__marke">Der Shop</p>
<!-- NAME UND BESCHREIBUNG STAMMEN VON DER SEITE SELBST
(og:site_name und meta description). Meine erste Fassung
hieß „Van's DIY Bastelbedarf" und nannte „Perlen,
Anhänger, Werkzeug" — beides ausgedacht und beides
falsch. Der Laden heißt mit „&", und er verkauft vor
allem Handgemachtes. -->
<h3 class="aussen__titel">Van's&nbsp;DIY &amp; Bastelbedarf</h3>
</div>
</div>
<p class="aussen__satz">
VanVans eigener Laden: handgemachte Häkelwerke, Plushies,
Schmuck und Bastelzubehör.
</p>
<!-- Der Rabatt. Eigener Block, weil er das Wichtigste auf
dieser Karte ist -- und kopierbar, weil niemand einen Code
abtippen soll, den er sich vorher merken muss. -->
<div class="gutschein">
<p class="gutschein__zeile">
<span class="gutschein__prozent">10&nbsp;%</span>
<span class="gutschein__wofuer">für alle aus der Community</span>
</p>
<button type="button" class="gutschein__code" id="code-knopf"
data-code="DOGI10"
aria-label="Rabattcode DOGI10 kopieren">
<span class="gutschein__wort">DOGI10</span>
<span class="gutschein__hinweis" id="code-hinweis">tippen zum Kopieren</span>
</button>
<p class="gutschein__klein">
Beim Bestellen im Feld für den Gutscheincode eintragen.
Gilt nicht auf bereits reduzierte Artikel.
</p>
</div>
<p class="aussen__weg">
<span class="aussen__adresse">vans-diy-bastelbedarf.com</span>
<a class="aussen__knopf" href="https://vans-diy-bastelbedarf.com/"
target="_blank" rel="noopener noreferrer">Shop öffnen&nbsp;→</a>
</p>
</article>
</div>
<p class="seiten-fuss">
Alles hier öffnet sich in einem neuen Fenster — das Rudel bleibt
also offen.
</p>
</main>
<script src="assets/js/nachfrage.js?v=202609251230" defer></script>
<script src="assets/js/wahl.js?v=202609251230" defer></script>
<script src="assets/js/bereiche.js?v=202609251230" defer></script>
<script src="assets/js/installieren.js?v=202609251230" defer></script>
<script src="assets/js/kopf.js?v=202609251230" defer></script>
<script src="assets/js/glocke.js?v=202609251230" defer></script>
<script src="assets/js/live.js?v=202609251230" defer></script>
<script src="assets/js/unsere-seiten.js?v=202609251230" defer></script>
</body>
</html>