"Event des Jahres": Aktivieren-Schalter, leer bis befuellt, Detail-Fenster
Nutzer-Wunsch 20.08.2026: "diese zwei kisten sollen leer sein solang wie ich nichts rein setze, am besten sollen die sogar immer nur erscheinen wenn ich was rein setze und sie aktiviere ... wen ich drauf druecke dass dann ein kleines fenster aufgeht wo das bild bissl groesser ist mit einem groesseren text und beschreibung, und mit einem link ... die kacheln sollen auch bissl spezieller sein." - Kein hartkodierter Standardinhalt mehr auf der Startseite -- die Kachel UND der ganze Abschnitt bleiben komplett unsichtbar, bis mindestens ein Event in der Verwaltung ausgefuellt UND ueber einen neuen "Aktiv"-Schalter freigeschaltet ist. Genau 1 aktives Event -> zentrierte Einzelkachel statt halbleerem Zwei-Spalten-Raster. - Klick auf eine Kachel oeffnet jetzt ein Detail-Fenster (groesseres Bild, groesserer Titel/Text, optionaler direkter Link) statt sofort wegzunavigieren. - Kacheln bekommen einen goldenen Trophaeen-Akzent + dezenten wandernden Lichtschimmer statt der neutralen Standardkarten-Optik. - Bugfix unterwegs gefunden (Playwright-Screenshot): .jahres-event-card blieb trotz [hidden]-Attribut sichtbar (dieselbe Ursache wie der frühere .jahres-event-bild-Bug: display:block ueberschreibt die eingebaute [hidden]-Regel bei gleicher Spezifitaet) -- explizite [hidden]-Regel ergaenzt. - Backend: server-internal/routes/events.js liefert oeffentlich NUR noch aktivierte Slots aus (getEventsPublic), neuer authentifizierter Endpunkt getEventsAdmin liefert der Verwaltung auch Entwuerfe zum Vorausfuellen. 10 automatisierte Tests gegen eine Fake-DB bestanden. Backend-Teil (server-internal/) noch ohne Deploy-Zugriff -- Dogi muss ihn manuell auf dogiintern ausrollen, sonst bleibt die Startseite beim alten Verhalten (immer beide Slots zeigen, kein Aktiv-Schalter in der Verwaltung). 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="robots" content="noindex" />
|
||||
<title>Seite nicht gefunden — DOGFATHER UNIVERSE</title>
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-404.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<style>
|
||||
/* =====================================================================
|
||||
Preis-/Anmelde-Kiste — komplett neu gestaltet (Nutzer-Feedback
|
||||
@@ -454,9 +454,9 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-abonnieren.js?v=20260820d"></script>
|
||||
<script src="assets/js/supporter.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-abonnieren.js?v=20260820f"></script>
|
||||
<script src="assets/js/supporter.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
(function () {
|
||||
const S = window.DogiSupporter;
|
||||
|
||||
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="site-header"></div>
|
||||
@@ -134,6 +134,6 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+7
-7
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/i18n-aktion-detail.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-aktion-detail.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const params = new URLSearchParams(location.search);
|
||||
|
||||
+128
-6
@@ -1613,18 +1613,57 @@ header.site-header {
|
||||
gap: 1.2rem;
|
||||
}
|
||||
@media (max-width: 760px) { .jahres-events-grid { grid-template-columns: 1fr; } }
|
||||
/* Nutzer-Wunsch 20.08.2026: "die kacheln sollen auch bissl spezieller sein" —
|
||||
goldener Trophäen-Akzent statt der neutralen Standard-Kartenoptik (eigener,
|
||||
gedeckter Farbton, kein grelles Gold — augenschonend), plus ein dezenter
|
||||
wandernder Lichtschimmer oben (".jahres-event-shine"), der die Kachel als
|
||||
etwas Besonderes markiert statt als normale Karte. Jetzt ein <button>
|
||||
(öffnet ein Detail-Fenster) statt eines <a> (navigierte sofort weg) —
|
||||
deshalb hier zusätzlich ein vollständiger Button-Reset. */
|
||||
/* [hidden] explizit VOR der Klassenregel + als eigene Regel danach: ein
|
||||
simples "display:block" in .jahres-event-card hat dieselbe Spezifität
|
||||
wie die eingebaute [hidden]-UA-Regel des Browsers und würde sie sonst im
|
||||
Zweifel überschreiben (identischer Bug wie schon bei .jahres-event-bild
|
||||
weiter unten, hier per Playwright-Screenshot erneut gefunden — eine
|
||||
"leere" Kachel blieb trotz hidden-Attribut sichtbar). */
|
||||
.jahres-event-card[hidden] { display: none; }
|
||||
.jahres-event-card {
|
||||
display: block;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
font: inherit;
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
isolation: isolate;
|
||||
padding: 1.2rem 1.4rem;
|
||||
border-radius: calc(var(--radius) - 4px);
|
||||
border: 1px solid var(--border);
|
||||
background: rgba(255, 255, 255, .02);
|
||||
transition: border-color .15s ease, transform .15s ease;
|
||||
border: 1px solid rgba(212, 175, 55, .35);
|
||||
background:
|
||||
radial-gradient(circle at 15% 0%, rgba(212, 175, 55, .08), transparent 55%),
|
||||
rgba(255, 255, 255, .02);
|
||||
transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
|
||||
}
|
||||
.jahres-event-card:hover { border-color: var(--accent); transform: translateY(-3px); }
|
||||
.jahres-event-card:hover, .jahres-event-card:focus-visible {
|
||||
border-color: rgba(212, 175, 55, .7);
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 10px 26px rgba(0, 0, 0, .35), 0 0 22px rgba(212, 175, 55, .18);
|
||||
}
|
||||
.jahres-event-shine {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0; left: 6%; right: 6%;
|
||||
height: 1px;
|
||||
background: linear-gradient(90deg, transparent, rgba(255, 214, 102, .9), transparent);
|
||||
animation: jahres-event-goldglanz 4.5s ease-in-out infinite;
|
||||
pointer-events: none;
|
||||
}
|
||||
@keyframes jahres-event-goldglanz { 0%, 100% { opacity: .3; } 50% { opacity: 1; } }
|
||||
@media (prefers-reduced-motion: reduce) { .jahres-event-shine { animation: none; opacity: .6; } }
|
||||
.jahres-event-datum {
|
||||
display: block;
|
||||
color: var(--accent);
|
||||
color: #e8c465;
|
||||
font-weight: 700;
|
||||
font-size: .82rem;
|
||||
letter-spacing: .02em;
|
||||
@@ -1632,7 +1671,16 @@ header.site-header {
|
||||
}
|
||||
.jahres-event-card h3 { margin: 0 0 .4rem; font-size: 1.15rem; }
|
||||
.jahres-event-card p { margin: 0 0 .6rem; color: var(--text-muted); font-size: .93rem; line-height: 1.55; }
|
||||
.jahres-event-mehr { color: var(--accent); font-weight: 600; font-size: .88rem; }
|
||||
.jahres-event-mehr { color: #e8c465; font-weight: 600; font-size: .88rem; }
|
||||
/* Genau EIN aktives Event: zentrierte, etwas größere Einzelkachel statt
|
||||
halbleerem Zwei-Spalten-Raster (Nutzer-Wunsch: "spezieller"). */
|
||||
.jahres-events-grid-einzeln {
|
||||
grid-template-columns: 1fr;
|
||||
max-width: 480px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.jahres-events-grid-einzeln .jahres-event-card { padding: 1.6rem 1.8rem; }
|
||||
.jahres-events-grid-einzeln .jahres-event-card h3 { font-size: 1.3rem; }
|
||||
/* Optionales Admin-Bild pro Event (20.08.2026, "Event des Jahres" jetzt in
|
||||
der Verwaltung pflegbar) — bleibt per [hidden] unsichtbar, solange kein
|
||||
Bild gesetzt ist, damit die textbasierten Standard-Karten unverändert
|
||||
@@ -1651,6 +1699,80 @@ header.site-header {
|
||||
margin-bottom: .9rem;
|
||||
}
|
||||
|
||||
/* ---------- "Event des Jahres" — Detail-Fenster (20.08.2026) ----------
|
||||
Nutzer-Wunsch: "wen ich drauf drücke dass dein ein kleines fenster
|
||||
aufgeht wo das bild bissl größer ist mit einem größeren text und
|
||||
beschreibung, und mit einem link ... bereite das richtig geil krank
|
||||
vor." Augenschonend gehalten (siehe Projektregel): kein grelles Weiß,
|
||||
sanftes Ein-/Ausblenden statt hartem Umschalten, respektiert
|
||||
prefers-reduced-motion. */
|
||||
.jahres-event-modal-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 200;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 4vh 5vw;
|
||||
background: rgba(5, 7, 11, .78);
|
||||
backdrop-filter: blur(6px);
|
||||
opacity: 0;
|
||||
transition: opacity .22s ease;
|
||||
}
|
||||
.jahres-event-modal-overlay.offen { opacity: 1; }
|
||||
.jahres-event-modal-overlay[hidden] { display: none; }
|
||||
body.modal-offen { overflow: hidden; }
|
||||
.jahres-event-modal {
|
||||
position: relative;
|
||||
width: min(640px, 100%);
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
background: var(--card-bg);
|
||||
border: 1px solid rgba(212, 175, 55, .4);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: 0 24px 60px rgba(0, 0, 0, .5), 0 0 40px rgba(212, 175, 55, .12);
|
||||
transform: scale(.94) translateY(10px);
|
||||
transition: transform .25s ease;
|
||||
}
|
||||
.jahres-event-modal-overlay.offen .jahres-event-modal { transform: scale(1) translateY(0); }
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.jahres-event-modal-overlay, .jahres-event-modal { transition: none; }
|
||||
}
|
||||
.jahres-event-modal-close {
|
||||
position: absolute;
|
||||
top: .9rem; right: .9rem;
|
||||
z-index: 2;
|
||||
width: 38px; height: 38px;
|
||||
border-radius: 50%;
|
||||
border: 1px solid rgba(255, 255, 255, .25);
|
||||
background: rgba(5, 7, 11, .7);
|
||||
color: var(--text);
|
||||
font-size: 1.1rem;
|
||||
cursor: pointer;
|
||||
transition: border-color .15s ease, transform .15s ease;
|
||||
}
|
||||
.jahres-event-modal-close:hover { border-color: rgba(212, 175, 55, .7); transform: scale(1.06); }
|
||||
.jahres-event-modal-bild {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-height: 46vh;
|
||||
object-fit: cover;
|
||||
border-radius: var(--radius) var(--radius) 0 0;
|
||||
}
|
||||
.jahres-event-modal-bild[hidden] { display: none; }
|
||||
.jahres-event-modal-body { padding: 1.8rem 2rem 2.2rem; }
|
||||
.jahres-event-modal-datum {
|
||||
display: block;
|
||||
color: #e8c465;
|
||||
font-weight: 700;
|
||||
font-size: .92rem;
|
||||
letter-spacing: .03em;
|
||||
margin-bottom: .5rem;
|
||||
}
|
||||
.jahres-event-modal-body h2 { font-size: 1.7rem; margin: 0 0 .8rem; }
|
||||
.jahres-event-modal-body p { font-size: 1.08rem; line-height: 1.7; color: var(--text-muted); margin: 0 0 1.4rem; }
|
||||
.jahres-event-modal-link[hidden] { display: none; }
|
||||
|
||||
/* ---------- Cards ---------- */
|
||||
.card {
|
||||
background: var(--card-bg);
|
||||
|
||||
+6
-32
@@ -89,39 +89,13 @@ window.I18N_PAGE = {
|
||||
de: "🏆 Event des Jahres", "de-CH": "🏆 Event vom Jahr",
|
||||
en: "🏆 Event of the Year", fr: "🏆 Événement de l'année", pt: "🏆 Evento do ano",
|
||||
},
|
||||
idx_jahres_event1_datum: {
|
||||
de: "7. März 2026", "de-CH": "7. März 2026",
|
||||
en: "March 7, 2026", fr: "7 mars 2026", pt: "7 de março de 2026",
|
||||
},
|
||||
idx_jahres_event1_h3: {
|
||||
de: "Der 28-Stunden-Stream", "de-CH": "De 28-Stunde-Stream",
|
||||
en: "The 28-Hour Stream", fr: "Le stream de 28 heures", pt: "A live de 28 horas",
|
||||
},
|
||||
idx_jahres_event1_p: {
|
||||
de: "DogFather stellt sich einer besonderen Herausforderung und streamt 28 Stunden am Stück.",
|
||||
"de-CH": "DogFather stellt sich ere bsundere Herusforderig und streamt 28 Stund am Stück.",
|
||||
en: "DogFather takes on a very special challenge and streams for 28 hours straight.",
|
||||
fr: "DogFather se lance un défi hors norme et streame 28 heures d'affilée.",
|
||||
pt: "DogFather encara um desafio especial e transmite ao vivo por 28 horas seguidas.",
|
||||
},
|
||||
idx_jahres_event2_datum: {
|
||||
de: "27. Juli bis 2. August 2026", "de-CH": "27. Juli bis 2. Auguscht 2026",
|
||||
en: "July 27 – August 2, 2026", fr: "Du 27 juillet au 2 août 2026", pt: "De 27 de julho a 2 de agosto de 2026",
|
||||
},
|
||||
idx_jahres_event2_h3: {
|
||||
de: "Der Creator Cup", "de-CH": "De Creator Cup",
|
||||
en: "The Creator Cup", fr: "Le Creator Cup", pt: "O Creator Cup",
|
||||
},
|
||||
idx_jahres_event2_p: {
|
||||
de: "Gemeinsam mit Cidem organisiert DogFather den Creator Cup für die Streamer von Spicy Media.",
|
||||
"de-CH": "Zäme mit Cidem organisiert DogFather de Creator Cup für d Streamer vo Spicy Media.",
|
||||
en: "Together with Cidem, DogFather organizes the Creator Cup for Spicy Media's streamers.",
|
||||
fr: "Avec Cidem, DogFather organise le Creator Cup pour les streamers de Spicy Media.",
|
||||
pt: "Junto com Cidem, DogFather organiza o Creator Cup para os streamers da Spicy Media.",
|
||||
},
|
||||
idx_jahres_events_mehr: {
|
||||
de: "Zur Zeitreise →", "de-CH": "Zur Ziitreis →",
|
||||
en: "To the timeline →", fr: "Voir la chronologie →", pt: "Ver a linha do tempo →",
|
||||
de: "Mehr erfahren →", "de-CH": "Mehr erfahre →",
|
||||
en: "Learn more →", fr: "En savoir plus →", pt: "Saiba mais →",
|
||||
},
|
||||
idx_jahres_event_modal_link: {
|
||||
de: "Direkt ansehen →", "de-CH": "Direkt aluege →",
|
||||
en: "View directly →", fr: "Voir directement →", pt: "Ver diretamente →",
|
||||
},
|
||||
|
||||
idx_char_eyebrow: {
|
||||
|
||||
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/i18n-bewerben-creator.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/forms.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-bewerben-creator.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/forms.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-bewerben-kooperation.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');">
|
||||
<div id="site-header"></div>
|
||||
@@ -79,8 +79,8 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/forms.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-bewerben-modi.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/forms.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-bewerben-modi.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund bewerben-seite" style="--page-bg:url('/assets/img/bg-scouts.jpg');--page-bg-mobile:url('/assets/img/bg-scouts-mobile.jpg');">
|
||||
<div id="site-header"></div>
|
||||
@@ -71,8 +71,8 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/forms.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-bewerben-scout.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/forms.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-bewerben-scout.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-bewerben.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-casper.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-community.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+7
-7
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -59,9 +59,9 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/data-creator.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-creator.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-creator.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-creator.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-dogfather.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<style>
|
||||
/* =====================================================================
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -182,7 +182,7 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-hasidog.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-hasidog.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+134
-48
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="start-seite">
|
||||
<div id="site-header"></div>
|
||||
@@ -82,34 +82,56 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- "Event des Jahres": volle Breite wie die 3 Welt-Kacheln zusammen, zeigt bewusst
|
||||
IMMER genau zwei Events (Nutzer-Wunsch 20.08.2026). Gleiche Kartenoptik/-Tag wie
|
||||
die Welt-Kacheln oben, damit es wie ein natürlicher vierter Baustein wirkt statt
|
||||
wie ein fremdes Element. -->
|
||||
<div class="jahres-events">
|
||||
<!-- "Event des Jahres": volle Breite wie die 3 Welt-Kacheln zusammen. Seit
|
||||
20.08.2026 (Nutzer-Wunsch) NUR sichtbar, wenn Dogi/VanVan mindestens ein
|
||||
Event in der Verwaltung ausgefüllt UND aktiviert haben -- kein
|
||||
Standard-/Platzhalterinhalt mehr, kompletter Abschnitt bleibt bis dahin
|
||||
unsichtbar (siehe zeigeJahresEvents() weiter unten). Klick öffnet ein
|
||||
großes Detail-Fenster (Bild/Titel/Text größer, optionaler direkter Link)
|
||||
statt sofort wegzunavigieren. -->
|
||||
<div class="jahres-events" id="jahres-events" hidden>
|
||||
<div class="jahres-events-head">
|
||||
<span class="tag" data-i18n="idx_jahres_events_tag">🏆 Event des Jahres</span>
|
||||
</div>
|
||||
<div class="jahres-events-grid">
|
||||
<a class="jahres-event-card" href="zeitreise.html" id="jahres-event-1">
|
||||
<div class="jahres-events-grid" id="jahres-events-grid">
|
||||
<button type="button" class="jahres-event-card" id="jahres-event-1" data-slot="1" hidden>
|
||||
<span class="jahres-event-shine" aria-hidden="true"></span>
|
||||
<img class="jahres-event-bild" alt="" hidden />
|
||||
<span class="jahres-event-datum" data-i18n="idx_jahres_event1_datum">7. März 2026</span>
|
||||
<h3 data-i18n="idx_jahres_event1_h3">Der 28-Stunden-Stream</h3>
|
||||
<p data-i18n="idx_jahres_event1_p">DogFather stellt sich einer besonderen Herausforderung und streamt 28 Stunden am Stück.</p>
|
||||
<span class="jahres-event-mehr" data-i18n="idx_jahres_events_mehr">Zur Zeitreise →</span>
|
||||
</a>
|
||||
<a class="jahres-event-card" href="zeitreise.html" id="jahres-event-2">
|
||||
<span class="jahres-event-datum"></span>
|
||||
<h3></h3>
|
||||
<p></p>
|
||||
<span class="jahres-event-mehr" data-i18n="idx_jahres_events_mehr">Mehr erfahren →</span>
|
||||
</button>
|
||||
<button type="button" class="jahres-event-card" id="jahres-event-2" data-slot="2" hidden>
|
||||
<span class="jahres-event-shine" aria-hidden="true"></span>
|
||||
<img class="jahres-event-bild" alt="" hidden />
|
||||
<span class="jahres-event-datum" data-i18n="idx_jahres_event2_datum">27. Juli bis 2. August 2026</span>
|
||||
<h3 data-i18n="idx_jahres_event2_h3">Der Creator Cup</h3>
|
||||
<p data-i18n="idx_jahres_event2_p">Gemeinsam mit Cidem organisiert DogFather den Creator Cup für die Streamer von Spicy Media.</p>
|
||||
<span class="jahres-event-mehr" data-i18n="idx_jahres_events_mehr">Zur Zeitreise →</span>
|
||||
</a>
|
||||
<span class="jahres-event-datum"></span>
|
||||
<h3></h3>
|
||||
<p></p>
|
||||
<span class="jahres-event-mehr" data-i18n="idx_jahres_events_mehr">Mehr erfahren →</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Detail-Fenster für "Event des Jahres" -- bewusst außerhalb der Hero-Sektion
|
||||
(die hat eigene transform-/overflow-Effekte für die Polarlicht-/Nebel-
|
||||
Animation, die ein position:fixed-Fenster aus der Zentrierung bringen
|
||||
könnten). -->
|
||||
<div class="jahres-event-modal-overlay" id="jahres-event-modal-overlay" hidden>
|
||||
<div class="jahres-event-modal" role="dialog" aria-modal="true" aria-labelledby="jahres-event-modal-titel">
|
||||
<button type="button" class="jahres-event-modal-close" id="jahres-event-modal-close" aria-label="Schließen">✕</button>
|
||||
<img class="jahres-event-modal-bild" id="jahres-event-modal-bild" alt="" hidden />
|
||||
<div class="jahres-event-modal-body">
|
||||
<span class="jahres-event-modal-datum" id="jahres-event-modal-datum"></span>
|
||||
<h2 id="jahres-event-modal-titel"></h2>
|
||||
<p id="jahres-event-modal-text"></p>
|
||||
<a class="btn btn-primary jahres-event-modal-link" id="jahres-event-modal-link" href="#" target="_blank" rel="noopener" hidden></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ================= CHARAKTERE: DOGFATHER-HUSKY & HASIDOG-HASE ================= -->
|
||||
<section class="section-tight">
|
||||
<div class="container text-center">
|
||||
@@ -271,11 +293,11 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/data-modis.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-scouts.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-index.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-modis.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-scouts.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-index.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></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.
|
||||
@@ -358,51 +380,115 @@ document.addEventListener("DOMContentLoaded", () => {
|
||||
}
|
||||
|
||||
/* "Event des Jahres": seit 20.08.2026 in der Verwaltung pflegbar (Bild,
|
||||
Text, Link je Slot, siehe verwaltung.html + server-internal/routes/
|
||||
events.js). Lädt beim Seitenaufruf, was Dogi/VanVan zuletzt gespeichert
|
||||
haben — bleibt der Fetch aus (noch nie gespeichert, Dienst nicht
|
||||
erreichbar) oder ist ein Slot noch leer, bleibt bewusst der fest
|
||||
eingebaute Standardinhalt aus dem HTML stehen (dieselben zwei echten
|
||||
Events wie bisher) statt einer kaputten/leeren Kachel. */
|
||||
function wendeJahresEventAn(slot, daten) {
|
||||
if (!daten) return; // kein gespeicherter Eintrag -> Standardinhalt im HTML bleibt
|
||||
Text, Link, Aktiv-Schalter je Slot, siehe verwaltung.html +
|
||||
server-internal/routes/events.js). Nutzer-Wunsch 20.08.2026: "die
|
||||
kisten sollen leer sein solang wie ich nichts rein setze, am besten
|
||||
sollen die sogar immer nur erscheinen wenn ich was rein setze und sie
|
||||
aktiviere" — der Server liefert über /events-of-year ohnehin NUR
|
||||
aktivierte Slots (inaktive/leere kommen als null), hier also einfach:
|
||||
kein Eintrag -> Kachel bleibt versteckt, kompletter Abschnitt bleibt
|
||||
versteckt, wenn beide Slots leer sind. Klick öffnet ein großes
|
||||
Detail-Fenster statt sofort zu navigieren. */
|
||||
const feldJahresEvent = (x) => (window.dogiFeld ? window.dogiFeld(x) : x || "");
|
||||
let jahresEventsDaten = [null, null];
|
||||
|
||||
function zeigeJahresEventKachel(slot, daten) {
|
||||
const karte = document.getElementById(`jahres-event-${slot}`);
|
||||
if (!karte) return;
|
||||
const feld = (x) => (window.dogiFeld ? window.dogiFeld(x) : x || "");
|
||||
if (!daten) {
|
||||
karte.hidden = true;
|
||||
return;
|
||||
}
|
||||
const bild = karte.querySelector(".jahres-event-bild");
|
||||
if (daten.bild) {
|
||||
bild.src = daten.bild;
|
||||
bild.alt = feld(daten.titel);
|
||||
bild.alt = feldJahresEvent(daten.titel);
|
||||
bild.hidden = false;
|
||||
} else {
|
||||
bild.hidden = true;
|
||||
}
|
||||
karte.querySelector(".jahres-event-datum").textContent = daten.datum || "";
|
||||
karte.querySelector("h3").textContent = feld(daten.titel);
|
||||
karte.querySelector("p").textContent = feld(daten.text);
|
||||
if (daten.link) karte.href = daten.link;
|
||||
karte.querySelector("h3").textContent = feldJahresEvent(daten.titel);
|
||||
karte.querySelector("p").textContent = feldJahresEvent(daten.text);
|
||||
karte.hidden = false;
|
||||
}
|
||||
|
||||
function aktualisiereJahresEventsSichtbarkeit() {
|
||||
const aktiveSlots = jahresEventsDaten.filter(Boolean).length;
|
||||
const abschnitt = document.getElementById("jahres-events");
|
||||
const grid = document.getElementById("jahres-events-grid");
|
||||
abschnitt.hidden = aktiveSlots === 0;
|
||||
// Genau 1 aktives Event: Kachel zentriert und etwas größer statt halb
|
||||
// leerem Raster (Nutzer-Wunsch: "kacheln sollen bissl spezieller sein").
|
||||
grid.classList.toggle("jahres-events-grid-einzeln", aktiveSlots === 1);
|
||||
}
|
||||
|
||||
function jahresEventModalOeffnen(slot) {
|
||||
const daten = jahresEventsDaten[slot - 1];
|
||||
if (!daten) return;
|
||||
const bild = document.getElementById("jahres-event-modal-bild");
|
||||
if (daten.bild) {
|
||||
bild.src = daten.bild;
|
||||
bild.alt = feldJahresEvent(daten.titel);
|
||||
bild.hidden = false;
|
||||
} else {
|
||||
bild.hidden = true;
|
||||
}
|
||||
document.getElementById("jahres-event-modal-datum").textContent = daten.datum || "";
|
||||
document.getElementById("jahres-event-modal-titel").textContent = feldJahresEvent(daten.titel);
|
||||
document.getElementById("jahres-event-modal-text").textContent = feldJahresEvent(daten.text);
|
||||
const linkEl = document.getElementById("jahres-event-modal-link");
|
||||
if (daten.link) {
|
||||
linkEl.href = daten.link;
|
||||
linkEl.textContent = feldJahresEvent(window.I18N_PAGE?.idx_jahres_event_modal_link) || "Direkt ansehen →";
|
||||
linkEl.hidden = false;
|
||||
} else {
|
||||
linkEl.hidden = true;
|
||||
}
|
||||
const overlay = document.getElementById("jahres-event-modal-overlay");
|
||||
overlay.hidden = false;
|
||||
requestAnimationFrame(() => overlay.classList.add("offen"));
|
||||
document.body.classList.add("modal-offen");
|
||||
}
|
||||
|
||||
function jahresEventModalSchliessen() {
|
||||
const overlay = document.getElementById("jahres-event-modal-overlay");
|
||||
overlay.classList.remove("offen");
|
||||
document.body.classList.remove("modal-offen");
|
||||
setTimeout(() => { overlay.hidden = true; }, 220);
|
||||
}
|
||||
|
||||
document.getElementById("jahres-event-1")?.addEventListener("click", () => jahresEventModalOeffnen(1));
|
||||
document.getElementById("jahres-event-2")?.addEventListener("click", () => jahresEventModalOeffnen(2));
|
||||
document.getElementById("jahres-event-modal-close")?.addEventListener("click", jahresEventModalSchliessen);
|
||||
document.getElementById("jahres-event-modal-overlay")?.addEventListener("click", (e) => {
|
||||
if (e.target.id === "jahres-event-modal-overlay") jahresEventModalSchliessen();
|
||||
});
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Escape" && !document.getElementById("jahres-event-modal-overlay").hidden) jahresEventModalSchliessen();
|
||||
});
|
||||
|
||||
if (API_BASE_URL) {
|
||||
let letzteJahresEvents = null;
|
||||
const ladeJahresEvents = () =>
|
||||
fetch(`${API_BASE_URL}/events-of-year`, { cache: "no-store" })
|
||||
.then((res) => res.json())
|
||||
.then((data) => {
|
||||
if (!data?.ok) return;
|
||||
letzteJahresEvents = data.events;
|
||||
wendeJahresEventAn(1, data.events[0]);
|
||||
wendeJahresEventAn(2, data.events[1]);
|
||||
jahresEventsDaten = data.events;
|
||||
zeigeJahresEventKachel(1, data.events[0]);
|
||||
zeigeJahresEventKachel(2, data.events[1]);
|
||||
aktualisiereJahresEventsSichtbarkeit();
|
||||
})
|
||||
.catch(() => {
|
||||
/* Standardinhalt aus dem HTML bleibt stehen -- kein sichtbarer Fehler nötig. */
|
||||
/* Kein Fehler nötig -- der Abschnitt bleibt einfach unsichtbar. */
|
||||
});
|
||||
ladeJahresEvents();
|
||||
// Bei Sprachwechsel mit den zuletzt geladenen Daten neu rendern (kein
|
||||
// erneuter Server-Aufruf nötig) — Titel/Text stehen ja bereits in allen
|
||||
// Sprachen im geladenen Objekt.
|
||||
document.addEventListener("dogi-sprache-geaendert", () => {
|
||||
if (!letzteJahresEvents) return;
|
||||
wendeJahresEventAn(1, letzteJahresEvents[0]);
|
||||
wendeJahresEventAn(2, letzteJahresEvents[1]);
|
||||
zeigeJahresEventKachel(1, jahresEventsDaten[0]);
|
||||
zeigeJahresEventKachel(2, jahresEventsDaten[1]);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-kontakt.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-links.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
(function () {
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
|
||||
+6
-6
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -126,7 +126,7 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-manager.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-manager.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+9
-9
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund" data-welt="casper" style="--page-bg:url('/assets/img/bg-casper.jpg');--page-bg-mobile:url('/assets/img/bg-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=20260820d"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820d"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-medien-casper.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-media.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820f"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-medien-casper.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820d"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-medien-dogfather.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-media.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820f"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-medien-dogfather.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund" data-welt="hasidog" style="--page-bg:url('/assets/img/bg-hasidog.jpg');--page-bg-mobile:url('/assets/img/bg-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=20260820d"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820d"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-medien-hasidog.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-media.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-videos.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-aktionen.js?v=20260820f"></script>
|
||||
<script src="assets/js/medien-welt.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-medien-hasidog.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+9
-9
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<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,11 +130,11 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/data-modis.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-scouts.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-creator.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-profil.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-modis.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-scouts.js?v=20260820f"></script>
|
||||
<script src="assets/js/data-creator.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-profil.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-rabattcodes.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
(function () {
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
|
||||
@@ -63,7 +63,7 @@ import {
|
||||
import {
|
||||
listSupporters, getSupporterDetail, updatePremium, listCollections, upsertCollection, getAdminOverview,
|
||||
} from "./routes/supporter-admin.js";
|
||||
import { getEventsPublic, saveEvent, uploadEventImage } from "./routes/events.js";
|
||||
import { getEventsPublic, getEventsAdmin, saveEvent, uploadEventImage } from "./routes/events.js";
|
||||
import {
|
||||
createPoll, listPolls, closePoll, reopenPoll, deletePoll, getActivePollPublic, voteOnPoll,
|
||||
} from "./routes/polls.js";
|
||||
@@ -190,6 +190,7 @@ app.post("/admin/drafts/list", requireTeamSession, withSession(listDrafts));
|
||||
app.post("/admin/drafts/save", requireTeamSession, withSession(saveDraft));
|
||||
|
||||
// Startseite: "Event des Jahres" (20.08.2026)
|
||||
app.post("/admin/events/list", requireTeamSession, withSession(getEventsAdmin));
|
||||
app.post("/admin/events/save", requireTeamSession, withSession(saveEvent));
|
||||
app.post("/admin/events/upload-image", requireTeamSession, bildUpload.single("image"), withSession(uploadEventImage));
|
||||
|
||||
|
||||
@@ -40,9 +40,24 @@ function ladeSlot(slot) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Öffentlich, keine Session: liefert beide Slots (oder null, wenn noch nie
|
||||
gespeichert -- index.html behält dann seinen eingebauten Standardinhalt). */
|
||||
/** Öffentlich, keine Session: liefert nur AKTIVIERTE Slots (Nutzer-Wunsch
|
||||
20.08.2026: "die kisten sollen leer sein solang wie ich nichts rein
|
||||
setze, am besten sollen die sogar immer nur erscheinen wenn ich was
|
||||
rein setze und sie aktiviere") -- ein Slot mit gespeichertem Inhalt,
|
||||
aber ohne gesetztes "aktiv", bleibt für Besucher:innen unsichtbar
|
||||
(Entwurfsmodus), obwohl er in der Verwaltung längst vorausgefüllt ist. */
|
||||
export async function getEventsPublic(req, res) {
|
||||
const gibFreiWennAktiv = (slot) => {
|
||||
const eintrag = ladeSlot(slot);
|
||||
return eintrag && eintrag.aktiv ? eintrag : null;
|
||||
};
|
||||
return json(res, { ok: true, events: [gibFreiWennAktiv(1), gibFreiWennAktiv(2)] });
|
||||
}
|
||||
|
||||
/** Für die Verwaltung: liefert BEIDE Slots roh (auch inaktive/Entwürfe),
|
||||
damit das Formular beim Öffnen alles vorausfüllen kann. */
|
||||
export async function getEventsAdmin(req, res, session) {
|
||||
if (!can(session, "EVENTS_MANAGE")) return forbidden(res);
|
||||
return json(res, { ok: true, events: [ladeSlot(1), ladeSlot(2)] });
|
||||
}
|
||||
|
||||
@@ -66,6 +81,7 @@ export async function saveEvent(req, res, session) {
|
||||
const textDe = String(body.text || "").trim().slice(0, 400);
|
||||
const link = String(body.link || "").trim().slice(0, 300) || null;
|
||||
const bild = String(body.bild || "").trim().slice(0, 300) || null;
|
||||
const aktiv = !!body.aktiv;
|
||||
|
||||
if (!titelDe || !textDe) {
|
||||
return json(res, { ok: false, error: "Titel und Text sind Pflicht." }, 400);
|
||||
@@ -74,11 +90,16 @@ export async function saveEvent(req, res, session) {
|
||||
if (link && !/^https?:\/\//i.test(link)) {
|
||||
return json(res, { ok: false, error: "Link muss mit http:// oder https:// beginnen." }, 400);
|
||||
}
|
||||
// Aktivieren nur mit vollständigem Pflichtinhalt möglich -- verhindert ein
|
||||
// leeres/kaputtes, aber "aktives" Feld auf der Startseite.
|
||||
if (aktiv && (!titelDe || !textDe)) {
|
||||
return json(res, { ok: false, error: "Zum Aktivieren müssen Titel und Text ausgefüllt sein." }, 400);
|
||||
}
|
||||
|
||||
const [titel, text] = await Promise.all([uebersetzeAlleSprachen(titelDe), uebersetzeAlleSprachen(textDe)]);
|
||||
|
||||
const eintrag = {
|
||||
datum, titel, text, link, bild,
|
||||
datum, titel, text, link, bild, aktiv,
|
||||
aktualisiertVon: session.actor,
|
||||
aktualisiertAm: new Date().toISOString(),
|
||||
};
|
||||
|
||||
+6
-6
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -57,7 +57,7 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-stimmen.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-stimmen.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -189,7 +189,7 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-streamer.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-streamer.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+6
-6
@@ -19,10 +19,10 @@
|
||||
<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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-streamplan.jpg');--page-bg-mobile:url('/assets/img/bg-streamplan-mobile.jpg');">
|
||||
<div id="site-header"></div>
|
||||
@@ -60,7 +60,7 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-streamplan.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-streamplan.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+7
-7
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<style>
|
||||
/* =====================================================================
|
||||
Supporter-Bereich — komplett neu gestaltet (Nutzer-Feedback
|
||||
@@ -416,9 +416,9 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-supporter.js?v=20260820d"></script>
|
||||
<script src="assets/js/supporter.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-supporter.js?v=20260820f"></script>
|
||||
<script src="assets/js/supporter.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
(function () {
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</head>
|
||||
<body class="mit-hintergrund" style="--page-bg:url('/assets/img/bg-dogfather.jpg');--page-bg-mobile:url('/assets/img/bg-dogfather-mobile.jpg');">
|
||||
<div id="site-header"></div>
|
||||
@@ -66,9 +66,9 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/data-modis.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-team-modis.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-modis.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-team-modis.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/i18n-team-scouts.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/data-scouts.js?v=20260820f"></script>
|
||||
<script src="assets/js/i18n-team-scouts.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-tt-muddi.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-vanvan.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+34
-11
@@ -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=20260820e" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820e" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820e" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820e" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
<style>
|
||||
/* =====================================================================
|
||||
verwaltung.html — Dogis privater Command-Center-Bereich.
|
||||
@@ -977,8 +977,8 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/main.js?v=20260820e"></script>
|
||||
<script src="assets/js/admin-auth.js?v=20260820e"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script src="assets/js/admin-auth.js?v=20260820f"></script>
|
||||
<script>
|
||||
(function () {
|
||||
const API_BASE_URL = "https://postfach.dogfather-universe.com";
|
||||
@@ -1082,7 +1082,10 @@
|
||||
function eventKarteHtml(slot) {
|
||||
return `
|
||||
<div class="card vw-card vw-shine-card vw-noise" style="padding:1.5rem;">
|
||||
<h3 style="margin-top:0;">Event ${slot}</h3>
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:.8rem;">
|
||||
<h3 style="margin:0;">Event ${slot}</h3>
|
||||
<span class="vw-overview-chip" id="event-${slot}-status-chip">Entwurf</span>
|
||||
</div>
|
||||
<div style="margin-bottom:1rem;">
|
||||
<img id="event-${slot}-vorschau" alt="" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:10px;background:var(--bg-alt);display:none;" />
|
||||
</div>
|
||||
@@ -1106,6 +1109,14 @@
|
||||
<label for="event-${slot}-link">Link (optional, muss mit https:// beginnen)</label>
|
||||
<input type="url" id="event-${slot}-link" placeholder="https://…" />
|
||||
</div>
|
||||
<label style="display:flex;align-items:center;gap:.6rem;margin:1rem 0;cursor:pointer;">
|
||||
<input type="checkbox" id="event-${slot}-aktiv" style="width:1.2rem;height:1.2rem;" />
|
||||
<span>Aktiv — auf der Startseite sichtbar</span>
|
||||
</label>
|
||||
<p class="small muted" style="margin:-.4rem 0 1rem;">
|
||||
Ohne Häkchen bleibt die Kachel auf der Startseite unsichtbar (Entwurf), auch wenn hier
|
||||
schon alles ausgefüllt ist — so kannst du in Ruhe vorbereiten und erst dann live schalten.
|
||||
</p>
|
||||
<button type="button" class="btn btn-primary" id="event-${slot}-speichern" style="width:100%;">Speichern</button>
|
||||
<p class="small" id="event-${slot}-status" style="margin-top:.6rem;"></p>
|
||||
</div>`;
|
||||
@@ -1117,9 +1128,8 @@
|
||||
|
||||
let aktuelleDaten = [null, null];
|
||||
try {
|
||||
const res = await fetch(`${API_BASE_URL}/events-of-year`, { cache: "no-store" });
|
||||
const data = await res.json();
|
||||
if (data?.ok) aktuelleDaten = data.events;
|
||||
const res = await window.AdminAuth.apiCall(API_BASE_URL, "/admin/events/list", {});
|
||||
if (res.ok) aktuelleDaten = res.events;
|
||||
} catch {
|
||||
/* Formular bleibt leer, Speichern funktioniert trotzdem — kein Blocker. */
|
||||
}
|
||||
@@ -1128,18 +1138,28 @@
|
||||
const eintrag = aktuelleDaten[i];
|
||||
const bildInput = document.getElementById(`event-${slot}-bild-input`);
|
||||
const vorschau = document.getElementById(`event-${slot}-vorschau`);
|
||||
const statusChip = document.getElementById(`event-${slot}-status-chip`);
|
||||
let hochgeladenesBild = eintrag?.bild || null;
|
||||
|
||||
const aktualisiereStatusChip = (aktiv) => {
|
||||
statusChip.textContent = aktiv ? "🟢 Live" : "⚪ Entwurf";
|
||||
};
|
||||
|
||||
if (eintrag) {
|
||||
document.getElementById(`event-${slot}-datum`).value = eintrag.datum || "";
|
||||
document.getElementById(`event-${slot}-titel`).value = eintrag.titel?.de || "";
|
||||
document.getElementById(`event-${slot}-text`).value = eintrag.text?.de || "";
|
||||
document.getElementById(`event-${slot}-link`).value = eintrag.link || "";
|
||||
document.getElementById(`event-${slot}-aktiv`).checked = !!eintrag.aktiv;
|
||||
aktualisiereStatusChip(!!eintrag.aktiv);
|
||||
if (eintrag.bild) {
|
||||
vorschau.src = eintrag.bild;
|
||||
vorschau.style.display = "";
|
||||
}
|
||||
} else {
|
||||
aktualisiereStatusChip(false);
|
||||
}
|
||||
document.getElementById(`event-${slot}-aktiv`).addEventListener("change", (e) => aktualisiereStatusChip(e.target.checked));
|
||||
|
||||
// Bild wird SOFORT bei Auswahl hochgeladen (nicht erst beim
|
||||
// "Speichern"-Klick) — einfacher nachvollziehbar für Dogi/VanVan: die
|
||||
@@ -1187,6 +1207,7 @@
|
||||
}
|
||||
statusEl.textContent = "Wird gespeichert und übersetzt …";
|
||||
statusEl.style.color = "";
|
||||
const aktiv = document.getElementById(`event-${slot}-aktiv`).checked;
|
||||
const res = await window.AdminAuth.apiCall(API_BASE_URL, "/admin/events/save", {
|
||||
slot,
|
||||
datum: document.getElementById(`event-${slot}-datum`).value.trim(),
|
||||
@@ -1194,13 +1215,15 @@
|
||||
text,
|
||||
link: document.getElementById(`event-${slot}-link`).value.trim(),
|
||||
bild: hochgeladenesBild,
|
||||
aktiv,
|
||||
});
|
||||
if (!res.ok) {
|
||||
statusEl.textContent = res.error || "Speichern fehlgeschlagen.";
|
||||
statusEl.style.color = "#ff6b6b";
|
||||
return;
|
||||
}
|
||||
statusEl.textContent = "✅ Gespeichert — auf der Startseite live.";
|
||||
aktualisiereStatusChip(aktiv);
|
||||
statusEl.textContent = aktiv ? "✅ Gespeichert — auf der Startseite live." : "✅ Als Entwurf gespeichert (noch nicht sichtbar).";
|
||||
statusEl.style.color = "#baf7d6";
|
||||
});
|
||||
});
|
||||
|
||||
+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:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
|
||||
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-werte.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+6
-6
@@ -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=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820d" />
|
||||
<link rel="stylesheet" href="assets/css/main.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820f" />
|
||||
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820f" />
|
||||
</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>
|
||||
@@ -219,8 +219,8 @@
|
||||
</main>
|
||||
|
||||
<div id="site-footer"></div>
|
||||
<script src="assets/js/i18n-zeitreise.js?v=20260820d"></script>
|
||||
<script src="assets/js/main.js?v=20260820d"></script>
|
||||
<script src="assets/js/i18n-zeitreise.js?v=20260820f"></script>
|
||||
<script src="assets/js/main.js?v=20260820f"></script>
|
||||
<script>
|
||||
/* Wachstums-Reveal: Äste blenden sich beim Scrollen sanft ein — passt
|
||||
zum "wachsenden Baum"-Konzept dieser Seite. Rein page-lokal, betrifft
|
||||
|
||||
Reference in New Issue
Block a user