{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/dtc-select.js?b=20261009b"],
  "sourcesContent": ["/* ============================================================\n   dtc-select.js \u2014 the site's own dropdown.\n\n   WHY THIS EXISTS. A native <select> renders its list with the operating\n   system, not the page: on Windows that is a white rectangle with a bright\n   blue highlight and a 1px grey border, sitting inside a black-and-yellow site\n   in a typeface nobody chose. Nothing about it can be styled \u2014 the list is\n   drawn outside the document.\n\n   HOW IT KEEPS WORKING. The native <select> is NEVER removed. It stays in the\n   form, keeps its name, keeps its value, and remains both the thing that\n   submits and the thing every existing change-handler listens to; this script\n   only draws a button and a list on top of it, and writes the chosen value\n   back with a real `change` event. With JavaScript unavailable, or if this\n   file fails to load, the page is exactly what it was before: a working native\n   select, visible and usable.\n\n   Accessibility follows the ARIA button/listbox pattern: the button owns\n   aria-haspopup, aria-expanded and aria-activedescendant, options are real\n   options with aria-selected, and the keyboard does what a native select does\n   \u2014 arrows, Home/End, type-ahead, Enter to commit, Escape to cancel.\n   ============================================================ */\n(function () {\n  'use strict';\n\n  var OPEN = 'is-open';\n  var uid = 0;\n\n  /* ONE outside-click listener for every instance, registered once. It used to\n     be registered inside build(), which the Section Rendering swap re-runs for\n     every widget in the replaced section - so each facet tick left another\n     permanent listener on `document`, each closure holding a detached wrapper,\n     its button, its list and its native select. Instances that have left the\n     document are dropped here rather than tracked, so nothing has to be\n     unregistered on teardown. */\n  var live = [];\n  document.addEventListener('click', function (e) {\n    for (var i = live.length - 1; i >= 0; i--) {\n      if (!live[i].wrap.isConnected) { live.splice(i, 1); continue; }\n      if (!live[i].wrap.contains(e.target)) { live[i].close(false); }\n    }\n  });\n\n  function build(select) {\n    if (select.dataset.dtcSelectReady === '1') { return; }\n    select.dataset.dtcSelectReady = '1';\n\n    /* The real control stays in the form and stays clip-hidden - it submits,\n       it fires change, and it is the whole fallback when the script does not\n       run - but it must not be a FOCUS TARGET, or the shopper Tabs into a 1x1\n       box they cannot see and arrow keys change a value with no feedback. */\n    select.tabIndex = -1;\n    select.setAttribute('aria-hidden', 'true');\n\n    var id = 'dtcsel-' + (++uid);\n    var wrap = document.createElement('div');\n    wrap.className = 'dtc-select';\n\n    var btn = document.createElement('button');\n    btn.type = 'button';\n    btn.className = 'dtc-select__btn';\n    btn.id = id + '-btn';\n    btn.setAttribute('aria-haspopup', 'listbox');\n    btn.setAttribute('aria-expanded', 'false');\n    if (select.disabled) { btn.disabled = true; }\n\n    /* The native select carries the accessible name (its <label for>), and that\n       label must keep pointing at a real control, so the button borrows the\n       name rather than stealing the label. */\n    var label = select.labels && select.labels[0];\n    if (label) {\n      if (!label.id) { label.id = id + '-lab'; }\n      btn.setAttribute('aria-labelledby', label.id + ' ' + id + '-val');\n    }\n\n    var val = document.createElement('span');\n    val.className = 'dtc-select__value';\n    val.id = id + '-val';\n    btn.appendChild(val);\n\n    var caret = document.createElement('span');\n    caret.className = 'dtc-select__caret';\n    caret.setAttribute('aria-hidden', 'true');\n    btn.appendChild(caret);\n\n    var list = document.createElement('ul');\n    list.className = 'dtc-select__list';\n    list.id = id + '-list';\n    list.setAttribute('role', 'listbox');\n    list.hidden = true;\n    btn.setAttribute('aria-controls', list.id);\n\n    var options = [];\n\n    function paint() {\n      /* the select can be switched on and off after the button is built (a form's conditional questions) */\n      btn.disabled = !!select.disabled;\n      wrap.classList.toggle('is-disabled', !!select.disabled);\n      list.textContent = '';\n      options = [];\n      Array.prototype.forEach.call(select.options, function (o, i) {\n        var li = document.createElement('li');\n        li.className = 'dtc-select__opt';\n        li.id = id + '-o' + i;\n        li.setAttribute('role', 'option');\n        li.textContent = o.textContent.trim();\n        li.setAttribute('aria-selected', o.selected ? 'true' : 'false');\n        if (o.disabled) {\n          li.setAttribute('aria-disabled', 'true');\n          li.className += ' is-disabled';\n        }\n        li.addEventListener('click', function () {\n          if (o.disabled) { return; }\n          commit(i);\n        });\n        list.appendChild(li);\n        options.push(li);\n      });\n      val.textContent = select.selectedIndex > -1\n        ? select.options[select.selectedIndex].textContent.trim()\n        : '';\n      wrap.classList.toggle('is-empty', !val.textContent);\n    }\n\n    function activeIndex() {\n      var cur = btn.getAttribute('aria-activedescendant');\n      for (var i = 0; i < options.length; i++) { if (options[i].id === cur) { return i; } }\n      return select.selectedIndex;\n    }\n\n    function activate(i) {\n      if (i < 0 || i >= options.length) { return; }\n      options.forEach(function (o) { o.classList.remove('is-active'); });\n      options[i].classList.add('is-active');\n      btn.setAttribute('aria-activedescendant', options[i].id);\n      options[i].scrollIntoView({ block: 'nearest' });\n    }\n\n    function open() {\n      if (!list.hidden) { return; }\n      paint();\n      list.hidden = false;\n      wrap.classList.add(OPEN);\n      btn.setAttribute('aria-expanded', 'true');\n      /* Open where the list can be read whole. The room is measured inside every box that clips the control - a\n         popup <dialog>, a scrolling panel - as well as the window, so a list in a popup never runs off its edge:\n         downwards when it fits, upwards when only that side fits, otherwise the bigger side with a shorter list. */\n      var r = btn.getBoundingClientRect();\n      var top = 0, bottom = window.innerHeight;\n      for (var el = wrap.parentElement; el && el !== document.body; el = el.parentElement) {\n        if (el.tagName === 'DIALOG' || /(auto|scroll|hidden|clip)/.test(getComputedStyle(el).overflowY)) {\n          var cr = el.getBoundingClientRect();\n          top = Math.max(top, cr.top);\n          bottom = Math.min(bottom, cr.bottom);\n        }\n      }\n      var gap = 14;\n      var need = Math.min(list.scrollHeight, 264) + gap;\n      var below = bottom - r.bottom;\n      var above = r.top - top;\n      var up = below < need && (above >= need || above > below);\n      wrap.classList.toggle('is-up', up);\n      var room = (up ? above : below) - gap;\n      list.style.maxHeight = room < 264 ? Math.max(120, Math.floor(room)) + 'px' : '';\n      activate(select.selectedIndex);\n    }\n\n    function close(focusBtn) {\n      if (list.hidden) { return; }\n      list.hidden = true;\n      list.style.maxHeight = '';\n      wrap.classList.remove(OPEN, 'is-up');\n      btn.setAttribute('aria-expanded', 'false');\n      btn.removeAttribute('aria-activedescendant');\n      if (focusBtn) { btn.focus(); }\n    }\n\n    function commit(i) {\n      if (i < 0 || i >= select.options.length) { return; }\n      if (select.options[i].disabled) { return; }\n      if (select.selectedIndex !== i) {\n        select.selectedIndex = i;\n        /* The real events, bubbling, so every handler already listening to this\n           select \u2014 variant switching, sort, conditional form fields \u2014 runs\n           exactly as it did with the native control. */\n        select.dispatchEvent(new Event('input', { bubbles: true }));\n        select.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      paint();\n      close(true);\n    }\n\n    /* type-ahead, like a native select */\n    var typed = '';\n    var typedAt = 0;\n    function typeAhead(ch) {\n      var now = (window.performance && performance.now) ? performance.now() : 0;\n      typed = (now - typedAt < 900) ? typed + ch : ch;\n      typedAt = now;\n      for (var i = 0; i < select.options.length; i++) {\n        if (select.options[i].disabled) { continue; }\n        if (select.options[i].textContent.trim().toLowerCase().indexOf(typed) === 0) {\n          if (list.hidden) { commit(i); } else { activate(i); }\n          return;\n        }\n      }\n    }\n\n    btn.addEventListener('click', function () {\n      if (list.hidden) { open(); } else { close(true); }\n    });\n\n    btn.addEventListener('keydown', function (e) {\n      var i = activeIndex();\n      switch (e.key) {\n        case 'ArrowDown':\n          e.preventDefault();\n          if (list.hidden) { open(); } else { activate(Math.min(i + 1, options.length - 1)); }\n          break;\n        case 'ArrowUp':\n          e.preventDefault();\n          if (list.hidden) { open(); } else { activate(Math.max(i - 1, 0)); }\n          break;\n        case 'Home':\n          if (!list.hidden) { e.preventDefault(); activate(0); }\n          break;\n        case 'End':\n          if (!list.hidden) { e.preventDefault(); activate(options.length - 1); }\n          break;\n        case 'Enter':\n        case ' ':\n          e.preventDefault();\n          if (list.hidden) { open(); } else { commit(i); }\n          break;\n        case 'Escape':\n          if (!list.hidden) { e.preventDefault(); close(true); }\n          break;\n        case 'Tab':\n          close(false);\n          break;\n        default:\n          if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n            typeAhead(e.key.toLowerCase());\n          }\n      }\n    });\n\n    live.push({ wrap: wrap, close: close });\n\n    /* Something else changed the select (a variant picked elsewhere, a filter\n       reset, a section swap): keep the button in step. */\n    select.addEventListener('change', function () { paint(); });\n\n    /* And something else REPLACED ITS OPTIONS. The cart's delivery estimator\n       empties the region select and refills it when the country changes, and\n       never dispatches `change` - so the button kept naming a region from the\n       previous country while the form would have posted the new one. Watching\n       the option list covers that and every other script that does the same,\n       without either of them having to know about the other. */\n    if (window.MutationObserver) {\n      new MutationObserver(function () { paint(); })\n        .observe(select, { childList: true, attributes: true, attributeFilter: ['disabled'] });\n    }\n\n    select.parentNode.insertBefore(wrap, select);\n    wrap.appendChild(select);\n    wrap.appendChild(btn);\n    wrap.appendChild(list);\n    paint();\n  }\n\n  function init(scope) {\n    var root = scope && scope.querySelectorAll ? scope : document;\n    Array.prototype.forEach.call(root.querySelectorAll('select[data-dtc-select]'), build);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () { init(document); });\n  } else {\n    init(document);\n  }\n\n  /* Sections re-render (collection filters, the theme editor), so re-scan. */\n  document.addEventListener('shopify:section:load', function (e) { init(e.target); });\n  window.dtcSelectRefresh = init;\n\n  /* Markup that arrives AFTER the first scan - a popup fetched on its first click (the gift card popup on product\n     pages), a drawer, a swapped section - gets the same dropdown without its own refresh call, so no select on the\n     site is ever left as the native control. build() is idempotent, so a select seen twice is built once. */\n  if (window.MutationObserver) {\n    new MutationObserver(function (records) {\n      for (var r = 0; r < records.length; r++) {\n        var added = records[r].addedNodes;\n        for (var n = 0; n < added.length; n++) {\n          var node = added[n];\n          if (node.nodeType !== 1) { continue; }\n          if (node.matches && node.matches('select[data-dtc-select]')) { build(node); }\n          else if (node.querySelector && node.querySelector('select[data-dtc-select]')) { init(node); }\n        }\n      }\n    }).observe(document.documentElement, { childList: true, subtree: true });\n  }\n})();\n"],
  "mappings": "CAsBC,UAAY,CACX,aAEA,IAAI,KAAO,UACP,IAAM,EASN,KAAO,CAAC,EACZ,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,QAAS,EAAI,KAAK,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,GAAI,CAAC,KAAK,CAAC,EAAE,KAAK,YAAa,CAAE,KAAK,OAAO,EAAG,CAAC,EAAG,QAAU,CACzD,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,GAAK,KAAK,CAAC,EAAE,MAAM,EAAK,CAC7D,CACF,CAAC,EAED,SAAS,MAAM,OAAQ,CACrB,GAAI,OAAO,QAAQ,iBAAmB,IAAO,OAC7C,OAAO,QAAQ,eAAiB,IAMhC,OAAO,SAAW,GAClB,OAAO,aAAa,cAAe,MAAM,EAEzC,IAAI,GAAK,WAAa,EAAE,IACpB,KAAO,SAAS,cAAc,KAAK,EACvC,KAAK,UAAY,aAEjB,IAAI,IAAM,SAAS,cAAc,QAAQ,EACzC,IAAI,KAAO,SACX,IAAI,UAAY,kBAChB,IAAI,GAAK,GAAK,OACd,IAAI,aAAa,gBAAiB,SAAS,EAC3C,IAAI,aAAa,gBAAiB,OAAO,EACrC,OAAO,WAAY,IAAI,SAAW,IAKtC,IAAI,MAAQ,OAAO,QAAU,OAAO,OAAO,CAAC,EACxC,QACG,MAAM,KAAM,MAAM,GAAK,GAAK,QACjC,IAAI,aAAa,kBAAmB,MAAM,GAAK,IAAM,GAAK,MAAM,GAGlE,IAAI,IAAM,SAAS,cAAc,MAAM,EACvC,IAAI,UAAY,oBAChB,IAAI,GAAK,GAAK,OACd,IAAI,YAAY,GAAG,EAEnB,IAAI,MAAQ,SAAS,cAAc,MAAM,EACzC,MAAM,UAAY,oBAClB,MAAM,aAAa,cAAe,MAAM,EACxC,IAAI,YAAY,KAAK,EAErB,IAAI,KAAO,SAAS,cAAc,IAAI,EACtC,KAAK,UAAY,mBACjB,KAAK,GAAK,GAAK,QACf,KAAK,aAAa,OAAQ,SAAS,EACnC,KAAK,OAAS,GACd,IAAI,aAAa,gBAAiB,KAAK,EAAE,EAEzC,IAAI,QAAU,CAAC,EAEf,SAAS,OAAQ,CAEf,IAAI,SAAW,CAAC,CAAC,OAAO,SACxB,KAAK,UAAU,OAAO,cAAe,CAAC,CAAC,OAAO,QAAQ,EACtD,KAAK,YAAc,GACnB,QAAU,CAAC,EACX,MAAM,UAAU,QAAQ,KAAK,OAAO,QAAS,SAAU,EAAG,EAAG,CAC3D,IAAI,GAAK,SAAS,cAAc,IAAI,EACpC,GAAG,UAAY,kBACf,GAAG,GAAK,GAAK,KAAO,EACpB,GAAG,aAAa,OAAQ,QAAQ,EAChC,GAAG,YAAc,EAAE,YAAY,KAAK,EACpC,GAAG,aAAa,gBAAiB,EAAE,SAAW,OAAS,OAAO,EAC1D,EAAE,WACJ,GAAG,aAAa,gBAAiB,MAAM,EACvC,GAAG,WAAa,gBAElB,GAAG,iBAAiB,QAAS,UAAY,CACnC,EAAE,UACN,OAAO,CAAC,CACV,CAAC,EACD,KAAK,YAAY,EAAE,EACnB,QAAQ,KAAK,EAAE,CACjB,CAAC,EACD,IAAI,YAAc,OAAO,cAAgB,GACrC,OAAO,QAAQ,OAAO,aAAa,EAAE,YAAY,KAAK,EACtD,GACJ,KAAK,UAAU,OAAO,WAAY,CAAC,IAAI,WAAW,CACpD,CAEA,SAAS,aAAc,CAErB,QADI,IAAM,IAAI,aAAa,uBAAuB,EACzC,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAAO,GAAI,QAAQ,CAAC,EAAE,KAAO,IAAO,OAAO,EAC/E,OAAO,OAAO,aAChB,CAEA,SAAS,SAAS,EAAG,CACf,EAAI,GAAK,GAAK,QAAQ,SAC1B,QAAQ,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,WAAW,CAAG,CAAC,EACjE,QAAQ,CAAC,EAAE,UAAU,IAAI,WAAW,EACpC,IAAI,aAAa,wBAAyB,QAAQ,CAAC,EAAE,EAAE,EACvD,QAAQ,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,EAChD,CAEA,SAAS,MAAO,CACd,GAAK,KAAK,OACV,OAAM,EACN,KAAK,OAAS,GACd,KAAK,UAAU,IAAI,IAAI,EACvB,IAAI,aAAa,gBAAiB,MAAM,EAMxC,QAFI,EAAI,IAAI,sBAAsB,EAC9B,IAAM,EAAG,OAAS,OAAO,YACpB,GAAK,KAAK,cAAe,IAAM,KAAO,SAAS,KAAM,GAAK,GAAG,cACpE,GAAI,GAAG,UAAY,UAAY,4BAA4B,KAAK,iBAAiB,EAAE,EAAE,SAAS,EAAG,CAC/F,IAAI,GAAK,GAAG,sBAAsB,EAClC,IAAM,KAAK,IAAI,IAAK,GAAG,GAAG,EAC1B,OAAS,KAAK,IAAI,OAAQ,GAAG,MAAM,CACrC,CAEF,IAAI,IAAM,GACN,KAAO,KAAK,IAAI,KAAK,aAAc,GAAG,EAAI,IAC1C,MAAQ,OAAS,EAAE,OACnB,MAAQ,EAAE,IAAM,IAChB,GAAK,MAAQ,OAAS,OAAS,MAAQ,MAAQ,OACnD,KAAK,UAAU,OAAO,QAAS,EAAE,EACjC,IAAI,MAAQ,GAAK,MAAQ,OAAS,IAClC,KAAK,MAAM,UAAY,KAAO,IAAM,KAAK,IAAI,IAAK,KAAK,MAAM,IAAI,CAAC,EAAI,KAAO,GAC7E,SAAS,OAAO,aAAa,EAC/B,CAEA,SAAS,MAAM,SAAU,CACnB,KAAK,SACT,KAAK,OAAS,GACd,KAAK,MAAM,UAAY,GACvB,KAAK,UAAU,OAAO,KAAM,OAAO,EACnC,IAAI,aAAa,gBAAiB,OAAO,EACzC,IAAI,gBAAgB,uBAAuB,EACvC,UAAY,IAAI,MAAM,EAC5B,CAEA,SAAS,OAAO,EAAG,CACb,EAAI,GAAK,GAAK,OAAO,QAAQ,QAC7B,OAAO,QAAQ,CAAC,EAAE,WAClB,OAAO,gBAAkB,IAC3B,OAAO,cAAgB,EAIvB,OAAO,cAAc,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CAAC,EAC1D,OAAO,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,GAE7D,MAAM,EACN,MAAM,EAAI,EACZ,CAGA,IAAI,MAAQ,GACR,QAAU,EACd,SAAS,UAAU,GAAI,CACrB,IAAI,IAAO,OAAO,aAAe,YAAY,IAAO,YAAY,IAAI,EAAI,EACxE,MAAS,IAAM,QAAU,IAAO,MAAQ,GAAK,GAC7C,QAAU,IACV,QAAS,EAAI,EAAG,EAAI,OAAO,QAAQ,OAAQ,IACzC,GAAI,QAAO,QAAQ,CAAC,EAAE,UAClB,OAAO,QAAQ,CAAC,EAAE,YAAY,KAAK,EAAE,YAAY,EAAE,QAAQ,KAAK,IAAM,EAAG,CACvE,KAAK,OAAU,OAAO,CAAC,EAAY,SAAS,CAAC,EACjD,MACF,CAEJ,CAEA,IAAI,iBAAiB,QAAS,UAAY,CACpC,KAAK,OAAU,KAAK,EAAY,MAAM,EAAI,CAChD,CAAC,EAED,IAAI,iBAAiB,UAAW,SAAU,EAAG,CAC3C,IAAI,EAAI,YAAY,EACpB,OAAQ,EAAE,IAAK,CACb,IAAK,YACH,EAAE,eAAe,EACb,KAAK,OAAU,KAAK,EAAY,SAAS,KAAK,IAAI,EAAI,EAAG,QAAQ,OAAS,CAAC,CAAC,EAChF,MACF,IAAK,UACH,EAAE,eAAe,EACb,KAAK,OAAU,KAAK,EAAY,SAAS,KAAK,IAAI,EAAI,EAAG,CAAC,CAAC,EAC/D,MACF,IAAK,OACE,KAAK,SAAU,EAAE,eAAe,EAAG,SAAS,CAAC,GAClD,MACF,IAAK,MACE,KAAK,SAAU,EAAE,eAAe,EAAG,SAAS,QAAQ,OAAS,CAAC,GACnE,MACF,IAAK,QACL,IAAK,IACH,EAAE,eAAe,EACb,KAAK,OAAU,KAAK,EAAY,OAAO,CAAC,EAC5C,MACF,IAAK,SACE,KAAK,SAAU,EAAE,eAAe,EAAG,MAAM,EAAI,GAClD,MACF,IAAK,MACH,MAAM,EAAK,EACX,MACF,QACM,EAAE,IAAI,SAAW,GAAK,CAAC,EAAE,SAAW,CAAC,EAAE,SAAW,CAAC,EAAE,QACvD,UAAU,EAAE,IAAI,YAAY,CAAC,CAEnC,CACF,CAAC,EAED,KAAK,KAAK,CAAE,KAAM,KAAM,MAAO,KAAM,CAAC,EAItC,OAAO,iBAAiB,SAAU,UAAY,CAAE,MAAM,CAAG,CAAC,EAQtD,OAAO,kBACT,IAAI,iBAAiB,UAAY,CAAE,MAAM,CAAG,CAAC,EAC1C,QAAQ,OAAQ,CAAE,UAAW,GAAM,WAAY,GAAM,gBAAiB,CAAC,UAAU,CAAE,CAAC,EAGzF,OAAO,WAAW,aAAa,KAAM,MAAM,EAC3C,KAAK,YAAY,MAAM,EACvB,KAAK,YAAY,GAAG,EACpB,KAAK,YAAY,IAAI,EACrB,MAAM,CACR,CAEA,SAAS,KAAK,MAAO,CACnB,IAAI,KAAO,OAAS,MAAM,iBAAmB,MAAQ,SACrD,MAAM,UAAU,QAAQ,KAAK,KAAK,iBAAiB,yBAAyB,EAAG,KAAK,CACtF,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,UAAY,CAAE,KAAK,QAAQ,CAAG,CAAC,EAE7E,KAAK,QAAQ,EAIf,SAAS,iBAAiB,uBAAwB,SAAU,EAAG,CAAE,KAAK,EAAE,MAAM,CAAG,CAAC,EAClF,OAAO,iBAAmB,KAKtB,OAAO,kBACT,IAAI,iBAAiB,SAAU,QAAS,CACtC,QAAS,EAAI,EAAG,EAAI,QAAQ,OAAQ,IAElC,QADI,MAAQ,QAAQ,CAAC,EAAE,WACd,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,KAAO,MAAM,CAAC,EACd,KAAK,WAAa,IAClB,KAAK,SAAW,KAAK,QAAQ,yBAAyB,EAAK,MAAM,IAAI,EAChE,KAAK,eAAiB,KAAK,cAAc,yBAAyB,GAAK,KAAK,IAAI,EAC3F,CAEJ,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,CAE3E,GAAG",
  "names": []
}
