{"version":3,"sources":["jsdelivr-header.js","/npm/@widelab-nc/widelab@1.1.39/src/index.js"],"names":[],"mappings":"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","file":"/npm/@widelab-nc/widelab@1.1.39/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@widelab-nc/widelab@1.1.39/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import {initAlpine} from \"./init\";\nimport Lenis from '@studio-freight/lenis';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\nimport { ScrollToPlugin } from \"gsap/ScrollToPlugin\";\nimport { CustomEase } from \"gsap/CustomEase\";\nimport { SplitText } from \"gsap/SplitText\";\nimport Splide from '@splidejs/splide';\nimport { DrawSVGPlugin } from 'gsap/DrawSVGPlugin';\n\n\n// GSAP plugins register and custom easing\ngsap.registerPlugin(ScrollTrigger, ScrollToPlugin, CustomEase, SplitText, DrawSVGPlugin);\nfunction customGsapEasing() {\n  CustomEase.create('loader', '0.83, 0, 0.17, 1');\n  CustomEase.create('loader2', '0.77, 0, 0.175, 1');\n}\n\n// Smoothly scrolls to section if current URL contains a hash\nfunction scrollToHashOnLoad(offsetY = 0) {\n  window.addEventListener('load', () => {\n    const hash = window.location.hash;\n    if (!hash) return;\n\n    const target = document.querySelector(hash);\n    if (!target) return;\n\n    gsap.to(window, {\n      scrollTo: { y: target, offsetY: offsetY },\n      duration: 1,\n      ease: 'power2.out'\n    });\n  });\n}\n\n// Functions definitions\n\n// === Skills: ScrollTrigger + GSAP init (definition only) ===\n// You will call this yourself later, e.g. initSkillsTriggers({ section: '#skills' })\n// Client logos reveal inside a section (definition only; you call it later)\nfunction initClientLogosAnimation(rootEl, userOpts = {}) {\n  // ---- guards ----\n  if (!window.gsap || !window.ScrollTrigger) {\n    console.warn('[client-logos] GSAP/ScrollTrigger missing');\n    return { ok: false, reason: 'gsap-or-plugin-missing' };\n  }\n\n  const gsap = window.gsap;\n  const ScrollTrigger = window.ScrollTrigger;\n  try { gsap.registerPlugin(ScrollTrigger); } catch (_) {}\n\n  // ---- config ----\n  const opts = {\n    // adjust these to your real structure if needed\n    listSelector: '.clients_wrapper-bento',\n    itemSelector: '.clients_wrapper-bento .bento_item, .client-logo, .logo',\n    start: 'top 80%',\n    end: 'bottom top',\n    markers: false,\n    ...userOpts\n  };\n\n  // ---- scope ----\n  const root = rootEl && rootEl.nodeType === 1 ? rootEl : document;\n  const list = root.querySelector(opts.listSelector);\n  const items = list ? Array.from(list.querySelectorAll(opts.itemSelector)) : [];\n\n  // nothing to animate? bail quietly (prevents \"GSAP target … not found\")\n  if (!list || !items.length) {\n    return { ok: false, reason: 'targets-not-found', listFound: !!list, count: items.length };\n  }\n\n  // kill old triggers bound to this list (idempotent reruns)\n  ScrollTrigger.getAll().forEach(st => {\n    if (st && st.trigger === list) st.kill(false);\n  });\n\n  // ---- animation ----\n  gsap.from(items, {\n    y: 16,\n    opacity: 0,\n    duration: 0.6,\n    ease: 'power2.out',\n    stagger: 0.06,\n    scrollTrigger: {\n      trigger: list,\n      start: opts.start,\n      end: opts.end,\n      toggleActions: 'play none none reverse',\n      markers: opts.markers,\n      invalidateOnRefresh: true\n    }\n  });\n\n  // refresh after layout settles\n  requestAnimationFrame(() => { try { ScrollTrigger.refresh(); } catch(_) {} });\n\n  return { ok: true, count: items.length };\n}\n// Contact form open animation\nlet contactFormOpen;\nfunction contactFormOpenAnimation() {\n  const contactFormWrapper = document.querySelector('.contact-modal_main-wrapper');\n  const contactForm = document.querySelector('.contact-modal_content-wrapper');\n  contactFormOpen = gsap.timeline({paused: true});\n  contactFormOpen.to(contactFormWrapper, {\n    autoAlpha: 1,\n    duration: 0.3,\n    ease: 'loader2',\n  })\n  contactFormOpen.from(contactForm, {\n    x: '100%',\n    duration: 0.4,\n    ease: 'loader2',\n  }, '-=0.2')\n}\n\n//Smooth scroll init\n  const lenis = new Lenis({\n    duration: 1.2,\n    easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\n  });\n  function lenisScroll() {\n    lenis.on('scroll', ScrollTrigger.update);\n    gsap.ticker.add((time)=>{\n      lenis.raf(time * 1000)\n    })\n    gsap.ticker.lagSmoothing(0)\n    function raf(time) {\n      lenis.raf(time);\n      requestAnimationFrame(raf);\n    }\n    requestAnimationFrame(raf);\n  }\n\n  // Lazy load videos\n  function lazyLoadVideos() {\n  let lazyVideos = [].slice.call(document.querySelectorAll(\"video.lazyload\"));\n  if (\"IntersectionObserver\" in window) {\n    let lazyVideoObserver = new IntersectionObserver(function(entries, observer) {\n      entries.forEach(function(video) {\n        if (video.isIntersecting) {\n          for (let source of video.target.children) {\n            source.setAttribute(\"src\", source.getAttribute(\"data-src\"));\n          }\n          video.target.load();\n          video.target.play();\n          lazyVideoObserver.unobserve(video.target);\n        }\n      });\n    });\n    lazyVideos.forEach(function(lazyVideo) {\n      lazyVideoObserver.observe(lazyVideo);\n    });\n  }\n}\n\n  // Reload page on browser back action\n  function reloadOnBack() {\n    window.addEventListener('pageshow', function (event) {\n      if (event.persisted) {\n        window.location.reload();\n      }\n    });\n  }\n\n  // Scroll disable when mobile menu opened\n  function disableScrollMenu() {\n    function observeNavOverlay() {\n      const target = document.querySelector('.w-nav-overlay');\n      const config = { attributes: true, attributeFilter: ['style'] };\n      const callback = function(mutationsList, observer) {\n        for(const mutation of mutationsList) {\n          if (mutation.type === 'attributes' && mutation.attributeName === 'style') {\n            const displayValue = target.style.display;\n            if (displayValue === 'none') {\n              document.body.classList.remove('is-scroll-off');\n              lenis.start();\n            } else {\n              document.body.classList.add('is-scroll-off');\n              lenis.stop();\n            }\n          }\n        }\n      };\n      const observer = new MutationObserver(callback);\n      observer.observe(target, config);\n    }\n    observeNavOverlay();\n  }\n\n  // Hero move to reveal footer\n  function revealFooter() {\n    const footer = document.querySelector('.is-footer');\n    if (footer) {\n      gsap.to('#heroSection', {\n        scrollTrigger: {\n          trigger: '#bottomWrapper',\n          start: 'top bottom',\n          toggleActions: 'restart none none reverse',\n        },\n        autoAlpha: 0,\n      });\n    }\n  }\n\n// Page load animation (no-op below 992px)\nfunction pageLoadAnimation() {\n  if (window.innerWidth < 992) return; // guard for mobile/tablet\n\n  const loaderAnimationIn = gsap.timeline({});\n  loaderAnimationIn.add(function () {\n    history.scrollRestoration = 'manual';\n    lenis.scrollTo(0);\n  });\n  loaderAnimationIn.to(\n    '.loader_ract.is-left',\n    {\n      delay: 0.2,\n      duration: 0.7,\n      x: '100%',\n      ease: 'loader2',\n    },\n    '>'\n  );\n  loaderAnimationIn.to(\n    '.loader_ract.is-right',\n    {\n      duration: 0.7,\n      x: '-100%',\n      ease: 'loader2',\n    },\n    '<'\n  );\n  loaderAnimationIn.add(function () {\n    lenis.start();\n  }, '>');\n  loaderAnimationIn.to('.loader_wrapper', { display: 'none', duration: 0.1 }, '>');\n  // Keep your resize fix\n  window.addEventListener('resize', function () {\n    setTimeout(function () {\n      gsap.set('.loader_wrapper', { display: 'none' });\n    }, 50);\n  });\n}\n\n// Page transition animation (no-op below 992px)\nfunction pageTransitionAnimation() {\n  if (window.innerWidth < 992) return; // guard for mobile/tablet\n\n  const transitionLinks = document.querySelectorAll(\n    'a:not([href^=\"#\"]):not([href^=\"javascript:\"]):not([href=\"\"]):not([href^=\"mailto:\"]):not([href^=\"tel:\"])'\n  );\n\n  transitionLinks.forEach((link) => {\n    if (link.getAttribute('target') !== '_blank') {\n      link.addEventListener('click', (e) => {\n        e.preventDefault();\n\n        const loaderAnimationOut = gsap.timeline({\n          onComplete: () => {\n            window.location.href = link.href;\n          },\n        });\n        loaderAnimationOut.to('.unloader_wrapper', { display: 'flex', duration: 0.05 });\n        loaderAnimationOut.from('.unloader_ract', {\n          duration: 0.4,\n          width: '0%',\n          ease: 'loader2',\n        });\n        loaderAnimationOut.play();\n      });\n    }\n  });\n}\n  // Header on scroll animation\nconst infoBar = document.querySelector('.info-bar');\n  const showHideHeader = gsap.timeline({  paused: true,})\nshowHideHeader.to('.navbar', {\n  y: '-100%',\n  duration: 0.2,\n  ease: 'loader2',\n})\nif (infoBar) {\n  showHideHeader.to('.button_small.is-navbar', {\n    top: \"1.75rem\",\n    duration: 0.2,\n    ease: 'loader2',\n  }, \"<\") }\n\n  // Custom cursor on mousedown and mouseup\n  function customCursorOnClick() {\n    const cursorElements = document.querySelectorAll('[wide=\"customCursor\"]');\n    const customCursor = document.querySelector('.custom_cursor');\n    cursorElements.forEach((element) => {\n      element.addEventListener('mousedown', function () {\n        customCursor.style.transform = 'scale3d(0.8, 0.8, 1)';\n      });\n      element.addEventListener('mouseup', function () {\n        customCursor.style.transform = 'scale3d(1, 1, 1)';\n      });\n    });\n  }\n\n// === SKILLS TRIGGER HARD-FIX (drop-in) ===\n(function () {\n  const DEBUG = false; // flip to true to see console + markers\n\n  if (!window.gsap || !window.ScrollTrigger) {\n    console.error('[skills-fix] GSAP/ScrollTrigger missing');\n    return;\n  }\n  gsap.registerPlugin(ScrollTrigger);\n\n  // 1) Pick the VISIBLE \"skills\" section (ignore duplicates/hidden)\n  const candidates = Array.from(document.querySelectorAll('#skills, .section.is-skills'));\n  const el = candidates.find(n => {\n    const r = n.getBoundingClientRect();\n    const style = getComputedStyle(n);\n    return r.width > 0 && r.height > 0 && style.display !== 'none' && style.visibility !== 'hidden';\n  });\n  if (!el) {\n    console.error('[skills-fix] skills section not found or not visible');\n    return;\n  }\n\n  // 2) Diagnose ancestors that break ScrollTrigger (transform / overflow != visible)\n  const badAncestors = [];\n  let p = el.parentElement;\n  while (p && p !== document.body) {\n    const cs = getComputedStyle(p);\n    const badTransform = cs.transform && cs.transform !== 'none';\n    const badOverflow = (cs.overflow !== 'visible' || cs.overflowY !== 'visible' || cs.overflowX !== 'visible');\n    if (badTransform || badOverflow) badAncestors.push({ node: p, badTransform, badOverflow });\n    p = p.parentElement;\n  }\n\n  // 3) Neutralize only the dangerous bits, minimally\n  badAncestors.forEach(({ node, badTransform }) => {\n    // overflow hidden na wrapperach zostawiamy (często layout), ScrollTrigger sobie radzi;\n    // PRZEWAŻNIE zabija go transform na rodzicu — zdejmujemy go klasą.\n    if (badTransform) node.classList.add('st-fix-transform');\n  });\n\n  // 4) Inject minimal CSS to neutralize transforms (non-destructive)\n  const styleTag = document.createElement('style');\n  styleTag.textContent = `\n    .st-fix-transform { transform: none !important; }\n  `;\n  document.head.appendChild(styleTag);\n\n  // 5) Kill duplicated triggers on the same element\n  ScrollTrigger.getAll().forEach(st => { if (st.trigger === el) st.kill(false); });\n\n  // 6) The exact action you expect\n  const run = (target) => {\n    try { window.sectionBgChange && window.sectionBgChange(target); } catch (e) {}\n    try { window.badgeColorChange && window.badgeColorChange(target); } catch (e) {}\n    if (DEBUG) console.log('[skills-fix] run()', target);\n  };\n\n  // 7) Fire immediately if already on screen (new layout often loads in-view)\n  const r = el.getBoundingClientRect();\n  if (r.top < innerHeight && r.bottom > 0) run(el);\n\n  // 8) Create robust trigger (same feel as old), with optional markers\n  ScrollTrigger.create({\n    trigger: el,\n    start: 'top 80%',\n    end: 'bottom top',\n    onEnter: self => run(self.trigger),\n    onEnterBack: self => run(self.trigger),\n    markers: !!DEBUG,\n    fastScrollEnd: true,\n    invalidateOnRefresh: true\n  });\n\n  // 9) Refresh after things that commonly shift layout on new home\n  const doRefresh = () => {\n    if (DEBUG) console.log('[skills-fix] refresh()');\n    ScrollTrigger.refresh();\n  };\n\n  // after images\n  if (document.readyState === 'complete') requestAnimationFrame(doRefresh);\n  else window.addEventListener('load', () => requestAnimationFrame(doRefresh));\n\n  // after Webflow IX (if present)\n  try {\n    if (window.Webflow && Webflow.require) {\n      const ix2 = Webflow.require('ix2');\n      if (ix2 && ix2.ready) setTimeout(doRefresh, 300); // allow IX to apply styles\n    }\n  } catch (e) {}\n\n  // after Alpine renders (x-init etc.)\n  document.addEventListener('alpine:init', () => setTimeout(doRefresh, 100));\n  document.addEventListener('DOMContentLoaded', () => setTimeout(doRefresh, 150));\n\n  // As a last resort: one more refresh when user starts scrolling\n  let firstScroll = false;\n  const onFirstScroll = () => { if (!firstScroll) { firstScroll = true; doRefresh(); } };\n  window.addEventListener('scroll', onFirstScroll, { passive: true, once: true });\n\n  if (DEBUG) {\n    console.group('[skills-fix] diagnostics');\n    console.log('picked element:', el);\n    console.log('bad ancestors:', badAncestors);\n    console.groupEnd();\n  }\n})();\n\n  // Header scroll trigger\n  window.standardHeaderScrollAnimation = function() {\n    ScrollTrigger.create({\n      start: 'top top',\n      endTrigger: '.bottom-wrapper',\n      end: 'bottom bottom',\n      onUpdate: (self) => {\n        self.direction === 1 ? showHideHeader.play() : showHideHeader.reverse();\n      },\n    });\n  }\n\n  // Place video inside the text\n  window.videoInsideText = function(e)  {\n  const headlineContent = e.querySelector('[class*=\"copy-this\"]');\n  const headlineSpan = e.querySelector('[class*=\"headline-span\"]');\n  headlineSpan.appendChild(headlineContent);\n}\n\n  // Span video mask animation\n  window.spanVideoMaskAnimation = function(e) {\n    gsap.to(e, {\n      scrollTrigger: { trigger: e, start: 'bottom bottom-=5%' },\n      width: 0,\n      ease: 'loader2',\n      duration: 0.6,\n    });\n  }\n\n  // Custom cursor text change\n  window.customCursorText = function(e) {\n    e.addEventListener('mouseenter', () => {\n      const wideCursorTextValue = e.getAttribute('wideCursorText');\n      const customCursorTextElement = document.querySelector('.custom_cursor_text');\n      customCursorTextElement.innerHTML = wideCursorTextValue;\n    });\n  }\n\n\n\n// Safe new version that uses the same classes and structure\nwindow.customCursorTextUpdate = function(el) {\n  const cursorEl = document.querySelector('.custom_cursor_text');\n  if (!cursorEl) return;\n\n  const defaultText = cursorEl.dataset.default || '';\n\n  const getText = (node) =>\n    node.getAttribute('widecursortext') || node.getAttribute('wideCursorText') || '';\n\n  const activate = () => {\n    cursorEl.textContent = getText(el);\n    document.documentElement.classList.add('has-custom-cursor');\n  };\n\n  const maybeDeactivate = (ev) => {\n    const to = ev.relatedTarget;\n    // Don't deactivate if moving between elements that also use the custom cursor\n    if (to && to.closest && to.closest('[wide=\"customCursor\"]')) return;\n\n    cursorEl.textContent = defaultText;\n    document.documentElement.classList.remove('has-custom-cursor');\n  };\n\n  el.addEventListener('pointerenter', activate);\n  el.addEventListener('pointerleave', maybeDeactivate);\n};\n\n\n\n\n  // Hero animation on load\n  window.heroAnimationOnLoad = function(e) {\n    const videoMask = e.querySelector('.hero_headline_ract-mask');\n    const heroAnimation = gsap.timeline({}),\n      homeHeroHeading = new SplitText('#heroHeading', {\n        type: 'lines',\n        linesClass: 'hero-line',\n      }),\n      homeHeroHeadingMask = new SplitText('#heroHeading', {\n        type: 'lines',\n        linesClass: 'hero-line-mask',\n      });\n    heroAnimation.from('.navbar', {\n      opacity: 0,\n      duration: 0.6,\n      ease: 'loader2',\n    },\n      '>+0.4');\n    heroAnimation.from(\n      '.hero-line',\n      {\n        duration: 1.2,\n        y: '100%',\n        stagger: 0.2,\n        ease: 'loader2',\n      },\n      '>-0.5'\n    );\n    if (videoMask) {\n      heroAnimation.to(\n        '.hero_headline_ract-mask',\n        {\n          width: '0%',\n          duration: 0.6,\n          ease: 'loader2',\n        },\n        '>-0.6'\n      );\n    }\n    heroAnimation.from(\n      '#heroBottomWrapper',\n      {\n        opacity: 0,\n        duration: 1,\n        ease: 'loader2',\n      },\n      '>-0.4'\n    );\n  }\n\n\n// Case study mask animation + pill fade-in (full, iOS-safe, L->R reveal)\nwindow.caseStudyInteraction = function (e) {\n  const mask = e.querySelector('.portfolio_item_image-mask');\n  const pill = e.querySelector('.cs_pill');\n  const triggerEl = e.querySelector('.portfolio_item_image-wrapper') || e;\n\n  // iOS detection for safe fallbacks\n  const isIOS =\n    /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n    (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n  // --- Initial states ---\n  if (pill) gsap.set(pill, { autoAlpha: 0 });\n  if (mask) {\n    // We fully cover first, then shrink to reveal from LEFT to RIGHT.\n    // To reveal L->R we set origin to RIGHT and scaleX: 1 -> 0\n    gsap.set(mask, {\n      clearProps: 'width',          // ignore any inline width\n      scaleX: 1,\n      transformOrigin: 'right center',\n      willChange: 'transform'\n    });\n  }\n\n  // --- Timeline: mask reveal then pill ---\n  const tl = gsap.timeline({ paused: true, defaults: { ease: 'loader2' } });\n  if (mask) tl.to(mask, { scaleX: 0, duration: 0.35 }); // L->R reveal\n  if (pill) tl.to(pill, { autoAlpha: 1, duration: 0.25 }, '>-0.05');\n\n  // --- Scroll trigger (use wrapper for reliable bounds on iOS) ---\n  ScrollTrigger.create({\n    animation: tl,\n    trigger: triggerEl,\n    start: 'top 80%',\n    once: true,\n  });\n\n  // --- Video handling ---\n  const videoElements = e.getElementsByTagName('video');\n\n  if (window.innerWidth > 992) {\n    const video = videoElements.length ? videoElements[0] : null;\n    if (!video) return;\n\n    // Safari compositing hints\n    video.style.transform = 'translateZ(0)';\n\n    const hoverIN = () => video.play();\n    const hoverOUT = () => { video.pause(); /* video.currentTime = 0; */ };\n\n    video.addEventListener('loadeddata', () => { video.pause(); });\n    e.addEventListener('mouseenter', hoverIN, false);\n    e.addEventListener('mouseleave', hoverOUT, false);\n\n  } else {\n    // Mobile: poster-only, but keep sources on Android; replace with <img> on iOS\n    Array.from(videoElements).forEach((v) => {\n      const poster = v.getAttribute('poster');\n\n      if (isIOS && poster) {\n        const img = new Image();\n        img.src = poster;\n        img.alt = '';\n        img.className = v.className;\n        // Keep sizing from CSS on wrapper; this prevents 0-height glitches\n        v.replaceWith(img);\n      } else {\n        // Android: keep sources to preserve intrinsic size and poster rendering\n        v.removeAttribute('autoplay');\n        v.pause();\n        v.preload = 'none';\n        // v.load(); // enable only if you notice stale frames\n      }\n    });\n  }\n\n  // After layout settles (posters/images), refresh triggers\n  setTimeout(() => ScrollTrigger.refresh(), 120);\n};\n\n\n\n  // Reviews slider\n  window.reviewsSlider = function(e) {\n    // Put content of static slide into list\n    const staticContent = e.querySelector(\n      '.splide__slide.reviews_collection_item.is-static'\n    ).innerHTML;\n    const dynamicElement = e.querySelector('.reviews_collection_item');\n    dynamicElement.innerHTML = staticContent;\n    dynamicElement.classList.add('is-static');\n\n    // Init reviews splide\n    const reviewsSplide = new Splide(e, {\n      type: 'slide',\n      fixedWidth: '24.5rem',\n      rewind: true,\n      focus: 0,\n      padding: { left: '2.5rem', right: 0 },\n      gap: 0,\n      omitEnd: true,\n      arrows: false,\n      drag: false,\n      easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n      snap: true,\n      classes: {\n        pagination: 'splide__pagination reviews-pagination',\n        page: 'splide__pagination__page reviews-page',\n      },\n      breakpoints: {\n        992: { fixedWidth: '17.438rem', padding: { left: '1.75rem' }, drag: 'free', snap: false },\n        480: { fixedWidth: '16.25rem', padding: { left: '1.375rem' }},\n      },\n    }).mount();\n\n    // Next slide on click\n    if (window.innerWidth > 992) {\n      reviewsSplide.on('click', function () {\n        reviewsSplide.go('+1');\n      });\n    }\n\n    // Animation in\n    gsap.from(e, {\n      scrollTrigger: {\n        trigger: e,\n        start: 'top bottom',\n        end: 'bottom bottom-=15%',\n        scrub: 1,\n        once: true,\n      },\n      x: '10%',\n      opacity: 0,\n      ease: 'linear',\n    });\n  }\n\n  // Facts slider\n  window.factsSlider = function(e) {\n    // Facts slider splide initialize\n    const factsSplide = new Splide(e, {\n      type: 'loop',\n      perPage: 1,\n      gap: 0,\n      arrows: false,\n      drag: false,\n      duration: 0.15,\n      easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n      classes: {\n        pagination: 'splide__pagination facts-pagination',\n        page: 'splide__pagination__page facts-page',\n      },\n      breakpoints: {\n        992: { gap: '1.75rem', drag: true },\n        480: { gap: '1.375rem' },\n      },\n    }).mount();\n    // Next on click\n    if (window.innerWidth > 992) {\n      factsSplide.on('click', function () {\n        factsSplide.go('+1');\n      });\n    }\n\n    // Click on external link\n    const externalLink = e.querySelectorAll('.external_link.is-cursor');\n    // Loop through each element and execute customCursorIn.reverse()\n    externalLink.forEach((link) => {\n      link.addEventListener('click', () => {\n        event.stopPropagation();\n      });\n    });\n\n    // Animations\n// Function to play video on the active slide\n    function playActiveSlideVideo(newIndex) {\n      var activeSlide = factsSplide.Components.Elements.slides[newIndex];\n      var activeVideo = activeSlide.querySelector('video');\n      if (activeVideo) {\n        activeVideo.play();\n      }\n    }\n\n// Function to pause and rewind videos on inactive slides\n    function pauseAndRewindInactiveVideos(newIndex) {\n      var slides = factsSplide.Components.Elements.slides;\n      slides.forEach(function (slide, index) {\n        var video = slide.querySelector('video');\n        if (video && index !== newIndex) {\n          video.pause();\n          video.currentTime = 0; // rewind the video\n        }\n      });\n    }\n// Function to animate elements on the active slide\n    function animateSlideElements(slide) {\n      gsap.fromTo(\n        [\n          slide.querySelector('.is-h4'),\n          slide.querySelector('.facts-slide_legend-wrapper'),\n          slide.querySelector('.facts-slide_diagram-wrapper'),\n          slide.querySelector('.facts-slide_source')\n        ],\n        {\n          x: '2rem',\n          opacity: 0\n        },\n        {\n          x: '0',\n          opacity: 1,\n          stagger: 0.2,\n          duration: 0.5,\n          easing: 'loader2'\n        }\n      );\n    }\n// Function to reset animation for the elements in the slide\n    function resetSlideAnimation(slide) {\n      gsap.set(\n        [\n          slide.querySelector('.is-h4'),\n          slide.querySelector('.facts-slide_legend-wrapper'),\n          slide.querySelector('.facts-slide_diagram-wrapper'),\n          slide.querySelector('.facts-slide_source')\n        ],\n        {\n          x: '2rem',\n          opacity: 0\n        }\n      );\n    }\n// Event listener for 'move' event\n    factsSplide.on('move', function (newIndex) {\n      playActiveSlideVideo(newIndex);\n      var activeSlide = factsSplide.Components.Elements.slides[newIndex];\n      animateSlideElements(activeSlide);\n    });\n// Event listener for 'moved' event\n    factsSplide.on('moved', function (oldIndex) {\n      pauseAndRewindInactiveVideos(oldIndex);\n      var previousSlide = factsSplide.Components.Elements.slides[oldIndex];\n      resetSlideAnimation(previousSlide);\n    });\n\n  }\n\n  // Team slider\n  window.teamSlider = function(e) {\n    // Randomize order of slides\n    const teamList = e.querySelector('.team_collection_list');\n    const teamItems = Array.from(teamList.children);\n    teamItems.sort(function () {\n      return 0.5 - Math.random();\n    });\n    teamItems.forEach(function (item) {\n      teamList.appendChild(item);\n    });\n\n    // Team slider splide initialize\n    new Splide(e, {\n      type: 'slide',\n      fixedWidth: '20%',\n      padding: { left: '2.5rem', right: 0 },\n      focus: 0,\n      gap: 0,\n      pagination: false,\n      omitEnd: true,\n      arrows: false,\n      drag: true,\n      easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n      snap: true,\n      classes: {\n        pagination: 'splide__pagination facts-pagination',\n        page: 'splide__pagination__page facts-page',\n      },\n      breakpoints: {\n        992: { fixedWidth: '40%', padding: { left: '1.75rem' }, drag: 'free', snap: false },\n        560: { fixedWidth: '75%', padding: { left: '1.375rem' }, drag: 'free', snap: false },\n      },\n    }).mount();\n\n    // Animation in\n   gsap.from(e, {\n      scrollTrigger: {\n        trigger: e,\n        start: 'top bottom',\n        end: 'bottom bottom',\n        scrub: 1,\n        once: true,\n      },\n      x: '10%',\n      opacity: 0,\n      ease: 'linear',\n    });\n  }\n\n// Partner slider\nwindow.partnerSlider = function (e) {\n  // Keep the same querySelector for consistency with teamSlider\n  const teamList = e.querySelector('.team_collection_list');\n\n  // Initialize Splide with drag restored\n  const splide = new Splide(e, {\n    type: 'slide',\n    fixedWidth: '31.5%',\n    padding: { left: '2.5rem', right: 0 },\n    focus: 0,\n    gap: 0,\n    pagination: false,\n    omitEnd: true,\n    arrows: false,\n    drag: true, // restored dragging\n    easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n    snap: true,\n    classes: {\n      pagination: 'splide__pagination facts-pagination partner-bullets',\n      page: 'splide__pagination__page facts-page',\n    },\n    breakpoints: {\n      992: { fixedWidth: '40%', padding: { left: '1.75rem' }, drag: 'free', snap: false },\n      560: { fixedWidth: '75%', padding: { left: '1.375rem' }, drag: 'free', snap: false },\n    },\n  });\n\n  splide.mount();\n\n  // Removed: click-to-next handler\n\n  // GSAP in-view animation\n  gsap.from(e, {\n    scrollTrigger: {\n      trigger: e,\n      start: 'top bottom',\n      end: 'bottom bottom',\n      scrub: 1,\n      once: true,\n    },\n    x: '10%',\n    opacity: 0,\n    ease: 'linear',\n  });\n};\n  // Element padding change on scroll\n  window.elementPaddingChange = function(e) {\n    gsap.to(e, {\n      scrollTrigger: {\n        trigger: e,\n        start: 'top bottom',\n        end: 'top top',\n        toggleActions: 'restart none none reverse',\n        scrub: 1,\n      },\n      paddingLeft: '0rem',\n      paddingRight: '0rem',\n      ease: 'linear',\n    });\n  }\n\n  // Section bg change\n  window.sectionBgChange = function(e) {\n    gsap.set(e, { backgroundColor: '#fff' });\n    gsap.set('#heroNavbarLottie path', { fill: 'rgb(21, 21, 21)' });\n      const sectionsBgChange = gsap.timeline({\n        duration: 0.15,\n        ease: 'loader2',\n        scrollTrigger: {\n          trigger: e,\n          start: 'top center',\n          end: 'bottom top',\n          toggleActions: 'play reverse play reverse',\n        },\n      });\n      sectionsBgChange.to(['#skills', '#portfolio'], {\n        backgroundColor: '#151515',\n      }, '<');\n    sectionsBgChange.to(\".info-bar_wrapper\", {\n      backgroundColor: '#2E2E2E',\n      color: \"#fff\"\n    }, '<');\n      // Change navbar element on bg animation\n      sectionsBgChange.to(\n        [\n          '.button_small',\n          '.button_small_icon',\n          '.navbar_brand_svg',\n          '#heroNavbarLottie path ',\n        ],\n        {\n          color: '#fff',\n          fill: 'rgb(254, 254, 254)',\n        },\n        '<'\n      );\n    if (window.innerWidth > 992) {\n      sectionsBgChange.to(\n          '.navbar_menu_link',\n        {\n          color: '#fff',\n          fill: 'rgb(254, 254, 254)',\n        },\n        '<'\n      );\n    }\n    }\n\n// Awwwards badge color change\nwindow.badgeColorChange = function(e) {\n  const badgeColorChange = gsap.timeline({\n    duration: 0.15,\n    ease: 'loader2',\n    scrollTrigger: {\n      trigger: e,\n      start: 'top center',\n      end: 'bottom center',\n      toggleActions: 'play reverse play reverse',\n    },\n  });\n  badgeColorChange.to(\".js-color-bg\", {\n    fill: '#2E2E2E',\n  }, '<');\n  badgeColorChange.to(\".js-color-text\", {\n    fill: '#fff',\n  }, '<');\n}\n\n  // Client logos animation\n  window.clientLogosAnimation = function(e) {\n    const logosStagger = 0.15;\n    const logoMask = e.querySelectorAll('[class*=\"item_mask\"]');\n    const logoImg = e.querySelectorAll('[class*=\"image\"]');\n    gsap.from(logoMask, {\n      scrollTrigger: {\n        trigger: logoMask,\n        start: 'top bottom-=25%',\n      },\n      width: '0%',\n      duration: 0.7,\n      ease: 'loader2',\n      stagger: logosStagger,\n    });\n    gsap.from(logoImg, {\n      scrollTrigger: {\n        trigger: logoMask,\n        start: 'top bottom-=25%',\n      },\n      opacity: 0,\n      delay: 0.4,\n      duration: 0.45,\n      ease: 'loader2',\n      stagger: logosStagger,\n    });\n  }\n\n  // Hero span video on hover\n  window.heroSpanVideoOnHover = function(e) {\n    window.customCursorText(e);\n    const heroSpanContentAnimation = gsap.timeline({ paused: true, ease: 'loader2' });\n    heroSpanContentAnimation.to('.hero-line-mask', { clipPath: 'none', duration: 0.05 }, '>');\n    heroSpanContentAnimation.to(e, { scale: 2, duration: 0.35 }, '>');\n      if (window.innerWidth > 992) {\n        e.addEventListener('mouseenter', () => {\n          heroSpanContentAnimation.timeScale(1).play();\n        });\n        e.addEventListener('mouseleave', () => {\n          heroSpanContentAnimation.timeScale(2).reverse();\n        });\n      }\n  }\n\n  // Reel modal\n  window.reelModal = function() {\n      const reelTrigger = document.querySelectorAll('[wideClick=\"playReel\"]');\n      const reelModal = document.querySelector('.reel-modal');\n      const reelModalPlayer = document.getElementById('fullReel');\n      const reelPlayback = 0;\n      const reelModalShow = gsap.timeline({ ease: 'loader2', paused: true });\n      reelModalShow.to(reelModal, { display: 'flex', opacity: 0, duration: 0 });\n      reelModalShow.to(reelModal, { opacity: 1, duration: 0.6 }, '>');\n      if (window.innerWidth > 992) {\n        reelTrigger.forEach((element) => {\n          element.addEventListener('click', () => {\n            lenis.stop();\n            reelModalShow.timeScale(1).play();\n            // Set the video source based on whether the player can handle WebM\n            if (reelPlayback === 0) {\n              if (reelModalPlayer.canPlayType('video/webm')) {\n                reelModalPlayer.src =\n                  'https://widelabco.sfo3.cdn.digitaloceanspaces.com/Widelab-reel.webm';\n              } else {\n                reelModalPlayer.src =\n                  'https://widelabco.sfo3.cdn.digitaloceanspaces.com/Widelab-reel.mp4';\n              }\n              // Load the video\n              reelModalPlayer.load();\n            } else {\n              return;\n            }\n\n            reelModalPlayer.play();\n          });\n        });\n        reelModal.addEventListener('click', () => {\n          reelModalShow.timeScale(4).reverse();\n          reelModalPlayer.pause();\n          lenis.start();\n        });\n        window.addEventListener('keydown', function (event) {\n          // The key code for the ESC key is 27\n          if (event.keyCode === 27) {\n            reelModalShow.timeScale(4).reverse();\n            reelModalPlayer.pause();\n            lenis.start();\n          }\n        });\n      } else {\n        reelTrigger.forEach((element) => {\n          element.addEventListener('click', () => {\n            // Set the video source based on whether the player can handle WebM\n            if (reelModalPlayer.canPlayType('video/webm')) {\n              reelModalPlayer.src = 'https://widelabco.sfo3.cdn.digitaloceanspaces.com/Widelab-reel.webm';\n            } else {\n              reelModalPlayer.src = 'https://widelabco.sfo3.cdn.digitaloceanspaces.com/Widelab-reel.mp4';\n            }\n\n            // Load the video\n            reelModalPlayer.load();\n\n            // Add a listener to the 'canplaythrough' event\n            reelModalPlayer.addEventListener(\n              'canplaythrough',\n              () => {\n                // Once there's enough data loaded to play through, start playback\n                reelModalPlayer.play();\n              },\n              { once: true }\n            ); // Ensure this event only fires once per click\n          });\n        });\n        reelModal.addEventListener('click', () => {\n          reelModalPlayer.pause();\n        });\n      }\n  }\n\n  // Founders tooltip\n  window.foundersTooltip = function(e) {\n    const line = e.querySelector('.line');\n    const arrow = e.querySelector('.arrow');\n    const foundersHover = gsap.timeline({ paused: true, ease: 'loader2' });\n    foundersHover.from(e, {\n      x: '5%',\n      opacity: 0,\n      duration: 0.4,\n    });\n    foundersHover.from(\n      line,\n      {\n        drawSVG: '0% 0%',\n        duration: 0.2,\n      },\n      '>-0.2'\n    );\n    foundersHover.from(arrow, {\n      drawSVG: '0% 0%',\n      duration: 0.15,\n    }),\n      '>';\n      if (window.innerWidth > 992) {\n        e.addEventListener('mouseenter', () => {\n          foundersHover.timeScale(1).play();\n        });\n        e.addEventListener('mouseleave', () => {\n          foundersHover.timeScale(3).reverse();\n        });\n      }\n  }\n\n  // Clients map actions\n  window.clientsMapActions = function(e) {\n    // Map animation\n    const mapAnimation = gsap.timeline({\n      scrollTrigger: {\n        trigger: '.reviews_map_base',\n        start: 'bottom-=160px bottom',\n      },\n    });\n    mapAnimation.from('.map-point', {\n      duration: 1,\n      opacity: 0,\n      stagger: 0.1,\n      ease: 'loader2',\n    });\n    mapAnimation.from(\n      '.map-pin_wrapper',\n      {\n        duration: 1,\n        opacity: 0,\n        stagger: 0.1,\n        ease: 'loader2',\n      },\n      '0.3'\n    );\n\n// Map pins animation on hover\n    const allMapPins = document.querySelectorAll('.map-pin_wrapper');\n    allMapPins.forEach(function (element) {\n      element.addEventListener('mouseenter', function () {\n        const mapPin = this.getAttribute('w-map-pin');\n        const oldPin = document.querySelectorAll('.map_info-collection-item');\n        const infoElements = document.querySelectorAll(\n          \".map_info-collection-item[w-map-info='\" + mapPin + \"']\"\n        );\n        const infoElementsAppear = gsap.timeline({});\n        infoElementsAppear.to(oldPin, {\n          opacity: 0,\n          ease: 'loader2',\n          duration: 0.1,\n        });\n        infoElementsAppear.to(oldPin, {\n          display: 'none',\n          duration: 0.01,\n        });\n        infoElementsAppear.to(infoElements, {\n          display: 'block',\n          duration: 0.01,\n        });\n        infoElementsAppear.to(infoElements, {\n          opacity: 1,\n          ease: 'loader2',\n          duration: 0.2,\n        });\n      });\n    });\n// Map boxes link special code\n      const elements = document.querySelectorAll('.map_info-wrapper');\n      for (let i = 0; i < elements.length; i++) {\n        const href = elements[i].getAttribute('href');\n        if (href && href.length > 3) {\n          elements[i].style.cursor = 'pointer';\n        }\n      }\n  }\n\n\n\n  // Stats section headline animation\n  window.statsHeadlineAnimation = function() {\n    const statsHeadlineAnimation = gsap.timeline({\n        scrollTrigger: {\n          trigger: '#statsKnow',\n          start: 'center center',\n          toggleActions: 'restart none none reverse',\n          end: '+=500',\n        },\n        pause: 'paused',\n        ease: 'defaultEase',\n      }),\n      homeStatsHeading = new SplitText('#statsDone', {\n        type: 'lines',\n        linesClass: 'stats-line',\n      }),\n      homeStatsHeadingMask = new SplitText('#statsDone', {\n        type: 'lines',\n        linesClass: 'stats-line-mask',\n      });\n    statsHeadlineAnimation.to(\n      '#statsKnow',\n      {\n        duration: 0.5,\n        opacity: 0,\n        display: 'none',\n      },\n      '>'\n    );\n    statsHeadlineAnimation.from('.stats-line', {\n      duration: 0.5,\n      opacity: 0,\n      y: '100%',\n      stagger: 0.25,\n    });\n  }\n\n// Single entry you call from x-init\nwindow.clientFilters = function () {\n  // Prevent double initialization if Alpine re-mounts\n  if (window.__clientFiltersInitialized) return;\n  window.__clientFiltersInitialized = true;\n\n  // --- Config ---\n  const FIELDS = [\"industry\", \"country\", \"services\"];\n  const SEL = {\n    dropdown: '[fs-cmsfilter-element=\"dropdown\"]',\n    dropdownHolder: \".dropdown-holder\",\n    dropdownTitle: '[filters-clients_dropdown-field=\"tag-name-title\"], .filters-clients_dropdown-field',\n    tagNumber: '[fs-cmsfilter-element=\"tag-number\"]',\n    dynItem: \".w-dyn-item\",\n    checkboxWrap: \".w-checkbox\",\n    checkboxInput: 'input[type=\"checkbox\"]',\n    webflowChecked: \"w--redirected-checked\",\n    fsActive: \"fs-cmsfilter_active\",\n    listContainer: \".collection-list\",\n    count: \".count\",\n    crossIcon: \".cross-icon\",\n    clearButton: \".clear-button\",\n    activeDropdown: \"active-dropdown\",\n  };\n\n  // --- Utils ---\n  function $(s, ctx = document) { return ctx.querySelector(s); }\n  function $all(s, ctx = document) { return Array.from(ctx.querySelectorAll(s)); }\n  function debounce(fn, ms) { let t; return (...a)=>{clearTimeout(t); t=setTimeout(()=>fn(...a), ms);} }\n  function textClean(el){ return (el?.textContent || \"\").trim(); }\n\n  // Wait until Finsweet cmsfilter is ready (query params applied, classes toggled)\n  function waitForCmsFilter() {\n    return new Promise((resolve) => {\n      const w = window;\n      w.fsAttributes = w.fsAttributes || [];\n      // already initialized?\n      try {\n        const exists = (w.fsAttributes.instances || []).some(i => i.name === \"cmsfilter\");\n        if (exists) return resolve();\n      } catch(e){}\n      w.fsAttributes.push([\"cmsfilter\", function(){ resolve(); }]);\n    });\n  }\n\n  // Remember original texts for labels and toggles\n  function hydrateOriginalTexts() {\n    FIELDS.forEach((field) => {\n      $all(`span[fs-cmsfilter-field=\"${field}\"]`).forEach((span) => {\n        if (!span.dataset.originalText) {\n          span.dataset.originalText = textClean(span);\n        }\n      });\n    });\n    $all(SEL.dropdownHolder).forEach((holder) => {\n      const toggle = $(SEL.dropdownTitle, holder);\n      if (toggle && !toggle.dataset.defaultText) {\n        toggle.dataset.defaultText = textClean(toggle);\n      }\n    });\n  }\n\n  // Count matching results per value and sort UI items by count\n  function updateCheckboxCounts(excludeField = null) {\n    FIELDS.forEach((field) => {\n      if (field === excludeField) return;\n\n      const spans = $all(`span[fs-cmsfilter-field=\"${field}\"]`);\n      spans.forEach((span) => {\n        const originalText = span.dataset.originalText || textClean(span);\n        span.dataset.originalText = originalText;\n\n        // Count visible matches in results\n        let matched = 0;\n        $all(`div[fs-cmsfilter-field=\"${field}\"]`).forEach((div) => {\n          if (textClean(div) === originalText) matched++;\n        });\n\n        // Ensure \"(n)\" bubble\n        let countSpan = span.nextElementSibling;\n        if (!countSpan || !countSpan.classList.contains(\"count\")) {\n          countSpan = document.createElement(\"span\");\n          countSpan.className = \"count\";\n          span.insertAdjacentElement(\"afterend\", countSpan);\n        }\n        countSpan.textContent = `(${matched})`;\n\n        // Toggle empty-category on dyn item\n        const dyn = span.closest(SEL.dynItem);\n        if (dyn) dyn.classList.toggle(\"empty-category\", matched === 0);\n      });\n\n      // Sort items in this field's collection-list by count desc\n      const anySpan = document.querySelector(`span[fs-cmsfilter-field=\"${field}\"]`);\n      if (anySpan) {\n        const list = anySpan.closest(SEL.listContainer);\n        if (list) {\n          const items = Array.from(list.children);\n          items.sort((a, b) => {\n            const ca = parseInt((a.querySelector(SEL.count)?.textContent || \"\").replace(/[()]/g, \"\")) || 0;\n            const cb = parseInt((b.querySelector(SEL.count)?.textContent || \"\").replace(/[()]/g, \"\")) || 0;\n            return cb - ca;\n          });\n          items.forEach((it) => list.appendChild(it));\n        }\n      }\n    });\n  }\n\n  // Collect selected label names within a dropdown holder\n  function getSelectedNames(holder) {\n    const labels = $all(`${SEL.dynItem} ${SEL.checkboxWrap}, ${SEL.checkboxWrap}`, holder);\n    return labels\n      .filter((label) => {\n        if (label.classList.contains(SEL.fsActive)) return true; // Finsweet\n        const wbox = label.querySelector(\".w-checkbox-input\");\n        if (wbox && wbox.classList.contains(SEL.webflowChecked)) return true; // Webflow styled\n        const input = label.querySelector(SEL.checkboxInput);\n        return !!(input && input.checked); // Native\n      })\n      .map((label) => {\n        const span = label.querySelector('[fs-cmsfilter-field]');\n        return (span && (span.getAttribute('data-original-text') || textClean(span))) || \"\";\n      })\n      .filter(Boolean);\n  }\n\n  // Update dropdown button label (first selected + +N), class states and numeric tag\n  function updateDropdownTitle(holder) {\n    const toggle = $(SEL.dropdownTitle, holder);\n    if (!toggle) return;\n\n    const defaults = toggle.dataset.defaultText || textClean(toggle);\n    const names = getSelectedNames(holder);\n\n    // Persist \"first selected\" per dropdown (dataset)\n    if (!holder.dataset.firstSelected) {\n      holder.dataset.firstSelected = names[0] || \"\";\n    } else if (names.length && !names.includes(holder.dataset.firstSelected)) {\n      holder.dataset.firstSelected = names[0];\n    } else if (!names.length) {\n      holder.dataset.firstSelected = \"\";\n    }\n\n    let display = defaults;\n    if (names.length === 1) {\n      display = names[0];\n    } else if (names.length > 1) {\n      display = `${holder.dataset.firstSelected || names[0]} +${names.length - 1}`;\n    }\n    toggle.textContent = display;\n\n    holder.classList.toggle(SEL.activeDropdown, names.length > 0);\n    toggle.classList.toggle(SEL.activeDropdown, names.length > 0);\n\n    const tagNum = $(SEL.tagNumber, holder);\n    if (tagNum) {\n      tagNum.textContent = names.length > 1 ? `+${names.length - 1}` : \"\";\n    }\n  }\n\n  function updateAllDropdownTitles() {\n    $all(SEL.dropdownHolder).forEach(updateDropdownTitle);\n  }\n\n  function toggleClearButton() {\n    const anyActive = !!$(`.${SEL.activeDropdown}`);\n    const btn = $(SEL.clearButton);\n    if (btn) btn.style.display = anyActive ? \"block\" : \"none\";\n  }\n\n  // Unified UI refresh\n  const refreshUI = debounce(function (excludeField = null) {\n    updateCheckboxCounts(excludeField);\n    updateAllDropdownTitles();\n    toggleClearButton();\n  }, 60);\n\n  // --- Event wiring (delegated & once) ---\n  function bindEventsOnce() {\n    // Clicks: checkbox labels, dropdown toggles, cross icons, clear button\n    document.addEventListener(\"click\", (e) => {\n      const label = e.target.closest(SEL.checkboxWrap);\n      if (label) {\n        // Let Finsweet/Webflow toggle classes first\n        setTimeout(() => {\n          const span = label.querySelector('[fs-cmsfilter-field]');\n          const field = span?.getAttribute('fs-cmsfilter-field') || null;\n          refreshUI(field);\n        }, 0);\n        return;\n      }\n\n      const toggle = e.target.closest(SEL.dropdownTitle);\n      if (toggle) {\n        // After opening/closing or instant selections\n        setTimeout(() => refreshUI(null), 120);\n        return;\n      }\n\n      const cross = e.target.closest(SEL.crossIcon);\n      if (cross) {\n        setTimeout(() => refreshUI(null), 80);\n        return;\n      }\n\n      const clear = e.target.closest(SEL.clearButton);\n      if (clear) {\n        setTimeout(() => refreshUI(null), 120);\n        return;\n      }\n    });\n\n    // Any checkbox state change (keyboard/tap)\n    document.addEventListener(\"change\", (e) => {\n      if (e.target && e.target.matches(SEL.checkboxInput)) {\n        const span = e.target.closest('label')?.querySelector('[fs-cmsfilter-field]') ||\n          e.target.closest(SEL.checkboxWrap)?.querySelector('[fs-cmsfilter-field]');\n        const field = span?.getAttribute('fs-cmsfilter-field') || null;\n        const holder = e.target.closest(SEL.dropdownHolder);\n        if (holder) updateDropdownTitle(holder);\n        refreshUI(field);\n      }\n    });\n\n    // Observe class mutations that might come from Finsweet\n    const mo = new MutationObserver((muts) => {\n      // If any class changed, softly refresh\n      if (muts.some(m => m.type === \"attributes\" && m.attributeName === \"class\")) {\n        refreshUI(null);\n      }\n    });\n    mo.observe(document.body, { subtree: true, attributes: true, attributeFilter: [\"class\"] });\n  }\n\n  // --- Boot ---\n  waitForCmsFilter().then(() => {\n    // Allow Finsweet to finish applying query param checks/classes\n    setTimeout(() => {\n      hydrateOriginalTexts();\n      bindEventsOnce();\n      refreshUI(null);\n    }, 120);\n  });\n};\n// Filtering logic on Client's page\nwindow.formatCounter = function() {\n  function format_number(x) {\n    let parts = x.toFixed(1).split(\".\");\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\n    let formattedNumber = parts.join(\".\");\n    let digits = formattedNumber.split('').map(char => {\n      if (char === '.') {\n        return char;\n      } else {\n        return `<span class=\"single-number\">${char}</span>`;\n      }\n    }).join('');\n    return digits;\n  }\n\n  function easeOutQuad(t) {\n    return t * (2 - t);\n  }\n\n  function animateValue(start, end, duration) {\n    const counter = document.getElementById('counter');\n    let startTimestamp = null;\n    const step = (timestamp) => {\n      if (!startTimestamp) startTimestamp = timestamp;\n      const progress = Math.min((timestamp - startTimestamp) / duration, 1);\n      const easedProgress = easeOutQuad(progress);\n      const currentValue = start + (end - start) * easedProgress;\n      counter.innerHTML = format_number(currentValue);\n      if (progress < 1) {\n        window.requestAnimationFrame(step);\n      }\n    };\n    window.requestAnimationFrame(step);\n  }\n\n  animateValue(88.0, 110.85, 3500);\n}\n\n// Filtering logic on Client's page - scroll trigger version\nwindow.formatCounterOnScroll = function() {\n  function format_number(x) {\n    let parts = x.toFixed(1).split(\".\");\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\n    let formattedNumber = parts.join(\".\");\n    let digits = formattedNumber.split('').map(char => {\n      if (char === '.') {\n        return char;\n      } else {\n        return `<span class=\"single-number\">${char}</span>`;\n      }\n    }).join('');\n    return digits;\n  }\n\n  function easeOutQuad(t) {\n    return t * (2 - t);\n  }\n\n  function animateValue(start, end, duration) {\n    const counter = document.getElementById('counter');\n    let startTimestamp = null;\n    const step = (timestamp) => {\n      if (!startTimestamp) startTimestamp = timestamp;\n      const progress = Math.min((timestamp - startTimestamp) / duration, 1);\n      const easedProgress = easeOutQuad(progress);\n      const currentValue = start + (end - start) * easedProgress;\n      counter.innerHTML = format_number(currentValue);\n      if (progress < 1) {\n        window.requestAnimationFrame(step);\n      }\n    };\n    window.requestAnimationFrame(step);\n  }\n\n  // Scroll trigger\n  const counterEl = document.getElementById('counter');\n  if (!counterEl) return;\n\n  const observer = new IntersectionObserver((entries, observer) => {\n    entries.forEach(entry => {\n      if (entry.isIntersecting) {\n        animateValue(88.0, 110.85, 3500);\n        observer.unobserve(entry.target);\n      }\n    });\n  }, { threshold: 0.5 });\n\n  observer.observe(counterEl);\n};\n\n// GSAP Counter Up Animation onc Client's Page\nwindow.counterUpAnimation = function() {\n\n\n  function format_number(x) {\n    let parts = x.toFixed(1).split(\".\");\n    parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \".\");\n    let formattedNumber = parts.join(\".\");\n    let digits = formattedNumber.split('').map(char => {\n      if (char === '.') {\n        return char;\n      } else {\n        return `<span class=\"single-number\">${char}</span>`;\n      }\n    }).join('');\n    return digits;\n  }\n\n  function easeOutQuad(t) {\n    return t * (2 - t);\n  }\n\n  function animateValue(start, end, duration) {\n    const counter = document.getElementById('counter');\n    let startTimestamp = null;\n    const step = (timestamp) => {\n      if (!startTimestamp) startTimestamp = timestamp;\n      const progress = Math.min((timestamp - startTimestamp) / duration, 1);\n      const easedProgress = easeOutQuad(progress);\n      const currentValue = start + (end - start) * easedProgress;\n      counter.innerHTML = format_number(currentValue);\n      if (progress < 1) {\n        window.requestAnimationFrame(step);\n      }\n    };\n    window.requestAnimationFrame(step);\n  }\n\n  animateValue(88.8, 110.85, 3500);\n\n\n  const counters = document.querySelectorAll('#counter');\n\n  counters.forEach(counter => {\n    const finalValue = parseFloat(counter.textContent.replace(/,/g, '')); // Handle comma-separated numbers\n\n    gsap.fromTo(counter,\n      { innerHTML: 0 },\n      {\n        innerHTML: finalValue,\n        duration: 2,\n        ease: 'power1.inOut',\n        snap: { innerHTML: 1 },\n        onUpdate: function() {\n\n          counter.textContent = this.targets()[0].innerHTML.toLocaleString();\n        }\n      }\n    );\n  });\n}\n\n// Slider on Client's page\nwindow.heroSliders = function(e) {\n  console.log(\"Initializing Splide on element:\", e);\n\n  const config = {\n    type: 'loop',\n    perPage: 1,\n    gap: 0,\n    arrows: false,\n    drag: false,\n    duration: 0.15,\n    easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n    classes: {\n      pagination: 'splide__pagination hero-pagination',\n      page: 'splide__pagination__page hero-page',\n    },\n    breakpoints: {\n      992: { drag: true },\n      480: {},\n    },\n  };\n  const slider = new Splide(e, config).mount();\n  console.log(\"Splide instance:\", slider);\n\n  const descriptions = e.querySelectorAll('.slider-description');\n\n  descriptions.forEach(desc => {\n    if (!desc.closest('.splide__slide').classList.contains('is-active')) {\n      gsap.set(desc, { opacity: 0 });\n    }\n  });\n\n  if (window.innerWidth > 992) {\n    slider.on('click', function () {\n      slider.go('+1');\n    });\n  }\n\n  slider.on('move', function() {\n    gsap.set(descriptions, { opacity: 0 });\n  });\n\n  slider.on('active', function (slide) {\n    gsap.to(slide.slide.querySelectorAll('.slider-description'), { opacity: 1, duration: 0.15, ease: 'linear' });\n  });\n\n  gsap.from(e, {\n    scrollTrigger: {\n      trigger: e,\n      start: 'top bottom',\n      end: 'bottom bottom+=15%',\n      scrub: 1,\n      once: true,\n    },\n    x: '10%',\n    opacity: 0,\n    ease: 'linear',\n  });\n}\n\n\n// Splide without GSAP; pagination inserted as first child INSIDE .splide\nwindow.awwwardsSliders = function (el) {\n  if (el.dataset.splideInitialized === '1') return;\n\n  // 1) Find or create Splide root\n  let root = el.classList?.contains('splide') ? el : el.closest?.('.splide');\n  const track = el.querySelector?.('.splide__track') || el.closest?.('.splide__track');\n\n  if (!root && track) {\n    root = document.createElement('div');\n    root.className = 'splide testimonial';\n    track.parentNode.insertBefore(root, track);\n    root.appendChild(track);\n  }\n\n  // 2) Validate structure\n  if (!root || !root.querySelector('.splide__track') || !root.querySelector('.splide__list')) {\n    console.warn('[awwwardsSliders] Missing required Splide structure.');\n    return;\n  }\n\n  // 3) Splide config\n  const config = {\n    type: 'loop',\n    perPage: 1,\n    perMove: 1,\n    gap: '0px',\n    arrows: false,\n    pagination: true,\n    drag: false,\n    speed: 300,\n    easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n    classes: {\n      pagination: 'splide__pagination awwwards-pagination',\n      page: 'splide__pagination__page awwwards-page',\n    },\n    breakpoints: {\n      992: { drag: true },\n    },\n  };\n\n  const splide = new Splide(root, config).mount();\n\n  // 4) Move pagination INSIDE .splide as FIRST child\n  splide.on('pagination:mounted', (data) => {\n    const list = data.list;\n    if (list && root.firstChild) {\n      root.insertBefore(list, root.firstChild);\n    }\n  });\n\n  // Fallback if pagination already exists\n  queueMicrotask(() => {\n    const list = root.querySelector('.splide__pagination');\n    const track = root.querySelector('.splide__track');\n    if (list && track && list.nextSibling !== track) {\n      root.insertBefore(list, track);\n    }\n  });\n\n  // 5) Click-to-next on desktop\n  if (window.innerWidth > 992) {\n    root.addEventListener('click', () => splide.go('+1'));\n  }\n\n  el.dataset.splideInitialized = '1';\n};\n\n// Sliders on Services page\nwindow.servicesSliders = function(e) {\n  const config = {\n    type: 'loop',\n    perPage: 1,\n    gap: 0,\n    arrows: false,\n    drag: false,\n    duration: 0.15,\n    easing: 'cubic-bezier(0.83, 0, 0.17, 1)',\n    classes: {\n      pagination: 'splide__pagination services-pagination',\n      page: 'splide__pagination__page services-page',\n    },\n    breakpoints: {\n      992: { drag: true, fixedWidth: '90%' },\n      480: {},\n    },\n  };\n  const slider = new Splide(e, config).mount();\n  if (window.innerWidth > 992) {\n    slider.on('click', function () {\n      slider.go('+1');\n    });\n  }\n  gsap.from(e, {\n    scrollTrigger: {\n      trigger: e,\n      start: 'top bottom',\n      end: 'bottom bottom+=15%',\n      scrub: 1,\n      once: true,\n    },\n    x: '10%',\n    opacity: 0,\n    ease: 'linear',\n  });\n}\n\n// Play-once timeline: children fade-in from bottom with stagger\nwindow.initBentoRevealTimeline = function (container) {\n  // Respect reduced motion\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n    container.querySelectorAll(':scope > *').forEach(el => {\n      el.style.opacity = 1;\n      el.style.transform = 'none';\n    });\n    return;\n  }\n\n  const items = Array.from(container.children); // direct children only\n\n  // Set initial state\n  gsap.set(items, { opacity: 0, y: 24 });\n\n  // Build timeline that plays when scrolled into view\n  const tl = gsap.timeline({\n    scrollTrigger: {\n      trigger: container,\n      start: 'top 80%',   // when top of container hits 80% of viewport\n      end: 'bottom 40%',  // not critical for play-only, but nice bounds\n      toggleActions: 'play none none none',\n      once: true\n    }\n  });\n\n  tl.to(items, {\n    opacity: 1,\n    y: 0,\n    duration: 0.6,\n    ease: 'power2.out',\n    stagger: 0.12\n  });\n};\n\n// Scrubbed timeline: progress tied to scroll progress\nwindow.initBentoRevealScrub = function (container) {\n  // Respect reduced motion\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n    container.querySelectorAll(':scope > *').forEach(el => {\n      el.style.opacity = 1;\n      el.style.transform = 'none';\n    });\n    return;\n  }\n\n  const items = Array.from(container.children); // direct children only\n\n  // Important: define from state in timeline for scrub to interpolate smoothly\n  const tl = gsap.timeline({\n    scrollTrigger: {\n      trigger: container,\n      start: 'top 90%',     // start easing in slightly later\n      end: 'bottom 65%',    // full reveal by near the end of container\n      scrub: 0.5,           // smoothing; use true for no smoothing\n        markers: false,     // uncomment for debugging\n    }\n  });\n\n  tl.fromTo(items,\n    { opacity: 0, y: 28 },\n    {\n      opacity: 1,\n      y: 0,\n      ease: 'power2.out',\n      // Duration is ignored by scrub; timeline length maps to scroll distance.\n      // Stagger distributes the items across the timeline for a nice cascade.\n      stagger: { each: 0.12 }\n    }\n  );\n};\n\nwindow.initPartnerVideos = function (container) {\n  const items = Array.from(container.querySelectorAll('.partner_item'));\n  const vids = items.map(i => i.querySelector('video')).filter(Boolean);\n\n  // Helper: pause all other videos\n  const pauseAll = (except) => {\n    vids.forEach(v => {\n      if (v !== except) {\n        v.pause();\n        v.muted = true;\n        const parent = v.closest('.partner_item');\n        if (parent) toggleIcons(parent, false);\n      }\n    });\n  };\n\n  // Helper: toggle play/pause icons\n  function toggleIcons(item, isPlaying) {\n    const playIcon = item.querySelector('.is-play');\n    const pauseIcon = item.querySelector('.is-pause');\n    if (isPlaying) {\n      if (playIcon) playIcon.style.display = 'none';\n      if (pauseIcon) pauseIcon.style.display = 'block';\n    } else {\n      if (playIcon) playIcon.style.display = 'block';\n      if (pauseIcon) pauseIcon.style.display = 'none';\n    }\n  }\n\n  items.forEach((item) => {\n    const v = item.querySelector('video');\n    if (!v) return;\n\n    v.controls = false;\n    v.loop = false;\n    v.muted = true;\n    v.setAttribute('playsinline', '');\n    v.playsInline = true;\n\n    // Default state on init (show play icon)\n    toggleIcons(item, false);\n\n    // Handle click (play/pause toggle)\n    item.addEventListener('click', () => {\n      if (v.paused) {\n        pauseAll(v);\n        v.muted = false;\n        v.play();\n        toggleIcons(item, true);\n      } else {\n        v.pause();\n        toggleIcons(item, false);\n      }\n    });\n\n    // Handle pause and ended (ensure icons reset)\n    v.addEventListener('pause', () => toggleIcons(item, false));\n    v.addEventListener('ended', () => toggleIcons(item, false));\n    v.addEventListener('play', () => toggleIcons(item, true));\n  });\n\n  // Pause videos when out of viewport\n  const rootEl =\n    document.querySelector('[data-scroll-root]') ||\n    document.querySelector('[data-smooth-scroll-root]') ||\n    null;\n\n  const io = new IntersectionObserver(\n    (entries) => {\n      entries.forEach(({ isIntersecting, target }) => {\n        const v = target.querySelector('video');\n        if (!v) return;\n        if (!isIntersecting) {\n          v.pause();\n          toggleIcons(target, false);\n        }\n      });\n    },\n    { root: rootEl, threshold: 0.25 }\n  );\n\n  items.forEach((item) => io.observe(item));\n};\n\n\n  // Case study - What's next interaction\n  window.whatsNext = function() {\n    const caseItem = document.querySelectorAll('.whats-next_links_item.is-case');\n    const allCases = document.querySelector('.whats-next_links_item.is-all');\n    caseItem.forEach((item) => {\n      const imageMask = item.querySelector('.whats-next_links_item_image_mask');\n      const imageWrapper = item.querySelector('.whats-next_links_item_image-wrapper');\n      const whatsNextHover = gsap.timeline({ paused: true, ease: 'loader2' });\n      whatsNextHover.to(imageWrapper, { opacity: 0.8, duration: 0.15 });\n      whatsNextHover.to(imageMask, { width: '0%', duration: 0.3 }, '>-0.');\n      item.addEventListener('mouseenter', () => {\n        whatsNextHover.timeScale(1).play();\n        caseItem.forEach((i) => {\n          if (i !== event.target) {\n            gsap.to(i, { color: '#7A7A7A', duration: 0.2, ease: 'loader2' });\n          }\n        });\n      });\n      item.addEventListener('mouseleave', () => {\n        whatsNextHover.timeScale(3).reverse();\n        caseItem.forEach((i) => {\n          if (i !== event.target) {\n            gsap.to(i, { color: '#fff', duration: 0.1, ease: 'loader2' });\n          }\n        });\n      });\n    });\n    allCases.addEventListener('mouseenter', () => {\n      gsap.to(allCases, { color: '#fff', duration: 0.2, ease: 'loader2' });\n      caseItem.forEach((item) => {\n        gsap.to(item, { color: '#7A7A7A', duration: 0.2, ease: 'loader2' });\n      });\n    });\n    allCases.addEventListener('mouseleave', () => {\n      gsap.to(allCases, { color: '#7A7A7A', duration: 0.2, ease: 'loader2' });\n      caseItem.forEach((item) => {\n        gsap.to(item, { color: '#fff', duration: 0.2, ease: 'loader2' });\n      });\n    });\n\n// Remove responsive image feature from CS pages\n    for (var i = 0; i < document.getElementsByTagName('img').length; i++) {\n      document.getElementsByTagName('img')[i].srcset = '';\n    }\n    for (var i = 0; i < document.getElementsByTagName('img').length; i++) {\n      document.getElementsByTagName('img')[i].sizes = '';\n    }\n  }\n\n  // Case study - images mask animation\n  window.csMaskAnimation = function() {\n    const csImageMasks = document.querySelectorAll('.portfolio_item_image-mask');\n    csImageMasks.forEach((mask, index) => {\n      if (index === 0) {\n        return;\n      }\n      const maskAnimation = gsap.from(mask, {\n        width: '100%',\n        duration: 0.7,\n        ease: 'loader2',\n        paused: true,\n      });\n      ScrollTrigger.create({\n        animation: maskAnimation,\n        trigger: mask,\n        start: 'top 80%',\n        onEnter: () => maskAnimation.play(),\n      });\n    });\n  }\n\n  // Update the scroll trigger on page load\nwindow.updateScrollTrigger = function() {\n  window.onload = function() {\n    ScrollTrigger.update();\n  };\n}\n\n  // Blog post main image mask animation\n  window.blogPostMaskAnimation = function(e) {\n    const blogHero = document.querySelector('#heroSection');\n    const blogMaskAnimation = gsap.from('.post_main-mask-ract', {\n      left: '0%',\n      ease: 'loader2',\n    });\n    ScrollTrigger.create({\n      animation: blogMaskAnimation,\n      trigger: blogHero,\n      start: 'top -5%',\n      end: 'bottom 50%',\n      scrub: 0.5,\n    });\n  }\n\n  // Custom checkboxes\nwindow.changeCheckboxLabelColor = function() {\n  let checkboxInputs = document.querySelectorAll('.w-checkbox-input');\n\n  let callback = function(mutationsList, observer) {\n    for(let mutation of mutationsList) {\n      if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n        let isChecked = mutation.target.classList.contains('w--redirected-checked');\n        let siblingLabel = mutation.target.parentElement.querySelector('.form-checkbox_label');\n\n        if (isChecked && siblingLabel && !siblingLabel.classList.contains('is-active')) {\n          siblingLabel.classList.add('is-active');\n        } else if (!isChecked && siblingLabel && siblingLabel.classList.contains('is-active')) {\n          siblingLabel.classList.remove('is-active');\n        }\n      }\n    }\n  };\n  checkboxInputs.forEach(function(checkboxInput) {\n    let config = { attributes: true, attributeFilter: ['class'] };\n    let observer = new MutationObserver(callback);\n    observer.observe(checkboxInput, config);\n  });\n}\n\n  // Contact modal open animation\nwindow.openContactModal = function() {\n  contactFormOpen.play();\n  document.body.classList.add('is-scroll-off');\n  lenis.stop();\n}\n\n// Contact modal close animation\nwindow.closeContactModal = function() {\n  contactFormOpen.timeScale(1).reverse();\n  document.body.classList.remove('is-scroll-off');\n  lenis.start();\n}\n\n// Close contact modal on ESC click\nwindow.closeContactModalOnEsc = function(e) {\n  document.addEventListener('keydown', function(event) {\n    if (event.key === \"Escape\") {\n      window.closeContactModal();\n    }\n  });\n}\n\n// Form animation\n// Hero animation on load\nwindow.successMsgAnimation = function(e) {\n  const successMsgAnim = gsap.timeline({}),\n\n    homeHeroHeading = new SplitText('#successHoooray, #successHeadiline', {\n      type: 'lines',\n      linesClass: 'hero-line',\n    }),\n    homeHeroHeadingMask = new SplitText('#successHoooray, #successHeadiline', {\n      type: 'lines',\n      linesClass: 'hero-line-mask',\n    });\n  successMsgAnim.from(\n    '.hero-line',\n    {\n      duration: 1.2,\n      y: '100%',\n      stagger: 0.2,\n      ease: 'loader2',\n    }\n  );\n    successMsgAnim.to(\n      e,\n      {\n        width: '0%',\n        duration: 0.6,\n        ease: 'loader2',\n      },\n      '>-0.5'\n    );\n  successMsgAnim.from(\n    '#successParagraph',\n    {\n      opacity: 0,\n      duration: 0.3,\n      ease: 'loader2',\n    },\n    '>-0.4'\n  );\n}\n\n// Form animation on submit\nwindow.formSubmitAnimation = function(e) {\n  function observeDisplayChanges() {\n    const targetElement = document.querySelector('.contact-modal_form-success');\n    const observerConfig = {\n      attributes: true,\n      attributeFilter: ['style'],\n    };\n    const observer = new MutationObserver(function(mutationsList, observer) {\n      mutationsList.forEach(function(mutation) {\n        if (mutation.target.style.display === 'block') {\n          successMsgAnimation(e);\n        }\n      });\n    });\n    observer.observe(targetElement, observerConfig);\n  }\n  observeDisplayChanges();\n}\n\n// Contact button hide on page bottom\nwindow.contactUsHide = function(e) {\n  gsap.to(e, ({\n    autoAlpha: 0,\n    duration: 0.15,\n    ease: 'loader2',\n    scrollTrigger: {\n      trigger: '#bottomWrapperOverlay',\n      start: 'top center',\n      toggleActions: 'play none none reverse',\n    },\n  }));\n}\n\n// Refresh Gsap scrollTriggers\nwindow.scrollTriggerRefresh = function() {\n  function refreshScrollTrigger() {\n    ScrollTrigger.refresh();\n  }\n  const observer = new MutationObserver(refreshScrollTrigger);\n  const targetNode = document.querySelector('.section.is-post-body');\n  const config = { attributes: true, childList: true, subtree: true };\n  observer.observe(targetNode, config);\n}\n\n// Info bar close animation\nwindow.closeInfoBar = function() {\n    const infoBarClose = gsap.timeline({});\n  infoBarClose.to('.info-bar', {\n    height: 0,\n    autoAlpha: 0,\n    duration: 0.3,\n    ease: 'loader2',\n  });\n  infoBarClose.to('.button_small.is-navbar', {\n    top: \"1.75rem\",\n    duration: 0.3,\n    ease: 'loader2',\n  }, \"<\");\n  infoBarClose.to('#heroSection', {\n    paddingTop: \"6.5rem\",\n    duration: 0.3,\n    ease: 'loader2',\n  }, \"<\");\n\n}\n\n\n\n\n  // !!!!!!!!! Keep this Alpine init at the end !!!!!!!!!\n  window.Webflow ||= [];\n  window.Webflow.push(() => {\n\n    console.log('The new code source is loaded!');\n    initAlpine();\n    lazyLoadVideos();\n    if (Webflow.env(\"editor\") === undefined) {\n      lenisScroll();\n      lenis.start();\n    } else {\n      console.log('Editor mode ON');\n      lenis.destroy();\n    }\n    customGsapEasing();\n\n    reloadOnBack();\n    revealFooter();\n    pageLoadAnimation();\n    pageTransitionAnimation();\n    customCursorOnClick();\n    contactFormOpenAnimation();\n    disableScrollMenu();\n    scrollToHashOnLoad();\n    initClientLogosAnimation();\n  });"]}