/* TRUE LOVE STORY — shared interactions */ (function () { 'use strict'; // Sticky header state var header = document.querySelector('.site-header'); function onScroll() { if (!header) return; if (window.scrollY > 40) header.classList.add('scrolled'); else header.classList.remove('scrolled'); } window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); // Mobile nav var toggle = document.querySelector('.nav-toggle'); var nav = document.querySelector('.nav'); if (toggle && nav) { toggle.addEventListener('click', function () { nav.classList.toggle('open'); toggle.classList.toggle('open'); var open = nav.classList.contains('open'); toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); }); nav.querySelectorAll('a').forEach(function (a) { a.addEventListener('click', function () { nav.classList.remove('open'); toggle.classList.remove('open'); }); }); } // Reveal on scroll var reveals = document.querySelectorAll('.reveal'); if ('IntersectionObserver' in window && reveals.length) { var io = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: '0px 0px -8% 0px' }); reveals.forEach(function (el) { io.observe(el); }); } else { reveals.forEach(function (el) { el.classList.add('in'); }); } // FAQ accordion document.querySelectorAll('.faq-q').forEach(function (q) { q.addEventListener('click', function () { var item = q.closest('.faq-item'); var ans = item.querySelector('.faq-a'); var isOpen = item.classList.contains('open'); item.classList.toggle('open'); q.setAttribute('aria-expanded', isOpen ? 'false' : 'true'); ans.style.maxHeight = isOpen ? null : ans.scrollHeight + 'px'; }); }); // Contact form (demo handler — no backend) var form = document.querySelector('.form'); if (form) { form.addEventListener('submit', function (e) { e.preventDefault(); var success = document.querySelector('.form-success'); if (success) { form.style.display = 'none'; success.classList.add('show'); success.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }); } // Footer year var y = document.querySelector('[data-year]'); if (y) y.textContent = new Date().getFullYear(); // Graceful image fallback — if an image can't load, reveal the gradient behind it document.querySelectorAll('img').forEach(function (im) { im.addEventListener('error', function () { im.classList.add('img-failed'); }); if (im.complete && im.naturalWidth === 0) im.classList.add('img-failed'); }); // ---- Film slider: arrow navigation ---- document.querySelectorAll('.film-slider-wrap').forEach(function (wrap) { var slider = wrap.querySelector('.film-slider'); var prev = wrap.querySelector('.film-nav--prev'); var next = wrap.querySelector('.film-nav--next'); if (!slider) return; function step() { var card = slider.querySelector('.film-card'); return card ? card.getBoundingClientRect().width + 20 : 320; } function update() { if (!prev || !next) return; prev.disabled = slider.scrollLeft < 8; next.disabled = slider.scrollLeft + slider.clientWidth >= slider.scrollWidth - 8; } if (prev) prev.addEventListener('click', function () { slider.scrollBy({ left: -step(), behavior: 'smooth' }); }); if (next) next.addEventListener('click', function () { slider.scrollBy({ left: step(), behavior: 'smooth' }); }); slider.addEventListener('scroll', update, { passive: true }); window.addEventListener('resize', update); update(); }); // ---- Film lightbox (Vimeo or YouTube) ---- var modal = document.querySelector('.film-modal'); if (modal) { var embed = modal.querySelector('.film-embed'); function embedUrl(provider, id) { if (provider === 'youtube') { return 'https://www.youtube-nocookie.com/embed/' + id + '?autoplay=1&rel=0&modestbranding=1'; } // default: vimeo return 'https://player.vimeo.com/video/' + id + '?autoplay=1&title=0&byline=0&portrait=0'; } function openFilm(provider, id) { embed.innerHTML = ''; modal.classList.add('open'); document.body.style.overflow = 'hidden'; } function closeFilm() { modal.classList.remove('open'); embed.innerHTML = ''; document.body.style.overflow = ''; } document.querySelectorAll('.film-card').forEach(function (card) { card.addEventListener('click', function () { openFilm(card.getAttribute('data-provider') || 'vimeo', card.getAttribute('data-id')); }); }); modal.addEventListener('click', function (e) { if (e.target === modal || e.target.closest('.film-close')) closeFilm(); }); document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && modal.classList.contains('open')) closeFilm(); }); } })();