{
  "version": 3,
  "sources": ["/cdn/shop/t/156/assets/ff-fit.js?bust=1781743780777"],
  "sourcesContent": ["/*! FFFit \u2014 generalized auto-fit engine.\n * Measures each text candidate's NATURAL text width with a Range and shrinks\n * font-size until the text fits its parent's available width (1 line) or a\n * given line count (2 lines via data-fit2). No hardcoded selector list, no\n * nowrap requirement on the source markup, no scrollWidth==clientWidth trap:\n * the Range gives the true rendered text box regardless of element width mode.\n *\n *   window.FFFit.fit(root, opts)   \u2014 one pass over root\n *   window.FFFit.observe(root)     \u2014 fit + keep fitting (resize/mutation/fonts)\n *\n * Safe no-op if root is null/missing. No external deps.\n */\n(function (w, d) {\n  'use strict';\n  if (w.FFFit) return;\n\n  var SKIP_TAGS = { SCRIPT: 1, STYLE: 1, SVG: 1, IMG: 1, INPUT: 1, BR: 1, NOSCRIPT: 1, TEXTAREA: 1, SELECT: 1, OPTION: 1, PATH: 1, CANVAS: 1, VIDEO: 1 };\n\n  function hasText(el) {\n    // true if the element itself directly holds non-whitespace text\n    for (var n = el.firstChild; n; n = n.nextSibling) {\n      if (n.nodeType === 3 && n.nodeValue && /\\S/.test(n.nodeValue)) return true;\n    }\n    return false;\n  }\n\n  function isInline(el) {\n    var disp = w.getComputedStyle(el).display;\n    return disp === 'inline' || disp === 'contents';\n  }\n\n  // A candidate is a \"leaf-ish\" text holder: it carries meaningful text and has\n  // NO descendant block-level element that itself carries text. Inline children\n  // (a, span, b, s, strong, em...) are fine \u2014 they're part of this element's line.\n  function hasBlockTextChild(el) {\n    var kids = el.children;\n    for (var i = 0; i < kids.length; i++) {\n      var c = kids[i];\n      if (SKIP_TAGS[c.tagName]) continue;\n      var carries = hasText(c) || hasBlockTextChild(c);\n      if (!carries) continue;\n      // a child that carries text disqualifies THIS element as a leaf only if\n      // that child is block-level (own line). Inline text children are ok.\n      if (!isInline(c)) return true;\n    }\n    return false;\n  }\n\n  function meaningful(el) {\n    // element's own + inline-descendant text, trimmed\n    var t = (el.textContent || '').replace(/\\s+/g, ' ').trim();\n    return t.length > 0;\n  }\n\n  function collect(root, out) {\n    for (var n = root.firstElementChild; n; n = n.nextElementSibling) {\n      if (SKIP_TAGS[n.tagName]) continue;\n      if (n.hasAttribute && n.hasAttribute('data-no-fit')) continue;\n      if (n.closest && n.closest('[data-no-fit]')) continue;\n      var isCand = meaningful(n) && !hasBlockTextChild(n);\n      if (isCand) {\n        out.push(n);\n      } else {\n        collect(n, out); // descend to find leaf-ish holders deeper down\n      }\n    }\n  }\n\n  function pad(cs, a, b) {\n    return (parseFloat(cs[a]) || 0) + (parseFloat(cs[b]) || 0);\n  }\n\n  // inner content-box width of an element (clientWidth minus horizontal padding)\n  function innerW(el) {\n    var cs = w.getComputedStyle(el);\n    return el.clientWidth - pad(cs, 'paddingLeft', 'paddingRight');\n  }\n\n  // The hard upper bound for any text's available width: the content width of the\n  // nearest [data-fit-root] (or #CartDrawer) ancestor. No intermediate auto-width\n  // wrapper may make the engine think there's more room than the drawer actually\n  // has. Cached per-pass via a Weakish lookup on the element.\n  function rootCap(el) {\n    var p = el.parentElement, guard = 0, cap = Infinity;\n    while (p && guard++ < 40) {\n      var iw = innerW(p);\n      if (iw > 0) {\n        if (p.hasAttribute && (p.hasAttribute('data-fit-root') || p.id === 'CartDrawer')) {\n          return iw; // authoritative bound\n        }\n      }\n      p = p.parentElement;\n    }\n    return cap;\n  }\n\n  // available content-box width for the text. If the element is auto-width\n  // (shrink-to-fit), its own clientWidth just hugs the text, so walk up to the\n  // nearest ancestor that is genuinely width-constrained and use its inner width.\n  // The result is CLAMPED to the nearest width-bounded scroll/offset ancestor and\n  // never exceeds the [data-fit-root]/#CartDrawer content width \u2014 so an unbounded\n  // intermediate wrapper can never trick the engine into \"everything fits\".\n  function availWidth(el) {\n    var cap = rootCap(el); // hard ceiling from the fit-root / drawer\n    var cs = w.getComputedStyle(el);\n    var cw = el.clientWidth - pad(cs, 'paddingLeft', 'paddingRight');\n    var auto = cs.width === 'auto' || isInline(el) ||\n               cs.display === 'inline-block' || cs.display.indexOf('flex') > -1 && cs.flexBasis === 'auto' && cs.width === 'auto';\n    var val = 0;\n    if (!auto && cw > 0) {\n      val = cw;\n    } else {\n      // climb to a constrained ancestor\n      var p = el.parentElement, guard = 0;\n      while (p && guard++ < 12) {\n        var pcs = w.getComputedStyle(p);\n        var pw = p.clientWidth - pad(pcs, 'paddingLeft', 'paddingRight');\n        var pAuto = pcs.display === 'inline' || pcs.width === 'auto' && pcs.display === 'inline-block';\n        if (pw > 0 && !pAuto) { val = pw; break; }\n        p = p.parentElement;\n      }\n      if (!val) val = cw > 0 ? cw : (el.clientWidth || 0);\n    }\n    // Robustness clamp: if our measured \"available\" width meets/exceeds the\n    // offsetParent or scroll container (a sign the element/wrapper is unbounded),\n    // fall back to that bounded ancestor's inner width instead of trusting the\n    // ballooned measurement.\n    var op = el.offsetParent;\n    if (op && op !== el) {\n      var opw = innerW(op);\n      if (opw > 0 && val >= opw - 0.5) val = Math.min(val, opw);\n    }\n    // Never exceed the fit-root / drawer content width.\n    if (isFinite(cap) && cap > 0 && val > cap) val = cap;\n    return val;\n  }\n\n  function textWidth(el) {\n    try {\n      var r = d.createRange();\n      r.selectNodeContents(el);\n      return r.getBoundingClientRect().width;\n    } catch (e) { return el.scrollWidth; }\n  }\n\n  // Set font-size with !important priority. The engine's inline style MUST win\n  // over stylesheet rules like `@media(max-width:768px){.X-v3-card h3{font-size:14px\n  // !important}}` \u2014 a plain inline font-size loses to those, so the shrink had no\n  // visible effect on the real phone (the original root cause of this bug).\n  function setFS(el, px) {\n    if (px == null) { el.style.removeProperty('font-size'); return; }\n    el.style.setProperty('font-size', px + 'px', 'important');\n  }\n  function curFS(el) {\n    return parseFloat(w.getComputedStyle(el).fontSize) || 0;\n  }\n\n  // Is this 1-line element currently rendering on more than one line? (wrapped)\n  function isWrapped(el) {\n    var cs = w.getComputedStyle(el);\n    var lh = parseFloat(cs.lineHeight);\n    if (isNaN(lh) || !lh) lh = (parseFloat(cs.fontSize) || 12) * 1.25;\n    // allow a little slack so single-line elements aren't misjudged\n    return el.scrollHeight > lh * 1.5;\n  }\n\n  function fitOne(el) {\n    var maxLines = (el.hasAttribute('data-fit2') ? 2 : 1);\n\n    // (a) reset to the element's PRISTINE base size, captured ONCE before the\n    // engine ever touched it. removeProperty() here would WIPE an author's inline\n    // font-size and fall back to the larger inherited size -- which silently\n    // inflated every inline-sized element (root cause of \"everything too big\").\n    var baseAttr = el.getAttribute('data-fff-base');\n    var natural;\n    if (baseAttr == null) { natural = curFS(el); if (natural) el.setAttribute('data-fff-base', String(natural)); }\n    else { natural = parseFloat(baseAttr) || curFS(el); }\n    var size = natural;\n    if (!size) return;\n    setFS(el, size); // pin to the base (author) size as the maximum\n\n    // (b) let it shrink within its flex/grid parent and (1-line) stay on one line.\n    // Use !important on nowrap too so a stylesheet white-space rule can't re-wrap\n    // the line out from under us (mirrors the font-size !important fix).\n    el.style.setProperty('min-width', '0', 'important');\n    var prevWS = el.style.whiteSpace;\n    if (maxLines === 1) el.style.setProperty('white-space', 'nowrap', 'important');\n\n    var minAttr = parseFloat(el.getAttribute('data-fit-min'));\n    var minPx = !isNaN(minAttr) ? minAttr : Math.max(9, size * 0.6);\n\n    var guard = 0;\n    if (maxLines === 1) {\n      // (c)+(d) measure TEXT width via Range vs available content width.\n      // availWidth() is clamped to the fit-root / drawer so an unbounded wrapper\n      // can't report a too-large available width.\n      var avail = availWidth(el);\n      if (avail > 0) {\n        var tw = textWidth(el);\n        // Shrink while the text is wider than available OR it is still wrapping\n        // to a second line (rendered height > one line) at the current size.\n        while ((tw > avail - 2 || isWrapped(el)) && size > minPx && guard++ < 200) {\n          size -= 0.5;\n          setFS(el, size);\n          tw = textWidth(el);\n        }\n      }\n    } else {\n      // 2-line: allow wrapping, shrink until rendered height fits 2 lines\n      el.style.whiteSpace = prevWS || '';\n      var cs2 = w.getComputedStyle(el);\n      var lh = parseFloat(cs2.lineHeight);\n      if (isNaN(lh)) lh = size * 1.25;\n      var maxH = lh * maxLines + 1;\n      while (el.scrollHeight > maxH && size > minPx && guard++ < 200) {\n        size -= 0.5;\n        setFS(el, size);\n        cs2 = w.getComputedStyle(el);\n        lh = parseFloat(cs2.lineHeight) || size * 1.25;\n        maxH = lh * maxLines + 1;\n      }\n    }\n  }\n\n  function fit(root, opts) {\n    if (typeof root === 'string') root = d.querySelector(root);\n    if (!root) return; // safe no-op\n    var list = [];\n    collect(root, list);\n    for (var i = 0; i < list.length; i++) {\n      try { fitOne(list[i]); } catch (e) {}\n    }\n  }\n\n  // batched/debounced runner\n  function makeRunner(root) {\n    var raf = 0, pending = false;\n    return function run() {\n      if (pending) return;\n      pending = true;\n      var go = function () { pending = false; fit(root); };\n      if (w.requestAnimationFrame) raf = w.requestAnimationFrame(go);\n      else go();\n    };\n  }\n\n  function debounce(fn, ms) {\n    var t = 0;\n    return function () { clearTimeout(t); t = setTimeout(fn, ms); };\n  }\n\n  function observe(root, opts) {\n    if (typeof root === 'string') root = d.querySelector(root);\n    if (!root) return function () {}; // safe no-op disconnect\n    var run = makeRunner(root);\n    var draw = debounce(run, 80);\n\n    run(); // initial pass\n\n    var ro = null, mo = null;\n    if (w.ResizeObserver) { ro = new w.ResizeObserver(draw); try { ro.observe(root); } catch (e) {} }\n    if (w.MutationObserver) {\n      mo = new w.MutationObserver(draw);\n      try { mo.observe(root, { childList: true, subtree: true, characterData: true }); } catch (e) {}\n    }\n    var onResize = debounce(run, 120);\n    w.addEventListener('resize', onResize);\n\n    if (d.fonts && d.fonts.ready) { try { d.fonts.ready.then(run); } catch (e) {} }\n    if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', run);\n    w.addEventListener('load', run);\n\n    return function disconnect() {\n      if (ro) ro.disconnect();\n      if (mo) mo.disconnect();\n      w.removeEventListener('resize', onResize);\n    };\n  }\n\n  w.FFFit = { fit: fit, observe: observe };\n})(window, document);\n"],
  "mappings": "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",
  "names": []
}
