{
  "version": 3,
  "sources": ["/cdn/shop/t/22/assets/couor-map-menu.js?nocache=1792070325018"],
  "sourcesContent": ["/**\n * The main menu lives as buttons on top of the map itself, and the on-map\n * region markers share the exact same [data-map-menu-item] interface \u2014 so\n * clicking a marker directly on the map behaves identically to clicking its\n * menu entry, not a plain link to the classic collection page. Clicking a\n * region (Archive/Bermuda) flies the map there and loads its collection\n * into a panel over the map, titled with the location's name; clicking a\n * plain page (About/Contact) loads that page into the same panel without\n * moving the map. Nothing ever does a full page navigation \u2014 history is\n * kept in sync with pushState so the URL and back button still make sense.\n *\n * Runs immediately rather than waiting for DOMContentLoaded: this script\n * loads with `defer` on a normal page load (DOM is already parsed by the\n * time it runs anyway), and on a cold product/collection/page load it gets\n * re-injected by couor-map-bootstrap.js well after DOMContentLoaded has\n * already fired once \u2014 a listener added at that point would never run.\n */\n(() => {\n  const items = document.querySelectorAll('[data-map-menu-item]');\n  const panel = document.querySelector('[data-map-panel]');\n  const body = panel?.querySelector('[data-map-panel-body]');\n  const title = panel?.querySelector('[data-panel-title]');\n  const closeBtn = panel?.querySelector('[data-map-panel-close]');\n  const map = document.querySelector('couor-map');\n  if (!items.length || !panel || !body) return;\n\n  const loadedStylesheets = new Set(\n    Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]')).map((l) => l.href)\n  );\n\n  // What the panel was showing before the current content, so the X can\n  // step BACK through the drill-down (collection -> product) instead of\n  // dumping straight out to the map. Cleared whenever the panel is opened\n  // fresh from the menu or fully closed.\n  const panelStack = [];\n  // The URL of what the panel is CURRENTLY showing. location.pathname is\n  // not a substitute: the menu's anchor flow opens a collection without\n  // navigating (the address bar can still say '/'), and stepping back to\n  // '/' would fetch the homepage into the panel.\n  let currentContent = null;\n\n  function openPanel(label) {\n    if (title) title.textContent = label || '';\n    panel.hidden = false;\n    // Force a style flush so the opacity/transform transition has a start\n    // value, then add the class synchronously. requestAnimationFrame would\n    // be the usual trick here, but it never fires while the tab is hidden \u2014\n    // opening a link in a background tab would leave the panel stuck at\n    // opacity 0 even after the reader switched to it.\n    void panel.offsetHeight;\n    panel.classList.add('is-open');\n    document.body.classList.add('couor-nav-open');\n  }\n\n  // The product loupe outlives its gallery (it hangs on document.body and\n  // is reused between products); whenever this panel swaps or drops its\n  // content, the loupe must be put down with it -- mouseleave never fires\n  // for an element that was REMOVED under the cursor.\n  function stowLoupe() {\n    const loupe = document.querySelector('.couor-loupe');\n    if (loupe) {\n      loupe.style.display = 'none';\n      loupe.hidden = true;\n    }\n  }\n\n  // \"Navigating\u2026\" over the map while a collection voyage waits on its\n  // products: shown from the compass's landing until the first card photo\n  // is revealed (the keyer stamps data-couor-keyed, '1' or 'orig', which\n  // is what lifts the keying hold), so the gap after the animation never\n  // reads as a stall. It appears the instant the compass lands, and once\n  // up it holds at least 500ms so a fast grid never makes it blink; a 12s\n  // failsafe means it can never stick.\n  const navNote = document.createElement('div');\n  navNote.className = 'couor-nav-note';\n  navNote.setAttribute('role', 'status');\n  navNote.setAttribute('aria-live', 'polite');\n  navNote.textContent = 'Navigating\u2026';\n  navNote.hidden = true;\n  document.body.appendChild(navNote);\n  let navNoteToken = 0;\n\n  function hideNavNote() {\n    navNoteToken++;\n    navNote.classList.remove('is-visible');\n    setTimeout(() => {\n      if (!navNote.classList.contains('is-visible')) navNote.hidden = true;\n    }, 300);\n  }\n\n  function showNavNoteUntilCards() {\n    const token = ++navNoteToken;\n    const cardsReady = () => {\n      const grid = body.querySelector('#product-grid');\n      if (!grid) return false;\n      const imgs = grid.querySelectorAll('.card__media img');\n      if (!imgs.length) return true;\n      return Array.from(imgs).some((img) => img.dataset.couorKeyed);\n    };\n    if (cardsReady()) return;\n    let watch = null;\n    navNote.hidden = false;\n    void navNote.offsetHeight;\n    navNote.classList.add('is-visible');\n    const shownAt = performance.now();\n    const finish = () => {\n      if (watch) watch.disconnect();\n      clearTimeout(failsafe);\n      const wait = Math.max(0, 500 - (performance.now() - shownAt));\n      setTimeout(() => {\n        if (token === navNoteToken) hideNavNote();\n      }, wait);\n    };\n    const failsafe = setTimeout(finish, 12000);\n    watch = new MutationObserver(() => {\n      if (token !== navNoteToken) return finish();\n      if (cardsReady()) finish();\n    });\n    watch.observe(body, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-couor-keyed'] });\n  }\n\n  function closePanel(pushHome = true) {\n    stowLoupe();\n    hideNavNote();\n    panelStack.length = 0;\n    currentContent = null;\n    panel.classList.remove('is-open', 'couor-panel-hold');\n    document.body.classList.remove('couor-nav-open');\n    // The traveller is back on the map: the menu the departure hid\n    // returns with it.\n    document.body.classList.remove('couor-departing');\n    setTimeout(() => {\n      panel.hidden = true;\n      setPanelMode(null);\n      body.innerHTML = '';\n      if (title) title.textContent = '';\n    }, 350);\n    if (pushHome && location.pathname !== '/') {\n      history.pushState({ couorPanel: false }, '', '/');\n    }\n  }\n\n  function setPanelMode(mode) {\n    panel.classList.toggle('couor-map-panel--grid', mode === 'grid');\n    panel.classList.toggle('couor-map-panel--product', mode === 'product');\n    panel.classList.toggle('couor-map-panel--page', mode === 'page');\n    // The compass navigates collections on phones: a body-level flag so\n    // the compass snippet's CSS/JS can pin it to the bottom and spin it\n    // with the product strip's sideways scroll (grid panels only).\n    document.body.classList.toggle('couor-grid-open', mode === 'grid');\n    // Product panels are opaque: the map underneath pauses its ambient\n    // animations while this flag is up (couor-map.css perf pass).\n    document.body.classList.toggle('couor-product-open', mode === 'product');\n  }\n\n  // The destination's mode is knowable from its URL before a single byte\n  // arrives \u2014 collections and pages are TRANSPARENT panels, so opening in\n  // the destination mode up front keeps the map in view for the whole\n  // transition. The old flow opened in the base (dark) skin and switched\n  // after injection: on phones that read as the screen going black\n  // between the flight and the collection.\n  function modeForUrl(url) {\n    if (!url) return null;\n    if (url.includes('/products/')) return 'product';\n    if (url.includes('/collections/')) return 'grid';\n    if (url.includes('/pages/') || url.includes('/policies/')) return 'page';\n    return null;\n  }\n\n  function showLoading(label, mode) {\n    setPanelMode(mode || null);\n    body.innerHTML = '<div class=\"couor-map-panel__loading\">Navigating\u2026</div>';\n    openPanel(label);\n  }\n\n  function showLocked(label, state, description) {\n    setPanelMode(null);\n    body.innerHTML = `\n      <div class=\"couor-map-panel__locked\">\n        <p class=\"couor-map-panel__state\">${state === 'locked' ? 'Locked' : 'Uncharted'}</p>\n        <p>${description || 'Nothing here yet.'}</p>\n      </div>\n    `;\n    openPanel(label);\n  }\n\n  // Dawn hides scroll-reveal elements at `opacity: 0.01` until animations.js\n  // observes them coming into view. Content injected here is never observed\n  // (it appears mid-page, already in view), so the reveal never fires and\n  // product cards stay invisible. Drop the class so they just show.\n  // One fetch, keyable, sharp, and present on the first screen:\n  // - src pinned to the 720 rendition (srcset dropped \u2014 the keyer owns\n  //   the final pixels anyway, and mixed candidates were what made the\n  //   cards soft);\n  // - crossorigin BEFORE the fetch, so the keyer can read the displayed\n  //   image's pixels directly instead of re-downloading it through the\n  //   CORS cache partition (that refetch was the visible keying delay);\n  // - first screenful eager (the Safari lazy flake inside a container\n  //   that flips hidden->visible \u2014 the empty-boxes loads).\n  function prepGridImages(root) {\n    root.querySelectorAll('#product-grid img, .card__media img').forEach((im, i) => {\n      const src = im.getAttribute('src');\n      if (src && !src.startsWith('blob:')) {\n        im.setAttribute('src', src.replace(/([?&]width=)\\d+/, '$1720'));\n      }\n      im.removeAttribute('srcset');\n      im.removeAttribute('sizes');\n      im.setAttribute('crossorigin', 'anonymous');\n      if (i < 4) {\n        im.loading = 'eager';\n        if (i < 2) im.setAttribute('fetchpriority', 'high');\n      }\n    });\n  }\n\n  function revealInjected(root) {\n    root.querySelectorAll('.scroll-trigger').forEach((el) => {\n      el.classList.remove('scroll-trigger', 'scroll-trigger--offscreen');\n    });\n  }\n\n  // innerHTML-injected <script> tags don't execute \u2014 recreate them so\n  // product forms, variant pickers, etc. actually wire up.\n  //\n  // External scripts are only revived if that src isn't already on the\n  // page. Dawn's bundles declare top-level classes (`class CartNotification\n  // {}`), so re-running one that already loaded throws \"Identifier has\n  // already been declared\" and aborts the rest of that file.\n  function reviveScripts(root) {\n    root.querySelectorAll('script').forEach((oldScript) => {\n      const src = oldScript.getAttribute('src');\n      // Must exclude oldScript itself \u2014 it's already in the document by the\n      // time we walk it, so a plain querySelector would match the very\n      // script we're trying to revive and drop it on the floor.\n      const alreadyLoaded =\n        src && Array.from(document.querySelectorAll(`script[src=\"${src}\"]`)).some((s) => s !== oldScript);\n      if (alreadyLoaded) {\n        oldScript.remove();\n        return;\n      }\n      const newScript = document.createElement('script');\n      Array.from(oldScript.attributes).forEach((attr) => newScript.setAttribute(attr.name, attr.value));\n      if (src) newScript.setAttribute('data-couor-revived', '');\n      newScript.textContent = oldScript.textContent;\n      oldScript.replaceWith(newScript);\n    });\n  }\n\n  // `arrival`, when given, is a promise that settles once the map has\n  // finished flying. The fetch runs in parallel with the journey; only the\n  // panel's appearance waits, so travelling costs no extra loading time.\n  // Fetched pages, kept for the session. Hopping between two regions\n  // re-opens each one's content instantly instead of paying the network\n  // round trip again -- on a phone that round trip was the visible\n  // \"beat before it loads\".\n  const contentCache = new Map();\n\n  async function loadContent(url, label, arrival) {\n    stowLoupe();\n    currentContent = url;\n    // A cache hit swaps content synchronously \u2014 showing the dark\n    // \"Navigating\u2026\" interstitial for it would be a pointless flash (the\n    // ugly beat when stepping back from a product to a collection the\n    // session has already fetched). Only network fetches earn it.\n    let html = contentCache.get(url);\n    const mode = modeForUrl(url);\n    if (!arrival) {\n      if (html) openPanel(label);\n      else showLoading(label, mode);\n    }\n    try {\n      if (!html) {\n        const res = await fetch(url);\n        if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n        html = await res.text();\n        contentCache.set(url, html);\n        // Bounded: each entry is a full page of HTML, and a long browse\n        // session should not accumulate them without limit.\n        if (contentCache.size > 20) contentCache.delete(contentCache.keys().next().value);\n      }\n      // Warm the destination's photos WHILE the voyage plays: the first\n      // screenful of card images downloads during flight + glide instead\n      // of after them. Only the HTTP cache is warmed -- throwaway Image\n      // objects fetching the exact URL and CORS mode prepGridImages will\n      // set -- and the grid itself is still cloned and prepped at\n      // injection. An earlier version prepped the real card <img>s while\n      // they were DETACHED; they fetched, yet once attached reported\n      // complete with naturalWidth 0, so the keyer never fired and every\n      // card sat hidden until the 6s keying-hold fallback.\n      if (arrival && !body.__warmedPhotos) body.__warmedPhotos = [];\n      if (arrival) {\n        const gridSrc = new DOMParser()\n          .parseFromString(html, 'text/html')\n          .querySelector('ul#product-grid');\n        if (gridSrc) {\n          gridSrc.querySelectorAll('.card__media img').forEach((im, i) => {\n            if (i >= 4) return;\n            const src = im.getAttribute('src');\n            if (!src || src.startsWith('blob:')) return;\n            const warm = new Image();\n            warm.crossOrigin = 'anonymous';\n            warm.src = src.replace(/([?&]width=)\\d+/, '$1720');\n            body.__warmedPhotos.push(warm);\n          });\n          if (body.__warmedPhotos.length > 24) body.__warmedPhotos.splice(0, body.__warmedPhotos.length - 24);\n        }\n      }\n      if (arrival) {\n        await arrival;\n        // Arrival resolves in the very frame the tween ends. Injecting the\n        // panel there makes its style recalculation and image decodes share\n        // that frame -- on a phone the flight visibly hitches as it lands.\n        // Two frames plus a beat later is imperceptible to the eye but puts\n        // the injection safely after the settle has painted.\n        await new Promise((r) =>\n          requestAnimationFrame(() => requestAnimationFrame(() => setTimeout(r, 80)))\n        );\n        // Open already wearing the destination's skin: grid/page panels\n        // are transparent, so the just-landed region stays visible under\n        // the fade instead of a black interstitial.\n        setPanelMode(mode);\n        // For a menu voyage the compass glide already ran DURING the\n        // flight (the click handler set the grid body classes at the\n        // spin's end and gated this arrival on the landing event), so by\n        // here both the camera and the instrument are at rest and the\n        // grid's injection -- the heavy style/layout storm -- can no\n        // longer stutter either of them.\n        if (contentCache.get(url) && html) openPanel(label);\n        else showLoading(label, mode);\n      }\n      const doc = new DOMParser().parseFromString(html, 'text/html');\n      // Decode injected imagery off the critical path: without these, a\n      // grid of product photos decodes synchronously on first layout.\n      doc.querySelectorAll('img').forEach((img) => {\n        img.setAttribute('decoding', 'async');\n        if (!img.hasAttribute('loading')) img.setAttribute('loading', 'lazy');\n      });\n\n      doc.querySelectorAll('link[rel=\"stylesheet\"]').forEach((link) => {\n        if (link.href && !loadedStylesheets.has(link.href)) {\n          document.head.appendChild(document.importNode(link, true));\n          loadedStylesheets.add(link.href);\n        }\n      });\n\n      // A product page: translucent + blurred, map still recognizable\n      // behind it but out of the way of the product itself.\n      const productEl = doc.querySelector('#couor-product');\n      if (productEl) {\n        setPanelMode('product');\n        const productTitle = productEl.querySelector('.product-info__title-top');\n        if (title) title.textContent = productTitle ? productTitle.textContent.trim() : label || '';\n        body.innerHTML = '';\n        body.appendChild(document.importNode(productEl, true));\n        revealInjected(body);\n        reviveScripts(body);\n        return;\n      }\n\n      // A collection page: show just the product cards, translucent, map\n      // still visible through and around them \u2014 not the full page.\n      const grid = doc.querySelector('ul#product-grid');\n      if (grid) {\n        setPanelMode('grid');\n        // Label-less loads (browser back via popstate, a stack entry that\n        // was pushed while the title read empty) arrive here with the\n        // heading blanked by showLoading('') \u2014 recover the region's name\n        // from the fetched page's own server-rendered panel title, falling\n        // back to the document title's first segment (\"Bermuda \u2013 By\n        // Couor\"). Without this, backing out of a product left the grid\n        // untitled.\n        if (title && !title.textContent.trim()) {\n          const fetchedTitle = doc.querySelector('[data-panel-title]');\n          const docTitle = (doc.title || '').split('\u2013')[0].trim();\n          const name = (fetchedTitle && fetchedTitle.textContent.trim()) || docTitle;\n          if (name) title.textContent = name;\n        }\n        body.innerHTML = '';\n        const gridClone = document.importNode(grid, true);\n        prepGridImages(gridClone);\n        body.appendChild(gridClone);\n        revealInjected(body);\n        reviveScripts(body);\n        return;\n      }\n\n      // A plain page (About/Contact): transparent over the map, exactly\n      // like a collection grid \u2014 the map stays fully visible behind it.\n      setPanelMode('page');\n      // Same title recovery as the grid branch, for the same popstate path.\n      if (title && !title.textContent.trim()) {\n        const fetchedTitle = doc.querySelector('[data-panel-title]');\n        const docTitle = (doc.title || '').split('\u2013')[0].trim();\n        const name = (fetchedTitle && fetchedTitle.textContent.trim()) || docTitle;\n        if (name) title.textContent = name;\n      }\n      const main = doc.querySelector('#MainContent') || doc.body;\n      body.innerHTML = '';\n      Array.from(main.childNodes).forEach((node) => {\n        body.appendChild(document.importNode(node, true));\n      });\n      revealInjected(body);\n      reviveScripts(body);\n    } catch (err) {\n      setPanelMode(null);\n      // When the panel's reveal was deferred behind the fly, it isn't open\n      // yet \u2014 open it now so the failure is visible instead of silent.\n      openPanel(label);\n      body.innerHTML = '<div class=\"couor-map-panel__loading\">Couldn\u2019t load that. Try again.</div>';\n      console.error('[couor-map-menu] failed to load content', err);\n    }\n  }\n\n  items.forEach((item) => {\n    item.addEventListener('click', (e) => {\n      e.preventDefault();\n      const { kind, href, anchor, contentUrl, state, description } = item.dataset;\n      // For a region, head the panel with the territory's name as it reads\n      // on the chart (\"The Archive\") rather than the menu's wording for it\n      // (\"Home\") \u2014 the panel is showing that place, and the two can differ\n      // because the menu mirrors Shopify while the map names its own land.\n      let label = item.textContent.trim();\n      if (kind === 'anchor' && anchor) {\n        const regionEl = document.querySelector(`couor-map-region[data-anchor=\"${anchor}\"]`);\n        if (regionEl && regionEl.dataset.name) label = regionEl.dataset.name;\n      }\n\n      // Departure choreography: the menu vanishes THE INSTANT a\n      // destination is chosen and the compass answers with its spin --\n      // the voyage reads vanish -> spin -> glide -> cards, the compass\n      // carrying the whole transition alone over the moving map.\n      // (couor-departing is lifted again by closePanel, so the menu is\n      // back the moment the traveller returns to the map.)\n      document.body.classList.add('couor-departing');\n      // The menu's exit and the compass's turn share the click itself;\n      // the CAMERA alone waits out a half-second beat, so the spin is\n      // already underway when the world starts to move.\n      const DEPART_DELAY = 500;\n      document.dispatchEvent(new CustomEvent('couor:compass-spin'));\n      // Wait for the spin the compass ACTUALLY plays, not a wall-clock\n      // guess: on a fresh load the map's tile baking can stall the spin's\n      // start, and a fixed 950ms timer opened the panel mid-turn -- the\n      // spin read as broken. The compass announces couor:compass-spun\n      // from its animation's own finish; the timeout is only the\n      // failsafe for a spin that never ran.\n      const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      const spinDone = reducedMotion\n        ? Promise.resolve()\n        : new Promise((r) => {\n            let settled = false;\n            const fin = () => {\n              if (settled) return;\n              settled = true;\n              document.removeEventListener('couor:compass-spun', fin);\n              r();\n            };\n            document.addEventListener('couor:compass-spun', fin, { once: true });\n            // Failsafe budget: the 900ms spin (it starts at the click)\n            // + slack.\n            setTimeout(fin, 1600);\n          });\n\n      if (kind === 'anchor') {\n        // Remember where on the map we travelled to, so refreshing a\n        // product deeper in this region restores the same view instead of\n        // snapping back out to the whole world.\n        try {\n          sessionStorage.setItem('couor:region', anchor);\n        } catch (err) {\n          /* private mode / storage disabled \u2014 fall back to collection matching */\n        }\n        history.pushState({ couorPanel: true }, '', href);\n        // The voyage, in order. At the CLICK, everything departs at once:\n        // the menu is already gone (above), the compass spins, and the\n        // camera flies to the region -- one motion. When the map has\n        // landed (and the spin has finished turning), the compass glides\n        // down to its post over the resting chart. Only after it lands\n        // does the collection appear. Every stage is event-driven with a\n        // timeout failsafe, so a stalled animation delays nothing forever.\n        setTimeout(() => {\n          if (map) document.dispatchEvent(new CustomEvent('couor:fly-to', { detail: { anchor } }));\n        }, DEPART_DELAY);\n        const flyMs = window.CouorMap && window.CouorMap.flyMs ? window.CouorMap.flyMs() : 900;\n        const mode = modeForUrl(contentUrl);\n        const arrival = new Promise((resolve) => {\n          const done = () => {\n            document.removeEventListener('couor:flight-arrived', done);\n            resolve();\n          };\n          document.addEventListener('couor:flight-arrived', done, { once: true });\n          // Covers the flight plus the tile-bake hold a fresh load may\n          // put in front of it.\n          setTimeout(done, flyMs + 2900);\n        });\n        const glideDone = Promise.all([arrival, spinDone]).then(() => {\n          if (!contentUrl || mode !== 'grid') return;\n          // Bottom-post CSS needs both classes; setting them is what\n          // launches the compass glide, over a map now at rest.\n          document.body.classList.add('couor-nav-open', 'couor-grid-open');\n          if (reducedMotion) return;\n          return new Promise((r) => {\n            let settled = false;\n            const fin = () => {\n              if (settled) return;\n              settled = true;\n              document.removeEventListener('couor:compass-landed', fin);\n              r();\n            };\n            document.addEventListener('couor:compass-landed', fin, { once: true });\n            setTimeout(fin, 1400);\n          });\n        });\n        if (contentUrl) {\n          if (mode === 'grid') glideDone.then(showNavNoteUntilCards);\n          loadContent(contentUrl, label, glideDone);\n        } else {\n          Promise.all([arrival, spinDone]).then(() => showLocked(label, state, description));\n        }\n      } else {\n        // About stands for the whole world/brand \u2014 zoom all the way out\n        // for it, symbolically, instead of leaving the map wherever it was.\n        // The zoom departs WITH the spin, like every region flight \u2014\n        // after the same quarter-second beat.\n        if (map && href.includes('/pages/about')) {\n          setTimeout(() => {\n            document.dispatchEvent(new CustomEvent('couor:zoom-world'));\n          }, DEPART_DELAY);\n          try {\n            sessionStorage.removeItem('couor:region');\n          } catch (err) {\n            /* ignore */\n          }\n        }\n        panelStack.length = 0;\n        history.pushState({ couorPanel: true }, '', href);\n        // Pages join the same rhythm: the spin finishes before the panel\n        // covers the instrument.\n        loadContent(href, label, spinDone);\n      }\n    });\n  });\n\n  // Product cards inside an injected collection grid are real <a href>\n  // links (so they still work with JS off) \u2014 intercept them here so\n  // clicking one loads into the same panel instead of navigating away.\n  // Collection links (the product crumbs' back arrow and region name)\n  // are intercepted too: as full navigations they rebooted the entire\n  // map world \u2014 sky, tiles, fog, panel \u2014 for a page the session usually\n  // already has cached.\n  body.addEventListener('click', (e) => {\n    const link = e.target.closest('a[href*=\"/products/\"], a[href*=\"/collections/\"]');\n    if (!link || !body.contains(link)) return;\n    e.preventDefault();\n    // The crumb trail's current-product link points at the page already\n    // showing \u2014 swallow the click rather than re-render it.\n    if (link.getAttribute('aria-current') === 'page') return;\n    let href;\n    try {\n      href = new URL(link.href, location.origin).pathname;\n    } catch {\n      href = link.getAttribute('href');\n    }\n    if (href.indexOf('/collections/') !== -1) {\n      // Stepping UP to a collection, not drilling down \u2014 the drill-down\n      // stack is spent.\n      panelStack.length = 0;\n    } else {\n      panelStack.push({ href: currentContent || location.pathname, label: title ? title.textContent : '' });\n    }\n    history.pushState({ couorPanel: true }, '', href);\n    loadContent(href);\n  });\n\n  // Desktop only: hovering a menu item starts the map travelling toward\n  // that item's territory before any click \u2014 sweep the mouse across the\n  // stack and the world glides between destinations (the fly tween always\n  // eases from wherever the camera currently is, so redirects are smooth).\n  // Home/Bermuda fly to their regions; About corresponds to the whole\n  // world, matching its click behaviour. Never on touch devices.\n  const finePointer = window.matchMedia('(hover: hover) and (pointer: fine)');\n  document.querySelectorAll('.couor-map__menu [data-map-menu-item]').forEach((item) => {\n    item.addEventListener('mouseenter', () => {\n      if (!finePointer.matches || window.matchMedia('(max-width: 749px)').matches) return;\n      const { kind, anchor, href } = item.dataset;\n      if (kind === 'anchor' && anchor) {\n        document.dispatchEvent(new CustomEvent('couor:fly-to', { detail: { anchor } }));\n      } else if (href && href.includes('/pages/about')) {\n        document.dispatchEvent(new CustomEvent('couor:zoom-world'));\n      }\n    });\n  });\n\n  // The X retraces the drill-down: from a product it returns to the\n  // collection it was opened from, and only closes to the map once there\n  // is nothing left to step back to. (A cold product load has no stack,\n  // so its X still closes to the map.)\n  // A COLD product load (ad click, refresh) has no drill-down stack, but\n  // it still belongs to a collection -- derive the parent from the\n  // product's own collection list so its X steps up rather than straight\n  // out to the map. Preference order mirrors restoreRegion in the\n  // bootstrap: the region this session actually travelled to, then any\n  // collection that has a region on the map, then the product's first\n  // collection. A product in no collection at all closes to the map.\n  function coldParent() {\n    const prod = body.querySelector('#couor-product');\n    if (!prod) return null;\n    const handles = (prod.dataset.collections || '').split(/\\s+/).filter(Boolean);\n    if (!handles.length) return null;\n    let stored = null;\n    try {\n      stored = sessionStorage.getItem('couor:region');\n    } catch (err) {\n      /* storage unavailable */\n    }\n    if (stored) {\n      const reg = document.querySelector(`couor-map-region[data-anchor=\"${CSS.escape(stored)}\"]`);\n      if (reg && handles.includes(reg.dataset.collection)) {\n        return { href: '/collections/' + reg.dataset.collection, label: reg.dataset.name || '' };\n      }\n    }\n    for (const h of handles) {\n      const reg = document.querySelector(`couor-map-region[data-collection=\"${CSS.escape(h)}\"]`);\n      if (reg) return { href: '/collections/' + h, label: reg.dataset.name || '' };\n    }\n    return { href: '/collections/' + handles[0], label: '' };\n  }\n\n  function stepBack() {\n    const prev = panelStack.pop() || coldParent();\n    if (!prev) {\n      closePanel();\n      return;\n    }\n    history.pushState({ couorPanel: true }, '', prev.href);\n    loadContent(prev.href, prev.label);\n  }\n\n  closeBtn?.addEventListener('click', () => stepBack());\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'Escape' && !panel.hidden) stepBack();\n  });\n  window.addEventListener('popstate', () => {\n    if (panel.hidden) return;\n    // Back from a drilled-down product lands on the collection URL the\n    // panel pushed earlier -- show that content, don't tear the panel down.\n    if (/^\\/(collections|products|pages)\\//.test(location.pathname)) {\n      panelStack.pop();\n      loadContent(location.pathname);\n      return;\n    }\n    closePanel(false);\n  });\n})();\n\n\n/* ---------------------------------------------------------------\n   Card keying: collection thumbnails lose their white studio\n   background so the product floats directly on the chart.\n\n   Not a global white threshold -- a flood fill from the image\n   border. Only white CONNECTED to the edge is background; interior\n   whites (the Couor Shorts waistband) are garment and stay. CSS\n   blending can't do this over the dark panel (multiply sinks the\n   whole photo), so it's a one-time canvas pass per thumbnail.\n   Product-page galleries are untouched by design.\n   --------------------------------------------------------------- */\n(() => {\n  const keyed = new WeakSet();\n  // Finished cutouts by source URL. The same photo appears more than once\n  // (primary + hover copy, panels re-opened on travel) -- the second and\n  // every later sighting swaps in the cached blob synchronously, with no\n  // hold window at all.\n  const keyedBySrc = new Map();\n\n  function keyOne(img) {\n    if (keyed.has(img) || img.dataset.couorKeyed) return;\n    keyed.add(img);\n    let src = img.currentSrc || img.src;\n    if (!src || src.startsWith('blob:')) return;\n    // Key from a 720px rendition regardless of what the browser picked:\n    // currentSrc was often the 360/533w candidate, which reads soft in a\n    // ~590-device-pixel slot. Same cache key for every card that shares\n    // the photo.\n    src = src.replace(/([?&]width=)\\d+/, '$1720');\n    // The stamp is what REVEALS the image (the keying-hold CSS keys off\n    // data-couor-keyed), so it must wait for the cutout to actually be\n    // the displayed bitmap. Stamping right after assigning src left a\n    // few frames where the img still showed the white original it had\n    // loaded underneath -- the visible white flash on every fresh key.\n    // decode() resolves once the blob's pixels are ready to paint.\n    /* Mobile strip layout controller. CSS constants cannot know each\n       upload's garment: the controller reads every card's TRUE pixel\n       bounds (couorAirTop/Bot from the keyer, plus the image ratio) and\n       lays each column out exactly \u2014\n       - the two garments in a column sit GAP px apart, visually;\n       - garments fill the band between the header bar and the compass;\n       - one uniform size per collection, chosen so the WORST column\n         still fits: a tall tight-cropped upload (the STEROID jeans)\n         shrinks the whole strip a step instead of ever overlapping a\n         neighbour or the compass. Inline styles override the CSS\n         fallbacks; images stay held invisible until keyed, so the\n         settling passes never flicker. */\n    let stripRaf = 0;\n    function scheduleStripLayout() {\n      if (stripRaf) return;\n      stripRaf = requestAnimationFrame(() => {\n        stripRaf = 0;\n        layoutStrip();\n      });\n    }\n\n    function layoutStrip() {\n      if (!window.matchMedia('(max-width: 749px)').matches) return;\n      if (!document.body.classList.contains('couor-grid-open')) return;\n      const gridEl = document.querySelector('.couor-map-panel--grid #product-grid');\n      if (!gridEl) return;\n      const pcs = Array.from(gridEl.querySelectorAll('.grid__item product-component'));\n      if (!pcs.length) return;\n\n      const metrics = pcs.map((pc) => {\n        const im = pc.querySelector('.card__media img');\n        const w = (im && (im.naturalWidth || +im.getAttribute('width'))) || 1;\n        const h = (im && (im.naturalHeight || +im.getAttribute('height'))) || 1;\n        const r = h / w;\n        const aT = (im && parseFloat(im.dataset.couorAirTop)) || 0;\n        const aB = (im && parseFloat(im.dataset.couorAirBot)) || 0;\n        // In an S-square contain box: displayed height = S*min(r,1);\n        // garment height and box-level airs are all linear in S.\n        const disp = Math.min(r, 1);\n        return {\n          k: disp * (1 - aT - aB),               // garmentHeight / S\n          airTop: (1 - disp) / 2 + disp * aT,    // boxAirTop / S\n          airBot: (1 - disp) / 2 + disp * aB,    // boxAirBot / S\n        };\n      });\n\n      const GAP = 12;              // px between garment pixels in a column\n      // MEASURED, not assumed: on notched phones the safe-area pushes\n      // the header block lower than any constant \u2014 anchoring to a\n      // hardcoded line put the hoodie's hood inside the bar. The first\n      // garment starts 10px under wherever the title block actually ends.\n      const titleEl = document.querySelector('.couor-map-panel--grid .couor-map-panel__title');\n      const titleRect = titleEl ? titleEl.getBoundingClientRect() : null;\n      const barBottom = titleRect && titleRect.height > 0 ? titleRect.bottom : 52;\n      const TOP = Math.round(barBottom) + 10;\n      const SAFE = 8;\n      const compassTop = window.innerHeight - 124.5; // fixed navigator disc\n      const A = compassTop - TOP - SAFE;\n\n      let S = Math.min(window.innerWidth - 12, 520);\n      for (let i = 0; i < metrics.length; i += 2) {\n        const k1 = metrics[i].k;\n        const k2 = metrics[i + 1] ? metrics[i + 1].k : 0;\n        const need = k1 + k2;\n        if (need > 0.05) S = Math.min(S, (A - (metrics[i + 1] ? GAP : 0)) / need);\n      }\n      S = Math.max(120, Math.floor(S));\n\n      // Strip top by measure-and-correct: adjust the current margin by\n      // the delta between where the box top IS and where it should be\n      // (TOP minus the first garment's air) \u2014 immune to whatever sits\n      // above the strip on any device. Re-runs converge in one pass.\n      {\n        const gr = gridEl.getBoundingClientRect();\n        const currentMargin = parseFloat(gridEl.style.marginTop) || 0;\n        const desiredBoxTop = TOP - metrics[0].airTop * S;\n        gridEl.style.marginTop = Math.round(currentMargin + (desiredBoxTop - gr.top)) + 'px';\n      }\n\n      pcs.forEach((pc, i) => {\n        pc.style.width = S + 'px';\n        pc.style.height = S + 'px';\n        const li = pc.closest('.grid__item');\n        if (!li) return;\n        if (i % 2 === 1) {\n          const gap = GAP - (metrics[i - 1].airBot + metrics[i].airTop) * S;\n          li.style.marginTop = Math.round(gap) + 'px';\n        } else {\n          li.style.marginTop = '0px';\n        }\n      });\n    }\n\n    window.addEventListener('resize', scheduleStripLayout);\n    // Cold loads arrive through the bootstrap after this script parsed \u2014\n    // settle passes catch the grid whenever it appears.\n    setTimeout(scheduleStripLayout, 400);\n    setTimeout(scheduleStripLayout, 1200);\n    setTimeout(scheduleStripLayout, 3000);\n\n    function stampWhenPainted(el) {\n      const stamp = () => { el.dataset.couorKeyed = '1'; scheduleStripLayout(); };\n      if (el.decode) el.decode().then(stamp, stamp);\n      else if (!el.complete) el.addEventListener('load', stamp, { once: true });\n      else stamp();\n    }\n    const cached = keyedBySrc.get(src);\n    if (cached) {\n      img.srcset = '';\n      img.sizes = '';\n      img.src = cached.url;\n      if (cached.aT) img.dataset.couorAirTop = cached.aT;\n      if (cached.aB) img.dataset.couorAirBot = cached.aB;\n      stampWhenPainted(img);\n      return;\n    }\n    // The real failsafe: from THIS point the photo bytes are in hand and\n    // only our own keying work remains, which takes tens of milliseconds\n    // to a few hundred. If it hasn't produced a result in 1.2s something\n    // is genuinely wrong -- reveal the original rather than hold a blank.\n    // (The CSS 6s animation only covers the keyer never running at all.)\n    // Once the cutout blob EXISTS the failsafe stands down: only its\n    // decode remains, and revealing the white original in that window\n    // just to swap it a beat later is exactly the flash this guards\n    // against.\n    let blobReady = false;\n    const arm = () =>\n      setTimeout(() => {\n        if (!blobReady && !img.dataset.couorKeyed) img.dataset.couorKeyed = 'orig'; scheduleStripLayout();\n      }, 1200);\n    // Always key from a dedicated Image of the pinned 720 URL, never from\n    // the displayed element. A \"fast path\" that drew the displayed img was\n    // tried and produced third-resolution cutouts: an image chosen from\n    // srcset carries a pixel density (533w at a ~170px slot is ~3.1x), and\n    // naturalWidth/drawImage work in density-CORRECTED CSS pixels, so the\n    // canvas came out 170-340px in a 558-device-pixel slot (measured), and\n    // the softened edges of that downscale also let the flood fill leak\n    // into garments and trip the centre guard -- white cards. The displayed\n    // element can also be mid-swap while prepGridImages retargets it, so\n    // its bitmap may not even match its currentSrc. A fresh element with a\n    // plain src has density 1 and gives the full 720 bitmap; prepGridImages\n    // already fetched that exact URL with CORS, so this is a cache hit,\n    // not a second download.\n    const pic = new Image();\n    pic.crossOrigin = 'anonymous';\n    const onReady = () => {\n      arm();\n      try {\n        const w = pic.naturalWidth;\n        const h = pic.naturalHeight;\n        if (!w || !h) return;\n        const cv = document.createElement('canvas');\n        cv.width = w;\n        cv.height = h;\n        const ctx = cv.getContext('2d');\n        ctx.drawImage(pic, 0, 0);\n        const d = ctx.getImageData(0, 0, w, h);\n        const px = d.data;\n        // 248, raised from 242 after a white tee's fabric (sitting in\n        // Already-transparent upload (a pre-keyed PNG): nothing to do \u2014\n        // pass it straight through. Checked via the corners' alpha.\n        {\n          const corners = [0, (w - 1) * 4, (h - 1) * w * 4, (w * h - 1) * 4];\n          if (corners.every((i) => px[i + 3] === 0)) {\n            img.dataset.couorKeyed = '1'; scheduleStripLayout();\n            return;\n          }\n        }\n\n        // Two-pass adaptive fill. Pass one is STRICT (248): off-white\n        // fabric in the 242-247 band reads as solid, so a white tee\n        // cannot be eaten through its own highlights. But some renders'\n        // backgrounds dip into that same band \u2014 strict then removes\n        // nothing. When strict fails (removed almost nothing, or tripped\n        // the centre guard), retry at the classic 242. Only an image\n        // that fails BOTH \u2014 true white-on-white, no separable boundary \u2014\n        // falls back to the original card.\n        const flood = (TH) => {\n          const isW = (i) => px[i] >= TH && px[i + 1] >= TH && px[i + 2] >= TH;\n          const mark = new Uint8Array(w * h);\n          const q = [];\n          let removed = 0;\n          for (let x = 0; x < w; x++) {\n            for (const y of [0, h - 1]) {\n              const p = y * w + x;\n              if (!mark[p] && isW(p * 4)) { mark[p] = 1; q.push(p); }\n            }\n          }\n          for (let y = 0; y < h; y++) {\n            for (const x of [0, w - 1]) {\n              const p = y * w + x;\n              if (!mark[p] && isW(p * 4)) { mark[p] = 1; q.push(p); }\n            }\n          }\n          while (q.length) {\n            const p = q.pop();\n            removed++;\n            const x = p % w;\n            const y = (p - x) / w;\n            if (x > 0) { const n = p - 1; if (!mark[n] && isW(n * 4)) { mark[n] = 1; q.push(n); } }\n            if (x < w - 1) { const n = p + 1; if (!mark[n] && isW(n * 4)) { mark[n] = 1; q.push(n); } }\n            if (y > 0) { const n = p - w; if (!mark[n] && isW(n * 4)) { mark[n] = 1; q.push(n); } }\n            if (y < h - 1) { const n = p + w; if (!mark[n] && isW(n * 4)) { mark[n] = 1; q.push(n); } }\n          }\n          // Survivor check, replacing the old centre-window guard (which\n          // misfired on split silhouettes: the background between a pair\n          // of jeans' legs legitimately fills the centre). What a GOOD\n          // key always leaves is one garment-sized connected region;\n          // an eaten white tee leaves only print fragments. Measure the\n          // largest surviving component.\n          let largestKept = 0;\n          const seen = new Uint8Array(w * h);\n          for (let p0 = 0; p0 < w * h; p0++) {\n            if (mark[p0] || seen[p0]) continue;\n            let size = 0;\n            seen[p0] = 1;\n            const qq = [p0];\n            while (qq.length) {\n              const p = qq.pop();\n              size++;\n              const x = p % w;\n              const y = (p - x) / w;\n              if (x > 0) { const n = p - 1; if (!mark[n] && !seen[n]) { seen[n] = 1; qq.push(n); } }\n              if (x < w - 1) { const n = p + 1; if (!mark[n] && !seen[n]) { seen[n] = 1; qq.push(n); } }\n              if (y > 0) { const n = p - w; if (!mark[n] && !seen[n]) { seen[n] = 1; qq.push(n); } }\n              if (y < h - 1) { const n = p + w; if (!mark[n] && !seen[n]) { seen[n] = 1; qq.push(n); } }\n            }\n            if (size > largestKept) largestKept = size;\n          }\n          return { mark, removedFrac: removed / (w * h), keptFrac: largestKept / (w * h) };\n        };\n\n        // A pass that only shaved a thin bright rim (the Siren tee's\n        // outer ring at strict threshold: ~3%) hasn't keyed anything \u2014\n        // but tight-cropped garments (the Bermuda Jeans) have genuinely\n        // small backgrounds, so the floor sits at 5%.\n        let pass = flood(248);\n        if (pass.keptFrac < 0.1 || pass.removedFrac < 0.05) {\n          pass = flood(242);\n        }\n        if (pass.keptFrac < 0.1 || pass.removedFrac < 0.05) {\n          // White-on-white: no separable boundary at any threshold \u2014\n          // the honest fallback is the original card (see the Siren\n          // tee note of old). A transparent re-upload (e.g. Shopify's\n          // built-in background remover) sails through untouched via\n          // the alpha fast-path above.\n          img.dataset.couorKeyed = 'orig'; scheduleStripLayout();\n          return;\n        }\n        const mark = pass.mark;\n\n        // Garment pixel bounds, read off the mask while it is in hand:\n        // the strip's layout controller (layoutStrip below) spaces and\n        // sizes columns from the REAL first/last garment rows, which is\n        // what makes a 12px visual gap safe for any upload \u2014 the tall\n        // STEROID jeans included.\n        {\n          let top = h, bot = -1;\n          for (let y = 0; y < h; y++) {\n            let hasG = false;\n            const row = y * w;\n            for (let x = 0; x < w; x++) if (!mark[row + x]) { hasG = true; break; }\n            if (hasG) { if (y < top) top = y; bot = y; }\n          }\n          if (bot >= top) {\n            img.dataset.couorAirTop = (top / h).toFixed(4);\n            img.dataset.couorAirBot = ((h - 1 - bot) / h).toFixed(4);\n          }\n        }\n\n        // Defringe. The photo's anti-aliasing blended subject and white\n        // background along the silhouette, and those blend pixels survive\n        // the flood fill as a pale 1-2px halo. Peel bright pixels that\n        // touch the removed background (two passes reaches the whole\n        // fringe), then soften the new edge with partial alpha so the\n        // silhouette stays anti-aliased rather than jagged.\n        const FRINGE = 190;\n        for (let pass = 0; pass < 2; pass++) {\n          const peel = [];\n          for (let p = 0; p < w * h; p++) {\n            if (mark[p]) continue;\n            const x = p % w;\n            const y = (p - x) / w;\n            const nearBg =\n              (x > 0 && mark[p - 1]) || (x < w - 1 && mark[p + 1]) ||\n              (y > 0 && mark[p - w]) || (y < h - 1 && mark[p + w]);\n            if (!nearBg) continue;\n            const i = p * 4;\n            if (Math.min(px[i], px[i + 1], px[i + 2]) >= FRINGE) peel.push(p);\n          }\n          for (const p of peel) mark[p] = 1;\n        }\n        for (let p = 0; p < w * h; p++) if (mark[p]) px[p * 4 + 3] = 0;\n        for (let p = 0; p < w * h; p++) {\n          if (mark[p]) continue;\n          const x = p % w;\n          const y = (p - x) / w;\n          const nearBg =\n            (x > 0 && mark[p - 1]) || (x < w - 1 && mark[p + 1]) ||\n            (y > 0 && mark[p - w]) || (y < h - 1 && mark[p + w]);\n          if (nearBg) px[p * 4 + 3] = Math.min(px[p * 4 + 3], 150);\n        }\n        ctx.putImageData(d, 0, 0);\n        cv.toBlob((blob) => {\n          if (!blob) { img.dataset.couorKeyed = 'orig'; scheduleStripLayout(); return; }\n          blobReady = true;\n          img.srcset = '';\n          img.sizes = '';\n          const url = URL.createObjectURL(blob);\n          keyedBySrc.set(src, { url, aT: img.dataset.couorAirTop, aB: img.dataset.couorAirBot });\n          img.src = url;\n          stampWhenPainted(img);\n        }, 'image/png');\n      } catch (err) {\n        /* tainted canvas or decode trouble -- reveal the original */\n        img.dataset.couorKeyed = 'orig'; scheduleStripLayout();\n      }\n    };\n    pic.onerror = () => { img.dataset.couorKeyed = 'orig'; scheduleStripLayout(); };\n    // If the browser refuses even to start the fetch, the error handler\n    // fires and stamps; no separate timer needed before load.\n    pic.onload = onReady;\n    pic.src = src;\n  }\n\n  // Only the first screenful of cards loads eagerly (prepGridImages);\n  // the rest are loading=\"lazy\", and inside the sideways mobile strip the\n  // browser starts a lazy photo only as its column nears the screen. Each\n  // photo then sits hidden until keyed, so the third column visibly\n  // popped in mid-swipe. Once the first screen has landed, the remaining\n  // photos are promoted to eager two at a time (one strip column), each\n  // column waiting for the previous one, so they download and key\n  // quietly in the background before the shopper swipes to them,\n  // without competing with the first screen or the swipe itself.\n  const warmedGrids = new WeakSet();\n  function warmGrid(grid) {\n    if (warmedGrids.has(grid)) return;\n    warmedGrids.add(grid);\n    const imgs = Array.from(grid.querySelectorAll('.card__media img'));\n    const isLazy = (im) => im.getAttribute('loading') === 'lazy' || im.loading === 'lazy';\n    const firstScreen = imgs.filter((im) => !isLazy(im));\n    const rest = imgs.filter(isLazy);\n    if (!rest.length) return;\n\n    const settled = (im, maxMs) =>\n      new Promise((resolve) => {\n        if (im.complete && im.naturalWidth) return resolve();\n        const done = () => resolve();\n        im.addEventListener('load', done, { once: true });\n        im.addEventListener('error', done, { once: true });\n        setTimeout(done, maxMs);\n      });\n\n    const COLUMN = 2;\n    let i = 0;\n    const nextColumn = () => {\n      if (!grid.isConnected || i >= rest.length) return;\n      const column = rest.slice(i, i + COLUMN);\n      i += COLUMN;\n      column.forEach((im) => { im.loading = 'eager'; });\n      Promise.all(column.map((im) => settled(im, 2500))).then(() => setTimeout(nextColumn, 60));\n    };\n\n    const begin = () =>\n      window.requestIdleCallback ? requestIdleCallback(nextColumn, { timeout: 300 }) : setTimeout(nextColumn, 50);\n    Promise.all(firstScreen.map((im) => settled(im, 1500))).then(begin);\n  }\n\n  function keyAll(root) {\n    // Collection grid only, by request: the recommended strip keeps its\n    // photos as shipped, white studio background and all.\n    (root || document)\n      .querySelectorAll('.couor-map-panel #product-grid .card__media img')\n      .forEach((img) => {\n      if (img.complete && img.naturalWidth) keyOne(img);\n      else img.addEventListener('load', () => keyOne(img), { once: true });\n    });\n    (root || document).querySelectorAll('.couor-map-panel #product-grid').forEach(warmGrid);\n  }\n\n  function boot() {\n    keyAll();\n    // Grids also arrive later: the menu injects collection content into the\n    // panel on travel, and bootstrap moves the server-rendered grid in.\n    const panel = document.querySelector('[data-map-panel-body]');\n    if (panel) new MutationObserver(() => keyAll(panel)).observe(panel, { childList: true, subtree: true });\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n})();\n"],
  "mappings": "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",
  "names": ["mark", "pass"]
}
