(function () { 'use strict'; function ready(fn) { document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', fn) : fn(); } ready(function () { var root = document.querySelector('.sw-portfolio'); if (!root) return; /* 1. Scroll animations */ var els = root.querySelectorAll('.sw-anim'); if ('IntersectionObserver' in window) { var io = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('sw-in'); io.unobserve(e.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -32px 0px' }); els.forEach(function (el) { io.observe(el); }); } else { els.forEach(function (el) { el.classList.add('sw-in'); }); } /* 2. Smooth scroll for portfolio anchor links */ root.querySelectorAll('a[href^="#sw-"]').forEach(function (a) { a.addEventListener('click', function (e) { var target = document.getElementById(a.getAttribute('href').slice(1)); if (!target) return; e.preventDefault(); var drawer = root.querySelector('.sw-nav-drawer'); var toggle = root.querySelector('.sw-nav-toggle'); if (drawer) drawer.classList.remove('sw-open'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); var navH = (root.querySelector('.sw-nav') || {}).offsetHeight || 0; window.scrollTo({ top: target.getBoundingClientRect().top + window.pageYOffset - navH - 10, behavior: 'smooth' }); }); }); /* 3. Mobile nav toggle */ var toggle = root.querySelector('.sw-nav-toggle'); var drawer = root.querySelector('.sw-nav-drawer'); if (toggle && drawer) { toggle.addEventListener('click', function () { var open = drawer.classList.toggle('sw-open'); toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); toggle.textContent = open ? 'CLOSE' : 'MENU'; }); } /* 4. Card 3D tilt */ root.querySelectorAll('.sw-card').forEach(function (card) { card.addEventListener('mousemove', function (e) { var r = card.getBoundingClientRect(); var tX = ((e.clientY - r.top) / r.height - 0.5) * 4; var tY = ((e.clientX - r.left) / r.width - 0.5) * -4; card.style.transform = 'translate(-3px,-3px) perspective(700px) rotateX('+tX+'deg) rotateY('+tY+'deg)'; }); card.addEventListener('mouseleave', function () { card.style.transform = ''; }); }); /* 5. Active nav highlight on scroll */ var sectionIds = ['sw-about','sw-work','sw-writing','sw-contact']; var navAs = root.querySelectorAll('.sw-nav-links a, .sw-nav-drawer a'); function updateActive() { var mid = window.pageYOffset + window.innerHeight * 0.35; var cur = ''; sectionIds.forEach(function (id) { var el = document.getElementById(id); if (el && el.offsetTop <= mid) cur = id; }); navAs.forEach(function (a) { var isActive = a.getAttribute('href') === '#' + cur; a.style.background = isActive ? 'rgba(186,149,33,.18)' : ''; }); } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); }); })();
Skip to content
Leave a Reply