{
  "version": 3,
  "sources": ["/cdn/shop/t/30/assets/global.js?ffs=20260831pdp1"],
  "sourcesContent": ["/* FFS_CAT_PANEL_INJECT 20260818catbox1 */\n(function(){\n  if (document.getElementById('ffs-cat-panel-inject')) return;\n  var s=document.createElement('style');\n  s.id='ffs-cat-panel-inject';\n  s.textContent='.template-index .collection-list .card,.template-index .collection-list .card--card,.template-index .collection-list .card--standard .card__inner{background:#fff!important;border:0!important;border-radius:0!important;box-shadow:none!important;}.template-index .collection-list .card>.card__content{border-top:0!important;background:#fff!important;}.template-index .collection-list .card__inner,.template-index .collection-list .card__media,.template-index .collection-list .media{background:#fff!important;}';\n  document.documentElement.appendChild(s);\n})();\n\n/* FFS deploy 20260709h \u2014 Best Sellers View all \u2192 all-flies */\n(function () {\n  window.__ffsHeroSectionRefresh = true;\n  window.__ffsHomepageHeroSlideMs = 5000;\n\n  function fixBestSellersViewAll() {\n    document\n      .querySelectorAll(\n        '.shopify-section[id$=\"__featured_collection1\"] .collection__view-all a, .shopify-section[id$=\"__ffs_best_sellers\"] .collection__view-all a'\n      )\n      .forEach(function (a) {\n        a.setAttribute('href', '/collections/all-flies');\n      });\n  }\n\n  function pickVideoUrl(video) {\n    var desktop = video.getAttribute('data-src-desktop');\n    var mobile = video.getAttribute('data-src-mobile');\n    var useDesktop = window.matchMedia('(min-width: 750px)').matches;\n    if (desktop || mobile) {\n      return useDesktop ? desktop || mobile : mobile || desktop;\n    }\n    var sources = video.querySelectorAll('source');\n    for (var i = 0; i < sources.length; i++) {\n      var media = sources[i].getAttribute('media');\n      if (!media || window.matchMedia(media).matches) {\n        return sources[i].getAttribute('src');\n      }\n    }\n    return video.getAttribute('src') || (sources[0] && sources[0].getAttribute('src'));\n  }\n\n  function markVideoReady(video) {\n    if (!video) return;\n    /* Only reveal once a real frame exists \u2014 early play() resolve used to\n       hide the poster and flash the dark media background on slow mobile. */\n    if (video.readyState >= 2 && (video.currentTime > 0 || !video.paused)) {\n      video.classList.add('is-playing', 'is-frame-ready');\n    }\n  }\n\n  function fixHeroVideos() {\n    /* Homepage slideshow is owned by SlideshowComponent \u2014 don't fight it\n       with a second load()/play() boot (that aborted the first mobile buffer). */\n    if (document.body.classList.contains('template-index') && document.querySelector('slideshow-component .slideshow__video')) {\n      return;\n    }\n    var css = document.getElementById('ffs-hero-video-css');\n    if (css) css.remove();\n\n    document.querySelectorAll('video.slideshow__video').forEach(function (video) {\n      var slide = video.closest('.slideshow__slide');\n      if (!slide || slide.getAttribute('aria-hidden') === 'true') return;\n\n      var next = pickVideoUrl(video);\n      if (!next) return;\n\n      var current = video.currentSrc || video.getAttribute('src') || '';\n      var nextFile = next.split('?')[0].split('/').pop();\n      /* Never call load() here if SlideshowComponent already owns playback \u2014\n         remounting aborts the in-flight buffer and freezes first paint. */\n      if (nextFile && current.indexOf(nextFile) === -1 && current !== next) {\n        video.querySelectorAll('source').forEach(function (s) {\n          s.remove();\n        });\n        video.setAttribute('src', next);\n      }\n\n      video.muted = true;\n      video.defaultMuted = true;\n      video.setAttribute('muted', '');\n      video.playsInline = true;\n\n      if (!video.paused && video.readyState >= 2) {\n        markVideoReady(video);\n        return;\n      }\n\n      var play = video.play();\n      if (play && play.then) {\n        play\n          .then(function () {\n            markVideoReady(video);\n            if (video.readyState < 2) {\n              video.addEventListener('loadeddata', function () { markVideoReady(video); }, { once: true });\n            }\n          })\n          .catch(function () {\n            if (video.readyState >= 2) markVideoReady(video);\n          });\n      }\n    });\n  }\n\n  function boot() {\n    fixBestSellersViewAll();\n    fixHeroVideos();\n    /* One soft retry \u2014 stacking load()/play() caused first-open hitch */\n    window.setTimeout(fixHeroVideos, 1200);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot);\n  } else {\n    boot();\n  }\n\n  document.addEventListener('shopify:section:load', function () {\n    fixBestSellersViewAll();\n    fixHeroVideos();\n  });\n})();\n\nfunction getFocusableElements(container) {\n  return Array.from(\n    container.querySelectorAll(\n      \"summary, a[href], button:enabled, [tabindex]:not([tabindex^='-']), [draggable], area, input:not([type=hidden]):enabled, select:enabled, textarea:enabled, object, iframe\"\n    )\n  );\n}\n\nclass SectionId {\n  static #separator = '__';\n\n  // for a qualified section id (e.g. 'template--22224696705326__main'), return just the section id (e.g. 'template--22224696705326')\n  static parseId(qualifiedSectionId) {\n    return qualifiedSectionId.split(SectionId.#separator)[0];\n  }\n\n  // for a qualified section id (e.g. 'template--22224696705326__main'), return just the section name (e.g. 'main')\n  static parseSectionName(qualifiedSectionId) {\n    return qualifiedSectionId.split(SectionId.#separator)[1];\n  }\n\n  // for a section id (e.g. 'template--22224696705326') and a section name (e.g. 'recommended-products'), return a qualified section id (e.g. 'template--22224696705326__recommended-products')\n  static getIdForSection(sectionId, sectionName) {\n    return `${sectionId}${SectionId.#separator}${sectionName}`;\n  }\n}\n\nclass HTMLUpdateUtility {\n  /**\n   * Used to swap an HTML node with a new node.\n   * The new node is inserted as a previous sibling to the old node, the old node is hidden, and then the old node is removed.\n   *\n   * The function currently uses a double buffer approach, but this should be replaced by a view transition once it is more widely supported https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API\n   */\n  static viewTransition(oldNode, newContent, preProcessCallbacks = [], postProcessCallbacks = []) {\n    if (!oldNode || !newContent) return;\n    preProcessCallbacks?.forEach((callback) => callback(newContent));\n\n    const newNodeWrapper = document.createElement('div');\n    HTMLUpdateUtility.setInnerHTML(newNodeWrapper, newContent.outerHTML);\n    const newNode = newNodeWrapper.firstChild;\n    if (!newNode) return;\n\n    // Replace in place. The old 500ms double-buffer left two pickers on screen\n    // (native pills + Grouptify polaroids) and read as a page stutter.\n    oldNode.replaceWith(newNode);\n    postProcessCallbacks?.forEach((callback) => callback(newNode));\n  }\n\n  // Sets inner HTML and reinjects the script tags to allow execution. By default, scripts are disabled when using element.innerHTML.\n  static setInnerHTML(element, html) {\n    element.innerHTML = html;\n    element.querySelectorAll('script').forEach((oldScriptTag) => {\n      const newScriptTag = document.createElement('script');\n      Array.from(oldScriptTag.attributes).forEach((attribute) => {\n        newScriptTag.setAttribute(attribute.name, attribute.value);\n      });\n      newScriptTag.appendChild(document.createTextNode(oldScriptTag.innerHTML));\n      oldScriptTag.parentNode.replaceChild(newScriptTag, oldScriptTag);\n    });\n  }\n}\n\ndocument.querySelectorAll('[id^=\"Details-\"] summary').forEach((summary) => {\n  summary.setAttribute('role', 'button');\n  summary.setAttribute('aria-expanded', summary.parentNode.hasAttribute('open'));\n\n  if (summary.nextElementSibling.getAttribute('id')) {\n    summary.setAttribute('aria-controls', summary.nextElementSibling.id);\n  }\n\n  summary.addEventListener('click', (event) => {\n    event.currentTarget.setAttribute('aria-expanded', !event.currentTarget.closest('details').hasAttribute('open'));\n  });\n\n  if (summary.closest('header-drawer, menu-drawer')) return;\n  summary.parentElement.addEventListener('keyup', onKeyUpEscape);\n});\n\nconst trapFocusHandlers = {};\n\nfunction trapFocus(container, elementToFocus = container) {\n  var elements = getFocusableElements(container);\n  var first = elements[0];\n  var last = elements[elements.length - 1];\n\n  removeTrapFocus();\n\n  trapFocusHandlers.focusin = (event) => {\n    if (event.target !== container && event.target !== last && event.target !== first) return;\n\n    document.addEventListener('keydown', trapFocusHandlers.keydown);\n  };\n\n  trapFocusHandlers.focusout = function () {\n    document.removeEventListener('keydown', trapFocusHandlers.keydown);\n  };\n\n  trapFocusHandlers.keydown = function (event) {\n    if (event.code.toUpperCase() !== 'TAB') return; // If not TAB key\n    // On the last focusable element and tab forward, focus the first element.\n    if (event.target === last && !event.shiftKey) {\n      event.preventDefault();\n      first.focus();\n    }\n\n    //  On the first focusable element and tab backward, focus the last element.\n    if ((event.target === container || event.target === first) && event.shiftKey) {\n      event.preventDefault();\n      last.focus();\n    }\n  };\n\n  document.addEventListener('focusout', trapFocusHandlers.focusout);\n  document.addEventListener('focusin', trapFocusHandlers.focusin);\n\n  elementToFocus.focus();\n\n  if (\n    elementToFocus.tagName === 'INPUT' &&\n    ['search', 'text', 'email', 'url'].includes(elementToFocus.type) &&\n    elementToFocus.value\n  ) {\n    elementToFocus.setSelectionRange(0, elementToFocus.value.length);\n  }\n}\n\n// Here run the querySelector to figure out if the browser supports :focus-visible or not and run code based on it.\ntry {\n  document.querySelector(':focus-visible');\n} catch (e) {\n  focusVisiblePolyfill();\n}\n\nfunction focusVisiblePolyfill() {\n  const navKeys = [\n    'ARROWUP',\n    'ARROWDOWN',\n    'ARROWLEFT',\n    'ARROWRIGHT',\n    'TAB',\n    'ENTER',\n    'SPACE',\n    'ESCAPE',\n    'HOME',\n    'END',\n    'PAGEUP',\n    'PAGEDOWN',\n  ];\n  let currentFocusedElement = null;\n  let mouseClick = null;\n\n  window.addEventListener('keydown', (event) => {\n    if (navKeys.includes(event.code.toUpperCase())) {\n      mouseClick = false;\n    }\n  });\n\n  window.addEventListener('mousedown', (event) => {\n    mouseClick = true;\n  });\n\n  window.addEventListener(\n    'focus',\n    () => {\n      if (currentFocusedElement) currentFocusedElement.classList.remove('focused');\n\n      if (mouseClick) return;\n\n      currentFocusedElement = document.activeElement;\n      currentFocusedElement.classList.add('focused');\n    },\n    true\n  );\n}\n\nfunction pauseAllMedia() {\n  document.querySelectorAll('.js-youtube').forEach((video) => {\n    video.contentWindow.postMessage('{\"event\":\"command\",\"func\":\"' + 'pauseVideo' + '\",\"args\":\"\"}', '*');\n  });\n  document.querySelectorAll('.js-vimeo').forEach((video) => {\n    video.contentWindow.postMessage('{\"method\":\"pause\"}', '*');\n  });\n  document.querySelectorAll('video').forEach((video) => {\n    // Keep collection / box-builder / homepage hero loops running\n    if (\n      video.closest('[data-ffs-kits-hero-video]') ||\n      video.closest('[data-ffs-flies-hero-video]') ||\n      video.closest('[data-ffs-box-hero-video]') ||\n      video.classList.contains('slideshow__video')\n    ) {\n      return;\n    }\n    video.pause();\n  });\n  document.querySelectorAll('product-model').forEach((model) => {\n    if (model.modelViewerUI) model.modelViewerUI.pause();\n  });\n}\n\n/** Swap stale collection-hero mp4 filenames to Safari-safe autoplay encodes. */\nfunction ffsUpgradeCollectionHeroVideos() {\n  const swaps = [\n    [/ffs-all-flies-hero(?!-v4)(?!-v3)(?!-v2)(?!-ap)\\.mp4/, 'ffs-all-flies-hero-v4-ap.mp4'],\n    [/ffs-all-flies-hero-ap\\.mp4/, 'ffs-all-flies-hero-v4-ap.mp4'],\n    [/ffs-all-flies-hero-v2(-ap)?\\.mp4/, 'ffs-all-flies-hero-v4-ap.mp4'],\n    [/ffs-all-flies-hero-v3(-ap)?\\.mp4/, 'ffs-all-flies-hero-v4-ap.mp4'],\n    [/ffs-all-flies-hero-v4(?!-ap)\\.mp4/, 'ffs-all-flies-hero-v4-ap.mp4'],\n    [/ffs-kits-hero-cine(?!-ap)\\.mp4/, 'ffs-kits-hero-scenes-v4-ap.mp4'],\n    [/ffs-kits-hero-cine-ap\\.mp4/, 'ffs-kits-hero-scenes-v4-ap.mp4'],\n    [/ffs-kits-hero-scenes-ap\\.mp4/, 'ffs-kits-hero-scenes-v4-ap.mp4'],\n    [/ffs-kits-hero-scenes-v8(-ap)?\\.mp4/, 'ffs-kits-hero-scenes-v4-ap.mp4'],\n    [/ffs-kits-hero-scenes(?!-v4-ap)[^/?#]*\\.mp4/, 'ffs-kits-hero-scenes-v4-ap.mp4'],\n    [/ffs-kits-hero-scenes-v8-poster\\.jpg/, 'ffs-kits-hero-scenes-v4-poster.jpg'],\n    [/ffs-kits-hero-scenes-poster\\.jpg/, 'ffs-kits-hero-scenes-v4-poster.jpg'],\n    [/ffs-kits-hero-cine-poster\\.jpg/, 'ffs-kits-hero-scenes-v4-poster.jpg'],\n  ];\n  const applySwaps = (src) => {\n    let next = src || '';\n    swaps.forEach(([re, name]) => {\n      if (re.test(next)) next = next.replace(re, name).replace(/(\\.mp4|\\.jpg)\\?[^#]*/i, '$1');\n    });\n    return next;\n  };\n  document\n    .querySelectorAll(\n      '[data-ffs-flies-hero-video] source, [data-ffs-kits-hero-video] source, [data-ffs-flies-hero-video] video, [data-ffs-kits-hero-video] video'\n    )\n    .forEach((el) => {\n      const attr = el.tagName === 'SOURCE' ? 'src' : el.getAttribute('src') ? 'src' : null;\n      if (!attr) return;\n      const src = el.getAttribute(attr) || '';\n      const next = applySwaps(src);\n      if (next !== src) {\n        el.setAttribute(attr, next);\n        const video = el.tagName === 'VIDEO' ? el : el.parentElement;\n        if (video && video.tagName === 'VIDEO') {\n          if (video.getAttribute('src')) video.setAttribute('src', applySwaps(video.getAttribute('src')));\n          if (video.getAttribute('poster')) video.setAttribute('poster', applySwaps(video.getAttribute('poster')));\n          video.load();\n        }\n      }\n    });\n  document.querySelectorAll('[data-ffs-kits-hero-video] video[poster]').forEach((video) => {\n    const poster = video.getAttribute('poster') || '';\n    const next = applySwaps(poster);\n    if (next !== poster) video.setAttribute('poster', next);\n  });\n}\n\n/** Force muted autoplay on all FFS hero videos (Safari-safe). */\nfunction ffsForceHeroAutoplay() {\n  if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n  ffsUpgradeCollectionHeroVideos();\n  const videos = document.querySelectorAll(\n    '[data-ffs-kits-hero-video] video, [data-ffs-flies-hero-video] video, [data-ffs-box-hero-video] video, [data-ffs-box-hero-combo] video, video.slideshow__video[autoplay], video.ffs-kits-hero-video__media, video.ffs-box-hero-combo__ui'\n  );\n  videos.forEach((video) => {\n    /* Combo hero owns play/pause while the fly deck is showing */\n    if (video.closest('[data-ffs-box-hero-combo].is-deck')) return;\n    if (video.closest('[data-ffs-box-hero-combo].is-box') && video.hasAttribute('data-ffs-box-hero-ui')) return;\n    if (video.closest('[data-ffs-box-hero-combo]:not(.is-box)') && video.hasAttribute('data-ffs-box-hero-box')) return;\n    video.muted = true;\n    video.defaultMuted = true;\n    video.volume = 0;\n    video.playsInline = true;\n    video.setAttribute('muted', '');\n    video.setAttribute('autoplay', '');\n    video.setAttribute('playsinline', '');\n    video.setAttribute('webkit-playsinline', '');\n    video.removeAttribute('controls');\n    video.controls = false;\n    const play = () => {\n      video.muted = true;\n      const p = video.play();\n      if (p && typeof p.catch === 'function') p.catch(() => {});\n    };\n    play();\n    if (video.readyState < 2) {\n      video.addEventListener('loadeddata', play, { once: true });\n      video.addEventListener('canplay', play, { once: true });\n    }\n  });\n}\n\n(function ffsBindHeroAutoplay() {\n  const run = () => ffsForceHeroAutoplay();\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', run);\n  } else {\n    run();\n  }\n  window.addEventListener('pageshow', run);\n  document.addEventListener('visibilitychange', () => {\n    if (!document.hidden) run();\n  });\n  // Safari: unlock autoplay after first user gesture if policy blocked it\n  const unlock = () => {\n    run();\n    document.removeEventListener('pointerdown', unlock, true);\n    document.removeEventListener('touchstart', unlock, true);\n    document.removeEventListener('keydown', unlock, true);\n  };\n  document.addEventListener('pointerdown', unlock, true);\n  document.addEventListener('touchstart', unlock, true);\n  document.addEventListener('keydown', unlock, true);\n  setTimeout(run, 300);\n  setTimeout(run, 1000);\n  setTimeout(run, 2500);\n})();\n\n\nfunction removeTrapFocus(elementToFocus = null) {\n  document.removeEventListener('focusin', trapFocusHandlers.focusin);\n  document.removeEventListener('focusout', trapFocusHandlers.focusout);\n  document.removeEventListener('keydown', trapFocusHandlers.keydown);\n\n  if (elementToFocus) elementToFocus.focus();\n}\n\nfunction onKeyUpEscape(event) {\n  if (event.code.toUpperCase() !== 'ESCAPE') return;\n\n  const openDetailsElement = event.target.closest('details[open]');\n  if (!openDetailsElement) return;\n\n  const summaryElement = openDetailsElement.querySelector('summary');\n  openDetailsElement.removeAttribute('open');\n  summaryElement.setAttribute('aria-expanded', false);\n  summaryElement.focus();\n}\n\nclass QuantityInput extends HTMLElement {\n  constructor() {\n    super();\n    this.input = this.querySelector('input');\n    this.changeEvent = new Event('change', { bubbles: true });\n    this.input.addEventListener('change', this.onInputChange.bind(this));\n    this.querySelectorAll('button').forEach((button) =>\n      button.addEventListener('click', this.onButtonClick.bind(this))\n    );\n  }\n\n  quantityUpdateUnsubscriber = undefined;\n\n  connectedCallback() {\n    this.validateQtyRules();\n    this.quantityUpdateUnsubscriber = subscribe(PUB_SUB_EVENTS.quantityUpdate, this.validateQtyRules.bind(this));\n  }\n\n  disconnectedCallback() {\n    if (this.quantityUpdateUnsubscriber) {\n      this.quantityUpdateUnsubscriber();\n    }\n  }\n\n  onInputChange(event) {\n    this.validateQtyRules();\n  }\n\n  onButtonClick(event) {\n    event.preventDefault();\n    const previousValue = this.input.value;\n\n    if (event.target.name === 'plus') {\n      if (parseInt(this.input.dataset.min) > parseInt(this.input.step) && this.input.value == 0) {\n        this.input.value = this.input.dataset.min;\n      } else {\n        this.input.stepUp();\n      }\n    } else {\n      this.input.stepDown();\n    }\n\n    if (previousValue !== this.input.value) this.input.dispatchEvent(this.changeEvent);\n\n    if (this.input.dataset.min === previousValue && event.target.name === 'minus') {\n      this.input.value = parseInt(this.input.min);\n    }\n  }\n\n  validateQtyRules() {\n    const value = parseInt(this.input.value);\n    if (this.input.min) {\n      const buttonMinus = this.querySelector(\".quantity__button[name='minus']\");\n      buttonMinus.classList.toggle('disabled', parseInt(value) <= parseInt(this.input.min));\n    }\n    if (this.input.max) {\n      const max = parseInt(this.input.max);\n      const buttonPlus = this.querySelector(\".quantity__button[name='plus']\");\n      buttonPlus.classList.toggle('disabled', value >= max);\n    }\n  }\n}\n\ncustomElements.define('quantity-input', QuantityInput);\n\nfunction debounce(fn, wait) {\n  let t;\n  return (...args) => {\n    clearTimeout(t);\n    t = setTimeout(() => fn.apply(this, args), wait);\n  };\n}\n\n\nfunction throttle(fn, delay) {\n  let lastCall = 0;\n  return function (...args) {\n    const now = new Date().getTime();\n    if (now - lastCall < delay) {\n      return;\n    }\n    lastCall = now;\n    return fn(...args);\n  };\n}\n\nfunction fetchConfig(type = 'json') {\n  return {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', Accept: `application/${type}` },\n  };\n}\n\n/*\n * Shopify Common JS\n *\n */\nif (typeof window.Shopify == 'undefined') {\n  window.Shopify = {};\n}\n\nShopify.bind = function (fn, scope) {\n  return function () {\n    return fn.apply(scope, arguments);\n  };\n};\n\nShopify.setSelectorByValue = function (selector, value) {\n  for (var i = 0, count = selector.options.length; i < count; i++) {\n    var option = selector.options[i];\n    if (value == option.value || value == option.innerHTML) {\n      selector.selectedIndex = i;\n      return i;\n    }\n  }\n};\n\nShopify.addListener = function (target, eventName, callback) {\n  target.addEventListener\n    ? target.addEventListener(eventName, callback, false)\n    : target.attachEvent('on' + eventName, callback);\n};\n\nShopify.postLink = function (path, options) {\n  options = options || {};\n  var method = options['method'] || 'post';\n  var params = options['parameters'] || {};\n\n  var form = document.createElement('form');\n  form.setAttribute('method', method);\n  form.setAttribute('action', path);\n\n  for (var key in params) {\n    var hiddenField = document.createElement('input');\n    hiddenField.setAttribute('type', 'hidden');\n    hiddenField.setAttribute('name', key);\n    hiddenField.setAttribute('value', params[key]);\n    form.appendChild(hiddenField);\n  }\n  document.body.appendChild(form);\n  form.submit();\n  document.body.removeChild(form);\n};\n\nShopify.CountryProvinceSelector = function (country_domid, province_domid, options) {\n  this.countryEl = document.getElementById(country_domid);\n  this.provinceEl = document.getElementById(province_domid);\n  this.provinceContainer = document.getElementById(options['hideElement'] || province_domid);\n\n  Shopify.addListener(this.countryEl, 'change', Shopify.bind(this.countryHandler, this));\n\n  this.initCountry();\n  this.initProvince();\n};\n\nShopify.CountryProvinceSelector.prototype = {\n  initCountry: function () {\n    var value = this.countryEl.getAttribute('data-default');\n    Shopify.setSelectorByValue(this.countryEl, value);\n    this.countryHandler();\n  },\n\n  initProvince: function () {\n    var value = this.provinceEl.getAttribute('data-default');\n    if (value && this.provinceEl.options.length > 0) {\n      Shopify.setSelectorByValue(this.provinceEl, value);\n    }\n  },\n\n  countryHandler: function (e) {\n    var opt = this.countryEl.options[this.countryEl.selectedIndex];\n    var raw = opt.getAttribute('data-provinces');\n    var provinces = JSON.parse(raw);\n\n    this.clearOptions(this.provinceEl);\n    if (provinces && provinces.length == 0) {\n      this.provinceContainer.style.display = 'none';\n    } else {\n      for (var i = 0; i < provinces.length; i++) {\n        var opt = document.createElement('option');\n        opt.value = provinces[i][0];\n        opt.innerHTML = provinces[i][1];\n        this.provinceEl.appendChild(opt);\n      }\n\n      this.provinceContainer.style.display = '';\n    }\n  },\n\n  clearOptions: function (selector) {\n    while (selector.firstChild) {\n      selector.removeChild(selector.firstChild);\n    }\n  },\n\n  setOptions: function (selector, values) {\n    for (var i = 0, count = values.length; i < values.length; i++) {\n      var opt = document.createElement('option');\n      opt.value = values[i];\n      opt.innerHTML = values[i];\n      selector.appendChild(opt);\n    }\n  },\n};\n\nclass MenuDrawer extends HTMLElement {\n  constructor() {\n    super();\n\n    this.mainDetailsToggle = this.querySelector('details');\n\n    this.addEventListener('keyup', this.onKeyUp.bind(this));\n    this.addEventListener('focusout', this.onFocusOut.bind(this));\n    this.bindEvents();\n  }\n\n  bindEvents() {\n    this.querySelectorAll('summary').forEach((summary) =>\n      summary.addEventListener('click', this.onSummaryClick.bind(this))\n    );\n    this.querySelectorAll(\n      'button:not(.localization-selector):not(.country-selector__close-button):not(.country-filter__reset-button):not(.menu-drawer__dismiss)'\n    ).forEach((button) => button.addEventListener('click', this.onCloseButtonClick.bind(this)));\n  }\n\n  onKeyUp(event) {\n    if (event.code.toUpperCase() !== 'ESCAPE') return;\n\n    const openDetailsElement = event.target.closest('details[open]');\n    if (!openDetailsElement) return;\n\n    openDetailsElement === this.mainDetailsToggle\n      ? this.closeMenuDrawer(event, this.mainDetailsToggle.querySelector('summary'))\n      : this.closeSubmenu(openDetailsElement);\n  }\n\n  onSummaryClick(event) {\n    const summaryElement = event.currentTarget;\n    const detailsElement = summaryElement.parentNode;\n    const parentMenuElement = detailsElement.closest('.has-submenu');\n    const isOpen = detailsElement.hasAttribute('open');\n    const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n    function addTrapFocus() {\n      trapFocus(summaryElement.nextElementSibling, detailsElement.querySelector('button'));\n      summaryElement.nextElementSibling.removeEventListener('transitionend', addTrapFocus);\n    }\n\n    if (detailsElement === this.mainDetailsToggle) {\n      if (isOpen) event.preventDefault();\n      isOpen ? this.closeMenuDrawer(event, summaryElement) : this.openMenuDrawer(summaryElement);\n\n      if (window.matchMedia('(max-width: 990px)')) {\n        document.documentElement.style.setProperty('--viewport-height', `${window.innerHeight}px`);\n      }\n    } else {\n      setTimeout(() => {\n        detailsElement.classList.add('menu-opening');\n        summaryElement.setAttribute('aria-expanded', true);\n        parentMenuElement && parentMenuElement.classList.add('submenu-open');\n        !reducedMotion || reducedMotion.matches\n          ? addTrapFocus()\n          : summaryElement.nextElementSibling.addEventListener('transitionend', addTrapFocus);\n      }, 100);\n    }\n  }\n\n  openMenuDrawer(summaryElement) {\n    setTimeout(() => {\n      this.mainDetailsToggle.classList.add('menu-opening');\n    });\n    summaryElement.setAttribute('aria-expanded', true);\n    trapFocus(this.mainDetailsToggle, summaryElement);\n    document.body.classList.add(`overflow-hidden-${this.dataset.breakpoint}`);\n  }\n\n  closeMenuDrawer(event, elementToFocus = false) {\n    if (event === undefined) return;\n\n    this.mainDetailsToggle.classList.remove('menu-opening');\n    this.mainDetailsToggle.querySelectorAll('details').forEach((details) => {\n      details.removeAttribute('open');\n      details.classList.remove('menu-opening');\n    });\n    this.mainDetailsToggle.querySelectorAll('.submenu-open').forEach((submenu) => {\n      submenu.classList.remove('submenu-open');\n    });\n    document.body.classList.remove(`overflow-hidden-${this.dataset.breakpoint}`);\n    removeTrapFocus(elementToFocus);\n    this.closeAnimation(this.mainDetailsToggle);\n\n    if (event instanceof KeyboardEvent) elementToFocus?.setAttribute('aria-expanded', false);\n  }\n\n  onFocusOut() {\n    setTimeout(() => {\n      if (this.mainDetailsToggle.hasAttribute('open') && !this.mainDetailsToggle.contains(document.activeElement))\n        this.closeMenuDrawer();\n    });\n  }\n\n  onCloseButtonClick(event) {\n    const detailsElement = event.currentTarget.closest('details');\n    this.closeSubmenu(detailsElement);\n  }\n\n  closeSubmenu(detailsElement) {\n    const parentMenuElement = detailsElement.closest('.submenu-open');\n    parentMenuElement && parentMenuElement.classList.remove('submenu-open');\n    detailsElement.classList.remove('menu-opening');\n    detailsElement.querySelector('summary').setAttribute('aria-expanded', false);\n    removeTrapFocus(detailsElement.querySelector('summary'));\n    this.closeAnimation(detailsElement);\n  }\n\n  closeAnimation(detailsElement) {\n    let animationStart;\n\n    const handleAnimation = (time) => {\n      if (animationStart === undefined) {\n        animationStart = time;\n      }\n\n      const elapsedTime = time - animationStart;\n\n      if (elapsedTime < 400) {\n        window.requestAnimationFrame(handleAnimation);\n      } else {\n        detailsElement.removeAttribute('open');\n        if (detailsElement.closest('details[open]')) {\n          trapFocus(detailsElement.closest('details[open]'), detailsElement.querySelector('summary'));\n        }\n      }\n    };\n\n    window.requestAnimationFrame(handleAnimation);\n  }\n}\n\ncustomElements.define('menu-drawer', MenuDrawer);\n\nclass HeaderDrawer extends MenuDrawer {\n  constructor() {\n    super();\n    this.querySelectorAll('.menu-drawer__dismiss').forEach((btn) => {\n      btn.addEventListener('click', (event) => {\n        event.preventDefault();\n        event.stopPropagation();\n        if (this.mainDetailsToggle.hasAttribute('open')) {\n          this.closeMenuDrawer(event, this.mainDetailsToggle.querySelector('summary'));\n        }\n      });\n    });\n\n    /* Tap the dimmed overlay (summary::before) to close without choosing a link */\n    this.mainDetailsToggle?.querySelector('summary')?.addEventListener('click', (event) => {\n      if (!this.mainDetailsToggle.hasAttribute('open')) return;\n      const summary = event.currentTarget;\n      const box = summary.getBoundingClientRect();\n      const inIcon =\n        event.clientX >= box.left &&\n        event.clientX <= box.right &&\n        event.clientY >= box.top &&\n        event.clientY <= box.bottom;\n      /* Overlay clicks still hit summary; native handler already closes when open */\n      if (!inIcon) {\n        summary.setAttribute('aria-expanded', 'false');\n      }\n    });\n  }\n\n  openMenuDrawer(summaryElement) {\n    this.header = this.header || document.querySelector('.section-header');\n    this.borderOffset =\n      this.borderOffset || this.closest('.header-wrapper').classList.contains('header-wrapper--border-bottom') ? 1 : 0;\n    document.documentElement.style.setProperty(\n      '--header-bottom-position',\n      `${parseInt(this.header.getBoundingClientRect().bottom - this.borderOffset)}px`\n    );\n    this.header.classList.add('menu-open');\n\n    setTimeout(() => {\n      this.mainDetailsToggle.classList.add('menu-opening');\n    });\n\n    summaryElement.setAttribute('aria-expanded', true);\n    window.addEventListener('resize', this.onResize);\n    trapFocus(this.mainDetailsToggle, summaryElement);\n    document.body.classList.add(`overflow-hidden-${this.dataset.breakpoint}`);\n  }\n\n  closeMenuDrawer(event, elementToFocus) {\n    if (!elementToFocus) return;\n    super.closeMenuDrawer(event, elementToFocus);\n    this.header.classList.remove('menu-open');\n    window.removeEventListener('resize', this.onResize);\n  }\n\n  onResize = () => {\n    this.header &&\n      document.documentElement.style.setProperty(\n        '--header-bottom-position',\n        `${parseInt(this.header.getBoundingClientRect().bottom - this.borderOffset)}px`\n      );\n    document.documentElement.style.setProperty('--viewport-height', `${window.innerHeight}px`);\n  };\n}\n\ncustomElements.define('header-drawer', HeaderDrawer);\n\nclass ModalDialog extends HTMLElement {\n  constructor() {\n    super();\n    this.querySelector('[id^=\"ModalClose-\"]').addEventListener('click', this.hide.bind(this, false));\n    this.addEventListener('keyup', (event) => {\n      if (event.code.toUpperCase() === 'ESCAPE') this.hide();\n    });\n    if (this.classList.contains('media-modal')) {\n      this.addEventListener('pointerup', (event) => {\n        if (event.pointerType === 'mouse' && !event.target.closest('deferred-media, product-model')) this.hide();\n      });\n    } else {\n      this.addEventListener('click', (event) => {\n        if (event.target === this) this.hide();\n      });\n    }\n  }\n\n  connectedCallback() {\n    if (this.moved) return;\n    this.moved = true;\n    this.dataset.section = this.closest('.shopify-section').id.replace('shopify-section-', '');\n    document.body.appendChild(this);\n  }\n\n  show(opener) {\n    this.openedBy = opener;\n    const popup = this.querySelector('.template-popup');\n    document.body.classList.add('overflow-hidden');\n    this.setAttribute('open', '');\n    if (popup) popup.loadContent();\n    trapFocus(this, this.querySelector('[role=\"dialog\"]'));\n    window.pauseAllMedia();\n  }\n\n  hide() {\n    document.body.classList.remove('overflow-hidden');\n    document.body.dispatchEvent(new CustomEvent('modalClosed'));\n    this.removeAttribute('open');\n    removeTrapFocus(this.openedBy);\n    window.pauseAllMedia();\n  }\n}\ncustomElements.define('modal-dialog', ModalDialog);\n\nclass BulkModal extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  loadContent() {\n    if (this.innerHTML.trim() !== '') return Promise.resolve();\n    if (this._loading) return this._loading;\n\n    const productUrl = (this.dataset.url || '').split('?')[0];\n    if (!productUrl) return Promise.resolve();\n\n    this._loading = fetch(`${productUrl}?section_id=bulk-quick-order-list`)\n      .then((response) => response.text())\n      .then((responseText) => {\n        const html = new DOMParser().parseFromString(responseText, 'text/html');\n        const sourceQty = html.querySelector('.quick-order-list-container')?.parentNode;\n        if (sourceQty) this.innerHTML = sourceQty.innerHTML;\n      })\n      .catch((e) => {\n        console.error(e);\n      })\n      .finally(() => {\n        this._loading = null;\n      });\n\n    return this._loading;\n  }\n\n  connectedCallback() {\n    const trigger = document.querySelector(\n      `#QuickBulk-${this.dataset.productId}-${this.dataset.sectionId}`\n    );\n\n    if (trigger) {\n      const handleIntersection = (entries, observer) => {\n        if (!entries[0].isIntersecting) return;\n        observer.unobserve(trigger);\n        this.loadContent();\n      };\n\n      new IntersectionObserver(handleIntersection.bind(this)).observe(trigger);\n    }\n\n    /* Related products re-fetch moves modals to body before the hover trigger\n       intersects \u2014 load as soon as the dialog opens so Quick View isn't empty. */\n    const parentModal = this.closest('modal-dialog');\n    if (parentModal) {\n      this._openObserver = new MutationObserver(() => {\n        if (parentModal.hasAttribute('open')) this.loadContent();\n      });\n      this._openObserver.observe(parentModal, { attributes: true, attributeFilter: ['open'] });\n    }\n  }\n\n  disconnectedCallback() {\n    this._openObserver?.disconnect();\n  }\n}\n\ncustomElements.define('bulk-modal', BulkModal);\n\nclass ModalOpener extends HTMLElement {\n  constructor() {\n    super();\n\n    const button = this.querySelector('button');\n\n    if (!button) return;\n    button.addEventListener('click', () => {\n      const selector = this.getAttribute('data-modal');\n      /* Prefer the last match \u2014 product-recommendations can leave stale\n         modal-dialogs on body with the same id after an AJAX refresh. */\n      const modals = document.querySelectorAll(selector);\n      const modal = modals[modals.length - 1];\n      if (modal) modal.show(button);\n    });\n  }\n}\ncustomElements.define('modal-opener', ModalOpener);\n\nclass DeferredMedia extends HTMLElement {\n  constructor() {\n    super();\n    const poster = this.querySelector('[id^=\"Deferred-Poster-\"]');\n    if (!poster) return;\n    poster.addEventListener('click', this.loadContent.bind(this));\n  }\n\n  loadContent(focus = true) {\n    window.pauseAllMedia();\n    if (!this.getAttribute('loaded')) {\n      const content = document.createElement('div');\n      content.appendChild(this.querySelector('template').content.firstElementChild.cloneNode(true));\n\n      this.setAttribute('loaded', true);\n      const deferredElement = this.appendChild(content.querySelector('video, model-viewer, iframe'));\n      if (focus) deferredElement.focus();\n      if (deferredElement.nodeName == 'VIDEO' && deferredElement.getAttribute('autoplay')) {\n        // force autoplay for safari\n        deferredElement.play();\n      }\n\n      // Workaround for safari iframe bug\n      const formerStyle = deferredElement.getAttribute('style');\n      deferredElement.setAttribute('style', 'display: block;');\n      window.setTimeout(() => {\n        deferredElement.setAttribute('style', formerStyle);\n      }, 0);\n    }\n  }\n}\n\ncustomElements.define('deferred-media', DeferredMedia);\n\nclass SliderComponent extends HTMLElement {\n  constructor() {\n    super();\n    this.slider = this.querySelector('[id^=\"Slider-\"]');\n    this.sliderItems = this.querySelectorAll('[id^=\"Slide-\"]');\n    this.enableSliderLooping = false;\n    this.currentPageElement = this.querySelector('.slider-counter--current');\n    this.pageTotalElement = this.querySelector('.slider-counter--total');\n    this.prevButton = this.querySelector('button[name=\"previous\"]');\n    this.nextButton = this.querySelector('button[name=\"next\"]');\n\n    if (!this.slider || !this.nextButton) return;\n\n    this.initPages();\n    const resizeObserver = new ResizeObserver((entries) => this.initPages());\n    resizeObserver.observe(this.slider);\n\n    this.slider.addEventListener('scroll', this.update.bind(this));\n    this.prevButton.addEventListener('click', this.onButtonClick.bind(this));\n    this.nextButton.addEventListener('click', this.onButtonClick.bind(this));\n  }\n\n  initPages() {\n    this.sliderItemsToShow = Array.from(this.sliderItems).filter((element) => element.clientWidth > 0);\n    if (this.sliderItemsToShow.length < 2) return;\n    this.sliderItemOffset = this.sliderItemsToShow[1].offsetLeft - this.sliderItemsToShow[0].offsetLeft;\n    this.slidesPerPage = Math.floor(\n      (this.slider.clientWidth - this.sliderItemsToShow[0].offsetLeft) / this.sliderItemOffset\n    );\n    this.totalPages = this.sliderItemsToShow.length - this.slidesPerPage + 1;\n    this.update();\n  }\n\n  resetPages() {\n    this.sliderItems = this.querySelectorAll('[id^=\"Slide-\"]');\n    this.initPages();\n  }\n\n  update() {\n    // Temporarily prevents unneeded updates resulting from variant changes\n    // This should be refactored as part of https://github.com/Shopify/dawn/issues/2057\n    if (!this.slider || !this.nextButton) return;\n\n    const previousPage = this.currentPage;\n    this.currentPage = Math.round(this.slider.scrollLeft / this.sliderItemOffset) + 1;\n\n    if (this.currentPageElement && this.pageTotalElement) {\n      this.currentPageElement.textContent = this.currentPage;\n      this.pageTotalElement.textContent = this.totalPages;\n    }\n\n    if (this.currentPage != previousPage) {\n      this.dispatchEvent(\n        new CustomEvent('slideChanged', {\n          detail: {\n            currentPage: this.currentPage,\n            currentElement: this.sliderItemsToShow[this.currentPage - 1],\n          },\n        })\n      );\n    }\n\n    if (this.enableSliderLooping) return;\n\n    if (this.isSlideVisible(this.sliderItemsToShow[0]) && this.slider.scrollLeft === 0) {\n      this.prevButton.setAttribute('disabled', 'disabled');\n    } else {\n      this.prevButton.removeAttribute('disabled');\n    }\n\n    if (this.isSlideVisible(this.sliderItemsToShow[this.sliderItemsToShow.length - 1])) {\n      this.nextButton.setAttribute('disabled', 'disabled');\n    } else {\n      this.nextButton.removeAttribute('disabled');\n    }\n  }\n\n  isSlideVisible(element, offset = 0) {\n    const lastVisibleSlide = this.slider.clientWidth + this.slider.scrollLeft - offset;\n    return element.offsetLeft + element.clientWidth <= lastVisibleSlide && element.offsetLeft >= this.slider.scrollLeft;\n  }\n\n  onButtonClick(event) {\n    event.preventDefault();\n    const step = event.currentTarget.dataset.step || 1;\n    this.slideScrollPosition =\n      event.currentTarget.name === 'next'\n        ? this.slider.scrollLeft + step * this.sliderItemOffset\n        : this.slider.scrollLeft - step * this.sliderItemOffset;\n    this.setSlidePosition(this.slideScrollPosition);\n  }\n\n  setSlidePosition(position) {\n    this.slider.scrollTo({\n      left: position,\n    });\n  }\n}\n\ncustomElements.define('slider-component', SliderComponent);\n\nclass SlideshowCinematic {\n  constructor(container) {\n    this.container = container;\n    this.frames = Array.from(container.querySelectorAll('.slideshow__cinematic-frame'));\n    this.duration = parseInt(container.dataset.cinematicDuration, 10) || 2300;\n    this.loop = container.dataset.cinematicLoop !== 'false';\n    this.index = 0;\n    this.timer = null;\n    this.running = false;\n    this.reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  }\n\n  start() {\n    if (this.frames.length === 0) return;\n    this.stop();\n    this.running = true;\n    this.container.classList.add('is-js-ready');\n\n    this.frames.forEach((frame, index) => {\n      frame.classList.remove('is-exiting', 'is-entering');\n      frame.classList.toggle('is-active', index === 0);\n      frame.querySelectorAll('video').forEach((video) => {\n        video.classList.remove('is-frame-ready', 'is-playing');\n      });\n    });\n    this.index = 0;\n\n    requestAnimationFrame(() => {\n      this.frames[0]?.classList.add('is-entering');\n      this.playFrameMedia(this.frames[0]);\n    });\n\n    if (this.frames.length > 1 && !this.reducedMotion) {\n      this.scheduleNext();\n    }\n  }\n\n  stop() {\n    this.running = false;\n    if (this.timer) {\n      window.clearTimeout(this.timer);\n      this.timer = null;\n    }\n    this.frames.forEach((frame) => this.pauseFrameMedia(frame));\n    this.container.classList.remove('is-js-ready');\n    this.frames.forEach((frame, index) => {\n      frame.classList.remove('is-exiting', 'is-entering', 'is-active');\n      if (index === 0) frame.classList.add('is-active');\n    });\n    this.index = 0;\n  }\n\n  getFrameDuration(frame) {\n    const custom = parseInt(frame?.dataset?.frameDuration, 10);\n    if (!Number.isNaN(custom) && custom > 0) return custom;\n    return this.duration;\n  }\n\n  playFrameMedia(frame) {\n    if (!frame) return;\n    const video = frame.querySelector('video');\n    if (!video) return;\n    video.classList.remove('is-frame-ready', 'is-playing');\n    video.currentTime = 0;\n    if (video.preload === 'none' || video.networkState === HTMLMediaElement.NETWORK_EMPTY) {\n      video.load();\n    }\n\n    const reveal = () => video.classList.add('is-frame-ready');\n    if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) reveal();\n    else video.addEventListener('loadeddata', reveal, { once: true });\n\n    const playPromise = video.play();\n    if (playPromise !== undefined) {\n      playPromise\n        .then(() => video.classList.add('is-playing'))\n        .catch(() => {});\n    }\n  }\n\n  pauseFrameMedia(frame) {\n    if (!frame) return;\n    frame.querySelectorAll('video').forEach((video) => {\n      video.pause();\n      video.currentTime = 0;\n      video.classList.remove('is-frame-ready', 'is-playing');\n    });\n  }\n\n  resetFrames() {\n    this.frames.forEach((frame, index) => {\n      frame.classList.remove('is-exiting', 'is-entering');\n      frame.classList.toggle('is-active', index === 0);\n    });\n    this.index = 0;\n  }\n\n  activateFrame(index) {\n    const frame = this.frames[index];\n    if (!frame) return;\n\n    frame.classList.add('is-active');\n    requestAnimationFrame(() => {\n      frame.classList.add('is-entering');\n    });\n    this.index = index;\n  }\n\n  next() {\n    if (!this.loop && this.index >= this.frames.length - 1) return;\n\n    const current = this.frames[this.index];\n    const nextIndex = this.loop ? (this.index + 1) % this.frames.length : this.index + 1;\n    const next = this.frames[nextIndex];\n    if (!next) return;\n\n    this.pauseFrameMedia(current);\n    current.classList.remove('is-entering');\n    current.classList.add('is-exiting');\n\n    next.classList.add('is-active');\n    requestAnimationFrame(() => {\n      next.classList.add('is-entering');\n      this.playFrameMedia(next);\n    });\n\n    window.setTimeout(() => {\n      current.classList.remove('is-active', 'is-exiting');\n    }, 420);\n\n    this.index = nextIndex;\n  }\n\n  scheduleNext() {\n    const current = this.frames[this.index];\n    this.timer = window.setTimeout(() => {\n      if (!this.running) return;\n      if (!this.loop && this.index >= this.frames.length - 1) return;\n      this.next();\n      if (!this.loop && this.index >= this.frames.length - 1) return;\n      this.scheduleNext();\n    }, this.getFrameDuration(current));\n  }\n}\n\nclass SlideshowComponent extends SliderComponent {\n  constructor() {\n    super();\n    this.sliderControlWrapper = this.querySelector('.slider-buttons');\n    this.enableSliderLooping = true;\n\n    if (!this.sliderControlWrapper) return;\n\n    this.sliderFirstItemNode = this.slider.querySelector('.slideshow__slide');\n    this.currentPage = 1;\n    this.crossfadeMode = this.slider?.classList.contains('ffs-slideshow--crossfade');\n    // Always set \u2014 homepage hero has no announcement-bar slider, and setAutoPlay\n    // used to throw on undefined.reducedMotion.matches (auto-rotate never started).\n    this.reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n    this.announcementBarSlider = this.querySelector('.announcement-bar-slider');\n    // Keep JS cleanup in sync with --duration-announcement-bar\n    const announcementDuration = parseFloat(\n      getComputedStyle(document.documentElement).getPropertyValue('--duration-announcement-bar')\n    );\n    this.announcerBarAnimationDelay = this.announcementBarSlider\n      ? (Number.isFinite(announcementDuration) && announcementDuration > 0 ? announcementDuration : 900)\n      : 0;\n\n    this.sliderControlLinksArray = Array.from(this.sliderControlWrapper.querySelectorAll('.slider-counter__link'));\n    this.sliderControlLinksArray.forEach((link) => link.addEventListener('click', this.linkToSlide.bind(this)));\n    this.slider.addEventListener('scroll', this.setSlideVisibility.bind(this));\n\n    if (this.isHomepageHero()) {\n      this.dataset.ffsHeroController = 'true';\n      this._heroMediaQuery = window.matchMedia('(min-width: 750px)');\n      this._heroMediaChange = () => {\n        this.cancelHomepageHeroTransition();\n        this.querySelectorAll('.slideshow__video').forEach((video) => {\n          video._ffsHeroPlayback?.cancel();\n        });\n        const video = this.getSlideshowItems()[this.getActiveSlideIndex()]?.querySelector('.slideshow__video');\n        if (video) this.restartHeroVideoFromStart(video);\n        if (this.autoplayActive) this.scheduleAutoplay();\n      };\n      this._heroMediaQuery.addEventListener('change', this._heroMediaChange);\n    }\n\n    this.setupSlideshowVideos();\n    this.setupCinematicSequences();\n\n    if (this.announcementBarSlider) {\n      this.announcementBarArrowButtonWasClicked = false;\n\n      this.reducedMotion.addEventListener('change', () => {\n        if (this.slider.getAttribute('data-autoplay') === 'true') this.setAutoPlay();\n      });\n\n      [this.prevButton, this.nextButton].forEach((button) => {\n        button.addEventListener(\n          'click',\n          () => {\n            this.announcementBarArrowButtonWasClicked = true;\n          },\n          { once: true }\n        );\n      });\n    }\n\n    if (this.slider.getAttribute('data-autoplay') === 'true') this.setAutoPlay();\n    this.initCrossfadeClass();\n    this.bootActiveSlide();\n  }\n\n  isAnnouncementSlider() {\n    return !!(this.announcementBarSlider || this.slider?.closest('.announcement-bar-slider'));\n  }\n\n  initCrossfadeClass() {\n    if (!this.slider || !document.body.classList.contains('template-index')) return;\n    if (this.isAnnouncementSlider()) return;\n    if (!this.slider.classList.contains('ffs-slideshow--crossfade')) {\n      this.slider.classList.add('ffs-slideshow--crossfade');\n      this.crossfadeMode = true;\n    }\n  }\n\n  isHomepageHero() {\n    return !!this.closest('[id*=\"__ffs_homepage_hero\"], [id*=\"__ffs_hp_hero\"]');\n  }\n\n  loadHomepageHeroPoster(video) {\n    this.getSlideVideoPosters(video).forEach((poster) => {\n      poster.querySelectorAll('source[data-srcset]').forEach((source) => {\n        source.srcset = source.dataset.srcset;\n        delete source.dataset.srcset;\n      });\n      poster.querySelectorAll('img[data-src]').forEach((img) => {\n        img.loading = 'eager';\n        img.src = img.dataset.src;\n        delete img.dataset.src;\n      });\n    });\n  }\n\n  cancelHomepageHeroTransition() {\n    const pending = this._heroTransition;\n    this._heroTransition = null;\n    if (pending) {\n      pending.video?._ffsHeroPlayback?.cancel();\n      pending.video?.pause();\n    }\n  }\n\n  restartHeroVideoFromStart(video) {\n    this.playHomepageHeroVideo(video, true);\n  }\n\n  playHomepageHeroVideo(video, restart = false, onReady) {\n    if (!video || !this.isConnected) return;\n    this.dataset.ffsHeroController = 'true';\n    this.loadHomepageHeroPoster(video);\n    const changed = this.resolveSlideVideoSource(video);\n    if (!restart && !changed && video._ffsHeroPlayback) return;\n    video._ffsHeroPlayback?.cancel();\n    video.preload = 'auto';\n    video.muted = video.defaultMuted = true;\n    video.playsInline = true;\n    video.loop = false;\n    video.removeAttribute('loop');\n    video.removeAttribute('autoplay');\n    video.dataset.ffsHeroHold = '1';\n\n    const wanted = () => this.isConnected && video._ffsHeroPlayback === playback &&\n      (video.closest('.slideshow__slide')?.getAttribute('aria-hidden') === 'false' ||\n        this._heroTransition?.video === video);\n    const cancel = () => {\n      ['playing', 'timeupdate', 'loadeddata', 'seeked', 'canplay'].forEach((type) => video.removeEventListener(type, check));\n      if (video._ffsHeroPlayback === playback) delete video._ffsHeroPlayback;\n    };\n    const playback = { cancel };\n    video._ffsHeroPlayback = playback;\n    let playPending = false;\n    const check = () => {\n      if (!wanted()) { cancel(); return; }\n      if (video.seeking) return;\n      if (!video.paused && video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && video.currentTime > 0) {\n        video.classList.add('is-playing', 'is-frame-ready');\n        this.hideSlideVideoPosters(video);\n        cancel();\n        if (onReady) onReady();\n        return;\n      }\n      if (video.paused && !video.ended && !playPending) {\n        playPending = true;\n        const promise = video.play();\n        if (promise) promise.then(() => { playPending = false; check(); }).catch(() => {\n          playPending = false;\n          if (wanted()) this.armSlideVideoGestureRetry(video);\n        });\n        else playPending = false;\n      }\n    };\n    ['playing', 'timeupdate', 'loadeddata', 'seeked', 'canplay'].forEach((type) => video.addEventListener(type, check));\n    if (changed || video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {\n      video.classList.remove('is-playing', 'is-frame-ready');\n      this.showSlideVideoPosters(video);\n    }\n    if (restart && (video.currentTime > 0.05 || video.ended)) {\n      video.classList.remove('is-playing', 'is-frame-ready');\n      this.showSlideVideoPosters(video);\n      try { video.currentTime = this.getVideoStartTime(video); } catch (_) {}\n    }\n    // A finished active clip keeps its final frame until the next is ready.\n    if (!restart && video.ended) { cancel(); return; }\n    check();\n  }\n\n  disconnectedCallback() {\n    if (!this.isHomepageHero()) return;\n    this.pause();\n    clearTimeout(this._heroWarmTimeout);\n    this._heroMediaQuery?.removeEventListener('change', this._heroMediaChange);\n    this.querySelectorAll('.slideshow__video').forEach((video) => {\n      video._ffsHeroPlayback?.cancel();\n      video.pause();\n    });\n  }\n\n  clearHomepageHeroAdvance() {\n    if (this._heroEndedBinding?.video && this._heroEndedBinding?.onEnded) {\n      this._heroEndedBinding.video.removeEventListener('ended', this._heroEndedBinding.onEnded);\n    }\n    if (this._heroEndedBinding?.armTimer) {\n      this._heroEndedBinding.video.removeEventListener('playing', this._heroEndedBinding.armTimer);\n      this._heroEndedBinding.video.removeEventListener('seeked', this._heroEndedBinding.armTimer);\n    }\n    this._heroEndedBinding = null;\n    clearTimeout(this._heroWarmTimeout);\n    this._heroWarmCleanup?.();\n  }\n\n  invalidateHomepageHeroAdvance() {\n    this._heroAdvanceToken = null;\n    this.clearHomepageHeroAdvance();\n  }\n\n  scheduleHomepageHeroAdvance() {\n    const video = this.getSlideshowItems()[this.getActiveSlideIndex()]?.querySelector('.slideshow__video');\n    const holdPage = this.currentPage;\n    const advanceToken = Symbol('hero-advance');\n    this._heroAdvanceToken = advanceToken;\n    const valid = () => this.isConnected && this.autoplayActive &&\n      this._heroAdvanceToken === advanceToken && this.currentPage === holdPage;\n    const advance = () => {\n      if (!valid()) return;\n      this.invalidateHomepageHeroAdvance();\n      clearTimeout(this.autoplayTimeout);\n      clearTimeout(this.prefetchTimeout);\n      this.autoRotateSlides(() => this.scheduleAutoplay());\n    };\n    if (!video) {\n      this.autoplayTimeout = window.setTimeout(advance, Math.max(this.getSlideDuration(holdPage - 1), 2000));\n      return;\n    }\n    video.loop = false;\n    video.removeAttribute('loop');\n    const onEnded = () => advance();\n    video.addEventListener('ended', onEnded);\n    const armTimer = () => {\n      if (!valid()) return;\n      clearTimeout(this.autoplayTimeout);\n      if (video.ended) { advance(); return; }\n      if (video.paused || video.seeking || !Number.isFinite(video.duration) || video.duration <= 0) return;\n      const early = Math.max(0, parseFloat(video.dataset.advanceEarly || 0) || 0);\n      const remaining = Math.max(0.5, video.duration - early) - video.currentTime;\n      if (early > 0 && remaining <= 0.04) { advance(); return; }\n      this.autoplayTimeout = window.setTimeout(armTimer, Math.max(100, remaining * 1000 + (early ? 0 : 100)));\n    };\n    video.addEventListener('playing', armTimer);\n    video.addEventListener('seeked', armTimer);\n    this._heroEndedBinding = { video, onEnded, armTimer };\n    armTimer();\n    this.armWarmNextWhenActiveReady();\n  }\n\n  initPages() {\n    if (this.crossfadeMode || this.isAnnouncementSlider()) {\n      this.sliderItems = this.querySelectorAll('[id^=\"Slide-\"]');\n      this.sliderItemsToShow = Array.from(this.sliderItems);\n      this.sliderItemOffset = this.slider?.clientWidth || 1;\n      this.totalPages = this.sliderItemsToShow.length;\n      this.slidesPerPage = 1;\n\n      if (this.currentPageElement && this.pageTotalElement) {\n        this.currentPageElement.textContent = this.currentPage || 1;\n        this.pageTotalElement.textContent = this.totalPages;\n      }\n\n      this.bootActiveSlide();\n      return;\n    }\n\n    super.initPages();\n    this.bootActiveSlide();\n  }\n\n  getSlideItemOffset() {\n    if (this.crossfadeMode) {\n      return this.slider?.clientWidth || this.sliderItemOffset || 1;\n    }\n\n    if (this.sliderItemOffset > 0) return this.sliderItemOffset;\n\n    const items = this.getSlideshowItems();\n    if (items.length >= 2) {\n      const measured = items[1].offsetLeft - items[0].offsetLeft;\n      if (measured > 0) return measured;\n    }\n\n    const firstItem = items[0];\n    if (firstItem?.clientWidth > 0) return firstItem.clientWidth;\n\n    return this.slider?.clientWidth || 0;\n  }\n\n  getSlideshowItems() {\n    return Array.from(this.sliderItems || []);\n  }\n\n  getActiveSlideIndex() {\n    const items = this.getSlideshowItems();\n    if (!items.length) return 0;\n\n    if (this.crossfadeMode || this.isAnnouncementSlider()) {\n      return Math.min(Math.max((this.currentPage || 1) - 1, 0), items.length - 1);\n    }\n\n    const offset = this.getSlideItemOffset();\n    if (offset > 0) {\n      const index = Math.round(this.slider.scrollLeft / offset);\n      return Math.min(Math.max(index, 0), items.length - 1);\n    }\n\n    return Math.max(0, (this.currentPage || 1) - 1);\n  }\n\n  bootActiveSlide() {\n    if (!this.slider) return;\n    this.currentPage = this.getActiveSlideIndex() + 1;\n    this.setSlideVisibility();\n    window.requestAnimationFrame(() => this.setSlideVisibility());\n    window.setTimeout(() => this.setSlideVisibility(), 150);\n    window.setTimeout(() => this.setSlideVisibility(), 400);\n  }\n\n  triggerCinematicText(slide) {\n    const cinematicText = slide?.querySelector('.slideshow__text--cinematic');\n    if (!cinematicText) return;\n    cinematicText.classList.remove('is-entering');\n    requestAnimationFrame(() => cinematicText.classList.add('is-entering'));\n  }\n\n  setupCinematicSequences() {\n    this.cinematicSequences = new Map();\n    this.querySelectorAll('[data-cinematic-sequence]').forEach((container) => {\n      const slide = container.closest('.slideshow__slide');\n      if (slide) {\n        this.cinematicSequences.set(slide, new SlideshowCinematic(container));\n      }\n    });\n  }\n\n  setupSlideshowVideos() {\n    this.querySelectorAll('.slideshow__video[data-trim-start], .slideshow__video[data-trim-end]').forEach((video) => {\n      if (video.dataset.trimBound) return;\n      video.dataset.trimBound = 'true';\n\n      const trimStart = parseFloat(video.dataset.trimStart || 0);\n      const trimEnd = parseFloat(video.dataset.trimEnd || 0);\n\n      const enforceTrim = () => {\n        if (!video.duration || Number.isNaN(video.duration)) return;\n        const endTime = video.duration - trimEnd;\n        if (video.currentTime < trimStart || (trimEnd > 0 && video.currentTime >= endTime)) {\n          video.currentTime = trimStart;\n        }\n      };\n\n      video.addEventListener('loadedmetadata', enforceTrim);\n      video.addEventListener('timeupdate', enforceTrim);\n    });\n\n    const items = this.getSlideshowItems();\n    const activeIndex = this.getActiveSlideIndex();\n    const homepageHero = this.isHomepageHero();\n\n    this.querySelectorAll('.slideshow__video').forEach((video) => {\n      video.muted = true;\n      video.defaultMuted = true;\n      video.playsInline = true;\n      video.setAttribute('muted', '');\n      video.setAttribute('playsinline', '');\n      video.setAttribute('autoplay', '');\n      /* Homepage: play each clip once start\u2192end (no mid-cut / mid-join). */\n      if (homepageHero) {\n        video.loop = false;\n        video.removeAttribute('loop');\n      } else {\n        video.loop = true;\n      }\n\n      const slide = video.closest('.slideshow__slide');\n      const isActive = items.indexOf(slide) === activeIndex;\n\n      if (homepageHero) {\n        video.removeAttribute('autoplay');\n        if (isActive) this.playHomepageHeroVideo(video);\n        else video.preload = 'none';\n        return;\n      }\n\n      if (this.crossfadeMode || isActive) {\n        /* Crossfade: keep clips decoding under the fade so swaps stay video\u2192video. */\n        video.preload = 'auto';\n        this.resolveSlideVideoSource(video);\n        if (video.networkState === HTMLMediaElement.NETWORK_EMPTY || video.readyState === 0) {\n          video.load();\n        }\n        if (homepageHero && isActive) this.restartHeroVideoFromStart(video);\n        else this.playSlideVideo(video);\n      } else {\n        video.preload = 'none';\n      }\n    });\n\n    if (homepageHero) return;\n    if (this.crossfadeMode) {\n      this.armHeroVideosPrimed();\n    } else {\n      const activeSlide = items[activeIndex];\n      const activeVideo = activeSlide?.querySelector('.slideshow__video');\n      if (activeVideo) this.playSlideVideo(activeVideo);\n    }\n  }\n\n  armHeroVideosPrimed() {\n    const mark = () => {\n      const videos = Array.from(this.querySelectorAll('.slideshow__video'));\n      if (!videos.length) return;\n      const ready = videos.every(\n        (v) => !v.paused && v.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && v.currentTime > 0\n      );\n      videos.forEach((v) => {\n        if (v.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && v.currentTime > 0) {\n          v.classList.add('is-playing', 'is-frame-ready');\n          this.hideSlideVideoPosters(v);\n        }\n      });\n      if (ready) {\n        this.slider?.classList.add('is-primed');\n        this.classList.add('is-primed');\n        return;\n      }\n      window.setTimeout(mark, 200);\n    };\n    mark();\n  }\n\n  getVideoStartTime(video) {\n    const trimStart = parseFloat(video?.dataset?.trimStart || 0);\n    return Number.isNaN(trimStart) ? 0 : trimStart;\n  }\n\n  armSlideVideoGestureRetry(video) {\n    // play() was rejected by autoplay policy; retry on the first real user\n    // interaction, which grants activation. One shot per video.\n    if (video.dataset.ffsGestureRetry) return;\n    video.dataset.ffsGestureRetry = '1';\n    const retry = () => {\n      ['pointerdown', 'touchend', 'keydown'].forEach((t) => document.removeEventListener(t, retry, true));\n      if (this.isConnected && video.paused &&\n        (video.closest('.slideshow__slide')?.getAttribute('aria-hidden') === 'false' ||\n          (this.autoplayActive && this._heroTransition?.video === video))) {\n        video.play().catch(() => {});\n      }\n      delete video.dataset.ffsGestureRetry;\n    };\n    ['pointerdown', 'touchend', 'keydown'].forEach((t) => document.addEventListener(t, retry, true));\n  }\n\n  resolveSlideVideoSource(video) {\n    if (!video) return false;\n\n    let desktop = video.dataset.srcDesktop;\n    let mobile = video.dataset.srcMobile;\n\n    if (!desktop && !mobile) {\n      const sources = Array.from(video.querySelectorAll('source'));\n      if (sources.length > 1) {\n        const useDesktop = window.matchMedia('(min-width: 750px)').matches;\n        for (const source of sources) {\n          const media = source.getAttribute('media');\n          if (!media || window.matchMedia(media).matches) {\n            const picked = source.getAttribute('src');\n            if (picked) {\n              if (useDesktop) desktop = picked;\n              else mobile = picked;\n              break;\n            }\n          }\n        }\n      }\n    }\n\n    if (!desktop && !mobile) return false;\n\n    const useDesktop = window.matchMedia('(min-width: 750px)').matches;\n    const next = useDesktop ? desktop || mobile : mobile || desktop;\n    if (!next) return false;\n\n    const current = video.getAttribute('src') || video.querySelector('source')?.getAttribute('src') || '';\n    const currentFile = (current || '').split('?')[0].split('/').pop();\n    const nextFile = next.split('?')[0].split('/').pop();\n    if (current === next || (currentFile && nextFile && currentFile === nextFile)) return false;\n\n    if (this.isHomepageHero()) {\n      video._ffsHeroPlayback?.cancel();\n      video.classList.remove('is-playing', 'is-frame-ready');\n      this.showSlideVideoPosters(video);\n    }\n    video.querySelectorAll('source').forEach((source) => source.remove());\n    video.setAttribute('src', next);\n    video.load();\n    return true;\n  }\n\n  getSlideVideoPosters(video) {\n    const media = video?.closest('.slideshow__media--video');\n    if (!media) return [];\n    return Array.from(media.querySelectorAll('.slideshow__video-poster'));\n  }\n\n  showSlideVideoPosters(video) {\n    if (this.crossfadeMode && !this.isHomepageHero()) {\n      this.hideSlideVideoPosters(video);\n      return;\n    }\n    this.getSlideVideoPosters(video).forEach((poster) => {\n      poster.style.opacity = '1';\n      poster.style.visibility = 'visible';\n    });\n  }\n\n  hideSlideVideoPosters(video) {\n    this.getSlideVideoPosters(video).forEach((poster) => {\n      poster.style.opacity = '0';\n      poster.style.visibility = 'hidden';\n    });\n  }\n\n  markSlideVideoVisible(video) {\n    const revealFrame = () => {\n      if (video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) return;\n      video.classList.add('is-frame-ready');\n      if (video.currentTime > 0 || !video.paused) this.hideSlideVideoPosters(video);\n    };\n    const revealPlaying = () => {\n      if (video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) return;\n      video.classList.add('is-playing');\n      video.classList.add('is-frame-ready');\n      this.hideSlideVideoPosters(video);\n    };\n\n    if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && video.currentTime > 0) revealFrame();\n    else video.addEventListener('loadeddata', revealFrame, { once: true });\n\n    if (!video.paused && video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && video.currentTime > 0) {\n      revealPlaying();\n      return;\n    }\n\n    video.addEventListener('playing', revealPlaying, { once: true });\n\n    const onTime = () => {\n      if (video.currentTime > 0) {\n        revealPlaying();\n        video.removeEventListener('timeupdate', onTime);\n      }\n    };\n    video.addEventListener('timeupdate', onTime);\n  }\n\n  resetSlideVideo(video) {\n    // Crossfade hero: NEVER pause / NEVER show posters on hidden slides.\n    // Slide 2 used to lack [autoplay], so this path paused it and forced the\n    // poster \u2014 the image\u2192video\u2192image glitch on every swap.\n    if (this.crossfadeMode) return;\n    video.classList.remove('is-playing');\n    video.classList.remove('is-frame-ready');\n    video.pause();\n    video.currentTime = 0;\n    video.preload = 'none';\n    this.showSlideVideoPosters(video);\n  }\n\n  playSlideVideo(video) {\n    if (!video) return;\n    if (this.isHomepageHero()) {\n      this.playHomepageHeroVideo(video);\n      return;\n    }\n\n    this.resolveSlideVideoSource(video);\n    video.preload = 'auto';\n\n    video.muted = true;\n    video.defaultMuted = true;\n    video.playsInline = true;\n    video.setAttribute('muted', '');\n    video.setAttribute('playsinline', '');\n\n    /* Homepage: never auto-replay a finished clip (that was the slide-2 rewind glitch). */\n    if (this.isHomepageHero() && video.ended) {\n      return;\n    }\n\n    /* Already looping with frames \u2014 never flash poster mid-crossfade */\n    if (!video.paused && video.currentTime > 0 && !video.ended && video.readyState >= 2) {\n      video.classList.add('is-playing', 'is-frame-ready');\n      this.hideSlideVideoPosters(video);\n      return;\n    }\n\n    /* Crossfade: if we already decoded frames, keep them on screen and just play.\n       Showing the poster here is the main visible glitch between 3s slides. */\n    if (this.crossfadeMode && video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n      video.classList.add('is-playing', 'is-frame-ready');\n      this.hideSlideVideoPosters(video);\n      if (video.paused && !video.ended) {\n        video.play().catch(() => this.armSlideVideoGestureRetry(video));\n      }\n      return;\n    }\n\n    if (!this.crossfadeMode) {\n      this.showSlideVideoPosters(video);\n      video.classList.remove('is-playing', 'is-frame-ready');\n    }\n\n    this.markSlideVideoVisible(video);\n\n    const start = this.getVideoStartTime(video);\n\n    const revealWhenFramed = () => {\n      if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && (video.currentTime > 0 || !video.paused)) {\n        video.classList.add('is-playing', 'is-frame-ready');\n        this.hideSlideVideoPosters(video);\n        return true;\n      }\n      return false;\n    };\n\n    const beginPlayback = () => {\n      if (video.readyState >= HTMLMediaElement.HAVE_METADATA && start > 0) {\n        video.currentTime = start;\n      }\n\n      const playPromise = video.play();\n      if (playPromise !== undefined) {\n        playPromise\n          .then(() => {\n            if (!revealWhenFramed()) {\n              video.addEventListener('loadeddata', () => revealWhenFramed(), { once: true });\n              video.addEventListener('timeupdate', () => revealWhenFramed(), { once: true });\n            }\n          })\n          .catch(() => {\n            this.showSlideVideoPosters(video);\n            this.armSlideVideoGestureRetry(video);\n          });\n      } else {\n        revealWhenFramed();\n      }\n    };\n\n    const ensureReady = () => {\n      if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n        beginPlayback();\n        return;\n      }\n\n      const onReady = () => beginPlayback();\n      video.addEventListener('loadeddata', onReady, { once: true });\n      video.addEventListener('canplay', onReady, { once: true });\n\n      /* Avoid load() restart if the browser is already fetching this src */\n      if (video.networkState === HTMLMediaElement.NETWORK_EMPTY) {\n        video.load();\n      }\n    };\n\n    ensureReady();\n\n    [400, 1200, 2400].forEach((delay) => {\n      window.setTimeout(() => {\n        if (video.ended) return;\n        if (this.isHomepageHero() && video.dataset.ffsHeroHold !== '1') return;\n        if (video.paused && video.closest('.slideshow__slide')?.getAttribute('aria-hidden') === 'false') {\n          beginPlayback();\n        }\n      }, delay);\n    });\n  }\n\n  setAutoPlay() {\n    // Homepage hero: respect per-slide data-slide-duration (river/packs 5s, etc.)\n    if (this.closest('[id*=\"__ffs_homepage_hero\"], [id*=\"__ffs_hp_hero\"]')) {\n      this.autoplaySpeed = (parseFloat(this.slider.dataset.speed) || 5) * 1000;\n    } else {\n      this.autoplaySpeed = this.slider.dataset.speed * 1000;\n    }\n    this.autoplayActive = true;\n    if (!this.autoplayHoverBound && !this.isHomepageHero() && !this.isAnnouncementSlider()) {\n      this.autoplayHoverBound = true;\n      this.addEventListener('mouseover', this.focusInHandling.bind(this));\n      this.addEventListener('mouseleave', this.focusOutHandling.bind(this));\n      this.addEventListener('focusin', this.focusInHandling.bind(this));\n      this.addEventListener('focusout', this.focusOutHandling.bind(this));\n    }\n\n    if (this.querySelector('.slideshow__autoplay')) {\n      this.sliderAutoplayButton = this.querySelector('.slideshow__autoplay');\n      this.sliderAutoplayButton.addEventListener('click', this.autoPlayToggle.bind(this));\n      this.autoplayButtonIsSetToPlay = true;\n      this.play();\n    } else {\n      this.reducedMotion?.matches || this.announcementBarArrowButtonWasClicked ? this.pause() : this.play();\n    }\n\n    // Wait until the active hero has real frames before warming slide 2 \u2014\n    // early prefetch on mobile starved slide 1 and froze the first paint.\n    this.armWarmNextWhenActiveReady();\n  }\n\n  getSlideDuration(slideIndex) {\n    const slide = this.getSlideshowItems()[slideIndex];\n    const duration = parseFloat(slide?.dataset?.slideDuration);\n    if (!Number.isNaN(duration) && duration > 0) return duration * 1000;\n    if (this.closest('[id*=\"__ffs_homepage_hero\"], [id*=\"__ffs_hp_hero\"]')) return this.autoplaySpeed || 5000;\n    return this.autoplaySpeed || 5000;\n  }\n\n  activeHeroHasFrames() {\n    const items = this.getSlideshowItems();\n    const active = items[this.getActiveSlideIndex()];\n    const video = active?.querySelector('.slideshow__video');\n    if (!video) return true;\n    return video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && video.currentTime > 0;\n  }\n\n  armWarmNextWhenActiveReady() {\n    if (this.isHomepageHero()) {\n      clearTimeout(this._heroWarmTimeout);\n      this._heroWarmCleanup?.();\n      const token = this._heroAdvanceToken;\n      const video = this.getSlideshowItems()[this.getActiveSlideIndex()]?.querySelector('.slideshow__video');\n      const cleanup = () => {\n        video?.removeEventListener('playing', tryWarm);\n        video?.removeEventListener('timeupdate', tryWarm);\n        document.removeEventListener('visibilitychange', tryWarm);\n        if (this._heroWarmCleanup === cleanup) this._heroWarmCleanup = null;\n      };\n      const tryWarm = () => {\n        if (!this.isConnected || !this.autoplayActive || this._heroAdvanceToken !== token) { cleanup(); return; }\n        if (document.hidden || !this.activeHeroHasFrames()) return;\n        cleanup();\n        this._heroWarmTimeout = window.setTimeout(() => {\n          if (!this.isConnected || !this.autoplayActive || this._heroAdvanceToken !== token) return;\n          if (document.hidden) { this.armWarmNextWhenActiveReady(); return; }\n          this.warmNextSlideVideo();\n        }, window.matchMedia('(max-width: 749px)').matches ? 600 : 350);\n      };\n      this._heroWarmCleanup = cleanup;\n      video?.addEventListener('playing', tryWarm);\n      video?.addEventListener('timeupdate', tryWarm);\n      document.addEventListener('visibilitychange', tryWarm);\n      tryWarm();\n      return;\n    }\n    const tryWarm = () => {\n      if (!this.autoplayActive) return;\n      if (!this.activeHeroHasFrames()) {\n        window.setTimeout(tryWarm, 250);\n        return;\n      }\n      /* Once slide 1 has frames, start the next clip behind it so the\n         crossfade is video\u2192video, never poster flash. */\n      this.warmNextSlideVideo(true);\n    };\n    window.setTimeout(tryWarm, window.matchMedia('(max-width: 749px)').matches ? 600 : 350);\n  }\n\n  warmNextSlideVideo(forcePlay = false) {\n    const items = this.getSlideshowItems();\n    if (!items.length) return;\n    const nextIndex = this.currentPage >= items.length ? 0 : this.currentPage;\n    const video = items[nextIndex]?.querySelector('.slideshow__video');\n    if (!video) return;\n    if (this.isHomepageHero()) {\n      // Fetch the next clip only after the active clip has frames. Do not play\n      // or rewind it beneath the outgoing fade; start it at transition time.\n      this.loadHomepageHeroPoster(video);\n      video.removeAttribute('autoplay');\n      video.preload = 'auto';\n      this.resolveSlideVideoSource(video);\n      return;\n    }\n    this.resolveSlideVideoSource(video);\n    video.preload = 'auto';\n    video.muted = true;\n    video.defaultMuted = true;\n    video.playsInline = true;\n    video.setAttribute('muted', '');\n    video.setAttribute('playsinline', '');\n    /* Keep hidden slides decoding under the fade for a glitch-free swap */\n    if (!(this.crossfadeMode && (forcePlay || video.hasAttribute('autoplay')))) return;\n\n    if (this.isHomepageHero()) {\n      video.loop = false;\n      video.removeAttribute('loop');\n      /* Warm next from the start so the fade-in is clean \u2014 but only the\n         upcoming slide; never rewind the outgoing/active clip. */\n      try {\n        if (video.ended || video.currentTime > 0.15) video.currentTime = 0;\n      } catch (_) {}\n    }\n\n    const markReady = () => {\n      if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA && video.currentTime > 0) {\n        video.classList.add('is-playing', 'is-frame-ready');\n        this.hideSlideVideoPosters(video);\n        return true;\n      }\n      return false;\n    };\n\n    const ensurePlay = () => {\n      if (markReady() && !video.paused) return;\n      if (video.ended) {\n        try {\n          video.currentTime = 0;\n        } catch (_) {}\n      }\n      const playPromise = video.play();\n      if (playPromise !== undefined) {\n        playPromise.then(() => markReady()).catch(() => {});\n      }\n    };\n\n    if (video.networkState === HTMLMediaElement.NETWORK_EMPTY || video.readyState === 0) {\n      video.load();\n    }\n    video.addEventListener('playing', markReady, { once: true });\n    video.addEventListener('canplay', ensurePlay, { once: true });\n    ensurePlay();\n    [200, 600, 1200].forEach((delay) => {\n      window.setTimeout(() => {\n        if (video.paused || video.currentTime === 0) ensurePlay();\n      }, delay);\n    });\n  }\n\n  scheduleAutoplay() {\n    if (!this.autoplayActive) return;\n    clearTimeout(this.autoplayTimeout);\n    clearTimeout(this.prefetchTimeout);\n    this.invalidateHomepageHeroAdvance();\n\n    /* Homepage hero: hold each slide for the full video length (no mid-cut). */\n    if (this.isHomepageHero()) {\n      this.slideHoldStartedAt = Date.now();\n      this.scheduleHomepageHeroAdvance();\n      return;\n    }\n\n    this.autoplayGeneration = (this.autoplayGeneration || 0) + 1;\n    const token = this.autoplayGeneration;\n\n    /* Prefer per-slide duration; never allow a sub-second timer (NaN/0 fired instantly). */\n    let duration = this.getSlideDuration(this.currentPage - 1);\n    if (!Number.isFinite(duration) || duration < 2000) duration = this.autoplaySpeed || 3000;\n    /* Re-warm next clip mid-hold so the swap always has live frames */\n    const prefetchAt = Math.max(duration - 1100, Math.min(duration * 0.45, 1400));\n    this.slideHoldStartedAt = Date.now();\n    this.prefetchTimeout = window.setTimeout(() => {\n      if (this.autoplayActive && token === this.autoplayGeneration) this.warmNextSlideVideo(true);\n    }, prefetchAt);\n    this.autoplayTimeout = window.setTimeout(() => {\n      if (!this.autoplayActive || token !== this.autoplayGeneration) return;\n      /* Enforce minimum hold so mobile never jumps off slide 1 early */\n      const held = Date.now() - (this.slideHoldStartedAt || Date.now());\n      const remaining = duration - held;\n      if (remaining > 120) {\n        this.autoplayTimeout = window.setTimeout(() => {\n          if (!this.autoplayActive || token !== this.autoplayGeneration) return;\n          this.warmNextSlideVideo(true);\n          this.autoRotateSlides(() => this.scheduleAutoplay());\n        }, remaining);\n        return;\n      }\n      this.warmNextSlideVideo(true);\n      this.autoRotateSlides(() => this.scheduleAutoplay());\n    }, duration);\n  }\n\n  onButtonClick(event) {\n    if (this.isHomepageHero()) this.cancelHomepageHeroTransition();\n    if (this.crossfadeMode || this.isAnnouncementSlider()) {\n      this.wasClicked = true;\n      const direction = event.currentTarget.name === 'previous' ? 'previous' : 'next';\n      if (this.isAnnouncementSlider()) this.applyAnimationToAnnouncementBar(direction);\n      const items = this.getSlideshowItems();\n      if (direction === 'next') {\n        this.currentPage = this.currentPage >= items.length ? 1 : this.currentPage + 1;\n      } else {\n        this.currentPage = this.currentPage <= 1 ? items.length : this.currentPage - 1;\n      }\n      this.setSlideVisibility();\n      this.update();\n      return;\n    }\n\n    super.onButtonClick(event);\n    this.wasClicked = true;\n\n    const isFirstSlide = this.currentPage === 1;\n    const isLastSlide = this.currentPage === this.sliderItemsToShow.length;\n\n    if (!isFirstSlide && !isLastSlide) {\n      this.applyAnimationToAnnouncementBar(event.currentTarget.name);\n      return;\n    }\n\n    if (isFirstSlide && event.currentTarget.name === 'previous') {\n      this.slideScrollPosition =\n        this.slider.scrollLeft + this.sliderFirstItemNode.clientWidth * this.sliderItemsToShow.length;\n    } else if (isLastSlide && event.currentTarget.name === 'next') {\n      this.slideScrollPosition = 0;\n    }\n\n    this.setSlidePosition(this.slideScrollPosition);\n\n    this.applyAnimationToAnnouncementBar(event.currentTarget.name);\n  }\n\n  setSlidePosition(position) {\n    if (this.isAnnouncementSlider()) return;\n    if (this.setPositionTimeout) clearTimeout(this.setPositionTimeout);\n    this.setPositionTimeout = setTimeout(() => {\n      this.slider.scrollTo({\n        left: position,\n      });\n      window.requestAnimationFrame(() => this.setSlideVisibility());\n      window.setTimeout(() => this.setSlideVisibility(), 100);\n      window.setTimeout(() => this.setSlideVisibility(), 350);\n    }, this.announcerBarAnimationDelay);\n  }\n\n  update() {\n    if (this.crossfadeMode || this.isAnnouncementSlider()) {\n      this.sliderItemsToShow = Array.from(this.sliderItems || []);\n      this.sliderItemOffset = this.slider?.clientWidth || 1;\n\n      if (this.currentPageElement && this.pageTotalElement) {\n        this.currentPageElement.textContent = this.currentPage;\n        this.pageTotalElement.textContent = this.sliderItemsToShow.length;\n      }\n    } else {\n      const offset = this.getSlideItemOffset();\n      if (offset > 0) {\n        this.sliderItemOffset = offset;\n      }\n      super.update();\n    }\n\n    this.sliderControlButtons = this.querySelectorAll('.slider-counter__link');\n    /* Crossfade stacks every slide as \"visible\", so SliderComponent.update()\n       disables next \u2014 keep both arrows active for looping heroes. */\n    this.prevButton?.removeAttribute('disabled');\n    this.nextButton?.removeAttribute('disabled');\n\n    if (!this.sliderControlButtons.length) return;\n\n    this.sliderControlButtons.forEach((link) => {\n      link.classList.remove('slider-counter__link--active');\n      link.removeAttribute('aria-current');\n    });\n    this.sliderControlButtons[this.currentPage - 1].classList.add('slider-counter__link--active');\n    this.sliderControlButtons[this.currentPage - 1].setAttribute('aria-current', true);\n\n    if (this.autoplayActive && !this.isAnnouncementSlider()) {\n      clearTimeout(this.autoplayTimeout);\n      this.scheduleAutoplay();\n    }\n  }\n\n  autoPlayToggle() {\n    this.togglePlayButtonState(this.autoplayButtonIsSetToPlay);\n    this.autoplayButtonIsSetToPlay ? this.pause() : this.play();\n    this.autoplayButtonIsSetToPlay = !this.autoplayButtonIsSetToPlay;\n  }\n\n  focusOutHandling(event) {\n    /* Homepage hero: never pause/resume on hover \u2014 it restarts the 3s timer and feels glitchy */\n    if (this.crossfadeMode && this.closest('[id*=\"__ffs_homepage_hero\"], [id*=\"__ffs_hp_hero\"]')) return;\n    if (this.sliderAutoplayButton) {\n      const focusedOnAutoplayButton =\n        event.target === this.sliderAutoplayButton || this.sliderAutoplayButton.contains(event.target);\n      if (!this.autoplayButtonIsSetToPlay || focusedOnAutoplayButton) return;\n      this.play();\n    } else if (!this.reducedMotion?.matches && !this.announcementBarArrowButtonWasClicked) {\n      this.play();\n    }\n  }\n\n  focusInHandling(event) {\n    if (this.crossfadeMode && this.closest('[id*=\"__ffs_homepage_hero\"], [id*=\"__ffs_hp_hero\"]')) return;\n    if (this.sliderAutoplayButton) {\n      const focusedOnAutoplayButton =\n        event.target === this.sliderAutoplayButton || this.sliderAutoplayButton.contains(event.target);\n      if (focusedOnAutoplayButton && this.autoplayButtonIsSetToPlay) {\n        this.play();\n      } else if (this.autoplayButtonIsSetToPlay) {\n        this.pause();\n      }\n    } else if (this.announcementBarSlider?.contains(event.target)) {\n      this.pause();\n    }\n  }\n\n  play() {\n    this.slider.setAttribute('aria-live', 'off');\n    clearInterval(this.autoplay);\n    clearTimeout(this.autoplayTimeout);\n    this.autoplayActive = true;\n    this.scheduleAutoplay();\n  }\n\n  pause() {\n    this.slider.setAttribute('aria-live', 'polite');\n    clearInterval(this.autoplay);\n    clearTimeout(this.autoplayTimeout);\n    clearTimeout(this.prefetchTimeout);\n    this.invalidateHomepageHeroAdvance();\n    this.autoplayGeneration = (this.autoplayGeneration || 0) + 1;\n    this.autoplayActive = false;\n    if (this.isHomepageHero()) this.cancelHomepageHeroTransition();\n  }\n\n  togglePlayButtonState(pauseAutoplay) {\n    if (pauseAutoplay) {\n      this.sliderAutoplayButton.classList.add('slideshow__autoplay--paused');\n      this.sliderAutoplayButton.setAttribute('aria-label', window.accessibilityStrings.playSlideshow);\n    } else {\n      this.sliderAutoplayButton.classList.remove('slideshow__autoplay--paused');\n      this.sliderAutoplayButton.setAttribute('aria-label', window.accessibilityStrings.pauseSlideshow);\n    }\n  }\n\n  autoRotateSlides(done) {\n    const items = this.getSlideshowItems();\n    const finish = () => {\n      if (typeof done === 'function') done();\n    };\n\n    if (this.crossfadeMode && this.isHomepageHero()) {\n      if (!this.autoplayActive || !this.isConnected || items.length < 2 || this._heroTransition) return;\n      const fromPage = this.currentPage;\n      const nextIndex = fromPage >= items.length ? 0 : fromPage;\n      const nextVideo = items[nextIndex]?.querySelector('.slideshow__video');\n      const pending = { video: nextVideo, fromPage };\n      this._heroTransition = pending;\n      const commit = () => {\n        if (this._heroTransition !== pending || !this.autoplayActive || !this.isConnected || this.currentPage !== fromPage) return;\n        this._heroTransition = null;\n        this._heroPreparedVideo = nextVideo;\n        this.currentPage = nextIndex + 1;\n        this.setSlideVisibility();\n        this.update();\n        finish();\n      };\n      // No timeout can force an unready frame onscreen. A failed/blocked next\n      // clip leaves the outgoing frame visible; manual controls still work.\n      if (nextVideo) this.playHomepageHeroVideo(nextVideo, true, commit);\n      else commit();\n      return;\n    }\n\n    if (this.crossfadeMode) {\n      const nextIndex = this.currentPage >= items.length ? 0 : this.currentPage;\n      const nextVideo = items[nextIndex]?.querySelector('.slideshow__video');\n      const commit = () => {\n        this.currentPage = nextIndex + 1;\n        this.setSlideVisibility();\n        this.update();\n        finish();\n      };\n\n      /* Fade only after the next clip has real frames \u2014 prevents poster pop */\n      if (nextVideo && this.autoplayActive) {\n        this.resolveSlideVideoSource(nextVideo);\n        nextVideo.preload = 'auto';\n        nextVideo.muted = true;\n        nextVideo.defaultMuted = true;\n        nextVideo.playsInline = true;\n        if (this.isHomepageHero()) {\n          nextVideo.loop = false;\n          nextVideo.removeAttribute('loop');\n          try {\n            nextVideo.currentTime = 0;\n          } catch (_) {}\n        }\n        if (nextVideo.paused || nextVideo.ended) nextVideo.play().catch(() => {});\n        let tries = 0;\n        const waitForFrames = () => {\n          const nearStart = !this.isHomepageHero() || nextVideo.currentTime < 0.45;\n          const ready =\n            !nextVideo.paused &&\n            nextVideo.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n            nextVideo.currentTime > 0 &&\n            nearStart;\n          if (ready || tries >= 16) {\n            if (this.isHomepageHero()) {\n              try {\n                if (nextVideo.currentTime > 0.2) nextVideo.currentTime = 0;\n              } catch (_) {}\n            }\n            if (!nextVideo.paused || nextVideo.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n              nextVideo.classList.add('is-playing', 'is-frame-ready');\n              this.hideSlideVideoPosters(nextVideo);\n            }\n            commit();\n            return;\n          }\n          tries += 1;\n          window.setTimeout(waitForFrames, 40);\n        };\n        waitForFrames();\n        return;\n      }\n\n      commit();\n      return;\n    }\n\n    if (this.isAnnouncementSlider()) {\n      this.applyAnimationToAnnouncementBar('next');\n      this.currentPage = this.currentPage >= items.length ? 1 : this.currentPage + 1;\n      this.setSlideVisibility();\n      this.update();\n      finish();\n      return;\n    }\n\n    const offset = this.getSlideItemOffset();\n    const nextIndex = this.currentPage >= items.length ? 0 : this.currentPage;\n    const slideScrollPosition = nextIndex * offset;\n\n    this.currentPage = nextIndex + 1;\n    this.setSlidePosition(slideScrollPosition);\n    this.applyAnimationToAnnouncementBar();\n    finish();\n  }\n\n  setSlideVisibility(event) {\n    const items = this.getSlideshowItems();\n    const activeIndex = this.getActiveSlideIndex();\n    this.currentPage = activeIndex + 1;\n\n    items.forEach((item, index) => {\n      const linkElements = item.querySelectorAll('a');\n      const video = item.querySelector('.slideshow__video');\n      const wasInactive = item.getAttribute('aria-hidden') !== 'false';\n      if (index === activeIndex) {\n        if (linkElements.length)\n          linkElements.forEach((button) => {\n            button.removeAttribute('tabindex');\n          });\n        item.setAttribute('aria-hidden', 'false');\n        item.removeAttribute('tabindex');\n        if (video) {\n          if (this.crossfadeMode) {\n            video.setAttribute('autoplay', '');\n            if (this.isHomepageHero()) {\n              video.removeAttribute('autoplay');\n              if (this._heroPreparedVideo === video) {\n                this._heroPreparedVideo = null;\n              } else if (wasInactive) {\n                this.restartHeroVideoFromStart(video);\n              } else {\n                this.playHomepageHeroVideo(video);\n              }\n            } else if (video.paused) {\n              this.playSlideVideo(video);\n            } else {\n              video.classList.add('is-playing', 'is-frame-ready');\n              this.hideSlideVideoPosters(video);\n            }\n          } else {\n            const delay = wasInactive ? 80 : 0;\n            window.setTimeout(() => this.playSlideVideo(video), delay);\n          }\n        }\n        const cinematic = this.cinematicSequences?.get(item);\n        if (cinematic && (wasInactive || !cinematic.running)) {\n          cinematic.start();\n          this.triggerCinematicText(item);\n        }\n      } else {\n        if (linkElements.length)\n          linkElements.forEach((button) => {\n            button.setAttribute('tabindex', '-1');\n          });\n        item.setAttribute('aria-hidden', 'true');\n        item.setAttribute('tabindex', '-1');\n        if (video) {\n          if (this.crossfadeMode) {\n            video.setAttribute('autoplay', '');\n            if (this.isHomepageHero()) {\n              delete video.dataset.ffsHeroHold;\n              video.removeAttribute('autoplay');\n              // Preserve the outgoing pixels through the fade. Only a pending\n              // transition is allowed to start an inactive clip.\n              if (this._heroTransition?.video !== video) {\n                video._ffsHeroPlayback?.cancel();\n                video.pause();\n              }\n            } else {\n              if (video.paused) this.playSlideVideo(video);\n              this.hideSlideVideoPosters(video);\n            }\n          } else {\n            this.resetSlideVideo(video);\n          }\n        }\n        const cinematic = this.cinematicSequences?.get(item);\n        if (cinematic) cinematic.stop();\n        item.querySelector('.slideshow__text--cinematic')?.classList.remove('is-entering');\n      }\n    });\n    this.wasClicked = false;\n  }\n\n  applyAnimationToAnnouncementBar(button = 'next') {\n    if (!this.isAnnouncementSlider()) return;\n    if (this.reducedMotion?.matches) return;\n\n    const items = this.getSlideshowItems();\n    if (items.length < 2) return;\n\n    const increment = button === 'previous' ? -1 : 1;\n    const currentIndex = Math.min(Math.max((this.currentPage || 1) - 1, 0), items.length - 1);\n    let nextIndex = (currentIndex + increment) % items.length;\n    if (nextIndex < 0) nextIndex = items.length - 1;\n\n    const currentSlide = items[currentIndex];\n    const nextSlide = items[nextIndex];\n    if (!currentSlide || !nextSlide || currentSlide === nextSlide) return;\n\n    const swipeClasses = [\n      'announcement-bar-slider--swipe-out-next',\n      'announcement-bar-slider--swipe-in-next',\n      'announcement-bar-slider--swipe-out-previous',\n      'announcement-bar-slider--swipe-in-previous',\n    ];\n    items.forEach((item) => item.classList.remove(...swipeClasses));\n\n    currentSlide.classList.add('announcement-bar-slider--swipe-out-next');\n    nextSlide.classList.add('announcement-bar-slider--swipe-in-next');\n\n    clearTimeout(this.announcementSwipeTimer);\n    this.announcementSwipeTimer = setTimeout(() => {\n      currentSlide.classList.remove('announcement-bar-slider--swipe-out-next');\n      nextSlide.classList.remove('announcement-bar-slider--swipe-in-next');\n    }, this.announcerBarAnimationDelay);\n  }\n\n  linkToSlide(event) {\n    event.preventDefault();\n    if (this.isHomepageHero()) this.cancelHomepageHeroTransition();\n\n    if (this.crossfadeMode) {\n      this.currentPage = this.sliderControlLinksArray.indexOf(event.currentTarget) + 1;\n      this.setSlideVisibility();\n      this.update();\n      return;\n    }\n\n    const slideScrollPosition =\n      this.slider.scrollLeft +\n      this.sliderFirstItemNode.clientWidth *\n        (this.sliderControlLinksArray.indexOf(event.currentTarget) + 1 - this.currentPage);\n    this.slider.scrollTo({\n      left: slideScrollPosition,\n    });\n  }\n}\n\ncustomElements.define('slideshow-component', SlideshowComponent);\n\nclass VariantSelects extends HTMLElement {\n  constructor() {\n    super();\n  }\n\n  connectedCallback() {\n    this.addEventListener('change', (event) => {\n      const target = this.getInputForEventTarget(event.target);\n      this.updateSelectionMetadata(event);\n\n      publish(PUB_SUB_EVENTS.optionValueSelectionChange, {\n        data: {\n          event,\n          target,\n          selectedOptionValues: this.selectedOptionValues,\n        },\n      });\n    });\n  }\n\n  updateSelectionMetadata({ target }) {\n    const { value, tagName } = target;\n\n    if (tagName === 'SELECT' && target.selectedOptions.length) {\n      Array.from(target.options)\n        .find((option) => option.getAttribute('selected'))\n        .removeAttribute('selected');\n      target.selectedOptions[0].setAttribute('selected', 'selected');\n\n      const swatchValue = target.selectedOptions[0].dataset.optionSwatchValue;\n      const selectedDropdownSwatchValue = target\n        .closest('.product-form__input')\n        .querySelector('[data-selected-value] > .swatch');\n      if (!selectedDropdownSwatchValue) return;\n      if (swatchValue) {\n        selectedDropdownSwatchValue.style.setProperty('--swatch--background', swatchValue);\n        selectedDropdownSwatchValue.classList.remove('swatch--unavailable');\n      } else {\n        selectedDropdownSwatchValue.style.setProperty('--swatch--background', 'unset');\n        selectedDropdownSwatchValue.classList.add('swatch--unavailable');\n      }\n\n      selectedDropdownSwatchValue.style.setProperty(\n        '--swatch-focal-point',\n        target.selectedOptions[0].dataset.optionSwatchFocalPoint || 'unset'\n      );\n    } else if (tagName === 'INPUT' && target.type === 'radio') {\n      const selectedSwatchValue = target.closest(`.product-form__input`).querySelector('[data-selected-value]');\n      if (selectedSwatchValue) selectedSwatchValue.innerHTML = value;\n    }\n  }\n\n  getInputForEventTarget(target) {\n    return target.tagName === 'SELECT' ? target.selectedOptions[0] : target;\n  }\n\n  get selectedOptionValues() {\n    return Array.from(this.querySelectorAll('select option[selected], fieldset input:checked')).map(\n      ({ dataset }) => dataset.optionValueId\n    );\n  }\n}\n\ncustomElements.define('variant-selects', VariantSelects);\n\nclass ProductRecommendations extends HTMLElement {\n  observer = undefined;\n\n  constructor() {\n    super();\n  }\n\n  connectedCallback() {\n    if (this.classList.contains('related-products')) {\n      this.loadRecommendations(this.dataset.productId);\n      return;\n    }\n    this.initializeRecommendations(this.dataset.productId);\n  }\n\n  initializeRecommendations(productId) {\n    this.observer?.unobserve(this);\n    this.observer = new IntersectionObserver(\n      (entries, observer) => {\n        if (!entries[0].isIntersecting) return;\n        observer.unobserve(this);\n        this.loadRecommendations(productId);\n      },\n      { rootMargin: '0px 0px 400px 0px' }\n    );\n    this.observer.observe(this);\n  }\n\n  removeOrphanedQuickAddModals() {\n    const sectionId = this.dataset.sectionId;\n    if (!sectionId) return;\n\n    document.querySelectorAll('body > modal-dialog, body > quick-add-modal').forEach((modal) => {\n      const belongsToSection =\n        modal.dataset.section === sectionId || (modal.id && modal.id.includes(sectionId));\n      if (belongsToSection) modal.remove();\n    });\n  }\n\n  loadRecommendations(productId) {\n    fetch(`${this.dataset.url}&product_id=${productId}&section_id=${this.dataset.sectionId}`)\n      .then((response) => response.text())\n      .then((text) => {\n        const html = document.createElement('div');\n        html.innerHTML = text;\n        const recommendations = html.querySelector('product-recommendations');\n\n        if (recommendations?.innerHTML.trim().length) {\n          /* modal-dialog moves itself to body on connect \u2014 clear those orphans\n             before replacing cards, or Quick View opens a stale empty modal. */\n          this.removeOrphanedQuickAddModals();\n          this.innerHTML = recommendations.innerHTML;\n        }\n\n        if (!this.querySelector('slideshow-component') && this.classList.contains('complementary-products')) {\n          this.remove();\n        }\n\n        if (html.querySelector('.grid__item')) {\n          this.classList.add('product-recommendations--loaded');\n        }\n\n        this.querySelectorAll('img').forEach((img) => {\n          img.loading = 'eager';\n          img.style.opacity = '1';\n        });\n        this.classList.add('scroll-trigger--cancel');\n        this.classList.remove('scroll-trigger--offscreen');\n      })\n      .catch((e) => {\n        console.error(e);\n      });\n  }\n}\n\ncustomElements.define('product-recommendations', ProductRecommendations);\n\nclass AccountIcon extends HTMLElement {\n  constructor() {\n    super();\n\n    this.icon = this.querySelector('.icon');\n  }\n\n  connectedCallback() {\n    document.addEventListener('storefront:signincompleted', this.handleStorefrontSignInCompleted.bind(this));\n    /* Shop can inject a letter circle after paint \u2014 keep the person icon. */\n    this._accountIconGuard = new MutationObserver(() => this.enforcePersonIcon());\n    this._accountIconGuard.observe(this, { childList: true, subtree: true });\n    this.enforcePersonIcon();\n  }\n\n  disconnectedCallback() {\n    this._accountIconGuard?.disconnect();\n  }\n\n  enforcePersonIcon() {\n    const keep = this.querySelector('.svg-wrapper.icon, .svg-wrapper');\n    if (!keep) return;\n    Array.from(this.children).forEach((child) => {\n      if (child !== keep && !keep.contains(child)) child.remove();\n    });\n  }\n\n  handleStorefrontSignInCompleted(_event) {\n    // Ignore Shop letter/photo injection \u2014 storefront icon stays the person glyph.\n    this.enforcePersonIcon();\n  }\n}\n\ncustomElements.define('account-icon', AccountIcon);\n\nclass BulkAdd extends HTMLElement {\n  static ASYNC_REQUEST_DELAY = 250;\n\n  constructor() {\n    super();\n    this.queue = [];\n    this.setRequestStarted(false);\n    this.ids = [];\n  }\n\n  startQueue(id, quantity) {\n    this.queue.push({ id, quantity });\n\n    const interval = setInterval(() => {\n      if (this.queue.length > 0) {\n        if (!this.requestStarted) {\n          this.sendRequest(this.queue);\n        }\n      } else {\n        clearInterval(interval);\n      }\n    }, BulkAdd.ASYNC_REQUEST_DELAY);\n  }\n\n  sendRequest(queue) {\n    this.setRequestStarted(true);\n    const items = {};\n\n    queue.forEach((queueItem) => {\n      items[parseInt(queueItem.id)] = queueItem.quantity;\n    });\n    this.queue = this.queue.filter((queueElement) => !queue.includes(queueElement));\n\n    this.updateMultipleQty(items);\n  }\n\n  setRequestStarted(requestStarted) {\n    this._requestStarted = requestStarted;\n  }\n\n  get requestStarted() {\n    return this._requestStarted;\n  }\n\n  resetQuantityInput(id) {\n    const input = this.querySelector(`#Quantity-${id}`);\n    input.value = input.getAttribute('value');\n    this.isEnterPressed = false;\n  }\n\n  setValidity(event, index, message) {\n    event.target.setCustomValidity(message);\n    event.target.reportValidity();\n    this.resetQuantityInput(index);\n    event.target.select();\n  }\n\n  validateQuantity(event) {\n    const inputValue = parseInt(event.target.value);\n    const index = event.target.dataset.index;\n\n    if (inputValue < event.target.dataset.min) {\n      this.setValidity(event, index, window.quickOrderListStrings.min_error.replace('[min]', event.target.dataset.min));\n    } else if (inputValue > parseInt(event.target.max)) {\n      this.setValidity(event, index, window.quickOrderListStrings.max_error.replace('[max]', event.target.max));\n    } else if (inputValue % parseInt(event.target.step) != 0) {\n      this.setValidity(event, index, window.quickOrderListStrings.step_error.replace('[step]', event.target.step));\n    } else {\n      event.target.setCustomValidity('');\n      event.target.reportValidity();\n      event.target.setAttribute('value', inputValue);\n      this.startQueue(index, inputValue);\n    }\n  }\n\n  getSectionInnerHTML(html, selector) {\n    return new DOMParser().parseFromString(html, 'text/html').querySelector(selector).innerHTML;\n  }\n}\n\nif (!customElements.get('bulk-add')) {\n  customElements.define('bulk-add', BulkAdd);\n}\n\nclass CartPerformance {\n  static #metric_prefix = \"cart-performance\"\n\n  static createStartingMarker(benchmarkName) {\n    const metricName = `${CartPerformance.#metric_prefix}:${benchmarkName}`\n    return performance.mark(`${metricName}:start`);\n  }\n\n  static measureFromEvent(benchmarkName, event) {\n    const metricName = `${CartPerformance.#metric_prefix}:${benchmarkName}`\n    const startMarker = performance.mark(`${metricName}:start`, {\n      startTime: event.timeStamp\n    });\n\n    const endMarker = performance.mark(`${metricName}:end`);\n\n    performance.measure(\n      metricName,\n      `${metricName}:start`,\n      `${metricName}:end`\n    );\n  }\n\n  static measureFromMarker(benchmarkName, startMarker) {\n    const metricName = `${CartPerformance.#metric_prefix}:${benchmarkName}`\n    const endMarker = performance.mark(`${metricName}:end`);\n\n    performance.measure(\n      metricName,\n      startMarker.name,\n      `${metricName}:end`\n    );\n  }\n\n  static measure(benchmarkName, callback) {\n    const metricName = `${CartPerformance.#metric_prefix}:${benchmarkName}`\n    const startMarker = performance.mark(`${metricName}:start`);\n\n    callback();\n\n    const endMarker = performance.mark(`${metricName}:end`);\n\n    performance.measure(\n      metricName,\n      `${metricName}:start`,\n      `${metricName}:end`\n    );\n  }\n}\n"],
  "mappings": "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",
  "names": ["video", "useDesktop", "tryWarm", "nextIndex"]
}
