- dev/betrieb/deploy.sh: Deploy nur per Tag, mit --seed (Seeder im Wartungsmodus) und --initial (Vorschau/Live einmalig an Ort und Stelle auf Git umstellen) - dev/betrieb/vorschau-auffrischen.sh: Live-DB und Live-Medien in die Vorschau (Generalprobe) - InteriorReleaseSeeder: alle Inhaltsschritte des Relaunchs in einem Lauf, idempotent; Displays, Playlists und Mediathek bleiben unberührt - DisplayInteriorBrandingSeeder überschreibt keinen inzwischen gepflegten Claim mehr - Monitoring: GlitchTip (Server + Browser), /health mit Token, Scheduler-Herzschlag, Alarme per Mail und ntfy, Version in about und /health - public/build versioniert; .gitignore: macOS-Muster Icon traf resources/views/flux/icon/ - Runbook: dev/betrieb/README.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 line
2.4 KiB
JavaScript
1 line
2.4 KiB
JavaScript
(function(){let o=null;document.readyState==="loading"?document.addEventListener("DOMContentLoaded",r):r();function r(){s(),u(),c(),document.addEventListener("livewire:navigated",function(){s()}),document.addEventListener("livewire:load",function(){s()}),window.addEventListener("livewire:update",function(){setTimeout(()=>{s()},100)})}function s(){const n={threshold:.15,rootMargin:"0px 0px -80px 0px"};o||(o=new IntersectionObserver(e=>{e.forEach(t=>{t.isIntersecting&&(setTimeout(()=>{t.target.classList.add("is-visible")},50),o.unobserve(t.target))})},n)),document.querySelectorAll(".scroll-animate:not(.is-visible):not(.observed), .fade-in:not(.is-visible):not(.observed), .slide-up:not(.is-visible):not(.observed), .slide-right:not(.is-visible):not(.observed), .slide-left:not(.is-visible):not(.observed), .scale-in:not(.is-visible):not(.observed), .slide-down:not(.is-visible):not(.observed)").forEach(e=>{e.classList.add("observed"),o.observe(e)}),window.appointmentLinksInitialized||(document.addEventListener("click",function(e){const t=e.target.closest("a[data-open-appointment]");t&&(e.preventDefault(),window.dispatchEvent(new CustomEvent("open-appointment",{detail:{topic:t.dataset.appointmentTopic||null}})))}),window.appointmentLinksInitialized=!0),window.smoothScrollInitialized||(document.addEventListener("click",function(e){const t=e.target.closest('a[href^="#"]');if(t&&t.hash){const l=document.querySelector(t.hash);if(l){e.preventDefault();const f=l.getBoundingClientRect().top+window.pageYOffset-80;window.scrollTo({top:f,behavior:"smooth"})}}}),window.smoothScrollInitialized=!0)}function c(){const n=document.getElementById("main-header");if(!n)return;function i(){(window.pageYOffset||document.documentElement.scrollTop)>50?n.classList.add("scrolled"):n.classList.remove("scrolled")}let e=!1;window.addEventListener("scroll",function(){e||(window.requestAnimationFrame(function(){i(),e=!1}),e=!0)}),i()}function u(){const n=document.createElement("div");n.className="scroll-progress-bar",document.body.appendChild(n);function i(){const t=window.innerHeight,l=document.documentElement.scrollHeight,d=window.pageYOffset||document.documentElement.scrollTop,a=d/(l-t)*100;n.style.width=`${Math.min(a,100)}%`,d>100?n.classList.add("visible"):n.classList.remove("visible")}let e=!1;window.addEventListener("scroll",function(){e||(window.requestAnimationFrame(function(){i(),e=!1}),e=!0)}),i()}})();
|