(function () { var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; if (reduce) return; var desktop = window.matchMedia("(hover: hover) and (pointer: fine)"); if (!desktop.matches) return; function split(btn) { if (!btn || btn.dataset.twSplit === "1") return; btn.dataset.twSplit = "1"; var box = btn.querySelector("[data-wave-target]") || btn.querySelector(".text_box > div:not(.abs_text)") || btn.querySelector(".text_box > div") || btn.querySelector(".text_box") || btn.firstElementChild || btn; if (!box) return; var raw = (box.textContent || "").trim(); if (!raw) return; box.textContent = ""; for (var i = 0; i < raw.length; i++) { var s = document.createElement("span"); s.className = "tw-char"; s.dataset.i = i; s.textContent = raw[i] === " " ? "\u00A0" : raw[i]; box.appendChild(s); } } function initOne(btn) { if (!btn || btn.dataset.waveInit === "1") return; btn.dataset.waveInit = "1"; split(btn); var chars = btn.querySelectorAll(".tw-char"); if (!chars.length) return; var raf = null; var t0 = 0; var hovering = false; var amp = 1; var speed = 0.003; var k = 0.65; var smooth = 0.12; var curAmp = 0; var targetAmp = 0; function frame(ts) { if (!t0) t0 = ts; var t = ts - t0; curAmp += (targetAmp - curAmp) * smooth; for (var n = 0; n < chars.length; n++) { var i = +chars[n].dataset.i || 0; var y = Math.sin(t * speed + i * k) * curAmp; chars[n].style.transform = "translateY(" + (-y).toFixed(2) + "px)"; } if (!hovering && curAmp < 0.05) { for (var n2 = 0; n2 < chars.length; n2++) chars[n2].style.transform = "translateY(0px)"; raf = null; t0 = 0; return; } raf = requestAnimationFrame(frame); } function start() { hovering = true; targetAmp = amp; if (!raf) raf = requestAnimationFrame(frame); } function stop() { hovering = false; targetAmp = 0; if (!raf) raf = requestAnimationFrame(frame); } btn.addEventListener("pointerenter", start); btn.addEventListener("pointerleave", stop); } function initAll() { document.querySelectorAll("[data-wave-text]").forEach(initOne); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initAll); } else initAll(); if (window.Webflow) window.Webflow.push(initAll); })();