Öffentliche Avatar-Uploads vor dem Absenden verkleinern (1,1 MB -> ~40 KB)

Der Performance-Check (pruef-tempo.mjs, neu) fand als größte Einzel-
ressource ein 1,1-MB-Profilbild, ausgeliefert an jeden Besucher der
Startseite und von stimmen.html -- angezeigt wird es handgroß.

Ursache: Das öffentliche Stimmen-Formular (stimmen.js) lud Profilbilder
ROH hoch. Die Bildaufbereitung vom 27.08. bekam nur die Verwaltung, nicht
das öffentliche Formular. So landete das Kamera-Foto in voller Auflösung
auf dem Server.

- bild-vorbereiten.js (neu): die Verkleinerungs-Funktion, jetzt einmal
  und parametrisierbar (maxBreite). Verwaltung nutzt weiter 1600px,
  Avatare 512px. Test pruef-bild-vorbereiten.mjs: 8/8, u.a. 512er-Avatar
  ~40 KB statt >1 MB.
- stimmen.js: verkleinert vor dem Upload (window.bildVorbereiten mit
  maxBreite 512); fällt die Funktion aus, wird das Original genommen --
  kein Upload darf daran scheitern.
- stimmen.html: lädt bild-vorbereiten.js; veralteten Kommentar
  richtiggestellt (behauptete "kein Upload", obwohl es seit 21.08. einen
  gibt -- mit Bremse, Typ-/Größenlimit, Freigabe-Pflicht).

Zwei neue Checks als bleibende Absicherung mit committet: pruef-links.mjs
(41 interne Ziele, 0 kaputt) und pruef-assets.mjs (67 Ressourcen, 0 fehlen).

