Files
dogfather-universe/team-modis.html
T
DogFatherGitandClaude Opus 5 519e209bce Zweite Live-Uhr fuer "spezielles Live-Event" + mehr Farbe im Radar
Nutzer-Wunsch 20.08.2026: "wuensch mir nur noch bissl farbe und sehr
wichtig ist dass ich auch spezielle live events da auch eintragen kann
in der verwaltungsseite so dass da eine zweite uhr erscheint wo die zeit
dann fuer dieses spezielle event laeuft."

- Neue Verwaltungs-Sektion "Spezielles Live-Event": Titel (Deutsch, wird
  automatisch uebersetzt), echtes Datum+Uhrzeit, optionaler Link, Aktiv-
  Schalter -- nur mit Titel + Zukunftsdatum aktivierbar.
- Zweite Uhr auf streamplan.html (Magenta/Violett statt Cyan/Gold, direkt
  neben der bestehenden), nur sichtbar wenn ein Event aktiviert ist und
  das Zieldatum noch nicht vorbei ist. Echter Countdown inkl. Tage (z.B.
  "2T 03:14:59"), "Jetzt"-Zeiger zeigt wie bei Uhr 1 die tatsaechliche
  Uhrzeit, der magentafarbene Fixpunkt markiert die Tageszeit des Events.
  Zieldatum wird als UTC gespeichert -- jede besuchende Person sieht den
  exakt richtigen Countdown in ihrer eigenen Zeitzone.
- "Bissl Farbe": bunter Farbverlauf (Cyan/Violett/Gold) auf dem aeusseren
  Ring statt reinem Grauton, kraeftigerer Sweep-Farbschein.
- Backend: neue routes/special-event.js (getSpecialEventPublic nur bei
  aktiv+zukuenftig, getSpecialEventAdmin fuer Entwuerfe, saveSpecialEvent
  mit Validierung), 13 automatisierte Tests gegen eine Fake-DB bestanden.
- Bugfix unterwegs gefunden (Playwright-Screenshot, wiederholtes Muster
  auf dieser Seite): .stream-radar-wrap blieb trotz [hidden]-Attribut
  sichtbar (display:block ueberschreibt die eingebaute [hidden]-Regel bei
  gleicher Spezifitaet) -- explizite Regel ergaenzt, per Playwright erneut
  verifiziert (display:none bestaetigt).

Backend-Teil (server-internal/) noch ohne Deploy-Zugriff -- Dogi muss ihn
manuell auf dogiintern ausrollen, sonst bleibt die zweite Uhr unsichtbar.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-20 23:24:17 +02:00

126 lines
6.5 KiB
HTML

