{
  "version": 3,
  "sources": ["/cdn/shop/t/1044/assets/precut-v3-injector.js?bust=1779761311535"],
  "sourcesContent": ["/* cache-bust: 2026-05-26-r92b-restore-desktop-real */\n/* Pre-cut V3 upsell card injector \u2014 standalone asset to bypass the\n   bySize_popular.js CDN cache issue on staging. Loaded directly by\n   layout/theme.liquid on dtf-transfers + dtf-transfers-by-size-v2.\n\n   Bound at script-load time (no DOMContentLoaded gate) so it runs as\n   early as possible. Reads editable copy from window.__precutV3Settings\n   (emitted by layout/theme.liquid from theme settings). */\n(function () {\n  /* V3 markup injection disabled for LIVE theme push (#146580111443).\n     Live theme keeps the existing precut markup unchanged per user. */\n  if (typeof window === 'undefined' || true /* live: keep existing precut */) return;\n  if (typeof window === 'undefined' || window.__ntPrecutV3InjectedStandalone) return;\n\n  function shouldInject() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  function escapeHtml(s) {\n    return String(s)\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n  function buildV3Markup(checkboxId) {\n    var s = (typeof window !== 'undefined' && window.__precutV3Settings) || {};\n    var titleDefault = s.titleDefault || 'Pre-cut your transfers?';\n    var titleChecked = s.titleChecked || 'Pre-cutting added';\n    var bullet1      = s.bullet1      || 'Comes Ready to Apply';\n    var bullet2      = s.bullet2      || 'Save an hour per 50 transfers';\n    var priceAmount  = s.priceAmount  || '+$0.19';\n    var priceUnit    = s.priceUnit    || 'per transfer';\n    var tooltip      = s.tooltip      || 'We trim each transfer to shape so you can press straight from the pack \u2014 no scissors, no weeding the excess film.';\n\n    var checkSvg =\n      '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\">' +\n        '<path d=\"M3.5 8.2l3 3 6-6.5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n      '</svg>';\n    var bulletSvg =\n      '<svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">' +\n        '<path d=\"M3.5 8.2l3 3 6-6.5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n      '</svg>';\n    return (\n      '<label for=\"' + checkboxId + '\" class=\"pc-upgrade__row\">' +\n        '<input type=\"checkbox\" id=\"' + checkboxId + '\" class=\"pc-upgrade__input\">' +\n        '<span class=\"pc-upgrade__check\" aria-hidden=\"true\">' + checkSvg + '</span>' +\n        '<span class=\"pc-upgrade__main\">' +\n          '<span class=\"pc-upgrade__title\">' +\n            '<span class=\"pc-upgrade__title-text pc-upgrade__title-text--default\">' + escapeHtml(titleDefault) + '</span>' +\n            '<span class=\"pc-upgrade__title-text pc-upgrade__title-text--checked\">' + escapeHtml(titleChecked) + '</span>' +\n            '<span class=\"pc-upgrade__info\" role=\"button\" tabindex=\"0\" aria-label=\"More info about pre-cut transfers\" onclick=\"event.preventDefault();event.stopPropagation();\">' +\n              '<span class=\"pc-upgrade__tooltip\" role=\"tooltip\">' + escapeHtml(tooltip) + '</span>' +\n            '</span>' +\n          '</span>' +\n          '<ul class=\"pc-upgrade__features\">' +\n            '<li>' + bulletSvg + ' ' + escapeHtml(bullet1) + '</li>' +\n            '<li>' + bulletSvg + ' ' + escapeHtml(bullet2) + '</li>' +\n          '</ul>' +\n        '</span>' +\n        '<span class=\"pc-upgrade__price\">' +\n          '<span class=\"pc-upgrade__price-amt\">' + escapeHtml(priceAmount) + '</span>' +\n          '<span class=\"pc-upgrade__price-unit\">' + escapeHtml(priceUnit) + '</span>' +\n        '</span>' +\n        '<strong class=\"nodisplay precut-cost\" hidden>$0.19 each</strong>' +\n      '</label>'\n    );\n  }\n  function transformOne(precutEl) {\n    if (!precutEl || precutEl.classList.contains('pc-upgrade')) return;\n    var existingCheckbox = precutEl.querySelector('input[type=\"checkbox\"]');\n    var checkboxId = existingCheckbox ? existingCheckbox.id : 'preCutOption';\n    var wasChecked = existingCheckbox ? existingCheckbox.checked : false;\n    precutEl.classList.add('pc-upgrade');\n    precutEl.innerHTML = buildV3Markup(checkboxId);\n    if (wasChecked) {\n      var newInput = precutEl.querySelector('#' + checkboxId);\n      if (newInput) {\n        newInput.checked = true;\n        try { newInput.dispatchEvent(new Event('change', { bubbles: true })); } catch (_e) {}\n      }\n    }\n  }\n  function transformAll() {\n    if (!shouldInject()) return;\n    var nodes = document.querySelectorAll('precut:not(.pc-upgrade)');\n    nodes.forEach(transformOne);\n  }\n  function init() {\n    if (window.__ntPrecutV3InjectedStandalone) return;\n    window.__ntPrecutV3InjectedStandalone = true;\n    transformAll();\n    var mo = new MutationObserver(function (muts) {\n      var needsScan = false;\n      for (var i = 0; i < muts.length; i++) {\n        var m = muts[i];\n        for (var j = 0; j < m.addedNodes.length; j++) {\n          var n = m.addedNodes[j];\n          if (n.nodeType !== 1) continue;\n          if (n.tagName === 'PRECUT' || (n.querySelector && n.querySelector('precut:not(.pc-upgrade)'))) {\n            needsScan = true;\n            break;\n          }\n        }\n        if (needsScan) break;\n      }\n      if (needsScan) transformAll();\n    });\n    if (document.body) {\n      mo.observe(document.body, { childList: true, subtree: true });\n    } else {\n      document.addEventListener('DOMContentLoaded', function () {\n        mo.observe(document.body, { childList: true, subtree: true });\n      });\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Combined info row: price | printed-by-ninja | reviews \u2500\u2500\u2500\u2500\n   Default markup renders the reviews widget and the \"As Low As\"\n   price as two stacked rows, with the \"Printed Directly by Ninja\"\n   description as a 3rd row. Both desktop and mobile want all three\n   on ONE row, separated by light-gray pipe dividers:\n       [As Low As $0.02/sq in]  |  [\uD83C\uDDFA\uD83C\uDDF8 Printed by Ninja. Ships from USA]  |  [\u2B50\u2B50\u2B50\u2B50\u2B50 20,643 Reviews]\n   Mobile differences:\n     \u2022 \"As Low As\" \u2192 \"From\"\n     \u2022 Reviews widget: strip the trailing \" Reviews\" word so only\n       stars + count remain (saves horizontal room).\n   The standalone .product__description block is hidden by CSS \u2014 the\n   pill in this row is the only place that copy appears now.\n   Idempotent via __ntInfoRowV2. */\n(function () {\n  if (typeof window === 'undefined' || window.__ntInfoRowV2) return;\n  function isMobile() { return window.innerWidth <= 1199; }\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  function flagSvg() {\n    return '<svg width=\"18\" height=\"13\" viewBox=\"0 0 20 14\" aria-hidden=\"true\" ' +\n           'style=\"border-radius:2px;flex-shrink:0;display:inline-block;vertical-align:middle;\">' +\n             '<rect width=\"20\" height=\"14\" fill=\"#B22234\"/>' +\n             '<rect y=\"1.077\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect y=\"3.231\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect y=\"5.385\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect y=\"7.538\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect y=\"9.692\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect y=\"11.846\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n             '<rect width=\"8\" height=\"7.538\" fill=\"#3C3B6E\"/>' +\n           '</svg>';\n  }\n  function buildSeparator() {\n    var s = document.createElement('span');\n    s.className = 'nt-info-sep';\n    s.setAttribute('aria-hidden', 'true');\n    s.style.cssText = 'color:#d1d5db;font-weight:300;flex-shrink:0;font-size:18px;line-height:1;';\n    s.textContent = '|';\n    return s;\n  }\n  function buildPill(mobile) {\n    var p = document.createElement('span');\n    p.className = 'nt-printed-inline';\n    /* Tier 1 (r79): render BOTH copy variants inline; CSS @media\n       toggles which one is visible. That way resizing the browser\n       between mobile and desktop swaps the text automatically\n       without JS having to re-render the pill. */\n    p.style.cssText = 'display:inline-flex;align-items:center;gap:6px;color:#000;' +\n                      'font-weight:500;white-space:nowrap;flex-shrink:1;min-width:0;' +\n                      'font-family:Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;';\n    p.innerHTML =\n      '<span class=\"nt-pill-text-desktop\">Printed by Ninja. Ships from </span>' +\n      '<span class=\"nt-pill-text-mobile\">Ships from </span>' +\n      flagSvg();\n    return p;\n  }\n  /* Add thousands separators (12345 \u2192 12,345). */\n  function commafy(numStr) {\n    return String(numStr).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  }\n  function formatReviewsText(mobile) {\n    /* Yotpo's bottom-line text reads e.g. \"20957 Reviews\" or\n       \"20,957 Reviews\" depending on locale. Format the number with\n       comma separators on BOTH viewports. On MOBILE also strip the\n       \" Reviews\" word and shrink the count font-size 5%. Yotpo\n       re-renders periodically so we have to run after each render.\n       Returns true when at least one node was successfully formatted\n       so the caller can mark the widget visible. */\n    var nodes = document.querySelectorAll(\n      '.yotpo-sr-bottom-line-summary .yotpo-sr-bottom-line-text-2-text, ' +\n      '.yotpo-sr-bottom-line-summary .yotpo-sr-bottom-line-text, ' +\n      '.yotpo-sr-bottom-line-text'\n    );\n    var didAny = false;\n    nodes.forEach(function (n) {\n      var t = (n.textContent || '');\n      var m = t.match(/(\\d[\\d,]*)\\s*(Reviews?)/i);\n      if (!m) return;\n      var rawNum = m[1].replace(/,/g, '');\n      var nice = commafy(rawNum);\n      var target = mobile ? nice : (nice + ' ' + m[2]);\n      if (n.textContent !== target) n.textContent = target;\n      /* Match the row-wide font size + family (mobile 5% smaller). */\n      n.style.setProperty('font-size', mobile ? '12.35px' : '16px', 'important');\n      n.style.setProperty('font-family',\n        'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n        'important');\n      didAny = true;\n    });\n    if (didAny) {\n      /* Mark the yotpo widget container ready so the CSS hide rule\n         releases. Targets both the Yotpo widget instance and the\n         Shopify app-block wrapper for safety. */\n      var ctn = document.querySelectorAll(\n        '.product-text .has-bg-style--primary .yotpo-widget-instance, ' +\n        '.product-text .has-bg-style--primary .shopify-app-block'\n      );\n      ctn.forEach(function (el) { el.setAttribute('data-nt-yotpo-ready', '1'); });\n    }\n    return didAny;\n  }\n  function run() {\n    if (window.__ntInfoRowV2) return;\n    if (!shouldRun()) return;\n    var reviews = document.querySelector('.product-text .has-bg-style--primary');\n    var alow    = document.querySelector('.product-text ._flex-box');\n    if (!reviews || !alow) return;\n    window.__ntInfoRowV2 = true;\n\n    var mobile = isMobile();\n    var strong = alow.querySelector('._cost_value, strong');\n    var priceSpan = alow.querySelector('._styledtext, span');\n    /* Per-viewport font size \u2014 desktop matches Yotpo's natural 16px,\n       mobile is 13px (14.4 \u00D7 0.95 \u2014 5% smaller per design tweak).\n       Everything in the row uses the SAME size + family so the text\n       optically aligns. */\n    var rowFont = mobile ? '12.35px' : '16px';\n    var rowFamily = 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\n\n    /* Rewrite the price copy:\n         Desktop: \"As Low As\" + \"$0.02/sq in\" (drop \"per square inch\")\n         Mobile:  \"From\"      + \"$0.02/sq in\" */\n    if (strong) {\n      strong.textContent = mobile ? 'From ' : 'As Low As ';\n      strong.style.setProperty('color', '#019AFF', 'important');\n      strong.style.setProperty('font-weight', '600', 'important');\n      strong.style.setProperty('font-size', rowFont, 'important');\n      strong.style.setProperty('font-family', rowFamily, 'important');\n    }\n    if (priceSpan) {\n      var raw = priceSpan.textContent || '';\n      var match = raw.match(/\\$[\\d.]+/);\n      priceSpan.innerHTML = '<strong>' + (match ? match[0] : '$0.02') + '/sq in</strong>';\n      priceSpan.style.setProperty('color', '#000', 'important');\n      priceSpan.style.setProperty('font-weight', '700', 'important');\n      priceSpan.style.setProperty('margin-left', '4px', 'important');\n      /* Override the section's `._styledtext { font-size: 0.9rem }`\n         so this matches the rest of the row. */\n      priceSpan.style.setProperty('font-size', rowFont, 'important');\n      priceSpan.style.setProperty('font-family', rowFamily, 'important');\n      var innerStrong = priceSpan.querySelector('strong');\n      if (innerStrong) {\n        innerStrong.style.setProperty('font-size', rowFont, 'important');\n        innerStrong.style.setProperty('font-family', rowFamily, 'important');\n      }\n    }\n\n    /* Lay out the reviews container as a single-line flex row. */\n    reviews.style.display = 'flex';\n    reviews.style.alignItems = 'center';\n    reviews.style.justifyContent = 'flex-start';\n    reviews.style.gap = mobile ? '8px' : '14px';\n    reviews.style.flexWrap = 'nowrap';\n    reviews.style.paddingLeft = '0';\n    reviews.style.paddingRight = '0';\n    reviews.style.width = '100%';\n    reviews.style.boxSizing = 'border-box';\n    reviews.style.margin = '4px 0 0';\n\n    /* Price block layout \u2014 font-size/family sync'd with the rest of\n       the row. */\n    alow.style.flexShrink = '0';\n    alow.style.margin = '0';\n    alow.style.padding = '0';\n    alow.style.fontSize = rowFont;\n    alow.style.fontFamily = rowFamily;\n    alow.style.lineHeight = '1.2';\n    alow.style.whiteSpace = 'nowrap';\n\n    /* Move price to the FIRST position and insert pipes + pill. */\n    reviews.insertBefore(alow, reviews.firstChild);\n    var sep1 = buildSeparator();\n    var pill = buildPill(mobile);\n    var sep2 = buildSeparator();\n    alow.parentNode.insertBefore(sep1, alow.nextSibling);\n    sep1.parentNode.insertBefore(pill, sep1.nextSibling);\n    pill.parentNode.insertBefore(sep2, pill.nextSibling);\n\n    /* yotpo widget keeps its layout; match the row's font size +\n       family so the count text is rendered consistently. */\n    var yotpo = reviews.querySelector('.yotpo-widget-instance, .shopify-app-block');\n    if (yotpo) {\n      yotpo.style.flex = '0 0 auto';\n      yotpo.style.minWidth = '0';\n      yotpo.style.fontSize = rowFont;\n      yotpo.style.fontFamily = rowFamily;\n    }\n\n    /* Mark the row layout as transformed so the row-level FOUC rule\n       releases. The yotpo widget itself stays hidden by a SEPARATE\n       rule until we successfully format its text. */\n    reviews.setAttribute('data-nt-info-row', '1');\n\n    /* Format the review count immediately if Yotpo has already\n       rendered. If not, install a MutationObserver on the row so\n       we format the MOMENT Yotpo paints \u2014 no visible flash. */\n    if (formatReviewsText(mobile)) return;\n    var mo = new MutationObserver(function () {\n      if (formatReviewsText(mobile)) {\n        /* Keep observing for re-renders so the format sticks, but\n           note success. */\n      }\n    });\n    mo.observe(reviews, { childList: true, subtree: true, characterData: true });\n    /* Hard stop after 20s to avoid leaks if Yotpo never loads. */\n    setTimeout(function () { mo.disconnect(); }, 20000);\n  }\n  function init() {\n    run();\n    /* yotpo/widget elements hydrate async \u2014 watch for them appearing. */\n    if (!window.__ntInfoRowV2) {\n      var pt = document.querySelector('.product-text');\n      if (pt) {\n        var mo = new MutationObserver(function () {\n          run();\n          if (window.__ntInfoRowV2) mo.disconnect();\n        });\n        mo.observe(pt, { childList: true, subtree: true });\n        setTimeout(function () { mo.disconnect(); }, 10000);\n      }\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Mobile-only: shorten 4 selling points + lay out 2-per-row \u2500\u2500\n   Default markup renders four `.iconTextBlock__item` rows stacked\n   1-per-line on mobile. Reduce verbosity (e.g. \"Works on Any Fabric\n   or Color\" \u2192 \"Any fabric or color\") and lay them out in a 2\u00D72 grid\n   so all four fit in two rows with their icons. CSS in theme.css\n   handles the grid; this JS just rewrites the text. */\n(function () {\n  if (typeof window === 'undefined' || window.__ntSellingPointsShortened) return;\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    var isMob = window.innerWidth <= 1199;\n    return isMob && (bc.indexOf('template-product-by-size-tabs') > -1 ||\n                     bc.indexOf('template-product-by-size-bg-options') > -1);\n  }\n  /* Mapping from current copy to the shorter mobile version. Match\n     by keyword so any tail variations still rewrite. The `kind` slot\n     identifies which icon to use AND drives mobile reorder. */\n  var REWRITES = [\n    { kind: 'fabric',  match: /works on any fabric|any fabric or color/i,                              to: 'Any fabric or color' },\n    { kind: 'vibrant', match: /vibrant colors|ultra-fine details|vibrant ultra-fine|colors\\s*&\\s*details/i, to: 'Vibrant Colors & Details' },\n    { kind: 'washes',  match: /certified for 100\\+ washes|certified 100\\+ washes|100\\+ washes/i,        to: '100+ Washes' },\n    { kind: 'shield',  match: /100% satisfaction guaranteed|satisfaction guaranteed|100% guaranteed/i,   to: 'Satisfaction Guaranteed' }\n  ];\n  /* Rewrite ONLY the first text node child of .iconTextBlock__iconText,\n     leaving the sibling popup div (info icon link) intact. */\n  function setLabel(textBox, newLabel) {\n    var first = null;\n    var kids = textBox.childNodes;\n    for (var k = 0; k < kids.length; k++) {\n      if (kids[k].nodeType === 3 /* TEXT_NODE */ &&\n          (kids[k].textContent || '').trim().length > 0) {\n        first = kids[k];\n        break;\n      }\n    }\n    if (first) {\n      first.textContent = newLabel + ' ';\n    } else {\n      /* No leading text node \u2014 prepend one without touching siblings. */\n      textBox.insertBefore(document.createTextNode(newLabel + ' '), textBox.firstChild);\n    }\n  }\n  function rewrite() {\n    if (window.__ntSellingPointsShortened) return;\n    if (!shouldRun()) return;\n    var items = document.querySelectorAll('.product-text .iconTextBlock .iconTextBlock__item');\n    if (!items.length) return;\n    var matched = 0;\n    var byKind = {};\n    items.forEach(function (item) {\n      var textBox = item.querySelector('.iconTextBlock__iconText');\n      if (!textBox) return;\n      var current = (textBox.textContent || '').trim();\n      for (var i = 0; i < REWRITES.length; i++) {\n        if (REWRITES[i].match.test(current)) {\n          setLabel(textBox, REWRITES[i].to);\n          item.setAttribute('data-nt-kind', REWRITES[i].kind);\n          byKind[REWRITES[i].kind] = item;\n          matched++;\n          break;\n        }\n      }\n    });\n    /* NOTE: DOM reorder used to live here (insertBefore washes\n       before vibrant) but CSS now handles the visual swap via\n       `order: 1/3/2/4`. Doing both broke :nth-child label assignment\n       \u2014 once JS moved washes to DOM position 2, my CSS ::before\n       rules (keyed by :nth-child) put \"Vibrant\" on the washes item\n       and \"100+ Washes\" on the vibrant item. CSS-only reorder keeps\n       DOM stable so :nth-child stays mapped to the original items. */\n    if (matched >= 4) window.__ntSellingPointsShortened = true;\n  }\n  function init() {\n    rewrite();\n    if (!window.__ntSellingPointsShortened) {\n      var pt = document.querySelector('.product-text');\n      if (pt) {\n        var mo = new MutationObserver(function () {\n          rewrite();\n          if (window.__ntSellingPointsShortened) mo.disconnect();\n        });\n        mo.observe(pt, { childList: true, subtree: true });\n        setTimeout(function () { mo.disconnect(); }, 10000);\n      }\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Replace iconTextBlock icons with new rounded-square SVGs \u2500\u2500\u2500\u2500\n   The default markup has `<img>` icons inside `.iconTextBlock__iconWrap`\n   sourced from Shopify metafields. We override them with custom\n   inline SVGs that render as a light-blue rounded square outline\n   with a matching blue icon glyph inside (t-shirt / sparkle /\n   washer / shield-check). Idempotent via __ntIconsReplacedV2.\n   Matched by KIND attribute set by the selling-points block (when\n   that runs on mobile), or by text content directly (desktop). */\n(function () {\n  if (typeof window === 'undefined' || window.__ntIconsReplacedV2) return;\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  var BLUE = '#019AFF';\n  function svgFor(kind) {\n    var head = '<svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">' +\n               '<rect x=\"0.75\" y=\"0.75\" width=\"26.5\" height=\"26.5\" rx=\"5\" stroke=\"' + BLUE + '\" stroke-width=\"1.5\"/>';\n    var glyph = '';\n    switch (kind) {\n      case 'fabric':\n        /* t-shirt */\n        glyph = '<path d=\"M11 7c0 1.7 1.3 3 3 3s3-1.3 3-3M9 8L7 9v3l2 1v8h10v-8l2-1V9l-2-1-2-1h-2l-3 2-3-2H11L9 8z\" ' +\n                'stroke=\"' + BLUE + '\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>';\n        break;\n      case 'vibrant':\n        /* sparkles / diamond */\n        glyph = '<path d=\"M14 6.5l1.6 4 4 1.6-4 1.6-1.6 4-1.6-4-4-1.6 4-1.6L14 6.5z\" ' +\n                'stroke=\"' + BLUE + '\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>' +\n                '<path d=\"M20 17.5l.7 1.6 1.6.7-1.6.7-.7 1.6-.7-1.6-1.6-.7 1.6-.7.7-1.6z\" ' +\n                'fill=\"' + BLUE + '\"/>';\n        break;\n      case 'washes':\n        /* washing machine */\n        glyph = '<rect x=\"7\" y=\"6.5\" width=\"14\" height=\"15\" rx=\"2\" stroke=\"' + BLUE + '\" stroke-width=\"1.4\"/>' +\n                '<circle cx=\"14\" cy=\"15\" r=\"3.5\" stroke=\"' + BLUE + '\" stroke-width=\"1.4\"/>' +\n                '<circle cx=\"14\" cy=\"15\" r=\"1.2\" stroke=\"' + BLUE + '\" stroke-width=\"1.2\"/>' +\n                '<circle cx=\"10\" cy=\"9\" r=\"0.7\" fill=\"' + BLUE + '\"/>' +\n                '<circle cx=\"12.5\" cy=\"9\" r=\"0.7\" fill=\"' + BLUE + '\"/>';\n        break;\n      case 'shield':\n        /* shield with checkmark */\n        glyph = '<path d=\"M14 6.5l5.5 2v4.5c0 4-2.5 6-5.5 7-3-1-5.5-3-5.5-7V8.5L14 6.5z\" ' +\n                'stroke=\"' + BLUE + '\" stroke-width=\"1.4\" stroke-linejoin=\"round\" fill=\"none\"/>' +\n                '<path d=\"M11.5 13.5l1.7 1.7 3.3-3.3\" ' +\n                'stroke=\"' + BLUE + '\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>';\n        break;\n      default:\n        return '';\n    }\n    return head + glyph + '</svg>';\n  }\n  /* Match by data-nt-kind first (set by selling-points block), or by\n     keyword in the label text. Order matters: more specific patterns\n     come first because they're tested in sequence and the first match\n     wins. /fabric|color/ is last because \"color\" also appears in\n     \"Vibrant Colors\", which would otherwise steal the sparkle icon. */\n  var TEXT_TO_KIND = [\n    { match: /vibrant|details/i,         kind: 'vibrant' },\n    { match: /washes/i,                  kind: 'washes' },\n    { match: /satisfaction|guaranteed/i, kind: 'shield' },\n    { match: /fabric|color/i,            kind: 'fabric' }\n  ];\n  function detectKind(item) {\n    var attr = item.getAttribute('data-nt-kind');\n    if (attr) return attr;\n    var textBox = item.querySelector('.iconTextBlock__iconText');\n    if (!textBox) return null;\n    var t = (textBox.textContent || '').trim();\n    for (var i = 0; i < TEXT_TO_KIND.length; i++) {\n      if (TEXT_TO_KIND[i].match.test(t)) return TEXT_TO_KIND[i].kind;\n    }\n    return null;\n  }\n  function run() {\n    if (window.__ntIconsReplacedV2) return;\n    if (!shouldRun()) return;\n    var items = document.querySelectorAll('.product-text .iconTextBlock .iconTextBlock__item');\n    if (!items.length) return;\n    var done = 0;\n    items.forEach(function (item) {\n      var wrap = item.querySelector('.iconTextBlock__iconWrap');\n      if (!wrap) return;\n      if (wrap.getAttribute('data-nt-icon-replaced') === '1') { done++; return; }\n      var kind = detectKind(item);\n      if (!kind) return;\n      var html = svgFor(kind);\n      if (!html) return;\n      wrap.innerHTML = html;\n      wrap.setAttribute('data-nt-icon-replaced', '1');\n      /* Strip the section's circle bg so only OUR SVG border shows. */\n      wrap.style.background = 'transparent';\n      wrap.style.padding = '0';\n      wrap.style.width = '28px';\n      wrap.style.height = '28px';\n      wrap.style.minWidth = '28px';\n      wrap.style.borderRadius = '0';\n      wrap.style.display = 'inline-flex';\n      wrap.style.alignItems = 'center';\n      wrap.style.justifyContent = 'center';\n      done++;\n    });\n    if (done >= 4) window.__ntIconsReplacedV2 = true;\n  }\n  function init() {\n    run();\n    if (!window.__ntIconsReplacedV2) {\n      var pt = document.querySelector('.product-text');\n      if (pt) {\n        var mo = new MutationObserver(function () {\n          run();\n          if (window.__ntIconsReplacedV2) mo.disconnect();\n        });\n        mo.observe(pt, { childList: true, subtree: true });\n        setTimeout(function () { mo.disconnect(); }, 10000);\n      }\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Polish the .delivery-block row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Two changes per design spec:\n     1. Prepend a small package-box icon (matching the new selling-\n        point icon family: light-blue rounded square + glyph) right\n        before the \"Fastest Delivery\" text.\n     2. Color the countdown <strong> (e.g. \"22h 51m\") blue \u2014 the\n        FIRST <strong> (\"May. 27\") stays its default color.\n   Idempotent via __ntDeliveryPolished. */\n(function () {\n  if (typeof window === 'undefined' || window.__ntDeliveryPolished) return;\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  var BLUE = '#019AFF';\n  /* Clean package box (no outer rounded-square frame), 24\u00D724. Stroke\n     in blue, sized 24px so it reads bigger than the previous outlined\n     22px version. Lucide-style package glyph. */\n  function boxIconSvg() {\n    /* 22.8px = 24 \u00D7 0.95 \u2014 5% smaller per design tweak. */\n    return '<svg class=\"nt-delivery-box-icon\" width=\"22.8\" height=\"22.8\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" ' +\n           'style=\"flex-shrink:0;display:inline-block;vertical-align:-5px;margin-right:6px;\">' +\n             '<path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" stroke=\"' + BLUE + '\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>' +\n             '<polyline points=\"3.27 6.96 12 12.01 20.73 6.96\" stroke=\"' + BLUE + '\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>' +\n             '<line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\" stroke=\"' + BLUE + '\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>' +\n             '<path d=\"M16.5 9.4l-9-5.19\" stroke=\"' + BLUE + '\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>' +\n           '</svg>';\n  }\n  function run() {\n    if (window.__ntDeliveryPolished) return;\n    if (!shouldRun()) return;\n    /* The visible delivery text lives DIRECTLY inside the custom\n       element <fastest-deliver-placeholder>, not inside the inner\n       .delivery-block > .textinfodel (which is display:none and\n       holds the template strings the JS countdown copies from). */\n    var ph = document.querySelector('fastest-deliver-placeholder');\n    if (!ph) return;\n    /* Remove the inner .delivery-block \u2014 it only renders my old\n       (incorrectly placed) SVG and a hidden span. Cleaner to scrub it. */\n    var oldBlock = ph.querySelector('.delivery-block');\n    if (oldBlock) oldBlock.style.display = 'none';\n    /* Prepend the new box icon as the FIRST child of the placeholder\n       so it renders inline with the \"Fastest Delivery\" text. */\n    if (!ph.querySelector(':scope > .nt-delivery-box-icon')) {\n      ph.insertAdjacentHTML('afterbegin', boxIconSvg());\n    }\n    /* Color the LAST <strong> (countdown) blue. The countdown JS\n       re-renders this <strong> every tick so we keep re-applying via\n       the observer below. */\n    var strongs = ph.querySelectorAll(':scope > strong');\n    if (strongs.length >= 1) {\n      var last = strongs[strongs.length - 1];\n      last.style.setProperty('color', BLUE, 'important');\n      last.style.setProperty('font-weight', '700', 'important');\n    }\n    window.__ntDeliveryPolished = true;\n  }\n  function init() {\n    run();\n    /* Keep observing \u2014 the countdown re-renders the placeholder\n       periodically and would otherwise wipe our icon / strong color.\n       Re-running run() is cheap (idempotent inserts via :scope check). */\n    var pt = document.querySelector('.product-text');\n    if (pt) {\n      var mo = new MutationObserver(function () {\n        /* Reset the flag so run() does its work again, then re-set. */\n        window.__ntDeliveryPolished = false;\n        run();\n      });\n      mo.observe(pt, { childList: true, subtree: true });\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 DISABLED: Standalone \"Printed by Ninja\" pill \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   The pill content was moved into the combined info row above (the\n   __ntInfoRowV2 block). The original .product__description block is\n   hidden via theme.css. This whole IIFE is short-circuited so the\n   old pill never appears, but the code stays in place for reference\n   in case we need to roll back to a separate row. */\n(function () {\n  if (typeof window === 'undefined' || true /* always skip */) return;\n  if (typeof window === 'undefined' || window.__ntPrintedByNinjaBadge) return;\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  function run() {\n    if (window.__ntPrintedByNinjaBadge) return;\n    if (!shouldRun()) return;\n    /* Find the description block. Match by the leading text so we\n       don't accidentally replace some other RTE block on a future\n       product variant. */\n    var desc = document.querySelector('.product-text .product__description');\n    if (!desc) return;\n    var txt = (desc.textContent || '').trim();\n    if (txt.indexOf('Printed') === -1) return;\n    window.__ntPrintedByNinjaBadge = true;\n    /* Build the badge markup. Inline styles so we don't depend on a\n       CSS push landing \u2014 bg + radius + padding all set here. The\n       SVG flag is inlined (works everywhere, no emoji rendering\n       inconsistency between iOS / Android / desktop). */\n    /* Desktop shows the single shorter phrase, mobile shows the\n       3-part bulleted version. */\n    var isMobile = window.innerWidth <= 1199;\n    var inner = isMobile\n      ? '<span>Printed by Ninja</span>' +\n        '<span aria-hidden=\"true\" style=\"color:#9aa0a6;\">\u2022</span>' +\n        '<span>Never outsourced</span>' +\n        '<span aria-hidden=\"true\" style=\"color:#9aa0a6;\">\u2022</span>' +\n        '<span>Ships from USA</span>'\n      : '<span>Always Ships From USA</span>';\n    var html =\n      '<div class=\"nt-printed-badge\" style=\"' +\n        'display:inline-flex;align-items:center;gap:8px;' +\n        'background:#f2f2f2;border-radius:999px;' +\n        'padding:6px 14px;' +\n        'font-family:Inter,-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',Roboto,sans-serif;' +\n        'font-size:12.35px;font-weight:600;color:#2B2B2B;' + /* 13px -5% */\n        'line-height:1.2;white-space:nowrap;' +\n      '\">' +\n        /* USA flag SVG \u2014 20\u00D714, rounded a touch, lightweight. */\n        '<svg width=\"20\" height=\"14\" viewBox=\"0 0 20 14\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" style=\"flex-shrink:0;border-radius:2px;overflow:hidden;\">' +\n          '<rect width=\"20\" height=\"14\" fill=\"#B22234\"/>' +\n          '<rect y=\"1.077\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect y=\"3.231\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect y=\"5.385\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect y=\"7.538\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect y=\"9.692\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect y=\"11.846\" width=\"20\" height=\"1.077\" fill=\"#fff\"/>' +\n          '<rect width=\"8\" height=\"7.538\" fill=\"#3C3B6E\"/>' +\n        '</svg>' +\n        inner +\n      '</div>';\n    desc.innerHTML = html;\n    /* The container itself might have block layout / padding from the\n       theme \u2014 make sure it stays inline so the pill sits naturally\n       in the column flow. */\n    desc.style.padding = '0';\n    desc.style.margin = '8px 0 0';\n    /* On narrow mobile viewports the row wraps to two lines if the\n       text is too wide. Allow wrap by overriding nowrap on the pill\n       when the viewport is below 420 px. */\n    if (window.innerWidth < 420) {\n      var pill = desc.querySelector('.nt-printed-badge');\n      if (pill) {\n        pill.style.whiteSpace = 'normal';\n        pill.style.fontSize = '11.4px'; /* mobile-narrow 5% shrink */\n        pill.style.padding = '6px 12px';\n      }\n    }\n  }\n  function init() {\n    run();\n    if (!window.__ntPrintedByNinjaBadge) {\n      var pt = document.querySelector('.product-text');\n      if (pt) {\n        var mo = new MutationObserver(function () {\n          run();\n          if (window.__ntPrintedByNinjaBadge) mo.disconnect();\n        });\n        mo.observe(pt, { childList: true, subtree: true });\n        setTimeout(function () { mo.disconnect(); }, 10000);\n      }\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Repair VIVID AF badge position + text swap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   An earlier revision of this file moved `.titleBadge` out of the H1\n   into the reviews row. That was reverted, but staging served the\n   stale relocation JS for a while, so some browsers still have the\n   badge displaced. Two responsibilities here:\n     1. Ensure the badge lives inside the H1 (revert any displacement).\n     2. On mobile (\u2264767px), swap the badge text from\n        \"FREE Upgrade to VIVID AF\" \u2192 \"VIVID AF\" and mark the badge\n        ready so the CSS `:not([data-nt-vivid-ready])` rule stops\n        hiding it. The ready marker is also set on desktop so the\n        full original text stays visible there.\n   Idempotent via __ntVividBadgeRepaired. Runs as early as possible\n   (head-loaded `defer` script + DOMContentLoaded fallback) to keep\n   the hidden-then-revealed cycle imperceptible. */\n(function () {\n  if (typeof window === 'undefined' || window.__ntVividBadgeRepaired) return;\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  function repair() {\n    var badge = document.querySelector('.titleBadge');\n    if (!badge) return;\n    var h1 = document.querySelector('.product-text h1.product__title');\n    if (!h1) return;\n    /* Move badge back into H1 if a stale revision displaced it. */\n    if (badge.parentElement !== h1) {\n      badge.removeAttribute('style');\n      h1.appendChild(badge);\n      var reviews = document.querySelector('.product-text .has-bg-style--primary');\n      if (reviews) {\n        ['display','alignItems','justifyContent','gap','flexWrap'].forEach(function(p){ reviews.style[p] = ''; });\n        var yotpo = reviews.querySelector('.yotpo-widget-instance, .shopify-app-block');\n        if (yotpo) ['flex','minWidth','overflow'].forEach(function(p){ yotpo.style[p] = ''; });\n      }\n    }\n    /* Mobile text shorten. Only applies on dtf-transfers / -by-size-v2;\n       gate via body class so other products that share the badge\n       markup aren't affected. */\n    if (shouldRun() && window.innerWidth <= 1199) {\n      var t = (badge.textContent || '').trim();\n      if (t && t !== 'VIVID AF') {\n        badge.textContent = 'VIVID AF';\n        badge.style.fontSize = '10.8px';\n        badge.style.lineHeight = '1.2';\n      }\n    }\n    /* Reveal \u2014 CSS hides badge until this attribute is present. */\n    badge.setAttribute('data-nt-vivid-ready', '1');\n    window.__ntVividBadgeRepaired = true;\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', repair);\n  } else {\n    repair();\n  }\n})();\n\n/* \u2500\u2500\u2500 Mobile-only: rebuild the .buyMoreSave row as a 3-col card grid\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   Default markup is a single-line row with three text segments\n   separated by pipes (\"Buy More & Save Up To 50% | Fastest Delivery\n   May. 27 order in 22h 47m | No Minimum, Setup or Art Fees\"). The\n   redesigned mobile layout is a three-column grid where each\n   column shows: [icon] / [bold blue primary text] / [grey caption].\n   Strategy:\n     \u2022 Pull values from the existing DOM:\n         - the buyMoreSave link href (column 1)\n         - the live <fastest-deliver-placeholder> (column 2 \u2014 moved\n           wholesale into the new structure so the countdown JS\n           keeps updating its <strong>s in place)\n     \u2022 Replace .buyMoreSave's innerHTML with the new 3-col grid,\n       slotting the original placeholder into column 2.\n     \u2022 Set data-nt-bms-v2=\"1\" so theme.css releases its mobile\n       pre-paint visibility:hidden guard. */\n(function () {\n  if (typeof window === 'undefined' || window.__ntBmsV2) return;\n  /* Tier 1 (r79): always BUILD the bms-v2 wrapper regardless of\n     viewport at load, then let CSS @media handle desktop vs mobile\n     visibility. This way resizing the window from desktop to mobile\n     immediately reveals the card grid \u2014 no JS re-run required. */\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  var BLUE = '#019AFF';\n  function tagSvg() {\n    return '<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"' + BLUE + '\" aria-hidden=\"true\">' +\n      '<path d=\"M21.41 11.58l-9-9A2 2 0 0 0 11 2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 .59 1.42l9 9a2 2 0 0 0 2.82 0l7-7a2 2 0 0 0 0-2.84z\"/>' +\n      '<circle cx=\"7.5\" cy=\"7.5\" r=\"1.5\" fill=\"#fff\"/>' +\n    '</svg>';\n  }\n  /* Per design: column 2 (countdown) uses the same package box icon\n     as the desktop delivery row, not a lightning bolt. */\n  function boltSvg() {\n    return '<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"' + BLUE + '\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">' +\n      '<path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"/>' +\n      '<polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"/>' +\n      '<line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"/>' +\n      '<path d=\"M16.5 9.4l-9-5.19\"/>' +\n    '</svg>';\n  }\n  function dollarSvg() {\n    return '<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"' + BLUE + '\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">' +\n      '<circle cx=\"12\" cy=\"12\" r=\"10\"/>' +\n      '<path d=\"M16 8.5c-.83-.83-2-1.5-4-1.5-2.5 0-4 1.12-4 2.5s1.5 2.5 4 2.5 4 1.12 4 2.5-1.5 2.5-4 2.5c-2 0-3.17-.67-4-1.5\"/>' +\n      '<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>' +\n    '</svg>';\n  }\n  function run() {\n    if (window.__ntBmsV2) return;\n    if (!shouldRun()) return;\n    var bms = document.querySelector('.product-text .buyMoreSave');\n    if (!bms) return;\n    if (bms.getAttribute('data-nt-bms-v2') === '1') return;\n    /* Pull source values from the ORIGINAL markup. We intentionally\n       DON'T replace .buyMoreSave's innerHTML \u2014 that would disconnect\n       the <fastest-deliver-placeholder> custom element which holds\n       the live countdown logic. Instead we build a NEW wrapper next\n       to it and hide the original via display:none. The original\n       placeholder keeps ticking; we mirror its <strong> values into\n       the new spans. */\n    /* The original \"Buy More & Save Up To 50%\" isn't an <a> \u2014 it's a\n       <div class=\"buyMoreSave__title openPriceCalculator\"> with a\n       JS click handler on the openPriceCalculator class. Reuse that\n       class on our column-1 anchor so the same calculator pops. */\n    var bmLink = bms.querySelector('a.lnkcolor, a');\n    var bmHref = (bmLink && bmLink.getAttribute('href')) || 'javascript:void(0)';\n    var ph = bms.querySelector('fastest-deliver-placeholder');\n    /* Build the new 3-col grid as a fresh wrapper that becomes the\n       sibling sitting BEFORE .buyMoreSave. */\n    var wrap = document.createElement('div');\n    wrap.className = 'nt-bms-v2-wrap';\n    wrap.setAttribute('data-nt-bms-v2-wrap', '1');\n    wrap.innerHTML =\n      '<div class=\"nt-bms-v2\" style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;align-items:start;width:100%;\">' +\n        '<a class=\"nt-bms-v2__col openPriceCalculator\" href=\"' + bmHref + '\" style=\"display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;text-decoration:none;color:inherit;cursor:pointer;\">' +\n          '<div class=\"nt-bms-v2__icon\" style=\"margin-bottom:2px;pointer-events:none;\">' + tagSvg() + '</div>' +\n          '<div class=\"nt-bms-v2__primary\" style=\"font-size:14px;font-weight:700;color:' + BLUE + ';line-height:1.2;font-family:Inter,sans-serif;pointer-events:none;\">Up to 50% off</div>' +\n          '<div class=\"nt-bms-v2__caption\" style=\"font-size:11px;color:#6b7280;font-weight:400;font-family:Inter,sans-serif;pointer-events:none;\">buy more \u2192</div>' +\n        '</a>' +\n        '<div class=\"nt-bms-v2__col\" style=\"display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;\">' +\n          '<div class=\"nt-bms-v2__icon\" style=\"margin-bottom:2px;\">' + boltSvg() + '</div>' +\n          '<div class=\"nt-bms-v2__primary\" data-nt-cd style=\"font-size:14px;font-weight:700;color:' + BLUE + ';line-height:1.2;font-family:Inter,sans-serif;\"></div>' +\n          '<div class=\"nt-bms-v2__caption\" style=\"font-size:11px;color:#6b7280;font-weight:400;font-family:Inter,sans-serif;\">arrives <span data-nt-cd-date></span></div>' +\n        '</div>' +\n        '<div class=\"nt-bms-v2__col\" style=\"display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;\">' +\n          '<div class=\"nt-bms-v2__icon\" style=\"margin-bottom:2px;\">' + dollarSvg() + '</div>' +\n          '<div class=\"nt-bms-v2__primary\" style=\"font-size:14px;font-weight:700;color:' + BLUE + ';line-height:1.2;font-family:Inter,sans-serif;\">$0 Fees</div>' +\n          '<div class=\"nt-bms-v2__caption\" style=\"font-size:11px;color:#6b7280;font-weight:400;font-family:Inter,sans-serif;\">min \u00B7 setup \u00B7 art</div>' +\n        '</div>' +\n      '</div>';\n    /* Insert the new wrapper BEFORE the original .buyMoreSave so we\n       preserve the live countdown placeholder untouched. */\n    bms.parentNode.insertBefore(wrap, bms);\n    /* Sync the original placeholder's live <strong> values into the\n       new column-2 spans. The original .buyMoreSave is hidden by\n       theme.css (data-nt-bms-v2 release attribute on .buyMoreSave is\n       still set, but we ALSO add display:none below to fully\n       collapse it). */\n    if (ph) {\n      var cdEl = wrap.querySelector('[data-nt-cd]');\n      var dateEl = wrap.querySelector('[data-nt-cd-date]');\n      function syncCountdown() {\n        var strongs = ph.querySelectorAll(':scope > strong');\n        if (strongs[0] && dateEl) dateEl.textContent = strongs[0].textContent.trim();\n        if (strongs[1] && cdEl)   cdEl.textContent   = strongs[1].textContent.trim();\n      }\n      syncCountdown();\n      /* Re-sync on every mutation inside the live placeholder. */\n      var mo2 = new MutationObserver(syncCountdown);\n      mo2.observe(ph, { childList: true, characterData: true, subtree: true });\n      setInterval(syncCountdown, 1000);\n    }\n    /* Tag the original .buyMoreSave AND the new wrapper. CSS @media\n       queries control which one is visible per viewport \u2014 no inline\n       display:none anymore so resizing between mobile and desktop\n       updates the layout automatically without JS. */\n    bms.setAttribute('data-nt-bms-v2', '1');\n    window.__ntBmsV2 = true;\n  }\n  function init() {\n    run();\n    if (!window.__ntBmsV2) {\n      var pt = document.querySelector('.product-text');\n      if (pt) {\n        var mo = new MutationObserver(function () {\n          run();\n          if (window.__ntBmsV2) mo.disconnect();\n        });\n        mo.observe(pt, { childList: true, subtree: true });\n        setTimeout(function () { mo.disconnect(); }, 10000);\n      }\n    }\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n/* \u2500\u2500\u2500 Atomic reveal: release the <html> .nt-pdp-init hide gate \u2500\u2500\u2500\u2500\n   layout/theme.liquid adds .nt-pdp-init to <html> sync in <head>\n   so theme.css hides .product-text on these templates until our\n   redesign IIFEs have done their work. We GATE the release on the\n   SYNC transforms (info row + icons replacement) being done; Yotpo\n   reveals independently via its own data-attribute gate. This\n   ensures the user sees H1 + info row + new icons all paint in\n   the same frame, not staggered. The 4s failsafe in theme.liquid\n   is the backup so the page is never left hidden forever. */\n(function () {\n  function shouldRun() {\n    var bc = (document.body && document.body.className) || '';\n    return bc.indexOf('template-product-by-size-tabs') > -1 ||\n           bc.indexOf('template-product-by-size-bg-options') > -1;\n  }\n  function release() {\n    if (typeof document === 'undefined') return;\n    document.documentElement.classList.remove('nt-pdp-init');\n  }\n  function isReady() {\n    /* Tier-1 atomic reveal: wait for EVERY redesign IIFE that paints\n       inside .product-text before lifting the hide. Yotpo widget\n       reveals via its own data-nt-yotpo-ready gate, independent of\n       this (it's async / third-party and can't block the main\n       reveal \u2014 would mean blank screen for 1\u20132s otherwise). */\n    var mobile = window.innerWidth <= 1199;\n    /* Both viewports */\n    if (!window.__ntInfoRowV2)        return false;\n    if (!window.__ntIconsReplacedV2)  return false;\n    if (!window.__ntVividBadgeRepaired) return false;\n    if (!window.__ntDeliveryPolished) return false;\n    /* Mobile-only IIFEs */\n    if (mobile && !window.__ntSellingPointsShortened) return false;\n    if (mobile && !window.__ntBmsV2)  return false;\n    return true;\n  }\n  function tryRelease(deadline) {\n    if (!shouldRun()) { release(); return; }\n    if (isReady()) { release(); return; }\n    /* Poll every 30ms up to the deadline. The 4s failsafe in\n       theme.liquid is a longer backstop. */\n    var iv = setInterval(function () {\n      if (isReady() || Date.now() > deadline) {\n        clearInterval(iv);\n        release();\n      }\n    }, 30);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () {\n      Promise.resolve().then(function () {\n        tryRelease(Date.now() + 1500);\n      });\n    });\n  } else {\n    Promise.resolve().then(function () {\n      tryRelease(Date.now() + 1500);\n    });\n  }\n})();\n\n"],
  "mappings": "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",
  "names": ["syncCountdown"]
}