NOCH OFFEN: verwaltung.html hat noch eine eigene, identische Inline-Kopie
der Funktion -- die Zusammenführung ist ein eigener, testbarer Schritt
(das Inline-Skript dort ist groß und die Verwaltung hinter dem Gate schwer
live zu testen). Das bestehende 1,1-MB-Bild auf dem Server bleibt, bis es
neu hochgeladen/ersetzt wird.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-27 15:17:30 +02:00
co-authored by Claude Opus 5
parent 3e2f5306ad
commit 5b2a1daabe
38 changed files with 469 additions and 250 deletions
+6 -6
View File
@@ -18,10 +18,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<title>Seite nicht gefunden — DOGFATHER UNIVERSE</title> <title>Seite nicht gefunden — DOGFATHER UNIVERSE</title>
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -41,7 +41,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-404.js?v=20260828b"></script> <script src="assets/js/i18n-404.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Unterstütze Dogfather dauerhaft mit der DogiCrew 🩵 und sammle exklusive Treueprämien — die Teddy-Kollektion entsteht in Kooperation mit VanVan." /> <meta name="twitter:description" content="Unterstütze Dogfather dauerhaft mit der DogiCrew 🩵 und sammle exklusive Treueprämien — die Teddy-Kollektion entsteht in Kooperation mit VanVan." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* ===================================================================== /* =====================================================================
Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback
@@ -603,9 +603,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-abonnieren.js?v=20260828b"></script> <script src="assets/js/i18n-abonnieren.js?v=20260828c"></script>
<script src="assets/js/supporter.js?v=20260828b"></script> <script src="assets/js/supporter.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
(function () { (function () {
const S = window.DogiSupporter; const S = window.DogiSupporter;
+5 -5
View File
@@ -20,10 +20,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -134,6 +134,6 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." /> <meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -51,9 +51,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-aktionen.js?v=20260828b"></script> <script src="assets/js/data-aktionen.js?v=20260828c"></script>
<script src="assets/js/i18n-aktion-detail.js?v=20260828b"></script> <script src="assets/js/i18n-aktion-detail.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const params = new URLSearchParams(location.search); const params = new URLSearchParams(location.search);
+113
View File
@@ -0,0 +1,113 @@
/* =====================================================================
bild-vorbereiten.js — ein Bild im Browser verkleinern, BEVOR es hochlädt
WOZU
Serverseitig bräuchte es eine Bildbibliothek (sharp o.ä.) -- eine neue
Abhängigkeit mit nativem Code, installiert in einem Verzeichnis, an das
Claudian nicht herankommt. Der Browser kann das ohnehin: Canvas skaliert
und kodiert seit jeher. Nebeneffekt: schon der Upload wird kleiner -- wer
vom Handy ein 8-MB-Foto schickt, wartet sonst am Mobilfunknetz.
Bis 28.08.2026 lag diese Funktion NUR inline in der Verwaltung
(verwaltung.html). Das öffentliche Stimmen-Formular (stimmen.js) lud
Profilbilder dagegen ROH hoch -- so landete ein 1,1-MB-Avatar auf dem
Server und wurde jedem Besucher der Startseite ausgeliefert. Deshalb
liegt die Funktion jetzt hier, EINMAL, und wird von beiden benutzt.
MASS PRO EINSATZORT
Die größte Breite ist ein Parameter, kein fester Wert: Die Verwaltung
zeigt Event-/Teambilder groß (1600 reicht für jede Anzeige dort), ein
Profil-Avatar erscheint dagegen nur handgroß -- 512 ist da schon
großzügig und spart gegenüber 1600 ein Vielfaches.
WAS BEWUSST NICHT ANGETASTET WIRD
Kleine PNGs bleiben PNG. Ein Logo mit durchsichtigem Hintergrund würde
als JPEG einen schwarzen Kasten bekommen -- JPEG kennt keine Transparenz.
Die Grenze liegt bei 400 KB: Darunter ist es wahrscheinlich eine Grafik,
darüber praktisch immer ein Foto.
===================================================================== */
(function () {
const STANDARD = {
maxBreite: 1600, // reicht für die großen Anzeigen in der Verwaltung
qualitaet: 0.86,
pngGrenze: 400 * 1024, // kleine PNGs (Grafiken/Logos) unangetastet lassen
};
/**
* @param {File} datei die vom Nutzer gewählte Datei
* @param {object} [opt] {maxBreite, qualitaet, pngGrenze}
* @returns {Promise<File>} verkleinerte Datei -- oder das Original, wenn
* sich Verkleinern nicht lohnt oder etwas schiefgeht.
*/
async function bildVorbereiten(datei, opt) {
const maxBreite = opt?.maxBreite ?? STANDARD.maxBreite;
const qualitaet = opt?.qualitaet ?? STANDARD.qualitaet;
const pngGrenze = opt?.pngGrenze ?? STANDARD.pngGrenze;
try {
if (!datei || !datei.type.startsWith("image/")) return datei;
const istPng = datei.type === "image/png";
const bild = await new Promise((fertig, schief) => {
const b = new Image();
b.onload = () => fertig(b);
b.onerror = schief;
b.src = URL.createObjectURL(datei);
});
const zuBreit = bild.naturalWidth > maxBreite;
const grossesPng = istPng && datei.size > pngGrenze;
/* Nichts zu tun: kleines Bild, richtiges Format. Dann bleibt die
Datei unverändert -- kein Qualitätsverlust ohne Gegenwert. */
if (!zuBreit && !grossesPng) {
URL.revokeObjectURL(bild.src);
return datei;
}
const breite = Math.min(bild.naturalWidth, maxBreite);
const hoehe = Math.round((bild.naturalHeight / bild.naturalWidth) * breite);
const flaeche = document.createElement("canvas");
flaeche.width = breite;
flaeche.height = hoehe;
const stift = flaeche.getContext("2d");
/* Ohne diese beiden Zeilen skaliert der Browser hart und die Kanten
fransen aus. */
stift.imageSmoothingEnabled = true;
stift.imageSmoothingQuality = "high";
/* Große PNGs werden zu JPEG -- die haben keinen durchsichtigen
Hintergrund, sonst wären sie nicht so groß. Sicherheitshalber wird
trotzdem weiß unterlegt, damit aus einer eventuellen Transparenz
kein schwarzer Kasten wird. */
if (grossesPng) {
stift.fillStyle = "#ffffff";
stift.fillRect(0, 0, breite, hoehe);
}
stift.drawImage(bild, 0, 0, breite, hoehe);
URL.revokeObjectURL(bild.src);
const typ = (grossesPng || datei.type === "image/jpeg") ? "image/jpeg" : datei.type;
const klotz = await new Promise((fertig) =>
flaeche.toBlob(fertig, typ, qualitaet));
/* Wurde es NICHT kleiner, bleibt das Original. Bei bereits gut
komprimierten Dateien kann erneutes Kodieren sonst sogar zulegen --
und Qualität kosten für nichts. */
if (!klotz || klotz.size >= datei.size) return datei;
const name = datei.name.replace(/\.[^.]+$/, "") +
(typ === "image/jpeg" ? ".jpg" : datei.name.slice(datei.name.lastIndexOf(".")));
return new File([klotz], name, { type: typ, lastModified: Date.now() });
} catch (e) {
/* Geht irgendetwas schief, wird das Original hochgeladen. Ein
fehlgeschlagenes Verkleinern darf niemals einen Upload verhindern. */
return datei;
}
}
window.bildVorbereiten = bildVorbereiten;
})();
+11 -1
View File
@@ -69,7 +69,17 @@
eigenesBtn.classList.add("laedt"); eigenesBtn.classList.add("laedt");
try { try {
const form = new FormData(); const form = new FormData();
form.append("image", datei); /* Vor dem Upload verkleinern (bild-vorbereiten.js). Ein Profilbild
erscheint nur handgroß -- 512px sind großzügig und machen aus
einem Handy-Foto von mehreren MB rund 30-50 KB. Ohne diesen
Schritt landete bis 28.08.2026 z.B. ein 1,1-MB-Avatar auf dem
Server und wurde jedem Startseiten-Besucher ausgeliefert.
Fällt window.bildVorbereiten aus (Skript nicht geladen), wird
die Originaldatei genommen -- kein Upload darf daran scheitern. */
const fertig = window.bildVorbereiten
? await window.bildVorbereiten(datei, { maxBreite: 512 })
: datei;
form.append("image", fertig);
const res = await fetch(`${API_BASE_URL}/testimonials/upload-avatar`, { method: "POST", body: form }); const res = await fetch(`${API_BASE_URL}/testimonials/upload-avatar`, { method: "POST", body: form });
const data = await res.json(); const data = await res.json();
if (!data.ok) { if (!data.ok) {
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Du bist Streamer und suchst einen Manager? Bewirb dich als Creator bei Spicy Media." /> <meta name="twitter:description" content="Du bist Streamer und suchst einen Manager? Bewirb dich als Creator bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-creator.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-creator-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-creator.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-creator-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -70,8 +70,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260828b"></script> <script src="assets/js/forms.js?v=20260828c"></script>
<script src="assets/js/i18n-bewerben-creator.js?v=20260828b"></script> <script src="assets/js/i18n-bewerben-creator.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -22,10 +22,10 @@
<meta name="twitter:description" content="Kooperationsanfrage an Manager DogFather / Spicy Media." /> <meta name="twitter:description" content="Kooperationsanfrage an Manager DogFather / Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -68,8 +68,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260828b"></script> <script src="assets/js/forms.js?v=20260828c"></script>
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260828b"></script> <script src="assets/js/i18n-bewerben-kooperation.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Modi bei Team Dogi — DogFathers persönliches Community-Team." /> <meta name="twitter:description" content="Werde Modi bei Team Dogi — DogFathers persönliches Community-Team." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-modi.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-modi-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-modi.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-modi-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -79,8 +79,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260828b"></script> <script src="assets/js/forms.js?v=20260828c"></script>
<script src="assets/js/i18n-bewerben-modi.js?v=20260828b"></script> <script src="assets/js/i18n-bewerben-modi.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Scout für DogFather bei der Spicy Media Agentur — finde neue Talente." /> <meta name="twitter:description" content="Werde Scout für DogFather bei der Spicy Media Agentur — finde neue Talente." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-scout.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-scout-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-scout.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-scout-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -71,8 +71,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260828b"></script> <script src="assets/js/forms.js?v=20260828c"></script>
<script src="assets/js/i18n-bewerben-scout.js?v=20260828b"></script> <script src="assets/js/i18n-bewerben-scout.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Teil vom Team: Modi bei Team Dogi, Scout oder Creator bei Spicy Media, oder Kooperation anfragen." /> <meta name="twitter:description" content="Werde Teil vom Team: Modi bei Team Dogi, Scout oder Creator bei Spicy Media, oder Kooperation anfragen." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-split.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-split-mobile.jpg');"> <body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-bewerben-split.jpg');--page-bg-mobile:url('/assets/img/bg-bewerben-split-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -85,7 +85,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-bewerben.js?v=20260828b"></script> <script src="assets/js/i18n-bewerben.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Der Husky an DogFathers Seite — das tierische Gesicht der HasiDog-Welt." /> <meta name="twitter:description" content="Der Husky an DogFathers Seite — das tierische Gesicht der HasiDog-Welt." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-casper.jpg');--page-bg-mobile:url('/assets/img/bg-casper-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-casper.jpg');--page-bg-mobile:url('/assets/img/bg-casper-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -85,7 +85,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-casper.js?v=20260828b"></script> <script src="assets/js/i18n-casper.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Team Dogi ist Familie — die Community rund um DogFather und HasiDog." /> <meta name="twitter:description" content="Team Dogi ist Familie — die Community rund um DogFather und HasiDog." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-community.jpg');--page-bg-mobile:url('/assets/img/bg-community-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-community.jpg');--page-bg-mobile:url('/assets/img/bg-community-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -84,7 +84,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-community.js?v=20260828b"></script> <script src="assets/js/i18n-community.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Content Creator, die Teil von DogFather / Spicy Media sind." /> <meta name="twitter:description" content="Content Creator, die Teil von DogFather / Spicy Media sind." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-creator.jpg');--page-bg-mobile:url('/assets/img/bg-creator-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-creator.jpg');--page-bg-mobile:url('/assets/img/bg-creator-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -60,9 +60,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-creator.js?v=20260828b"></script> <script src="assets/js/data-creator.js?v=20260828c"></script>
<script src="assets/js/i18n-creator.js?v=20260828b"></script> <script src="assets/js/i18n-creator.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", async () => { document.addEventListener("DOMContentLoaded", async () => {
const grid = document.getElementById("creator-grid"); const grid = document.getElementById("creator-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Wer ist DogFather wirklich? Persönlichkeit, Werte und die Geschichte hinter dem Content." /> <meta name="twitter:description" content="Wer ist DogFather wirklich? Persönlichkeit, Werte und die Geschichte hinter dem Content." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-dogfather-person.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-person-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-dogfather-person.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-person-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -158,7 +158,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-dogfather.js?v=20260828b"></script> <script src="assets/js/i18n-dogfather.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+2 -2
View File
@@ -26,8 +26,8 @@
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="DogFather" /> <meta name="apple-mobile-web-app-title" content="DogFather" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<style> <style>
/* ===================================================================== /* =====================================================================
Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="HasiDog: Maskottchen, Musikprojekt und die verspielte, familiäre Seite von Team Dogi." /> <meta name="twitter:description" content="HasiDog: Maskottchen, Musikprojekt und die verspielte, familiäre Seite von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-hasidog-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-hasidog-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -186,7 +186,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-hasidog.js?v=20260828b"></script> <script src="assets/js/i18n-hasidog.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+8 -8
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DOGFATHER UNIVERSE: die Heimat von DogFather als Streamer, der HasiDog-Community und Manager DogFather bei Spicy Media." /> <meta name="twitter:description" content="DOGFATHER UNIVERSE: die Heimat von DogFather als Streamer, der HasiDog-Community und Manager DogFather bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="start-seite"> <body class="start-seite">
<div id="site-header"></div> <div id="site-header"></div>
@@ -290,10 +290,10 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260828b"></script> <script src="assets/js/data-modis.js?v=20260828c"></script>
<script src="assets/js/data-scouts.js?v=20260828b"></script> <script src="assets/js/data-scouts.js?v=20260828c"></script>
<script src="assets/js/i18n-index.js?v=20260828b"></script> <script src="assets/js/i18n-index.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
// Gleiche URL wie in assets/js/forms.js / postfach.html — läuft seit // Gleiche URL wie in assets/js/forms.js / postfach.html — läuft seit
// 05.08.2026 auf dem eigenen Server statt auf Cloudflare Workers. // 05.08.2026 auf dem eigenen Server statt auf Cloudflare Workers.
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Kontakt, Impressum und Datenschutz von DOGFATHER UNIVERSE." /> <meta name="twitter:description" content="Kontakt, Impressum und Datenschutz von DOGFATHER UNIVERSE." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body> <body>
<div id="site-header"></div> <div id="site-header"></div>
@@ -126,7 +126,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-kontakt.js?v=20260828b"></script> <script src="assets/js/i18n-kontakt.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Alle Social-Media- und Musik-Links von DogFather an einem Ort — plus QR-Codes." /> <meta name="twitter:description" content="Alle Social-Media- und Musik-Links von DogFather an einem Ort — plus QR-Codes." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* Rabattcodes: an das Supporter-Abo gekoppelt (Nutzer-Feedback /* Rabattcodes: an das Supporter-Abo gekoppelt (Nutzer-Feedback
03.08.2026: "verbinde es mit dem Abo... wenn die Leute drauf drücken 03.08.2026: "verbinde es mit dem Abo... wenn die Leute drauf drücken
@@ -145,8 +145,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-links.js?v=20260828b"></script> <script src="assets/js/i18n-links.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
(function () { (function () {
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DogFather als Manager bei der Spicy Media Agency: Scouts, Creator und faire Zusammenarbeit." /> <meta name="twitter:description" content="DogFather als Manager bei der Spicy Media Agency: Scouts, Creator und faire Zusammenarbeit." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-manager.jpg');--page-bg-mobile:url('/assets/img/bg-manager-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-manager.jpg');--page-bg-mobile:url('/assets/img/bg-manager-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -139,9 +139,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-manager.js?v=20260828b"></script> <script src="assets/js/data-manager.js?v=20260828c"></script>
<script src="assets/js/i18n-manager.js?v=20260828b"></script> <script src="assets/js/i18n-manager.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
// "Weitere Manager" (21.08.2026) -- siehe Kommentar bei #weitere-manager-root // "Weitere Manager" (21.08.2026) -- siehe Kommentar bei #weitere-manager-root
// oben. Aktuell IMMER window.MANAGERS === [] (siehe data-manager.js), Inhalt // oben. Aktuell IMMER window.MANAGERS === [] (siehe data-manager.js), Inhalt
+9 -9
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos und Videos rund um Husky Casper an einem Ort." /> <meta name="twitter:description" content="Fotos und Videos rund um Husky Casper an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" data-welt="casper" style="--page-bg:url('/assets/img/bg-medien-casper.jpg');--page-bg-mobile:url('/assets/img/bg-medien-casper-mobile.jpg');"> <body class="mit-hintergrund" data-welt="casper" style="--page-bg:url('/assets/img/bg-medien-casper.jpg');--page-bg-mobile:url('/assets/img/bg-medien-casper-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -59,10 +59,10 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260828b"></script> <script src="assets/js/data-media.js?v=20260828c"></script>
<script src="assets/js/data-videos.js?v=20260828b"></script> <script src="assets/js/data-videos.js?v=20260828c"></script>
<script src="assets/js/medien-welt.js?v=20260828b"></script> <script src="assets/js/medien-welt.js?v=20260828c"></script>
<script src="assets/js/i18n-medien-casper.js?v=20260828b"></script> <script src="assets/js/i18n-medien-casper.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus DogFathers Welt an einem Ort." /> <meta name="twitter:description" content="Fotos, Videos und Events aus DogFathers Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" data-welt="dogfather" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');"> <body class="mit-hintergrund" data-welt="dogfather" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -65,11 +65,11 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260828b"></script> <script src="assets/js/data-media.js?v=20260828c"></script>
<script src="assets/js/data-videos.js?v=20260828b"></script> <script src="assets/js/data-videos.js?v=20260828c"></script>
<script src="assets/js/data-aktionen.js?v=20260828b"></script> <script src="assets/js/data-aktionen.js?v=20260828c"></script>
<script src="assets/js/medien-welt.js?v=20260828b"></script> <script src="assets/js/medien-welt.js?v=20260828c"></script>
<script src="assets/js/i18n-medien-dogfather.js?v=20260828b"></script> <script src="assets/js/i18n-medien-dogfather.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus der HasiDog-Welt an einem Ort." /> <meta name="twitter:description" content="Fotos, Videos und Events aus der HasiDog-Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" data-welt="hasidog" style="--page-bg:url('/assets/img/bg-medien-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-medien-hasidog-mobile.jpg');"> <body class="mit-hintergrund" data-welt="hasidog" style="--page-bg:url('/assets/img/bg-medien-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-medien-hasidog-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -65,11 +65,11 @@
</div> </div>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260828b"></script> <script src="assets/js/data-media.js?v=20260828c"></script>
<script src="assets/js/data-videos.js?v=20260828b"></script> <script src="assets/js/data-videos.js?v=20260828c"></script>
<script src="assets/js/data-aktionen.js?v=20260828b"></script> <script src="assets/js/data-aktionen.js?v=20260828c"></script>
<script src="assets/js/medien-welt.js?v=20260828b"></script> <script src="assets/js/medien-welt.js?v=20260828c"></script>
<script src="assets/js/i18n-medien-hasidog.js?v=20260828b"></script> <script src="assets/js/i18n-medien-hasidog.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -16,10 +16,10 @@
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="robots" content="noindex" /> <!-- generische URL, echte Team-Seiten verlinken hierher --> <meta name="robots" content="noindex" /> <!-- generische URL, echte Team-Seiten verlinken hierher -->
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
.profil-photo { aspect-ratio: 4/5; max-width: 420px; margin: 0 auto; } .profil-photo { aspect-ratio: 4/5; max-width: 420px; margin: 0 auto; }
.profil-photo img { width: 100%; height: 100%; object-fit: cover; display: block; } .profil-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
@@ -130,12 +130,12 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260828b"></script> <script src="assets/js/data-modis.js?v=20260828c"></script>
<script src="assets/js/data-scouts.js?v=20260828b"></script> <script src="assets/js/data-scouts.js?v=20260828c"></script>
<script src="assets/js/data-creator.js?v=20260828b"></script> <script src="assets/js/data-creator.js?v=20260828c"></script>
<script src="assets/js/data-manager.js?v=20260828b"></script> <script src="assets/js/data-manager.js?v=20260828c"></script>
<script src="assets/js/i18n-profil.js?v=20260828b"></script> <script src="assets/js/i18n-profil.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", async () => { document.addEventListener("DOMContentLoaded", async () => {
const slug = new URLSearchParams(location.search).get("p") || ""; const slug = new URLSearchParams(location.search).get("p") || "";
+91
View File
@@ -0,0 +1,91 @@
/* =====================================================================
Verkleinert bild-vorbereiten.js richtig?
Läuft in einem echten Browser (Canvas/Image gibt es nur dort). Erzeugt
Testbilder verschiedener Größe/Format und prüft das Verhalten, auf das
es ankommt: große Bilder werden auf die vorgegebene Breite gebracht,
kleine bleiben unangetastet, große PNGs werden zu JPEG, und die
Avatar-Grenze (512) macht ein Foto deutlich kleiner als die
Verwaltungs-Grenze (1600).
===================================================================== */
import { chromium } from "playwright";
import { readFileSync } from "node:fs";
const quelle = readFileSync("assets/js/bild-vorbereiten.js", "utf8");
const browser = await chromium.launch();
const seite = await browser.newPage();
await seite.setContent("<!doctype html><html><body></body></html>");
await seite.addScriptTag({ content: quelle });
let ok = 0, fehl = 0;
const pruefe = (name, gut, info) => {
if (gut) { ok++; console.log(" ok " + name + (info ? " -> " + info : "")); }
else { fehl++; console.log(" FEHL " + name + (info ? " -> " + info : "")); }
};
/* Hilfsfunktion im Browser: erzeugt ein Testbild als File, jagt es durch
bildVorbereiten und meldet Maße/Größe/Typ vorher und nachher. */
const test = (breite, hoehe, typ, opt) => seite.evaluate(async ([breite, hoehe, typ, opt]) => {
const c = document.createElement("canvas");
c.width = breite; c.height = hoehe;
const ctx = c.getContext("2d");
/* Echtes Zufallsrauschen, damit die Testbilder realistisch groß werden
(ein Muster oder eine Fläche würde PNG so stark komprimieren, dass die
"großes PNG"-Grenze von 400 KB nie erreicht wird -- dann bliebe der
PNG->JPEG-Pfad ungetestet). */
const img = ctx.createImageData(breite, hoehe);
for (let i = 0; i < img.data.length; i += 4) {
img.data[i] = Math.random() * 256; img.data[i+1] = Math.random() * 256;
img.data[i+2] = Math.random() * 256; img.data[i+3] = 255;
}
ctx.putImageData(img, 0, 0);
const blob = await new Promise((f) => c.toBlob(f, typ, 0.95));
const datei = new File([blob], "test." + (typ === "image/png" ? "png" : "jpg"), { type: typ });
const raus = await window.bildVorbereiten(datei, opt);
/* Maße des Ergebnisses auslesen. */
const masse = await new Promise((f) => {
const b = new Image();
b.onload = () => f({ w: b.naturalWidth, h: b.naturalHeight });
b.src = URL.createObjectURL(raus);
});
return { vorherBytes: datei.size, nachherBytes: raus.size, w: masse.w, h: masse.h, typ: raus.type };
}, [breite, hoehe, typ, opt]);
console.log("\n=== Großes Foto, Verwaltungs-Grenze (1600) ===");
{
const r = await test(2400, 1350, "image/jpeg", { maxBreite: 1600 });
pruefe("wird auf 1600 Breite gebracht", r.w === 1600, `${r.w}px breit`);
pruefe("wird kleiner", r.nachherBytes < r.vorherBytes, `${Math.round(r.vorherBytes/1024)} -> ${Math.round(r.nachherBytes/1024)} KB`);
}
console.log("\n=== Großes Foto, Avatar-Grenze (512) ===");
{
const r = await test(2400, 1350, "image/jpeg", { maxBreite: 512 });
pruefe("wird auf 512 Breite gebracht", r.w === 512, `${r.w}px breit`);
pruefe("Avatar ist DEUTLICH kleiner als 1600er", r.nachherBytes < 80 * 1024, `${Math.round(r.nachherBytes/1024)} KB`);
}
console.log("\n=== Kleines Bild bleibt unangetastet ===");
{
const r = await test(300, 300, "image/jpeg", { maxBreite: 512 });
pruefe("300px-Bild behält 300px", r.w === 300, `${r.w}px`);
}
console.log("\n=== Großes PNG wird zu JPEG ===");
{
const r = await test(2000, 1200, "image/png", { maxBreite: 1600 });
pruefe("Format wird JPEG", r.typ === "image/jpeg", r.typ);
pruefe("auf 1600 gebracht", r.w === 1600, `${r.w}px`);
}
console.log("\n=== Seitenverhältnis bleibt erhalten ===");
{
const r = await test(1600, 900, "image/jpeg", { maxBreite: 800 });
const verh = (r.w / r.h).toFixed(2);
pruefe("16:9 bleibt 16:9", verh === "1.78", `${r.w}x${r.h} (${verh})`);
}
await browser.close();
console.log(`\n===== ${ok} bestanden, ${fehl} fehlgeschlagen =====`);
process.exitCode = fehl ? 1 : 0;
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Rabattcodes von Dogis Partnern für Team Dogi — spar bares Geld bei ausgewählten Marken." /> <meta name="twitter:description" content="Rabattcodes von Dogis Partnern für Team Dogi — spar bares Geld bei ausgewählten Marken." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* Leere-Zustand-Kachel im "Gutschein"-Look: gestrichelter Rand wie ein /* Leere-Zustand-Kachel im "Gutschein"-Look: gestrichelter Rand wie ein
ausgeschnittener Coupon, damit auch OHNE echte Codes schon klar ist, ausgeschnittener Coupon, damit auch OHNE echte Codes schon klar ist,
@@ -131,8 +131,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-rabattcodes.js?v=20260828b"></script> <script src="assets/js/i18n-rabattcodes.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
(function () { (function () {
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
+20 -15
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Was die Community und das Team über DogFather sagen." /> <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" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-stimmen.jpg');--page-bg-mobile:url('/assets/img/bg-stimmen-mobile.jpg');"> <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> <div id="site-header"></div>
@@ -70,13 +70,17 @@
<!-- Profilbild-Auswahl (21.08.2026, Nutzer-Wunsch: "ich soll auch <!-- Profilbild-Auswahl (21.08.2026, Nutzer-Wunsch: "ich soll auch
paar geile bilder zum aussuchen haben als profilbild falls die paar geile bilder zum aussuchen haben als profilbild falls die
leute kein bild mit schicken, das soll denen auch als leute kein bild mit schicken, das soll denen auch als
möglichkeit gegeben sein"). Bewusst OHNE Datei-Upload: das möglichkeit gegeben sein"). Die festen Kacheln kommen aus
Formular ist öffentlich und ohne Anmeldung erreichbar, ein data-stimmen-avatare.js, damit Seite und Verwaltung dieselbe
offener Upload wäre eine Einladung für beliebiges Material. Auswahl zeigen.
Wer ein eigenes Foto möchte, schickt es Dogi direkt — er kann Dazu eine "eigenes Bild"-Kachel mit echtem Datei-Upload (auch
es in der Verwaltung hinterlegen. Die Kacheln werden aus 21.08.2026 ergänzt; ein früherer Kommentar hier behauptete noch
data-stimmen-avatare.js aufgebaut, damit Seite und Verwaltung "kein Upload" -- das stimmte nicht mehr und ist am 28.08.2026
garantiert dieselbe Auswahl zeigen. --> 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"> <div class="field">
<span class="stimmen-avatar-titel" data-i18n="st_form_avatar_label">Dein Profilbild (optional)</span> <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> <p class="small muted stimmen-avatar-hinweis" data-i18n="st_form_avatar_hinweis">Ohne Auswahl erscheint einfach der erste Buchstabe deines Namens.</p>
@@ -102,9 +106,10 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-stimmen-avatare.js?v=20260828b"></script> <script src="assets/js/data-stimmen-avatare.js?v=20260828c"></script>
<script src="assets/js/i18n-stimmen.js?v=20260828b"></script> <script src="assets/js/i18n-stimmen.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script src="assets/js/stimmen.js?v=20260828b"></script> <script src="assets/js/bild-vorbereiten.js?v=20260828c"></script>
<script src="assets/js/stimmen.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die persönliche Geschichte hinter DogFather — Filipe, Streamer, Manager bei Spicy Media und Hundepapa von Husky Casper." /> <meta name="twitter:description" content="Die persönliche Geschichte hinter DogFather — Filipe, Streamer, Manager bei Spicy Media und Hundepapa von Husky Casper." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamer.jpg');--page-bg-mobile:url('/assets/img/bg-streamer-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamer.jpg');--page-bg-mobile:url('/assets/img/bg-streamer-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -217,7 +217,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-streamer.js?v=20260828b"></script> <script src="assets/js/i18n-streamer.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+9 -9
View File
@@ -19,17 +19,17 @@
<meta name="twitter:description" content="Wann geht DogFather live? Streamplan und Livebereich." /> <meta name="twitter:description" content="Wann geht DogFather live? Streamplan und Livebereich." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260828b');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260828b');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260828c');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260828c');">
<div id="site-header"></div> <div id="site-header"></div>
<main> <main>
<section class="hero page-bg"> <section class="hero page-bg">
<div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260828b" alt="" loading="eager" /></div> <div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260828c" alt="" loading="eager" /></div>
<div class="container"> <div class="container">
<span class="eyebrow" data-i18n="sp_eyebrow">Welt 1 — DogFather</span> <span class="eyebrow" data-i18n="sp_eyebrow">Welt 1 — DogFather</span>
<h1 data-i18n="sp_h1">Streamplan &amp; Livebereich</h1> <h1 data-i18n="sp_h1">Streamplan &amp; Livebereich</h1>
@@ -126,8 +126,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-streamplan.js?v=20260828b"></script> <script src="assets/js/i18n-streamplan.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script src="assets/js/streamplan.js?v=20260828b"></script> <script src="assets/js/streamplan.js?v=20260828c"></script>
</body> </body>
</html> </html>
+7 -7
View File
@@ -9,10 +9,10 @@
<link rel="manifest" href="/manifest.json" /> <link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#0b0d10" /> <meta name="theme-color" content="#0b0d10" />
<meta name="robots" content="noindex" /> <meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* ===================================================================== /* =====================================================================
Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback
@@ -515,9 +515,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-supporter.js?v=20260828b"></script> <script src="assets/js/i18n-supporter.js?v=20260828c"></script>
<script src="assets/js/supporter.js?v=20260828b"></script> <script src="assets/js/supporter.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
(function () { (function () {
const S = window.DogiSupporter; const S = window.DogiSupporter;
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." /> <meta name="twitter:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-modis.jpg');--page-bg-mobile:url('/assets/img/bg-modis.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-modis.jpg');--page-bg-mobile:url('/assets/img/bg-modis.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -72,9 +72,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260828b"></script> <script src="assets/js/data-modis.js?v=20260828c"></script>
<script src="assets/js/i18n-team-modis.js?v=20260828b"></script> <script src="assets/js/i18n-team-modis.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("modis-grid"); const grid = document.getElementById("modis-grid");
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Scouts von Team Dogi bei Spicy Media." /> <meta name="twitter:description" content="Die Scouts von Team Dogi bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-scouts.jpg');--page-bg-mobile:url('/assets/img/bg-scouts-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-scouts.jpg');--page-bg-mobile:url('/assets/img/bg-scouts-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -49,9 +49,9 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/data-scouts.js?v=20260828b"></script> <script src="assets/js/data-scouts.js?v=20260828c"></script>
<script src="assets/js/i18n-team-scouts.js?v=20260828b"></script> <script src="assets/js/i18n-team-scouts.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("scouts-grid"); const grid = document.getElementById("scouts-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Eine persönliche Widmung von Dogi an Tili — seine TikTok-Muddi, die erste und bis heute einzige Streamerin, die ihm all die Zeit treu geblieben ist." /> <meta name="twitter:description" content="Eine persönliche Widmung von Dogi an Tili — seine TikTok-Muddi, die erste und bis heute einzige Streamerin, die ihm all die Zeit treu geblieben ist." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* Gleiche Anpassung wie vanvan.html: der site-weit etwas größere /* Gleiche Anpassung wie vanvan.html: der site-weit etwas größere
Fließtext wirkt bei einem so langen persönlichen Brief zu wuchtig — Fließtext wirkt bei einem so langen persönlichen Brief zu wuchtig —
@@ -153,7 +153,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-tt-muddi.js?v=20260828b"></script> <script src="assets/js/i18n-tt-muddi.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan erzählt ihre Geschichte: wie sie zu Team Dogi kam, wer sie ist und was DogFather und Team Dogi ihr bedeuten." /> <meta name="twitter:description" content="VanVan erzählt ihre Geschichte: wie sie zu Team Dogi kam, wer sie ist und was DogFather und Team Dogi ihr bedeuten." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* Auf Wunsch: der site-weit vergrößerte Fließtext wirkte auf VanVans /* Auf Wunsch: der site-weit vergrößerte Fließtext wirkte auf VanVans
eigener Seite zu groß (viel Text am Stück) — hier gezielt wieder eigener Seite zu groß (viel Text am Stück) — hier gezielt wieder
@@ -175,7 +175,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-vanvan.js?v=20260828b"></script> <script src="assets/js/i18n-vanvan.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+10 -10
View File
@@ -19,10 +19,10 @@
<link rel="apple-touch-icon" href="assets/img/apple-touch-icon-admin.png" /> <link rel="apple-touch-icon" href="assets/img/apple-touch-icon-admin.png" />
<meta name="apple-mobile-web-app-title" content="DogiCrew-Verwaltung" /> <meta name="apple-mobile-web-app-title" content="DogiCrew-Verwaltung" />
<meta name="theme-color" content="#0e0a16" /> <meta name="theme-color" content="#0e0a16" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
<style> <style>
/* ===================================================================== /* =====================================================================
verwaltung.html — Dogis privater Command-Center-Bereich. verwaltung.html — Dogis privater Command-Center-Bereich.
@@ -1285,12 +1285,12 @@
<!-- 21.08.2026: für den "Bestehende Mitglieder importieren"-Knopf in der <!-- 21.08.2026: für den "Bestehende Mitglieder importieren"-Knopf in der
Team-Verwaltung -- liest die von Hand gepflegten Profile aus diesen Team-Verwaltung -- liest die von Hand gepflegten Profile aus diesen
Dateien aus und bietet an, sie 1:1 in die Datenbank zu übernehmen. --> Dateien aus und bietet an, sie 1:1 in die Datenbank zu übernehmen. -->
<script src="assets/js/data-modis.js?v=20260828b"></script> <script src="assets/js/data-modis.js?v=20260828c"></script>
<script src="assets/js/data-scouts.js?v=20260828b"></script> <script src="assets/js/data-scouts.js?v=20260828c"></script>
<script src="assets/js/data-creator.js?v=20260828b"></script> <script src="assets/js/data-creator.js?v=20260828c"></script>
<script src="assets/js/data-manager.js?v=20260828b"></script> <script src="assets/js/data-manager.js?v=20260828c"></script>
<script src="assets/js/data-stimmen-avatare.js?v=20260828b"></script> <script src="assets/js/data-stimmen-avatare.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<!-- Versionsnummer bewusst hochgesetzt (27.08.2026): Caddy liefert Assets mit <!-- Versionsnummer bewusst hochgesetzt (27.08.2026): Caddy liefert Assets mit
max-age=14400, ein Browser hätte die alte Anmelde-Logik sonst bis zu vier max-age=14400, ein Browser hätte die alte Anmelde-Logik sonst bis zu vier
Stunden weiterbenutzt und Dogi wäre trotz Umstellung weiter ohne Code Stunden weiterbenutzt und Dogi wäre trotz Umstellung weiter ohne Code
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Werte, nach denen DogFather als Manager bei Spicy Media arbeitet." /> <meta name="twitter:description" content="Die Werte, nach denen DogFather als Manager bei Spicy Media arbeitet." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-werte.jpg');--page-bg-mobile:url('/assets/img/bg-werte-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-werte.jpg');--page-bg-mobile:url('/assets/img/bg-werte-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -113,7 +113,7 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-werte.js?v=20260828b"></script> <script src="assets/js/i18n-werte.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
</body> </body>
</html> </html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Geschichte von DogFather in einer interaktiven Zeitleiste." /> <meta name="twitter:description" content="Die Geschichte von DogFather in einer interaktiven Zeitleiste." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" /> <meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/main.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260828c" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828b" /> <link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260828c" />
</head> </head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-zeitreise.jpg');--page-bg-mobile:url('/assets/img/bg-zeitreise-mobile.jpg');"> <body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-zeitreise.jpg');--page-bg-mobile:url('/assets/img/bg-zeitreise-mobile.jpg');">
<div id="site-header"></div> <div id="site-header"></div>
@@ -237,8 +237,8 @@
</main> </main>
<div id="site-footer"></div> <div id="site-footer"></div>
<script src="assets/js/i18n-zeitreise.js?v=20260828b"></script> <script src="assets/js/i18n-zeitreise.js?v=20260828c"></script>
<script src="assets/js/main.js?v=20260828b"></script> <script src="assets/js/main.js?v=20260828c"></script>
<script> <script>
/* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt /* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt
zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft