Files
dogfather-universe/workspace/unsere-seiten.html
T
DogFatherGitandClaude Opus 5 0d52c4dc05 Das Regie-Tor: jeder sieht es, nur die zwei kommen rein -- und Farbe für die Reihen
Filipe, zum Bildschirmfoto des Foyers: „unter den [Reihen] fehlt eine
kachel, die viel kraesser und spezieller aussehen soll, wo nur
dogfather oder vanvan reinkommen. mit ihren zugangscodes für die seite.
und das soll die regie kachel sein. die muss wirklich ultra krass sein.
komplett crazy. die anderen kacheln aber auch gerne farbiger machen und
nicht so kaal und dunkel."

Auf die Rückfrage, wie fest das Schloss sein soll: „punkt 2 aber die
soll jeder sehen aber nur vanvan und dogfather sollen da rein kommen
bitte."

Haus: Team Dogi (crew.dogfather-universe.com). Die Agentur ist nicht
berührt -- pruef-haus-trennung 107/0.

DAS TOR

Eine vierte Kachel über die GANZE BREITE unter den drei Reihen. Das ist
die stärkste Aussage, die ein Raster treffen kann, und sie kostet keine
einzige Farbe. Ein Licht läuft in sieben Sekunden darüber -- flach und
schmal, wie der Schein einer Lampe über einem Mischpult. Kein Blinken:
dasselbe Signal mit doppelter Belastung für die Augen, und diese Seite
steht manchmal eine Stunde offen. prefers-reduced-motion bekommt den
Schein stehend, nicht gar keinen -- der Zustand muss auch dann zu
erkennen sein.

Drei Zustände, und jeder sieht anders aus: verschlossen rot mit
geschlossenem Bügel, aufgeschlossen grün mit aufspringendem Bügel, und
für alle anderen gedämpftes Grau ohne Lauflicht, mit „nicht erlaubt"
schon am Mauszeiger.

ZWEI SCHLÖSSER HINTEREINANDER, UND NUR EINES IST GEHEIM

(1) DIE ROLLE, und zwar VOR dem Code -- ohne ihn anzusehen. Das ist
    wichtiger, als es aussieht: Sonst könnte irgendwer im Haus mit
    Rateversuchen die `versuche`-Bremse für seine eigene IP vollaufen
    lassen und sich damit von der ANMELDUNG aussperren; beide zählen in
    derselben Tabelle. Geprüft mit Gegenprobe: Ein Gast schickt den
    RICHTIGEN Admin-Code, kommt nicht durch, und die Versuchszahl
    bleibt bei 0.
(2) DER CODE, geprüft mit `codeGeprueft()` -- neu in workspace.js,
    neben der Anmeldung und mit deren Rechenvorschrift, deren Vergleich
    in konstanter Zeit und deren Bremse. Ein zweiter Codevergleich in
    einem anderen Modul wäre der, der beim nächsten Umbau der
    scrypt-Parameter stehen bleibt.

Und er prüft GENAU DIESE PERSON. Die Anmeldung geht alle Personen einer
Rolle durch -- dort ist der Code die Kennung. Hier wäre das falsch:
VanVans Code öffnete DogFathers Tür, und im Protokoll stünde, ER sei
hineingegangen.

WAS DIE TÜR LEISTET UND WAS NICHT -- UND DASS ES DASTEHT

Filipes „Punkt 2" heißt: Der Code öffnet die Tür, danach ist die Regie
offen wie bisher. Die Routen der Sendung prüfen weiterhin nur die Rolle.
Das ist die bewusste Wahl und keine vergessene Stelle -- eine Sperre,
die mitten in einer Übertragung zuschnappen kann, richtet mehr Schaden
an, als sie verhindert.

Damit das niemand überschätzt, steht es als Satz IM FENSTER, nicht nur
im Quelltext: „Das hält einen neugierigen Blick auf, nicht jemanden, der
an deinem offenen Rechner sitzt." Eine Sicherung, die stärker aussieht,
als sie ist, ist schlechter als gar keine.

FARBE -- ABER NICHT AUF DER FLÄCHE

Filipe hatte recht, und der Grund war meiner: Beim Umbau auf das
Hausmaterial heute Vormittag habe ich die Farbe mit herausgenommen, weil
die alte Fassung sie auf der FLÄCHE trug -- und genau das machte den
Text schlecht lesbar. Richtig ist nicht „keine Farbe", sondern Farbe,
wo kein Text steht:

  * Jede Reihe hat ihren Ton (`--ton`, derselbe Griff, über den
    module.css das Kantenlicht legt): Bernstein für das, was ansteht
    -- dieselbe Farbe wie „überfällig" --, Blau für die Sendung, rot
    sobald sie läuft, Grün für das, was hereinkommt: dieselbe Farbe,
    die ein angenommener Vorschlag trägt. Die Farben SAGEN etwas.
  * Ein Band im Kopf jeder Tafel, die Überschrift in ihrem Ton, die
    Schilder passend. Vorher war jedes Schild blau, egal in welcher
    Reihe es stand -- zwei Farben nebeneinander, die nichts
    voneinander wussten.
  * Ein Streifen am Zeilenanfang statt eines eingefärbten Kastens.
    Drei Pixel an der Kante sagen dasselbe, und der Text steht
    weiterhin auf dem Grund, auf dem er gemessen wurde.

Die Kachel selbst trägt dieselbe Silhouette und dasselbe deckende
Material wie jede Karte im Haus (`.regie-tor` steht in der Modulliste in
module.css und in der Materialliste in start.css). „Krass" heißt hier
nicht „anders als das Haus" -- genau das stand heute Vormittag schon
einmal in foyer.css und war ein Fehler.

