/* ===================================================================== DOGFATHER UNIVERSE — main.js Gemeinsame Navigation, mobiles Menü, Footer, Nebel-Effekt. Läuft rein clientseitig (kein Build-Tool, kein Fetch von Partials), damit jede Seite auch direkt per Doppelklick (file://) funktioniert. ===================================================================== */ (function () { "use strict"; /* ---------- Navigationsstruktur (an einer Stelle pflegen) ---------- */ const NAV = [ { label: "Start", href: "index.html" }, { label: "Dogfather", children: [ { label: "Die Person", href: "dogfather.html" }, { label: "Streamer", href: "streamer.html" }, { label: "Streamplan", href: "streamplan.html" }, { label: "Zeitreise", href: "zeitreise.html" }, ], }, { label: "HasiDog", children: [ { label: "HasiDog-Welt", href: "hasidog.html" }, { label: "Casper", href: "casper.html" }, { label: "Community", href: "community.html" }, { label: "Stimmen", href: "stimmen.html" }, ], }, { label: "Manager", children: [ { label: "Manager Dogfather", href: "manager.html" }, { label: "Werte", href: "werte.html" }, { label: "Scout-Team", href: "team-scouts.html" }, { label: "Modi-Team", href: "team-modis.html" }, { label: "VanVan", href: "vanvan.html" }, { label: "Creator", href: "creator.html" }, { label: "Bewerben", href: "bewerben.html" }, ], }, { label: "Medien", children: [ { label: "Galerie", href: "medien.html" }, { label: "Videos", href: "videos.html" }, { label: "Aktionen", href: "aktionen.html" }, ], }, { label: "Links", href: "links.html" }, ]; const currentFile = (location.pathname.split("/").pop() || "index.html"); function isActive(href) { return href === currentFile; } function renderNavItem(item) { if (!item.children) { return `${item.label}`; } const activeChild = item.children.some((c) => isActive(c.href)); return ` `; } function renderHeader() { const el = document.getElementById("site-header"); if (!el) return; el.innerHTML = ` `; const toggle = el.querySelector(".nav-toggle"); const links = el.querySelector(".nav-links"); toggle.addEventListener("click", () => { const open = links.classList.toggle("open"); toggle.setAttribute("aria-expanded", String(open)); }); el.querySelectorAll(".nav-group > button").forEach((btn) => { btn.addEventListener("click", () => { const group = btn.parentElement; const wasOpen = group.classList.contains("open"); el.querySelectorAll(".nav-group.open").forEach((g) => g.classList.remove("open")); if (!wasOpen) group.classList.add("open"); btn.setAttribute("aria-expanded", String(!wasOpen)); }); }); document.addEventListener("click", (e) => { if (!el.contains(e.target)) { el.querySelectorAll(".nav-group.open").forEach((g) => g.classList.remove("open")); } }); } function renderFooter() { const el = document.getElementById("site-footer"); if (!el) return; const year = new Date().getFullYear(); el.innerHTML = ` `; } function renderFog() { if (document.querySelector(".fog-layer")) return; const layer = document.createElement("div"); layer.className = "fog-layer"; layer.setAttribute("aria-hidden", "true"); const blobs = 6; let html = ""; for (let i = 0; i < blobs; i++) { const size = 220 + Math.round(Math.random() * 260); const top = Math.round(Math.random() * 100); const left = Math.round(Math.random() * 100); const delay = (Math.random() * 10).toFixed(1); html += ``; } layer.innerHTML = html; document.body.prepend(layer); } /* =================================================================== Musik-Knopf (unten rechts, auf jeder Seite) Kleiner schwebender Knopf, der ein Feld mit den Spotify-Playern von Hasidog und Van-Van aufklappt. Genauso gelöst wie im Analyse-Tool. Zwei bewusste Entscheidungen: 1. Das Feld hängt direkt am , nicht in einem Abschnitt — so kann kein Neuaufbau der Seite den laufenden Player unterbrechen. 2. Die Player werden ERST beim ersten Öffnen geladen (src wird dann gesetzt). Sonst würde jede Seite zwei fremde Einbettungen laden, auch wenn niemand Musik hören will. =================================================================== */ const SPOTIFY_ARTISTS = [ { name: "Hasidog", id: "2INiE1VVJGUQdEURsltuJU" }, { name: "Van-Van", id: "4J9PcKZBkh6V8dVY3CGliw" }, ]; function renderMusicWidget() { if (document.getElementById("music-widget")) return; const widget = document.createElement("div"); widget.className = "music-widget"; widget.id = "music-widget"; widget.innerHTML = ` `; document.body.appendChild(widget); const panel = document.getElementById("music-panel"); const toggle = document.getElementById("music-toggle"); let geladen = false; function oeffnen(auf) { panel.hidden = !auf; toggle.setAttribute("aria-expanded", String(auf)); widget.classList.toggle("open", auf); if (auf && !geladen) { // Player erst jetzt wirklich laden panel.querySelectorAll("iframe[data-src]").forEach((f) => { f.src = f.dataset.src; f.removeAttribute("data-src"); }); geladen = true; } } toggle.addEventListener("click", () => oeffnen(panel.hidden)); document.getElementById("music-close").addEventListener("click", () => oeffnen(false)); document.addEventListener("keydown", (e) => { if (e.key === "Escape" && !panel.hidden) oeffnen(false); }); } document.addEventListener("DOMContentLoaded", () => { renderHeader(); renderFooter(); renderFog(); renderMusicWidget(); }); })();