document.addEventListener("DOMContentLoaded", () => { // Rejestracja pluginów GSAP gsap.registerPlugin(Flip, ScrollTrigger); // --- MOTYW (THEME) --- const toggleButton = document.getElementById("theme-toggle"); const body = document.querySelector("body"); const setTheme = (theme) => { body.dataset.theme = theme; localStorage.setItem("preferred-theme", theme); }; const getTheme = () => localStorage.getItem("preferred-theme") || "dark"; if (toggleButton) { toggleButton.addEventListener("click", () => { const newTheme = body.dataset.theme === "light" ? "dark" : "light"; setTheme(newTheme); }); } setTheme(getTheme()); // --- FIX: SIEROTKI (Typografia) --- // Ta wersja nie psuje już linków , bo nie dotyka HTMLa function fixSingleLetterWords(selector) { const elements = document.querySelectorAll(selector); elements.forEach(element => { const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false); let node; while (node = walker.nextNode()) { node.nodeValue = node.nodeValue.replace(/\b([iIaAoOuUwWzZ])\b\s/g, '$1\u00A0'); } }); } fixSingleLetterWords('.blog-rich-text'); // --- KURSOR --- const cursor = document.querySelector(".cursor"); const cursorStroke = document.querySelector(".cursor_stroke"); if (cursor && cursorStroke) { gsap.set([cursor, cursorStroke], { xPercent: -50, yPercent: -50 }); const xC = gsap.quickSetter(cursor, "x", "px"); const yC = gsap.quickSetter(cursor, "y", "px"); window.addEventListener("mousemove", (e) => { xC(e.x); yC(e.y); gsap.to(cursorStroke, { duration: 0.2, x: e.clientX, y: e.clientY }); }); const linksAndButtons = document.querySelectorAll("a, button"); linksAndButtons.forEach((el) => { el.addEventListener("mouseover", () => { gsap.to([cursor, cursorStroke], { opacity: 0, duration: 0.3 }); gsap.to(cursorStroke, { scale: 1.75, duration: 0.4 }); }); el.addEventListener("mouseout", () => { gsap.to([cursor, cursorStroke], { opacity: 1, duration: 0.3 }); gsap.to(cursorStroke, { scale: 1, duration: 0.4 }); }); }); } // --- LOADER ANIMATION --- function runLoaderAnimation() { const loaderText = document.querySelector(".loader-text"); if (!loaderText) return; loaderText.textContent = "0"; gsap.to(loaderText, { duration: 1, textContent: 100, snap: { textContent: 1 }, onComplete: () => { const loaderTl = gsap.timeline(); loaderTl .to(".loader-text", { duration: 1.5, yPercent: -800, opacity: 0, ease: "power3.inOut" }) .to(".loader", { duration: 1.5, yPercent: 110, ease: "power3.inOut" }, 0) .from(".slogan, .nav_item", { duration: 1, ease: "power3.out", filter: "blur(0.5rem)", yPercent: -100, opacity: 0, stagger: 0.05 }, 0.5); }, }); } runLoaderAnimation(); // --- TRANSITIONS (PRZEJŚCIA MIĘDZY STRONAMI) --- document.querySelectorAll("a").forEach((link) => { link.addEventListener("click", function (e) { const targetUrl = this.getAttribute("href"); const isSameDomain = this.host === window.location.host; // Ignoruj jeśli: inna domena, puste, kotwica, lub otwiera w nowym oknie if (!isSameDomain || !targetUrl || targetUrl.startsWith('#') || this.target === "_blank") { return; } e.preventDefault(); const tl = gsap.timeline({ onComplete: () => { window.location.href = targetUrl; } }); tl.to(".loader", { yPercent: 0, duration: 0.5, ease: "power3.inOut" }) .to("#logo", { duration: 0.5, yPercent: -50, filter: "blur(1rem)", opacity: 0, ease: "power3.in" }, 0); }); }); // --- NAVBAR & SCROLL TRIGGERS --- const showAnim = gsap.fromTo(".nav_component", { yPercent: -150, opacity: 0 }, { yPercent: 0, opacity: 1, paused: true, duration: 0.45, ease: "power3.inOut" } ).progress(1); const navTrigger = ScrollTrigger.create({ start: "top top", end: 99999, onUpdate: (self) => { self.direction === -1 ? showAnim.play() : showAnim.reverse(); }, }); ScrollTrigger.create({ trigger: ".footer", start: "top bottom", onEnter: () => { navTrigger.disable(); showAnim.play(); }, onLeaveBack: () => { navTrigger.enable(); } }); // CTA Section Animation if (document.querySelector(".section_main_cta")) { new SplitType(".main_cta_component h2, .main_cta_component p", { types: "chars" }); gsap.from(".main_cta_component .char", { scrollTrigger: { trigger: ".section_main_cta", start: "top 80%", end: "center center", scrub: 2, }, opacity: 0.1, filter: "blur(1rem)", yPercent: 10, stagger: 0.01, }); } // Footer Logo gsap.from("#logoFooter path", { scrollTrigger: { trigger: ".footer", start: "top 90%", }, filter: "blur(1rem)", yPercent: 50, opacity: 0, stagger: 0.1, duration: 1, ease: "power3.out" }); }); // Obsługa BFCache (powrót przyciskiem "wstecz") window.addEventListener("pageshow", (event) => { if (event.persisted) { gsap.set(".loader", { yPercent: 110 }); gsap.set("#logo", { yPercent: 0, filter: "blur(0)", opacity: 1 }); } });