{"version":3,"sources":["jsdelivr-header.js","/gh/OZO-Verbindzorg/ozo-scripts@1.1.1/main.js"],"names":[],"mappings":"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","file":"/gh/OZO-Verbindzorg/ozo-scripts@1.1.1/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /gh/OZO-Verbindzorg/ozo-scripts@1.1.1/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// OZOverbindzorg — main.js\n// Alle maatwerkcode van ozoverbindzorg.nl in één bestand (vervangt Slater-project 9398).\n// - Elk onderdeel start alleen als zijn element op de pagina staat.\n// - Bibliotheken die maar op een paar pagina's nodig zijn (Swiper, Finsweet, Vimeo) laden alleen daar.\n// - GSAP, ScrollTrigger en Observer komen van Webflow zelf (Site settings → GSAP).\n(function () {\n  'use strict';\n\n  // ---------- Hulpfuncties ----------\n\n  const LIBS = {\n    lenis: 'https://cdn.jsdelivr.net/npm/lenis@1.1.1/dist/lenis.min.js',\n    swiper: 'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js',\n    fsAccordion: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-accordion@1/accordion.js',\n    fsNumbercount: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-numbercount@1/numbercount.js',\n    fsFormsubmit: 'https://cdn.jsdelivr.net/npm/@finsweet/attributes-formsubmit@1/formsubmit.js'\n  };\n\n  // Laadt een extern script één keer; geeft een Promise terug\n  const loadedScripts = {};\n\n  function loadScript(src) {\n    if (!loadedScripts[src]) {\n      loadedScripts[src] = new Promise((resolve, reject) => {\n        const script = document.createElement('script');\n        script.src = src;\n        script.async = true;\n        script.onload = resolve;\n        script.onerror = reject;\n        document.head.appendChild(script);\n      });\n    }\n    return loadedScripts[src];\n  }\n\n  // ---------- Hele site ----------\n\n  // Smooth scroll, gekoppeld aan ScrollTrigger\n  function initLenis() {\n    if (!window.gsap || !window.ScrollTrigger) return;\n    loadScript(LIBS.lenis).then(() => {\n      const lenis = new Lenis({\n        lerp: 0.1,\n        wheelMultiplier: 1,\n        gestureOrientation: 'vertical',\n        normalizeWheel: false,\n        smoothTouch: false\n      });\n      lenis.on('scroll', ScrollTrigger.update);\n      gsap.ticker.add((time) => {\n        lenis.raf(time * 1000);\n      });\n      gsap.ticker.lagSmoothing(0);\n      window.lenis = lenis;\n    });\n  }\n\n  // Huidig jaar in de footer: [copyright=\"year\"]\n  function initCopyrightYear() {\n    const year = String(new Date().getFullYear());\n    document.querySelectorAll('[copyright=\"year\"]').forEach((el) => {\n      el.textContent = year;\n    });\n  }\n\n  // Finsweet Attributes, alleen op pagina's die ze gebruiken\n  function initFinsweet() {\n    if (document.querySelector('[fs-accordion-element]')) loadScript(LIBS.fsAccordion);\n    if (document.querySelector('[fs-numbercount-element]')) loadScript(LIBS.fsNumbercount);\n    if (document.querySelector('[fs-formsubmit-element]')) loadScript(LIBS.fsFormsubmit);\n  }\n\n  // Freshchat (helpdesk-chat): pas laden bij de eerste interactie (scrollen, muis, toets, aanraking).\n  // Scheelt een zwaar script en cookies van derden bij het openen van elke pagina.\n  const FRESHCHAT = {\n    token: '89de7861-1a35-4cd5-92d4-c65af78e3c63',\n    host: 'https://ozoverbindzorg-help.freshchat.com'\n  };\n\n  function initFreshchat() {\n    const events = ['pointerdown', 'pointermove', 'keydown', 'touchstart', 'scroll', 'wheel'];\n    let started = false;\n    function start() {\n      if (started) return;\n      started = true;\n      events.forEach((type) => window.removeEventListener(type, start));\n      loadScript(FRESHCHAT.host + '/js/widget.js').then(() => {\n        if (window.fcWidget) window.fcWidget.init(FRESHCHAT);\n      });\n    }\n    events.forEach((type) => window.addEventListener(type, start, { passive: true }));\n  }\n\n  // ---------- Oude site (pagina's die nog niet vernieuwd zijn) ----------\n\n  // Floating labels: label krijgt .float zolang het veld focus of een waarde heeft\n  // (zelfde gedrag als CodeCrumbs floating-form-labels 0.1.1)\n  function initFloatLabels() {\n    document.querySelectorAll('.form_input').forEach((input) => {\n      const label = input.previousElementSibling;\n      if (!label) return;\n      input.addEventListener('focus', () => label.classList.add('float'));\n      input.addEventListener('blur', () => {\n        if (!input.value) label.classList.remove('float');\n      });\n    });\n  }\n\n  // Sliders (Swiper). Swiper wordt alleen geladen als er een slider op de pagina staat.\n  const SLIDERS = {\n    '#examples': {\n      slidesPerView: 'auto',\n      speed: 400,\n      spaceBetween: 12,\n      grabCursor: true,\n      keyboard: { enabled: true },\n      navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    },\n    '#logos': {\n      slidesPerView: 'auto',\n      centeredSlides: true,\n      loop: true,\n      speed: 4000,\n      spaceBetween: 28,\n      simulateTouch: false,\n      allowTouchMove: false,\n      autoplay: { delay: 0, disableOnInteraction: false, pauseOnMouseEnter: false },\n      keyboard: { enabled: false }\n    },\n    '#reviews': {\n      slidesPerView: 3,\n      speed: 400,\n      spaceBetween: 28,\n      keyboard: { enabled: false },\n      breakpoints: {\n        320: { slidesPerView: 1.1, centeredSlides: false },\n        992: { allowTouchMove: false }\n      }\n    },\n    '#team': {\n      slidesPerView: 'auto',\n      speed: 400,\n      spaceBetween: 24,\n      grabCursor: true,\n      keyboard: { enabled: true },\n      navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    }\n    // '#vacatures' (/werken-bij) was in Slater alleen gekoppeld aan vacature-detailpagina's, waar hij\n    // niet staat, en is dus nooit actief geweest. Aanzetten = deze config terugzetten:\n    // '#vacatures': {\n    //   slidesPerView: 'auto',\n    //   speed: 400,\n    //   spaceBetween: 24,\n    //   grabCursor: true,\n    //   keyboard: { enabled: true },\n    //   navigation: { nextEl: '.swiper-next', prevEl: '.swiper-prev' }\n    // }\n  };\n\n  function initSliders() {\n    const present = Object.keys(SLIDERS).filter((selector) => document.querySelector(selector));\n    if (!present.length) return;\n    loadScript(LIBS.swiper).then(() => {\n      // slideRole 'listitem': de Webflow-lijst (role=\"list\") houdt geldige lijst-items (toegankelijkheid)\n      present.forEach((selector) => new Swiper(selector, { a11y: { slideRole: 'listitem' }, ...SLIDERS[selector] }));\n    });\n  }\n\n  // Video's met eigen knoppen: #play-<id> en #pause-<id> bij <video id=\"<id>\">.\n  // De explainer-video (#explainer-video) gebruikt #play-video en #pause-video.\n  function initVideoButtons() {\n    const videos = [...document.querySelectorAll('video[id]')];\n    if (!videos.length) return;\n\n    const isExplainer = (video) => video.id === 'explainer-video';\n    const button = (kind, video) =>\n      document.getElementById(`${kind}-${video.id}`) ||\n      (isExplainer(video) ? document.getElementById(`${kind}-video`) : null);\n\n    // Pauzeren, dempen en (behalve de explainer) terug naar het begin\n    function stop(video) {\n      video.pause();\n      video.muted = true;\n      if (!isExplainer(video)) video.currentTime = 0;\n    }\n\n    // Stoppen + de eigen pauzeknop \"klikken\", zodat de Webflow-interactie (icoon) meekomt\n    function reset(video) {\n      stop(video);\n      const pauseButton = document.getElementById(`pause-${video.id}`);\n      if (pauseButton) pauseButton.click();\n    }\n\n    // Een gepauzeerde video hoeft niet te downloaden: bron weghalen tot er op play wordt geklikt.\n    // Alleen bij video's met een poster of die niet zichtbaar zijn, zodat er in beeld niets verandert.\n    function unload(video) {\n      const sources = video.querySelectorAll('source[src]');\n      if (!sources.length) return;\n      if (!video.getAttribute('poster') && video.getClientRects().length) return;\n      sources.forEach((source) => {\n        source.dataset.src = source.getAttribute('src');\n        source.removeAttribute('src');\n      });\n      video.removeAttribute('autoplay');\n      video.preload = 'none';\n      video.load();\n    }\n\n    function ensureLoaded(video) {\n      const pending = video.querySelectorAll('source[data-src]');\n      if (!pending.length) return;\n      pending.forEach((source) => {\n        source.setAttribute('src', source.dataset.src);\n        source.removeAttribute('data-src');\n      });\n      video.load();\n    }\n\n    videos.forEach(reset);\n    videos.forEach(unload);\n\n    videos.forEach((video) => {\n      const playButton = button('play', video);\n      const pauseButton = button('pause', video);\n      if (playButton) {\n        playButton.addEventListener('click', () => {\n          videos.forEach((other) => {\n            if (other !== video) reset(other);\n          });\n          ensureLoaded(video);\n          video.muted = false;\n          video.play();\n        });\n      }\n      if (pauseButton) pauseButton.addEventListener('click', () => stop(video));\n    });\n  }\n\n  // Webflow-lightboxen krijgen aria-label=\"open lightbox\", ook als de link zichtbare tekst heeft.\n  // Dan wijkt de voorgelezen naam af van wat je ziet: label weghalen zodat de tekst telt.\n  function initLightboxLabels() {\n    if (!document.querySelector('.w-lightbox')) return;\n    const fix = () => {\n      document.querySelectorAll('.w-lightbox[aria-label=\"open lightbox\"]').forEach((link) => {\n        if (link.textContent.trim()) link.removeAttribute('aria-label');\n      });\n    };\n    fix();\n    window.Webflow = window.Webflow || [];\n    window.Webflow.push(fix);\n  }\n\n  // Zoekpagina: zoekterm uit de URL tonen en het zoekveld vooraf invullen\n  function initSearchTerm() {\n    if (!document.querySelector('[data-search-term], [data-search-term-wrap]')) return;\n    const query = new URLSearchParams(window.location.search).get('query');\n    if (!query) {\n      document.querySelectorAll('[data-search-term-wrap]').forEach((el) => {\n        el.style.display = 'none';\n      });\n      return;\n    }\n    document.querySelectorAll('[data-search-term]').forEach((el) => {\n      el.textContent = query;\n    });\n    document.querySelectorAll('.w-input[type=\"search\"], input[name=\"query\"]').forEach((el) => {\n      if (!el.value) el.value = query;\n    });\n  }\n\n  // ---------- Nieuwe site ----------\n\n  // Menu schuift weg bij naar beneden scrollen, komt terug bij omhoog scrollen (desktop)\n  function initNavScroll() {\n    const navMenu = document.querySelector('#NAVMENU');\n    if (!navMenu || !window.gsap) return;\n    let lastScrollTop = 0; // Tracks the previous scroll position\n    const scrollThreshold = 28; // Minimum scroll difference to trigger the animation\n    window.addEventListener('scroll', function () {\n      if (window.innerWidth <= 991) return; // Disabled on mobile/tablet\n      const currentScroll = window.pageYOffset || document.documentElement.scrollTop;\n      // Calculate the scroll difference\n      const scrollDelta = Math.abs(currentScroll - lastScrollTop);\n      // Only trigger animation if the scroll difference is greater than the threshold\n      if (scrollDelta > scrollThreshold) {\n        if (currentScroll > lastScrollTop) {\n          // Scroll Down: Move NAVMENU up\n          gsap.to(navMenu, { y: -150, duration: 0.7, ease: 'power2.out' });\n        } else {\n          // Scroll Up: Move NAVMENU back to its original position\n          gsap.to(navMenu, { y: 0, duration: 0.7, ease: 'power2.out' });\n        }\n        lastScrollTop = currentScroll <= 0 ? 0 : currentScroll; // Update lastScrollTop\n      }\n    });\n  }\n\n  function initMegaNavDirectionalHover() {\n    const DUR = {\n      bgMorph: 0.4,\n      contentIn: 0.3,\n      contentOut: 0.2,\n      stagger: 0.25,\n      backdropIn: 0.3,\n      backdropOut: 0.2,\n      openScale: 0.35,\n      closeScale: 0.25,\n    };\n    const HOVER_ENTER = 120;\n    const HOVER_LEAVE = 150;\n    // DOM references\n    const menuWrap = document.querySelector(\"[data-menu-wrap]\");\n    const navList = document.querySelector(\"[data-nav-list]\");\n    const dropWrapper = document.querySelector(\"[data-dropdown-wrapper]\");\n    const dropContainer = document.querySelector(\"[data-dropdown-container]\");\n    const dropBg = document.querySelector(\"[data-dropdown-bg]\");\n    const backdrop = document.querySelector(\"[data-menu-backdrop]\");\n    const toggles = [...document.querySelectorAll(\"[data-dropdown-toggle]\")];\n    const panels = [...document.querySelectorAll(\"[data-nav-content]\")];\n    const burger = document.querySelector(\"[data-burger-toggle]\");\n    const backBtn = document.querySelector(\"[data-mobile-back]\");\n    const logo = document.querySelector(\"[data-menu-logo]\");\n    const [lineTop, lineMid, lineBot] = [\"top\", \"mid\", \"bot\"].map(\n      (id) => document.querySelector(`[data-burger-line='${id}']`)\n    );\n    // Alleen op pagina's met het nieuwe menu\n    if (!menuWrap || !navList || !dropWrapper || !dropContainer || !backdrop || !burger || !backBtn) return;\n    // Logo-link zonder tekst: naam voor schermlezers\n    if (logo && !logo.textContent.trim() && !logo.getAttribute(\"aria-label\")) logo.setAttribute(\"aria-label\", \"OZO home\");\n    // State\n    const state = {\n      isOpen: false,\n      activePanel: null,\n      activePanelIndex: -1,\n      isMobile: window.innerWidth <= 991,\n      mobileMenuOpen: false,\n      mobilePanelActive: null,\n      hoverTimer: null,\n      leaveTimer: null,\n      tl: null,\n      mobileTl: null,\n      mobilePanelTl: null,\n    };\n    // Helpers\n    const getPanel = (name) => document.querySelector(`[data-nav-content=\"${name}\"]`);\n    const getToggle = (name) => document.querySelector(`[data-dropdown-toggle=\"${name}\"]`);\n    const getFade = (el) => el.querySelectorAll(\"[data-menu-fade]\");\n    const getNavItems = () => navList.querySelectorAll(\"[data-nav-list-item]\");\n    const getIndex = (name) => toggles.indexOf(getToggle(name));\n    const stagger = (n) => (n <= 1 ? 0 : { amount: DUR.stagger });\n    const ICON_SEL = \".mega-nav__bar-link-icon.is--dropdown\";\n    const getIcon = (name) => getToggle(name)?.querySelector(ICON_SEL);\n\n    function spinIcon(tl, name, open, at = 0) {\n      const icon = getIcon(name);\n      if (!icon) return;\n      tl.to(icon, {\n        rotate: open ? 180 : 0,\n        duration: open ? DUR.openScale : DUR.closeScale,\n        ease: open ? \"power3.out\" : \"power2.in\",\n        overwrite: \"auto\",\n      }, at);\n    }\n\n    function clearTimers() {\n      clearTimeout(state.hoverTimer);\n      clearTimeout(state.leaveTimer);\n      state.hoverTimer = state.leaveTimer = null;\n    }\n\n    function killTl(key) {\n      if (state[key]) {\n        state[key].kill();\n        state[key] = null;\n      }\n    }\n\n    function killDropdown() {\n      killTl(\"tl\");\n      gsap.killTweensOf(dropContainer);\n      gsap.killTweensOf(backdrop);\n      panels.forEach((p) => {\n        gsap.killTweensOf(p);\n        gsap.killTweensOf(getFade(p));\n      });\n    }\n\n    function killMobile() {\n      killTl(\"mobileTl\");\n      gsap.killTweensOf([navList, lineTop, lineMid, lineBot]);\n    }\n\n    function killMobilePanel() {\n      killTl(\"mobilePanelTl\");\n      gsap.killTweensOf(getNavItems());\n      gsap.killTweensOf([backBtn, logo]);\n      panels.forEach((p) => {\n        gsap.killTweensOf(p);\n        gsap.killTweensOf(getFade(p));\n      });\n    }\n\n    function resetToggles() {\n      toggles.forEach((t) => t.setAttribute(\"aria-expanded\", \"false\"));\n    }\n\n    function resetDesktop() {\n      panels.forEach((p) => {\n        gsap.set(p, {\n          visibility: \"hidden\",\n          opacity: 0,\n          pointerEvents: \"none\",\n          x: 0,\n          y: 0,\n          xPercent: 0\n        });\n        gsap.set(getFade(p), { autoAlpha: 0, x: 0, y: 0, xPercent: 0 });\n      });\n      gsap.set(dropContainer, { height: 0, clearProps: \"transform\" });\n      gsap.set(backdrop, { autoAlpha: 0 });\n      menuWrap.setAttribute(\"data-menu-open\", \"false\");\n      resetToggles();\n    }\n\n    function setupMobile() {\n      panels.forEach((p) => {\n        gsap.set(p, { autoAlpha: 0, xPercent: 0, visibility: \"visible\", pointerEvents: \"none\" });\n        gsap.set(getFade(p), { xPercent: 20, autoAlpha: 0 });\n      });\n      gsap.set(getNavItems(), { xPercent: 0, y: 0, autoAlpha: 1 });\n      gsap.set(navList, { autoAlpha: 0, x: 0 });\n      gsap.set(backBtn, { autoAlpha: 0 });\n      gsap.set(logo, { autoAlpha: 1 });\n      gsap.set(dropContainer, { clearProps: \"height\" });\n      gsap.set(backdrop, { autoAlpha: 0 });\n    }\n\n    function measurePanel(name) {\n      const el = getPanel(name);\n      if (!el) return 0;\n      const s = el.style;\n      const prev = [s.visibility, s.opacity, s.pointerEvents];\n      Object.assign(s, { visibility: \"visible\", opacity: \"0\", pointerEvents: \"none\" });\n      const h = el.getBoundingClientRect().height;\n      [s.visibility, s.opacity, s.pointerEvents] = prev;\n      return h;\n    }\n    // DESKTOP — open dropdown (first open)\n    function openDropdown(panelName) {\n      if (state.isOpen && state.activePanel === panelName) return;\n      if (state.isOpen) return switchPanel(state.activePanel, panelName);\n      const height = measurePanel(panelName);\n      if (!height) return;\n      killDropdown();\n      resetDesktop();\n      const el = getPanel(panelName);\n      const fade = getFade(el);\n      const toggle = getToggle(panelName);\n      state.isOpen = true;\n      state.activePanel = panelName;\n      state.activePanelIndex = getIndex(panelName);\n      menuWrap.setAttribute(\"data-menu-open\", \"true\");\n      if (toggle) toggle.setAttribute(\"aria-expanded\", \"true\");\n      gsap.set(dropContainer, { height: 0 });\n      const tl = gsap.timeline();\n      state.tl = tl;\n      tl.to(backdrop, { autoAlpha: 1, duration: DUR.backdropIn, ease: \"power2.out\" }, 0);\n      tl.to(dropContainer, { height, duration: DUR.openScale, ease: \"power3.out\" }, 0);\n      tl.set(el, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\" }, 0.05);\n      if (fade.length) {\n        tl.fromTo(fade, { autoAlpha: 0, y: 8 }, {\n            autoAlpha: 1,\n            y: 0,\n            duration: DUR.contentIn,\n            stagger: stagger(fade.length),\n            ease: \"power3.out\"\n          },\n          0.1\n        );\n      }\n    }\n    // DESKTOP — close dropdown\n    function closeDropdown() {\n      if (!state.isOpen) return;\n      const el = getPanel(state.activePanel);\n      const fade = el ? getFade(el) : [];\n      killDropdown();\n      const tl = gsap.timeline({\n        onComplete() {\n          state.isOpen = false;\n          state.activePanel = null;\n          state.activePanelIndex = -1;\n          state.tl = null;\n          resetDesktop();\n        },\n      });\n      state.tl = tl;\n      if (fade.length) tl.to(fade, {\n        autoAlpha: 0,\n        y: -4,\n        duration: DUR.contentOut * 0.7,\n        ease: \"power2.in\"\n      }, 0);\n      tl.to(dropContainer, { height: 0, duration: DUR.closeScale, ease: \"power2.in\" }, 0.05);\n      tl.to(backdrop, { autoAlpha: 0, duration: DUR.backdropOut, ease: \"power2.out\" }, 0);\n      if (el) tl.set(el, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\" });\n    }\n    // DESKTOP — switch panel (directional)\n    function switchPanel(fromName, toName) {\n      const dir = getIndex(toName) > getIndex(fromName) ? 1 : -1;\n      const fromEl = getPanel(fromName),\n        toEl = getPanel(toName);\n      if (!fromEl || !toEl) return;\n      const fromFade = getFade(fromEl),\n        toFade = getFade(toEl);\n      const toHeight = measurePanel(toName);\n      if (!toHeight) return;\n      killDropdown();\n      // Reset all panels, then restore fromEl as visible\n      panels.forEach((p) => {\n        gsap.set(p, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\", xPercent: 0 });\n        gsap.set(getFade(p), { autoAlpha: 0, x: 0, y: 0 });\n      });\n      gsap.set(fromEl, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\", x: 0 });\n      if (fromFade.length) gsap.set(fromFade, { autoAlpha: 1, x: 0, y: 0 });\n      gsap.set(backdrop, { autoAlpha: 1 });\n      const toToggle = getToggle(toName);\n      state.activePanel = toName;\n      state.activePanelIndex = getIndex(toName);\n      resetToggles();\n      if (toToggle) toToggle.setAttribute(\"aria-expanded\", \"true\");\n      const xOut = dir * -30,\n        xIn = dir * 30;\n      const tl = gsap.timeline();\n      state.tl = tl;\n      if (fromFade.length) tl.to(fromFade, {\n        autoAlpha: 0,\n        x: xOut,\n        duration: DUR.contentOut,\n        ease: \"power2.in\"\n      }, 0);\n      tl.set(fromEl, { visibility: \"hidden\", opacity: 0, pointerEvents: \"none\", xPercent: 0 }, DUR\n        .contentOut);\n      if (fromFade.length) tl.set(fromFade, { x: 0 }, DUR.contentOut);\n      tl.to(dropContainer, { height: toHeight, duration: DUR.bgMorph, ease: \"power3.out\" }, 0.05);\n      tl.set(toEl, { visibility: \"visible\", opacity: 1, pointerEvents: \"auto\", xPercent: 0 }, DUR\n        .contentOut * 0.5);\n      if (toFade.length) {\n        tl.fromTo(toFade, { autoAlpha: 0, x: xIn }, {\n            autoAlpha: 1,\n            x: 0,\n            duration: DUR.contentIn,\n            stagger: stagger(toFade.length),\n            ease: \"power3.out\"\n          },\n          DUR.contentOut * 0.6\n        );\n      }\n    }\n    // DESKTOP — hover intent\n    function handleToggleEnter(e) {\n      if (state.isMobile) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (!name) return;\n      clearTimeout(state.leaveTimer);\n      state.leaveTimer = null;\n      clearTimeout(state.hoverTimer);\n      state.hoverTimer = setTimeout(() => openDropdown(name), state.isOpen ? 0 : HOVER_ENTER);\n    }\n\n    function handleToggleLeave() {\n      if (state.isMobile) return;\n      clearTimeout(state.hoverTimer);\n      state.hoverTimer = null;\n      state.leaveTimer = setTimeout(closeDropdown, HOVER_LEAVE);\n    }\n\n    function handleWrapperEnter() {\n      if (state.isMobile) return;\n      clearTimeout(state.leaveTimer);\n      state.leaveTimer = null;\n    }\n\n    function handleWrapperLeave() {\n      if (state.isMobile) return;\n      state.leaveTimer = setTimeout(closeDropdown, HOVER_LEAVE);\n    }\n    // DESKTOP — close behaviors\n    function handleEscape(e) {\n      if (e.key !== \"Escape\") return;\n      if (state.isMobile) {\n        state.mobilePanelActive ? closeMobilePanel() : state.mobileMenuOpen && closeMobileMenu();\n        return;\n      }\n      if (state.isOpen) {\n        const t = getToggle(state.activePanel);\n        closeDropdown();\n        if (t) t.focus();\n      }\n    }\n\n    function handleDocClick(e) {\n      if (state.isMobile || !state.isOpen) return;\n      if (!e.target.closest(\"[data-menu-wrap]\")) closeDropdown();\n    }\n    // DESKTOP — keyboard navigation\n    function focusFirstLink(panelName) {\n      setTimeout(() => {\n        const el = getPanel(panelName);\n        if (!el) return;\n        const link = el.querySelector(\"a\");\n        if (!link) return;\n        gsap.set(link, { visibility: \"visible\" });\n        link.focus();\n      }, 80);\n    }\n\n    function handleKeydownOnToggle(e) {\n      if (state.isMobile) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (e.key === \"Enter\" || e.key === \" \") {\n        e.preventDefault();\n        if (state.isOpen && state.activePanel === name) closeDropdown();\n        else {\n          openDropdown(name);\n          focusFirstLink(name);\n        }\n        return;\n      }\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        if (!state.isOpen || state.activePanel !== name) openDropdown(name);\n        focusFirstLink(name);\n      }\n      if (e.key === \"Tab\" && !e.shiftKey && state.isOpen && state.activePanel === name) {\n        e.preventDefault();\n        const link = getPanel(name)?.querySelector(\"a\");\n        if (link) link.focus();\n      }\n    }\n\n    function handleKeydownInPanel(e) {\n      if (state.isMobile || !state.isOpen) return;\n      const el = getPanel(state.activePanel);\n      if (!el) return;\n      const links = [...el.querySelectorAll(\"a\")];\n      const idx = links.indexOf(document.activeElement);\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        links[(idx + 1) % links.length].focus();\n      }\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        if (idx <= 0) { const t = getToggle(state.activePanel); if (t) t.focus(); }\n        else links[idx - 1].focus();\n      }\n      if (e.key === \"Tab\" && !e.shiftKey && idx === links.length - 1) {\n        e.preventDefault();\n        const curIdx = toggles.indexOf(getToggle(state.activePanel));\n        const next = curIdx < toggles.length - 1 ? toggles[curIdx + 1] : null;\n        closeDropdown();\n        if (next) next.focus();\n      }\n      if (e.key === \"Tab\" && e.shiftKey && idx === 0) {\n        e.preventDefault();\n        const t = getToggle(state.activePanel);\n        if (t) t.focus();\n      }\n    }\n    // MOBILE — burger animation\n    function animateBurger(toX) {\n      const tl = gsap.timeline({ defaults: { ease: \"power2.inOut\" } });\n      if (toX) {\n        tl.to(lineTop, { y: \"0.3125em\", duration: 0.15 }, 0);\n        tl.to(lineBot, { y: \"-0.3125em\", duration: 0.15 }, 0);\n        tl.to(lineMid, { autoAlpha: 0, duration: 0.1 }, 0.1);\n        tl.to(lineTop, { rotation: 45, duration: 0.2 }, 0.15);\n        tl.to(lineBot, { rotation: -45, duration: 0.2 }, 0.15);\n      } else {\n        tl.to(lineTop, { rotation: 0, duration: 0.2 }, 0);\n        tl.to(lineBot, { rotation: 0, duration: 0.2 }, 0);\n        tl.to(lineTop, { y: 0, duration: 0.15 }, 0.15);\n        tl.to(lineBot, { y: 0, duration: 0.15 }, 0.15);\n        tl.to(lineMid, { autoAlpha: 1, duration: 0.1 }, 0.15);\n      }\n      return tl;\n    }\n    // MOBILE — open/close menu\n    function openMobileMenu() {\n      killMobile();\n      state.mobileMenuOpen = true;\n      menuWrap.setAttribute(\"data-menu-open\", \"true\");\n      burger.setAttribute(\"aria-expanded\", \"true\");\n      document.body.style.overflow = \"hidden\";\n      const items = getNavItems();\n      const tl = gsap.timeline();\n      state.mobileTl = tl;\n      tl.add(animateBurger(true), 0);\n      tl.to(navList, { autoAlpha: 1, duration: 0.3, ease: \"power2.out\" }, 0);\n      if (items.length) {\n        tl.fromTo(items, { autoAlpha: 0, y: 12 }, {\n            autoAlpha: 1,\n            y: 0,\n            duration: 0.3,\n            stagger: 0.04,\n            ease: \"power3.out\"\n          },\n          0.15\n        );\n      }\n    }\n\n    function closeMobileMenu() {\n      const hadPanel = state.mobilePanelActive;\n      const panelEl = hadPanel ? getPanel(hadPanel) : null;\n      killMobile();\n      killMobilePanel();\n      menuWrap.setAttribute(\"data-menu-open\", \"false\");\n      state.mobileMenuOpen = false;\n      state.mobilePanelActive = null;\n      burger.setAttribute(\"aria-expanded\", \"false\");\n      const tl = gsap.timeline({\n        onComplete() {\n          document.body.style.overflow = \"\";\n          state.mobileTl = null;\n          setupMobile();\n        },\n      });\n      state.mobileTl = tl;\n      tl.add(animateBurger(false), 0);\n      // If a panel was open, fade it out with the close — no snap reset\n      if (hadPanel && panelEl) {\n        tl.to(panelEl, { autoAlpha: 0, duration: 0.3, ease: \"power2.inOut\" }, 0.05);\n        tl.to(backBtn, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0.05);\n      }\n      // Fade out the nav list container\n      tl.to(navList, { autoAlpha: 0, duration: 0.3, ease: \"power2.inOut\" }, 0.05);\n    }\n    // MOBILE — slide-over panels \n    function openMobilePanel(panelName) {\n      const el = getPanel(panelName);\n      if (!el) return;\n      killMobilePanel();\n      state.mobilePanelActive = panelName;\n      const navItems = getNavItems();\n      const panelFade = getFade(el);\n      const tl = gsap.timeline();\n      state.mobilePanelTl = tl;\n      // Fade out each nav item to the left\n      if (navItems.length) {\n        tl.to(navItems, {\n          xPercent: -10,\n          autoAlpha: 0,\n          duration: 0.35,\n          stagger: 0.03,\n          ease: \"power2.in\",\n        }, 0);\n      }\n      // Logo → back button swap\n      tl.to(logo, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0);\n      tl.to(backBtn, { autoAlpha: 1, duration: 0.25, ease: \"power2.inOut\" }, 0.15);\n      // Show panel container, then fade in its items from the right\n      tl.set(el, { autoAlpha: 1, xPercent: 0, pointerEvents: \"auto\" }, 0.2);\n      if (panelFade.length) {\n        tl.fromTo(panelFade, { xPercent: 8, autoAlpha: 0 }, {\n            xPercent: 0,\n            autoAlpha: 1,\n            duration: 0.3,\n            stagger: stagger(panelFade.length),\n            ease: \"power3.out\"\n          },\n          0.25\n        );\n      }\n    }\n\n    function closeMobilePanel() {\n      if (!state.mobilePanelActive) return;\n      const el = getPanel(state.mobilePanelActive);\n      if (!el) return;\n      killMobilePanel();\n      const navItems = getNavItems();\n      const panelFade = getFade(el);\n      const tl = gsap.timeline({\n        onComplete() {\n          state.mobilePanelActive = null;\n          state.mobilePanelTl = null;\n        },\n      });\n      state.mobilePanelTl = tl;\n      // Fade out panel items to the right\n      if (panelFade.length) {\n        tl.to(el, {\n          xPercent: 20,\n          autoAlpha: 0,\n          duration: 0.3,\n          stagger: 0.02,\n          ease: \"power2.in\",\n        }, 0);\n      }\n      // Hide panel\n      tl.set(el, { autoAlpha: 0, pointerEvents: \"none\" }, 0.25);\n      // Back → logo swap\n      tl.to(backBtn, { autoAlpha: 0, duration: 0.2, ease: \"power2.in\" }, 0);\n      tl.to(logo, { autoAlpha: 1, duration: 0.25, ease: \"power2.out\" }, 0.15);\n      // Fade nav items back in from center\n      if (navItems.length) {\n        tl.fromTo(navItems, { xPercent: -20, autoAlpha: 0 }, {\n            xPercent: 0,\n            autoAlpha: 1,\n            duration: 0.35,\n            stagger: 0.03,\n            ease: \"power3.out\"\n          },\n          0.25\n        );\n      }\n    }\n\n    function handleToggleClick(e) {\n      if (!state.isMobile || !state.mobileMenuOpen) return;\n      const name = e.currentTarget.getAttribute(\"data-dropdown-toggle\");\n      if (name) {\n        e.preventDefault();\n        openMobilePanel(name);\n      }\n    }\n    // RESIZE\n    let resizeTimer = null;\n    let lastWidth = window.innerWidth;\n\n    function handleResize() {\n      const w = window.innerWidth;\n      if (w === lastWidth) return;\n      lastWidth = w;\n      clearTimeout(resizeTimer);\n      resizeTimer = setTimeout(() => {\n        const was = state.isMobile;\n        state.isMobile = window.innerWidth <= 991;\n        if (was && !state.isMobile) {\n          killMobile();\n          killMobilePanel();\n          gsap.set(navList, { clearProps: \"all\" });\n          gsap.set(getNavItems(), { clearProps: \"all\" });\n          gsap.set(backBtn, { autoAlpha: 0 });\n          gsap.set(logo, { clearProps: \"all\" });\n          gsap.set([lineTop, lineMid, lineBot], { rotation: 0, y: 0, autoAlpha: 1 });\n          panels.forEach((p) => {\n            gsap.set(p, { clearProps: \"all\" });\n            gsap.set(getFade(p), { clearProps: \"all\" });\n          });\n          burger.setAttribute(\"aria-expanded\", \"false\");\n          state.mobileMenuOpen = false;\n          state.mobilePanelActive = null;\n          document.body.style.overflow = \"\";\n          resetDesktop();\n        }\n        if (!was && state.isMobile) {\n          killDropdown();\n          state.isOpen = false;\n          state.activePanel = null;\n          state.activePanelIndex = -1;\n          clearTimers();\n          menuWrap.setAttribute(\"data-menu-open\", \"false\");\n          resetToggles();\n          setupMobile();\n        }\n      }, 150);\n    }\n    // EVENT BINDING\n    toggles.forEach((btn) => {\n      btn.addEventListener(\"mouseenter\", handleToggleEnter);\n      btn.addEventListener(\"mouseleave\", handleToggleLeave);\n      btn.addEventListener(\"keydown\", handleKeydownOnToggle);\n      btn.addEventListener(\"click\", handleToggleClick);\n    });\n    dropWrapper.addEventListener(\"mouseenter\", handleWrapperEnter);\n    dropWrapper.addEventListener(\"mouseleave\", handleWrapperLeave);\n    panels.forEach((p) => p.addEventListener(\"keydown\", handleKeydownInPanel));\n    backdrop.addEventListener(\"click\", closeDropdown);\n    document.addEventListener(\"keydown\", handleEscape);\n    document.addEventListener(\"click\", handleDocClick);\n    burger.addEventListener(\"click\", () => state.mobileMenuOpen ? closeMobileMenu() :\n      openMobileMenu());\n    backBtn.addEventListener(\"click\", closeMobilePanel);\n    window.addEventListener(\"resize\", handleResize);\n    // INIT\n    state.isMobile ? setupMobile() : resetDesktop();\n  }\n\n  // Search toggle\n  function initSearchToggle() {\n    const r = document.documentElement,\n      w = document.querySelector(\"[data-menu-wrap]\"),\n      t = document.querySelector(\"[data-search-toggle]\"),\n      p = document.querySelector(\"[data-search-panel]\");\n    if (!t || !p) return;\n    const i = p.querySelector(\".w-input\"),\n      isOpen = () => r.getAttribute(\"data-search-state\") === \"open\",\n      navOpen = () => w && w.getAttribute(\"data-menu-open\") === \"true\";\n    t.setAttribute(\"aria-expanded\", \"false\");\n    // Toggle is een div: knop-rol + toetsenbord, anders is aria-expanded niet toegestaan\n    if (t.tagName !== \"BUTTON\") {\n      t.setAttribute(\"role\", \"button\");\n      if (!t.hasAttribute(\"tabindex\")) t.setAttribute(\"tabindex\", \"0\");\n      t.addEventListener(\"keydown\", e => {\n        if (e.key !== \"Enter\" && e.key !== \" \") return;\n        e.preventDefault();\n        isOpen() ? close(0) : open();\n      });\n    }\n\n    function open() {\n      if (navOpen()) document.dispatchEvent(new KeyboardEvent(\"keydown\", {\n        key: \"Escape\",\n        bubbles: true\n      }));\n      r.setAttribute(\"data-search-state\", \"open\");\n      t.setAttribute(\"aria-expanded\", \"true\");\n      if (i) setTimeout(() => i.focus(), 120);\n    }\n\n    function close(f) {\n      r.removeAttribute(\"data-search-state\");\n      t.setAttribute(\"aria-expanded\", \"false\");\n      if (f) t.focus();\n    }\n    document.addEventListener(\"click\", e => {\n      const node = e.target.nodeType === 1 ? e.target : e.target.parentElement;\n      if (!node) return;\n      if (node.closest(\"[data-search-toggle]\")) {\n        e.preventDefault();\n        isOpen() ? close(0) : open();\n        return;\n      }\n      if (!isOpen()) return;\n      if (node === p) { close(0); return; }\n      if (!node.closest(\"[data-search-panel]\")) close(0);\n    });\n    document.addEventListener(\"keydown\", e => { if (e.key === \"Escape\" && isOpen()) close(1); });\n  }\n\n  // Form interactions\n  function initAdvancedFormValidation() {\n    const forms = document.querySelectorAll('[data-form-validate]');\n    forms.forEach((formContainer) => {\n      const form = formContainer.querySelector('form');\n      if (!form) return;\n      const validateFields = form.querySelectorAll('[data-validate]');\n      // Webflow-forms gebruiken [data-submit] + input[type=submit].\n      // Custom forms (zoals Laposta) hebben die niet: dan alleen veldvalidatie + form.__validate.\n      const dataSubmit = form.querySelector('[data-submit]');\n      const realSubmitInput = dataSubmit ? dataSubmit.querySelector('input[type=\"submit\"]') :\n        null;\n      // Disable select options with invalid values on page load\n      validateFields.forEach(function (fieldGroup) {\n        const select = fieldGroup.querySelector('select');\n        if (select) {\n          const options = select.querySelectorAll('option');\n          options.forEach(function (option) {\n            if (\n              option.value === '' ||\n              option.value === 'disabled' ||\n              option.value === 'null' ||\n              option.value === 'false'\n            ) {\n              option.setAttribute('disabled', 'disabled');\n            }\n          });\n        }\n      });\n\n      function validateAndStartLiveValidationForAll() {\n        let allValid = true;\n        let firstInvalidField = null;\n        validateFields.forEach(function (fieldGroup) {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n          if (!input && !radioCheckGroup) return;\n          if (input) input.__validationStarted = true;\n          if (radioCheckGroup) {\n            radioCheckGroup.__validationStarted = true;\n            const inputs = radioCheckGroup.querySelectorAll(\n              'input[type=\"radio\"], input[type=\"checkbox\"]');\n            inputs.forEach(function (input) {\n              input.__validationStarted = true;\n            });\n          }\n          updateFieldStatus(fieldGroup);\n          if (!isValid(fieldGroup)) {\n            allValid = false;\n            if (!firstInvalidField) {\n              firstInvalidField = input || radioCheckGroup.querySelector('input');\n            }\n          }\n        });\n        if (!allValid && firstInvalidField) {\n          firstInvalidField.focus();\n        }\n        return allValid;\n      }\n\n      function isValid(fieldGroup) {\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          const checkedInputs = radioCheckGroup.querySelectorAll('input:checked');\n          const min = parseInt(radioCheckGroup.getAttribute('min')) || 1;\n          const max = parseInt(radioCheckGroup.getAttribute('max')) || inputs.length;\n          const checkedCount = checkedInputs.length;\n          if (inputs[0].type === 'radio') {\n            return checkedCount >= 1;\n          } else {\n            if (inputs.length === 1) {\n              return inputs[0].checked;\n            } else {\n              return checkedCount >= min && checkedCount <= max;\n            }\n          }\n        } else {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          if (!input) return false;\n          let valid = true;\n          const min = parseInt(input.getAttribute('min')) || 0;\n          const max = parseInt(input.getAttribute('max')) || Infinity;\n          const value = input.value.trim();\n          const length = value.length;\n          if (input.tagName.toLowerCase() === 'select') {\n            if (\n              value === '' ||\n              value === 'disabled' ||\n              value === 'null' ||\n              value === 'false'\n            ) {\n              valid = false;\n            }\n          } else if (input.type === 'email') {\n            const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n            valid = emailPattern.test(value);\n          } else {\n            if (input.hasAttribute('min') && length < min) valid = false;\n            if (input.hasAttribute('max') && length > max) valid = false;\n          }\n          return valid;\n        }\n      }\n\n      function updateFieldStatus(fieldGroup) {\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          const checkedInputs = radioCheckGroup.querySelectorAll('input:checked');\n          if (checkedInputs.length > 0) {\n            fieldGroup.classList.add('is--filled');\n          } else {\n            fieldGroup.classList.remove('is--filled');\n          }\n          const valid = isValid(fieldGroup);\n          if (valid) {\n            fieldGroup.classList.add('is--success');\n            fieldGroup.classList.remove('is--error');\n          } else {\n            fieldGroup.classList.remove('is--success');\n            const anyInputValidationStarted = Array.from(inputs).some(input => input\n              .__validationStarted);\n            if (anyInputValidationStarted) {\n              fieldGroup.classList.add('is--error');\n            } else {\n              fieldGroup.classList.remove('is--error');\n            }\n          }\n        } else {\n          const input = fieldGroup.querySelector('input, textarea, select');\n          if (!input) return;\n          const value = input.value.trim();\n          if (value) {\n            fieldGroup.classList.add('is--filled');\n          } else {\n            fieldGroup.classList.remove('is--filled');\n          }\n          const valid = isValid(fieldGroup);\n          if (valid) {\n            fieldGroup.classList.add('is--success');\n            fieldGroup.classList.remove('is--error');\n          } else {\n            fieldGroup.classList.remove('is--success');\n            if (input.__validationStarted) {\n              fieldGroup.classList.add('is--error');\n            } else {\n              fieldGroup.classList.remove('is--error');\n            }\n          }\n        }\n      }\n      validateFields.forEach(function (fieldGroup) {\n        const input = fieldGroup.querySelector('input, textarea, select');\n        const radioCheckGroup = fieldGroup.querySelector('[data-radiocheck-group]');\n        if (radioCheckGroup) {\n          const inputs = radioCheckGroup.querySelectorAll(\n            'input[type=\"radio\"], input[type=\"checkbox\"]');\n          inputs.forEach(function (input) {\n            input.__validationStarted = false;\n            input.addEventListener('change', function () {\n              requestAnimationFrame(function () {\n                if (!input.__validationStarted) {\n                  const checkedCount = radioCheckGroup.querySelectorAll(\n                    'input:checked').length;\n                  const min = parseInt(radioCheckGroup.getAttribute('min')) || 1;\n                  if (checkedCount >= min) {\n                    input.__validationStarted = true;\n                  }\n                }\n                if (input.__validationStarted) {\n                  updateFieldStatus(fieldGroup);\n                }\n              });\n            });\n            input.addEventListener('blur', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          });\n        } else if (input) {\n          input.__validationStarted = false;\n          if (input.tagName.toLowerCase() === 'select') {\n            input.addEventListener('change', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          } else {\n            input.addEventListener('input', function () {\n              const value = input.value.trim();\n              const length = value.length;\n              const min = parseInt(input.getAttribute('min')) || 0;\n              const max = parseInt(input.getAttribute('max')) || Infinity;\n              if (!input.__validationStarted) {\n                if (input.type === 'email') {\n                  if (isValid(fieldGroup)) input.__validationStarted = true;\n                } else {\n                  if (\n                    (input.hasAttribute('min') && length >= min) ||\n                    (input.hasAttribute('max') && length <= max)\n                  ) {\n                    input.__validationStarted = true;\n                  }\n                }\n              }\n              if (input.__validationStarted) {\n                updateFieldStatus(fieldGroup);\n              }\n            });\n            input.addEventListener('blur', function () {\n              input.__validationStarted = true;\n              updateFieldStatus(fieldGroup);\n            });\n          }\n        }\n      });\n\n      // Validator beschikbaar maken voor custom submit handlers (Laposta)\n      form.__validate = validateAndStartLiveValidationForAll;\n\n      // Alleen Webflow-forms: submit via [data-submit] + echte input[type=submit]\n      if (!dataSubmit || !realSubmitInput) return;\n      dataSubmit.addEventListener('click', function () {\n        if (validateAndStartLiveValidationForAll()) {\n          form.requestSubmit(realSubmitInput);\n        }\n      });\n      form.addEventListener('keydown', function (event) {\n        if (event.key === 'Enter' && event.target.tagName !== 'TEXTAREA') {\n          event.preventDefault();\n          if (validateAndStartLiveValidationForAll()) {\n            form.requestSubmit(realSubmitInput);\n          }\n        }\n      });\n    });\n  }\n\n  // Vimeo background video\n  function initVimeoBackground() {\n    // Officiële Vimeo Player SDK via jsDelivr (vaste versie): zelfde API, maar geen cookies van player.vimeo.com\n    const VIMEO_SDK = \"https://cdn.jsdelivr.net/npm/@vimeo/player@2.30.4/dist/player.min.js\";\n\n    // Load Vimeo Player SDK if it isn't on the page yet\n    function loadVimeoSDK(callback) {\n      if (window.Vimeo && window.Vimeo.Player) {\n        callback();\n        return;\n      }\n      const existing = document.querySelector(`script[src=\"${VIMEO_SDK}\"]`);\n      if (existing) {\n        existing.addEventListener(\"load\", callback, { once: true });\n        return;\n      }\n      const script = document.createElement(\"script\");\n      script.src = VIMEO_SDK;\n      script.onload = callback;\n      document.head.appendChild(script);\n    }\n\n    function initVimeoBGVideo() {\n      // Select all elements that have [data-vimeo-bg-init]\n      const vimeoPlayers = document.querySelectorAll(\"[data-vimeo-bg-init]\");\n      if (!vimeoPlayers.length) return;\n\n      vimeoPlayers.forEach(function (vimeoElement, index) {\n        // Prevent double init\n        if (vimeoElement.hasAttribute(\"data-vimeo-ready\")) return;\n        vimeoElement.setAttribute(\"data-vimeo-ready\", \"true\");\n\n        // Add Vimeo URL ID to the iframe [src]\n        const vimeoVideoID = vimeoElement.getAttribute(\"data-vimeo-video-id\");\n        if (!vimeoVideoID) return;\n        const iframe = vimeoElement.querySelector(\"iframe\");\n        if (!iframe) return;\n        // dnt=1: Vimeo zet geen tracking-cookies\n        const vimeoVideoURL =\n          `https://player.vimeo.com/video/${vimeoVideoID}?api=1&background=1&autoplay=0&loop=1&muted=1&dnt=1`;\n        iframe.setAttribute(\"src\", vimeoVideoURL);\n        // Decoratieve achtergrondvideo: titel voor de iframe, maar niet voorlezen of focussen\n        iframe.setAttribute(\"title\", \"Achtergrondvideo\");\n        iframe.setAttribute(\"aria-hidden\", \"true\");\n        iframe.setAttribute(\"tabindex\", \"-1\");\n\n        // Assign an ID to each element\n        const videoIndexID = \"vimeo-bg-index-\" + index;\n        vimeoElement.setAttribute(\"id\", videoIndexID);\n\n        const player = new Vimeo.Player(videoIndexID);\n\n        // Formaat: de video vult de container via CSS (Site settings → Head, \".vimeo-bg\"),\n        // niet meer via meten in JavaScript. Meten na het laden liet de hero verspringen (layout shift).\n\n        // Loaded\n        player.on(\"play\", function () {\n          vimeoElement.setAttribute(\"data-vimeo-loaded\", \"true\");\n        });\n\n        // Paused\n        player.on(\"pause\", function () {\n          vimeoElement.setAttribute(\"data-vimeo-playing\", \"false\");\n        });\n\n        // Play / pause\n        function vimeoPlayerPlay() {\n          vimeoElement.setAttribute(\"data-vimeo-activated\", \"true\");\n          vimeoElement.setAttribute(\"data-vimeo-playing\", \"true\");\n          player.play();\n        }\n\n        function vimeoPlayerPause() {\n          player.pause();\n        }\n\n        // Scroll-based autoplay\n        function checkVisibility() {\n          const rect = vimeoElement.getBoundingClientRect();\n          const inView = rect.top < window.innerHeight && rect.bottom > 0;\n          inView ? vimeoPlayerPlay() : vimeoPlayerPause();\n        }\n\n        // Autoplay\n        if (vimeoElement.getAttribute(\"data-vimeo-autoplay\") === \"false\") {\n          player.pause();\n        } else if (vimeoElement.getAttribute(\"data-vimeo-paused-by-user\") === \"false\") {\n          checkVisibility();\n          window.addEventListener(\"scroll\", checkVisibility);\n        }\n\n        // Click: Play\n        const playBtn = vimeoElement.querySelector('[data-vimeo-control=\"play\"]');\n        if (playBtn) {\n          playBtn.addEventListener(\"click\", vimeoPlayerPlay);\n        }\n\n        // Click: Pause\n        const pauseBtn = vimeoElement.querySelector('[data-vimeo-control=\"pause\"]');\n        if (pauseBtn) {\n          pauseBtn.addEventListener(\"click\", function () {\n            vimeoPlayerPause();\n            // If paused by user => kill the scroll-based autoplay\n            if (vimeoElement.getAttribute(\"data-vimeo-autoplay\") === \"true\") {\n              vimeoElement.setAttribute(\"data-vimeo-paused-by-user\", \"true\");\n              window.removeEventListener(\"scroll\", checkVisibility);\n            }\n          });\n        }\n      });\n    }\n\n    if (document.querySelector(\"[data-vimeo-bg-init]\")) {\n      loadVimeoSDK(initVimeoBGVideo);\n    }\n  }\n\n  // Hero wave: subtiele, organisch bewegende golf\n  function initHeroWave() {\n    const waves = document.querySelectorAll(\"[data-hero-wave]\");\n    if (!waves.length) return;\n\n    const W = 1440; // viewBox breedte\n    const H = 120; // viewBox hoogte\n\n    // Basisvorm van de bovenrand (y vanaf boven): links hoog, midden laag, rechts iets hoger\n    const BASE = [20, 55, 95, 70, 40];\n\n    const reduceMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n    // Vloeiende curve door alle punten (Catmull-Rom naar cubic bezier)\n    function buildPath(points) {\n      let d = `M${points[0][0]},${points[0][1]}`;\n      for (let i = 0; i < points.length - 1; i++) {\n        const p0 = points[i - 1] || points[i];\n        const p1 = points[i];\n        const p2 = points[i + 1];\n        const p3 = points[i + 2] || p2;\n        const cp1x = p1[0] + (p2[0] - p0[0]) / 6;\n        const cp1y = p1[1] + (p2[1] - p0[1]) / 6;\n        const cp2x = p2[0] - (p3[0] - p1[0]) / 6;\n        const cp2y = p2[1] - (p3[1] - p1[1]) / 6;\n        d +=\n          ` C${cp1x.toFixed(1)},${cp1y.toFixed(1)} ${cp2x.toFixed(1)},${cp2y.toFixed(1)} ${p2[0]},${p2[1].toFixed(1)}`;\n      }\n      d += ` L${W},${H} L0,${H} Z`;\n      return d;\n    }\n\n    waves.forEach(wave => {\n      const path = wave.querySelector(\"[data-wave-path]\");\n      if (!path) return;\n\n      const amp = parseFloat(wave.getAttribute(\"data-wave-amp\")) ||\n        10; // uitslag in viewBox-units\n      const speed = parseFloat(wave.getAttribute(\"data-wave-speed\")) ||\n        0.35; // lager = rustiger\n      const step = W / (BASE.length - 1);\n\n      // Elk punt krijgt een eigen fase en snelheid, zodat het nooit synchroon beweegt\n      const phases = BASE.map((_, i) => i * 1.7);\n      const rates = BASE.map((_, i) => 1 + (i % 2 ? 0.23 : -0.17));\n\n      function render(time) {\n        const points = BASE.map((y, i) => [\n          Math.round(i * step),\n          y + Math.sin(time * speed * rates[i] + phases[i]) * amp\n        ]);\n        path.setAttribute(\"d\", buildPath(points));\n      }\n\n      // Statische vorm bij reduced motion\n      render(0);\n      if (reduceMotion) return;\n\n      let running = false;\n      const start = performance.now();\n\n      function tick() {\n        if (!running) return;\n        render((performance.now() - start) / 1000);\n        requestAnimationFrame(tick);\n      }\n\n      // Alleen animeren als de golf in beeld is\n      const observer = new IntersectionObserver(entries => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting && !running) {\n            running = true;\n            requestAnimationFrame(tick);\n          } else if (!entry.isIntersecting) {\n            running = false;\n          }\n        });\n      });\n      observer.observe(wave);\n    });\n  }\n\n  function initNumberOdometer() {\n    if (!document.querySelector('[data-odometer-group]')) return\n    const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    const initFlag = 'data-odometer-initialized'\n    const activeTweens = new WeakMap()\n\n    // Configuration\n    const defaults = {\n      duration: 1,\n      ease: 'power3.out',\n      elementStagger: 0.1,\n      digitStagger: 0.04,\n      revealDuration: 0.5,\n      revealEase: 'power2.out',\n      triggerStart: 'top 80%',\n      staggerOrder: 'left',\n      digitCycles: 2\n    }\n\n    // Scroll-triggered groups\n    document.querySelectorAll('[data-odometer-group]').forEach(group => {\n      if (group.hasAttribute(initFlag)) return\n      group.setAttribute(initFlag, '')\n\n      const elements = Array.from(group.querySelectorAll('[data-odometer-element]'))\n      if (!elements.length || prefersReducedMotion) return\n\n      const staggerOrder = group.getAttribute('data-odometer-stagger-order') || defaults\n        .staggerOrder\n      const triggerStart = group.getAttribute('data-odometer-trigger-start') || defaults\n        .triggerStart\n      const elementStagger = parseFloat(group.getAttribute('data-odometer-stagger')) || defaults\n        .elementStagger\n\n      const elementData = elements.map(el => {\n        const originalText = el.textContent.trim()\n        const hasExplicitStart = el.hasAttribute('data-odometer-start')\n        const startValue = parseFloat(el.getAttribute('data-odometer-start')) || 0\n        const duration = parseFloat(el.getAttribute('data-odometer-duration')) || defaults\n          .duration\n        const step = getLineHeightRatio(el)\n\n        let segments = parseSegments(originalText)\n        segments = mapStartDigits(segments, startValue)\n        segments = markHiddenSegments(segments, startValue)\n\n        const grow = shouldGrow(el, hasExplicitStart, startValue, segments)\n        const { rollers, revealEls } = buildRollerDOM(el, segments, step, grow)\n\n        const fontSize = parseFloat(getComputedStyle(el).fontSize)\n        const revealData = revealEls.map(revealEl => {\n          const widthEm = revealEl.offsetWidth / fontSize\n          gsap.set(revealEl, { width: 0, overflow: 'hidden' })\n          return { el: revealEl, widthEm }\n        })\n\n        return { el, rollers, duration, step, revealData, originalText }\n      })\n\n      const ordered = applyStaggerOrder(elementData, staggerOrder)\n\n      const tl = gsap.timeline({\n        scrollTrigger: {\n          trigger: group,\n          start: triggerStart,\n          once: true\n        },\n        onComplete() {\n          elementData.forEach(({ el, originalText, step }) => {\n            cleanupElement(el, originalText)\n          })\n        }\n      })\n\n      ordered.forEach((data, orderIdx) => {\n        const { rollers, duration, step, revealData } = data\n        const offset = orderIdx * elementStagger\n\n        revealData.forEach(({ el, widthEm }) => {\n          tl.to(el, {\n            width: widthEm + 'em',\n            opacity: 1,\n            duration: defaults.revealDuration,\n            ease: defaults.revealEase\n          }, offset)\n        })\n\n        rollers.forEach(({ roller, targetPos }, digitIdx) => {\n          const reversedIdx = rollers.length - 1 - digitIdx\n          tl.to(roller, {\n            y: -targetPos * step + 'em',\n            duration,\n            ease: defaults.ease,\n            force3D: true\n          }, offset + reversedIdx * defaults.digitStagger)\n        })\n      })\n    })\n\n    // Programmatic update (optional add-on)\n    return function updateOdometer(el, newText, options = {}) {\n      const currentText = el.textContent.trim()\n      if (currentText === newText) return\n\n      const duration = options.duration || defaults.duration\n      const ease = options.ease || defaults.ease\n      const step = getLineHeightRatio(el)\n\n      // Kill any running animation and clear its inline style locks\n      const existing = activeTweens.get(el)\n      if (existing) {\n        existing.kill()\n        gsap.set(el, { clearProps: 'width,overflow' })\n      }\n\n      // Measure current width before rebuilding (in em for responsive scaling)\n      const fontSize = parseFloat(getComputedStyle(el).fontSize)\n      const oldWidthEm = el.getBoundingClientRect().width / fontSize\n\n      // Parse current text as start, new text as end\n      const startSegments = parseSegments(currentText)\n      const startDigitsStr = startSegments\n        .filter(s => s.type === 'digit')\n        .map(s => s.char)\n        .join('')\n      const startValue = parseInt(startDigitsStr, 10) || 0\n\n      let segments = parseSegments(newText)\n      segments = mapStartDigits(segments, startValue)\n      segments = markHiddenSegments(segments, startValue)\n      const { rollers, revealEls } = buildRollerDOM(el, segments, step, true)\n\n      // Measure new natural width (in em)\n      const newWidthEm = el.getBoundingClientRect().width / fontSize\n      const widthChanged = Math.abs(oldWidthEm - newWidthEm) > 0.01\n\n      // Lock to old width for smooth transition\n      if (widthChanged) {\n        gsap.set(el, { width: oldWidthEm + 'em', overflow: 'hidden' })\n      }\n\n      const tl = gsap.timeline({\n        onComplete() {\n          cleanupElement(el, newText)\n          activeTweens.delete(el)\n        }\n      })\n      activeTweens.set(el, tl)\n\n      // Animate element width\n      if (widthChanged) {\n        tl.to(el, {\n          width: newWidthEm + 'em',\n          duration: defaults.revealDuration,\n          ease: defaults.revealEase\n        }, 0)\n      }\n\n      // Fade in hidden statics\n      revealEls.forEach(revealEl => {\n        if (revealEl.getAttribute('data-odometer-part') === 'static') {\n          tl.to(revealEl, { opacity: 1, duration: 0.2 }, 0)\n        }\n      })\n\n      // Roll digits\n      rollers.forEach(({ roller, targetPos }, digitIdx) => {\n        const reversedIdx = rollers.length - 1 - digitIdx\n        tl.to(roller, {\n          y: -targetPos * step + 'em',\n          duration,\n          ease,\n          force3D: true\n        }, reversedIdx * defaults.digitStagger)\n      })\n    }\n\n    // Helpers\n    function getLineHeightRatio(el) {\n      const cs = getComputedStyle(el)\n      const lh = cs.lineHeight\n      if (lh === 'normal') return 1.2\n      return parseFloat(lh) / parseFloat(cs.fontSize)\n    }\n\n    function parseSegments(text) {\n      return [...text].map(char => ({\n        type: /\\d/.test(char) ? 'digit' : 'static',\n        char\n      }))\n    }\n\n    function mapStartDigits(segments, startValue) {\n      const digitSlots = segments.filter(s => s.type === 'digit')\n      const padded = String(Math.floor(Math.abs(startValue)))\n        .padStart(digitSlots.length, '0')\n        .slice(-digitSlots.length)\n      let di = 0\n      return segments.map(s =>\n        s.type === 'digit' ? { ...s, startDigit: parseInt(padded[di++], 10) } :\n        s\n      )\n    }\n\n    function markHiddenSegments(segments, startValue) {\n      const totalDigits = segments.filter(s => s.type === 'digit').length\n      const absStart = Math.floor(Math.abs(startValue))\n      const startDigitCount = absStart === 0 ? 1 : String(absStart).length\n      const leadingZeros = Math.max(0, totalDigits - startDigitCount)\n      if (leadingZeros === 0) return segments\n      let digitsSeen = 0\n      let firstDigitSeen = false\n      let prevDigitHidden = false\n      return segments.map(seg => {\n        if (seg.type === 'digit') {\n          firstDigitSeen = true\n          const hidden = digitsSeen < leadingZeros\n          prevDigitHidden = hidden\n          digitsSeen++\n          return { ...seg, hidden }\n        }\n        const hidden = firstDigitSeen && prevDigitHidden\n        return { ...seg, hidden }\n      })\n    }\n\n    function shouldGrow(el, hasExplicitStart, startValue, segments) {\n      if (el.hasAttribute('data-odometer-grow')) {\n        return el.getAttribute('data-odometer-grow') !== 'false'\n      }\n      if (!hasExplicitStart) return false\n      const absStart = Math.floor(Math.abs(startValue))\n      const startDigitCount = absStart === 0 ? 1 : String(absStart).length\n      const endDigitCount = segments.filter(s => s.type === 'digit').length\n      return startDigitCount < endDigitCount\n    }\n\n    function buildRollerDOM(el, segments, step, grow) {\n      el.innerHTML = ''\n      el.style.height = ''\n      const rollers = []\n      const revealEls = []\n      const totalCells = 10 * defaults.digitCycles\n      segments.forEach(seg => {\n        if (seg.type === 'static') {\n          const span = document.createElement('span')\n          span.setAttribute('data-odometer-part', 'static')\n          span.style.height = step + 'em'\n          span.style.lineHeight = step\n          span.textContent = seg.char\n          el.appendChild(span)\n          if (grow && seg.hidden) {\n            gsap.set(span, { opacity: 0 })\n            revealEls.push(span)\n          }\n          return\n        }\n        const mask = document.createElement('span')\n        mask.setAttribute('data-odometer-part', 'mask')\n        mask.style.height = step + 'em'\n        mask.style.lineHeight = step\n        const roller = document.createElement('span')\n        roller.setAttribute('data-odometer-part', 'roller')\n        roller.style.lineHeight = step\n\n        const digits = []\n        for (let d = 0; d < totalCells; d++) {\n          digits.push(d % 10)\n        }\n        roller.textContent = digits.join('\\n')\n        mask.appendChild(roller)\n        el.appendChild(mask)\n        const startDigit = seg.startDigit || 0\n        const isReveal = grow && seg.hidden\n        gsap.set(roller, { y: isReveal ? step + 'em' : -startDigit * step + 'em' })\n        const endDigit = parseInt(seg.char, 10)\n        const targetPos = endDigit > startDigit ? endDigit : 10 + endDigit\n        rollers.push({ roller, targetPos })\n        if (isReveal) revealEls.push(mask)\n      })\n      return { rollers, revealEls }\n    }\n\n    function cleanupElement(el, originalText) {\n      el.style.overflow = ''\n      el.style.height = ''\n\n      // Remove rollers, set final digit, clear inline bloat (but preserve width)\n      const digits = [...originalText].filter(c => /\\d/.test(c))\n      let di = 0\n\n      el.querySelectorAll('[data-odometer-part=\"mask\"]').forEach(mask => {\n        const roller = mask.querySelector('[data-odometer-part=\"roller\"]')\n        if (roller) roller.remove()\n        mask.textContent = digits[di++] || ''\n        mask.style.opacity = ''\n        mask.style.overflow = ''\n      })\n\n      el.querySelectorAll('[data-odometer-part=\"static\"]').forEach(stat => {\n        stat.style.opacity = ''\n      })\n    }\n\n    function recalcOnResize() {\n      document.querySelectorAll('[data-odometer-element]').forEach(el => {\n        // Force-complete any running programmatic animation\n        const running = activeTweens.get(el)\n        if (running) {\n          running.progress(1)\n          activeTweens.delete(el)\n        }\n\n        const hasRollers = el.querySelector('[data-odometer-part=\"roller\"]')\n\n        if (hasRollers) {\n          // Pre-triggered: recalculate step-based inline styles\n          const step = getLineHeightRatio(el)\n          el.querySelectorAll('[data-odometer-part=\"mask\"]').forEach(mask => {\n            mask.style.height = step + 'em'\n            mask.style.lineHeight = step\n          })\n          el.querySelectorAll('[data-odometer-part=\"roller\"]').forEach(roller => {\n            roller.style.lineHeight = step\n          })\n          el.querySelectorAll('[data-odometer-part=\"static\"]').forEach(stat => {\n            stat.style.lineHeight = step\n          })\n        }\n        // Completed elements: width is em-based, scales automatically, don't touch\n      })\n      ScrollTrigger.refresh()\n    }\n\n    let resizeTimer\n    let lastWidth = window.innerWidth\n    window.addEventListener('resize', () => {\n      clearTimeout(resizeTimer)\n      resizeTimer = setTimeout(() => {\n        if (window.innerWidth === lastWidth) return\n        lastWidth = window.innerWidth\n        recalcOnResize()\n      }, 250)\n    })\n\n    function applyStaggerOrder(items, order) {\n      const arr = [...items]\n      if (order === 'right') return arr.reverse()\n      if (order === 'random') return shuffleArray(arr)\n      return arr\n    }\n\n    function shuffleArray(arr) {\n      for (let i = arr.length - 1; i > 0; i--) {\n        const j = Math.floor(Math.random() * (i + 1));\n        [arr[i], arr[j]] = [arr[j], arr[i]]\n      }\n      return arr\n    }\n  }\n\n\n  function initWavyMarquee() {\n    document.querySelectorAll('[data-wavy-marquee-init]').forEach((container) => {\n      // ---------- Instellingen ----------\n      const autoSpeed = 100; // basissnelheid (px per seconde)\n      const viewport = [\n        // [min-breedte, snelheid-schaal, golflengte-schaal]\n        [992, 1, 1],\n        [768, 0.75, 1],\n        [480, 0.6, 0.75],\n        [0, 0.5, 0.75]\n      ];\n      const scrollSpeed = 0.004; // hoeveel scrollen versnelt (lager = rustiger)\n      const scrollEase = 0.05; // hoe vloeiend de scroll-boost in/uitfadet (lager = zachter)\n      const dragSpeed = 0.5; // hoeveel slepen versnelt\n      const maxDragSpeed = 75; // maximale versnelling bij slepen\n      const dragEase = 0.1; // hoe snel slepen uitfadet\n      const waveY = 0.5; // hoogte van de golf (t.o.v. itemhoogte)\n      const waveBoost = 0; // extra golfhoogte bij snelheid (0 = altijd even hoog)\n      const itemsPerWave = 10; // hoeveel items per golf (hoger = langere, rustigere golf)\n      const waveTravel = 0; // beweegt de golf zelf mee (0 = vaste baan)\n      const pauseBuffer = 0.25; // extra marge voor pauzeren, als deel van de schermhoogte\n\n      const getViewport = () => viewport.find(([min]) => innerWidth >= min).slice(1);\n\n      container._wavyMarqueeObserver?.kill();\n      container._wavyMarqueeTrigger?.kill();\n\n      if (container._wavyMarqueeTick) gsap.ticker.remove(container._wavyMarqueeTick);\n      if (container._wavyMarqueeResize) window.removeEventListener('resize', container\n        ._wavyMarqueeResize);\n\n      const list = container.querySelector('[data-wavy-marquee-list]');\n      if (!list) return;\n\n      const originals = [...list.querySelectorAll('[data-wavy-marquee-item]')].map((item) => item\n        .cloneNode(true));\n      if (!originals.length) return;\n\n      const baseDirection = container.dataset.wavyMarqueeDirection === 'flipped' ? 1 : -1;\n      const setX = gsap.quickSetter(list, 'x', 'px');\n      const fullCircle = Math.PI * 2;\n\n      let items = [];\n      let loopWidth = 0,\n        waveLength = 0,\n        averageWidth = 1,\n        travel = 0,\n        pausePadding = 0;\n      let speed = 1,\n        targetSpeed = 1,\n        direction = baseDirection;\n      let isActive = false,\n        isDragging = false;\n      let [speedScale, waveScale] = getViewport();\n\n      // Marge boven/onder de container voordat de animatie pauzeert\n      const getPauseMargin = () => pausePadding + innerHeight * pauseBuffer;\n\n      function addBatch() {\n        const fragment = document.createDocumentFragment();\n        originals.forEach((item) => fragment.appendChild(item.cloneNode(true)));\n        list.appendChild(fragment);\n      }\n\n      function buildLoop() {\n        list.innerHTML = '';\n\n        addBatch();\n        addBatch();\n\n        const firstItems = [...list.querySelectorAll('[data-wavy-marquee-item]')];\n        loopWidth = firstItems[originals.length].offsetLeft - firstItems[0].offsetLeft;\n\n        for (let i = 2; i < Math.max(2, Math.ceil(container.offsetWidth / loopWidth) + 1); i++) {\n          addBatch();\n        }\n\n        items = [...list.querySelectorAll('[data-wavy-marquee-item]')];\n\n        const originalItems = firstItems.slice(0, originals.length);\n        averageWidth = originalItems.reduce((sum, item) => sum + item.offsetWidth, 0) / originals\n          .length;\n        waveLength = Math.max(container.offsetWidth, averageWidth * itemsPerWave) * waveScale;\n\n        let maxHeight = 0;\n\n        for (const item of items) {\n          item._x = item.offsetLeft;\n          item._width = item.offsetWidth;\n          item._height = item.offsetHeight;\n          item._setY = gsap.quickSetter(item, 'y', 'px');\n          maxHeight = Math.max(maxHeight, item._height);\n        }\n\n        pausePadding = maxHeight * (Math.abs(waveY) + 1);\n        render();\n      }\n\n      function render() {\n        if (!loopWidth || !waveLength) return;\n\n        const x = gsap.utils.wrap(-loopWidth, 0, travel);\n        const dynamicWaveY = waveY + (speed - 1) * waveBoost;\n        const phaseTravel = travel / waveLength * fullCircle * waveTravel;\n        const containerWidth = container.offsetWidth;\n\n        setX(x);\n\n        for (const item of items) {\n          const itemX = item._x + x;\n          if (itemX + item._width < 0 || itemX > containerWidth) continue;\n\n          const phase = itemX / waveLength * fullCircle + phaseTravel;\n          item._setY(Math.sin(phase) * item._height * dynamicWaveY);\n        }\n      }\n\n      function tick(_, deltaTime) {\n        if (!isActive || !loopWidth) return;\n\n        // Snelheid beweegt vloeiend naar de doel-snelheid, doel-snelheid zakt terug naar 1\n        const ease = isDragging ? dragEase : scrollEase;\n        speed += (targetSpeed - speed) * ease;\n        targetSpeed += (1 - targetSpeed) * ease;\n\n        travel += autoSpeed * speedScale * speed * direction * deltaTime / 1000;\n        render();\n      }\n\n      container._wavyMarqueeObserver = Observer.create({\n        target: container,\n        type: 'touch,pointer',\n        lockAxis: true,\n        onChangeX: (self) => {\n          if (!isActive || !self.deltaX) return;\n\n          isDragging = true;\n          container.style.cursor = 'grabbing';\n          direction = self.deltaX > 0 ? 1 : -1;\n\n          const dragAmount = Math.abs(self.deltaX) / averageWidth * 100 * dragSpeed;\n          targetSpeed = Math.min(1 + dragAmount, maxDragSpeed);\n        },\n        onRelease: () => {\n          isDragging = false;\n          container.style.cursor = 'grab';\n        }\n      });\n\n      container._wavyMarqueeTrigger = ScrollTrigger.create({\n        trigger: container,\n        start: () => `top-=${getPauseMargin()}px bottom`,\n        end: () => `bottom+=${getPauseMargin()}px top`,\n        invalidateOnRefresh: true,\n        onToggle: (self) => isActive = self.isActive,\n        onUpdate: (self) => {\n          if (isDragging) return;\n\n          direction = self.direction === 1 ? -baseDirection : baseDirection;\n          // Boost via targetSpeed, zodat het vloeiend in- en uitfadet\n          targetSpeed = Math.max(targetSpeed, 1 + Math.abs(self.getVelocity()) *\n            scrollSpeed);\n        }\n      });\n\n      buildLoop();\n      ScrollTrigger.refresh();\n\n      isActive = container._wavyMarqueeTrigger.isActive || ScrollTrigger.isInViewport(container);\n      container._wavyMarqueeTick = tick;\n      gsap.ticker.add(tick);\n\n      container._wavyMarqueeResize = debounceOnWidthChange(() => {\n        [speedScale, waveScale] = getViewport();\n        buildLoop();\n        ScrollTrigger.refresh();\n      }, 150);\n\n      window.addEventListener('resize', container._wavyMarqueeResize);\n    });\n  }\n\n  function debounceOnWidthChange(fn, ms) {\n    let last = innerWidth,\n      timer;\n    return function (...args) {\n      clearTimeout(timer);\n      timer = setTimeout(() => {\n        if (innerWidth !== last) {\n          last = innerWidth;\n          fn.apply(this, args);\n        }\n      }, ms);\n    };\n  }\n\n\n  // Laposta: custom formulier ([data-laposta-wrap]) versturen zoals Laposta's eigen validate.js:\n  // eenmalig token + rekenpuzzel (spambeveiliging), dan een gewone formulierpost in een verborgen iframe.\n  // Laposta stuurt bij een gelukte aanmelding door naar \"next\" (een adres op onze eigen site);\n  // komt het iframe daar uit, dan tonen we [data-laposta-success], anders [data-laposta-error].\n  // Vervangt het oude iframe-script in Site settings → Footer.\n\n  const LAPOSTA_DEBUG = false; // op true zetten om de stappen in de console te zien\n\n  const LAPOSTA_TEXT = {\n    loading: 'Bezig…',\n    invalid: 'Vul je e-mailadres in en kies wie je bent.',\n    error: 'Er ging iets mis. Controleer je e-mailadres en probeer het opnieuw.'\n  };\n\n  const LAPOSTA_TOKEN_PATH = '/subscribe/check/token.php';\n  const LAPOSTA_POW_PATH = '/subscribe/check/pow.js?v=260827';\n  // Doorstuuradres na een gelukte aanmelding: klein bestand op de eigen site, alleen in het iframe\n  const LAPOSTA_NEXT_URL = window.location.origin + '/robots.txt';\n\n  // Muis- of touchactiviteit op de pagina (signaal voor Laposta's botcheck)\n  let lapostaPointerSeen = false;\n  ['pointerdown', 'mousedown', 'mousemove', 'touchstart'].forEach((type) => {\n    document.addEventListener(type, (e) => {\n      if (e.isTrusted) lapostaPointerSeen = true;\n    }, { passive: true });\n  });\n\n  function initLapostaForms() {\n    const wraps = document.querySelectorAll('[data-laposta-wrap]');\n    lapostaLog(`Klaar: ${wraps.length} formulier(en) gevonden`);\n    wraps.forEach((wrap, index) => {\n      const form = wrap.querySelector('[data-laposta-form]');\n      if (!form || form.__laposta) return;\n      form.__laposta = true;\n\n      const action = new URL(form.getAttribute('action'), window.location.href);\n      const success = wrap.querySelector('[data-laposta-success]');\n      const error = wrap.querySelector('[data-laposta-error]');\n      const errorText = error ? error.querySelector('[data-laposta-error-text]') || error : null;\n      const label = form.querySelector('[data-laposta-label]');\n      const labelText = label ? label.textContent : '';\n      const honeypot = form.querySelector('[data-hp]');\n      const radios = form.querySelectorAll('input[type=\"radio\"]');\n      const openedAt = Date.now();\n      let busy = false;\n\n      // Puzzelscript pas laden als iemand het formulier gebruikt (geen extra script + cookie bij elke paginaweergave)\n      form.addEventListener('focusin', () => loadLapostaPow(action.origin).catch(() => {}), { once: true });\n\n      // Verborgen iframe: het formulier post hierin, zodat de pagina blijft staan\n      const frame = document.createElement('iframe');\n      frame.name = 'laposta-post-' + index;\n      frame.title = 'Laposta';\n      frame.tabIndex = -1;\n      frame.setAttribute('aria-hidden', 'true');\n      frame.style.cssText = 'position:absolute;width:0;height:0;border:0;visibility:hidden;';\n      wrap.appendChild(frame);\n\n      // Interactie met het formulier (signaal voor Laposta's botcheck)\n      let interacted = false;\n      let firstInteractionAt = 0;\n      ['focusin', 'input', 'keydown'].forEach((type) => {\n        form.addEventListener(type, (e) => {\n          if (!e.isTrusted || (e.target && e.target.type === 'hidden')) return;\n          interacted = true;\n          if (!firstInteractionAt) firstInteractionAt = Date.now();\n        });\n      });\n\n      // Radio tiles: checked-state als attribuut, zodat styling altijd direct meekomt\n      function syncRadios() {\n        radios.forEach((radio) => {\n          const tile = radio.closest('.radiocheck-field');\n          if (tile) tile.setAttribute('data-checked', radio.checked ? 'true' : 'false');\n        });\n      }\n      radios.forEach((radio) => radio.addEventListener('change', syncRadios));\n      syncRadios();\n\n      function reveal(el) {\n        if (!el) return;\n        el.style.display = 'block';\n        if (window.gsap) gsap.fromTo(el, { opacity: 0, y: 8 }, {\n          opacity: 1,\n          y: 0,\n          duration: 0.4,\n          ease: 'power2.out'\n        });\n      }\n\n      function hide(el) {\n        if (el) el.style.display = 'none';\n      }\n\n      function setLoading(isLoading) {\n        busy = isLoading;\n        if (label) label.textContent = isLoading ? LAPOSTA_TEXT.loading : labelText;\n        form.setAttribute('aria-busy', isLoading ? 'true' : 'false');\n        wrap.setAttribute('data-laposta-state', isLoading ? 'loading' : 'idle');\n      }\n\n      function showSuccess() {\n        form.reset();\n        syncRadios();\n        hide(form);\n        hide(error);\n        reveal(success);\n        wrap.setAttribute('data-laposta-state', 'success');\n      }\n\n      function showError(message) {\n        if (errorText) errorText.textContent = message || LAPOSTA_TEXT.error;\n        reveal(error);\n        wrap.setAttribute('data-laposta-state', 'error');\n      }\n\n      // Capture + stopImmediatePropagation: oude submit-handlers (iframe-script) draaien niet mee\n      form.addEventListener('submit', async (e) => {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        if (busy) return;\n        hide(error);\n\n        // Valideren via initAdvancedFormValidation (TESTCODE)\n        if (typeof form.__validate === 'function' && !form.__validate()) {\n          lapostaLog('Niet verstuurd: e-mail of rol niet goed ingevuld');\n          showError(LAPOSTA_TEXT.invalid);\n          return;\n        }\n\n        // Honeypot ingevuld = bot: doe alsof het gelukt is, niets versturen\n        if (honeypot && honeypot.value) {\n          showSuccess();\n          return;\n        }\n\n        setLoading(true);\n        try {\n          const ok = await sendToLaposta(form, frame, action, {\n            openedAt,\n            interacted,\n            firstInteractionAt\n          });\n          setLoading(false);\n          if (ok) showSuccess();\n          else showError();\n        } catch (err) {\n          lapostaLog('Versturen mislukt', err);\n          setLoading(false);\n          showError();\n        }\n      }, true);\n    });\n  }\n\n  async function sendToLaposta(form, frame, action, signals) {\n    const account = form.querySelector('input[name=\"a\"]');\n    const list = form.querySelector('input[name=\"l\"]');\n\n    setLapostaField(form, 'next', LAPOSTA_NEXT_URL);\n    setLapostaField(form, 'submit-duration', String(Date.now() - signals.openedAt));\n    setLapostaField(form, 'subscribe-token', '');\n    setLapostaField(form, 'subscribe-pow', '');\n\n    // Eenmalig token + rekenpuzzel, net als Laposta's validate.js\n    const token = await requestLapostaToken(action, account && account.value, list && list.value,\n      lapostaBehaviour(signals));\n    if (token) {\n      setLapostaField(form, 'subscribe-token', token.token);\n      if (token.challenge) {\n        const solution = await solveLapostaPow(token.challenge, action.origin);\n        if (solution) setLapostaField(form, 'subscribe-pow', solution);\n      }\n    }\n    lapostaLog('Verstuurt', Object.fromEntries(new FormData(form)));\n\n    return new Promise((resolve) => {\n      const timer = setTimeout(() => {\n        frame.removeEventListener('load', onLoad);\n        resolve(false);\n      }, 15000);\n\n      function onLoad() {\n        clearTimeout(timer);\n        // Doorgestuurd naar \"next\" (eigen domein) = gelukt; Laposta-pagina (ander domein) = fout\n        let landedHome = false;\n        try {\n          landedHome = frame.contentWindow.location.origin === window.location.origin;\n        } catch (err) {}\n        lapostaLog(landedHome ? 'Gelukt: doorgestuurd naar next' :\n          'Laposta toonde een eigen pagina (fout)');\n        resolve(landedHome);\n      }\n\n      frame.addEventListener('load', onLoad, { once: true });\n      form.setAttribute('target', frame.name);\n      form.submit(); // gewone post, triggert geen submit-event\n    });\n  }\n\n  function setLapostaField(form, name, value) {\n    let field = form.querySelector(`input[name=\"${name}\"]`);\n    if (!field) {\n      field = document.createElement('input');\n      field.type = 'hidden';\n      field.name = name;\n      form.appendChild(field);\n    }\n    field.value = value;\n  }\n\n  // Botcheck-signalen als \"i.p.w.c.t\", zoals validate.js ze meestuurt\n  function lapostaBehaviour(signals) {\n    const nav = window.navigator || {};\n    const headless = !!(nav.userAgent && nav.userAgent.indexOf('Chrome/') !== -1 && !window.chrome);\n    return [\n      signals.interacted ? 1 : 0,\n      lapostaPointerSeen ? 1 : 0,\n      nav.webdriver ? 1 : 0,\n      headless ? 1 : 0,\n      Math.min(signals.firstInteractionAt ? Date.now() - signals.firstInteractionAt : 0, 9999999)\n    ].join('.');\n  }\n\n  async function requestLapostaToken(action, account, list, behaviour) {\n    if (!account || !list) return null;\n    const url = new URL(LAPOSTA_TOKEN_PATH, action.origin);\n    url.searchParams.set('a', account);\n    url.searchParams.set('l', list);\n    url.searchParams.set('p', '1');\n    url.searchParams.set('b', behaviour);\n    try {\n      const res = await fetch(url, {\n        credentials: 'omit',\n        headers: { Accept: 'application/json' }\n      });\n      if (!res.ok) return null;\n      const json = await res.json();\n      lapostaLog('Token', json && json.token ? 'ontvangen' : 'geen', json && json.challenge);\n      return json && json.token ? json : null;\n    } catch (err) {\n      lapostaLog('Token mislukt', err);\n      return null;\n    }\n  }\n\n  function loadLapostaPow(origin) {\n    if (window.LapostaPow) return Promise.resolve();\n    return loadScript(origin + LAPOSTA_POW_PATH);\n  }\n\n  async function solveLapostaPow(challenge, origin) {\n    try {\n      await loadLapostaPow(origin);\n    } catch (err) {\n      return null;\n    }\n    if (!window.LapostaPow) return null;\n    return new Promise((resolve) => {\n      window.LapostaPow.solve(challenge.salt, challenge.difficulty, resolve, { maxMs: 8000 });\n    });\n  }\n\n  function lapostaLog(...args) {\n    if (LAPOSTA_DEBUG) console.log('[Laposta]', ...args);\n  }\n\n\n  // ---------- Start ----------\n\n  function init() {\n    if (window.gsap && window.Observer && window.ScrollTrigger) {\n      gsap.registerPlugin(Observer, ScrollTrigger);\n    }\n\n    // Elk onderdeel apart: een fout in het ene stopt de rest niet (namen blijven leesbaar na minify)\n    const parts = {\n      initLenis,\n      initCopyrightYear,\n      initFinsweet,\n      initFreshchat,\n      initFloatLabels,\n      initSliders,\n      initVideoButtons,\n      initLightboxLabels,\n      initSearchTerm,\n      initNavScroll,\n      initMegaNavDirectionalHover,\n      initSearchToggle,\n      initAdvancedFormValidation,\n      initVimeoBackground,\n      initHeroWave,\n      initNumberOdometer,\n      initWavyMarquee,\n      initLapostaForms,\n    };\n    Object.keys(parts).forEach((name) => {\n      try {\n        parts[name]();\n      } catch (err) {\n        console.error('[OZO] ' + name, err);\n      }\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"]}