<!DOCTYPE html>
<html lang="de" data-theme="dogfather">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Modi-Team — DOGFATHER UNIVERSE</title>
<meta name="description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." />
<link rel="icon" type="image/png" href="assets/img/favicon.png" />
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#0b0d10" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="DOGFATHER UNIVERSE" />
<meta property="og:title" content="Modi-Team — DOGFATHER UNIVERSE" />
<meta property="og:description" content="VanVan, Diene, Funny, Miss und Marina — das Modi-/Core-Team von Team Dogi." />
<meta property="og:image" content="https://dogfather-universe.com/assets/img/og-cover.jpg" />
<meta property="og:url" content="https://dogfather-universe.com/team-modis.html" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Modi-Team — DOGFATHER UNIVERSE" />
<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=20260820j" />
<link rel="stylesheet" href="assets/css/theme-dogfather.css?v=20260820j" />
<link rel="stylesheet" href="assets/css/theme-hasidog.css?v=20260820j" />
<link rel="stylesheet" href="assets/css/theme-spicymedia.css?v=20260820j" />
</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>
<main>
<section class="hero page-bg">
<div class="hero-banner"><img src="/assets/img/bg-dogfather.jpg" alt="" loading="eager" /></div>
<div class="container">
<span class="eyebrow" data-i18n="tm_eyebrow">🩵 Team Dogi</span>
<h1 data-i18n="tm_h1">Das Modi-Team</h1>
<p class="lead worlds" data-i18n="tm_lead">Das Rückgrat von Team Dogi — von VanVan bis Marina.</p>
</div>
</section>
<section class="section-tight">
<div class="container">
<div class="card" style="margin-bottom:2rem;">
<span class="tag" data-i18n="tm_tag_hervorgehoben">Hervorgehoben</span>
<div class="grid grid-2" style="align-items:center;">
<div>
<h2 style="margin-bottom:.3rem;">VanVan 🩵</h2>
<p class="muted" data-i18n="tm_vanvan_rolle">Rechte Hand von DogFather · Musik-Produzentin</p>
<p data-i18n="tm_vanvan_bio">VanVan ist nicht nur die rechte Hand von DogFather, sondern auch Super Super Sekretärin. Sie bekommt täglich alle Neuigkeiten und Aufgaben und delegiert oder organisiert gemeinsam mit Diene.</p>
<a class="btn btn-primary" href="vanvan.html" data-i18n="tm_vanvan_btn">VanVans exklusive Seite →</a>
</div>
<div class="collage-photo" style="aspect-ratio:1/1;border-radius:var(--radius);">
<img src="assets/img/card-vanvan-team.jpg" alt="VanVan" style="width:100%;height:100%;object-fit:cover;" />
</div>
</div>
</div>
<h2 class="text-center" data-i18n="tm_hierarchie_h2">Team-Hierarchie</h2>
<div id="modis-grid" class="pyramid"></div>
<!-- TODO: Hinweis: Reihenfolge/Rollen basieren auf: VanVan (rechte Hand) → Diene (rechte Hand von VanVan) → Funny (Modi) → Miss (Modi + Cutterin) → Marina (Clip-Account-Kommentare). Änderungen einfach in assets/js/data-modis.js pflegen. -->
<div class="btn-row" style="justify-content:center;">
<a class="btn btn-primary" href="bewerben-modi.html" data-i18n="tm_bewerben_btn">Als Modi bewerben 🩵</a>
</div>
</div>
</section>
</main>
<div id="site-footer"></div>
<script src="assets/js/data-modis.js?v=20260820j"></script>
<script src="assets/js/i18n-team-modis.js?v=20260820j"></script>
<script src="assets/js/main.js?v=20260820j"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const grid = document.getElementById("modis-grid");
if (!grid || !window.MODIS) return;
const rest = window.MODIS.filter((m) => m.name !== "VanVan").sort((a, b) => a.rank - b.rank);
const feld = (x) => (window.dogiFeld ? window.dogiFeld(x) : x || "");
const t = (schluessel) => (window.dogiUebersetzen ? window.dogiUebersetzen(schluessel) : schluessel);
// Pyramide: eine Ebene pro eindeutigem Rang, oben schmal/groß, nach
// unten breiter/kompakter — genau wie ein Organigramm.
const raenge = [...new Set(rest.map((m) => m.rank))];
const MAX_STUFEN = 5; // fünf definierte Größenstufen im CSS
const renderModis = () => {
grid.innerHTML = raenge
.map((rang, i) => {
const stufe = Math.min(i + 1, MAX_STUFEN);
const personen = rest.filter((m) => m.rank === rang);
const karten = personen
.map((m) => {
const profilLink = m.page || `profil.html?p=${m.slug}`;
const kartenInhalt = `
<div class="avatar">${(m.avatar || m.photo) ? `<img src="${m.avatar || m.photo}" alt="${m.name}" loading="lazy">` : `<span class="avatar-initial">${m.name.charAt(0).toUpperCase()}</span>`}</div>
<span class="badge" style="margin-bottom:.5rem;">${t("tm_stufe_prefix")} ${feld(m.rankLabel) || m.rank}</span>
<h3>${m.name}</h3>
<div class="role">${feld(m.role)}</div>
<span class="btn btn-outline" style="pointer-events:none;">${t("tm_profil_ansehen")}</span>`;
// Optionaler zweiter Button pro Person (aktuell nur Marina →
// manager.html, siehe extraCta in data-modis.js). Eigene
// <div>-Karte statt <a>, weil ein zweiter echter Link NICHT in
// einen anderen Link verschachtelt werden darf (ungültiges HTML).
if (m.extraCta) {
return `
<div class="profile-card">
<a href="${profilLink}" style="display:contents;">${kartenInhalt}</a>
<a class="btn-spicy-mini" href="${m.extraCta.href}"><span>${feld(m.extraCta.label)}</span></a>
</div>`;
}
return `
<a class="profile-card" href="${profilLink}">${kartenInhalt}
</a>`;
})
.join("");
return `<div class="pyramid-tier" data-tier="${stufe}">${karten}</div>`;
})
.join("");
};
renderModis();
document.addEventListener("dogi-sprache-geaendert", renderModis);
});
</script>
</body>
</html>