/* Skript 1 */ try{ document.documentElement.classList.add("js") }catch(e){console.error("[Startseite] Skript 1:",e);} /* Skript 2 */ try{ (function(){ var t=document.querySelector('.mobile-trigger'),n=document.querySelector('.navigation'); t.addEventListener('click',function(){var o=n.classList.toggle('is-open');t.setAttribute('aria-expanded',String(o)); t.setAttribute('aria-label',o?'Menü schließen':'Menü öffnen');}); n.querySelectorAll('a').forEach(function(a){a.addEventListener('click',function(){n.classList.remove('is-open'); t.setAttribute('aria-expanded','false');});}); // Logos auf die Kartenbreite (natürliche Breite --lw, Wunschmaßstab data-s) function passen(){document.querySelectorAll('.lg[data-s]').forEach(function(l){ var lw=parseFloat(getComputedStyle(l).getPropertyValue('--lw')),p=l.parentElement.clientWidth*.94; l.style.setProperty('--s',Math.min(parseFloat(l.dataset.s),p/lw));});} function gleich(){var k=[].slice.call(document.querySelectorAll('.karte .lg'));if(!k.length)return; var s=Math.min.apply(null,k.map(function(l){return parseFloat(l.style.getPropertyValue('--s'));})); k.forEach(function(l){l.style.setProperty('--s',s);});} var alt=passen;passen=function(){alt();gleich();}; passen();addEventListener('resize',passen);document.fonts&&document.fonts.ready.then(passen); // Ohne Maus (Handy): der erste Tipp dreht die Karte zum Foto, der zweite öffnet den Bereich var ohneMaus=matchMedia('(hover: none)').matches; document.querySelectorAll('.karte').forEach(function(k){k.addEventListener('click',function(ev){ if(ohneMaus&&!k.classList.contains('gedreht')){ev.preventDefault(); document.querySelectorAll('.karte.gedreht').forEach(function(x){x.classList.remove('gedreht');}); k.classList.add('gedreht');return;} if(k.hasAttribute('data-bald'))ev.preventDefault();});}); })(); }catch(e){console.error("[Startseite] Skript 2:",e);} /* Skript 3 */ try{ (function(){ // Kopfleiste: ab etwas Scrollweg hell und kleiner; der Abschnitt im Blick ist in der Navigation unterstrichen. // Gestalterin 26.10.: vorher blieb „Unsere Geschichte" nach dem ersten Scrollen für immer unterstrichen, auch zurück oben im // Titelbild. Jetzt gilt, was auf der Lesehöhe (45 % der Fensterhöhe) liegt; liegt dort kein Kapitel, ist nichts unterstrichen. var kopf=document.querySelector('.site-top'),ids=['geschichte','welten','haltung','menschen'],links={},wartet=false; document.querySelectorAll('.navigation a[href^="#"]').forEach(function(a){links[a.getAttribute('href').slice(1)]=a;}); function lage(){ wartet=false;kopf.classList.toggle('unten',scrollY>(kopf.classList.contains('unten')?12:40)); // kleine Spanne, damit die Leiste an der Schwelle nicht flackert var m=innerHeight*.45,gef=null; ids.forEach(function(id){var s=document.getElementById(id);if(!s)return;var r=s.getBoundingClientRect();if(r.top<=m&&r.bottom>m)gef=id;}); ids.forEach(function(id){if(links[id])links[id].classList.toggle('ist-hier',id===gef);}); } function bald(){if(!wartet){wartet=true;requestAnimationFrame(lage);}} lage();addEventListener('scroll',bald,{passive:true});addEventListener('resize',bald); // Fluss nachführen: die Wolken (in % der Seitenhöhe gesetzt, r20.css) wandern mit dem Inhalt, den die neuen Blöcke verschoben haben. // BAND = Mitte % und Höhe % der sieben Bänder im Hintergrund (Zahlen aus r20.css, Rechner / Handy) var fl=document.querySelector('.fluss'),BAND=[[6,15],[17,17],[23,15],[56,18],[69,20],[85,18],[98,15]],BANDH=[[6,5.5],[13,5.5],[22,6],[50,6],[69,6],[87,6],[98,5]]; var stuecke=fl?[].slice.call(fl.querySelectorAll('.aq')):[]; stuecke.forEach(function(x){x._y=parseFloat(x.style.getPropertyValue('--y'));x._yh=parseFloat(x.style.getPropertyValue('--yh'));x._dy=parseFloat(x.style.getPropertyValue('--dy'));}); function erg24(handy,o){ // Der Satz ist aus dem Kopf des Abschnitts in den Karten-Block gezogen: zwei Höhenänderungen, an ihren Stellen (alte Lage = neue Lage minus das, was darüber geändert ist). var st=document.querySelector('#welten .section-top'),ex=document.querySelector('.erklaerung'),w=document.querySelector('.world-feature>p'),mw=document.querySelector('.mini-worlds'); if(!st||!ex||!w||!mw)return []; var p=document.createElement('p');p.className='para';p.textContent='Jeder Ort hat sein Zeichen und seine Farbe. Hinter jedem Zeichen steckt ein Foto aus unserem Alltag.';st.appendChild(p);var alt=st.offsetHeight;st.removeChild(p); var jetzt=st.offsetHeight,top=st.getBoundingClientRect().top+scrollY-o,d1=jetzt-alt, lueck=mw.getBoundingClientRect().top-w.getBoundingClientRect().bottom,d2=lueck-(handy?30:46); return [{a:top+alt,f:d1},{a:w.getBoundingClientRect().bottom+scrollY-o-d1,f:d2}]; } function erg25(handy,o,b1,b2,b3){ // Alle Höhenänderungen dieser Runde gegenüber Runde 21, in der Reihenfolge der Seite. Je Änderung: Ort in der NEUEN Seite (n), Höhe (f), Art // 'h' = Element wurde höher oder niedriger (Ort = Unterkante), 'e' = Einschub (Ort = Oberkante). Die alte Lage ergibt sich aus n minus allem, was darüber liegt. var ev=[],y=function(e){var r=e.getBoundingClientRect();return {t:r.top+scrollY-o,b:r.bottom+scrollY-o};}; function alt(sel,machen,nach){var e=document.querySelector(sel);if(!e)return;var c=e.cloneNode(true);machen(c);c.style.visibility='hidden';e.parentNode.insertBefore(c,e.nextSibling); var h=c.offsetHeight;e.parentNode.removeChild(c);ev.push({n:y(e).b,f:e.offsetHeight-h,k:'h'});if(nach)nach(e.offsetHeight-h);} alt('#geschichte .para',function(c){c.textContent=c.textContent.replace(/14[\s\u00a0]Jahre[\s\u00a0]alt/,'vierzehn');}); var st=document.querySelector('#welten .section-top'),ex=document.querySelector('.erklaerung'),w=document.querySelector('.world-feature>p'),mw=document.querySelector('.mini-worlds'); if(st&&ex&&w&&mw){ var p=document.createElement('p');p.className='para';p.textContent='Jeder Ort hat sein Zeichen und seine Farbe. Hinter jedem Zeichen steckt ein Foto aus unserem Alltag.';st.appendChild(p);var a0=st.offsetHeight;st.removeChild(p); var d1=st.offsetHeight-a0,lueck=mw.getBoundingClientRect().top-w.getBoundingClientRect().bottom,d2=lueck-(handy?30:46); ev.push({n:y(st).b,f:d1,k:'h'});ev.push({n:y(w).b,f:d2,k:'e'}); } alt('.mini-worlds',function(c){[].forEach.call(c.querySelectorAll('.karte-ort'),function(x){x.parentNode.removeChild(x);});if(matchMedia('(min-width:741px) and (max-width:1102px)').matches)c.className+=' vier30';}); ev.push({n:b1.neu,f:b1.f,k:'e'}); alt('.belief blockquote',function(c){c.innerHTML=c.textContent;}); alt('.belief .para.satz',function(c){c.className='para';},function(f){document.getElementById('haltung').style.setProperty('--pb-plus',f+'px');}); ev.push({n:b2.neu,f:b2.f,k:'e'}); alt('.end-cta .para',function(c){c.innerHTML=c.textContent;}); ev.push({n:b3.neu,f:b3.f,k:'e'}); var kn=document.querySelector('.kanaele30');if(kn){ev.push({n:y(kn).t,f:kn.offsetHeight,k:'e'});} ev.sort(function(a,b){return a.n-b.n;}); var S=0,qs=[]; ev.forEach(function(e){qs.push({a:e.n-S-(e.k==='h'?e.f:0),f:e.f});S+=e.f;}); return qs; } function fluss22(){ if(!fl)return; var handy=matchMedia('(max-width:740px)').matches,o=fl.getBoundingClientRect().top+scrollY,H=fl.offsetHeight; function block(sel){var e=document.querySelector(sel);if(!e)return null;var mt=parseFloat(getComputedStyle(e).marginTop)||0; return{neu:e.getBoundingClientRect().top+scrollY-o-mt,f:e.offsetHeight+mt};} var b1=block('.flyer22')||{neu:1e9,f:0},b2=block('.leute22')||{neu:1e9,f:0},fu=document.querySelector('footer'); // der Fuß wurde nur in schmalen Fenstern höher (Allgäu-Marke und Förderhinweis brechen um); Höhe wie in Runde 21: 457 px am Handy, sonst 290 px var b3={neu:fu?fu.getBoundingClientRect().top+scrollY-o:1e9,f:fu?Math.max(0,fu.offsetHeight-(handy?457:290)):0}; var qs=erg25(handy,o,b1,b2,b3),H0=H-qs.reduce(function(s,q){return s+q.f;},0); function karte(alt){var n=alt;qs.forEach(function(q){if(alt>q.a)n+=q.f;});return n;} stuecke.forEach(function(x){var y=handy?x._yh:x._y,dy=handy?x._dy*.6:x._dy;x.style.top=karte(y/100*H0+dy).toFixed(1)+'px';}); (handy?BANDH:BAND).forEach(function(g,i){fl.style.setProperty('--gy'+(i+1),karte(g[0]/100*H0).toFixed(1)+'px');fl.style.setProperty('--gr'+(i+1),(g[1]/100*H0).toFixed(1)+'px');}); } fluss22();addEventListener('load',fluss22);addEventListener('resize',fluss22); if(document.fonts&&document.fonts.ready)document.fonts.ready.then(fluss22); if('ResizeObserver' in window)new ResizeObserver(fluss22).observe(document.querySelector('.seite')); var alle=document.querySelectorAll('.zeichnen,.schwebt'); if('IntersectionObserver' in window){ // Zeichen zeichnen sich, Flyer und Menschen schweben ein, sobald sie ins Bild kommen (einmal) var los=new IntersectionObserver(function(es){es.forEach(function(en){if(en.isIntersecting){en.target.classList.add('los');los.unobserve(en.target);}});},{threshold:.2}); alle.forEach(function(z){los.observe(z);}); } else alle.forEach(function(z){z.classList.add('los');}); // Ohne Maus (Handy): der erste Tipp dreht Flyer oder Foto, der zweite öffnet den Flyer var ohneMaus=matchMedia('(hover: none)').matches; document.querySelectorAll('.fl,.pe').forEach(function(k){k.addEventListener('click',function(ev){ if(!ohneMaus||ev.target.closest('a[href^="tel:"]'))return; var war=k.classList.contains('gedreht'); if(war&&k.classList.contains('fl'))return; ev.preventDefault(); document.querySelectorAll('.fl.gedreht,.pe.gedreht').forEach(function(x){x.classList.remove('gedreht');}); if(!war)k.classList.add('gedreht');});}); })(); }catch(e){console.error("[Startseite] Skript 3:",e);} /* Skript 4 */ try{ (function(){ // Kapitelmarken „A · B" (Gestalterin, Runde 23): bricht die Zeile, steht der Punkt weder am Zeilenende noch am Anfang; jeder Teil bekommt eine Zeile. var es=[].slice.call(document.querySelectorAll('.eyebrow')).filter(function(e){return e.querySelector('.kp');}); function umbruch(){es.forEach(function(e){var k=e.querySelectorAll('.kz');e.classList.remove('umbruch');if(k[1].offsetTop>k[0].offsetTop+2)e.classList.add('umbruch');});} umbruch();addEventListener('resize',umbruch);addEventListener('load',umbruch); if(document.fonts&&document.fonts.ready)document.fonts.ready.then(umbruch); })(); }catch(e){console.error("[Startseite] Skript 4:",e);} /* Skript 5 */ try{ (function(){ // Runde 29 (Gestalterin 28.10.2026): Text-Animationen. Das Skript wird als eigener Block in die Seite gesetzt (build_r29.py); der Lader setzt CSS, HTML, dann dieses Skript ein. // Es wartet auf kein DOMContentLoaded und kein load: es läuft, sobald es dasteht. Ohne dieses Skript ist alles sichtbar (die Klassen .a29 und .an gibt es dann nie). // Bei „Bewegung reduzieren“ tut es nichts. if(!window.matchMedia||matchMedia('(prefers-reduced-motion:reduce)').matches)return; var d=document; // 1. Titelbild: die Animation steckt im CSS (data-ah) und hat schon begonnen. Sind die zwei Hausschriften noch nicht da, ist der Text unsichtbar (font-display:block); // dann hält das Skript die Titelbild-Animationen an und lässt sie von vorn laufen, sobald die Schriften da sind (höchstens 1,2 s Wartezeit). var hero=[].slice.call(d.querySelectorAll('[data-ah]')); function schriften(){try{return d.fonts.check('1em "Smart Stuff KL"')&&d.fonts.check('1em "Tidy Notes KL"');}catch(e){return true;}} if(hero.length&&d.fonts&&d.fonts.load&&hero[0].getAnimations&&!schriften()){ var an=[]; hero.forEach(function(e){e.getAnimations().forEach(function(a){a.pause();an.push(a);});}); var los=function(){if(!an)return;var x=an;an=null;x.forEach(function(a){a.currentTime=0;a.play();});}; Promise.all([d.fonts.load('1em "Smart Stuff KL"'),d.fonts.load('1em "Tidy Notes KL"')]).then(los,los); setTimeout(los,1200); } // 2. Scrollen: Ziele (data-a29) unterhalb des ersten Bildes werden versteckt (.a29) und laufen (.an), sobald ihre Oberkante 10 % über dem unteren Bildrand ist. // Ziele, die schon im ersten Bild oder darüber liegen, bleiben unberührt (nichts verschwindet und kommt wieder). var ziele=[].slice.call(d.querySelectorAll('[data-a29]')); if(!ziele.length||!window.IntersectionObserver)return; var hoehe=function(){return window.innerHeight||d.documentElement.clientHeight;}; var warten=[]; ziele.forEach(function(z){ var r=z.getBoundingClientRect(); if(r.bottom<0||r.top-1)warten.splice(i,1);} var io=new IntersectionObserver(function(es){ // Was gleichzeitig ins Bild kommt, läuft nacheinander: nach Zeile (oben zuerst), in einer Zeile von links nach rechts, 0,12 s Versatz, höchstens 0,36 s var neu=es.filter(function(e){return e.isIntersecting;}).map(function(e){return e.target;}); neu.sort(function(a,b){var x=a.getBoundingClientRect(),y=b.getBoundingClientRect();return Math.abs(x.top-y.top)<24?x.left-y.left:x.top-y.top;}); neu.forEach(function(z,i){z.style.setProperty('--g',(Math.min(i,3)*.12).toFixed(2)+'s');z.classList.add('an');io.unobserve(z);weg(z);}); },{rootMargin:'0px 0px -10% 0px',threshold:0}); warten.forEach(function(z){io.observe(z);}); // Was nach einem Sprung (Anker, Ende-Taste, schnelles Scrollen) über dem Bild liegen bleibt, steht ohne Bewegung da var plan=false; function oben(){plan=false;warten.slice().forEach(function(z){if(z.getBoundingClientRect().bottom<0){io.unobserve(z);z.classList.add('an','sofort');weg(z);}});} addEventListener('scroll',function(){if(!plan&&warten.length){plan=true;requestAnimationFrame(oben);}},{passive:true}); // Druck: alles da addEventListener('beforeprint',function(){warten.slice().forEach(function(z){io.unobserve(z);z.classList.add('an','sofort');weg(z);});}); })(); }catch(e){console.error("[Startseite] Skript 5:",e);}