Sprung zum Inhalt: Seite ohne Maus in einem Schritt bedienbar

Der Tastatur-Test (pruef-tastatur.mjs, neu) zeigte auf allen fünf
geprüften Seiten dasselbe Bild: jedes Bedienelement erreichbar, Fokus
durchgehend sichtbar, keine Tastaturfalle -- aber kein Sprunglink.

Ohne ihn muss sich jemand, der die Tastatur benutzt, auf JEDER Seite
erneut durch das komplette Menü tabben (31 bis 52 Punkte), bevor der
eigentliche Inhalt beginnt. WCAG 2.4.1 verlangt genau diesen Ausweg.

An einer Stelle gelöst statt in 35 Dateien: renderHeader() in main.js
setzt das Sprungziel und stellt den Link davor.

Das tabindex="-1" am <main> ist der Teil, der meistens fehlt: ohne ihn
verschiebt der Sprung in Chrome und Safari nur die Bildlaufleiste, der
Tastaturfokus bleibt in der Navigation -- der nächste Tab landet wieder
im Menü und der Sprung war wirkungslos.

Cache-Buster auf 20260827a (244 Stellen), sonst bekäme niemand die
geänderte main.js und main.css ausgeliefert.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-27 01:21:31 +02:00
co-authored by Claude Opus 5
parent b99e3043b6
commit efe98e32a7
38 changed files with 417 additions and 243 deletions
+6 -6
View File
@@ -18,10 +18,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" />
<title>Seite nicht gefunden — DOGFATHER UNIVERSE</title>
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body>
<div id="site-header"></div>
@@ -41,7 +41,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-404.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-404.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Unterstütze Dogfather dauerhaft mit der DogiCrew 🩵 und sammle exklusive Treueprämien — die Teddy-Kollektion entsteht in Kooperation mit VanVan." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* =====================================================================
Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback
@@ -603,9 +603,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-abonnieren.js?v=20260821t"></script>
<script src="assets/js/supporter.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-abonnieren.js?v=20260827a"></script>
<script src="assets/js/supporter.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
(function () {
const S = window.DogiSupporter;
+5 -5
View File
@@ -20,10 +20,10 @@
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body>
<div id="site-header"></div>
@@ -134,6 +134,6 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Detailansicht einer Aktion oder eines Projekts von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body>
<div id="site-header"></div>
@@ -51,9 +51,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-aktionen.js?v=20260821t"></script>
<script src="assets/js/i18n-aktion-detail.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-aktionen.js?v=20260827a"></script>
<script src="assets/js/i18n-aktion-detail.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const params = new URLSearchParams(location.search);
+36
View File
@@ -37,6 +37,42 @@ ul { list-style: none; margin: 0; padding: 0; }
--shadow: 0 10px 30px rgba(0,0,0,.35);
}
/* ---------------------------------------------------------------------
Sprung zum Inhalt (Tastaturbedienung, WCAG 2.4.1)
Der Link ist das erste Element der Seite und für Mausnutzer unsichtbar.
Er darf aber NICHT mit display:none oder visibility:hidden versteckt
werden -- damit wäre er auch für die Tastatur verschwunden, und genau
die soll ihn ja erreichen. Deshalb wird er aus dem Bild geschoben und
kehrt zurück, sobald er den Fokus bekommt.
:focus statt :focus-visible -- ein Sprunglink wird ausschließlich per
Tastatur angesteuert, und ältere Browser kennen :focus-visible nicht;
die würden ihn dann nie zeigen.
Farbe bewusst der Akzentton auf dunklem Text (nicht umgekehrt): Das
ergibt rund 12:1 Kontrast, ohne dass ein greller Kasten aufblitzt.
--------------------------------------------------------------------- */
.site-skip {
position: absolute;
left: -9999px;
top: 0;
z-index: 3000;
background: var(--accent);
color: var(--accent-contrast);
font-family: var(--font-head);
font-weight: 700;
text-decoration: none;
padding: .85rem 1.4rem;
border-radius: 0 0 var(--radius) 0;
box-shadow: var(--shadow);
}
.site-skip:focus { left: 0; }
/* Das Sprungziel bekommt tabindex="-1" (siehe main.js). Ohne diese Regel
malt der Browser dann einen Fokusrahmen um den halben Bildschirm. */
main[tabindex="-1"]:focus { outline: none; }
body {
background: var(--bg);
color: var(--text);
+26
View File
@@ -75,6 +75,12 @@
}
const I18N_CORE = {
/* Steht als Erstes im Wörterbuch, weil es als Erstes angesprungen wird:
der Sprung über die Navigation direkt zum Inhalt. Sichtbar nur, wenn
er den Tastaturfokus hat -- mit der Maus bekommt ihn niemand zu sehen.
Ohne ihn muss man sich auf JEDER Seite erneut durch das komplette
Menü tabben (über 20 Punkte), bevor der eigentliche Text beginnt. */
nav_zum_inhalt: { de: "Zum Inhalt springen", "de-CH": "Zum Inhalt springe", en: "Skip to content", fr: "Aller au contenu", pt: "Ir para o conteúdo" },
nav_start: { de: "Start", "de-CH": "Start", en: "Home", fr: "Accueil", pt: "Início" },
/* Umbenennungen 20.08.2026 (Nutzer-Wunsch): Kategorie "DogFather" -> "Filipe",
Kategorie "HasiDog" -> "Dogi&Hasi". Die Schlüsselnamen (nav_dogfather...)
@@ -547,7 +553,27 @@
function renderHeader() {
const el = document.getElementById("site-header");
if (!el) return;
/* Sprungziel vorbereiten.
Das tabindex="-1" ist der entscheidende Teil und wird fast überall
vergessen: Ein Sprung auf ein Element, das von sich aus keinen Fokus
annehmen kann, verschiebt in Chrome und Safari nur die Bildlaufleiste
-- der Tastaturfokus bleibt oben in der Navigation stehen. Der nächste
Tab landet dann wieder im Menü, und der Sprung war wirkungslos.
Mit -1 nimmt <main> den Fokus programmatisch an, taucht aber selbst
NICHT in der Tab-Reihenfolge auf.
Beides nur setzen, wenn nichts dasteht: Falls eine Seite schon eine
eigene id oder ein eigenes tabindex hat, wird das nicht überfahren. */
const inhalt = document.querySelector("main");
if (inhalt) {
if (!inhalt.id) inhalt.id = "inhalt";
if (!inhalt.hasAttribute("tabindex")) inhalt.setAttribute("tabindex", "-1");
}
el.innerHTML = `
${inhalt ? `<a class="site-skip" href="#${inhalt.id}" data-i18n="nav_zum_inhalt">${t("nav_zum_inhalt")}</a>` : ""}
<header class="site-header">
<div class="nav-bar">
<a class="brand" href="index.html">
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Du bist Streamer und suchst einen Manager? Bewirb dich als Creator bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -70,8 +70,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821t"></script>
<script src="assets/js/i18n-bewerben-creator.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/forms.js?v=20260827a"></script>
<script src="assets/js/i18n-bewerben-creator.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -22,10 +22,10 @@
<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" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -68,8 +68,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821t"></script>
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/forms.js?v=20260827a"></script>
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Modi bei Team Dogi — DogFathers persönliches Community-Team." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -79,8 +79,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821t"></script>
<script src="assets/js/i18n-bewerben-modi.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/forms.js?v=20260827a"></script>
<script src="assets/js/i18n-bewerben-modi.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Scout für DogFather bei der Spicy Media Agentur — finde neue Talente." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -71,8 +71,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/forms.js?v=20260821t"></script>
<script src="assets/js/i18n-bewerben-scout.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/forms.js?v=20260827a"></script>
<script src="assets/js/i18n-bewerben-scout.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Werde Teil vom Team: Modi bei Team Dogi, Scout oder Creator bei Spicy Media, oder Kooperation anfragen." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -85,7 +85,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-bewerben.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-bewerben.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Der Husky an DogFathers Seite — das tierische Gesicht der HasiDog-Welt." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -85,7 +85,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-casper.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-casper.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Team Dogi ist Familie — die Community rund um DogFather und HasiDog." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -84,7 +84,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-community.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-community.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Content Creator, die Teil von DogFather / Spicy Media sind." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -60,9 +60,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-creator.js?v=20260821t"></script>
<script src="assets/js/i18n-creator.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-creator.js?v=20260827a"></script>
<script src="assets/js/i18n-creator.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
document.addEventListener("DOMContentLoaded", async () => {
const grid = document.getElementById("creator-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Wer ist DogFather wirklich? Persönlichkeit, Werte und die Geschichte hinter dem Content." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -158,7 +158,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-dogfather.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-dogfather.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+2 -2
View File
@@ -26,8 +26,8 @@
<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-title" content="DogFather" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<style>
/* =====================================================================
Zugangsseite — bewusst kein braves Standard-Login-Formular, sondern
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="HasiDog: Maskottchen, Musikprojekt und die verspielte, familiäre Seite von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -186,7 +186,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-hasidog.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-hasidog.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+8 -8
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DOGFATHER UNIVERSE: die Heimat von DogFather als Streamer, der HasiDog-Community und Manager DogFather bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body class="start-seite">
<div id="site-header"></div>
@@ -290,10 +290,10 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821t"></script>
<script src="assets/js/data-scouts.js?v=20260821t"></script>
<script src="assets/js/i18n-index.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-modis.js?v=20260827a"></script>
<script src="assets/js/data-scouts.js?v=20260827a"></script>
<script src="assets/js/i18n-index.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
// Gleiche URL wie in assets/js/forms.js / postfach.html — läuft seit
// 05.08.2026 auf dem eigenen Server statt auf Cloudflare Workers.
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Kontakt, Impressum und Datenschutz von DOGFATHER UNIVERSE." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body>
<div id="site-header"></div>
@@ -126,7 +126,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-kontakt.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-kontakt.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Alle Social-Media- und Musik-Links von DogFather an einem Ort — plus QR-Codes." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* Rabattcodes: an das Supporter-Abo gekoppelt (Nutzer-Feedback
03.08.2026: "verbinde es mit dem Abo... wenn die Leute drauf drücken
@@ -140,8 +140,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-links.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-links.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
(function () {
document.addEventListener("DOMContentLoaded", function () {
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="DogFather als Manager bei der Spicy Media Agency: Scouts, Creator und faire Zusammenarbeit." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -139,9 +139,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-manager.js?v=20260821t"></script>
<script src="assets/js/i18n-manager.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-manager.js?v=20260827a"></script>
<script src="assets/js/i18n-manager.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
// "Weitere Manager" (21.08.2026) -- siehe Kommentar bei #weitere-manager-root
// oben. Aktuell IMMER window.MANAGERS === [] (siehe data-manager.js), Inhalt
+9 -9
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos und Videos rund um Husky Casper an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -59,10 +59,10 @@
</div>
<div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821t"></script>
<script src="assets/js/data-videos.js?v=20260821t"></script>
<script src="assets/js/medien-welt.js?v=20260821t"></script>
<script src="assets/js/i18n-medien-casper.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-media.js?v=20260827a"></script>
<script src="assets/js/data-videos.js?v=20260827a"></script>
<script src="assets/js/medien-welt.js?v=20260827a"></script>
<script src="assets/js/i18n-medien-casper.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus DogFathers Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -65,11 +65,11 @@
</div>
<div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821t"></script>
<script src="assets/js/data-videos.js?v=20260821t"></script>
<script src="assets/js/data-aktionen.js?v=20260821t"></script>
<script src="assets/js/medien-welt.js?v=20260821t"></script>
<script src="assets/js/i18n-medien-dogfather.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-media.js?v=20260827a"></script>
<script src="assets/js/data-videos.js?v=20260827a"></script>
<script src="assets/js/data-aktionen.js?v=20260827a"></script>
<script src="assets/js/medien-welt.js?v=20260827a"></script>
<script src="assets/js/i18n-medien-dogfather.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+10 -10
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Fotos, Videos und Events aus der HasiDog-Welt an einem Ort." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</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');">
<div id="site-header"></div>
@@ -65,11 +65,11 @@
</div>
<div id="site-footer"></div>
<script src="assets/js/data-media.js?v=20260821t"></script>
<script src="assets/js/data-videos.js?v=20260821t"></script>
<script src="assets/js/data-aktionen.js?v=20260821t"></script>
<script src="assets/js/medien-welt.js?v=20260821t"></script>
<script src="assets/js/i18n-medien-hasidog.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-media.js?v=20260827a"></script>
<script src="assets/js/data-videos.js?v=20260827a"></script>
<script src="assets/js/data-aktionen.js?v=20260827a"></script>
<script src="assets/js/medien-welt.js?v=20260827a"></script>
<script src="assets/js/i18n-medien-hasidog.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+10 -10
View File
@@ -16,10 +16,10 @@
<meta name="twitter:card" content="summary_large_image" />
<meta name="robots" content="noindex" /> <!-- generische URL, echte Team-Seiten verlinken hierher -->
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
.profil-photo { aspect-ratio: 4/5; max-width: 420px; margin: 0 auto; }
.profil-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
@@ -130,12 +130,12 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821t"></script>
<script src="assets/js/data-scouts.js?v=20260821t"></script>
<script src="assets/js/data-creator.js?v=20260821t"></script>
<script src="assets/js/data-manager.js?v=20260821t"></script>
<script src="assets/js/i18n-profil.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-modis.js?v=20260827a"></script>
<script src="assets/js/data-scouts.js?v=20260827a"></script>
<script src="assets/js/data-creator.js?v=20260827a"></script>
<script src="assets/js/data-manager.js?v=20260827a"></script>
<script src="assets/js/i18n-profil.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
document.addEventListener("DOMContentLoaded", async () => {
const slug = new URLSearchParams(location.search).get("p") || "";
+112
View File
@@ -0,0 +1,112 @@
/* =====================================================================
Lässt sich die Seite ohne Maus bedienen?
WARUM DAS ZÄHLT
Wer eine Maus nicht führen kann, bedient eine Seite mit der
Tabulatortaste. Das betrifft weit mehr Menschen als man denkt —
Motorik, Tremor, temporäre Verletzungen, Bildschirmleser. Seit dem
Barrierefreiheitsstärkungsgesetz (28.06.2025) ist es für Onlineshops
und Dienstleistungen im elektronischen Geschäftsverkehr zudem
verpflichtend.
DIE DREI FEHLER, DIE MAN NICHT SIEHT
1. Ein Bedienelement lässt sich nicht anspringen. Für die Maus ist
es da, für die Tastatur existiert es nicht.
2. Der Fokus ist unsichtbar. Man springt weiter, sieht aber nicht,
wo man ist — als würde jemand den Mauszeiger ausblenden.
3. Eine Falle: Man kommt hinein, aber nicht mehr heraus. Dann ist
die Seite ab dort unbedienbar.
Keiner dieser Fehler fällt beim normalen Benutzen auf. Man findet
sie nur, wenn man es absichtlich versucht.
===================================================================== */
import { chromium } from "playwright";
const BASIS = "https://dogfather-universe.com";
const SEITEN = ["/", "/kontakt.html", "/supporter.html", "/abonnieren.html", "/stimmen.html"];
let ok = 0, fehl = 0;
const pruefe = (name, gut, info) => {
if (gut) { ok++; console.log(" ok " + name + (info ? " -> " + info : "")); }
else { fehl++; console.log(" FEHL " + name + (info ? " -> " + info : "")); }
};
const browser = await chromium.launch();
for (const pfad of SEITEN) {
console.log(`\n===== ${pfad} =====`);
const seite = await browser.newPage({ viewport: { width: 1280, height: 900 } });
await seite.goto(BASIS + pfad, { waitUntil: "networkidle", timeout: 45000 });
await seite.waitForTimeout(800);
/* 1. Wie viele Bedienelemente gibt es, und wie viele erreicht man? */
const bedienbar = await seite.evaluate(() => {
const auswahl = "a[href], button, input, select, textarea, summary, [tabindex]:not([tabindex='-1'])";
return [...document.querySelectorAll(auswahl)].filter((el) => {
const r = el.getBoundingClientRect();
const st = getComputedStyle(el);
return r.width > 0 && r.height > 0 && st.visibility !== "hidden" &&
st.display !== "none" && !el.disabled &&
!el.closest('[aria-hidden="true"], [inert]');
}).length;
});
/* Durchtabben und mitschreiben, wo man landet. */
const weg = [];
const MAX = Math.min(bedienbar + 15, 90);
for (let i = 0; i < MAX; i++) {
await seite.keyboard.press("Tab");
const wo = await seite.evaluate(() => {
const el = document.activeElement;
if (!el || el === document.body) return null;
const r = el.getBoundingClientRect();
const st = getComputedStyle(el);
return {
kennung: el.tagName + (el.id ? "#" + el.id : "") +
(typeof el.className === "string" && el.className
? "." + el.className.split(" ").filter(Boolean)[0] : ""),
sichtbar: r.width > 0 && r.height > 0,
/* Ein Fokusring kann als outline ODER als box-shadow gesetzt
sein -- beides zählt. Fehlt beides, sieht man nichts. */
ring: (st.outlineStyle !== "none" && parseFloat(st.outlineWidth) > 0) ||
/inset|rgb/.test(st.boxShadow || ""),
imBild: r.top >= -5 && r.bottom <= innerHeight + 5,
};
});
if (!wo) break;
weg.push(wo);
}
pruefe(" die Tastatur erreicht Bedienelemente", weg.length > 0,
weg.length + " von " + bedienbar + " erreicht");
/* 2. Ist der Fokus überall sichtbar? */
const ohneRing = weg.filter((w) => w.sichtbar && !w.ring);
pruefe(" der Fokus ist überall sichtbar", ohneRing.length === 0,
ohneRing.length ? ohneRing.slice(0, 3).map((w) => w.kennung).join(", ") : "durchgehend");
/* 3. Keine Falle: Der Weg darf nicht auf einem Element stehenbleiben. */
const letzte = weg.slice(-6).map((w) => w.kennung);
const haengt = letzte.length === 6 && new Set(letzte).size === 1;
pruefe(" keine Tastaturfalle", !haengt, haengt ? "haengt auf " + letzte[0] : "kein Steckenbleiben");
/* 4. Gibt es einen Sprung zum Inhalt? Ohne ihn muss man sich durch
das ganze Menü tabben, auf jeder einzelnen Seite. */
const sprung = await seite.evaluate(() => {
const a = document.querySelector('a[href^="#"]');
if (!a) return null;
const t = (a.textContent || "").toLowerCase();
return /inhalt|content|springen|skip/.test(t) ? a.textContent.trim() : null;
});
pruefe(" Sprung zum Inhalt vorhanden", !!sprung, sprung || "fehlt");
await seite.close();
}
await browser.close();
console.log(`\n===== ${ok} bestanden, ${fehl} fehlgeschlagen =====`);
process.exitCode = fehl ? 1 : 0;
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Rabattcodes von Dogis Partnern für Team Dogi — spar bares Geld bei ausgewählten Marken." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* Leere-Zustand-Kachel im "Gutschein"-Look: gestrichelter Rand wie ein
ausgeschnittener Coupon, damit auch OHNE echte Codes schon klar ist,
@@ -131,8 +131,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-rabattcodes.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-rabattcodes.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
(function () {
document.addEventListener("DOMContentLoaded", function () {
+8 -8
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Was die Community und das Team über DogFather sagen." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-stimmen.jpg');--page-bg-mobile:url('/assets/img/bg-stimmen-mobile.jpg');">
<div id="site-header"></div>
@@ -102,9 +102,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-stimmen-avatare.js?v=20260821t"></script>
<script src="assets/js/i18n-stimmen.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/stimmen.js?v=20260821t"></script>
<script src="assets/js/data-stimmen-avatare.js?v=20260827a"></script>
<script src="assets/js/i18n-stimmen.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script src="assets/js/stimmen.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die persönliche Geschichte hinter DogFather — Filipe, Streamer, Manager bei Spicy Media und Hundepapa von Husky Casper." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -217,7 +217,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-streamer.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-streamer.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+9 -9
View File
@@ -19,17 +19,17 @@
<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" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260821t');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260821t');">
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg?v=20260827a');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg?v=20260827a');">
<div id="site-header"></div>
<main>
<section class="hero page-bg">
<div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260821t" alt="" loading="eager" /></div>
<div class="hero-banner"><img src="/assets/img/bg-streamplan.jpg?v=20260827a" alt="" loading="eager" /></div>
<div class="container">
<span class="eyebrow" data-i18n="sp_eyebrow">Welt 1 — DogFather</span>
<h1 data-i18n="sp_h1">Streamplan &amp; Livebereich</h1>
@@ -126,8 +126,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-streamplan.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/streamplan.js?v=20260821t"></script>
<script src="assets/js/i18n-streamplan.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script src="assets/js/streamplan.js?v=20260827a"></script>
</body>
</html>
+7 -7
View File
@@ -9,10 +9,10 @@
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#0b0d10" />
<meta name="robots" content="noindex" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* =====================================================================
Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback
@@ -515,9 +515,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-supporter.js?v=20260821t"></script>
<script src="assets/js/supporter.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-supporter.js?v=20260827a"></script>
<script src="assets/js/supporter.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
(function () {
const S = window.DogiSupporter;
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -72,9 +72,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260821t"></script>
<script src="assets/js/i18n-team-modis.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-modis.js?v=20260827a"></script>
<script src="assets/js/i18n-team-modis.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("modis-grid");
+7 -7
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Scouts von Team Dogi bei Spicy Media." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -49,9 +49,9 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/data-scouts.js?v=20260821t"></script>
<script src="assets/js/i18n-team-scouts.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/data-scouts.js?v=20260827a"></script>
<script src="assets/js/i18n-team-scouts.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("scouts-grid");
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Eine persönliche Widmung von Dogi an Tili — seine TikTok-Muddi, die erste und bis heute einzige Streamerin, die ihm all die Zeit treu geblieben ist." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* Gleiche Anpassung wie vanvan.html: der site-weit etwas größere
Fließtext wirkt bei einem so langen persönlichen Brief zu wuchtig —
@@ -153,7 +153,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-tt-muddi.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-tt-muddi.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="VanVan erzählt ihre Geschichte: wie sie zu Team Dogi kam, wer sie ist und was DogFather und Team Dogi ihr bedeuten." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* Auf Wunsch: der site-weit vergrößerte Fließtext wirkte auf VanVans
eigener Seite zu groß (viel Text am Stück) — hier gezielt wieder
@@ -175,7 +175,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-vanvan.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-vanvan.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+11 -11
View File
@@ -19,10 +19,10 @@
<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="theme-color" content="#0e0a16" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
<style>
/* =====================================================================
verwaltung.html — Dogis privater Command-Center-Bereich.
@@ -1245,13 +1245,13 @@
<!-- 21.08.2026: für den "Bestehende Mitglieder importieren"-Knopf in der
Team-Verwaltung -- liest die von Hand gepflegten Profile aus diesen
Dateien aus und bietet an, sie 1:1 in die Datenbank zu übernehmen. -->
<script src="assets/js/data-modis.js?v=20260821t"></script>
<script src="assets/js/data-scouts.js?v=20260821t"></script>
<script src="assets/js/data-creator.js?v=20260821t"></script>
<script src="assets/js/data-manager.js?v=20260821t"></script>
<script src="assets/js/data-stimmen-avatare.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/admin-auth.js?v=20260821t"></script>
<script src="assets/js/data-modis.js?v=20260827a"></script>
<script src="assets/js/data-scouts.js?v=20260827a"></script>
<script src="assets/js/data-creator.js?v=20260827a"></script>
<script src="assets/js/data-manager.js?v=20260827a"></script>
<script src="assets/js/data-stimmen-avatare.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script src="assets/js/admin-auth.js?v=20260827a"></script>
<script>
(function () {
const API_BASE_URL = "https://postfach.dogfather-universe.com";
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Werte, nach denen DogFather als Manager bei Spicy Media arbeitet." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -113,7 +113,7 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-werte.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-werte.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
</body>
</html>
+6 -6
View File
@@ -19,10 +19,10 @@
<meta name="twitter:description" content="Die Geschichte von DogFather in einer interaktiven Zeitleiste." />
<meta name="twitter:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<link rel="stylesheet" href="assets/css/main.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260821t" />
<link rel="stylesheet" href="assets/css/main.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260827a" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260827a" />
</head>
<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>
@@ -237,8 +237,8 @@
</main>
<div id="site-footer"></div>
<script src="assets/js/i18n-zeitreise.js?v=20260821t"></script>
<script src="assets/js/main.js?v=20260821t"></script>
<script src="assets/js/i18n-zeitreise.js?v=20260827a"></script>
<script src="assets/js/main.js?v=20260827a"></script>
<script>
/* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt
zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft