/* markemacht.de — Interaktionen * - Wirkung-Switch (monolithisch | editorial) + localStorage * - Mobile Drawer * - Scroll-Reveal (IntersectionObserver, max 400ms, ease-out) * - Keyboard: ESC schließt Drawer */ (function () { 'use strict'; /* ---------- Wirkung ---------------------------------------------------- */ const STORAGE_KEY = 'mm-wirkung'; const VALID = ['monolith', 'editorial']; const DEFAULT = 'monolith'; function getStored() { try { const v = localStorage.getItem(STORAGE_KEY); return VALID.includes(v) ? v : null; } catch (_) { return null; } } function applyMode(mode) { if (!VALID.includes(mode)) mode = DEFAULT; document.documentElement.setAttribute('data-theme', mode); try { localStorage.setItem(STORAGE_KEY, mode); } catch (_) {} syncButtons(mode); } function syncButtons(mode) { document.querySelectorAll('[data-wirkung]').forEach((btn) => { const pressed = btn.getAttribute('data-wirkung') === mode; btn.setAttribute('aria-pressed', pressed ? 'true' : 'false'); }); } function initWirkung() { const initial = getStored() || DEFAULT; applyMode(initial); document.querySelectorAll('[data-wirkung]').forEach((btn) => { btn.addEventListener('click', () => { const mode = btn.getAttribute('data-wirkung'); applyMode(mode); }); }); } /* ---------- Mobile Drawer --------------------------------------------- */ function initDrawer() { const drawer = document.querySelector('[data-mobile-drawer]'); if (!drawer) return; const openBtns = document.querySelectorAll('[data-drawer-open]'); const closeBtns = document.querySelectorAll('[data-drawer-close]'); function open() { drawer.classList.add('is-open'); document.body.classList.add('drawer-open'); drawer.setAttribute('aria-hidden', 'false'); const firstLink = drawer.querySelector('a, button'); if (firstLink) firstLink.focus(); } function close() { drawer.classList.remove('is-open'); document.body.classList.remove('drawer-open'); drawer.setAttribute('aria-hidden', 'true'); } openBtns.forEach((b) => b.addEventListener('click', open)); closeBtns.forEach((b) => b.addEventListener('click', close)); drawer.querySelectorAll('a[href]').forEach((a) => { a.addEventListener('click', close); }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && drawer.classList.contains('is-open')) { close(); } }); } /* ---------- Scroll Reveal --------------------------------------------- */ function initReveal() { const items = document.querySelectorAll('[data-reveal]'); if (!items.length) return; const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (prefersReduced || !('IntersectionObserver' in window)) { items.forEach((el) => el.classList.add('is-revealed')); return; } const io = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const el = entry.target; const delay = parseInt(el.getAttribute('data-reveal-delay') || '0', 10); if (delay > 0) { setTimeout(() => el.classList.add('is-revealed'), delay); } else { el.classList.add('is-revealed'); } io.unobserve(el); } }); }, { threshold: 0.08, rootMargin: '0px 0px -5% 0px' }); items.forEach((el) => io.observe(el)); } /* ---------- Boot ------------------------------------------------------- */ function boot() { initWirkung(); initDrawer(); initReveal(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();