{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/power-builder.js?pbv=64"],
  "sourcesContent": ["/* ============================================================================\n   Power Builder \u2014 full-width multi-upload builder (behavior layer)\n   Gated to the `power-builder` suffix via theme.liquid. Presentation-only helper\n   over the existing multi-upload engine (bySize_popular.js) \u2014 it does NOT own\n   upload, pricing, or cart logic; it only re-presents the engine's output.\n\n   PHASE 1: auto-scroll to the top of the newest artwork group after an add.\n   LATER PHASES (stubbed below): force single imgix BG-removal, \"Add to cart\" -> /cart,\n   master pre-cut toggle, order-summary mirroring.\n   ========================================================================== */\n(function () {\n  'use strict';\n  if (window.__ntPowerBuilderInit) return;\n  // uv-by-size-middle-scroll runs the builder too (Justin 7-10) \u2014 accept either template class\n  function pbTpl() { var c = document.body && document.body.classList; return !!c && (c.contains('template-product-power-builder') || c.contains('template-product-uv-by-size-middle-scroll')); }\n  if (!document.body || !pbTpl()) return;\n  window.__ntPowerBuilderInit = true;\n\n  var LIST_SEL = 'file-blocks-area';\n  var BLOCK_SEL = 'uploaded-files-block';\n  var WRAP_SEL = 'multi-upload-wrapper.multiUpload';\n  var MAIN_SEL = 'main#main.main-content';\n\n  // \u2500\u2500 FORK SWITCH (Justin) \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  // true  \u2192 Order Summary shows the engine's \"Buy More & Save\" cumulative-discount\n  //         tier table (relocated live prices-table element) instead of the\n  //         per-design line items / pre-cut line / free-ship bar.\n  // false \u2192 the original line-item Order Summary.\n  // Totals (Subtotal / Discounts & savings / Total) + ADD TO CART stay either way.\n  var PB_SUMMARY_TIERS = true;\n\n  // \u2500\u2500 Normal-page mode \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  // The engine appends the builder as a fixed z:9999 modal at the END of <body>,\n  // covering the site header + footer. To make it a normal page, relocate the\n  // wrapper INTO <main> (CSS then flows it there and hides the other PDP sections,\n  // leaving the sticky header above and the footer below). Self-healing: if the\n  // engine re-appends it to <body> on reopen, we move it back on the next tick.\n  // 801\u20131200px: the two views converge (own-row header, checkbox tools) \u2014\n  // force compact so Large can't render its pill toggles there (Justin 7-6).\n  // Leaving the range restores whichever view the toggle has active.\n  var pbRangeMq = null; // forced-compact removed 7-6 PM: Large has its own squeeze layout\n  function enforceRangeCompact() {\n    if (!pbRangeMq || !document.body.classList.contains('pb-builder-open')) return;\n    if (pbRangeMq.matches) {\n      document.body.classList.add('pb-compact');\n    } else {\n      var compactBtn = document.querySelector('.pb-view-toggle .pb-vt-compact');\n      if (compactBtn) document.body.classList.toggle('pb-compact', compactBtn.classList.contains('active'));\n    }\n  }\n  if (pbRangeMq && pbRangeMq.addEventListener) pbRangeMq.addEventListener('change', enforceRangeCompact);\n\n  function placeBuilder() {\n    var wrap = document.querySelector(WRAP_SEL);\n    var main = document.querySelector(MAIN_SEL);\n    var active = wrap && (wrap.classList.contains('active') ||\n                 (wrap.offsetParent !== null && getComputedStyle(wrap).display !== 'none'));\n    if (active && main) {\n      if (wrap.parentElement !== main) main.appendChild(wrap);\n      document.body.classList.add('pb-builder-open');\n      enforceRangeCompact();\n    } else {\n      document.body.classList.remove('pb-builder-open');\n    }\n  }\n  // React to the wrapper being added/removed or toggling .active anywhere in body.\n  if (window.MutationObserver) {\n    var pbT = null;\n    new MutationObserver(function () { clearTimeout(pbT); pbT = setTimeout(placeBuilder, 60); })\n      .observe(document.body, { childList: true, attributes: true, attributeFilter: ['class'], subtree: true });\n  }\n\n  // \u2500\u2500 Upload routing (Justin 7-6) \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  // 1 image  \u2192 the engine's NATIVE single-upload flow (the classic dtf-transfers\n  //            after-upload view).\n  // 2+ images \u2192 the engine's NATIVE multi flow (the Power Builder cards).\n  // The engine (bySize_popular.js) already branches length==1 \u2192 single, >1 \u2192\n  // multi, so this is a no-op now. Earlier phases overrode singleFileManage /\n  // singleFileManageByURL here to FORCE multi for single uploads \u2014 that force\n  // is intentionally removed; do not re-add it.\n  function forceMultiUpload() { return true; }\n\n  function reduceMotion() {\n    return window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  }\n\n  // Scroll so the newest block's top sits near the top of the visible list.\n  // Desktop (two-col): the .upload-area is the scroller. Mobile (stacked): the\n  // grid/inner scrolls \u2014 scrollIntoView handles either without us guessing which.\n  function focusNewest(block) {\n    if (!block) return;\n    try {\n      block.scrollIntoView({ block: 'start', behavior: reduceMotion() ? 'auto' : 'smooth' });\n    } catch (e) {\n      block.scrollIntoView(true);\n    }\n  }\n\n  // Theme-asset URL helper: derive the CDN assets/ base from our own script tag.\n  // NOTE: match the PATH, not just the substring \u2014 third-party trackers carry the\n  // page URL (containing \"power-builder\") in their query string.\n  function assetUrl(file) {\n    var scripts = document.querySelectorAll('script[src*=\"power-builder.js\"]');\n    for (var i = 0; i < scripts.length; i++) {\n      var src = scripts[i].src || '';\n      if (/\\/power-builder\\.js(\\?|$)/.test(src)) return src.replace(/power-builder\\.js.*$/, file);\n    }\n    return '';\n  }\n\n  // \"NINJA POWER BUILDER\" hero (h1) above the artwork list.\n  function ensureHero(list) {\n    if (!list || list.querySelector(':scope > .pb-hero')) return;\n    var hero = document.createElement('div');\n    hero.className = 'pb-hero';\n    // Compact hero (Justin 7-6): running-ninja logo + initial-caps title, no\n    // tagline; ensureViewToggle() appends the view toggle into this row.\n    hero.innerHTML =\n      '<div class=\"pb-hero__row\">' +\n        '<span class=\"pb-hero__icon\"><img src=\"' + assetUrl('pb-ninja-run.png') + '\" alt=\"\"></span>' +\n        '<h1 class=\"pb-hero__title\"><span class=\"pb-hero__t1\">Multi-Upload</span> <span class=\"pb-hero__t2\">Builder Pro</span></h1>' +\n      '</div>';\n    list.insertBefore(hero, list.firstChild);\n  }\n\n  // Large / Compact view toggle (desktop only \u2014 CSS hides it under 800px and the\n  // compact styles are scoped to min-width:801px, so mobile is untouched. 800 is\n  // the builder's mobile cutover: below it the desktop one-line rows break, so\n  // the whole builder converts to the 2-line mobile layout \u2014 Justin 7-6).\n  var PB_VIEW_KEY = 'pbViewMode';\n  var PB_IC_LARGE = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\"><rect x=\"1\" y=\"3\" width=\"14\" height=\"4\" rx=\"1\" fill=\"currentColor\"/><rect x=\"1\" y=\"9\" width=\"14\" height=\"4\" rx=\"1\" fill=\"currentColor\"/></svg>';\n  var PB_IC_COMPACT = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\"><rect x=\"1\" y=\"2\" width=\"14\" height=\"2.6\" rx=\"1\" fill=\"currentColor\"/><rect x=\"1\" y=\"6.7\" width=\"14\" height=\"2.6\" rx=\"1\" fill=\"currentColor\"/><rect x=\"1\" y=\"11.4\" width=\"14\" height=\"2.6\" rx=\"1\" fill=\"currentColor\"/></svg>';\n  function ensureViewToggle(list) {\n    if (!list || list.querySelector('.pb-view-toggle')) return;\n    var vt = document.createElement('div');\n    vt.className = 'pb-view-toggle';\n    vt.innerHTML =\n      '<button type=\"button\" class=\"pb-vt-compact\">' + PB_IC_COMPACT + 'Compact View</button>' +\n      '<button type=\"button\" class=\"pb-vt-large\">' + PB_IC_LARGE + 'Larger View</button>';\n    // Toggle lives inside the hero row, right-aligned (Justin 7-6 mock).\n    var heroRow = list.querySelector(':scope > .pb-hero .pb-hero__row');\n    if (heroRow) heroRow.appendChild(vt);\n    else list.insertBefore(vt, list.firstChild);\n    function apply(mode) {\n      document.body.classList.toggle('pb-compact', mode === 'compact');\n      vt.querySelector('.pb-vt-large').classList.toggle('active', mode !== 'compact');\n      vt.querySelector('.pb-vt-compact').classList.toggle('active', mode === 'compact');\n      try { localStorage.setItem(PB_VIEW_KEY, mode); } catch (e) {}\n    }\n    vt.querySelector('.pb-vt-large').addEventListener('click', function () { apply('large'); });\n    vt.querySelector('.pb-vt-compact').addEventListener('click', function () { apply('compact'); });\n    // Always OPEN in Compact view (Justin) \u2014 Larger View is the secondary option.\n    apply('compact');\n  }\n\n  // \"YOUR ARTWORK \u00B7 N\" header pinned above the list; N = live artwork count.\n  function updateArtworkHead(list) {\n    if (!list) return;\n    ensureHero(list);\n    ensureViewToggle(list);\n    var count = list.querySelectorAll(BLOCK_SEL).length;\n    var head = list.querySelector(':scope > .pb-artwork-head');\n    if (!head) {\n      head = document.createElement('div');\n      head.className = 'pb-artwork-head';\n      var hero = list.querySelector(':scope > .pb-hero');\n      list.insertBefore(head, hero ? hero.nextSibling : list.firstChild);\n      head.innerHTML = 'Your Artwork <span class=\"pb-artwork-count\"></span>';\n    }\n    var c = head.querySelector('.pb-artwork-count');\n    if (c) c.textContent = '\u00B7 ' + count;\n  }\n\n  // Watch the list for newly-added artwork blocks. A single upload of multiple\n  // files lands several blocks in one tick, so debounce and focus the LAST one\n  // added in that batch (the top of the newest group, once the batch settles).\n  // Also keep the header count in sync on add AND remove.\n  var lastAdded = null, t = null;\n  function watch(list) {\n    if (!list || list.__pbWatched || !window.MutationObserver) return;\n    list.__pbWatched = true;\n    updateArtworkHead(list);\n    new MutationObserver(function (muts) {\n      for (var i = 0; i < muts.length; i++) {\n        var added = muts[i].addedNodes;\n        for (var j = 0; j < added.length; j++) {\n          var n = added[j];\n          if (n.nodeType === 1 && (n.matches && n.matches(BLOCK_SEL))) lastAdded = n;\n        }\n      }\n      updateArtworkHead(list);\n      if (lastAdded) {\n        clearTimeout(t);\n        t = setTimeout(function () { focusNewest(lastAdded); lastAdded = null; }, 220);\n      }\n    }).observe(list, { childList: true });\n  }\n\n  // The list only exists post-upload; poll briefly until it appears, then attach.\n  var tries = 0;\n  var boot = setInterval(function () {\n    placeBuilder();\n    forceMultiUpload();\n    var list = document.querySelector(LIST_SEL);\n    if (list) { watch(list); }\n    if (++tries > 120) clearInterval(boot); // ~60s safety cap\n  }, 500);\n\n  // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  // PHASE 3 \u2014 Order summary (line items + totals), reorder, CTA relabel\n  // Presentation only: reads the engine's own per-design values and mirrors them.\n  // \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n  var OO_SEL = 'multi-upload.__multiUpload__inner > other-options';\n\n  function money(n) { return '$' + (Math.round(n * 100) / 100).toFixed(2); }\n\n  // Grab the ENGINE's image-preview checkerboard (a background-image tile on\n  // preview-block) so summary thumbs + the lightbox use the EXACT same pattern as\n  // the main image preview. Cached once found.\n  var _checkerBg = null;\n  function checkerBg() {\n    if (_checkerBg) return _checkerBg;\n    // The onesource engine (live) draws the checkerboard on file-preview, the\n    // older engine on preview-block \u2014 check both. Copy the FULL background\n    // (image + size + position + color) so the tile renders EXACTLY like the\n    // card previews everywhere else (Justin 7-6).\n    var sels = ['uploaded-files-block preview-block', 'uploaded-files-block file-preview'];\n    for (var i = 0; i < sels.length; i++) {\n      var pv = document.querySelector(sels[i]);\n      if (!pv) continue;\n      var g = getComputedStyle(pv);\n      if (g.backgroundImage && g.backgroundImage !== 'none') {\n        _checkerBg = { image: g.backgroundImage, size: g.backgroundSize, position: g.backgroundPosition, color: g.backgroundColor };\n        break;\n      }\n    }\n    return _checkerBg;\n  }\n  function applyChecker(el) {\n    var bg = checkerBg();\n    if (!el || !bg) return;\n    el.style.backgroundImage = bg.image;\n    el.style.backgroundSize = bg.size;\n    el.style.backgroundPosition = bg.position;\n    el.style.backgroundColor = bg.color;\n    el.style.backgroundRepeat = 'repeat';\n  }\n\n  // Read each design straight from the engine DOM (no parallel pricing).\n  // One entry per design (uploaded-files-block); each design carries ALL its\n  // sizes (the .widthHeight__custom rows) so multi-size designs group together.\n  // Thumbnail = the actual uploaded artwork (img.xzoom.fileupload_hero), NOT the\n  // reward crest / loader ninja.\n  function readDesigns() {\n    return [].map.call(document.querySelectorAll(BLOCK_SEL), function (b) {\n      var img = b.querySelector('preview-block img.xzoom, preview-block img.fileupload_hero, preview-block img');\n      // VISIBLE rows only \u2014 switching Custom\u2194Popular keeps the inactive row in the\n      // DOM with its old values; counting it double-adds to the subtotal.\n      var rows = [].filter.call(b.querySelectorAll('sizes-blocks .widthHeight__custom'), function (r) { return r.offsetParent !== null; });\n      var sizes = rows.map(function (r) {\n        var w = r.querySelector('input[name=\"width__value\"]');\n        var h = r.querySelector('input[name=\"height__value\"]');\n        var q = r.querySelector('input.customQtyFile__qty, input[name=\"quantity\"]');\n        var tEl = r.querySelector('.precut-unit-logic__total .__discountedPrice') || r.querySelector('.precut-unit-logic__total');\n        var total = parseFloat((tEl ? tEl.textContent : '').replace(/[^0-9.]/g, '')) || 0;\n        // Discount tier (buy-more-save): __originalPrice = pre-discount total (only\n        // meaningful while visible), the tier label (\"40% off\") sits in __discount.\n        var oEl = r.querySelector('.precut-unit-logic__total .__originalPrice');\n        var orig = 0;\n        if (oEl && getComputedStyle(oEl).visibility !== 'hidden') {\n          orig = parseFloat((oEl.textContent || '').replace(/[^0-9.]/g, '')) || 0;\n        }\n        var dEl = r.querySelector('.precut-unit-logic__discount');\n        var dTxt = dEl ? (dEl.textContent || '').replace(/\\s+/g, ' ').trim() : '';\n        if (!/%/.test(dTxt)) dTxt = '';          // only keep real \"NN% off\" labels\n        var wv = w ? w.value : '', hv = h ? h.value : '';\n        if (!w && !h) {\n          // Popular row: no W/H inputs \u2014 the size lives in the select's option text\n          // (e.g. '1.83\" x 2\" - Tag Print / Neck Label').\n          var sel = r.querySelector('select');\n          var txt = (sel && sel.selectedIndex > 0) ? sel.options[sel.selectedIndex].textContent : '';\n          var m = txt.match(/([\\d.]+)\\s*(?:\"|in)?\\s*[x\u00D7]\\s*([\\d.]+)/i);\n          if (m) { wv = m[1]; hv = m[2]; }\n        }\n        return { w: wv, h: hv, qty: q ? (q.value || '1') : '1', total: total, orig: orig, disc: dTxt };\n      });\n      return { thumb: img ? (img.currentSrc || img.src || '') : '', sizes: sizes };\n    });\n  }\n\n  // Build the summary panel ONCE (static shell), then only patch dynamic bits so\n  // we never destroy the relocated free-ship element or thrash the DOM.\n  function ensureSummary(oo) {\n    var panel = oo.querySelector(':scope > .pb-summary');\n    if (!panel) {\n      panel = document.createElement('div');\n      panel.className = 'pb-summary';\n      panel.innerHTML =\n        '<div class=\"pb-sum-head\"><span class=\"pb-sum-title-lg\">Order Summary</span>' +\n        '<span class=\"pb-sum-count\"></span></div>' +\n        '<div class=\"pb-sum-items\"></div>' +\n        '<div class=\"pb-sum-precut-item\" hidden></div>' +\n        '<div class=\"pb-sum-fs\"></div>' +\n        '<div class=\"pb-sum-footer\">' +\n          '<div class=\"pb-sum-line\"><span>Subtotal</span><span class=\"pb-sum-subtotal\"></span></div>' +\n          '<div class=\"pb-sum-line pb-sum-savings\" hidden><span>Discounts &amp; savings</span><span class=\"pb-sum-savings-amt\"></span></div>' +\n          '<div class=\"pb-sum-total\"><span>Total</span><span class=\"pb-sum-grand\"></span></div>' +\n          '<div class=\"pb-sum-cta\"></div>' +\n        '</div>';\n      // Pre-cut card to the very top (its own card above the summary).\n      var precut = oo.querySelector('footer-block > precut') || oo.querySelector('.precut');\n      if (precut) { precut.classList.add('pb-precut-card'); oo.insertBefore(precut, oo.firstChild); }\n      var precutTop = oo.querySelector(':scope > .pb-precut-card');\n      oo.insertBefore(panel, precutTop ? precutTop.nextSibling : oo.firstChild);\n    }\n    // Reuse the engine's free-ship bar inside the summary.\n    var fs = oo.querySelector('free-shipping-bysize');\n    var fsHost = panel.querySelector('.pb-sum-fs');\n    if (fs && fsHost && fs.parentElement !== fsHost) fsHost.appendChild(fs);\n    // FORK: tier-table mode \u2014 relocate the engine's LIVE \"Buy More & Save\"\n    // prices-table into the summary (it keeps updating itself); CSS then hides\n    // the line items / pre-cut line / free-ship bar via .pb-tiers-mode.\n    if (PB_SUMMARY_TIERS) {\n      panel.classList.add('pb-tiers-mode');\n      var tiersHost = panel.querySelector(':scope > .pb-sum-tiers');\n      if (!tiersHost) {\n        tiersHost = document.createElement('div');\n        tiersHost.className = 'pb-sum-tiers';\n        var headEl = panel.querySelector(':scope > .pb-sum-head');\n        panel.insertBefore(tiersHost, headEl ? headEl.nextSibling : panel.firstChild);\n      }\n      // There are TWO prices-table instances: a stale one in the hidden\n      // single-upload panel, and the LIVE one in otherOptions__top (the engine\n      // keeps its selected-tier highlight + \"Add N more\" nudge updated in multi\n      // mode). Relocate the live one, once.\n      if (!tiersHost.querySelector('prices-table')) {\n        var pt = oo.querySelector('.otherOptions__top prices-table') || oo.querySelector('prices-table');\n        if (pt) tiersHost.appendChild(pt);\n      }\n    }\n    // CTA lives INSIDE the summary card, right after Total (Justin).\n    var cta = document.querySelector('proceed-to-checkout.grt__desktop__footerBlock') || document.querySelector('proceed-to-checkout');\n    var ctaHost = panel.querySelector('.pb-sum-cta');\n    if (cta && ctaHost && cta.parentElement !== ctaHost) ctaHost.appendChild(cta);\n    // Remove the \"Free artwork assistance\" card (Justin).\n    var help = oo.querySelector(':scope > .pb-artwork-assist');\n    if (help) help.remove();\n    return panel;\n  }\n\n  function refreshSummary() {\n    var oo = document.querySelector(OO_SEL);\n    if (!oo) return;\n    var panel = ensureSummary(oo);\n    // Ensure the engine's free-ship bar lives inside the summary (robust vs timing).\n    var fs = oo.querySelector('free-shipping-bysize');\n    var fsHost = panel.querySelector('.pb-sum-fs');\n    if (fs && fsHost && fs.parentElement !== fsHost) fsHost.appendChild(fs);\n    var designs = readDesigns();\n    var subtotal = 0, origSubtotal = 0;\n    designs.forEach(function (d) { d.sizes.forEach(function (s) {\n      subtotal += s.total;\n      origSubtotal += (s.orig > s.total ? s.orig : s.total);\n    }); });\n    var savings = Math.max(0, origSubtotal - subtotal);\n    var cnt = designs.length;\n    panel.querySelector('.pb-sum-count').textContent = cnt + ' design' + (cnt !== 1 ? 's' : '');\n    // One block per design (single thumbnail + title); every size lists beneath it.\n    panel.querySelector('.pb-sum-items').innerHTML = designs.map(function (d) {\n      var lines = d.sizes.map(function (s) {\n        var sizeTxt = (s.w && s.h) ? (s.w + ' in \u00D7 ' + s.h + ' in') : '\u2014';\n        var discounted = s.orig > s.total;\n        return '<div class=\"pb-sum-sizerow\">' +\n          '<div class=\"pb-sum-sizetext\">' +\n            '<div class=\"pb-sum-size\">Size: <strong>' + sizeTxt + '</strong></div>' +\n            '<div class=\"pb-sum-qty\">Qty ' + s.qty + ' pcs</div>' +\n            (s.disc && discounted ? '<div class=\"pb-sum-disc\">Discount: ' + s.disc + '</div>' : '') +\n          '</div>' +\n          '<div class=\"pb-sum-price\">' +\n            (discounted ? '<span class=\"pb-sum-orig\">' + money(s.orig) + '</span>' : '') +\n            '<span class=\"pb-sum-now\">' + money(s.total) + '</span>' +\n          '</div>' +\n        '</div>';\n      }).join('');\n      return '<div class=\"pb-sum-design\">' +\n        '<div class=\"pb-sum-thumb\">' + (d.thumb ? '<img src=\"' + d.thumb + '\" alt=\"\">' : '') + '</div>' +\n        '<div class=\"pb-sum-body\"><div class=\"pb-sum-rtitle\">DTF Transfers By Size</div>' + lines + '</div>' +\n      '</div>';\n    }).join('');\n    // Match the image-preview checkerboard behind the (transparent) line-item thumbs.\n    [].forEach.call(panel.querySelectorAll('.pb-sum-thumb'), applyChecker);\n    // Pre-cut: a separate add-on ($0.19 \u00D7 total qty) that the engine does NOT fold\n    // into the per-size totals. When the master toggle is ON, show it as its own\n    // order-summary line item and add it to the grand Total (it's a real charge).\n    var precutInput = document.querySelector('#preCutOption_multi') ||\n      (document.querySelector('.pb-precut-card') || document).querySelector('input[type=checkbox]');\n    var precutOn = !!(precutInput && precutInput.checked);\n    var precutQty = 0;\n    designs.forEach(function (d) { d.sizes.forEach(function (s) { precutQty += (parseInt(s.qty, 10) || 0); }); });\n    var precutCost = precutOn ? (0.19 * precutQty) : 0;\n    var precutRow = panel.querySelector('.pb-sum-precut-item');\n    if (precutRow) {\n      if (precutOn && precutQty > 0) {\n        precutRow.hidden = false;\n        precutRow.innerHTML =\n          '<span class=\"pb-sum-precut-ic\">' + PB_SCISSORS + '</span>' +\n          '<div class=\"pb-sum-precut-lbl\"><div class=\"pb-sum-precut-name\">Pre-cut transfers</div>' +\n          '<div class=\"pb-sum-precut-calc\">$0.19 &times; ' + precutQty + ' ' + (precutQty === 1 ? 'item' : 'items') + '</div></div>' +\n          '<div class=\"pb-sum-precut-amt\">' + money(precutCost) + '</div>';\n      } else {\n        precutRow.hidden = true;\n        precutRow.innerHTML = '';\n      }\n    }\n    // Subtotal = pre-discount sum; green savings line when a tier is active;\n    // Total = discounted sum + pre-cut.\n    panel.querySelector('.pb-sum-subtotal').textContent = money(origSubtotal);\n    var savRow = panel.querySelector('.pb-sum-savings');\n    if (savRow) {\n      savRow.hidden = !(savings > 0.004);\n      var savAmt = savRow.querySelector('.pb-sum-savings-amt');\n      if (savAmt) savAmt.textContent = '\u2212' + money(savings);\n    }\n    panel.querySelector('.pb-sum-grand').textContent = money(subtotal + precutCost);\n    if (PB_SUMMARY_TIERS) fillTierPrices();\n    applyLabels();\n    styleSizeRows();\n    stylePrecut(designs);\n    styleTools();\n    styleSizeActions();\n  }\n\n  // Tier-table price column: the engine only fills the per-row <discount> price\n  // element in SINGLE-upload mode (in cumulative multi mode a single price column\n  // is ambiguous across designs). Restore the single-upload look by filling each\n  // tier row with base \u00D7 (1 \u2212 tier%), where base = the pre-discount unit price of\n  // the size row the user is CURRENTLY editing (pbActiveRow, tracked below \u2014\n  // Justin 7-10 \"whatever line item the user is currently updating\"); falls back\n  // to the first design's row until they touch one (matches the single flow\n  // exactly when one design is staged).\n  function fillTierPrices() {\n    var pt = document.querySelector('.pb-sum-tiers prices-table');\n    if (!pt) return;\n    var rows = [].filter.call(document.querySelectorAll('uploaded-files-block .widthHeight__custom'), function (r) { return r.offsetParent !== null; });\n    if (!rows.length) return;\n    var src = (pbActiveRow && document.documentElement.contains(pbActiveRow) && pbActiveRow.offsetParent !== null) ? pbActiveRow : rows[0];\n    var oEl = src.querySelector('.precut-unit-logic__price .__originalPrice');\n    var base = parseFloat((oEl ? oEl.textContent : '').replace(/[^0-9.]/g, '')) || 0;\n    if (!base) return;\n    [].forEach.call(pt.querySelectorAll('.pricesTable__item'), function (it) {\n      var d3 = it.querySelector('.pricesTable__item_3');\n      var m = d3 ? d3.textContent.match(/(\\d+)\\s*%/) : null;\n      var pct = m ? parseInt(m[1], 10) / 100 : 0;\n      var priceEl = it.querySelector('.pricesTable__item_2 discount');\n      if (priceEl) priceEl.textContent = (Math.round(base * (1 - pct) * 100) / 100).toFixed(2);\n    });\n  }\n\n  // CTA: relabel \"Proceed to Checkout\" \u2192 \"Add to cart\" (redirect-to-/cart wiring\n  // comes after we confirm the engine's add flow \u2014 see TODO below).\n  function applyLabels() {\n    // CTA \u2192 \"Add to cart\" (there are multiple proceed-to-checkout instances).\n    [].forEach.call(document.querySelectorAll('proceed-to-checkout .button__text'), function (t) {\n      if (t.textContent.trim() !== 'Add to cart') t.textContent = 'Add to cart';\n    });\n    // (Per-card delete label + trash icon handled in styleSizeRows \u2014 it depends on size count.)\n  }\n\n  // Size rows \u2192 exact-mockup grid: labels only on the FIRST size of each design,\n  // and a vertical chevron stepper on the Qty box (the engine renders none).\n  function styleSizeRows() {\n    [].forEach.call(document.querySelectorAll(BLOCK_SEL), function (b) {\n      // Custom size rows stay LISTED even on the Popular tab (Justin): the engine's\n      // tab CSS display:none's line-items-custom \u2014 tag it when it holds real sizes\n      // so CSS can force it visible (empty template rows stay hidden).\n      var lic = b.querySelector('line-items-custom');\n      if (lic) {\n        var hasReal = [].some.call(lic.querySelectorAll('.widthHeight__custom input[name=\"width__value\"]'), function (w) { return (w.value || '').trim() !== ''; });\n        lic.classList.toggle('pb-has-sizes', hasReal);\n      }\n      // Only count VISIBLE rows: switching to the Popular tab keeps the inactive\n      // custom row in the DOM \u2014 counting it would mark a lone popular row as\n      // \"rest\" (headers hidden) and flip Delete \u2192 Delete All wrongly.\n      var rows = [].filter.call(b.querySelectorAll('.widthHeight__custom'), function (r) { return r.offsetParent !== null; });\n      // pb-firstsize is the POSITIVE tag CSS keys on for showing headers \u2014\n      // untagged (just-added) rows default to header-less, so no desktop FOUC.\n      for (var i = 0; i < rows.length; i++) {\n        rows[i].classList.toggle('pb-restsize', i > 0);\n        rows[i].classList.toggle('pb-firstsize', i === 0);\n        // W/H always show 2 decimals (\"1.6\" \u2192 \"1.60\", Justin 7-6). Display\n        // only \u2014 same numeric value, and never while the user is typing.\n        [].forEach.call(rows[i].querySelectorAll('input[name=\"width__value\"], input[name=\"height__value\"]'), function (inp) {\n          if (document.activeElement === inp) return;\n          var t = (inp.value || '').trim();\n          if (t === '' || !/^\\d*\\.?\\d+$/.test(t)) return;\n          var f = parseFloat(t).toFixed(2);\n          if (inp.value !== f) inp.value = f;\n        });\n        // Low-DPI warning: cap its width at the W+H entry boxes (custom rows)\n        // or the popular-size dropdown (popular rows) so it never runs the full\n        // row \u2014 compact/large/mobile (Justin 7-7). offsetLeft/Width are\n        // pre-transform, so the px survive the cards' 0.8 scale; re-runs every\n        // styleSizeRows tick, so resizes self-correct.\n        var dpi = rows[i].querySelector(':scope > dpi-warning');\n        if (dpi) {\n          var drop = rows[i].querySelector(':scope > .widthHeight__item__popular');\n          var its = rows[i].querySelectorAll(':scope > .widthHeight__item');\n          var capW = 0;\n          if (drop) capW = drop.offsetWidth;\n          else if (its.length > 1) capW = (its[its.length - 1].offsetLeft + its[its.length - 1].offsetWidth) - its[0].offsetLeft;\n          else if (its.length) capW = its[0].offsetWidth;\n          if (capW > 40) {\n            dpi.style.setProperty('max-width', Math.round(capW) + 'px', 'important');\n            // Flex rows: the clamped basis would let the warning slot back onto\n            // line 1 (right side) \u2014 fill the freed space with margin so it still\n            // wraps to its OWN line and sits left, under the boxes. Grid rows\n            // (popular tab) place it via grid-column 1/3 instead.\n            if (getComputedStyle(rows[i]).display === 'grid') {\n              dpi.style.removeProperty('margin-right');\n            } else {\n              var fill = rows[i].clientWidth - Math.round(capW);\n              if (fill > 0) dpi.style.setProperty('margin-right', fill + 'px', 'important');\n            }\n          }\n        }\n      }\n      // Card delete: red trash icon + \"Delete\" (1 size) / \"Delete All\" (2+ sizes).\n      var del = b.querySelector('.itemNo__action a');\n      if (del) {\n        if (!del.querySelector('.pb-del-txt')) {\n          del.innerHTML = '<span class=\"pb-del-ic\">' + PB_TRASH + '</span><span class=\"pb-del-txt\"></span>';\n        }\n        var dt = del.querySelector('.pb-del-txt');\n        if (dt) dt.textContent = rows.length > 1 ? 'Delete All' : 'Delete';\n      }\n      // Always-visible magnify (top-right) \u2192 lightbox. Engine's own icons are hover-gated,\n      // so we inject our own; the engine's .upload_tools is hidden via CSS.\n      var fp = b.querySelector('file-preview');\n      if (fp && !fp.querySelector(':scope > .pb-zoom')) {\n        fp.style.position = 'relative';\n        var zbtn = document.createElement('button');\n        zbtn.type = 'button'; zbtn.className = 'pb-zoom'; zbtn.setAttribute('aria-label', 'Zoom design');\n        zbtn.innerHTML = PB_MAGNIFY;\n        zbtn.addEventListener('click', function (e) {\n          e.preventDefault(); e.stopPropagation();\n          var img = b.querySelector('preview-block img.xzoom, preview-block img.fileupload_hero, preview-block img');\n          if (img) openLightbox(img.currentSrc || img.src);\n        });\n        fp.appendChild(zbtn);\n      }\n    });\n    [].forEach.call(document.querySelectorAll('.precut-unit-logic__qty'), function (qw) {\n      var input = qw.querySelector('input.customQtyFile__qty, input[name=\"quantity\"]');\n      if (!input) return;\n      var host = input.parentElement || qw;\n      if (host.querySelector(':scope > .pb-qty-steps')) return;\n      host.style.position = 'relative';\n      var steps = document.createElement('span');\n      steps.className = 'pb-qty-steps';\n      steps.innerHTML = '<button type=\"button\" class=\"pb-qty-up\" aria-label=\"Increase quantity\"></button>' +\n                        '<button type=\"button\" class=\"pb-qty-down\" aria-label=\"Decrease quantity\"></button>';\n      host.appendChild(steps);\n      function step(delta) {\n        var v = parseInt(input.value, 10); if (isNaN(v)) v = 1;\n        v = Math.max(1, v + delta); input.value = v;\n        ['input', 'change', 'keyup'].forEach(function (ev) { input.dispatchEvent(new Event(ev, { bubbles: true })); });\n      }\n      steps.querySelector('.pb-qty-up').addEventListener('click', function (e) { e.preventDefault(); step(1); });\n      steps.querySelector('.pb-qty-down').addEventListener('click', function (e) { e.preventDefault(); step(-1); });\n    });\n  }\n\n  // Pre-cut card \u2192 match the mockup: scissors icon, \"Pre-cut transfers\" + \"$0.19 each\"\n  // + \"Ready to press \u2014 no trimming\", and a right-side \"+$sum\" ($0.19 \u00D7 total qty) with\n  // the real #preCutOption_multi checkbox restyled as a toggle (kept functional).\n  var PB_SCISSORS = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"6\" cy=\"6\" r=\"3\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M20 4 8.12 15.88M14.47 14.48 20 20M8.12 8.12 12 12\"/></svg>';\n  var PB_TRASH = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>';\n  var PB_MAGNIFY = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"M21 21l-4.35-4.35\"/></svg>';\n  function stylePrecut(designs) {\n    var pc = document.querySelector('.pb-precut-card');\n    if (!pc) return;\n    var input = pc.querySelector('#preCutOption_multi') || pc.querySelector('input[type=checkbox]');\n    if (!input) return;\n    var inner = pc.querySelector(':scope > .pb-precut-inner');\n    if (!inner) {\n      var row = pc.querySelector('.precut__row');\n      inner = document.createElement('div');\n      inner.className = 'pb-precut-inner';\n      inner.innerHTML =\n        '<span class=\"pb-precut-icon\">' + PB_SCISSORS + '</span>' +\n        '<div class=\"pb-precut-text\"><div class=\"pb-precut-title\">Pre-cut transfers</div>' +\n        '<div class=\"pb-precut-each\">$0.19 each</div>' +\n        '<div class=\"pb-precut-sub\">Ready to press \u2014 no trimming</div></div>' +\n        '<div class=\"pb-precut-sum\"></div>' +\n        '<label class=\"pb-precut-toggle\"><span class=\"pb-precut-slider\"></span></label>';\n      pc.appendChild(inner);\n      // Move the real checkbox into our toggle (keeps id/handlers \u2192 engine still works).\n      var tog = inner.querySelector('.pb-precut-toggle');\n      tog.insertBefore(input, tog.firstChild);\n      if (row) row.style.display = 'none';           // hide the engine's original row\n    }\n    var qty = 0;\n    (designs || readDesigns()).forEach(function (d) { d.sizes.forEach(function (s) { qty += (parseInt(s.qty, 10) || 0); }); });\n    var sumEl = inner.querySelector('.pb-precut-sum');\n    if (sumEl) sumEl.textContent = '+' + money(0.19 * qty);\n  }\n\n  // \u2500\u2500 BG-removal options modal (desktop views) \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  // The engine's hidden .nt-bgr-tabs panel per design holds 3 option buttons with\n  // preview thumbnails; the modal clones those previews and clicking Apply clicks\n  // the REAL tab so the engine does the actual switch. \"View all\" reopens it and\n  // only shows while Remove BG is on.\n  function pbDesktop() { return window.matchMedia && window.matchMedia('(min-width: 801px)').matches; }\n  function ensureBgrModal() {\n    var m = document.getElementById('pb-bgr-modal');\n    if (m) return m;\n    m = document.createElement('div');\n    m.id = 'pb-bgr-modal';\n    m.className = 'pb-bgr-modal';\n    m.innerHTML =\n      '<div class=\"pb-bgr-modal__backdrop\"></div>' +\n      '<div class=\"pb-bgr-modal__card\" role=\"dialog\" aria-label=\"Background removal options\">' +\n        '<div class=\"pb-bgr-modal__head\"><span class=\"pb-bgr-modal__badge\">NEW</span>' +\n        '<span class=\"pb-bgr-modal__title\">3 BG Removal options</span>' +\n        '<button type=\"button\" class=\"pb-bgr-modal__close\" aria-label=\"Close\">&times;</button></div>' +\n        '<div class=\"pb-bgr-modal__opts\"></div>' +\n        '<div class=\"pb-bgr-modal__foot\">' +\n        '<button type=\"button\" class=\"pb-bgr-modal__cancel\">Cancel</button>' +\n        '<button type=\"button\" class=\"pb-bgr-modal__apply\">Apply</button></div>' +\n      '</div>';\n    document.body.appendChild(m);\n    function close() { m.classList.remove('pb-open'); m.__tabs = null; }\n    m.querySelector('.pb-bgr-modal__backdrop').addEventListener('click', close);\n    m.querySelector('.pb-bgr-modal__close').addEventListener('click', close);\n    m.querySelector('.pb-bgr-modal__cancel').addEventListener('click', close);\n    m.querySelector('.pb-bgr-modal__apply').addEventListener('click', function () {\n      if (m.__tabs && m.__tabs[m.__sel]) m.__tabs[m.__sel].click();\n      close();\n    });\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape') close(); });\n    return m;\n  }\n  function openBgrModal(block, _try) {\n    var tabs = [].slice.call(block.querySelectorAll('.nt-bgr-tab'));\n    if (!tabs.length) {\n      // On phones the engine is often still processing when the toggle-on 700ms\n      // delay fires \u2014 keep retrying while Remove BG stays on, then open.\n      var inp = block.querySelector('.switch.bgRemover input');\n      if ((_try || 0) < 40 && (!inp || inp.checked)) {\n        setTimeout(function () { openBgrModal(block, (_try || 0) + 1); }, 500);\n      }\n      return;\n    }\n    var m = ensureBgrModal();\n    m.__tabs = tabs;\n    m.__sel = Math.max(0, tabs.findIndex(function (t) { return /is-active/.test(t.className); }));\n    var host = m.querySelector('.pb-bgr-modal__opts');\n    host.innerHTML = '';\n    tabs.forEach(function (t, i) {\n      var card = document.createElement('div');\n      card.className = 'pb-bgr-opt' + (i === m.__sel ? ' pb-sel' : '');\n      card.innerHTML = '<div class=\"pb-bgr-opt__thumb pb-loading\"></div>' +\n        '<div class=\"pb-bgr-opt__lbl\">Option ' + (i + 1) + '</div>';\n      var th = card.querySelector('.pb-bgr-opt__thumb');\n      applyChecker(th);\n      // The engine's per-option previews load (and can be swapped) AFTER the\n      // modal opens \u2014 poll the real tab's <img> and mirror its src. The\n      // pb-loading class shows a spinner until the preview actually renders.\n      (function fill(n) {\n        var im = t.querySelector('img');\n        var src = im && im.getAttribute('src');\n        if (src) {\n          var el = th.querySelector('img');\n          if (!el) {\n            el = document.createElement('img'); el.alt = '';\n            el.addEventListener('load', function () { th.classList.remove('pb-loading'); });\n            th.appendChild(el);\n          }\n          if (el.getAttribute('src') !== src) el.src = src;\n          if (el.complete && el.naturalWidth) th.classList.remove('pb-loading');\n        }\n        if (n < 40 && (n < 2 || m.classList.contains('pb-open'))) {\n          setTimeout(function () { fill(n + 1); }, 500);\n        }\n      })(0);\n      card.addEventListener('click', function () {\n        m.__sel = i;\n        [].forEach.call(host.children, function (c, j) { c.classList.toggle('pb-sel', j === i); });\n      });\n      host.appendChild(card);\n    });\n    m.classList.add('pb-open');\n  }\n\n  // When Remove BG turns on (at upload or after), do NOT auto-open the modal \u2014\n  // silently apply Option 1 to the preview instead; the modal opens only via\n  // the \"View options\" link. All views (Large/Compact/mobile) \u2014 Justin 7-6.\n  // Retries while the engine is still processing (tabs render late on phones).\n  function defaultBgrOption(block, _try) {\n    var inp = block.querySelector('.switch.bgRemover input');\n    if (!inp || !inp.checked) return;\n    var tabs = [].slice.call(block.querySelectorAll('.nt-bgr-tab'));\n    if (!tabs.length) {\n      if ((_try || 0) < 40) setTimeout(function () { defaultBgrOption(block, (_try || 0) + 1); }, 500);\n      return;\n    }\n    if (!/is-active/.test(tabs[0].className)) tabs[0].click();\n  }\n\n  // Tools section \u2192 match mockup: label-left / toggle-right rows, no \"Powered by\n  // AI\" pill, no divider line. We inject clean text labels and hide the engine's\n  // built-in label/line via CSS; the real switches stay put (still functional).\n  function styleTools() {\n    // \"Add another design\" caption per Justin's comp (engine says \"file(s)\").\n    var cap = document.querySelector('another-upload-multi .secondDropZone__text');\n    if (cap && /drag and drop/i.test(cap.textContent) && cap.textContent.indexOf('25') === -1) {\n      cap.textContent = 'Drag and drop files (Up to 25)';\n    }\n    // NAVIGATION links inside the dropzone (Login) must not bubble to the\n    // dropzone's click handler \u2014 otherwise tapping Login ALSO pops the file\n    // picker (Justin 7-2). JS-driven links (previous designs / Create with AI)\n    // use DELEGATED document-level handlers, so stopping their propagation\n    // breaks them (Justin 7-6) \u2014 only guard real hrefs.\n    [].forEach.call(document.querySelectorAll('.secondDropZone a'), function (a) {\n      if (a.__pbNoBubble) return;\n      a.__pbNoBubble = true;\n      a.addEventListener('click', function (e) {\n        var href = a.getAttribute('href') || '';\n        if (href && href !== '#' && href.indexOf('javascript:') !== 0) e.stopPropagation();\n      });\n    });\n    [].forEach.call(document.querySelectorAll('.multiupload-rebuild-tools-inner'), function (tools) {\n      var badge = tools.querySelector('.ai-badge'); if (badge) badge.style.display = 'none';\n      // Edit-with-AI: desktop = grey dashed outline (Justin); mobile comp = blue\n      // outline pill. Set inline to win (engine's own inline-body CSS otherwise\n      // overrides), branch by viewport.\n      var ew = tools.querySelector('.edit-with-ai');\n      if (ew) {\n        var pbMob = window.matchMedia && window.matchMedia('(max-width: 800px)').matches;\n        if (pbMob) {\n          // grey dashed to match desktop Large/Compact (Justin 7-6)\n          ew.style.setProperty('border', '1.5px dashed #d1d5db', 'important');\n          ew.style.setProperty('color', '#111827', 'important');\n          ew.style.setProperty('border-radius', '6px', 'important');\n          ew.style.setProperty('background', '#fff', 'important');\n        } else {\n          // Desktop styling lives in CSS now (Large = grey dashed, Compact = blue\n          // outline) so the Large/Compact toggle can restyle it live.\n          ['border', 'color', 'border-radius', 'background'].forEach(function (p) { ew.style.removeProperty(p); });\n        }\n      }\n      var bg = tools.querySelector('.switch.bgRemover');\n      var sr = tools.querySelector('.switch.superRes');\n      if (bg && !bg.querySelector(':scope > .pb-tool-lbl')) {\n        var s = document.createElement('span'); s.className = 'pb-tool-lbl'; s.textContent = 'Remove Background';\n        bg.insertBefore(s, bg.firstChild);\n      }\n      // \"View all\" (desktop): reopens the BG-options modal; visible only while ON.\n      if (bg) {\n        var block = tools.closest('uploaded-files-block');\n        var input = bg.querySelector('input');\n        var va = bg.querySelector(':scope > .pb-bgr-viewall');\n        if (!va) {\n          va = document.createElement('a');\n          va.className = 'pb-bgr-viewall';\n          va.textContent = 'View options';\n          va.href = 'javascript:void(0)';\n          va.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (block) openBgrModal(block); });\n          var lbl = bg.querySelector(':scope > .pb-tool-lbl');\n          bg.insertBefore(va, lbl ? lbl.nextSibling : null);\n        }\n        var syncVa = function () { va.style.display = (input && input.checked) ? '' : 'none'; };\n        syncVa();\n        if (input && !input.__pbBgrWired) {\n          input.__pbBgrWired = true;\n          // Already on when the block is wired (toggled at upload time).\n          if (input.checked) setTimeout(function () { defaultBgrOption(block); }, 700);\n          input.addEventListener('change', function () {\n            syncVa();\n            // No auto-open on turn-ON (Justin 7-6) \u2014 default to Option 1;\n            // the modal opens only from \"View options\".\n            if (input.checked) setTimeout(function () { defaultBgrOption(block); }, 700);\n          });\n        }\n      }\n      if (sr && !sr.querySelector(':scope > .pb-tool-lbl')) {\n        var s2 = document.createElement('span'); s2.className = 'pb-tool-lbl'; s2.textContent = 'Upscale';\n        sr.insertBefore(s2, sr.firstChild);\n      }\n    });\n  }\n\n  // \"Add Another Size\" + design-notes side by side; relabel to the mockup text.\n  function styleSizeActions() {\n    [].forEach.call(document.querySelectorAll(BLOCK_SEL), function (block) {\n      var addBlock = block.querySelector('.add-more-block');\n      var note = block.querySelector('.nt-design-note');   // it's a DIV.nt-design-note, not a tag\n      if (!addBlock || !note) return;\n      var row = block.querySelector('.pb-size-actions');\n      if (!row) {\n        row = document.createElement('div'); row.className = 'pb-size-actions';\n        addBlock.parentNode.insertBefore(row, addBlock);\n        row.appendChild(addBlock);\n        row.appendChild(note);\n      }\n      var a = addBlock.querySelector('a.addmore_size');\n      if (a && !a.__pbRelabeled) {\n        a.__pbRelabeled = true;\n        var done = false;\n        [].forEach.call(a.childNodes, function (n) {\n          if (n.nodeType === 3 && /add another size/i.test(n.textContent)) { n.textContent = ' Add Another Size'; done = true; }\n        });\n        if (!done) a.textContent = 'Add Another Size';\n      }\n      var strong = note.querySelector('.nt-design-note__title strong');\n      if (strong) strong.textContent = 'Need more than AI Edits? Add Design Notes';\n      var sub = note.querySelector('.nt-design-note__sub');\n      if (sub) sub.textContent = \"We'll handle the rest before printing\";\n    });\n  }\n\n  // \u2500\u2500 Lightbox for the magnifying-glass (upper-right of each thumbnail) \u2500\u2500\u2500\u2500\u2500\u2500\n  function ensureLightbox() {\n    var lb = document.getElementById('pb-lightbox');\n    if (lb) return lb;\n    lb = document.createElement('div');\n    lb.id = 'pb-lightbox';\n    lb.className = 'pb-lightbox';\n    lb.innerHTML = '<div class=\"pb-lightbox__backdrop\"></div>' +\n      '<div class=\"pb-lightbox__inner\"><button type=\"button\" class=\"pb-lightbox__close\" aria-label=\"Close\">&times;</button>' +\n      '<img class=\"pb-lightbox__img\" alt=\"Design preview\"></div>';\n    document.body.appendChild(lb);\n    function close() { lb.classList.remove('pb-open'); }\n    lb.querySelector('.pb-lightbox__backdrop').addEventListener('click', close);\n    lb.querySelector('.pb-lightbox__close').addEventListener('click', close);\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape') close(); });\n    return lb;\n  }\n  function openLightbox(src) {\n    if (!src) return;\n    var lb = ensureLightbox();\n    var img = lb.querySelector('.pb-lightbox__img');\n    img.src = src;\n    applyChecker(img);\n    lb.classList.add('pb-open');\n  }\n  // Intercept the zoom control (capture phase) so the engine's easyzoom doesn't fire.\n  document.addEventListener('click', function (e) {\n    if (!pbTpl()) return;\n    var z = e.target.closest && e.target.closest('.zoom_image, .nt-fp-icon--zoom, .zoom-text');\n    if (!z) return;\n    var block = z.closest(BLOCK_SEL);\n    var img = block && block.querySelector('preview-block img.xzoom, preview-block img.fileupload_hero, preview-block img');\n    if (img) { e.preventDefault(); e.stopPropagation(); openLightbox(img.currentSrc || img.src); }\n  }, true);\n\n  // Which size row is the user editing? Any focus/click/typing inside a tile\n  // marks that tile's row active (the row itself when the event lands in one,\n  // else the tile's first visible row) and reprices the tier table immediately.\n  // Deleted rows fall back to the first design via the guard in fillTierPrices.\n  var pbActiveRow = null;\n  function pbTrackActive(e) {\n    if (!document.body.classList.contains('pb-builder-open')) return;\n    var t = e.target;\n    if (!t || !t.closest) return;\n    var row = t.closest('uploaded-files-block .widthHeight__custom');\n    if (!row) {\n      var block = t.closest('uploaded-files-block');\n      if (!block) return;\n      row = [].filter.call(block.querySelectorAll('.widthHeight__custom'), function (r) { return r.offsetParent !== null; })[0] || null;\n      if (!row) return;\n    }\n    var changed = row !== pbActiveRow;\n    pbActiveRow = row;\n    if (changed) fillTierPrices();\n  }\n  document.addEventListener('focusin', pbTrackActive, true);\n  document.addEventListener('click', pbTrackActive, true);\n  document.addEventListener('input', pbTrackActive, true);\n\n  // Keep the summary in sync: engine mutations (size/qty/price) + design add/remove.\n  function watchSummary() {\n    if (!window.MutationObserver) return;\n    var oo = document.querySelector(OO_SEL);\n    var inner = document.querySelector('multi-upload.__multiUpload__inner');\n    if (!inner || inner.__pbSumWatched) return;\n    inner.__pbSumWatched = true;\n    var st = null;\n    new MutationObserver(function () { clearTimeout(st); st = setTimeout(refreshSummary, 150); })\n      .observe(inner, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['value'] });\n    inner.addEventListener('input', function () { clearTimeout(st); st = setTimeout(refreshSummary, 150); });\n    refreshSummary();\n  }\n  // hook into the boot poll\n  var _bootSum = setInterval(function () {\n    if (document.querySelector(OO_SEL) && document.querySelector(BLOCK_SEL)) { watchSummary(); clearInterval(_bootSum); }\n  }, 500);\n\n  // \u2500\u2500 Middle-scroll wheel routing (Justin 7-7) \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  // After upload, a wheel anywhere OUTSIDE the pricing table drives the LEFT\n  // cards column (upload-area, the engine's own scroll container); over the\n  // pricing table (other-options) the table scrolls natively. When the cards\n  // hit an end the remainder chains to the page. Desktop only \u2014 mobile keeps\n  // natural page scroll. NOTE: plain scrollTop assignments on upload-area are\n  // silently swallowed (engine quirk, verified live) \u2014 scrollTo({behavior:\n  // 'instant'}) is the form that works.\n  document.addEventListener('wheel', function (e) {\n    if (!document.body.classList.contains('pb-builder-open')) return;\n    if (!window.matchMedia('(min-width: 801px)').matches) return;\n    if (e.ctrlKey) return; // pinch-zoom gesture\n    var t = e.target;\n    if (!t || !t.closest) return;\n    if (t.closest('other-options')) return;                       // pricing table: native\n    if (t.closest('upload-area')) return;                         // cards column: native\n    if (t.closest('.pb-bgr-modal, .pb-lightbox, .rcl-ov, [class*=\"popup\"]')) return;   // .rcl-ov = Recolor / Image Effects dialogs (Justin 7-10: wheel over the open modal was driving the cards column behind it)\n    var area = document.querySelector('multi-upload-wrapper upload-area');\n    if (!area || area.scrollHeight - area.clientHeight < 2) return;\n    var dy = e.deltaY * (e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? area.clientHeight : 1);\n    var atTop = area.scrollTop <= 0 && dy < 0;\n    var atBottom = area.scrollTop + area.clientHeight >= area.scrollHeight - 1 && dy > 0;\n    if (atTop || atBottom) return;                                // chain to page\n    e.preventDefault();\n    area.scrollTo({ top: area.scrollTop + dy, behavior: 'instant' });\n  }, { passive: false });\n\n  // TODO(phase3b): on \"Add to cart\", after the engine adds items, redirect to /cart\n  //   (per Justin). Pending confirmation of the proceed-to-checkout add flow.\n})();\n"],
  "mappings": "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",
  "names": ["t"]
}
