{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/cart-edit-size.js?auto=format%2Ccompress"],
  "sourcesContent": ["/* cart-edit-size.js \u2014 Edit Size popup for DTF / UV by-size cart items */\n(function () {\n  'use strict';\n\n  var _data          = null;  // active item data while modal is open\n  var _activeTab     = 'custom';\n  var _lockingAspect = false; // prevent re-entrancy in syncPairedDim\n\n  /* \u2500\u2500\u2500 NO-LIMITS RULE (tag `no limits`, Owen 2026-10-07) \u2500\u2500\u2500\n     Lines flagged data-no-limits=\"1\" (snippets/arrange-properties.liquid) cap the SHORTER\n     side at maxDim and the area at the product's top \"Style #\" band (data-area-max)\n     instead of capping both axes. Every other line keeps the symmetric maxDim path. */\n  function ntNoLimitsErr(w, h) {\n    var cMax = _data.maxDim || 22, aMax = _data.areaMax || 0;\n    if (Math.min(w, h) > cMax) return 'The shorter side must be ' + cMax + '\" or less.';\n    if (aMax > 0 && w * h > aMax) return 'Maximum size for this product is ' + aMax + ' sq in.';\n    return null;\n  }\n  function ntNoLimitsFit(w, h) {\n    var cMax = _data.maxDim || 22, aMax = _data.areaMax || 0, s = 1;\n    if (Math.min(w, h) > cMax) s = cMax / Math.min(w, h);\n    if (aMax > 0 && w * h * s * s > aMax) s = Math.sqrt(aMax / (w * h));\n    return s < 1 ? { w: Math.floor(w * s * 100) / 100, h: Math.floor(h * s * 100) / 100, changed: true } : { w: w, h: h, changed: false };\n  }\n\n  /* \u2500\u2500\u2500 MONEY \u2500\u2500\u2500 */\n  function money(cents) {\n    return '$' + (cents / 100).toFixed(2);\n  }\n\n  /* \u2500\u2500\u2500 CART I/O (resilient) \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 storefront sits behind Cloudflare, which serves HTML pages (not\n   * JSON) on origin timeouts (520/524), rate-limits (429) and bot\n   * challenges. Calling r.json() on that HTML throws the opaque\n   * \"Unexpected token '<', \\\"<!DOCTYPE\\\"... is not valid JSON\" the user sees.\n   * ntCartJson() detects a non-JSON body and raises a legible, retryable\n   * error instead. ntCartGet()/ntCartPost() retry ONCE on a transient edge\n   * hiccup \u2014 but ONLY for idempotent requests (see ntCartFetch), so a retry\n   * can never double-apply a write. An 18s timeout keeps a hung 524 from\n   * leaving the modal stuck on \"Updating\u2026\".\n   * NOTE: a real JSON body is always parsed \u2014 even on 4xx \u2014 so genuine\n   * Shopify errors (e.g. 422 \"variant unavailable\") still surface via the\n   * caller's result.status check rather than being masked as transient. */\n  /* DIAGNOSTIC capture. A non-JSON cart response is Shopify's own edge\n   * (Cloudflare \u2014 the domain points straight at SHOPIFY-NET, so this edge is\n   * NOT ours to configure) handing back an error/challenge page. We record\n   * what it sent so the root cause can be pinned: the page <title> names the\n   * cause \u2014 \"Attention Required!\" = bot challenge, \"...524\" = origin timeout,\n   * \"Too Many Requests\" = rate limit. Captured (a) to localStorage for later\n   * inspection on a controlled device, and (b) to dataLayer so field frequency\n   * shows up in analytics. No PII \u2014 these are generic edge error pages. */\n  function ntLogEdgeError(detail) {\n    try {\n      console.error('[cart-edit-size] cart endpoint returned non-JSON (Shopify edge):', detail);\n      var key = 'nt_cart_edit_edge_errors', arr = [];\n      try { arr = JSON.parse(localStorage.getItem(key) || '[]'); } catch (e) {}\n      arr.push(detail);\n      while (arr.length > 5) arr.shift(); // keep only the last 5\n      try { localStorage.setItem(key, JSON.stringify(arr)); } catch (e) {}\n      if (window.dataLayer && typeof window.dataLayer.push === 'function') {\n        window.dataLayer.push({ event: 'cart_edit_edge_error', cee_path: detail.path, cee_status: detail.status, cee_title: detail.title });\n      }\n    } catch (e) {}\n  }\n  function ntCartJson(r) {\n    var ct = r.headers.get('content-type') || '';\n    if (ct.indexOf('json') !== -1 || ct.indexOf('javascript') !== -1) {\n      return r.json();\n    }\n    // Non-JSON = Shopify-edge error/challenge page. Capture a snippet for the\n    // root-cause investigation, then fail transiently with a legible message.\n    return r.text().then(function (body) {\n      var title = ((body || '').match(/<title[^>]*>([^<]*)<\\/title>/i) || [])[1] || '';\n      var path = '';\n      try { path = new URL(r.url).pathname; } catch (e) { path = r.url || ''; }\n      ntLogEdgeError({ path: path, status: r.status, cfRay: r.headers.get('cf-ray') || null, title: String(title).trim().slice(0, 120), ts: new Date().toISOString() });\n      var e = new Error('Cart didn\u2019t respond correctly (status ' + r.status + '). Please try again.');\n      e.ntTransient = true; // edge page \u2192 safe to re-attempt\n      throw e;\n    });\n  }\n  function ntIsTransient(err) {\n    // Re-attemptable: non-JSON edge page (ntTransient), timeout (AbortError),\n    // or a network/connection failure (TypeError).\n    return !!err && (err.ntTransient || err.name === 'AbortError' || err.name === 'TypeError');\n  }\n  // Low-level cart fetch: 18s timeout, and ONE retry on a transient failure\n  // but ONLY when the caller marks the request idempotent (safe to apply\n  // twice). Absolute-quantity change.js (fast path / merge-to-total / removal)\n  // and the /cart.js GET are idempotent \u2014 re-sending sets the same state.\n  // /cart/add.js is NOT: Shopify INCREMENTS on a repeat add, so a retry after\n  // a 520/524-that-actually-landed would duplicate the line; those fail\n  // straight to the legible error instead of silently retrying.\n  var NT_CART_TIMEOUT = 18000;\n  function ntCartFetch(url, init, idempotent) {\n    function attempt() {\n      var ctrl = (typeof AbortController !== 'undefined') ? new AbortController() : null;\n      var timer = ctrl ? setTimeout(function () { ctrl.abort(); }, NT_CART_TIMEOUT) : null;\n      if (ctrl) init.signal = ctrl.signal;\n      return fetch(url, init).then(function (r) {\n        if (timer) clearTimeout(timer);\n        return ntCartJson(r);\n      }, function (err) {\n        if (timer) clearTimeout(timer);\n        if (err && err.name === 'AbortError') {\n          var e = new Error('Cart request timed out. Please try again.');\n          e.ntTransient = true;\n          throw e;\n        }\n        throw err;\n      });\n    }\n    return attempt().catch(function (err) {\n      if (idempotent && ntIsTransient(err)) {\n        return new Promise(function (res) { setTimeout(res, 600); }).then(attempt);\n      }\n      throw err;\n    });\n  }\n  function ntCartGet(url) {\n    return ntCartFetch(url, { headers: { 'Accept': 'application/json' } }, true);\n  }\n  function ntCartPost(url, payload, idempotent) {\n    return ntCartFetch(url, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify(payload)\n    }, !!idempotent);\n  }\n  // True when two inch dimensions are effectively equal (2-dp tolerance).\n  function ntSameDim(a, b) { return Math.abs((a || 0) - (b || 0)) < 0.005; }\n\n  /* \u2500\u2500\u2500 ASPECT RATIO \u2500\u2500\u2500 */\n  function ntGetAspectRatio() {\n    if (!_data) return 0;\n    // The artwork's own shape \u2014 the lock's target (ntLockInit). For an un-stretched line it is\n    // the line's W/H, exactly as before; for a stretched line it is measured from the art.\n    if (_data.artAr > 0) return _data.artAr;\n    // Edit mode: use the original item dims\n    if (_data.width && _data.height) return _data.width / _data.height;\n    // Add mode: derive from image pixel dimensions once loaded\n    if (_data.imgPx && _data.imgPx.w && _data.imgPx.h) return _data.imgPx.w / _data.imgPx.h;\n    return 0;\n  }\n\n  /*\n   * Fit bounding-box (bw \u00D7 bh) to the artwork's original aspect ratio.\n   * Updates nt-edit-w / nt-edit-h (silently) and updates the selected\n   * option label to show the fitted dimensions.\n   */\n  function ntApplyPopularSize(bw, bh) {\n    var ar = ntGetAspectRatio();\n    var w, h;\n    if (ar > 0) {\n      if (ar >= bw / bh) { w = bw;    h = bw / ar; }\n      else               { h = bh;    w = bh * ar;  }\n    } else {\n      w = bw; h = bh;\n    }\n\n    // Clamp to product limits\n    var minDim = _data.minDim || 0.25;\n    var maxDim = _data.maxDim || 22;\n    if (_data.noLimits) {\n      var nlFit = ntNoLimitsFit(w, h);\n      w = nlFit.w; h = nlFit.h;\n    } else if (w > maxDim || h > maxDim) {\n      var scale = Math.min(maxDim / w, maxDim / h);\n      w *= scale; h *= scale;\n    }\n    w = Math.max(minDim, w);\n    h = Math.max(minDim, h);\n\n    // Push fitted dims into custom inputs (silently \u2014 tab stays on popular)\n    document.getElementById('nt-edit-w').value = w.toFixed(2);\n    document.getElementById('nt-edit-h').value = h.toFixed(2);\n\n    // Update selected option label to show fitted dimensions\n    var sel = document.getElementById('nt-popular-select');\n    if (sel) {\n      // Reset all options to their original labels first\n      for (var i = 0; i < sel.options.length; i++) {\n        if (sel.options[i].dataset.originalLabel) {\n          sel.options[i].textContent = sel.options[i].dataset.originalLabel;\n        }\n      }\n      // Update selected option with fitted dimensions\n      var selOpt = sel.options[sel.selectedIndex];\n      if (selOpt && selOpt.dataset.originalLabel) {\n        var origLabel = selOpt.dataset.originalLabel;\n        var descPart  = origLabel.indexOf(' \u2013 ') !== -1 ? origLabel.split(' \u2013 ').slice(1).join(' \u2013 ') : '';\n        selOpt.textContent = w.toFixed(2) + '\" x ' + h.toFixed(2) + '\"' +\n                             (descPart ? ' \u2013 ' + descPart : '');\n      }\n    }\n\n    // Smart Sizing label\n    var smartSized = (Math.abs(w - bw) > 0.01 || Math.abs(h - bh) > 0.01);\n    var label = document.getElementById('nt-smart-label');\n    if (label) label.style.display = smartSized ? 'flex' : 'none';\n\n    return { w: w, h: h };\n  }\n\n  /*\n   * Sync the paired dimension input when user types in Custom tab.\n   * Mirrors Cart V2's syncPairedDimension.\n   */\n  function ntSyncPairedDim(changedInput) {\n    if (_lockingAspect) return;\n    if (_data && _data.unlocked) return; // unlocked: each axis is its own\n    var ar = ntGetAspectRatio();\n    if (!ar) return;\n\n    var isWidth = (changedInput.id === 'nt-edit-w');\n    var val = parseFloat(changedInput.value);\n    if (!val || val <= 0) return;\n\n    _lockingAspect = true;\n\n    // Sync only \u2014 no clamping here. Clamping happens on blur so the user\n    // sees the out-of-range message before their value gets corrected.\n    var paired     = isWidth ? val / ar : val * ar;\n    var pairedInput = document.getElementById(isWidth ? 'nt-edit-h' : 'nt-edit-w');\n    if (pairedInput) pairedInput.value = paired.toFixed(2);\n\n    _lockingAspect = false;\n  }\n\n  /* \u2500\u2500\u2500 DISCOUNT TIER PARSING \u2500\u2500\u2500 */\n  function parseDiscountTiers(encodedInput) {\n    if (!encodedInput) return [];\n    try {\n      var decoded = decodeURIComponent(decodeURIComponent(decodeURIComponent(encodedInput)));\n      var entries = decoded.split('#').filter(Boolean);\n      var raw = entries.map(function (entry) {\n        var parts = entry.split('-');\n        var min = parseInt((parts[0] || '').replace(/[^0-9]/g, ''), 10) || 0;\n        var pct = parseInt((parts[1] || '').replace(/[^0-9]/g, ''), 10) || 0;\n        return { min: min, pct: pct };\n      }).sort(function (a, b) { return a.min - b.min; });\n      var cleaned = [];\n      for (var i = raw.length - 1; i >= 0; i--) {\n        if (cleaned.length === 0 || raw[i].pct < cleaned[0].pct) cleaned.unshift(raw[i]);\n      }\n      return cleaned;\n    } catch (e) { return []; }\n  }\n\n  function getCurrentTier(tiers, totalQty) {\n    var current = { min: 0, pct: 0 };\n    for (var i = 0; i < tiers.length; i++) {\n      if (totalQty >= tiers[i].min) current = tiers[i];\n      else break;\n    }\n    return current;\n  }\n\n  /* \u2500\u2500\u2500 LIVE CART QTY REFRESH \u2500\u2500\u2500 */\n  // Fetch /cart.js and recalculate totalDtfQty from live data so the popup\n  // always shows the correct discount tier, even after stepper qty changes.\n  function ntRefreshTotalDtfQty(callback) {\n    if (!_data) { if (callback) callback(); return; }\n    /* A line priced by its product type's rules (arrange-properties.liquid) already carries the cart's own count \u2014\n       every piece in its combine group, re-rendered with each cart change. The scan below only knows the old\n       Upload / _discount_name lines and undercounts today's (QA 10-26: 40% quoted where the cart gives 50%). */\n    if (_data.tierRules) { if (callback) callback(); return; }\n    // Find this item's _discount_name from its props\n    var discName = '';\n    for (var i = 0; i < (_data.props || []).length; i++) {\n      if (_data.props[i].k === '_discount_name') { discName = _data.props[i].v; break; }\n    }\n    fetch('/cart.js', { headers: { 'Accept': 'application/json' } })\n    .then(function (r) { return r.json(); })\n    .then(function (cart) {\n      var total = 0;\n      for (var j = 0; j < cart.items.length; j++) {\n        var it = cart.items[j];\n        var ip = it.properties || {};\n        // Must have an upload property, _discount_input, and matching _discount_name\n        var hasUpload = false;\n        var hasDiscInput = false;\n        var hasMatchingDn = false;\n        var pKeys = Object.keys(ip);\n        for (var k = 0; k < pKeys.length; k++) {\n          var pk = pKeys[k].toLowerCase();\n          if (pk.indexOf('upload') === 0 && pk.charAt(0) !== '_' && ip[pKeys[k]]) hasUpload = true;\n          if (pKeys[k] === '_discount_input' && ip[pKeys[k]]) hasDiscInput = true;\n          if (pKeys[k] === '_discount_name' && ip[pKeys[k]] === discName) hasMatchingDn = true;\n        }\n        if (hasUpload && hasDiscInput && hasMatchingDn) total += it.quantity;\n      }\n      _data.totalDtfQty = total;\n      if (callback) callback();\n    })\n    .catch(function () { if (callback) callback(); });\n  }\n\n  /* the sq-in band a size prices in: the by-size PDP's rule (dev/bysize-v4/src/ported/sizing-math.js\n     matchCustomVariant) \u2014 area rounded UP, at least 1. Rounding to nearest put e.g. 4.9 x 8.06 (39.49) in the\n     30-39 band while the PDP charges 40-49, and an Edit that resized a line re-added it one band too cheap. */\n  function ntSqIn(w, h) { var a = (parseFloat(w) || 0) * (parseFloat(h) || 0); return a >= 1 ? Math.ceil(a) : 1; }\n\n  /* \u2500\u2500\u2500 VARIANT LOOKUP by sqIn \u2500\u2500\u2500 */\n  function findVariantForSqIn(variants, sqIn) {\n    // Pass 1: range titles (\"Style #1-9\"), available only\n    for (var i = 0; i < variants.length; i++) {\n      var v = variants[i];\n      if (!v.title || !v.available) continue;\n      var m = v.title.match(/(\\d+)\\s*-\\s*(\\d+)/);\n      if (m && sqIn >= parseInt(m[1], 10) && sqIn <= parseInt(m[2], 10)) return v;\n    }\n    // Pass 2: same, ignore availability\n    for (var j = 0; j < variants.length; j++) {\n      var v2 = variants[j];\n      if (!v2.title) continue;\n      var m2 = v2.title.match(/(\\d+)\\s*-\\s*(\\d+)/);\n      if (m2 && sqIn >= parseInt(m2[1], 10) && sqIn <= parseInt(m2[2], 10)) return v2;\n    }\n    // Pass 3: max-number tier fallback\n    var tiers = [];\n    for (var k = 0; k < variants.length; k++) {\n      var vk = variants[k];\n      var nums = (vk.title || '').match(/\\d+/g);\n      if (nums && nums.length) tiers.push({ max: Math.max.apply(null, nums.map(Number)), variant: vk });\n    }\n    if (!tiers.length) return null;\n    tiers.sort(function (a, b) { return a.max - b.max; });\n    for (var t = 0; t < tiers.length; t++) {\n      if (tiers[t].max >= sqIn) return tiers[t].variant;\n    }\n    return tiers[tiers.length - 1].variant;\n  }\n\n  /* \u2500\u2500\u2500 PRICING \u2500\u2500\u2500 */\n  function ntUpdatePricing() {\n    if (!_data) return;\n\n    // Show dim limit message and bail if out of range \u2014 pricing stays blank\n    // until the user corrects the value (clamp fires on blur)\n    if (ntCheckDimLimits()) { ntClearPricing(); return; }\n\n    // For BOTH tabs, dimensions come from nt-edit-w / nt-edit-h\n    // (popular tab populates these via ntApplyPopularSize before pricing runs)\n    var w = parseFloat(document.getElementById('nt-edit-w').value) || 0;\n    var h = parseFloat(document.getElementById('nt-edit-h').value) || 0;\n\n    if (_activeTab === 'custom') {\n      // Update sq in display\n      var sqIn  = (w && h) ? ntSqIn(w, h) : 0;\n      var sqInEl = document.getElementById('nt-edit-sqin');\n      if (sqIn > 0) { sqInEl.textContent = sqIn + ' sq in'; sqInEl.style.color = '#555'; }\n      else           { sqInEl.textContent = '\u2014 sq in';       sqInEl.style.color = '#aaa'; }\n      if (!w || !h) { ntClearPricing(); return; }\n    } else {\n      var sel = document.getElementById('nt-popular-select');\n      if (!sel || !sel.value) { ntClearPricing(); return; }\n      if (!w || !h) { ntClearPricing(); return; }\n    }\n\n    // Minimum 1 sq in for variant tier lookup \u2014 anything under 1 sq in rounds up\n    var sqInFinal = ntSqIn(w, h);\n    var found     = findVariantForSqIn(_data.variants, sqInFinal);\n    var basePrice = found ? found.price : 0;\n    if (!basePrice) { ntClearPricing(); return; }\n\n    var qty           = _data.editQty;\n    var tiers         = parseDiscountTiers(_data.discountInput);\n    // In add mode _data.qty is null (no existing line being replaced) \u2014 treat as 0\n    var existingQty   = _data.qty != null ? _data.qty : 0;\n\n    // \"Other items\" qty = total DTF qty excluding this line item.\n    // If Shopify already applied a higher discount than our raw count implies,\n    // back-calculate the minimum other-items qty that explains it \u2014 so that\n    // reducing THIS item's qty still correctly lowers (or removes) the discount.\n    var rawOtherQty = _data.totalDtfQty - existingQty;\n    var otherQty    = rawOtherQty;\n    if (_data.itemPrice > 0 && _data.origBasePrice > 0) {\n      var shopifyDiscPct = Math.round((1 - _data.itemPrice / _data.origBasePrice) * 100);\n      if (shopifyDiscPct > 0) {\n        // Find the minimum total qty that produces this discount in the tier table\n        var minForShopifyDisc = 0;\n        for (var ti = 0; ti < tiers.length; ti++) {\n          if (tiers[ti].pct === shopifyDiscPct) { minForShopifyDisc = tiers[ti].min; break; }\n        }\n        // Other items must be at least (minForShopifyDisc - existingQty)\n        if (minForShopifyDisc > 0) {\n          otherQty = Math.max(rawOtherQty, minForShopifyDisc - existingQty);\n        }\n      }\n    }\n\n    var effectiveTotal= otherQty + qty;\n    var tier          = getCurrentTier(tiers, effectiveTotal);\n    var discPct       = tier.pct;\n\n    // The cart takes the discount per piece, rounded DOWN (assets/nt-qty-tiers.js eachPrice):\n    // 50% of $3.33 is $1.66 off, so $1.67 each and the line is exactly each x qty\n    var origTotal   = basePrice * qty;\n    var discEa      = discPct > 0 ? basePrice - Math.floor(basePrice * discPct / 100) : basePrice;\n    var totalCents  = discEa * qty;\n\n    var eaOrigEl  = document.getElementById('nt-price-ea-orig');\n    var eaEl      = document.getElementById('nt-price-ea');\n    var totOrigEl = document.getElementById('nt-total-orig');\n    var totEl     = document.getElementById('nt-total');\n    var badgeEl   = document.getElementById('nt-disc-badge');\n\n    // Always populate orig lines \u2014 visibility controls whether they show\n    // so the layout height never shifts between discount/no-discount states\n    eaOrigEl.textContent       = money(basePrice) + ' ea';\n    totOrigEl.textContent      = money(origTotal);\n    eaEl.textContent           = money(discPct > 0 ? discEa : basePrice) + ' ea';\n    totEl.textContent          = money(totalCents);\n\n    if (discPct > 0) {\n      eaOrigEl.style.display  = 'block';\n      totOrigEl.style.display = 'block';\n      badgeEl.textContent     = discPct + '% off';\n      badgeEl.style.visibility = 'visible';\n    } else {\n      eaOrigEl.style.display  = 'none';\n      totOrigEl.style.display = 'none';\n      badgeEl.style.visibility = 'hidden';\n    }\n    ntSetError('');\n    ntUpdateDpiWarning();\n  }\n\n  function ntClearPricing() {\n    document.getElementById('nt-price-ea-orig').style.display = 'none';\n    document.getElementById('nt-price-ea').textContent        = '';\n    document.getElementById('nt-total-orig').style.display    = 'none';\n    document.getElementById('nt-total').textContent           = '';\n    document.getElementById('nt-disc-badge').style.visibility = 'hidden';\n    ntHideDpiWarning();\n  }\n\n  /* \u2500\u2500\u2500 TAB SWITCHING \u2500\u2500\u2500 */\n  function ntSwitchTab(tab) {\n    _activeTab = tab;\n    var customBtn   = document.getElementById('nt-tab-custom');\n    var popularBtn  = document.getElementById('nt-tab-popular');\n    var customView  = document.getElementById('nt-view-custom');\n    var popularView = document.getElementById('nt-view-popular');\n\n    if (tab === 'custom') {\n      customBtn.style.color        = '#111';\n      customBtn.style.fontWeight   = '600';\n      customBtn.style.borderBottom = '2px solid #019AFF';\n      popularBtn.style.color       = '#888';\n      popularBtn.style.fontWeight  = '500';\n      popularBtn.style.borderBottom= '2px solid transparent';\n      customView.style.display     = 'block';\n      popularView.style.display    = 'none';\n    } else {\n      popularBtn.style.color        = '#111';\n      popularBtn.style.fontWeight   = '600';\n      popularBtn.style.borderBottom = '2px solid #019AFF';\n      customBtn.style.color         = '#888';\n      customBtn.style.fontWeight    = '500';\n      customBtn.style.borderBottom  = '2px solid transparent';\n      customView.style.display      = 'none';\n      popularView.style.display     = 'block';\n    }\n    ntSetError('');\n    ntUpdatePricing();\n  }\n\n  /* \u2500\u2500\u2500 OPEN \u2500\u2500\u2500 */\n  document.addEventListener('click', function (e) {\n    var btn = e.target.closest('.nt-edit-size-btn');\n    if (!btn) return;\n    var block = btn.closest('.nt-size-block');\n    if (!block) return;\n\n    var propsEl    = block.querySelector('.nt-props-json');\n    var variantsEl = block.querySelector('.nt-variants-json');\n    var popularEl  = block.querySelector('.nt-popular-json');\n\n    var props = [], variants = [], popularSizes = [];\n    try { props        = JSON.parse(propsEl.textContent).p;    } catch (_) {}\n    try { variants     = JSON.parse(variantsEl.textContent);   } catch (_) {}\n    try { popularSizes = JSON.parse(popularEl.textContent);    } catch (_) {}\n\n    var qty = parseInt(block.dataset.qty, 10) || 1;\n\n    _data = {\n      lineKey:       block.dataset.lineKey,\n      qty:           qty,\n      editQty:       qty,\n      width:         parseFloat(block.dataset.width)  || 0,\n      height:        parseFloat(block.dataset.height) || 0,\n      productHandle: block.dataset.productHandle,\n      variantId:     parseInt(block.dataset.variantId, 10),\n      props:         props,\n      variants:      variants,\n      popularSizes:  popularSizes,\n      discountInput: block.dataset.discountInput || '',\n      totalDtfQty:   parseInt(block.dataset.totalDtfQty, 10) || qty,\n      tierRules:     block.dataset.tierRules === '1',\n      itemPrice:     parseInt(block.dataset.itemPrice, 10) || 0,\n      origBasePrice: 0,\n      isUv:          block.dataset.isUv === 'true',\n      minDim:        parseFloat(block.dataset.minDim) || 0.25,\n      maxDim:        parseFloat(block.dataset.maxDim) || 22,\n      noLimits:      block.dataset.noLimits === '1',\n      areaMax:       parseFloat(block.dataset.areaMax) || 0\n    };\n    /* Film-aware ladder (gang-bysize, Owen 2026-10-13): a product whose variants carry a second option\n       (\"Style #1-9 / Glitter\" \u2014 the Detector gang product prices every sq-in bucket x 5 films) must only\n       resize WITHIN the line's own film; findVariantForSqIn would otherwise return the first film's bucket.\n       Single-option products (titles without \" / \") are untouched. */\n    (function () {\n      var cur = null;\n      for (var ci = 0; ci < variants.length; ci++) if (variants[ci] && variants[ci].id === _data.variantId) { cur = variants[ci]; break; }\n      var t = cur && typeof cur.title === 'string' ? cur.title : '';\n      var slash = t.indexOf(' / ');\n      if (slash < 0) return;\n      var suffix = t.slice(slash);\n      var same = variants.filter(function (v) { return v && typeof v.title === 'string' && v.title.slice(-suffix.length) === suffix; });\n      if (!same.length) return;\n      var ids = {}; same.forEach(function (v) { ids[v.id] = true; });\n      _data.variants = same;\n      _data.popularSizes = popularSizes = popularSizes.filter(function (ps) { return ps && ids[ps.id]; });\n    }());\n    // Compute the base price at original dimensions so we can derive\n    // the discount pct Shopify actually applied (in case our count is off)\n    (function () {\n      var origSqIn = ntSqIn(_data.width, _data.height);\n      if (origSqIn > 0) {\n        var ov = findVariantForSqIn(_data.variants, origSqIn);\n        if (ov) _data.origBasePrice = ov.price;\n      }\n    }());\n\n    // Pre-fill width / height\n    document.getElementById('nt-edit-w').value = _data.width;\n    document.getElementById('nt-edit-h').value = _data.height;\n    ntLockInit(props, false); // a stretched line opens unlocked (its current state)\n\n    // Qty\n    document.getElementById('nt-qty-val').value = _data.editQty;\n    document.getElementById('nt-qty-minus').disabled  = _data.editQty <= 1;\n\n    // Populate popular sizes dropdown\n    var sel = document.getElementById('nt-popular-select');\n    sel.innerHTML = '<option value=\"\">Select a popular size</option>';\n    popularSizes.forEach(function (ps) {\n      var opt = document.createElement('option');\n      opt.value               = ps.w + ',' + ps.h;\n      opt.dataset.variantId   = ps.id;\n      opt.dataset.originalLabel = ps.label + (ps.desc ? ' \u2013 ' + ps.desc : '');\n      opt.textContent         = opt.dataset.originalLabel;\n      sel.appendChild(opt);\n    });\n\n    // Hide smart label\n    var smartLabel = document.getElementById('nt-smart-label');\n    if (smartLabel) smartLabel.style.display = 'none';\n\n    // Immediate DPI warning: if the item was added to cart with a DPI warning\n    // already active, show it right away (synchronous, no network needed).\n    // The async dimension load below will then refine it based on current size.\n    _data.imgPx = null;\n    if (typeof ntSrReset === \"function\") ntSrReset(); // fresh line, fresh upscale opt-in\n    var _storedDpiWarning = false;\n    for (var di = 0; di < props.length; di++) {\n      if (props[di].k === 'DPI Warning' && props[di].v === 'Yes') {\n        _storedDpiWarning = true; break;\n      }\n    }\n    if (_storedDpiWarning) { ntShowDpiWarning(); } else { ntHideDpiWarning(); }\n\n    // Async: load image pixel dimensions so we can recalculate DPI as the user\n    // changes size. Fast path: imgix ?fm=json (tiny JSON, no image download).\n    // Fallback: new Image() \u2014 always works, just slower.\n    (function () {\n      var uploadUrl = '';\n      for (var pi = 0; pi < props.length; pi++) {\n        if (props[pi].k.toLowerCase().indexOf('upload') !== -1 && props[pi].v) {\n          uploadUrl = props[pi].v; break;\n        }\n      }\n      if (!uploadUrl) return;\n      var rawUrl = uploadUrl.split('?')[0];\n      var ext = rawUrl.split('.').pop().toLowerCase();\n      if (ext !== 'png' && ext !== 'jpg' && ext !== 'jpeg') return;\n      var absUrl = (rawUrl.indexOf('//') === 0 ? 'https:' : '') + rawUrl;\n\n      function onDims(w, h) {\n        if (_data && w && h) {\n          _data.imgPx = { w: w, h: h };\n          ntUpdateDpiWarning();\n        }\n      }\n\n      function imgFallback() {\n        var img = new Image();\n        img.onload  = function () { onDims(img.naturalWidth, img.naturalHeight); };\n        img.onerror = function () { /* silent \u2014 stored-prop warning stays if active */ };\n        img.src = absUrl;\n      }\n\n      // Try imgix JSON metadata first (fast \u2014 only fetches header metadata)\n      if (absUrl.indexOf('imgix.net') !== -1) {\n        fetch(absUrl + '?fm=json')\n          .then(function (r) { return r.ok ? r.json() : Promise.reject(); })\n          .then(function (d) {\n            if (d && d.PixelWidth && d.PixelHeight) {\n              onDims(d.PixelWidth, d.PixelHeight);\n            } else {\n              imgFallback();\n            }\n          })\n          .catch(function () { imgFallback(); });\n      } else {\n        imgFallback();\n      }\n    }());\n\n    ntSwitchTab('custom');\n    ntSetError('');\n    ntClearDimError();\n    ntSetConfirmState(false);\n    // Fetch live cart to get accurate totalDtfQty before first pricing\n    ntRefreshTotalDtfQty(function () { ntUpdatePricing(); });\n\n    document.getElementById('nt-edit-modal').style.display = 'flex';\n    ntAdjustModalHeight();\n    if (!/Mobi|Android|iPhone|iPad/i.test(navigator.userAgent)) {\n      document.getElementById('nt-edit-w').focus();\n    }\n  });\n\n  /* \u2500\u2500\u2500 CLICK EVENTS \u2500\u2500\u2500 */\n  document.addEventListener('click', function (e) {\n    // Tabs\n    if (e.target.closest('#nt-tab-custom'))  { ntSwitchTab('custom');  return; }\n    if (e.target.closest('#nt-tab-popular')) { ntSwitchTab('popular'); return; }\n\n    var id = e.target.id;\n\n    // Width steppers\n    if (id === 'nt-w-minus') {\n      var wIn = document.getElementById('nt-edit-w');\n      wIn.value = Math.max(0.25, Math.round((parseFloat(wIn.value) || 0.25) * 4 - 1) / 4).toFixed(2);\n      ntSyncPairedDim(wIn); ntUpdatePricing(); return;\n    }\n    if (id === 'nt-w-plus') {\n      var wIn2 = document.getElementById('nt-edit-w');\n      var maxDimW = _data ? (_data.noLimits ? Infinity : (_data.maxDim || 22)) : 22;\n      wIn2.value = Math.min(maxDimW, (Math.round((parseFloat(wIn2.value) || 0) * 4 + 1) / 4)).toFixed(2);\n      ntSyncPairedDim(wIn2); ntUpdatePricing(); return;\n    }\n\n    // Height steppers\n    if (id === 'nt-h-minus') {\n      var hIn = document.getElementById('nt-edit-h');\n      hIn.value = Math.max(0.25, Math.round((parseFloat(hIn.value) || 0.25) * 4 - 1) / 4).toFixed(2);\n      ntSyncPairedDim(hIn); ntUpdatePricing(); return;\n    }\n    if (id === 'nt-h-plus') {\n      var hIn2 = document.getElementById('nt-edit-h');\n      var maxDimH = _data ? (_data.noLimits ? Infinity : (_data.maxDim || 22)) : 22;\n      hIn2.value = Math.min(maxDimH, (Math.round((parseFloat(hIn2.value) || 0) * 4 + 1) / 4)).toFixed(2);\n      ntSyncPairedDim(hIn2); ntUpdatePricing(); return;\n    }\n\n    // Qty steppers\n    if (id === 'nt-qty-minus') {\n      if (!_data) return;\n      _data.editQty = Math.max(1, _data.editQty - 1);\n      document.getElementById('nt-qty-val').value = _data.editQty;\n      document.getElementById('nt-qty-minus').disabled  = _data.editQty <= 1;\n      ntUpdatePricing(); return;\n    }\n    if (id === 'nt-qty-plus') {\n      if (!_data) return;\n      _data.editQty++;\n      document.getElementById('nt-qty-val').value = _data.editQty;\n      document.getElementById('nt-qty-minus').disabled  = false;\n      ntUpdatePricing(); return;\n    }\n  });\n\n  /* \u2500\u2500\u2500 INPUT / CHANGE \u2500\u2500\u2500 */\n  document.addEventListener('input', function (e) {\n    if (e.target.id === 'nt-qty-val') {\n      if (!_data) return;\n      var val = parseInt(e.target.value, 10);\n      if (val >= 1) {\n        _data.editQty = val;\n        document.getElementById('nt-qty-minus').disabled = val <= 1;\n        ntUpdatePricing();\n      }\n      return;\n    }\n    if (e.target.id === 'nt-edit-w' || e.target.id === 'nt-edit-h') {\n      ntSyncPairedDim(e.target); // lock aspect ratio in custom mode\n      ntUpdatePricing();\n    }\n  });\n\n  // On blur: if qty input left empty or invalid, reset to 1\n  document.addEventListener('blur', function (e) {\n    if (e.target.id !== 'nt-qty-val') return;\n    if (!_data) return;\n    var val = parseInt(e.target.value, 10);\n    if (!val || val < 1) {\n      _data.editQty = 1;\n      e.target.value = 1;\n      document.getElementById('nt-qty-minus').disabled = true;\n      ntUpdatePricing();\n    }\n  }, true);\n\n  // On blur: clamp out-of-range typed values and re-price.\n  // Handles both dims together so aspect ratio is preserved when scaling down.\n  document.addEventListener('blur', function (e) {\n    if (e.target.id !== 'nt-edit-w' && e.target.id !== 'nt-edit-h') return;\n    if (!_data) return;\n    var wEl    = document.getElementById('nt-edit-w');\n    var hEl    = document.getElementById('nt-edit-h');\n    var w      = parseFloat(wEl.value) || 0;\n    var h      = parseFloat(hEl.value) || 0;\n    var minDim = _data.minDim || 0.25;\n    var maxDim = _data.maxDim || 22;\n    var ar     = ntGetAspectRatio();\n    var changed = false;\n\n    // Max: scale both dims down proportionally so aspect ratio is preserved\n    if (_data.noLimits) {\n      // No-limits line: short side <= maxDim, area <= top band (ntNoLimitsFit; aspect kept).\n      var nlBlur = ntNoLimitsFit(w, h);\n      if (nlBlur.changed) { w = nlBlur.w; h = nlBlur.h; changed = true; }\n    } else if (w > maxDim || h > maxDim) {\n      if (ar > 0 && !_data.unlocked) {\n        var scale = Math.min(maxDim / w, maxDim / h);\n        w *= scale; h *= scale;\n      } else {\n        if (w > maxDim) w = maxDim;\n        if (h > maxDim) h = maxDim;\n      }\n      changed = true;\n    }\n\n    // Min: floor each dim independently\n    if ((w && w < minDim) || (h && h < minDim)) {\n      if (w && w < minDim) w = minDim;\n      if (h && h < minDim) h = minDim;\n      changed = true;\n    }\n\n    if (changed) {\n      wEl.value = w.toFixed(2);\n      hEl.value = h.toFixed(2);\n      ntUpdatePricing();\n    }\n  }, true); // capture \u2014 blur doesn't bubble\n\n  document.addEventListener('change', function (e) {\n    if (e.target.id === 'nt-popular-select') {\n      var val = e.target.value;\n      if (!val) return;\n      var parts = val.split(',');\n      var bw = parseFloat(parts[0]) || 0;\n      var bh = parseFloat(parts[1]) || 0;\n      if (!bw || !bh) return;\n      // Fit to aspect ratio \u2192 push fitted dims into custom inputs (tab stays on popular)\n      ntApplyPopularSize(bw, bh);\n      ntUpdatePricing();\n    }\n  });\n\n  /* \u2500\u2500 Helper: find an existing cart line that matches variant + size dims + upload \u2500\u2500\n     FILE-SCOPED (was nested in the confirm handler) so the stale-key\n     resolution below and Delete All can reuse it. Logic unchanged. */\n  function ntFindMatchingLine(cart, vid, props, excludeKey) {\n    // Normalise a value for comparison \u2014 strip &amp; encoding layers, trim\n    function norm(v) { var s = String(v == null ? '' : v); while (s.indexOf('&amp;') !== -1) s = s.replace(/&amp;/g, '&'); return s.trim(); }\n    // Numeric-normalise a dimension so \"1\", \"1.0\" and \"1.00\" all compare equal\n    function dim(v) { var n = parseFloat(norm(v)); return isNaN(n) ? norm(v) : n; }\n    // Extract upload base path (before query string) for comparison\n    function uploadBase(v) { return norm(v).split('?')[0]; }\n    /* Find the design's upload key on an object. Current adds store it\n       underscore-prefixed (\"_Upload (Vector Files Preferred)\"); older lines\n       used a bare \"Upload\" key \u2014 accept either. */\n    function findUploadKey(obj) {\n      var ks = Object.keys(obj || {});\n      for (var n = 0; n < ks.length; n++) {\n        if (ks[n].toLowerCase().replace(/^_/, '').indexOf('upload') === 0) return ks[n];\n      }\n      return '';\n    }\n    // Compare a processing flag (Remove Background / Super Resolution), case-insensitive\n    /* \"no\" and a missing flag are the same (Remove Background / Super Resolution are only sent when Yes, 2026-11-02) */\n    function flag(obj, base) { var v = norm(obj['_' + base] || obj[base] || '').toLowerCase(); return v === 'no' ? '' : v; }\n\n    /* New cart-adds write _width / _height (underscore-prefixed \u2192 hidden in\n       checkout). Read those first; fall back to legacy width / Width keys. */\n    var newW = dim(props._width || props.width || props.Width || '');\n    var newH = dim(props._height || props.height || props.Height || '');\n    var newUploadKey = findUploadKey(props);\n    var newUpload = newUploadKey ? uploadBase(props[newUploadKey]) : '';\n    var newBg = flag(props, 'Remove Background');\n    var newSr = flag(props, 'Super Resolution');\n\n    for (var i = 0; i < cart.items.length; i++) {\n      var it = cart.items[i];\n      if (it.variant_id !== vid) continue;\n      if (excludeKey && it.key === excludeKey) continue;\n      var ip = it.properties || {};\n      /* Match width + height numerically (underscore-first, legacy fallback).\n         BUG FIX: this previously read only ip.width / ip.Width, but current\n         lines store _width / _height, so the match never fired and every\n         \"add another size\" created a duplicate line instead of merging. */\n      if (dim(ip._width  || ip.width  || ip.Width  || '') !== newW) continue;\n      if (dim(ip._height || ip.height || ip.Height || '') !== newH) continue;\n      // Match the upload by base path (ignoring &amp; drift + query params)\n      if (newUpload) {\n        var ek = findUploadKey(ip);\n        if (uploadBase(ek ? ip[ek] : '') !== newUpload) continue;\n      }\n      // Keep genuinely-different outputs apart: bg-remove / super-res must match\n      if (flag(ip, 'Remove Background') !== newBg) continue;\n      if (flag(ip, 'Super Resolution') !== newSr) continue;\n      return it;\n    }\n    return null;\n  }\n\n  /* \u2500\u2500 Helper: re-resolve a line's CURRENT key right before a cart write.\n     Line keys ROTATE while the cart page sits open \u2014 the Bevy Share Cart\n     app rewrites cart lines in the background, so a key captured at render\n     time can be dead by mutation time (2026-07-22: edit-size then removed\n     a nonexistent key, silently leaving a DUPLICATE size line). Match the\n     line by identity (variant + dims + upload + flags) in a fresh cart;\n     fall back to the render-time key when no match (line already gone \u2014\n     the write becomes a harmless no-op). \u2500\u2500 */\n  function ntFreshLineKey(cart, vid, identityProps, fallbackKey) {\n    var line = ntFindMatchingLine(cart, vid, identityProps, null);\n    return line ? line.key : fallbackKey;\n  }\n\n  /* \u2500\u2500\u2500 CONFIRM \u2500\u2500\u2500 */\n  document.addEventListener('click', function (e) {\n    if (e.target.id !== 'nt-edit-confirm') return;\n    if (!_data) return;\n\n    // Always read fitted values from the custom inputs (popular selection pre-fills them)\n    var w = parseFloat(document.getElementById('nt-edit-w').value);\n    var h = parseFloat(document.getElementById('nt-edit-h').value);\n\n    if (!w || !h || w <= 0 || h <= 0) { ntSetError('Please enter valid width and height.'); return; }\n    var cMin = _data.minDim || 0.25;\n    var cMax = _data.maxDim || 22;\n    if (w < cMin || h < cMin) { ntSetError('Minimum size for this product is ' + cMin + '\".'); return; }\n    if (_data.noLimits) {\n      var nlErr = ntNoLimitsErr(w, h);\n      if (nlErr) { ntSetError(nlErr); return; }\n    } else if (w > cMax || h > cMax) { ntSetError('Maximum size for this product is ' + cMax + '\".'); return; }\n\n    // Re-locking a stretched line needs the art's own shape before it can un-stretch.\n    if (_data.canUnlock && _data.stretched && !_data.unlocked && !(_data.artAr > 0)) {\n      ntSetError('Loading your artwork\\'s original proportions. Please try again in a moment.');\n      return;\n    }\n\n    ntSetConfirmState(true);\n    ntSetError('');\n\n    var sqIn      = ntSqIn(w, h);\n    var found     = findVariantForSqIn(_data.variants, sqIn);\n    var variantId = found ? found.id : _data.variantId;\n\n    // Build updated properties \u2014 preserve everything EXCEPT any existing\n    // size keys, then write the edited size to _width / _height ONLY.\n    // Previously this overwrote a capital 'Width'/'Height' key and could not\n    // see the new underscore-prefixed keys (its lowercase scan never matched\n    // '_width'), so an edit LEFT the original _width/_height in place AND\n    // ADDED a second Width/Height pair \u2014 the order then carried two\n    // conflicting sizes. Now we drop every size-key variant (Width, Height,\n    // width, height, _width, _height) and emit a single _width/_height pair\n    // carrying the most recent edited value.\n    var properties = {};\n    for (var j = 0; j < _data.props.length; j++) {\n      var _k  = _data.props[j].k;\n      var _lk = _k.toLowerCase();\n      if (_lk === 'width' || _lk === '_width' ||\n          _lk === 'height' || _lk === '_height') continue; // collapse all size keys\n      var _v = _data.props[j].v;\n      // Decode &amp; entity drift on EVERY string value (was _cartImg-only \u2014\n      // 2026-07-22: _IX Version arrived double-encoded from a legacy add and\n      // each re-add deepened it; imgix IGNORES every query param after the\n      // corruption, so bg-removed designs rendered WITH their background).\n      // Peeling all layers stops the accumulation and repairs edited lines.\n      // Grouping-safe: group keys use the filename before '?', never params.\n      if (typeof _v === 'string' && _v.indexOf('&amp;') !== -1) {\n        while (_v.indexOf('&amp;') !== -1) _v = _v.replace(/&amp;/g, '&');\n      }\n      properties[_k] = _v;\n    }\n    properties['_width']  = String(w);\n    properties['_height'] = String(h);\n    /* Dirty gang sheet (gang-bysize, 2026-10-13): keep the Art note + final size in step with the edit.\n       Only lines that carry those props (the gang page's sheet lines) are touched. */\n    if (properties['_final_size']) properties['_final_size'] = w + 'x' + h;\n    if (typeof properties['_Art Note'] === 'string' && / - print at [\\d.]+ \u00D7 [\\d.]+ in\\.$/.test(properties['_Art Note'])) {\n      properties['_Art Note'] = properties['_Art Note'].replace(/ - print at [\\d.]+ \u00D7 [\\d.]+ in\\.$/, ' - print at ' + w + ' \u00D7 ' + h + ' in.');\n    }\n    // Proportion lock (Justin 2026-09-30). Unlocked AND off the art's shape = a stretched print\n    // file (_Stretched + fit=scale at 300dpi, the PDP's contract): rescale an existing stretch\n    // (Owen's ntStretchRescale), or stretch fresh. Otherwise a stretched source line (re-locked,\n    // or a new size copied from it) goes back to the proportional file.\n    var ntStretchIt = _data.canUnlock && _data.unlocked && _activeTab === 'custom' &&\n      _data.artAr > 0 && Math.abs((w / h) / _data.artAr - 1) >= 0.005;\n    if (ntStretchIt) {\n      if (properties['_Stretched']) ntStretchRescale(properties, w, h);\n      else ntStretchFresh(properties, w, h);\n    } else if (properties['_Stretched']) {\n      ntUnstretch(properties);\n    }\n\n    /* Print-ready reorder (production-art-sync): a new size larger than the file's printed size\n       makes the line a SIMILAR reorder, the same or smaller an EXACT one (Justin 2026-10-13); the\n       print-ready file stays. */\n    ntPrintReadyReorderNote(properties, w, h);\n\n    /* AI-upscale opt-in (Owen 9-22): only when the clarity warning is showing,\n       the customer ticked the box, and the line is eligible \u2014 see ntSrEligible. */\n    if (ntSrOptedIn()) ntSrApplyToProperties(properties);\n\n    // Snapshot line state into locals so the async chains below are immune to\n    // _data being cleared or replaced mid-flight (e.g. the user hits Cancel,\n    // closes, or re-opens the modal before the request settles).\n    var editQty   = _data.editQty;\n    var lineKey   = _data.lineKey;\n    var isAddMode = _data.mode === 'add';\n\n    // Old-line IDENTITY snapshot (variant + original properties) \u2014 lets every\n    // write below re-resolve the line's CURRENT key via ntFreshLineKey, since\n    // the render-time key may have rotated while the page sat open.\n    var oldVid   = _data.variantId;\n    var oldProps = {};\n    for (var op = 0; op < _data.props.length; op++) oldProps[_data.props[op].k] = _data.props[op].v;\n\n    if (isAddMode) {\n      // Add Size \u2014 check for duplicate first, merge if found\n      ntCartGet('/cart.js')\n      .then(function (cart) {\n        var existing = ntFindMatchingLine(cart, variantId, properties, null);\n        if (existing) {\n          // Merge: set the existing line to its new absolute total (idempotent \u2192 retryable)\n          return ntCartPost('/cart/change.js', { id: existing.key, quantity: existing.quantity + editQty }, true);\n        }\n        // No duplicate \u2014 add new line (add.js INCREMENTS \u2192 not retryable)\n        return ntCartPost('/cart/add.js', { items: [{ id: variantId, quantity: editQty, properties: properties }] });\n      })\n      .then(function (result) {\n        if (result.status && result.status >= 400) throw new Error(result.description || 'Could not add size.');\n        ntResetModalMode();\n        window.location.reload();\n      })\n      .catch(function (err) {\n        ntSetError(err.message || 'Something went wrong. Please try again.');\n        ntSetConfirmState(false);\n      });\n      return;\n    }\n\n    // Edit Size.\n    // FAST PATH \u2014 size unchanged (quantity-only edit): a single atomic\n    // change.js on the existing line. This is the common case (and the\n    // user's repro: 7\u00D79.99, qty 10\u21929). It avoids the remove-then-re-add\n    // round-trip entirely \u2014 fewer cart writes means far less exposure to a\n    // Cloudflare throttle/HTML hiccup, and nothing to lose if one occurs.\n    if (ntSameDim(w, _data.width) && ntSameDim(h, _data.height)) {\n      // Absolute set on the existing line \u2192 idempotent, safe to retry.\n      // Fresh-key resolve first: the render-time key may be stale (rotated).\n      ntCartGet('/cart.js')\n      .then(function (cart) {\n        return ntCartPost('/cart/change.js', { id: ntFreshLineKey(cart, oldVid, oldProps, lineKey), quantity: editQty }, true);\n      })\n      .then(function (result) {\n        if (result.status && result.status >= 400) throw new Error(result.description || 'Could not update size.');\n        window.location.reload();\n      })\n      .catch(function (err) {\n        ntSetError(err.message || 'Something went wrong. Please try again.');\n        ntSetConfirmState(false);\n      });\n      return;\n    }\n\n    // SIZE CHANGED \u2014 add/merge the NEW size FIRST, then remove the old line\n    // only after the new one is safely in the cart. (Previously the old\n    // line was removed first; if the re-add then failed \u2014 e.g. a Cloudflare\n    // HTML/throttle response \u2014 the size vanished from the cart entirely.)\n    // The new size has different dimensions than the old line, so it can\n    // never merge into the line we're about to remove. Worst case here is a\n    // brief duplicate, never a lost design. excludeKey skips the edited line\n    // so a match-merge never targets the line we then delete.\n    ntCartGet('/cart.js')\n    .then(function (cart) {\n      var existing = ntFindMatchingLine(cart, variantId, properties, lineKey);\n      if (existing) {\n        // Merge to new absolute total (idempotent \u2192 retryable)\n        return ntCartPost('/cart/change.js', { id: existing.key, quantity: existing.quantity + editQty }, true);\n      }\n      // New distinct line (add.js INCREMENTS \u2192 not retryable)\n      return ntCartPost('/cart/add.js', { items: [{ id: variantId, quantity: editQty, properties: properties }] });\n    })\n    .then(function (result) {\n      if (result.status && result.status >= 400) throw new Error(result.description || 'Could not update size.');\n      // New size is in \u2014 now retire the old line. FRESH-KEY RESOLVE first:\n      // the Bevy Share Cart app rewrites lines in the background, rotating\n      // keys, and removing by the render-time key silently missed \u2014 leaving\n      // a duplicate size (Owen 2026-07-22). Match the old line by identity\n      // (old dims \u2260 new dims, so the just-added line can never match).\n      // Removal stays an absolute set (idempotent \u2192 retryable); a failure\n      // here is harmless (a visible duplicate, recoverable), so it must not\n      // block the reload.\n      return ntCartGet('/cart.js')\n        .then(function (cart2) {\n          return ntCartPost('/cart/change.js', { id: ntFreshLineKey(cart2, oldVid, oldProps, lineKey), quantity: 0 }, true);\n        })\n        .catch(function () {});\n    })\n    .then(function () {\n      window.location.reload();\n    })\n    .catch(function (err) {\n      ntSetError(err.message || 'Something went wrong. Please try again.');\n      ntSetConfirmState(false);\n    });\n  });\n\n  /* \u2500\u2500\u2500 DELETE ALL SIZES \u2500\u2500\u2500 */\n  var _pendingDeleteGroupKey = null;\n\n  document.addEventListener('click', function (e) {\n    var btn = e.target.closest('.nt-delete-all-btn');\n    if (!btn) return;\n    _pendingDeleteGroupKey = btn.dataset.groupKey || null;\n    var modal = document.getElementById('nt-delete-all-modal');\n    if (modal) modal.style.display = 'flex';\n  });\n\n  document.addEventListener('click', function (e) {\n    if (e.target.id === 'nt-delete-all-cancel' || e.target.id === 'nt-delete-all-modal') {\n      var modal = document.getElementById('nt-delete-all-modal');\n      if (modal) modal.style.display = 'none';\n      _pendingDeleteGroupKey = null;\n    }\n  });\n\n  document.addEventListener('click', function (e) {\n    if (e.target.id !== 'nt-delete-all-confirm') return;\n    var modal = document.getElementById('nt-delete-all-modal');\n    if (!_pendingDeleteGroupKey) { if (modal) modal.style.display = 'none'; return; }\n\n    var group = document.querySelector('.nt-design-group[data-group-key=\"' + _pendingDeleteGroupKey + '\"]');\n    // Collect each block's IDENTITY (variant + properties) alongside its\n    // render-time key \u2014 keys rotate while the page sits open (Bevy Share\n    // Cart background rewrites), so they're re-resolved against a fresh\n    // cart below; a stale key here silently deleted NOTHING.\n    var idents = [];\n    if (group) {\n      group.querySelectorAll('.nt-size-block[data-line-key]').forEach(function (el) {\n        var ident = { key: el.dataset.lineKey, vid: parseInt(el.dataset.variantId, 10) || 0, props: null };\n        var pe = el.querySelector('.nt-props-json');\n        if (pe) {\n          try {\n            ident.props = {};\n            JSON.parse(pe.textContent).p.forEach(function (pr) { ident.props[pr.k] = pr.v; });\n          } catch (_) { ident.props = null; }\n        }\n        idents.push(ident);\n      });\n    }\n\n    if (modal) modal.style.display = 'none';\n    _pendingDeleteGroupKey = null;\n    if (!idents.length) return;\n\n    e.target.disabled = true;\n    ntCartGet('/cart.js')\n    .then(function (cart) {\n      var updates = {};\n      idents.forEach(function (d) {\n        updates[d.props && d.vid ? ntFreshLineKey(cart, d.vid, d.props, d.key) : d.key] = 0;\n      });\n      return fetch('/cart/update.js', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ updates: updates })\n      });\n    })\n    .then(function () { window.location.reload(); })\n    .catch(function () { window.location.reload(); });\n  });\n\n  /* \u2500\u2500\u2500 ADD SIZE OPEN \u2500\u2500\u2500 */\n  document.addEventListener('click', function (e) {\n    var btn = e.target.closest('.nt-add-size-btn');\n    if (!btn) return;\n    var firstKey = btn.dataset.firstKey;\n    if (!firstKey) return;\n    var block = document.querySelector('.nt-size-block[data-line-key=\"' + firstKey + '\"]');\n    if (!block) return;\n\n    var propsEl    = block.querySelector('.nt-props-json');\n    var variantsEl = block.querySelector('.nt-variants-json');\n    var popularEl  = block.querySelector('.nt-popular-json');\n    if (!propsEl || !variantsEl) return;\n\n    var props        = JSON.parse(propsEl.textContent);\n    var variants     = JSON.parse(variantsEl.textContent);\n    var popularSizes = popularEl ? JSON.parse(popularEl.textContent) : [];\n\n    _data = {\n      lineKey:       null,\n      qty:           null,\n      editQty:       1,\n      // Read existing item dims for aspect ratio sync \u2014 inputs are still cleared below\n      width:         parseFloat(block.dataset.width)  || 0,\n      height:        parseFloat(block.dataset.height) || 0,\n      productHandle: block.dataset.productHandle,\n      variantId:     parseInt(block.dataset.variantId),\n      props:         props.p,\n      variants:      variants,\n      popularSizes:  popularSizes,\n      discountInput: block.dataset.discountInput || '',\n      totalDtfQty:   parseInt(block.dataset.totalDtfQty) || 0,\n      tierRules:     block.dataset.tierRules === '1',\n      isUv:          block.dataset.isUv === 'true',\n      minDim:        parseFloat(block.dataset.minDim) || 0.25,\n      maxDim:        parseFloat(block.dataset.maxDim) || 22,\n      mode:          'add'\n    };\n    _data.tiers = parseDiscountTiers(_data.discountInput);\n\n    // Put modal into \"add\" mode\n    var modal = document.getElementById('nt-edit-modal');\n    var titleEl   = document.getElementById('nt-modal-title');\n    var confirmEl = document.getElementById('nt-edit-confirm');\n    if (titleEl)   titleEl.textContent   = 'Add Size';\n    if (confirmEl) confirmEl.textContent = 'Add to Cart';\n\n    // Pre-fill with the first child item's dims as a default starting point\n    document.getElementById('nt-edit-w').value  = _data.width  ? _data.width.toFixed(2)  : '';\n    document.getElementById('nt-edit-h').value  = _data.height ? _data.height.toFixed(2) : '';\n    ntLockInit(props.p, true); // a new size always starts locked (a stretched source snaps back)\n    document.getElementById('nt-qty-val').value = 1;\n    document.getElementById('nt-qty-minus').disabled = true;\n\n    // Populate popular sizes dropdown (same as edit open)\n    var sel = document.getElementById('nt-popular-select');\n    sel.innerHTML = '<option value=\"\">Select a popular size</option>';\n    popularSizes.forEach(function (ps) {\n      var opt = document.createElement('option');\n      opt.value                 = ps.w + ',' + ps.h;\n      opt.dataset.variantId     = ps.id;\n      opt.dataset.originalLabel = ps.label + (ps.desc ? ' \\u2013 ' + ps.desc : '');\n      opt.textContent           = opt.dataset.originalLabel;\n      sel.appendChild(opt);\n    });\n\n    // Hide smart sizing label\n    var smartLabel = document.getElementById('nt-smart-label');\n    if (smartLabel) smartLabel.style.display = 'none';\n\n    // Immediate DPI warning from stored property\n    _data.imgPx = null;\n    if (typeof ntSrReset === \"function\") ntSrReset(); // fresh line, fresh upscale opt-in\n    var _storedDpiWarning = false;\n    var propsArr = props.p || [];\n    for (var di = 0; di < propsArr.length; di++) {\n      if (propsArr[di].k === 'DPI Warning' && propsArr[di].v === 'Yes') {\n        _storedDpiWarning = true; break;\n      }\n    }\n    if (_storedDpiWarning) { ntShowDpiWarning(); } else { ntHideDpiWarning(); }\n\n    // Async: load image pixel dims for DPI warning + aspect ratio in add mode\n    (function () {\n      var uploadUrl = '';\n      for (var pi = 0; pi < propsArr.length; pi++) {\n        if (propsArr[pi].k.toLowerCase().indexOf('upload') !== -1 && propsArr[pi].v) {\n          uploadUrl = propsArr[pi].v; break;\n        }\n      }\n      if (!uploadUrl) return;\n      var rawUrl = uploadUrl.split('?')[0];\n      var ext = rawUrl.split('.').pop().toLowerCase();\n      if (ext !== 'png' && ext !== 'jpg' && ext !== 'jpeg') return;\n      var absUrl = (rawUrl.indexOf('//') === 0 ? 'https:' : '') + rawUrl;\n\n      function onDims(w, h) {\n        if (_data && w && h) {\n          _data.imgPx = { w: w, h: h };\n          ntUpdateDpiWarning();\n        }\n      }\n      function imgFallback() {\n        var img = new Image();\n        img.onload  = function () { onDims(img.naturalWidth, img.naturalHeight); };\n        img.onerror = function () {};\n        img.src = absUrl;\n      }\n      if (absUrl.indexOf('imgix.net') !== -1) {\n        fetch(absUrl + '?fm=json')\n          .then(function (r) { return r.ok ? r.json() : Promise.reject(); })\n          .then(function (d) {\n            if (d && d.PixelWidth && d.PixelHeight) { onDims(d.PixelWidth, d.PixelHeight); }\n            else { imgFallback(); }\n          })\n          .catch(function () { imgFallback(); });\n      } else {\n        imgFallback();\n      }\n    }());\n\n    ntSwitchTab('custom');\n    ntSetError('');\n    ntClearDimError();\n    ntSetConfirmState(false);\n    // Fetch live cart to get accurate totalDtfQty before first pricing\n    ntRefreshTotalDtfQty(function () { ntUpdatePricing(); });\n    modal.style.display = 'flex';\n    ntAdjustModalHeight();\n    if (!/Mobi|Android|iPhone|iPad/i.test(navigator.userAgent)) {\n      document.getElementById('nt-edit-w').focus();\n    }\n  });\n\n  /* \u2500\u2500\u2500 CLOSE \u2500\u2500\u2500 */\n  function ntResetModalMode() {\n    var titleEl   = document.getElementById('nt-modal-title');\n    var confirmEl = document.getElementById('nt-edit-confirm');\n    if (titleEl)   titleEl.textContent   = 'Edit Size';\n    if (confirmEl) confirmEl.textContent = 'Update';\n  }\n\n  document.addEventListener('click', function (e) {\n    var modal = document.getElementById('nt-edit-modal');\n    if (!modal) return;\n    if (e.target.id === 'nt-edit-cancel' || e.target.id === 'nt-edit-close' || e.target.id === 'nt-edit-modal') {\n      modal.style.display = 'none';\n      ntResetModalHeight();\n      ntResetModalMode();\n      _data = null;\n    }\n  });\n\n  document.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape') {\n      if (window.__ntUnlockConfirmOpen && window.__ntUnlockConfirmOpen()) return; // Esc closes only the confirm\n      var modal = document.getElementById('nt-edit-modal');\n      if (modal && modal.style.display !== 'none') { modal.style.display = 'none'; ntResetModalHeight(); ntResetModalMode(); _data = null; }\n    }\n  });\n\n  /* \u2500\u2500\u2500 DPI / CLARITY WARNING \u2500\u2500\u2500 */\n  var NT_MIN_DPI = 72;\n\n  function ntUpdateDpiWarning() {\n    if (!_data || !_data.imgPx) { ntHideDpiWarning(); return; }\n    // RASTER-ONLY (Owen 9-22): vectors are resolution-independent, so a DPI\n    // warning on them is wrong \u2014 but _data.imgPx measures the imgix PREVIEW\n    // render (a raster), so without this gate the warning could fire on\n    // ai/eps/pdf uploads. Mirror the v4 PDP contract exactly (sizing.js:\n    // `raster = png|jpg|jpeg`, everything else evaluates as Infinity DPI \u2014\n    // an ALLOWLIST, so svg/webp/etc. also never warn).\n    if (!ntDpiRasterUpload()) { ntHideDpiWarning(); return; }\n    var w = parseFloat(document.getElementById('nt-edit-w').value) || 0;\n    var h = parseFloat(document.getElementById('nt-edit-h').value) || 0;\n    if (!w || !h) { ntHideDpiWarning(); return; }\n\n    // Condition 1 (matches PDP): image is too small in absolute terms \u2014\n    // (W\u00D7H)/minDPI < 288 means the image has too few pixels to ever print cleanly.\n    // Warn regardless of selected size; only fix is a better upload.\n    if ((_data.imgPx.w * _data.imgPx.h) / NT_MIN_DPI < 288) {\n      ntShowDpiWarning(); return;\n    }\n\n    // Condition 2: selected print area exceeds what the image can cover at min DPI\n    var maxSqIn      = (_data.imgPx.w / NT_MIN_DPI) * (_data.imgPx.h / NT_MIN_DPI);\n    var selectedSqIn = w * h;\n    if (selectedSqIn > maxSqIn) { ntShowDpiWarning(); } else { ntHideDpiWarning(); }\n  }\n\n  function ntSetInputBorders(color) {\n    var isWarning = color !== '#ddd';\n    var width = isWarning ? '2.5px' : '1.5px';\n    var wEl  = document.getElementById('nt-edit-w');\n    var hEl  = document.getElementById('nt-edit-h');\n    var selEl = document.getElementById('nt-popular-select');\n    if (wEl  && wEl.parentElement)  { wEl.parentElement.style.borderColor  = color; wEl.parentElement.style.borderWidth  = width; }\n    if (hEl  && hEl.parentElement)  { hEl.parentElement.style.borderColor  = color; hEl.parentElement.style.borderWidth  = width; }\n    if (selEl) { selEl.style.borderColor = color; selEl.style.borderWidth = width; }\n  }\n\n  function ntShowDpiWarning() {\n    var el = document.getElementById('nt-dpi-warning');\n    if (el) el.style.display = 'block';\n    ntSetInputBorders('#fea333');\n    ntSrOfferSync(true);\n  }\n\n  function ntHideDpiWarning() {\n    var el = document.getElementById('nt-dpi-warning');\n    if (el) el.style.display = 'none';\n    ntSetInputBorders('#ddd');\n    ntSrOfferSync(false);\n  }\n\n  /* \u2500\u2500\u2500 AI-UPSCALE OFFER (Owen 9-22) \u2500\u2500\u2500\n     When the clarity warning fires, eligible lines get a free AI-upscale\n     opt-in. Applying it = the SAME Super Resolution contract every by-size\n     PDP line already ships with: `upscale=true` appended to the artwork\n     URLs (imgix renders its AI super-resolution; production prints that\n     render) + the `Super Resolution: Yes` property. Cart modal only.\n\n     Eligible = raster upload (imgix upscale is meaningless on ai/eps/pdf/psd\n     sources \u2014 the PDP gates the same way), not a Ready-to-Press design (the\n     v4 flow blocks SR on those), and not already upscaled. */\n  function ntSrProp(name) {\n    if (!_data || !_data.props) return '';\n    for (var i = 0; i < _data.props.length; i++) {\n      var k = String(_data.props[i].k || '');\n      if (k === name || k === '_' + name) return String(_data.props[i].v || '');\n    }\n    return '';\n  }\n  /* Raster allowlist shared by the DPI warning and the upscale offer \u2014 the v4\n     PDP contract (sizing.js): only png/jpg/jpeg ever evaluate DPI; vectors and\n     everything else are resolution-independent as far as the warning goes. */\n  function ntDpiRasterUpload() {\n    var u = ntSrProp('Upload (Vector Files Preferred)') || ntSrProp('Original Image');\n    if (!u) return true; // no upload prop to judge \u2014 keep legacy behavior\n    var base = u.split('?')[0].toLowerCase();\n    return /\\.(png|jpe?g)$/.test(base);\n  }\n  function ntSrEligible() {\n    if (!_data || !_data.props) return false;\n    if (/^yes$/i.test(ntSrProp('Super Resolution'))) return false;      // already upscaled\n    if (/^yes$/i.test(ntSrProp('Ready to Press'))) return false;        // RTP contract: no SR\n    var u = ntSrProp('Upload (Vector Files Preferred)') || ntSrProp('Original Image');\n    if (!u) return false;\n    if (NT_PRINT_READY_HOST.test(u)) return false;                      // print-ready file: not on imgix, already final\n    return ntDpiRasterUpload();                                         // same allowlist as the warning\n  }\n\n  /* ---------- Print-ready reorders (production-art-sync, Justin 2026-10-12) ----------\n     A reorder of the print-ready file our art team made carries _reorder\n     \"THIS IS AN EXACT REORDER OF NT-\u2026 (CRM#\u2026) LINE ITEM ID#\u2026. DO NOT ALTER OR TOUCH THIS FILE\"\n     The file is not on imgix and already final, so upscale cannot apply to it. A new\n     size is still a reorder; it becomes \"SIMILAR REORDER OF \u2026 . NEW SIZE FOR THIS ORDER.\"\n     only when it is LARGER than the file's printed size (`_Print Ready Size`, e.g.\n     \"10 x 9.83\"), and EXACT again when sized back down (Justin 2026-10-13). Lines without\n     _Print Ready Size (added before 2026-10-13) turn SIMILAR on any new size. (Lines\n     added before 2026-10-12 ~20:00 UTC carry \"EXACT REORDER OF \u2026 THIS FILE.\") */\n  var NT_PRINT_READY_HOST = /\\/\\/(?:ninjatransfers-production-art|eztees-order-designs-printareas)\\.s3[.\\w-]*\\.amazonaws\\.com\\//i;\n  var NT_PRINT_READY_NOTE = /^(?:(?:THIS IS AN )?EXACT|SIMILAR) REORDER OF (.+?)\\. (?:DO NOT ALTER OR TOUCH THIS FILE|NEW SIZE FOR THIS ORDER|SIZE HAS CHANGED)\\.?$/;\n  function ntPrintReadyReorderNote(properties, w, h) {\n    var key = properties.hasOwnProperty('_reorder') ? '_reorder' : (properties.hasOwnProperty('reorder') ? 'reorder' : '');\n    var m = key && NT_PRINT_READY_NOTE.exec(String(properties[key]));\n    if (!m) return;\n    if (ntSameDim(w, _data.width) && ntSameDim(h, _data.height)) return;\n    var ps = /^\\s*([\\d.]+)\\s*x\\s*([\\d.]+)\\s*$/i.exec(String(properties['_Print Ready Size'] || ''));\n    var bigger = ps ? ((+w || 0) > +ps[1] + 0.005 || (+h || 0) > +ps[2] + 0.005) : true;\n    properties[key] = bigger\n      ? 'SIMILAR REORDER OF ' + m[1] + '. NEW SIZE FOR THIS ORDER.'\n      : 'THIS IS AN EXACT REORDER OF ' + m[1] + '. DO NOT ALTER OR TOUCH THIS FILE';\n  }\n  function ntSrOfferSync(warningVisible) {\n    var row = document.getElementById('nt-dpi-upscale-offer');\n    if (!row) return;\n    var show = warningVisible && ntSrEligible();\n    row.style.display = show ? 'flex' : 'none';\n    if (!show) ntSrReset();\n    ntSrAppliedBadge();\n  }\n  function ntSrReset() {\n    var cb = document.getElementById('nt-dpi-upscale-optin');\n    if (cb) cb.checked = false;\n    ntSrAppliedBadge();\n  }\n  function ntSrOptedIn() {\n    var row = document.getElementById('nt-dpi-upscale-offer');\n    var cb = document.getElementById('nt-dpi-upscale-optin');\n    return !!(row && row.style.display !== 'none' && cb && cb.checked && ntSrEligible());\n  }\n  function ntSrAppliedBadge() {\n    var badge = document.getElementById('nt-dpi-upscale-applied');\n    var cb = document.getElementById('nt-dpi-upscale-optin');\n    if (badge) badge.style.display = (cb && cb.checked) ? 'inline' : 'none';\n  }\n  document.addEventListener('change', function (e) {\n    if (e.target && e.target.id === 'nt-dpi-upscale-optin') ntSrAppliedBadge();\n  });\n  /* imgix landmine: upscale=true combined with rect= renders a fully\n     transparent PNG \u2014 never append when rect is present. */\n  function ntSrAppendUpscale(url) {\n    if (typeof url !== 'string' || url.indexOf('http') !== 0) return url;\n    if (/[?&]upscale=true/i.test(url)) return url;\n    if (/[?&]rect=/i.test(url)) return url;\n    return url + (url.indexOf('?') > -1 ? '&' : '?') + 'upscale=true';\n  }\n  function ntSrApplyToProperties(properties) {\n    properties['Super Resolution'] = 'Yes';\n    var URL_KEYS = ['Upload (Vector Files Preferred)', '_Upload (Vector Files Preferred)', '_cartImg'];\n    for (var i = 0; i < URL_KEYS.length; i++) {\n      var k = URL_KEYS[i];\n      if (properties[k]) properties[k] = ntSrAppendUpscale(properties[k]);\n    }\n    return properties;\n  }\n\n  /* Unlock-proportion lines (tag-gated stretch, Owen 2026-09-24) carry a hidden\n     _Stretched \"W x H\" prop and a print file baked to exact px\n     (fit=scale&w=&h=, snippets/bsv4-sizing.liquid). The shape already stays\n     locked here (ntGetAspectRatio reads the line's own W/H); this keeps the\n     print file's RESOLUTION with the new size by rescaling its w/h by the size\n     change. Lines without _Stretched (every normal line) never reach this. */\n  /* \u2500\u2500\u2500 PROPORTION LOCK (Justin 2026-09-30) \u2500\u2500\u2500 */\n  // Same lock as the v4 PDP rows (snippets/bsv4-sizing.liquid): grey = locked to the artwork's\n  // shape, blue = each axis free. Unlocking asks first (window.__ntUnlockConfirm,\n  // snippets/nt-unlock-ui.liquid); re-locking snaps the height back to the art. Only where the\n  // print file itself can be stretched: a raster imgix upload (vectors ship the raw S3 file),\n  // not ready-to-press, not a fixed-shape sticker (the cut sets the ratio; die cut is the art's).\n  var NT_STR_DPI = 300, NT_STR_MAXPX = 8192;\n  function ntPropsObj(arr) {\n    var o = {};\n    for (var i = 0; i < (arr || []).length; i++) o[arr[i].k] = arr[i].v;\n    return o;\n  }\n  function ntDecodeAmp(v) {\n    v = String(v == null ? '' : v);\n    while (v.indexOf('&amp;') !== -1) v = v.replace(/&amp;/g, '&');\n    return v;\n  }\n  function ntUploadKey(obj) {\n    for (var k in obj) if (/^_?upload/i.test(k) && typeof obj[k] === 'string' && obj[k]) return k;\n    return null;\n  }\n  function ntCanUnlock(obj) {\n    var k = ntUploadKey(obj);\n    if (!k || !/^(https?:)?\\/\\/[^\\/]*imgix\\.net\\//i.test(ntDecodeAmp(obj[k]))) return false;\n    if (String(obj['_Ready to Press'] || obj['Ready to Press'] || '').toLowerCase() === 'yes') return false;\n    // Never on the sticker family (Justin 2026-10-01): its lines carry the sticker options.\n    if (obj['Shape'] || obj['_Shape'] || obj['Backing Type'] || obj['Select Backing']) return false;\n    return true;\n  }\n  // Drop the stretch params the PDP adds (fit=scale&w=&h=); keepH keeps the _cartImg's h=150.\n  function ntStripDims(url, keepH) {\n    var q = url.indexOf('?');\n    if (q < 0) return url;\n    var kept = url.slice(q + 1).split('&').filter(function (kv) {\n      return kv && !/^fit=scale$/i.test(kv) && !/^w=\\d+$/i.test(kv) && (keepH || !/^h=\\d+$/i.test(kv));\n    });\n    return url.slice(0, q) + (kept.length ? '?' + kept.join('&') : '');\n  }\n  // bsv4-sizing.liquid setDims, verbatim: exact px, fit=scale.\n  function ntSetDims(url, w, h) {\n    var q = url.indexOf('?'), base = q < 0 ? url : url.slice(0, q);\n    var kept = (q < 0 ? '' : url.slice(q + 1)).split('&').filter(function (kv) {\n      return kv && !/^(?:w|h|fit|max-w|max-h)=/i.test(kv);\n    });\n    kept.push('fit=scale', 'w=' + w, 'h=' + h);\n    return base + '?' + kept.join('&');\n  }\n  function ntPaintLock() {\n    var b = document.getElementById('nt-em-lock');\n    if (!b || !_data) return;\n    b.setAttribute('aria-pressed', _data.unlocked ? 'true' : 'false');\n    b.setAttribute('aria-label', _data.unlocked ? 'Lock proportions' : 'Unlock proportions');\n  }\n  function ntLockInit(propsArr, isAdd) {\n    var obj = ntPropsObj(propsArr);\n    var btn = document.getElementById('nt-em-lock');\n    _data.canUnlock = !!btn && ntCanUnlock(obj);\n    _data.stretched = !!obj['_Stretched'];\n    _data.unlocked  = _data.canUnlock && _data.stretched && !isAdd;\n    _data.artAr = (!_data.stretched && _data.width > 0 && _data.height > 0) ? _data.width / _data.height : 0;\n    _data.frac = null;\n    if (btn) btn.hidden = !_data.canUnlock;\n    ntPaintLock();\n    if (!_data.canUnlock) return;\n    if (_data.stretched) ntMeasureArt(obj, _data);\n    else if (/[?&]bg-remove=true/i.test(ntDecodeAmp(obj[ntUploadKey(obj)]))) ntMeasureFrac(obj, _data);\n  }\n  // A stretched line's own art shape: its cart thumb with the stretch taken off is the exact URL\n  // the cart showed before the stretch (CDN-cached, no new render).\n  function ntMeasureArt(obj, token) {\n    var src = obj['_cartImg'] ? ntStripDims(ntDecodeAmp(obj['_cartImg']), true) : '';\n    if (!src) return;\n    var im = new Image();\n    im.onload = function () {\n      if (_data !== token || !(im.naturalWidth > 0) || !(im.naturalHeight > 0)) return;\n      _data.artAr = im.naturalWidth / im.naturalHeight;\n      if (_data.unlocked) return;\n      // locked (a new size, or re-locked before this landed): the height follows the width\n      var wIn = document.getElementById('nt-edit-w'), hIn = document.getElementById('nt-edit-h');\n      var w = parseFloat(wIn && wIn.value);\n      if (w > 0 && hIn) { hIn.value = (w / _data.artAr).toFixed(2); ntUpdatePricing(); }\n    };\n    im.src = src;\n  }\n  // Bg-removed art can keep transparent margins around the subject; a fresh stretch scales the\n  // canvas by the measured canvas/subject fraction so the SUBJECT lands on W x H (the PDP's\n  // measureFrac, run on the cart thumb \u2014 same render recipe, already cached).\n  function ntMeasureFrac(obj, token) {\n    var src = obj['_cartImg'] ? ntDecodeAmp(obj['_cartImg']) : '';\n    if (!src) return;\n    var im = new Image();\n    im.crossOrigin = 'anonymous';\n    im.onload = function () {\n      try {\n        var cw = im.naturalWidth, ch = im.naturalHeight;\n        var cv = document.createElement('canvas'); cv.width = cw; cv.height = ch;\n        var cx = cv.getContext('2d'); cx.drawImage(im, 0, 0, cw, ch);\n        var d = cx.getImageData(0, 0, cw, ch).data, x0 = cw, y0 = ch, x1 = -1, y1 = -1;\n        for (var y = 0; y < ch; y++) for (var x = 0; x < cw; x++) {\n          if (d[(y * cw + x) * 4 + 3] > 16) { if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y; }\n        }\n        if (_data === token && x1 >= x0 && y1 >= y0) _data.frac = { fx: cw / (x1 - x0 + 1), fy: ch / (y1 - y0 + 1) };\n      } catch (e) { /* tainted/failed: stretch as if there were no margins */ }\n    };\n    im.src = src;\n  }\n  function ntStretchFresh(properties, w, h) {\n    var k = ntUploadKey(properties);\n    if (!k) return;\n    var fr = (_data && _data.frac) || { fx: 1, fy: 1 };\n    var pw = w * NT_STR_DPI * fr.fx, ph = h * NT_STR_DPI * fr.fy;\n    var sc = Math.min(1, NT_STR_MAXPX / pw, NT_STR_MAXPX / ph);\n    pw = Math.max(1, Math.round(pw * sc)); ph = Math.max(1, Math.round(ph * sc));\n    properties[k] = ntSetDims(properties[k], pw, ph);\n    if (typeof properties['_cartImg'] === 'string') properties['_cartImg'] = ntSetDims(properties['_cartImg'], Math.max(1, Math.round(150 * pw / ph)), 150);\n    properties['_Stretched'] = w + ' x ' + h;\n  }\n  function ntUnstretch(properties) {\n    for (var k in properties) {\n      if (typeof properties[k] !== 'string' || !/[?&]fit=scale(&|$)/.test(properties[k])) continue;\n      if (/^_?upload/i.test(k)) properties[k] = ntStripDims(properties[k], false);\n      else if (k === '_cartImg') properties[k] = ntStripDims(properties[k], true);\n    }\n    delete properties['_Stretched'];\n  }\n  document.addEventListener('click', function (e) {\n    if (!e.target.closest || !e.target.closest('#nt-em-lock') || !_data || !_data.canUnlock) return;\n    if (_data.unlocked) {\n      // re-lock: back to the artwork's own shape, the height follows the width (no warning)\n      _data.unlocked = false;\n      ntPaintLock();\n      var ar = ntGetAspectRatio();\n      var wIn = document.getElementById('nt-edit-w'), hIn = document.getElementById('nt-edit-h');\n      var w = parseFloat(wIn.value);\n      if (ar > 0 && w > 0) hIn.value = (w / ar).toFixed(2);\n      ntUpdatePricing();\n      return;\n    }\n    var token = _data;\n    var go = function () { if (_data === token) { _data.unlocked = true; ntPaintLock(); } };\n    if (window.__ntUnlockConfirm) window.__ntUnlockConfirm(go);\n    else go();\n  });\n\n  function ntStretchRescale(properties, w, h) {\n    var m = /^\\s*([\\d.]+)\\s*x\\s*([\\d.]+)/i.exec(String(properties['_Stretched']));\n    if (!m || !(+m[1] > 0) || !(+m[2] > 0)) return;\n    var fw = w / +m[1], fh = h / +m[2];\n    for (var k in properties) {\n      if (!/^_?Upload/i.test(k) || typeof properties[k] !== 'string') continue;\n      var u = properties[k], q = u.indexOf('?');\n      if (q < 0 || !/[?&]fit=scale(&|$)/.test(u)) continue;\n      var parts = u.slice(q + 1).split('&'), pw = 0, ph = 0;\n      for (var i = 0; i < parts.length; i++) {\n        if (/^w=\\d+$/.test(parts[i])) pw = +parts[i].slice(2);\n        if (/^h=\\d+$/.test(parts[i])) ph = +parts[i].slice(2);\n      }\n      if (!pw || !ph) continue;\n      var nw = pw * fw, nh = ph * fh, s = Math.min(1, 8192 / nw, 8192 / nh);\n      nw = Math.max(1, Math.round(nw * s)); nh = Math.max(1, Math.round(nh * s));\n      properties[k] = u.slice(0, q + 1) + parts.map(function (kv) {\n        return /^w=\\d+$/.test(kv) ? 'w=' + nw : /^h=\\d+$/.test(kv) ? 'h=' + nh : kv;\n      }).join('&');\n    }\n    properties['_Stretched'] = w + ' x ' + h;\n  }\n\n  /* \u2500\u2500\u2500 DIMENSION LIMIT MESSAGES \u2500\u2500\u2500 */\n  // Returns true if either dim is out of range (message shown), false if OK (message cleared).\n  function ntCheckDimLimits() {\n    if (!_data) return false;\n    var w      = parseFloat(document.getElementById('nt-edit-w').value) || 0;\n    var h      = parseFloat(document.getElementById('nt-edit-h').value) || 0;\n    var minDim = _data.minDim || 0.25;\n    var maxDim = _data.maxDim || 22;\n\n    if (_data.noLimits) {\n      // No-limits line: the shorter side / area rule replaces the per-axis max (ntNoLimitsErr).\n      var nlDimErr = w && h ? ntNoLimitsErr(w, h) : null;\n      if (nlDimErr) { ntSetDimError(nlDimErr); return true; }\n    } else if ((w && w > maxDim) || (h && h > maxDim)) {\n      ntSetDimError('Maximum size for this product is ' + maxDim + '\"');\n      return true;\n    }\n    if ((w && w < minDim) || (h && h < minDim)) {\n      ntSetDimError('Minimum size for this product is ' + minDim + '\"');\n      return true;\n    }\n    ntClearDimError();\n    return false;\n  }\n\n  function ntSetDimError(msg) {\n    var el = document.getElementById('nt-dim-error');\n    if (!el) return;\n    el.textContent   = msg;\n    el.style.display = msg ? 'block' : 'none';\n  }\n\n  function ntClearDimError() { ntSetDimError(''); }\n\n  /* \u2500\u2500\u2500 INFO TOOLTIP (fixed position \u2014 escapes modal overflow:hidden) \u2500\u2500\u2500 */\n  var _tipEl = null;\n  var _tipText = 'We automatically scale your design to the largest dimension of the popular size you choose, ensuring you only pay for the space you need. For example, a 4\"\\xd78\" upload becomes 1\"\\xd72\" when you select a 2\"\\xd72\" size.';\n\n  function ntShowTip(iconEl) {\n    if (!_tipEl) {\n      _tipEl = document.createElement('div');\n      _tipEl.style.cssText = 'position:fixed; background:#111; color:#fff; font-size:12px; line-height:1.5; border-radius:8px; padding:10px 12px; max-width:240px; z-index:99999; pointer-events:none; white-space:normal; box-shadow:0 4px 16px rgba(0,0,0,0.3);';\n      _tipEl.textContent = _tipText;\n      document.body.appendChild(_tipEl);\n    }\n    _tipEl.style.display = 'block';\n    var rect = iconEl.getBoundingClientRect();\n    var tw = 240;\n    var th = _tipEl.offsetHeight || 110;\n    var top = rect.top - th - 8;\n    var left = rect.left;\n    if (left + tw > window.innerWidth - 12) left = window.innerWidth - tw - 12;\n    if (left < 12) left = 12;\n    if (top < 12) top = rect.bottom + 8; // flip below if not enough space above\n    _tipEl.style.top  = top  + 'px';\n    _tipEl.style.left = left + 'px';\n  }\n\n  function ntHideTip() { if (_tipEl) _tipEl.style.display = 'none'; }\n\n  document.addEventListener('mouseover',  function(e) { var ic = e.target.closest('.nt-info-icon'); if (ic) ntShowTip(ic); });\n  document.addEventListener('mouseout',   function(e) { if (e.target.closest('.nt-info-icon')) ntHideTip(); });\n  document.addEventListener('focusin',    function(e) { var ic = e.target.closest('.nt-info-icon'); if (ic) ntShowTip(ic); });\n  document.addEventListener('focusout',   function(e) { if (e.target.closest('.nt-info-icon')) ntHideTip(); });\n  document.addEventListener('focus', function(e) {\n    var id = e.target.id;\n    if (id !== 'nt-edit-w' && id !== 'nt-edit-h' && id !== 'nt-qty-val') return;\n    var el = e.target;\n    setTimeout(function() {\n      var len = el.value.length;\n      el.setSelectionRange(len, len);\n    }, 0);\n  }, true);\n\n  function ntAdjustModalHeight() {\n    var modal = document.getElementById('nt-edit-modal');\n    var box = document.getElementById('nt-modal-box');\n    if (!modal || !box) return;\n    var vv = window.visualViewport;\n    var vh = vv ? vv.height : window.innerHeight;\n    var offsetTop = vv ? vv.offsetTop : 0;\n    var maxH = vh - 32;\n    box.style.maxHeight = maxH + 'px';\n    var actualH = box.offsetHeight;\n    var topPad = Math.max(16, (vh - actualH) / 2) + offsetTop;\n    modal.style.paddingTop = topPad + 'px';\n  }\n  function ntResetModalHeight() {\n    var modal = document.getElementById('nt-edit-modal');\n    var box = document.getElementById('nt-modal-box');\n    if (box) box.style.maxHeight = '';\n    if (modal) modal.style.paddingTop = '';\n  }\n  if (window.visualViewport) {\n    window.visualViewport.addEventListener('resize', function() {\n      var modal = document.getElementById('nt-edit-modal');\n      if (modal && modal.style.display !== 'none') ntAdjustModalHeight();\n    });\n  }\n\n  /* \u2500\u2500\u2500 HELPERS \u2500\u2500\u2500 */\n  function ntSetError(msg) {\n    var el = document.getElementById('nt-edit-error');\n    if (!el) return;\n    el.textContent   = msg;\n    el.style.display = msg ? 'block' : 'none';\n  }\n\n  function ntSetConfirmState(loading) {\n    var btn = document.getElementById('nt-edit-confirm');\n    var box = document.getElementById('nt-modal-box');\n    if (!btn) return;\n    btn.disabled    = loading;\n    var isAdd = _data && _data.mode === 'add';\n    btn.textContent = loading ? (isAdd ? 'Adding' : 'Updating') : (isAdd ? 'Add to Cart' : 'Update');\n    btn.classList.toggle('nt-updating', loading);\n    if (box) box.classList.toggle('nt-modal-updating', loading);\n  }\n\n})();\n"],
  "mappings": "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",
  "names": ["e"]
}