PROTOKOLLWÖRTER, DIE MAN LESEN KANN

`personen.js` baut den Anzeigetext aus dem Schlüssel: Unterstriche
werden Leerzeichen, nur der erste Buchstabe wird groß. Aus
`regie_code_falsch` wäre auf dem Bildschirm „Regie code falsch"
geworden. Die Regel, die daraus folgt: Hauptwort plus Mittelwort, nie
zwei Hauptwörter. Jetzt `regie_aufgeschlossen`, `regie_abgeschlossen`,
`regie_verweigert`, `regie_unbefugt`. Und das Detail war ein
ISO-Zeitstempel mitten in einer Zeile, die ein Mensch überfliegt --
jetzt steht dort „12 Stunden".

GEMESSEN

  pruef-reaktion          571, 0 Fehler (vorher 538) -- Abschnitt 21
  mess-foyer               96, 0 Fehler (vorher 70), 12 Bildschirmfotos
  pruef-handy-teamdogi    263 Seitenaufrufe, 0 Befunde
  pruef-breiten            23 auf 45 Seiten und fünf Breiten
  pruef-struktur          102 · pruef-css-klassen 37 · pruef-lesbarkeit 14
  pruef-bewegung            9 · pruef-tippziele 13 · pruef-deutsche-texte 12
  pruef-crew-adresse      173 · pruef-haus-trennung 107
  pruef-community-sicht    10 · pruef-sackgassen 14
  alle 0 Fehler

UND EINE LÜCKE, DIE DIE EIGENE MESSUNG GEFUNDEN HAT

Der Vorhang mit dem Codefeld schließt auf Esc und auf einen Druck
daneben, und der Finger steht im Feld -- für jemanden ohne Maus war er
trotzdem eine Falle: Die Tabulatortaste lief durch die Knöpfe DAHINTER
weiter, sichtbar war aber das Codefeld. Man tippt auf A und bekommt B,
nur eben mit der Tastatur.

Der erste Riegel legte `#foyer` still -- und die neue Messung fiel
sofort darüber: Die KOPFLEISTE steht außerhalb davon, der Fokus lief
weiter nach „Abmelden". Jetzt wird alles neben dem Vorhang stillgelegt,
ABGELEITET statt aufgezählt (`body.children`), und beim Schließen genau
das wieder freigegeben, was ich selbst gesetzt habe.

Und die Messung selbst war beim ersten Entwurf zu streng: Sie verlangte
„der Fokus bleibt IMMER im Fenster" und wurde rot, obwohl die Sperre
tadellos arbeitete -- am Ende des Tabulatorkreises gibt der Browser den
Fokus an seine eigene Leiste ab, im Dokument steht dann `body`. `body`
ist kein Bedienelement. Gefragt ist jetzt das Richtige: Wird je ein
BEDIENELEMENT außerhalb erreicht? Die Gegenprobe nennt es beim Namen
(`DRAUSSEN:zurueck`).

mess-foyer misst beide Hälften von Filipes Satz: dass ein Gast das Tor
SIEHT (und ein Druck ihm trotzdem kein Codefeld öffnet) und dass nur die
zwei HINEINKOMMEN. Dazu der ganze Weg im Browser: falscher Code
abgewiesen und Feld geleert, richtiger Code führt in den Saal, die
Freigabe gilt in einem neuen Fenster -- und VanVans Tür ist trotzdem
noch zu.

EIN FEHLALARM IN DER EIGENEN MESSUNG, BEHOBEN

mess-foyer suchte zuerst das WORT „Warteschlange" im Dokument eines
Gastes und fand es -- im unsichtbaren Gerüst der linken Reihe, wo es als
Überschrift steht. Zwei Gründe, warum das falsch war: Eine Beschriftung
ist keine Auskunft, und dass es eine Warteschlange GIBT, steht seit
heute im Regie-Tor, das jeder sieht. Eine Messung, die genau das als
Leck zählt, widerspricht dem Entwurf -- und sie hätte bei jedem Lauf
angeschlagen. Gefragt ist das Schärfere: Kommen DATEN an? Jetzt werden
Titel und Videokennungen geprüft, und dass keine einzige Planzeile
gebaut wurde.

NICHT BEHOBEN, WEIL NICHT MEINS: pruef-meldungen bleibt rot (28
Kennungen ohne Satz, 3 Rohanzeigen) -- gemessen im worktree auf dem
letzten Commit schon vorher, Zeichen für Zeichen dieselbe Liste. Meine
Arbeit hat 2 Kennungen und 2 Sätze ergänzt (174 -> 176, 155 -> 157), die
Zahlen gehen genau gleich hoch. Die Dateien gehören überwiegend der
Agentur; das gehört in einen eigenen Durchgang.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-08 12:13:22 +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=202610081212" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610081212" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/start.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/unsere-seiten.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/module.css?v=202610081212" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610081212" />
</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=202610081212" defer></script>
<script src="assets/js/wahl.js?v=202610081212" defer></script>
<script src="assets/js/bereiche.js?v=202610081212" defer></script>
<script src="assets/js/installieren.js?v=202610081212" defer></script>
<script src="assets/js/kopf.js?v=202610081212" defer></script>
<script src="assets/js/glocke.js?v=202610081212" defer></script>
<script src="assets/js/live.js?v=202610081212" defer></script>
<script src="assets/js/unsere-seiten.js?v=202610081212" defer></script>
</body>
</html>