Wunsch 27.08.2026: "soll nur noch hochwertiger und professioneller
aussehen." Kein neues Design, sondern die Details, die den Unterschied
zwischen "gemacht" und "gesetzt" ausmachen:
- Ueberschrift enger gesetzt (-.022em, Zeilenabstand 1.08, text-wrap:
balance). Bei 4rem wirkt normale Laufweite auseinandergefallen; die
drei Zeilen verteilen sich jetzt gleichmaessig statt mit kurzer
Restzeile.
- Jede Welt-Kachel traegt die Farbe IHRER Welt statt dreimal derselben:
Babyblau, Silber, das gedeckte Rot von Spicy Media. Die Werte sind
nicht erfunden, sondern die --accent-Toene der drei Themendateien.
- Plaketten ("WELT 1") klein, in Versalien, weit gesperrt -- liest sich
als Kapitelmarke statt als Beschriftung.
- Event-Karte: Datum als gesperrte Versalzeile (ordnet sich dem Titel
unter), "Mehr erfahren" als ruhiger Knopf statt nacktem Textlink,
Haarlinie am Bild, Text auf 5 Zeilen begrenzt -- damit nicht die
Textlaenge aus der Verwaltung das Aussehen der Startseite bestimmt und
bei zwei Events beide Kacheln gleich hoch sind (geprueft: 572/572px).
ZWEI FUNDE BEIM PRUEFEN, BEIDE WICHTIGER ALS DER FEINSCHLIFF:
1. INHALTSRICHTLINIE UND ZEILENENDEN. Der Browser rechnet die Pruefsumme
eines Inline-Skripts NICHT ueber die Bytes der Datei, sondern ueber
den Text im Dokument -- und der HTML-Parser ersetzt beim Einlesen
jedes CR LF durch LF (HTML-Spezifikation, "preprocessing the input
stream"). Eine Datei mit Windows-Zeilenenden ergibt serverseitig also
eine ANDERE Summe, und die Seite fuehrt ihr eigenes Skript nicht mehr
aus: kein Live-Status, keine Events, nichts. Live war es unauffaellig
(Linux-Auscheckung hat LF), auf dem Windows-Rechner sofort tot
(core.autocrlf=true). inhaltsrichtlinie.js vereinheitlicht jetzt vor
dem Rechnen auf LF -- das ist die Summe, die der Browser wirklich
bildet, und macht die Richtlinie unabhaengig davon, mit welchem
Werkzeug eine Datei zuletzt gespeichert wurde.
2. TESTS MIT FESTEM PORT KOENNEN LUEGEN. Drei Server aus frueheren
Laeufen liefen noch. Neue Testlaeufe konnten ihren Port nicht belegen,
starben still -- und massen weiter gegen den ALTEN Code. Ergebnis
waren Fehlermeldungen zu einem laengst behobenen Fehler. pruef-musik,
pruef-kasse und pruef-startseite suchen sich jetzt einen freien Port.
Neuer Test pruef-startseite.mjs (19 Pruefungen) mit FESTEN Event-Daten:
Beim Pruefen kam einmal nichts vom Server, der Abschnitt blieb leer und
der Test haette "kein Fehler" gemeldet, obwohl er nichts gesehen hat.
Geprueft werden Maske am Artwork, genau eine Kachel bei einem Event,
volle Breite, saubere Textkuerzung auf ganze Zeilen, eigene Weltfarben,
zwei gleich hohe Kacheln bei zwei Events, Handy ohne Ueberlauf.
Alles gruen: startseite 19, musik 17, kasse 15, inhaltsrichtlinie 22,
handy 56.
Co-Authored-By: Claude Opus 5 <[email protected]>
116 lines
6.6 KiB
HTML
116 lines
6.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de" data-theme="hasidog">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Stimmen über DogFather — DOGFATHER UNIVERSE</title>
|
|
<meta name="description" content="Was die Community und das Team über DogFather sagen." />
|
|
<link rel="icon" type="image/png" href="assets/img/favicon.png" />
|
|
<link rel="manifest" href="/manifest.json" />
|
|
<meta name="theme-color" content="#0b0d10" />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:site_name" content="DOGFATHER UNIVERSE" />
|
|
<meta property="og:title" content="Stimmen über DogFather — DOGFATHER UNIVERSE" />
|
|
<meta property="og:description" content="Was die Community und das Team über DogFather sagen." />
|
|
<meta property="og:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
|
<meta property="og:url" content="https://dogfather-universe.com/stimmen.html" />
|
|
<meta name="twitter:card" content="summary_large_image" />
|
|
<meta name="twitter:title" content="Stimmen über DogFather — DOGFATHER UNIVERSE" />
|
|
<meta name="twitter:description" content="Was die Community und das Team über DogFather sagen." />
|
|
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
|
|
|
<link rel="stylesheet" href="assets/css/main.css?v=20260828e" />
|
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828e" />
|
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828e" />
|
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828e" />
|
|
</head>
|
|
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-stimmen.jpg');--page-bg-mobile:url('/assets/img/bg-stimmen-mobile.jpg');">
|
|
<div id="site-header"></div>
|
|
|
|
<main>
|
|
<section class="hero page-bg">
|
|
<div class="hero-banner"><img src="/assets/img/bg-stimmen.jpg" alt="" loading="eager" /></div>
|
|
<div class="container">
|
|
<span class="eyebrow" data-i18n="st_eyebrow">Welt 2 — HasiDog</span>
|
|
<h1 data-i18n="st_h1">Stimmen über DogFather</h1>
|
|
<p class="lead worlds" data-i18n="st_lead">Was Community und Team sagen.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Eigene Stimme einreichen (20.08.2026, Nutzer-Wunsch: "eine
|
|
richtig geile kachel ... wo die leute mit namen und tiktok namen
|
|
mir eine nachricht schreiben können", "das wird mega persoenlich
|
|
zu den fans"). Landet in der Verwaltung, wird NIE automatisch
|
|
veroeffentlicht -- siehe server-internal/routes/testimonials.js. -->
|
|
<section class="section-tight">
|
|
<div class="container">
|
|
<div class="stimmen-einreichen-kachel" id="stimmen-formular-box">
|
|
<span class="stimmen-einreichen-glanz" aria-hidden="true"></span>
|
|
<div class="stimmen-einreichen-kopf">
|
|
<span class="stimmen-einreichen-herz" aria-hidden="true">💌</span>
|
|
<h2 data-i18n="st_form_titel">Deine Stimme zählt</h2>
|
|
<p class="small" data-i18n="st_form_text">
|
|
Was bedeutet dir Team Dogi? Schreib uns deine Geschichte — mit etwas Glück liest DogFather sie
|
|
persönlich und stellt sie hier auf die Seite.
|
|
</p>
|
|
</div>
|
|
<form id="stimmen-formular">
|
|
<div class="field">
|
|
<label for="st-name" data-i18n="st_form_name_label">Dein Name</label>
|
|
<input type="text" id="st-name" maxlength="60" required />
|
|
</div>
|
|
<div class="field">
|
|
<label for="st-tiktok" data-i18n="st_form_tiktok_label">TikTok-Name (optional)</label>
|
|
<input type="text" id="st-tiktok" maxlength="40" placeholder="@dein-name" />
|
|
</div>
|
|
<div class="field">
|
|
<label for="st-nachricht" data-i18n="st_form_nachricht_label">Deine Nachricht</label>
|
|
<textarea id="st-nachricht" maxlength="500" rows="4" required data-i18n-attr="placeholder:st_form_nachricht_placeholder" placeholder="Erzähl uns, was dir Team Dogi bedeutet …"></textarea>
|
|
</div>
|
|
<!-- Profilbild-Auswahl (21.08.2026, Nutzer-Wunsch: "ich soll auch
|
|
paar geile bilder zum aussuchen haben als profilbild falls die
|
|
leute kein bild mit schicken, das soll denen auch als
|
|
möglichkeit gegeben sein"). Die festen Kacheln kommen aus
|
|
data-stimmen-avatare.js, damit Seite und Verwaltung dieselbe
|
|
Auswahl zeigen.
|
|
Dazu eine "eigenes Bild"-Kachel mit echtem Datei-Upload (auch
|
|
21.08.2026 ergänzt; ein früherer Kommentar hier behauptete noch
|
|
"kein Upload" -- das stimmte nicht mehr und ist am 28.08.2026
|
|
richtiggestellt). Der Upload ist mehrfach abgesichert: nur
|
|
Bildtypen, max. 5 MB, Bremse pro IP gegen Massen-Uploads, vor
|
|
dem Absenden im Browser auf 512px verkleinert (bild-vorbereiten.js),
|
|
und NICHTS wird veröffentlicht, bevor Dogi die Stimme freigibt --
|
|
jede Einreichung landet zuerst in der Warteschlange. -->
|
|
<div class="field">
|
|
<span class="stimmen-avatar-titel" data-i18n="st_form_avatar_label">Dein Profilbild (optional)</span>
|
|
<p class="small muted stimmen-avatar-hinweis" data-i18n="st_form_avatar_hinweis">Ohne Auswahl erscheint einfach der erste Buchstabe deines Namens.</p>
|
|
<div class="stimmen-avatar-wahl" id="stimmen-avatar-wahl" role="radiogroup" aria-labelledby="stimmen-avatar-titel"></div>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary" style="width:100%;" data-i18n="st_form_absenden">💙 Nachricht einreichen</button>
|
|
</form>
|
|
<p class="stimmen-erfolg" id="stimmen-erfolg" data-i18n="st_form_erfolg">Danke dir! Deine Nachricht wurde eingereicht und wird von Dogi persönlich geprüft. 🩵</p>
|
|
<p class="stimmen-fehler" id="stimmen-fehler"></p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ===== Echte, freigegebene Stimmen -- bleibt komplett unsichtbar, bis
|
|
mindestens eine Nachricht in der Verwaltung freigegeben wurde (kein
|
|
Platzhaltertext mehr). ===== -->
|
|
<section class="section-tight" id="stimmen-echte-root" hidden>
|
|
<div class="container">
|
|
<h2 class="text-center" data-i18n="st_echte_titel">Das sagt die Community</h2>
|
|
<div class="grid grid-3" id="stimmen-echte-grid" style="margin-top:1.6rem;"></div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<div id="site-footer"></div>
|
|
<script src="assets/js/data-stimmen-avatare.js?v=20260828e"></script>
|
|
<script src="assets/js/i18n-stimmen.js?v=20260828e"></script>
|
|
<script src="assets/js/main.js?v=20260828e"></script>
|
|
<script src="assets/js/bild-vorbereiten.js?v=20260828e"></script>
|
|
<script src="assets/js/stimmen.js?v=20260828e"></script>
|
|
</body>
|
|
</html>
|