document.addEventListener("DOMContentLoaded", () => { const targets = document.querySelectorAll(".anime-text"); targets.forEach(target => { const wrapTextNodes = (node) => { if (node.nodeType === Node.TEXT_NODE) { const fragment = document.createDocumentFragment(); node.textContent.split("").forEach((char, i) => { const span = document.createElement("span"); span.textContent = char; span.style.transitionDelay = `${i * 0.05}s`; fragment.appendChild(span); }); node.replaceWith(fragment); } else if (node.nodeType === Node.ELEMENT_NODE && node.tagName !== "BR") { Array.from(node.childNodes).forEach(child => wrapTextNodes(child)); } }; wrapTextNodes(target); }); setTimeout(() => { const observer = new IntersectionObserver((entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("anime-on"); observer.unobserve(entry.target); } }); }, { threshold: 0.1 }); targets.forEach(target => { observer.observe(target); }); }, 1000); }); document.addEventListener("DOMContentLoaded", () => { const targets = document.querySelectorAll(".anime"); setTimeout(() => { const observer = new IntersectionObserver((entries, observer) => { entries.forEach((entry, index) => { if (entry.isIntersecting) { const el = entry.target; el.style.transitionDelay = `${index * 0.1 + 0.2}s`; el.classList.add("anime-on"); observer.unobserve(el); } }); }, { threshold: 0.1 }); targets.forEach(target => { observer.observe(target); }); }, 1500); });