Stimmen: nur noch die zwei Originalfiguren + eigenes Bild hochladen
Nutzer-Wunsch 21.08.2026: "benutz da bitte nur die originalen husky und hasen. mach nur die zwei. und die auswahl wo die leute selbst ein bild rein setzen können." - Auswahl von acht auf zwei reduziert (DogFather-Husky, HasiDog). Die übrigen Bilddateien bleiben liegen, falls sie je zurücksollen -- es genügt, die Zeile in data-stimmen-avatare.js und die Id in ERLAUBTE_AVATARE wieder zu ergänzen. - Neue Kachel "eigenes Bild" (gestrichelter Rand + Plus), die den Dateidialog öffnet, das Bild sofort hochlädt und als Vorschau in der Kachel zeigt. Bereits freigegebene Stimmen mit einer der entfernten Figuren zeigen wieder den Anfangsbuchstaben statt eines kaputten Bildes -- die Auflösung unbekannter Ids liefert null, das war schon so vorgesehen. Sicherheit des öffentlichen Uploads (bisher war Hochladen bewusst nur der Verwaltung erlaubt): - Gleiche multer-Härtung wie der Verwaltungs-Upload: nur JPG/PNG/WebP, max. 5 MB, zufälliger UUID-Dateiname (kein Originalname). - Der Server nimmt im Avatar-Feld weiterhin NUR bekannte Ids an oder eine Adresse, die exakt auf den eigenen Upload-Ordner zeigt und danach nur aus UUID + Bildendung besteht. Gegengetestet: fremde Domains, "../"-Ausbruch, .svg/.html, javascript:, angehängte Skripte und http statt https werden alle abgelehnt. - Missbrauchsbremse gegen Vollschreiben der Festplatte: max. 10 Uploads pro Stunde und IP. - Sichtbar wird ein Bild ohnehin erst, wenn die Stimme freigegeben wird. Mit Playwright end-to-end geprüft (10 Tests) plus 9 Sicherheitsfälle. Cache-Busting-Version auf 20260821q erhöht. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-404.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/i18n-abonnieren.js?v=20260821q"></script>
|
||||||
<script src="assets/js/supporter.js?v=20260821p"></script>
|
<script src="assets/js/supporter.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
const S = window.DogiSupporter;
|
const S = window.DogiSupporter;
|
||||||
|
|||||||
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-aktionen.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-aktion-detail.js?v=20260821p"></script>
|
<script src="assets/js/i18n-aktion-detail.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
const params = new URLSearchParams(location.search);
|
const params = new URLSearchParams(location.search);
|
||||||
|
|||||||
@@ -4157,6 +4157,20 @@ body.start-seite .music-toggle:focus-visible {
|
|||||||
box-shadow: 0 0 0 2px rgba(212, 175, 55, .45), 0 0 18px rgba(212, 175, 55, .4);
|
box-shadow: 0 0 0 2px rgba(212, 175, 55, .45), 0 0 18px rgba(212, 175, 55, .4);
|
||||||
}
|
}
|
||||||
.stimmen-avatar-kachel:focus-visible { outline: 2px solid #ffe9a8; outline-offset: 3px; }
|
.stimmen-avatar-kachel:focus-visible { outline: 2px solid #ffe9a8; outline-offset: 3px; }
|
||||||
|
/* "Eigenes Bild"-Kachel (21.08.2026): gestrichelter Rand, damit sofort
|
||||||
|
erkennbar ist, dass hier noch nichts drin ist und etwas hinzugefügt
|
||||||
|
werden kann -- im Unterschied zu den fertigen Auswahlbildern daneben.
|
||||||
|
Sobald ein Bild hochgeladen wurde, ersetzt das <img> das Plus-Zeichen
|
||||||
|
und die Kachel sieht aus wie die anderen. */
|
||||||
|
.stimmen-avatar-eigenes { border-style: dashed; border-color: rgba(255, 233, 168, .45); }
|
||||||
|
.stimmen-avatar-eigenes:has(img) { border-style: solid; }
|
||||||
|
.stimmen-avatar-plus {
|
||||||
|
display: flex; align-items: center; justify-content: center;
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
font-size: 1.3rem; line-height: 1; color: #ffe9a8;
|
||||||
|
}
|
||||||
|
/* Während des Hochladens: kurz gedimmt, damit klar ist, dass etwas läuft. */
|
||||||
|
.stimmen-avatar-eigenes.laedt { opacity: .5; pointer-events: none; }
|
||||||
@media (prefers-reduced-motion: reduce) {
|
@media (prefers-reduced-motion: reduce) {
|
||||||
.stimmen-avatar-kachel { transition: none; }
|
.stimmen-avatar-kachel { transition: none; }
|
||||||
.stimmen-avatar-kachel:hover { transform: none; }
|
.stimmen-avatar-kachel:hover { transform: none; }
|
||||||
|
|||||||
@@ -18,15 +18,16 @@
|
|||||||
übereinstimmen — der Server nimmt nur bekannte Ids an, damit über das
|
übereinstimmen — der Server nimmt nur bekannte Ids an, damit über das
|
||||||
öffentliche Formular kein beliebiger Pfad eingeschleust werden kann.
|
öffentliche Formular kein beliebiger Pfad eingeschleust werden kann.
|
||||||
===================================================================== */
|
===================================================================== */
|
||||||
|
/* Nutzer-Wunsch 21.08.2026: "benutz da bitte nur die originalen husky und
|
||||||
|
hasen. mach nur die zwei." -- vorher standen hier acht Bilder (zusätzlich
|
||||||
|
Husky-Kopf, zwei Kosmos-Varianten, zwei Casper-Bilder, Logo). Die beiden
|
||||||
|
Originalfiguren bleiben, der Rest ist raus. Die Bilddateien selbst wurden
|
||||||
|
NICHT gelöscht: sollten sie je wieder gebraucht werden, genügt es, die
|
||||||
|
Zeile hier (und die passende Id in ERLAUBTE_AVATARE, siehe unten) wieder
|
||||||
|
zu ergänzen. */
|
||||||
window.STIMMEN_AVATARE = [
|
window.STIMMEN_AVATARE = [
|
||||||
{ id: "husky-hoodie", name: "DogFather-Husky", datei: "/assets/img/stimmen-avatare/stimme-husky-hoodie.png" },
|
{ id: "husky-hoodie", name: "DogFather-Husky", datei: "/assets/img/stimmen-avatare/stimme-husky-hoodie.png" },
|
||||||
{ id: "hase-hoodie", name: "HasiDog", datei: "/assets/img/stimmen-avatare/stimme-hase-hoodie.png" },
|
{ id: "hase-hoodie", name: "HasiDog", datei: "/assets/img/stimmen-avatare/stimme-hase-hoodie.png" },
|
||||||
{ id: "husky-kopf", name: "Husky-Kopf", datei: "/assets/img/stimmen-avatare/stimme-husky-kopf.png" },
|
|
||||||
{ id: "husky-kosmos", name: "Kosmos-Husky", datei: "/assets/img/stimmen-avatare/stimme-husky-kosmos.png" },
|
|
||||||
{ id: "hase-kosmos", name: "Kosmos-Hase", datei: "/assets/img/stimmen-avatare/stimme-hase-kosmos.png" },
|
|
||||||
{ id: "casper", name: "Casper", datei: "/assets/img/stimmen-avatare/stimme-casper.png" },
|
|
||||||
{ id: "casper-blick", name: "Casper (Blick)", datei: "/assets/img/stimmen-avatare/stimme-casper-blick.png" },
|
|
||||||
{ id: "logo", name: "DogFather-Logo", datei: "/assets/img/stimmen-avatare/stimme-logo.png" },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/* Liefert die Bilddatei zu einer gespeicherten Auswahl.
|
/* Liefert die Bilddatei zu einer gespeicherten Auswahl.
|
||||||
|
|||||||
+52
-2
@@ -21,23 +21,73 @@
|
|||||||
const kachel = (id, inhalt, titel) =>
|
const kachel = (id, inhalt, titel) =>
|
||||||
`<button type="button" class="stimmen-avatar-kachel" data-avatar="${id}" role="radio" aria-checked="false" title="${titel}" aria-label="${titel}">${inhalt}</button>`;
|
`<button type="button" class="stimmen-avatar-kachel" data-avatar="${id}" role="radio" aria-checked="false" title="${titel}" aria-label="${titel}">${inhalt}</button>`;
|
||||||
|
|
||||||
|
/* Letzte Kachel: eigenes Bild (21.08.2026, Nutzer-Wunsch "und die
|
||||||
|
auswahl wo die leute selbst ein bild rein setzen können"). Die
|
||||||
|
versteckte Datei-Auswahl liegt gleich daneben; die Kachel selbst
|
||||||
|
löst sie nur aus, damit die Optik zu den anderen Kacheln passt. */
|
||||||
wahlEl.innerHTML =
|
wahlEl.innerHTML =
|
||||||
kachel("", `<span class="stimmen-avatar-keins" aria-hidden="true">✦</span>`, "Kein Bild") +
|
kachel("", `<span class="stimmen-avatar-keins" aria-hidden="true">✦</span>`, "Kein Bild") +
|
||||||
liste.map((a) => kachel(a.id, `<img src="${a.datei}" alt="" loading="lazy" />`, a.name)).join("");
|
liste.map((a) => kachel(a.id, `<img src="${a.datei}" alt="" loading="lazy" />`, a.name)).join("") +
|
||||||
|
`<button type="button" class="stimmen-avatar-kachel stimmen-avatar-eigenes" id="stimmen-avatar-eigenes"
|
||||||
|
role="radio" aria-checked="false" title="Eigenes Bild hochladen" aria-label="Eigenes Bild hochladen">
|
||||||
|
<span class="stimmen-avatar-plus" aria-hidden="true">+</span>
|
||||||
|
</button>
|
||||||
|
<input type="file" id="stimmen-avatar-datei" accept="image/jpeg,image/png,image/webp" hidden />`;
|
||||||
|
|
||||||
|
const eigenesBtn = document.getElementById("stimmen-avatar-eigenes");
|
||||||
|
const dateiInput = document.getElementById("stimmen-avatar-datei");
|
||||||
|
let eigenesBildUrl = "";
|
||||||
|
|
||||||
const markiere = () => {
|
const markiere = () => {
|
||||||
wahlEl.querySelectorAll(".stimmen-avatar-kachel").forEach((b) => {
|
wahlEl.querySelectorAll(".stimmen-avatar-kachel").forEach((b) => {
|
||||||
const aktiv = b.dataset.avatar === gewaehlterAvatar;
|
// Die "eigenes Bild"-Kachel hat kein data-avatar; sie gilt als
|
||||||
|
// gewählt, wenn die aktuelle Auswahl die hochgeladene Adresse ist.
|
||||||
|
const wert = b === eigenesBtn ? eigenesBildUrl : b.dataset.avatar;
|
||||||
|
const aktiv = !!gewaehlterAvatar === !!wert && wert === gewaehlterAvatar;
|
||||||
b.classList.toggle("aktiv", aktiv);
|
b.classList.toggle("aktiv", aktiv);
|
||||||
b.setAttribute("aria-checked", aktiv ? "true" : "false");
|
b.setAttribute("aria-checked", aktiv ? "true" : "false");
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
wahlEl.addEventListener("click", (e) => {
|
wahlEl.addEventListener("click", (e) => {
|
||||||
const btn = e.target.closest(".stimmen-avatar-kachel");
|
const btn = e.target.closest(".stimmen-avatar-kachel");
|
||||||
if (!btn) return;
|
if (!btn) return;
|
||||||
|
if (btn === eigenesBtn) {
|
||||||
|
// Schon hochgeladen -> einfach wieder auswählen, sonst Dateidialog.
|
||||||
|
if (eigenesBildUrl) { gewaehlterAvatar = eigenesBildUrl; markiere(); }
|
||||||
|
else dateiInput.click();
|
||||||
|
return;
|
||||||
|
}
|
||||||
gewaehlterAvatar = btn.dataset.avatar;
|
gewaehlterAvatar = btn.dataset.avatar;
|
||||||
markiere();
|
markiere();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
dateiInput.addEventListener("change", async () => {
|
||||||
|
const datei = dateiInput.files && dateiInput.files[0];
|
||||||
|
if (!datei) return;
|
||||||
|
const fehlerEl = document.getElementById("stimmen-fehler");
|
||||||
|
eigenesBtn.classList.add("laedt");
|
||||||
|
try {
|
||||||
|
const form = new FormData();
|
||||||
|
form.append("image", datei);
|
||||||
|
const res = await fetch(`${API_BASE_URL}/testimonials/upload-avatar`, { method: "POST", body: form });
|
||||||
|
const data = await res.json();
|
||||||
|
if (!data.ok) {
|
||||||
|
if (fehlerEl) { fehlerEl.textContent = data.error || "Das Bild konnte nicht hochgeladen werden."; fehlerEl.classList.add("zeige"); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
eigenesBildUrl = data.url;
|
||||||
|
gewaehlterAvatar = data.url;
|
||||||
|
eigenesBtn.innerHTML = `<img src="${data.url}" alt="" />`;
|
||||||
|
markiere();
|
||||||
|
} catch {
|
||||||
|
if (fehlerEl) { fehlerEl.textContent = "Das Bild konnte nicht hochgeladen werden (keine Verbindung)."; fehlerEl.classList.add("zeige"); }
|
||||||
|
} finally {
|
||||||
|
eigenesBtn.classList.remove("laedt");
|
||||||
|
dateiInput.value = ""; // erlaubt, dieselbe Datei erneut zu wählen
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
markiere();
|
markiere();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/forms.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-bewerben-creator.js?v=20260821p"></script>
|
<script src="assets/js/i18n-bewerben-creator.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/forms.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260821p"></script>
|
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/forms.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-bewerben-modi.js?v=20260821p"></script>
|
<script src="assets/js/i18n-bewerben-modi.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/forms.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-bewerben-scout.js?v=20260821p"></script>
|
<script src="assets/js/i18n-bewerben-scout.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-bewerben.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-casper.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-community.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-creator.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-creator.js?v=20260821p"></script>
|
<script src="assets/js/i18n-creator.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></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
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-dogfather.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<style>
|
<style>
|
||||||
/* =====================================================================
|
/* =====================================================================
|
||||||
Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern
|
Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-hasidog.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+8
-8
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-modis.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-scouts.js?v=20260821p"></script>
|
<script src="assets/js/data-scouts.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-index.js?v=20260821p"></script>
|
<script src="assets/js/i18n-index.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></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
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-kontakt.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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
|
||||||
@@ -140,8 +140,8 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<div id="site-footer"></div>
|
<div id="site-footer"></div>
|
||||||
<script src="assets/js/i18n-links.js?v=20260821p"></script>
|
<script src="assets/js/i18n-links.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-manager.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-manager.js?v=20260821p"></script>
|
<script src="assets/js/i18n-manager.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></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
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-media.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-videos.js?v=20260821p"></script>
|
<script src="assets/js/data-videos.js?v=20260821q"></script>
|
||||||
<script src="assets/js/medien-welt.js?v=20260821p"></script>
|
<script src="assets/js/medien-welt.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-medien-casper.js?v=20260821p"></script>
|
<script src="assets/js/i18n-medien-casper.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+10
-10
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-media.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-videos.js?v=20260821p"></script>
|
<script src="assets/js/data-videos.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-aktionen.js?v=20260821p"></script>
|
<script src="assets/js/data-aktionen.js?v=20260821q"></script>
|
||||||
<script src="assets/js/medien-welt.js?v=20260821p"></script>
|
<script src="assets/js/medien-welt.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-medien-dogfather.js?v=20260821p"></script>
|
<script src="assets/js/i18n-medien-dogfather.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+10
-10
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-media.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-videos.js?v=20260821p"></script>
|
<script src="assets/js/data-videos.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-aktionen.js?v=20260821p"></script>
|
<script src="assets/js/data-aktionen.js?v=20260821q"></script>
|
||||||
<script src="assets/js/medien-welt.js?v=20260821p"></script>
|
<script src="assets/js/medien-welt.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-medien-hasidog.js?v=20260821p"></script>
|
<script src="assets/js/i18n-medien-hasidog.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+10
-10
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/data-modis.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-scouts.js?v=20260821p"></script>
|
<script src="assets/js/data-scouts.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-creator.js?v=20260821p"></script>
|
<script src="assets/js/data-creator.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-manager.js?v=20260821p"></script>
|
<script src="assets/js/data-manager.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-profil.js?v=20260821p"></script>
|
<script src="assets/js/i18n-profil.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></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") || "";
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/i18n-rabattcodes.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ import { getEventsPublic, getEventsAdmin, saveEvent, uploadEventImage } from "./
|
|||||||
import { getSpecialEventPublic, getSpecialEventAdmin, saveSpecialEvent } from "./routes/special-event.js";
|
import { getSpecialEventPublic, getSpecialEventAdmin, saveSpecialEvent } from "./routes/special-event.js";
|
||||||
import {
|
import {
|
||||||
submitTestimonial, getApprovedTestimonialsPublic, getTestimonialsAdmin, setTestimonialStatus, deleteTestimonial,
|
submitTestimonial, getApprovedTestimonialsPublic, getTestimonialsAdmin, setTestimonialStatus, deleteTestimonial,
|
||||||
|
uploadEigenesTestimonialBild,
|
||||||
setTestimonialAvatar, uploadTestimonialAvatar,
|
setTestimonialAvatar, uploadTestimonialAvatar,
|
||||||
} from "./routes/testimonials.js";
|
} from "./routes/testimonials.js";
|
||||||
import {
|
import {
|
||||||
@@ -195,6 +196,14 @@ app.post("/auth/login", wrap(login));
|
|||||||
app.get("/events-of-year", wrap(getEventsPublic));
|
app.get("/events-of-year", wrap(getEventsPublic));
|
||||||
app.get("/special-event", wrap(getSpecialEventPublic));
|
app.get("/special-event", wrap(getSpecialEventPublic));
|
||||||
app.post("/testimonials/submit", wrap(submitTestimonial));
|
app.post("/testimonials/submit", wrap(submitTestimonial));
|
||||||
|
/* Öffentlich, ohne Login: eigenes Profilbild für die eigene Stimme
|
||||||
|
hochladen (21.08.2026). Bewusst mit derselben multer-Härtung wie der
|
||||||
|
Verwaltungs-Upload (nur JPG/PNG/WebP, max. 5 MB, zufälliger Dateiname);
|
||||||
|
zusätzlich bremst die Route selbst Massen-Uploads pro IP aus (siehe
|
||||||
|
uploadEigenesTestimonialBild in routes/testimonials.js). Sichtbar wird
|
||||||
|
ein hochgeladenes Bild erst, wenn die zugehörige Stimme freigegeben
|
||||||
|
wird -- Einreichungen landen immer zuerst in der Warteschlange. */
|
||||||
|
app.post("/testimonials/upload-avatar", stimmenBildUpload.single("image"), wrap(uploadEigenesTestimonialBild));
|
||||||
app.get("/testimonials", wrap(getApprovedTestimonialsPublic));
|
app.get("/testimonials", wrap(getApprovedTestimonialsPublic));
|
||||||
app.get("/team", wrap(getTeamPublic));
|
app.get("/team", wrap(getTeamPublic));
|
||||||
app.get("/site-texts", wrap(getSiteTextsPublic));
|
app.get("/site-texts", wrap(getSiteTextsPublic));
|
||||||
|
|||||||
@@ -36,10 +36,65 @@ function forbidden(res) {
|
|||||||
Adresse oder etwas, das später als HTML/Adresse ausgewertet wird) und so
|
Adresse oder etwas, das später als HTML/Adresse ausgewertet wird) und so
|
||||||
auf einer freigegebenen Stimme fremde Inhalte einbetten. Es werden
|
auf einer freigegebenen Stimme fremde Inhalte einbetten. Es werden
|
||||||
deshalb ausschließlich diese festen Ids angenommen. */
|
deshalb ausschließlich diese festen Ids angenommen. */
|
||||||
const ERLAUBTE_AVATARE = [
|
/* 21.08.2026 auf die zwei Originalfiguren reduziert (Nutzer-Wunsch, siehe
|
||||||
"husky-hoodie", "hase-hoodie", "husky-kopf", "husky-kosmos",
|
data-stimmen-avatare.js). Muss mit der Liste dort übereinstimmen.
|
||||||
"hase-kosmos", "casper", "casper-blick", "logo",
|
Bereits freigegebene Stimmen mit einem der entfernten Bilder behalten
|
||||||
];
|
ihren Eintrag in der Datenbank -- sie zeigen dann wieder den
|
||||||
|
Anfangsbuchstaben, weil stimmeAvatarBild() die Id nicht mehr auflöst
|
||||||
|
(siehe dort: unbekannt -> null -> Buchstaben-Medaillon). Kein Fehler,
|
||||||
|
keine kaputten Bilder. */
|
||||||
|
const ERLAUBTE_AVATARE = ["husky-hoodie", "hase-hoodie"];
|
||||||
|
|
||||||
|
/* Eigenes hochgeladenes Bild (21.08.2026, Nutzer-Wunsch: "und die auswahl
|
||||||
|
wo die leute selbst ein bild rein setzen können").
|
||||||
|
|
||||||
|
Akzeptiert wird ausschließlich eine Adresse, die exakt auf unseren
|
||||||
|
eigenen Upload-Ordner zeigt und danach nur noch aus einem zufälligen
|
||||||
|
Dateinamen besteht (UUID + Endung, so legt multer sie an, siehe
|
||||||
|
index.js). Damit kann über dieses Feld weder eine fremde Adresse
|
||||||
|
eingeschleust noch per "../" aus dem Ordner ausgebrochen werden --
|
||||||
|
dieselbe Schutzabsicht wie bei der festen Id-Liste oben. */
|
||||||
|
const UPLOAD_BASIS = "https://postfach.dogfather-universe.com/uploads/testimonials/";
|
||||||
|
function istEigenesHochgeladenesBild(wert) {
|
||||||
|
if (!wert.startsWith(UPLOAD_BASIS)) return false;
|
||||||
|
const datei = wert.slice(UPLOAD_BASIS.length);
|
||||||
|
return /^[a-f0-9-]{36}\.(jpe?g|png|webp)$/i.test(datei);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Einfache Missbrauchsbremse für den öffentlichen Bild-Upload (kein Login
|
||||||
|
nötig). Ohne sie könnte jemand den Endpunkt in einer Schleife aufrufen
|
||||||
|
und die Festplatte des Servers vollschreiben. Bewusst schlicht im
|
||||||
|
Arbeitsspeicher gehalten: es gibt hier nur einen Serverprozess, und ein
|
||||||
|
Neustart (der den Zähler leert) ist kein Schaden. */
|
||||||
|
const UPLOAD_MAX_PRO_STUNDE = 10;
|
||||||
|
const uploadZaehler = new Map(); // ip -> { anzahl, fensterStart }
|
||||||
|
function uploadKontingentFrei(ip) {
|
||||||
|
const jetzt = Date.now();
|
||||||
|
const eintrag = uploadZaehler.get(ip);
|
||||||
|
if (!eintrag || jetzt - eintrag.fensterStart > 60 * 60 * 1000) {
|
||||||
|
uploadZaehler.set(ip, { anzahl: 1, fensterStart: jetzt });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (eintrag.anzahl >= UPLOAD_MAX_PRO_STUNDE) return false;
|
||||||
|
eintrag.anzahl += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Öffentlich (ohne Login): Profilbild für die eigene Einreichung hochladen.
|
||||||
|
Die Datei ist danach zwar unter ihrer zufälligen Adresse abrufbar, taucht
|
||||||
|
aber NIRGENDS auf, solange Dogi/VanVan die zugehörige Stimme nicht
|
||||||
|
freigeben -- jede Einreichung geht zuerst in die Warteschlange. Typ und
|
||||||
|
Größe begrenzt multer (nur JPG/PNG/WebP, max. 5 MB, zufälliger Name). */
|
||||||
|
export async function uploadEigenesTestimonialBild(req, res) {
|
||||||
|
const ip = req.ip || req.socket?.remoteAddress || "unbekannt";
|
||||||
|
if (!uploadKontingentFrei(ip)) {
|
||||||
|
return json(res, { ok: false, error: "Zu viele Uploads in kurzer Zeit. Bitte versuch es später nochmal." }, 429);
|
||||||
|
}
|
||||||
|
if (!req.file) return json(res, { ok: false, error: "Keine Bilddatei erhalten." }, 400);
|
||||||
|
const url = `${UPLOAD_BASIS}${req.file.filename}`;
|
||||||
|
logAction("anonym", "testimonial.eigenes_bild_hochgeladen", req.file.filename, null);
|
||||||
|
return json(res, { ok: true, url });
|
||||||
|
}
|
||||||
|
|
||||||
function oeffentlichesFeld(row) {
|
function oeffentlichesFeld(row) {
|
||||||
return {
|
return {
|
||||||
@@ -83,7 +138,7 @@ export async function submitTestimonial(req, res) {
|
|||||||
// (statt die Einreichung abzulehnen) — die Nachricht ist das Wichtige,
|
// (statt die Einreichung abzulehnen) — die Nachricht ist das Wichtige,
|
||||||
// und ein fehlendes Bild ist kein Grund, jemanden abzuweisen.
|
// und ein fehlendes Bild ist kein Grund, jemanden abzuweisen.
|
||||||
const gewaehlt = String(body.avatar || "").trim();
|
const gewaehlt = String(body.avatar || "").trim();
|
||||||
const avatar = ERLAUBTE_AVATARE.includes(gewaehlt) ? gewaehlt : null;
|
const avatar = ERLAUBTE_AVATARE.includes(gewaehlt) || istEigenesHochgeladenesBild(gewaehlt) ? gewaehlt : null;
|
||||||
|
|
||||||
const id = generateId();
|
const id = generateId();
|
||||||
db.prepare(
|
db.prepare(
|
||||||
|
|||||||
+8
-8
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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>
|
||||||
@@ -102,9 +102,9 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<div id="site-footer"></div>
|
<div id="site-footer"></div>
|
||||||
<script src="assets/js/data-stimmen-avatare.js?v=20260821p"></script>
|
<script src="assets/js/data-stimmen-avatare.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-stimmen.js?v=20260821p"></script>
|
<script src="assets/js/i18n-stimmen.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script src="assets/js/stimmen.js?v=20260821p"></script>
|
<script src="assets/js/stimmen.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-streamer.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+9
-9
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</head>
|
</head>
|
||||||
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260821p');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260821p');">
|
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260821q');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260821q');">
|
||||||
<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=20260821p" alt="" loading="eager" /></div>
|
<div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260821q" 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 & Livebereich</h1>
|
<h1 data-i18n="sp_h1">Streamplan & 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=20260821p"></script>
|
<script src="assets/js/i18n-streamplan.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script src="assets/js/streamplan.js?v=20260821p"></script>
|
<script src="assets/js/streamplan.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/i18n-supporter.js?v=20260821q"></script>
|
||||||
<script src="assets/js/supporter.js?v=20260821p"></script>
|
<script src="assets/js/supporter.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
const S = window.DogiSupporter;
|
const S = window.DogiSupporter;
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-modis.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-team-modis.js?v=20260821p"></script>
|
<script src="assets/js/i18n-team-modis.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
const grid = document.getElementById("modis-grid");
|
const grid = document.getElementById("modis-grid");
|
||||||
|
|||||||
+7
-7
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/data-scouts.js?v=20260821q"></script>
|
||||||
<script src="assets/js/i18n-team-scouts.js?v=20260821p"></script>
|
<script src="assets/js/i18n-team-scouts.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", () => {
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
const grid = document.getElementById("scouts-grid");
|
const grid = document.getElementById("scouts-grid");
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/i18n-tt-muddi.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<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=20260821p"></script>
|
<script src="assets/js/i18n-vanvan.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+11
-11
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
<style>
|
<style>
|
||||||
/* =====================================================================
|
/* =====================================================================
|
||||||
verwaltung.html — Dogis privater Command-Center-Bereich.
|
verwaltung.html — Dogis privater Command-Center-Bereich.
|
||||||
@@ -1216,13 +1216,13 @@
|
|||||||
<!-- 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=20260821p"></script>
|
<script src="assets/js/data-modis.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-scouts.js?v=20260821p"></script>
|
<script src="assets/js/data-scouts.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-creator.js?v=20260821p"></script>
|
<script src="assets/js/data-creator.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-manager.js?v=20260821p"></script>
|
<script src="assets/js/data-manager.js?v=20260821q"></script>
|
||||||
<script src="assets/js/data-stimmen-avatare.js?v=20260821p"></script>
|
<script src="assets/js/data-stimmen-avatare.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
<script src="assets/js/admin-auth.js?v=20260821p"></script>
|
<script src="assets/js/admin-auth.js?v=20260821q"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
const API_BASE_URL = "https://postfach.dogfather-universe.com";
|
const API_BASE_URL = "https://postfach.dogfather-universe.com";
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-werte.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+6
-6
@@ -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=20260821p" />
|
<link rel="stylesheet" href="assets/css/main.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821q" />
|
||||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821p" />
|
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821q" />
|
||||||
</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=20260821p"></script>
|
<script src="assets/js/i18n-zeitreise.js?v=20260821q"></script>
|
||||||
<script src="assets/js/main.js?v=20260821p"></script>
|
<script src="assets/js/main.js?v=20260821q"></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
|
||||||
|
|||||||
Reference in New Issue
Block a user