document.addEventListener('DOMContentLoaded', function () { var toggle = document.querySelector('.nav-toggle'); var menu = document.querySelector('.nav-menu'); if (toggle && menu) { toggle.addEventListener('click', function () { var opened = menu.classList.toggle('open'); toggle.setAttribute('aria-expanded', opened ? 'true' : 'false'); }); } Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]')).forEach(function (link) { link.addEventListener('click', function (e) { var targetId = link.getAttribute('href').slice(1); var target = document.getElementById(targetId); if (target) { e.preventDefault(); window.scrollTo({ top: target.offsetTop - 60, behavior: 'smooth' }); if (menu && menu.classList.contains('open')) { menu.classList.remove('open'); toggle && toggle.setAttribute('aria-expanded', 'false'); } } }); }); var header = document.querySelector('.site-header'); window.addEventListener('scroll', function () { if (!header) return; if (window.scrollY > 10) header.classList.add('scrolled'); else header.classList.remove('scrolled'); }); var cards = document.querySelectorAll('.card'); if ('IntersectionObserver' in window) { var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) entry.target.classList.add('in-view'); }); }, { threshold: 0.2 }); Array.prototype.slice.call(cards).forEach(function (card) { observer.observe(card); }); } else { Array.prototype.slice.call(cards).forEach(function (card) { card.classList.add('in-view'); }); } });