{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/patch-express.js?auto=format%2Ccompress"],
  "sourcesContent": ["/* Patch Express \u2014 step 2 behaviour (Justin 2026-09-04/05). Markup + settings live in\n   sections/patch-express.liquid. Three intake modes feed ONE handoff: the artwork is\n   hosted (uploads: the builders' presign flow with the `____image_<ts>_<n>` lineage\n   token), then the Mockup Lab opens with `file=<imgix url>` \u2014 its C99 arrival attaches\n   the design and starts at Step 1 (patch type). Previous designs read the My Designs\n   feed with the panel's archive key and purchase matching; AI concepts run the image\n   proxy's gram-edit route on a blank canvas (4 in parallel). */\n(function () {\n  'use strict';\n  var root = document.querySelector('[data-px]');\n  if (!root) return;\n  var html = document.documentElement;\n  function $(s, el) { return (el || root).querySelector(s); }\n  function $$(s, el) { return Array.prototype.slice.call((el || root).querySelectorAll(s)); }\n  function attr(n, d) { var v = root.getAttribute(n); return (v === null || v === '') ? d : v; }\n  function esc(s) { return String(s == null ? '' : s).replace(/[&<>\"']/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }); }\n\n  var UPLOAD_API = attr('data-px-upload-api', 'https://hpz51rjda5.execute-api.us-east-1.amazonaws.com/production').replace(/\\/+$/, '');\n  var AI_API = attr('data-px-ai-api', 'https://ruhg140mmf.execute-api.us-east-1.amazonaws.com/');\n  var HUB = attr('data-px-hub', '/pages/ninja-patches-mockup-generators');\n  /* ninjatransfers.com host (2026-09-10): the patch builders live on ninjapatches.com, so Approve opens\n     `<store>/products/...`; and the two same-origin config reads (the lab's #np-ml-config, each type's\n     #np-e2-config) come from theme-asset snapshots instead \u2014 a storefront can't fetch another store's HTML. */\n  var STORE = attr('data-px-store', '').replace(/\\/+$/, '');\n  var LAB_CFG_URL = attr('data-px-lab-config', '');\n  var BUILDERS_URL = attr('data-px-builders', '');\n  var CUSTOMER = attr('data-px-customer', '');\n  var LOGIN = attr('data-px-login', '/account/login');\n  var BLANK = attr('data-px-blank', '');\n  if (BLANK.indexOf('//') === 0) BLANK = 'https:' + BLANK;\n  var IMGIX_HOST = 'ninjauploads-production.imgix.net';\n  var S3_HOST = 'ninja-services-production-ninjauploadss3bucket-zks2mguobhe4.s3.amazonaws.com';\n  var S3_RE = /https:\\/\\/[^/]*ninjauploads[^/]*\\.s3\\.amazonaws\\.com/i;\n  function toImgix(u) { return String(u || '').replace(S3_RE, 'https://' + IMGIX_HOST).split(S3_HOST).join(IMGIX_HOST); }\n  var REMOTE_EXT = /\\.(ai|eps|pdf|svg|tif|tiff|psd)$/i;\n  function isRemotePreview(u) { return REMOTE_EXT.test(String(u || '').split('?')[0]); }\n  var statusEl = $('[data-px-status]');\n  function say(m) { if (statusEl) statusEl.textContent = m; }\n  function stacked() { try { return window.matchMedia('(max-width: 63.98rem)').matches; } catch (e) { return false; } }\n\n  /* ---------- theme ---------- */\n  var toggle = $('[data-px-theme-toggle]'), tLabel = $('[data-px-theme-label]');\n  function theme() { return html.getAttribute('data-px-theme') === 'dark' ? 'dark' : 'light'; }\n  function applyTheme(t, persist) {\n    html.setAttribute('data-px-theme', t);\n    if (toggle) toggle.setAttribute('aria-checked', t === 'dark' ? 'true' : 'false');\n    if (tLabel) tLabel.textContent = t === 'dark' ? 'Dark Mode' : 'Light Mode';\n    if (persist) { try { localStorage.setItem('np_px_theme2', t); } catch (e) {} }\n  }\n  /* Members Portal (pages/welcome): the portal injects this section inline via AJAX (its iframe stays blank), so\n     \"embedded\" = the portal's body class / panel container (or a real iframe). Portal = forced light, no toggle. */\n  var EMBEDDED = html.getAttribute('data-px-embedded') === '1' || /template-page-members-portal/.test(document.body.className) || !!(root.closest && root.closest('.mp-panel, .mp-content, [data-panel]'));\n  var FORCED_THEME = EMBEDDED ? 'light' : '';\n  if (EMBEDDED) { root.setAttribute('data-px-force', 'light'); document.body.classList.add('np-px-forced'); html.setAttribute('data-px-theme', 'light'); }\n  applyTheme(FORCED_THEME || theme(), false);\n  if (toggle && !FORCED_THEME) toggle.addEventListener('click', function () { applyTheme(theme() === 'dark' ? 'light' : 'dark', true); });\n  try {\n    var mq = window.matchMedia('(prefers-color-scheme: dark)');\n    var onOs = function (e) { return; /* light by default (Justin 2026-09-08, was dark 2026-09-05); the OS scheme never drives the theme */ var s = null; try { s = localStorage.getItem('np_px_theme2'); } catch (e2) {} if (s !== 'dark' && s !== 'light') applyTheme(e.matches ? 'dark' : 'light', false); };\n    if (mq.addEventListener) mq.addEventListener('change', onOs); else if (mq.addListener) mq.addListener(onOs);\n  } catch (e3) {}\n\n  /* ---------- state + modes ---------- */\n  var st = {\n    mode: 'upload', seq: 0, style: 'embroidered', localUrl: null, lastFile: null,\n    designs: { loaded: false, loading: false, items: [], filter: 'all', selected: null },\n    ai: { concepts: [null, null, null, null], busy: 0 }\n  };\n  var MODES = ['upload', 'designs', 'ai'];\n  var stageEl = $('[data-px-stage]');\n  function showStage() {\n    if (!stageEl || !stacked()) return;\n    var r = stageEl.getBoundingClientRect();\n    if (r.top < 0 || r.top > window.innerHeight * 0.6) stageEl.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  }\n  /* the My Designs picker is a page-level modal (Justin 2026-09-05: \"keep this in a modal like we do on\n     product pages\"); the stage keeps showing the upload view underneath */\n  var overlayEl = $('[data-px-overlay]');\n  function syncOverlay() { var open = !!(overlayEl && !overlayEl.hidden); document.documentElement.classList.toggle('np-px-lock', open); }\n  if (overlayEl) {\n    overlayEl.addEventListener('click', function (e) { if (e.target === overlayEl || (e.target.closest && e.target.closest('[data-px-modal-close]'))) setMode('upload', false); });\n    document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !overlayEl.hidden) setMode('upload', false); });\n  }\n  function setMode(m, focus) {\n    if (MODES.indexOf(m) < 0) m = 'upload';\n    st.mode = m;\n    root.setAttribute('data-px-phase', 'choose');\n    var cp = $('[data-px-cfg]'); if (cp) cp.hidden = true;\n    root.setAttribute('data-px-mode', m);\n    $$('[data-px-opt]').forEach(function (o) {\n      var on = o.getAttribute('data-px-opt') === m;\n      o.classList.toggle('is-active', on);\n      if (o.hasAttribute('aria-pressed')) o.setAttribute('aria-pressed', on ? 'true' : 'false');\n    });\n    var stageView = m === 'designs' ? 'upload' : m;\n    $$('[data-px-view]').forEach(function (v) { var k = v.getAttribute('data-px-view'); v.hidden = !(k === stageView || (m === 'designs' && k === 'designs')); });\n    syncOverlay();\n    if (m === 'designs') loadDesigns();\n    if (m === 'ai') showStage();\n    if (focus) {\n      var f = m === 'ai' ? $('[data-px-prompt]') : (m === 'designs' ? $('[data-px-dtab=\"all\"]') : $('[data-px-browse]'));\n      if (f) { try { f.focus({ preventScroll: m === 'upload' }); } catch (e) { f.focus(); } }\n    }\n  }\n  $$('[data-px-mode-btn]').forEach(function (b) { b.addEventListener('click', function () { setMode(b.getAttribute('data-px-mode-btn'), true); }); });\n  var uploadLabel = $('[data-px-upload-label]');\n  if (uploadLabel) uploadLabel.addEventListener('click', function () { if (st.mode !== 'upload') setMode('upload', false); });\n\n  /* ---------- patch preview (round) ---------- */\n  var clipP = $('[data-px-clip]'), faceP = $('[data-px-face]'), edgeP = $('[data-px-edge]'), imgEl = $('[data-px-img]');\n  /* the drop area is a rounded square (Justin 2026-09-05); a faint inner outline sits 7% in */\n  function rrect(x, y, w, h, r) {\n    return 'M' + (x + r) + ' ' + y + 'H' + (x + w - r) + 'A' + r + ' ' + r + ' 0 0 1 ' + (x + w) + ' ' + (y + r) + 'V' + (y + h - r) + 'A' + r + ' ' + r + ' 0 0 1 ' + (x + w - r) + ' ' + (y + h) +\n      'H' + (x + r) + 'A' + r + ' ' + r + ' 0 0 1 ' + x + ' ' + (y + h - r) + 'V' + (y + r) + 'A' + r + ' ' + r + ' 0 0 1 ' + (x + r) + ' ' + y + 'Z';\n  }\n  var SQUARE = rrect(10, 10, 380, 380, 30), INNER = rrect(30, 30, 340, 340, 20);\n  var WIDE = rrect(10, 10, 380, 250, 30), WIDE_INNER = rrect(30, 30, 340, 210, 20); /* mobile: a shorter 40:27 drop zone (Justin 2026-09-05) */\n  var innerP = $('[data-px-inner]'), frameSvg = $('.np-px__svg');\n  function drawFrame() {\n    var m = stacked();\n    if (frameSvg) frameSvg.setAttribute('viewBox', m ? '0 0 400 270' : '0 0 400 400');\n    [clipP, faceP, edgeP].forEach(function (p) { if (p) p.setAttribute('d', m ? WIDE : SQUARE); });\n    if (innerP) innerP.setAttribute('d', m ? WIDE_INNER : INNER);\n    if (imgEl) { imgEl.setAttribute('x', '40'); imgEl.setAttribute('y', '40'); imgEl.setAttribute('width', '320'); imgEl.setAttribute('height', m ? '190' : '320'); }\n  }\n  drawFrame(); window.addEventListener('resize', drawFrame);\n  function land(url) {\n    if (!imgEl) return;\n    imgEl.setAttribute('href', url);\n    try { imgEl.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', url); } catch (e) {}\n    root.classList.remove('is-landed');\n    requestAnimationFrame(function () { requestAnimationFrame(function () { root.classList.add('is-landed'); }); });\n  }\n  function unland() {\n    root.classList.remove('is-landed');\n    if (imgEl) imgEl.removeAttribute('href');\n    if (st.localUrl) { try { URL.revokeObjectURL(st.localUrl); } catch (e) {} st.localUrl = null; }\n  }\n\n  /* ---------- loader ---------- */\n  var loader = $('[data-px-loader]'), loaderStep = $('[data-px-loader-step]'), loaderPct = $('[data-px-loader-pct]'), loaderCard = $('[data-px-loader-card]');\n  function showLoader(step, pct) {\n    if (!loader) return;\n    loader.hidden = false;\n    root.classList.add('is-loading'); root.classList.remove('is-failed');\n    if (loaderStep) loaderStep.textContent = step;\n    var hasPct = !(pct === null || pct === undefined);\n    if (loaderPct) loaderPct.textContent = hasPct ? Math.round(pct) + '%' : '';\n    if (typeof placeHud === 'function') { placeHud(); requestAnimationFrame(placeHud); }\n    say(step + (hasPct ? ' ' + Math.round(pct) + ' percent' : ''));\n  }\n  function hideLoader() { if (loader) loader.hidden = true; root.classList.remove('is-loading', 'is-failed'); }\n  function failLoader(msg) {\n    if (!loader) return;\n    loader.hidden = false;\n    root.classList.add('is-loading', 'is-failed');\n    if (loaderStep) loaderStep.textContent = msg;\n    if (loaderPct) loaderPct.textContent = '';\n    say(msg + '. Try again, or choose another file.');\n  }\n  var retryBtn = $('[data-px-retry]'), cancelBtn = $('[data-px-loader-cancel]');\n  if (retryBtn) retryBtn.addEventListener('click', function () { if (st.lastFile) takeFile(st.lastFile); });\n  if (cancelBtn) cancelBtn.addEventListener('click', function () { st.seq++; hideLoader(); unland(); if (fileInput) fileInput.value = ''; setMode('upload', true); });\n\n  /* ---------- handoff -> Mockup Lab (file= last; the lab's C99 arrival) ---------- */\n  function handoff(hosted, name) { beginConfig(hosted, name || nameFromUrl(hosted)); }\n\n  /* ---------- upload ---------- */\n  var fileInput = $('[data-px-file]'), browseBtns = [].slice.call(root.querySelectorAll('[data-px-browse]')); /* panel card + the stage's own Browse files (Justin 2026-09-05) */\n  var PREVIEW_RE = /^image\\/(png|jpe?g|gif|webp|svg\\+xml|avif)$/i;\n  var OK_EXT = /\\.(png|jpe?g|gif|webp|svg|avif|bmp|tiff?|ai|eps|pdf|psd)$/i;\n  var MAX_BYTES = 80 * 1024 * 1024;\n  function flashError() { root.classList.add('is-error'); setTimeout(function () { root.classList.remove('is-error'); }, 900); }\n  function takeFile(file) {\n    if (!file) return;\n    if (!OK_EXT.test(file.name) && !/^image\\//.test(file.type)) { say('That file type is not supported. Use JPG, PNG, SVG, TIFF, AI or PDF.'); flashError(); return; }\n    if (file.size > MAX_BYTES) { say('That file is over 80 MB. Please export a smaller version.'); flashError(); return; }\n    beginUpload(file);\n  }\n  function hostFile(file, onProgress) {\n    var ext = (file.name.split('.').pop() || 'png').toLowerCase().replace(/[^a-z0-9]/g, '') || 'png';\n    var safe = file.name.replace(/\\.[^.]+$/, '').replace(/[^a-z0-9\\s-]/gi, '').replace(/[\\s_]+/g, '-').slice(0, 40) || 'design';\n    var name = safe + '____image_' + Date.now() + '_' + Math.floor(Math.random() * 1000) + '.' + ext;\n    return fetch(UPLOAD_API + '/uploads/getPresignedUploadUrl?file_name=' + encodeURIComponent(name) + '&file_type=' + encodeURIComponent(file.type || ''))\n      .then(function (r) { if (!r.ok) throw new Error('presign ' + r.status); return r.json(); })\n      .then(function (p) {\n        if (!p || !p.url || !p.sourceUrl) throw new Error('no presigned url');\n        return new Promise(function (resolve, reject) {\n          var xhr = new XMLHttpRequest();\n          xhr.open('PUT', p.url, true);\n          xhr.upload.onprogress = function (e) { if (e.lengthComputable && onProgress) onProgress(Math.min(99, e.loaded / e.total * 100)); };\n          xhr.onload = function () { if (xhr.status >= 200 && xhr.status < 300) resolve(toImgix(p.sourceUrl)); else reject(new Error('put ' + xhr.status)); };\n          xhr.onerror = function () { reject(new Error('put network error')); };\n          xhr.send(file);\n        });\n      });\n  }\n  function crc32(buf) {\n    var c, crc = 0xFFFFFFFF, u8 = new Uint8Array(buf), table = crc32.t;\n    if (!table) {\n      table = crc32.t = new Uint32Array(256);\n      for (var n = 0; n < 256; n++) { c = n; for (var k = 0; k < 8; k++) c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1); table[n] = c >>> 0; }\n    }\n    for (var i = 0; i < u8.length; i++) crc = table[(crc ^ u8[i]) & 0xFF] ^ (crc >>> 8);\n    return ((crc ^ 0xFFFFFFFF) >>> 0).toString(16);\n  }\n  function saveToLibrary(file, hosted) {\n    /* best effort: the design shows up in My Designs like a builder upload */\n    if (!CUSTOMER) return;\n    var send = function (crc) {\n      var payload = { variant_title: 'custom', file: hosted, customer_id: CUSTOMER, file_name: file.name, file_crc: crc || '', product_id: 'my-designs', gangsheet: false };\n      try {\n        fetch(UPLOAD_API + '/uploads/saveData', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body: JSON.stringify([payload]), keepalive: true }).catch(function () {});\n      } catch (e) {}\n    };\n    if (file.size <= 12 * 1024 * 1024 && file.arrayBuffer) file.arrayBuffer().then(function (b) { send(crc32(b)); }).catch(function () { send(''); });\n    else send('');\n  }\n  /* body flag for the config phase so page-level widgets (Shinobi launcher, cookie badge) can clear the sticky bar on mobile */\n  function syncPhaseClass() { document.body.classList.toggle('np-px-config', root.getAttribute('data-px-phase') === 'config'); }\n  syncPhaseClass();\n  if (typeof MutationObserver !== 'undefined') new MutationObserver(syncPhaseClass).observe(root, { attributes: true, attributeFilter: ['data-px-phase'] });\n  /* mobile handoff: header chevron = the bar's back action (config) or the previous page (choose) */\n  var mback = $('[data-px-mback]');\n  if (mback) mback.addEventListener('click', function () { if (root.getAttribute('data-px-phase') === 'config') { var bb2 = $('[data-px-cfg-back]'); if (bb2 && !bb2.disabled) bb2.click(); } else if (history.length > 1) history.back(); else location.href = HUB || '/'; });\n  /* mobile: the whole drop zone taps to open the picker; its title reads \"Tap to add your artwork\" */\n  var stageTitleEl = $('[data-px-stage-title]'), stagePatch = $('[data-px-patch]');\n  function syncMobileCopy() {\n    /* any element with data-px-mobile-text (or the stage title's data-px-title-mobile) swaps copy under 64rem */\n    var els = [].slice.call(root.querySelectorAll('[data-px-mobile-text], [data-px-title-mobile]'));\n    els.forEach(function (el) {\n      if (!el.getAttribute('data-px-desktop-text')) el.setAttribute('data-px-desktop-text', el.textContent);\n      var mob = el.getAttribute('data-px-mobile-text') || el.getAttribute('data-px-title-mobile');\n      el.textContent = (stacked() && mob) ? mob : el.getAttribute('data-px-desktop-text');\n    });\n  }\n  syncMobileCopy(); window.addEventListener('resize', syncMobileCopy);\n  if (stagePatch) stagePatch.addEventListener('click', function (e) { if (!stacked() || root.getAttribute('data-px-phase') !== 'choose' || st.mode !== 'upload') return; if (e.target.closest && e.target.closest('button, a, [data-px-mode-btn]')) return; if (fileInput) fileInput.click(); });\n  browseBtns.forEach(function (bb) { bb.addEventListener('click', function (e) { e.preventDefault(); if (st.mode !== 'upload') setMode('upload', false); if (fileInput) fileInput.click(); }); });\n  if (fileInput) fileInput.addEventListener('change', function () { if (fileInput.files && fileInput.files[0]) takeFile(fileInput.files[0]); });\n  function hasFiles(e) { var t = e.dataTransfer; return !!(t && t.types && Array.prototype.indexOf.call(t.types, 'Files') > -1); }\n  var dragDepth = 0;\n  root.addEventListener('dragenter', function (e) { if (!hasFiles(e)) return; e.preventDefault(); dragDepth++; root.classList.add('is-dragging'); });\n  root.addEventListener('dragover', function (e) { if (!hasFiles(e)) return; e.preventDefault(); try { e.dataTransfer.dropEffect = 'copy'; } catch (e2) {} });\n  root.addEventListener('dragleave', function (e) { if (!hasFiles(e)) return; dragDepth = Math.max(0, dragDepth - 1); if (!dragDepth) root.classList.remove('is-dragging'); });\n  root.addEventListener('drop', function (e) {\n    if (!hasFiles(e)) return;\n    e.preventDefault(); dragDepth = 0; root.classList.remove('is-dragging');\n    var f = e.dataTransfer.files && e.dataTransfer.files[0];\n    if (f) takeFile(f);\n  });\n  document.addEventListener('paste', function (e) {\n    var items = e.clipboardData && e.clipboardData.items; if (!items) return;\n    for (var i = 0; i < items.length; i++) {\n      if (items[i].kind === 'file') { var f = items[i].getAsFile(); if (f) { takeFile(f); e.preventDefault(); return; } }\n    }\n  });\n\n  /* ---------- previous designs (My Designs feed) ---------- */\n  var purchaseMap = null;\n  function buildPurchaseMap() {\n    if (purchaseMap) return purchaseMap;\n    var full = {}, prefix = {}, art = {}, orders = [];\n    var el = document.querySelector('script[data-px-orders]');\n    try { orders = JSON.parse(el ? el.textContent : '[]') || []; } catch (e) { orders = []; }\n    orders.forEach(function (o) {\n      ((o && o.line_items) || []).forEach(function (li) {\n        [li.image_url, li.proof_url, li.upload_url].forEach(function (u0) {\n          var m = String(u0 || '').match(/\\/([^\\/?]+)(\\?|$)/);\n          if (!m) return;\n          var fn = m[1];\n          if (!full[fn]) full[fn] = o.order_name;\n          var p = fn.split('____')[0];\n          if (p && p !== fn && !prefix[p]) prefix[p] = o.order_name;\n          var seg = fn.split('____').pop();\n          if (seg && seg !== fn && !art[seg]) art[seg] = o.order_name;\n        });\n      });\n    });\n    purchaseMap = { full: full, prefix: prefix, art: art };\n    return purchaseMap;\n  }\n  function purchasedOrder(fileUrl) {\n    var map = buildPurchaseMap();\n    var m = String(fileUrl || '').match(/\\/([^\\/?]+)(\\?|$)/);\n    if (!m) return '';\n    var fn = m[1];\n    if (map.full[fn]) return map.full[fn];\n    var p = fn.split('____')[0];\n    if (p && p !== fn && map.prefix[p]) return map.prefix[p];\n    var seg = fn.split('____').pop();\n    if (seg && seg !== fn && map.art[seg]) return map.art[seg];\n    return '';\n  }\n  function extractName(url) {\n    var name = String(url || '').split('?')[0].split('/').pop() || '';\n    if (name.indexOf('____image') > -1) { var ext = name.split('.').pop(); name = name.split('____image')[0] + '.' + ext; }\n    try { name = decodeURIComponent(name); } catch (e) {}\n    return name;\n  }\n  var SKIP_RE = /^(ai-proof-|mockup-ref____|ml-proof-alpha____|np-follow-example-|np-lb-|patch-express-blank____)/i;\n  function mapDesigns(raw) {\n    var archived = [];\n    try { archived = JSON.parse(localStorage.getItem('nt-designs-archived-' + CUSTOMER) || '[]') || []; } catch (e) {}\n    var seen = {}, out = [];\n    raw.forEach(function (r) {\n      if (!r || !r.file || r.gangsheet) return;\n      var base = String(r.file).split('?')[0].split('/').pop();\n      var fileName = (r.file_name && String(r.file_name).length) ? String(r.file_name) : extractName(r.file);\n      if (SKIP_RE.test(fileName) || SKIP_RE.test(base) || /--spec-dk/i.test(base) || /\\.json$/i.test(base)) return;\n      var id = String(r.photo_id || r.id || ('f-' + base));\n      if (archived.indexOf(id) > -1) return;\n      if (seen[base]) return;\n      seen[base] = 1;\n      var order = purchasedOrder(r.file);\n      var ts = 0;\n      if (order && typeof r.purchased_at === 'string' && r.purchased_at) ts = new Date(r.purchased_at).getTime() / 1000 || 0;\n      if (!ts) {\n        if (typeof r.formatted_date === 'number') ts = r.formatted_date;\n        else if (typeof r.formatted_date === 'string' && r.formatted_date) ts = new Date(r.formatted_date).getTime() / 1000 || 0;\n      }\n      if (!ts && typeof r.uploaded_date === 'string' && r.uploaded_date) ts = new Date(r.uploaded_date).getTime() / 1000 || 0;\n      var imgBase = toImgix(String(r.file).split('?')[0]);\n      var vec = isRemotePreview(imgBase);\n      out.push({\n        id: id, name: fileName, file: imgBase,\n        art: vec ? imgBase + '?fm=png' : imgBase,\n        thumb: imgBase + (vec ? '?fm=png&' : '?') + 'w=480&h=480&fit=max&auto=compress&q=45',\n        purchased: !!order, order: order, ts: ts\n      });\n    });\n    out.sort(function (a, b) { return (b.ts || 0) - (a.ts || 0); });\n    return out;\n  }\n  var dgrid = $('[data-px-dgrid]'), dstate = $('[data-px-dstate]'), useBtn = $('[data-px-use]'), selCount = $('[data-px-selcount]');\n  /* the choose-screen teaser wipes the customer's newest upload when we know it, else the brand sample */\n  function setTeaserArt() {\n    var tz = $('[data-px-teaser]'); if (!tz) return;\n    var items = (st.designs && st.designs.items) || [], pick = items.filter(function (x) { return !x.purchased; })[0] || items[0];\n    if (pick && pick.thumb) tz.style.setProperty('--px-teaser-art', \"url('\" + String(pick.thumb).replace(/'/g, '%27') + \"')\");\n  }\n  function loadDesigns() {\n    var d = st.designs;\n    if (d.loaded || d.loading || !dstate) return;\n    if (!CUSTOMER) {\n      dstate.hidden = false;\n      dstate.innerHTML = '<p>Log in to see the designs you have uploaded or ordered before.</p><a class=\"np-px__btn\" href=\"' + esc(LOGIN) + '?return_url=' + encodeURIComponent(location.pathname) + '\">Log in</a>';\n      return;\n    }\n    d.loading = true;\n    dstate.hidden = false; dstate.textContent = 'Loading your designs\u2026';\n    fetch(UPLOAD_API + '/uploads/fetchDataNew?customer_id=' + encodeURIComponent(CUSTOMER))\n      .then(function (r) { if (!r.ok) throw new Error('designs ' + r.status); return r.json(); })\n      .then(function (j) {\n        var raw = (j && j.data) ? j.data : j;\n        if (!Array.isArray(raw)) raw = [];\n        d.items = mapDesigns(raw); d.loaded = true; d.loading = false;\n        renderDesigns();\n      })\n      .catch(function (err) {\n        d.loading = false;\n        dstate.hidden = false;\n        dstate.innerHTML = '<p>We couldn\u2019t load your designs.</p><button type=\"button\" class=\"np-px__btn\" data-px-dretry>Try again</button>';\n        try { console.warn('[patch-express] designs failed', err); } catch (e) {}\n      });\n  }\n  if (dstate) dstate.addEventListener('click', function (e) { if (e.target.closest && e.target.closest('[data-px-dretry]')) loadDesigns(); });\n  function setText(sel, v) { var el = $(sel); if (el) el.textContent = String(v); }\n  function renderDesigns() {\n    var d = st.designs; if (!dgrid) return;\n    var all = d.items, pur = all.filter(function (x) { return x.purchased; }), up = all.filter(function (x) { return !x.purchased; });\n    setText('[data-px-dcount=\"all\"]', all.length); setText('[data-px-dcount=\"purchases\"]', pur.length); setText('[data-px-dcount=\"uploads\"]', up.length);\n    var list = d.filter === 'purchases' ? pur : (d.filter === 'uploads' ? up : all);\n    if (d.selected && !list.some(function (x) { return x.id === d.selected; })) d.selected = null;\n    dgrid.innerHTML = list.map(function (it) {\n      var on = d.selected === it.id;\n      return '<button type=\"button\" class=\"np-px__tile' + (on ? ' is-on' : '') + '\" role=\"option\" aria-selected=\"' + (on ? 'true' : 'false') + '\" data-px-tile=\"' + esc(it.id) + '\" title=\"' + esc(it.name) + '\">' +\n        '<span class=\"np-px__tile-check\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m5 12 5 5L20 7\"/></svg></span>' +\n        '<img src=\"' + esc(it.thumb) + '\" alt=\"' + esc(it.name) + '\" loading=\"lazy\" decoding=\"async\"></button>';\n    }).join('');\n    if (dstate) {\n      dstate.hidden = list.length > 0;\n      if (!list.length) dstate.innerHTML = all.length ? '<p>Nothing in this group yet.</p>' : '<p>No designs yet. Upload one and it will show up here next time.</p>';\n    }\n    syncSel();\n  }\n  function syncSel() {\n    var d = st.designs, n = d.selected ? 1 : 0;\n    if (selCount) selCount.textContent = n + ' selected';\n    if (useBtn) useBtn.disabled = !n;\n  }\n  var dtabs = $('[data-px-dtabs]');\n  if (dtabs) dtabs.addEventListener('click', function (e) {\n    var b = e.target.closest && e.target.closest('[data-px-dtab]'); if (!b) return;\n    st.designs.filter = b.getAttribute('data-px-dtab');\n    $$('[data-px-dtab]').forEach(function (t) { var on = t === b; t.classList.toggle('is-on', on); t.setAttribute('aria-selected', on ? 'true' : 'false'); });\n    renderDesigns();\n  });\n  if (dgrid) dgrid.addEventListener('click', function (e) {\n    var t = e.target.closest && e.target.closest('[data-px-tile]'); if (!t) return;\n    var id = t.getAttribute('data-px-tile');\n    st.designs.selected = st.designs.selected === id ? null : id;\n    $$('[data-px-tile]').forEach(function (x) { var on = x.getAttribute('data-px-tile') === st.designs.selected; x.classList.toggle('is-on', on); x.setAttribute('aria-selected', on ? 'true' : 'false'); });\n    syncSel();\n  });\n  var selClear = $('[data-px-selclear]');\n  if (selClear) selClear.addEventListener('click', function () { st.designs.selected = null; renderDesigns(); });\n  if (useBtn) useBtn.addEventListener('click', function () {\n    var d = st.designs, it = null;\n    d.items.forEach(function (x) { if (x.id === d.selected) it = x; });\n    if (!it) return;\n    handoff(it.art, it.name);\n  });\n\n  /* ---------- create with AI ---------- */\n  var STYLES = {\n    embroidered: { hint: 'an embroidered patch (bold shapes that hold in thread)' },\n    chenille: { hint: 'a chenille patch (chunky simple shapes, varsity feel)' },\n    woven: { hint: 'a woven patch (fine detail is fine)' },\n    pvc: { hint: 'a PVC rubber patch (layered flat colors)' },\n    leather: { hint: 'a leather patch (single-color line art for etching)' }\n  };\n  var VARIANTS = ['bold and simple', 'more detailed with texture', 'playful with a fun twist', 'a classic vintage look'];\n  var promptEl = $('[data-px-prompt]'), countEl = $('[data-px-count]'), genBtn = $('[data-px-generate]'), aiStatus = $('[data-px-aistatus]');\n  var CTRL_RE = new RegExp('[\\\\u0000-\\\\u001f\\\\[\\\\]{}<>]', 'g');\n  function safeText(s) { return String(s || '').replace(CTRL_RE, ' ').replace(/\\s+/g, ' ').trim().slice(0, 300); }\n  function syncPrompt() {\n    var v = promptEl ? promptEl.value : '';\n    if (countEl) countEl.textContent = v.length + ' / 300';\n    if (genBtn) genBtn.disabled = safeText(v).length < 3 || st.ai.busy > 0;\n  }\n  if (promptEl) {\n    promptEl.addEventListener('input', syncPrompt);\n    promptEl.addEventListener('keydown', function (e) { if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') { e.preventDefault(); generate(); } });\n  }\n  var stylesWrap = $('[data-px-styles]');\n  if (stylesWrap) stylesWrap.addEventListener('click', function (e) {\n    var b = e.target.closest && e.target.closest('[data-px-style]'); if (!b) return;\n    st.style = b.getAttribute('data-px-style');\n    $$('[data-px-style]').forEach(function (x) { var on = x === b; x.classList.toggle('is-on', on); x.setAttribute('aria-checked', on ? 'true' : 'false'); });\n  });\n  function usage() {\n    var day = new Date().toISOString().slice(0, 10), u = null;\n    try { u = JSON.parse(localStorage.getItem('np_px_ai_usage') || 'null'); } catch (e) {}\n    if (!u || u.d !== day) u = { d: day, n: 0 };\n    return u;\n  }\n  function bumpUsage(n) { var u = usage(); u.n += n; try { localStorage.setItem('np_px_ai_usage', JSON.stringify(u)); } catch (e) {} }\n  function buildPrompt(base, i) {\n    return base + '. Patch artwork concept, ' + VARIANTS[i] + '. Flat vector illustration with clean edges, limited solid colors, centered composition, isolated on a plain light background. Artwork only: no fabric texture, no stitching, no product photo, no mockup.';\n  }\n  function genOne(prompt) {\n    return fetch(AI_API, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gram-edit', imageUrl: BLANK, prompt: prompt, transparency: 'AUTO' }) })\n      .then(function (r) { return r.json().then(function (j) { if (!r.ok || !j || !j.url) throw new Error(String((j && (j.details || j.error)) || ('HTTP ' + r.status)).slice(0, 200)); return toImgix(j.url); }); });\n  }\n  function slot(i) { return $('[data-px-concept=\"' + i + '\"]'); }\n  function setSlot(i, state, url) {\n    var b = slot(i); if (!b) return null;\n    var prev = st.ai.concepts[i] || {};\n    var c = st.ai.concepts[i] = { state: state, url: url || null, prompt: prev.prompt || '' };\n    b.className = 'np-px__concept' + (state === 'loading' ? ' is-loading' : state === 'ready' ? ' is-ready' : state === 'error' ? ' is-error' : '');\n    b.disabled = state === 'loading' || state === 'empty';\n    var label = 'Concept ' + (i + 1);\n    b.innerHTML = (state === 'ready' && url ? '<img src=\"' + esc(url + '?w=600&auto=compress,format') + '\" alt=\"' + label + '\" decoding=\"async\">' : '') +\n      (state === 'loading' ? '<span class=\"np-px__hud np-px__hud--mini np-px__hud--purple\" aria-hidden=\"true\"><i class=\"np-px__hud-ring np-px__hud-ring--a\"></i><i class=\"np-px__hud-ring np-px__hud-ring--b\"></i><i class=\"np-px__hud-arc\"></i><i class=\"np-px__hud-core\"></i><i class=\"np-px__hud-scan\"></i></span>' : '') +\n      '<span class=\"np-px__concept-label\">' + (state === 'loading' ? '' : state === 'error' ? 'Retry' : label) + '</span>';\n    b.setAttribute('aria-label', state === 'ready' ? ('Use ' + label) : state === 'error' ? ('Retry ' + label) : label);\n    return c;\n  }\n  function generate() {\n    if (!promptEl || !BLANK) return;\n    var base = safeText(promptEl.value);\n    if (base.length < 3 || st.ai.busy > 0) return;\n    var u = usage();\n    if (u.n >= 40) { if (aiStatus) aiStatus.textContent = 'You have reached today\u2019s concept limit. Upload a file instead, or come back tomorrow.'; return; }\n    bumpUsage(4);\n    if (aiStatus) aiStatus.textContent = 'Drafting four concepts. About 20 seconds.';\n    if (genBtn) genBtn.classList.add('is-busy');\n    for (var i = 0; i < 4; i++) runConcept(i, buildPrompt(base, i));\n  }\n  function runConcept(i, prompt) {\n    st.ai.busy++;\n    var c = setSlot(i, 'loading');\n    if (c) c.prompt = prompt;\n    syncPrompt();\n    genOne(prompt)\n      .then(function (url) { var r = setSlot(i, 'ready', url); if (r) r.prompt = prompt; })\n      .catch(function (err) { var r = setSlot(i, 'error'); if (r) r.prompt = prompt; try { console.warn('[patch-express] concept failed', err); } catch (e) {} })\n      .then(function () {\n        st.ai.busy--;\n        if (st.ai.busy === 0) {\n          if (genBtn) genBtn.classList.remove('is-busy');\n          var ready = st.ai.concepts.filter(function (x) { return x && x.state === 'ready'; }).length;\n          if (aiStatus) aiStatus.textContent = ready ? 'Pick the concept you like. It goes straight onto your patch.' : 'The concepts did not come through. Try again, or upload a file instead.';\n        }\n        syncPrompt();\n      });\n  }\n  if (genBtn) genBtn.addEventListener('click', generate);\n  var conceptsWrap = $('[data-px-concepts]');\n  if (conceptsWrap) conceptsWrap.addEventListener('click', function (e) {\n    var b = e.target.closest && e.target.closest('[data-px-concept]'); if (!b) return;\n    var i = parseInt(b.getAttribute('data-px-concept'), 10), c = st.ai.concepts[i];\n    if (!c) return;\n    if (c.state === 'error') { bumpUsage(1); runConcept(i, c.prompt || buildPrompt(safeText(promptEl ? promptEl.value : ''), i)); return; }\n    if (c.state !== 'ready' || !c.url) return;\n    $$('[data-px-concept]').forEach(function (x) { x.classList.toggle('is-on', x === b); });\n    handoff(c.url, 'Concept ' + (i + 1));\n  });\n  /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONFIGURATOR \u2014 after an artwork is in (Justin 2026-09-05 mockups + Claude Design README) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     Modes: processing \u2192 options (Type \u00B7 Artwork \u00B7 Color \u00B7 Border \u00B7 Thread \u00B7 Backing, per type) \u2192 generating \u2192 proof.\n     Type step: the Mockup Lab's recommendation logic (computeReco) fed by the central gate verdict + local colour metrics.\n     Data: each type's own 2.0 builder config (#np-e2-config on its product page) so shapes, colours, border and backing\n     options carry the real images. Background removal = imgix bg-remove. Edit with AI = the proxy's gram-edit route.\n     Generate = Patch Sensei proof session (same endpoint, payload and prompt rules as the lab) fed a composed reference\n     of the configured patch on a grey studio backdrop. Approve = the lab's PDP handoff (Size & Pricing, proof attached). */\n  var GATE_URL = attr('data-px-gate', '');\n  var SHAPE_CLIPS = {\"rhombus\": \"polygon(50% 2%, 98% 50%, 50% 98%, 2% 50%)\", \"star\": \"polygon(50% 2%, 61% 36%, 98% 36%, 68% 58%, 79% 92%, 50% 71%, 21% 92%, 32% 58%, 2% 36%, 39% 36%)\", \"hexagon\": \"polygon(25% 4%, 75% 4%, 99% 50%, 75% 96%, 25% 96%, 1% 50%)\", \"shield\": \"polygon(15.4% 6.2%, 21.2% 4.9%, 27.0% 3.9%, 32.7% 3.1%, 38.5% 2.5%, 44.2% 2.1%, 50.0% 2.0%, 55.8% 2.1%, 61.5% 2.5%, 67.3% 3.1%, 73.0% 3.9%, 78.8% 4.9%, 84.6% 6.2%, 88.1% 7.6%, 91.1% 9.4%, 93.6% 11.9%, 95.5% 14.9%, 96.9% 18.5%, 97.7% 22.6%, 98.0% 27.3%, 97.8% 32.6%, 96.9% 38.5%, 95.6% 44.2%, 94.0% 49.8%, 92.0% 55.1%, 89.6% 60.2%, 86.9% 65.1%, 83.8% 69.9%, 80.3% 74.4%, 76.5% 78.7%, 72.4% 82.9%, 67.8% 86.8%, 62.9% 90.5%, 57.7% 94.1%, 52.0% 97.4%, 51.0% 97.9%, 50.0% 98.0%, 49.0% 97.9%, 48.0% 97.4%, 42.3% 94.1%, 37.1% 90.5%, 32.2% 86.8%, 27.6% 82.9%, 23.5% 78.7%, 19.7% 74.4%, 16.2% 69.9%, 13.1% 65.1%, 10.4% 60.2%, 8.0% 55.1%, 6.0% 49.8%, 4.4% 44.2%, 3.1% 38.5%, 2.2% 32.6%, 2.0% 27.3%, 2.3% 22.6%, 3.1% 18.5%, 4.5% 14.9%, 6.4% 11.9%, 8.9% 9.4%, 11.9% 7.6%, 15.4% 6.2%)\", \"heart\": \"polygon(50.0% 10.9%, 47.0% 8.1%, 43.7% 5.8%, 40.1% 4.0%, 36.3% 2.7%, 32.4% 2.1%, 28.4% 2.0%, 24.5% 2.5%, 20.6% 3.7%, 17.0% 5.4%, 13.6% 7.6%, 10.6% 10.3%, 7.9% 13.4%, 5.7% 17.0%, 4.0% 20.8%, 2.8% 24.8%, 2.1% 29.0%, 2.0% 33.2%, 2.5% 37.4%, 3.5% 41.5%, 5.0% 45.4%, 7.1% 49.1%, 9.6% 52.3%, 50.0% 98.0%, 90.4% 52.3%, 92.9% 49.1%, 95.0% 45.4%, 96.5% 41.5%, 97.5% 37.4%, 98.0% 33.2%, 97.9% 29.0%, 97.2% 24.8%, 96.0% 20.8%, 94.3% 17.0%, 92.1% 13.4%, 89.4% 10.3%, 86.4% 7.6%, 83.0% 5.4%, 79.4% 3.7%, 75.5% 2.5%, 71.6% 2.0%, 67.6% 2.1%, 63.7% 2.7%, 59.9% 4.0%, 56.3% 5.8%, 53.0% 8.1%)\"};\n  var TYPE_IMG = {\"Embroidered\": \"Photo_EmbroideredNP02_2024.jpg?v=1769207146\", \"3D Embroidered\": \"Photo_3DEmbroideryNP02_2024.jpg?v=1722973024\", \"Chenille\": \"Photo_ChenilleNP02_2024.jpg?v=1722973044\", \"Woven\": \"Photo_WovenNP02_2024.jpg?v=2024\", \"PVC / Rubber\": \"Photo_PVCRubberNP02_2024.jpg?v=1742493843\", \"Leather\": \"Photo_GenuineLeatherNP02_2024.jpg?v=1722973138\", \"Printed\": \"Photo_FullColorPrintedNP02_2024.jpg?v=1742835416\", \"Silicone\": \"Johnsonville_TwoHearted.jpg?v=1756227312\", \"Faux Leather\": \"Photo_FauxLeatherNP02_2024.jpg?v=1767976837\", \"Metallic Flex\": \"NT.Patches_2Metallic02.jpg?v=1\", \"Full Color Flex\": \"two_41665335-9969-4830-b635-c87a0b12505a.png?v=1\", \"Matte Black Flex\": \"NT.Patches_2MatteBlack03.jpg?v=1\", \"Matte White Flex\": \"nt_patches_matte_white.png?v=1\", \"Chrome Flex\": \"nt.patches-chrome-flex_c7801b76-9f30-4d2a-9ef3-529d43f36dcc.png?v=1\", \"Tackle Twill\": \"og.png?v=1764624302\"};\n  /* C530: faux Tan w/ Black Imprint = #8C7C57 (World Emblem's stitchout), as on the ninjapatches.com PDP */\n  var LAB_MATS = {\"leather-patches\": [{\"label\": \"Sand\", \"hex\": \"#DCA05F\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODgyNTAxNzUtTmF0dXJhbF9IaWdoX0NvbnRyYXN0Mi5wbmciLCAiZWRpdHMiOiB7InJlc2l6ZSI6IHsid2lkdGgiOiAyMjAsICJmaXQiOiAiY29udGFpbiJ9fX0=\"}, {\"label\": \"Brown\", \"hex\": \"#834822\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODgyNTAxNzUtQ2FyYW1lbF9IaWdoX0NvbnRyYXN0Mi5wbmciLCAiZWRpdHMiOiB7InJlc2l6ZSI6IHsid2lkdGgiOiAyMjAsICJmaXQiOiAiY29udGFpbiJ9fX0=\"}, {\"label\": \"Dark Brown\", \"hex\": \"#716151\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODgyNTAxNzUtVGF1cGVfTG93X0NvbnRyYXN0Mi5wbmciLCAiZWRpdHMiOiB7InJlc2l6ZSI6IHsid2lkdGgiOiAyMjAsICJmaXQiOiAiY29udGFpbiJ9fX0=\"}], \"faux-leather-patches\": [{\"label\": \"Black & Silver\", \"hex\": \"#131313\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODc5MjI0OTUtc2xvd19uaW5qYS5wbmciLCAiZWRpdHMiOiB7InJlc2l6ZSI6IHsid2lkdGgiOiAyMjAsICJmaXQiOiAiY29udGFpbiJ9fX0=\"}, {\"label\": \"Light Brown w/ Black Imprint\", \"hex\": \"#8A3D18\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODc5MjI0OTUtTGlnaHQtQnJvd24ucG5nIiwgImVkaXRzIjogeyJyZXNpemUiOiB7IndpZHRoIjogMjIwLCAiZml0IjogImNvbnRhaW4ifX19\"}, {\"label\": \"Dark Brown w/ Black Imprint\", \"hex\": \"#482818\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODc5MjI0OTUtY2hvYy1hbmQtYmxhY2sucG5nIiwgImVkaXRzIjogeyJyZXNpemUiOiB7IndpZHRoIjogMjIwLCAiZml0IjogImNvbnRhaW4ifX19\"}, {\"label\": \"Tan w/ Black Imprint\", \"hex\": \"#8C7C57\", \"img\": \"https://d17fzo7x83uajt.cloudfront.net/eyJidWNrZXQiOiAiYmNwbyIsICJrZXkiOiAibmluamFwb2RkZC5teXNob3BpZnkuY29tLzg3MzM4ODc5MjI0OTUtU2FuZHN0b25lX2FuZF9ibGFjazIucG5nIiwgImVkaXRzIjogeyJyZXNpemUiOiB7IndpZHRoIjogMjIwLCAiZml0IjogImNvbnRhaW4ifX19\"}]};\n  var TYPE_TEXTURE = {\"3D Embroidered\": \"CRITICAL: render EVERY design element as RAISED 3D PUFF EMBROIDERY \u2014 thick foam-raised stitching with real thread texture, visible stitch direction, and clear depth/shadow on every raised element. Nothing may look flat, smooth, or printed.\", \"Embroidered\": \"Render the entire design as embroidered thread stitching with visible thread texture and stitch direction \u2014 never a flat print.\", \"Chenille\": \"Render the design in fuzzy chenille yarn loops on a felt base \u2014 soft varsity-letter texture.\", \"Woven\": \"CRITICAL: render as a WOVEN patch \u2014 the ENTIRE design and background are made of tightly interlaced warp and weft threads with a visible fine thread grid, like a woven clothing label. Smooth gradients must be re-rendered as stepped woven thread shading. Nothing may look like smooth ink, a print, a sticker, or a digital image.\", \"PVC / Rubber\": \"Render as molded PVC rubber: raised glossy 3D elements with soft rounded edges.\", \"Printed\": \"Render as smooth dye-sublimated full-color print on fabric with a fabric weave visible up close.\", \"Leather\": \"Render as REAL genuine leather: natural grain and warm tone, soft studio light, the design LASER ETCHED as a single darker tone burned into the surface with slight depth \u2014 a photorealistic product shot, never a flat digital graphic, and never any stitching.\", \"Faux Leather\": \"Render as smooth FAUX leather: uniform synthetic grain, matte finish, the design LASER ETCHED as a single contrasting tone with slight depth \u2014 a photorealistic product shot, never full color, never a flat digital graphic, and never any stitching.\", \"Silicone\": \"Render as molded SILICONE: soft matte rubber-gel surface with gently raised elements and smooth rounded edges, slightly translucent material feel \u2014 a photorealistic product shot, never embroidery or fabric. C62: EDGE COLOUR RULE \u2014 every cut piece's edge and sides are the SAME colour as that piece's own face. NEVER add a white or light keyline, outline, halo, rim, or base edge around the design or around any element unless the uploaded artwork itself contains one. The silhouette must match the uploaded image exactly.\"};\n  var SHAPE_DIMS = { circle: [76, 76], square: [76, 76], rectangle: [84, 60], 'rectangle-v': [60, 84], oval: [62, 80], 'oval-h': [80, 62], heart: [80, 74], star: [82, 82], rhombus: [76, 76], hexagon: [80, 72], shield: [72, 80], custom: [76, 76] };\n  var SHAPE_SAFE = { circle: 0.68, oval: 0.66, 'oval-h': 0.66, square: 0.84, rectangle: 0.84, 'rectangle-v': 0.84, star: 0.46, heart: 0.56, rhombus: 0.5, hexagon: 0.66, shield: 0.58 };\n  var CENTER_Y = { shield: 0.44, heart: 0.45 };\n  var SHAPE_DESC = { shield: 'a badge/crest outline: flat top edge, sides curving down to a point at the bottom center', heart: 'a classic heart symbol outline', star: 'a five-point star outline', rhombus: 'a diamond outline standing on a point', hexagon: 'a six-sided hexagon outline', oval: 'a vertical (tall) oval', 'oval-h': 'a horizontal (wide) oval', rectangle: 'a horizontal (wide) rounded rectangle', 'rectangle-v': 'a vertical (tall) rounded rectangle' };\n  /* patch types = the Mockup Lab's own list (1:1 with mockup gen + product pages): fetched from the\n     lab page's #np-ml-config at runtime, images from the lab's TYPE_IMG table; embedded list = fallback */\n  var TYPE_SUFFIX = {\"embroidered-patches\": \"embroidery-2-0\", \"chenille-patches\": \"chenille-2-0\", \"woven-patches\": \"woven-2-0\", \"pvc-rubber-patches\": \"rubber-pvc-2-0\", \"leather-patches\": \"leather-2-0\", \"sublimated-patches\": \"fullcolor-2-0\", \"3d-embroidered-patches\": \"3demb-2-0\", \"silicone-patches\": \"silicone-2-0\", \"faux-leather-patches\": \"fauxleather-2-0\", \"print-stitch-patches\": \"print-and-stitch-2-0\", \"metallic-flex-patches\": \"metallic-flex-2-0\", \"full-color-flex-patches\": \"fullcolor-flex-2-0\", \"matte-black-flex-patches\": \"matte-black-flex-2-0\", \"matte-white-flex-patches\": \"matte-white-flex-2-0\", \"chrome-flex-patches\": \"chrome-flex-2-0\", \"tackle-twill\": \"tackle-twill-2-0\", \"name-patches\": \"custom-names\"};\n  var TYPES_FALLBACK = [\n    { label: 'Embroidered', handle: 'embroidered-patches', title: 'Embroidered Patches', note: 'Classic stitched look', shape: 1, bg: 1, border: 1, thread: 1, backing: 1 },\n    { label: 'Printed', handle: 'sublimated-patches', title: 'Full Color Printed Patches', note: 'Photo-real full color', shape: 1, bg: 1, border: 1, thread: 1, backing: 1, threadLabel: 'Border Color' },\n    { label: 'Leather', handle: 'leather-patches', title: 'Genuine Leather Patches', note: 'Laser etched, single color', shape: 1, bg: 1, border: 1, thread: 0, backing: 1, bgLabel: 'Leather Color' },\n    { label: 'PVC / Rubber', handle: 'pvc-rubber-patches', title: 'PVC Rubber Patches', note: '3D molded rubber', shape: 1, bg: 1, border: 0, thread: 1, backing: 1, threadLabel: 'Border Color' },\n    { label: 'Woven', handle: 'woven-patches', title: 'Woven Patches', note: 'Fine detail, thin lines', shape: 1, bg: 1, border: 1, thread: 1, backing: 1 },\n    { label: 'Chenille', handle: 'chenille-patches', title: 'Chenille Patches', note: 'Fuzzy varsity texture', shape: 1, bg: 1, border: 1, thread: 1, backing: 1 },\n    { label: '3D Embroidered', handle: '3d-embroidered-patches', title: '3D Embroidered Patches', note: 'Raised puff stitching', shape: 1, bg: 1, border: 1, thread: 1, backing: 1 }\n  ].map(fillType);\n  var TYPES = TYPES_FALLBACK, typesP = null;\n  /* PMS (Pantone Solid Coated) nearest-match \u2014 the same table the Mockup Lab serves in #np-ml-config.pms\n     (np-emb2's PMS list); neutrals here are only the fallback until the hub answers */\n  var PMS_LIST = [['#FFFFFF', 'White'], ['#0C0C0E', 'Black 6 C'], ['#75787B', 'Cool Gray 9 C'], ['#D0D0CE', 'Cool Gray 2 C']];\n  function pmsName(hex) {\n    /* C180: nearest PANTONE+ Solid Coated in CIELAB (mirror of np-emb2 pmsName); table = the lab config's full palette */\n    var h0 = String(hex || '').replace('#', ''); if (h0.length === 3) h0 = h0[0] + h0[0] + h0[1] + h0[1] + h0[2] + h0[2];\n    var toLab = function (hx) { var c = [parseInt(hx.substr(0, 2), 16), parseInt(hx.substr(2, 2), 16), parseInt(hx.substr(4, 2), 16)]; if (c.some(function (v) { return isNaN(v); })) return null; var lin = c.map(function (v) { v /= 255; return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }); var X = (lin[0] * 0.4124 + lin[1] * 0.3576 + lin[2] * 0.1805) / 0.95047, Y = lin[0] * 0.2126 + lin[1] * 0.7152 + lin[2] * 0.0722, Z = (lin[0] * 0.0193 + lin[1] * 0.1192 + lin[2] * 0.9505) / 1.08883; var f = function (t) { return t > 0.008856 ? Math.cbrt(t) : 7.787 * t + 16 / 116; }; return [116 * f(Y) - 16, 500 * (f(X) - f(Y)), 200 * (f(Y) - f(Z))]; };\n    var lab = toLab(h0); if (!lab) return hex;\n    var chroma = Math.sqrt(lab[1] * lab[1] + lab[2] * lab[2]), inNeutral = chroma < 8, isWhite = inNeutral && lab[0] > 93;\n    var best = null, bd = Infinity;\n    PMS_LIST.forEach(function (p) {\n      var pl = toLab(String(p[0]).replace('#', '')); if (!pl) return;\n      var pc = Math.sqrt(pl[1] * pl[1] + pl[2] * pl[2]); if ((pc < 8) !== inNeutral) return;\n      if (p[1] === 'White' && !isWhite) return;\n      var d = (lab[0] - pl[0]) * (lab[0] - pl[0]) + (lab[1] - pl[1]) * (lab[1] - pl[1]) + (lab[2] - pl[2]) * (lab[2] - pl[2]);\n      if (d < bd) { bd = d; best = p[1]; }\n    });\n    return best || hex;\n  }\n  function fillType(t) { t.tex = t.label; t.suffix = t.suffix || TYPE_SUFFIX[t.handle] || (t.handle + '-2-0'); t.short = t.note || ''; return t; }\n  function loadTypes() {\n    if (typesP) return typesP;\n    var key = 'np_px_types_v4' /* C220: bumped so the flex types' new Border Color step (has_thread) replaces the cached flags at once (v3 = C180 palette) */;\n    typesP = new Promise(function (resolve) {\n      var cached = null;\n      try { cached = JSON.parse(sessionStorage.getItem(key) || 'null'); } catch (e) {}\n      if (cached && cached.t && cached.d && (Date.now() - cached.t) < 86400000) { if (cached.pms && cached.pms.length) PMS_LIST = cached.pms; resolve(cached.d); return; }\n      /* the lab's config lives in the page.mockup-gen-landing template (its section blocks). Render THIS page with\n         that template via ?view= so Express keeps working whichever page hosts the lab (Justin 2026-09-05 moved the\n         hub page to the Express template); the configured hub URL stays as the fallback. */\n      var CFG_RE = /<script[^>]*id=\"np-ml-config\"[^>]*>([\\s\\S]*?)<\\/script>/;\n      var parseCfg = function (html) { var m = CFG_RE.exec(html); var d = m ? JSON.parse(m[1]) : null; if (!d || !d.types || !d.types.length) throw new Error('no lab config'); return d; };\n      var viewUrl = location.pathname.replace(/\\/$/, '') + '?view=mockup-gen-landing';\n      var srcP = LAB_CFG_URL\n        ? fetch(LAB_CFG_URL, { credentials: 'omit' }).then(function (r) { if (!r.ok) throw new Error('lab config ' + r.status); return r.json(); }).then(function (d) { if (!d || !d.types || !d.types.length) throw new Error('no lab config'); return d; }) /* snapshot asset (other-store host) */\n        : fetch(viewUrl, { credentials: 'same-origin' }).then(function (r) { return r.text(); }).then(parseCfg)\n            .catch(function () { return fetch(HUB, { credentials: 'same-origin' }).then(function (r) { return r.text(); }).then(parseCfg); });\n      srcP.then(function (d) {\n        var list = d.types.map(function (x) { return { label: x.label, handle: x.handle, title: x.title || x.label, note: x.note || '', shape: x.has_shape ? 1 : 0, bg: x.has_bg ? 1 : 0, border: x.has_border ? 1 : 0, thread: x.has_thread ? 1 : 0, backing: x.has_backing ? 1 : 0, bgLabel: (x.bg_label && !/^patch background$/i.test(x.bg_label)) ? x.bg_label : '', threadLabel: (x.thread_label && !/^border thread$/i.test(x.thread_label)) ? x.thread_label : '', img: x.img || '' }; });\n        if (d.pms && d.pms.length) PMS_LIST = d.pms;\n        try { sessionStorage.setItem(key, JSON.stringify({ t: Date.now(), d: list, pms: d.pms || null })); } catch (e2) {}\n        resolve(list);\n      }).catch(function (e3) { try { console.warn('[patch-express] lab types unavailable, using fallback', e3); } catch (e4) {} resolve(null); });\n    }).then(function (list) { if (list && list.length) TYPES = list.map(fillType); return TYPES; });\n    return typesP;\n  }\n  function typeByLabel(l) { var f = null; TYPES.forEach(function (t) { if (t.label === l) f = t; }); return f; }\n  function typeImg(t) { if (t.img) return fixImg(t.img); var f = TYPE_IMG[t.label]; return f ? 'https://ninjapatches.com/cdn/shop/files/' + f + '&width=360' : ''; }\n  var STEP_DEFS = {\n    type: { label: 'Type', nextLabel: 'Type', title: 'Recommended patch type', sub: 'Based on the file you uploaded: colors, edge detail and how fine the lines are.' },\n    art: { label: 'Artwork', nextLabel: 'Artwork', title: 'Remove the background?' },\n    bg: { label: 'Color', nextLabel: 'Background Color', title: 'Patch background', sub: 'The felt color behind your artwork.' },\n    border: { label: 'Border', nextLabel: 'Border Style', title: 'Border style', sub: 'How the edge of your patch is finished.' },\n    thread: { label: 'Thread', nextLabel: 'Border Thread', title: 'Border thread', sub: 'The stitched border around the edge of your patch.' },\n    backing: { label: 'Backing', nextLabel: 'Backing', title: 'Select backing', sub: 'How the patch attaches to the garment.' },\n    size: { label: 'Size', nextLabel: 'Sizing', title: 'Choose your patch size', sub: 'Enter a width or height \\u2014 the other side follows your design. We check it stitches at that size before the proof.' } /* C229 (Justin 2026-09-17): size before the AI proof, everywhere */\n  };\n  var PROC_MSGS = ['Reading file\u2026', 'Detecting edges\u2026', 'Isolating artwork\u2026', 'Counting colors\u2026'];\n  /* Generating-proof status lines (Justin 2026-09-05: \"slow down the alternating messaging and copy the funny jokes\n     that we have on the product pages. Keep it consistent with the patch type\"): the PDP's FUN_BY_KIND / FUN_GENERIC\n     lists (np-emb2.js) verbatim, keyed by the same funKindOf() material resolution \u2014 no thread gags on rubber,\n     leather, silicone, printed or flex renders. Cycle every 2.6s (was 700ms). */\n  var AI_NOTE_LONG = 'This step is just your design and colors. You\\u2019ll pick your size and quantity next. A patch specialist reviews every order by hand before anything is created.'; /* same sentence as the PDP stage note (np-e2-stage-note) */\n  var GEN_MSGS = ['Rendering proof\u2026'];\n  var FUN_GENERIC = [\n    'Inspecting every detail with a comically large magnifying glass\u2026',\n    'Politely shooing the lint away\u2026',\n    'Double-checking everything for good luck\u2026',\n    'Teaching a ninja patience. Slowly\u2026'\n  ];\n  var FUN_BY_KIND = {\n    stitch: [\n      'Threading the world\u2019s tiniest needle\u2026',\n      'Negotiating with the thread spools\u2026',\n      'Teaching a ninja to sew blindfolded\u2026',\n      'Counting stitches. Twice. Lost count. Again\u2026',\n      'Untangling exactly one (1) very dramatic knot\u2026',\n      'Convincing the border to stay in its lane\u2026',\n      'Asking the twill very politely to hold still\u2026',\n      'Sharpening scissors to ninja specification\u2026',\n      'Double-knotting for good luck\u2026'\n    ],\n    woven: [\n      'Threading the loom with microscopic thread\u2026',\n      'Counting warp and weft. Twice\u2026',\n      'Convincing ten thousand threads to cooperate\u2026',\n      'Weaving your pixels into fabric\u2026',\n      'Tuning the loom to ninja pitch\u2026',\n      'Sharpening scissors to ninja specification\u2026'\n    ],\n    leather: [\n      'Warming up the laser (it likes to stretch first)\u2026',\n      'Polishing the hide to ninja standard\u2026',\n      'Calibrating the etch depth to the millimeter\u2026',\n      'Asking the leather very politely to hold still\u2026',\n      'Burning in your artwork, one careful pass at a time\u2026',\n      'Buffing the edges for good luck\u2026'\n    ],\n    molded: [\n      'Carving the mold with ninja precision\u2026',\n      'Mixing colors to the exact drop\u2026',\n      'Pouring very carefully. Very, very carefully\u2026',\n      'Asking the mold very politely to let go\u2026',\n      'Smoothing each layer with a tiny squeegee\u2026',\n      'De-bubbling the pour for good luck\u2026'\n    ],\n    printed: [\n      'Loading inks one pixel at a time\u2026',\n      'Color-matching to the nearest nanometer\u2026',\n      'Convincing the printer it CAN do photo-real\u2026',\n      'Asking the ink very politely to dry faster\u2026',\n      'Heat-setting the colors for good luck\u2026',\n      'Cutting edges sharper than a ninja star\u2026'\n    ],\n    flex: [\n      'Polishing the finish to ninja standard\u2026',\n      'Pressing at exactly the right temperature\u2026',\n      'Asking the vinyl very politely to lie flat\u2026',\n      'Cutting edges sharper than a ninja star\u2026',\n      'Buffing out one (1) very dramatic smudge\u2026'\n    ],\n    chenille: [\n      'Fluffing the chenille to regulation fluffiness\u2026',\n      'Looping yarn like a tiny rollercoaster\u2026',\n      'Asking the felt very politely to hold still\u2026',\n      'Combing the pile with a very small comb\u2026',\n      'Counting loops. Twice. Lost count. Again\u2026'\n    ]\n  };\n  var GEN_SUB_BY_KIND = {\n    stitch: 'Stitch simulation, thread matching, edge finishing.',\n    woven: 'Loom simulation, thread matching, edge finishing.',\n    leather: 'Laser etch simulation, hide tone, edge finishing.',\n    molded: 'Mold carving, color fill, edge finishing.',\n    printed: 'Color matching, print simulation, edge finishing.',\n    flex: 'Finish simulation, color matching, edge cutting.',\n    chenille: 'Pile simulation, felt base, edge finishing.'\n  };\n  function funKindOf(label) {\n    var L = String(label || '');\n    if (/leather/i.test(L)) return 'leather';\n    if (/pvc|rubber|silicone|keychain/i.test(L)) return 'molded';\n    if (/flex|chrome/i.test(L)) return 'flex';\n    if (/woven/i.test(L)) return 'woven';\n    if (/chenille/i.test(L)) return 'chenille';\n    if (/printed|full color|sublimat/i.test(L)) return 'printed';\n    return 'stitch';\n  }\n  function genKind() { var t = cfg && cfg.type; return funKindOf(t ? (t.label || t.handle) : ''); }\n  function genMsgs() {\n    /* kind jokes first, generic ones after, both lightly shuffled so two renders in a row do not read identically */\n    var k = FUN_BY_KIND[genKind()] || FUN_BY_KIND.stitch, sh = function (a) { a = a.slice(); for (var i = a.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)), t = a[i]; a[i] = a[j]; a[j] = t; } return a; };\n    return GEN_MSGS.concat(sh(k)).concat(sh(FUN_GENERIC));\n  }\n  var AI_CHIPS = ['Thicker outline', 'Simplify to 6 colors', 'Remove text', 'Sharpen edges'];\n  var CHECKER = 'var(--nt-checker-base, #f2f2f2) var(--nt-checker-image) center center / var(--nt-checker-size, 10px)'; /* the theme's standard transparent-bg checker (theme.css), as on the PDP builder */\n  var FALLBACK_COLORS = [['White', '#ffffff'], ['Black', '#0C0C0E'], ['Cream', '#f5ecd2'], ['Gray', '#cfd2d6'], ['Charcoal', '#4a5568'], ['Brown', '#8a4b1d'], ['Red', '#e2361a'], ['Maroon', '#7f1d1d'], ['Orange', '#f97316'], ['Gold', '#e5a814'], ['Yellow', '#fde047'], ['Kelly Green', '#16a34a'], ['Green', '#1AA86C'], ['Forest Green', '#14532d'], ['Teal', '#0d9488']].map(function (c) { return { label: c[0], hex: c[1] }; });\n  var FALLBACK = {\n    shapes: [{ label: 'Circle', geom: 'circle' }, { label: 'Square', geom: 'square' }, { label: 'Rectangle', geom: 'rectangle' }, { label: 'Oval', geom: 'oval' }, { label: 'Heart', geom: 'heart' }, { label: 'Rhombus', geom: 'rhombus' }, { label: 'Hexagon', geom: 'hexagon' }, { label: 'Shield', geom: 'shield' }, { label: 'Custom Shape', geom: 'custom' }],\n    borders: [{ label: 'Embroidered / Hot Cut', note: 'Most popular', customOnly: true }, { label: 'Merrow', note: 'Classic wrapped edge' }],\n    backings: [{ label: 'Heat Applied', note: 'Most popular' }, { label: 'Peel & Stick', note: 'No iron needed' }, { label: 'Hook & Loop', note: 'Removable' }],\n    bgs: FALLBACK_COLORS, threads: FALLBACK_COLORS, title: ''\n  };\n  var cfg = null, cfgData = {}, cycleT = null;\n  function freshCfg() { return { step: 0, art: null, type: null, reco: null, showAllTypes: false, removeBg: null, artZoom: 1, artDx: 0, artDy: 0, shape: null, corners: 'rounded', bg: null, border: null, thread: null, backing: null, edits: [], editOpen: false, editText: '', chips: [], busy: null, mockup: null, slider: 50, lbThick: 0, etchInvert: false, solid: null, dominant: null, metrics: null, verdict: null, error: null }; }\n  function fixImg(u) { u = String(u || ''); return u.indexOf('//') === 0 ? 'https:' + u : u; }\n  /* C160 (2026-09-10): mirror of np-emb2 PATCH_TYPES border rules / np-mockup LAB_BORDER_RULES. The PDP narrows the\n     config's border pool per type (`re`) and appends 'No Border' for Printed and Woven \u2014 kept on Design's Shape for both\n     (HC1 / C160). Patch Express used the raw config pool, so it never offered No Border at all and showed Merrow on\n     Chenille / 3D Embroidered. Keep this table byte-equal to the PDP / lab tables. */\n  var PX_BORDER_RULES = {\n    'fullcolor-2-0': { re: /merrow/i, noBorder: 1, noMerrowGeom: /^(heart|custom)$/ }, /* C502 = np-emb2 */\n    'woven-2-0':     { noBorder: 1 },\n    '3demb-2-0':     { re: /hot/i },\n    'chenille-2-0':  { re: /hot/i },\n    'leather-2-0':   { leather: 1 }, /* C219: the PDP's No Border / Etched Border tiles (PX_LB_BORDERS) */\n    'fauxleather-2-0': { leather: 1 }\n  };\n  var PX_NO_BORDER = { label: 'No Border', note: 'Background runs edge to edge', img: (window.NP_PX_NOBORDER_IMG || '') }; /* C204 (Justin 2026-09-14): the tile had no image \u2014 assets/np-px-noborder.jpg (his Small-Borderless.jpg), URL set by the section */\n  /* C219 (Justin 2026-09-15, \"why does border style show up for leather, it should be the outline like we have on product pages\"):\n     leather / faux leather use the PDP's own two tiles (np-emb2.js ~:1083) \u2014 a laser-etched hide has no stitched border */\n  var PX_LB_BORDERS = [\n    { label: 'No Border', img: 'https://ninjauploads-production.imgix.net/np-lb-noborder-1786993611.png', note: 'Smooth clean cut edge' },\n    { label: 'Etched Border', img: 'https://ninjauploads-production.imgix.net/np-lb-border-1786993636.png', note: 'A border line etched just inside the edge' }\n  ];\n  /* C219: the PDP's border-thickness slider (np-emb2 PATCH_TYPES borderThick / lbDefault / lbZeroMax2 \u2014 Justin: \"PVC doesn't have the\n     border setting toggle for how thick it is like the PVC product page\"): molded types tune the rim on their Border Color step,\n     leather / faux tune the etched line on the Border step once Etched is picked */\n  var PX_THICK = {\n    'rubber-pvc-2-0': { def: 5, zeroMax2: 1 }, 'silicone-2-0': { def: 5, zeroMax2: 1 }, 'keychains-2-0': { def: 5, zeroMax2: 1 },\n    'metallic-flex-2-0': { def: 3 }, 'fullcolor-flex-2-0': { def: 3 },\n    'leather-2-0': { def: 3, etched: 1 }, 'fauxleather-2-0': { def: 3, etched: 1 }\n  };\n  /* C220 (Justin 2026-09-15, \"every option on the PDP needs to be correctly in the mockup generator\"): the rest of np-emb2\n     PATCH_TYPES that Patch Express was missing \u2014 backing subsets (effectiveBackings), the finish colour pinned first (fixedBg),\n     single-tone finishes (monoTone), the None rim tile (lbZeroMax2), the photo toggle (photoBtn) and the etch inversion */\n  var PX_TYPE_RULES = {\n    'rubber-pvc-2-0':       { backings: ['heat', 'hook'], noneTile: 1 },\n    'silicone-2-0':         { backings: ['heat', 'hook'], noneTile: 1 },\n    'keychains-2-0':        { backings: ['heat', 'hook'], noneTile: 1 },\n    'leather-2-0':          { backings: ['heat', 'peel'], etchInvert: 1 },\n    'fauxleather-2-0':      { backings: ['heat', 'peel'], etchInvert: 1 },\n    'metallic-flex-2-0':    { backings: ['heat', 'peel'], fixedBg: { label: 'Metallic Silver', hex: '#C3C7CD' } },\n    'fullcolor-flex-2-0':   { backings: ['heat', 'peel'], fixedBg: { label: 'White', hex: '#FFFFFF' } },\n    'matte-black-flex-2-0': { backings: ['heat', 'peel'], fixedBg: { label: 'Matte Black', hex: '#1A1A1C' }, monoTone: 1 },\n    'matte-white-flex-2-0': { backings: ['heat', 'peel'], fixedBg: { label: 'Matte White', hex: '#F5F5F3' }, monoTone: 1 },\n    'chrome-flex-2-0':      { backings: ['heat', 'peel'], fixedBg: { label: 'Chrome', hex: '#D9DDE3' }, monoTone: 1 },\n    'fullcolor-2-0':        { photoBtn: 1, hotCutNoVelcro: 1 }, /* C475 */\n    'print-and-stitch-2-0': { merrowNoVelcro: 1 }, /* C490 (Justin 2026-10-12): Print & Stitch + a Merrow border = no Velcro */\n    '3demb-2-0':            { customNoVelcro: 1 }, /* C534 (Justin 2026-10-29): 3D Embroidered + a custom shape = no Velcro */\n    'chenille-2-0':         { noCustomBg: 1 } /* C471 (Justin 2026-10-05): chenille felt = World Emblem's 14 stock colours, no colour wheel (np-emb2 PATCH_TYPES noCustomBg) */\n  };\n  function typeRule(t) { t = t || (typeof curType === 'function' ? curType() : null); return (t && PX_TYPE_RULES[t.suffix]) || {}; }\n  function applyBackingRules(list, t) { var r = typeRule(t); if (!r.backings) return list; return list.filter(function (b) { var L = String(b.label || '').toLowerCase(); return r.backings.some(function (k) { return L.indexOf(k) !== -1; }); }); } /* = np-emb2 effectiveBackings */\n  /* C475/C476 (= np-emb2 npNoVelcroFor, Justin 2026-10-07): Full Color + a Hot Cut border OR a custom shape = no Velcro / Hook & Loop backing;\n     C492 (Justin 2026-10-13): No Border too */\n  function pxNoVelcro() {\n    var r = cfg ? typeRule() : {};\n    if (r.merrowNoVelcro) return !!(cfg.border && /merrow/i.test(cfg.border.label || '')); /* C490 */\n    if (r.customNoVelcro) return !!(cfg.shape && curShape().geom === 'custom'); /* C534 */\n    return !!(r.hotCutNoVelcro && ((cfg.border && /hot ?cut|no border/i.test(cfg.border.label || '')) || (cfg.shape && curShape().geom === 'custom')));\n  }\n  function pxBackingOk(bk) { return !bk || !pxNoVelcro() || !/hook|velcro/i.test(bk.label || ''); }\n  function pxBackings(d) { return (d.backings || []).filter(function (b) { return pxBackingOk(b); }); }\n  function pinFixed(list, t) { var r = typeRule(t); if (!r.fixedBg) return list; var lab = String(r.fixedBg.label).toLowerCase(); return [{ label: r.fixedBg.label, hex: r.fixedBg.hex }].concat(list.filter(function (c) { return String(c.label || '').toLowerCase() !== lab; })); } /* = np-emb2 fixedBg pin: the finish is swatch #1 of bgs AND threads */\n  function ensureFixedBg() { var r = typeRule(); if (r.monoTone && r.fixedBg && cfg && (!cfg.bg || cfg.bg.label !== r.fixedBg.label)) cfg.bg = { label: r.fixedBg.label, hex: r.fixedBg.hex }; } /* single-tone finishes have no colour step: the finish IS the colour */\n  /* C203: how many swatch tiles fit one row of the swatch rail right now (tile + gap from the CSS: 44+4.8 desktop, 2.4rem+.3rem stacked),\n     so the collapsed palette is exactly two rows with the Custom tile last, whatever the width */\n  function twoRowLimit() {\n    var sw = $('.np-px__swatches'), el = sw || $('.np-px__optrail') || $('.np-px__cfg-body');\n    var w = (el && el.clientWidth) || (stacked() ? Math.max(200, window.innerWidth - 32) : 340);\n    if (!sw) w -= 28; /* C219: the palette sits inside the padded Standard colors panel (.7rem/.85rem) */\n    var tile = stacked() ? (2.4 * 16 + 0.3 * 16) : (44 + 0.3 * 16);\n    var perRow = Math.max(3, Math.floor((w + 0.3 * 16) / tile));\n    return perRow * 2 - 1;\n  }\n  /* C502 (Justin 2026-10-20, Full Color: \"we need to remove hot cut as an embroidered option\" / \"heart shape and designs shape if selected we need to hide the merrow option\") */\n  function pxBorderOk(b) {\n    if (!b) return true;\n    var g = curShape().geom || '', r = PX_BORDER_RULES[curType().suffix] || {};\n    if (g === 'custom' && !b.customOnly && !/no border/i.test(b.label || '')) return false;\n    return !(r.noMerrowGeom && r.noMerrowGeom.test(g) && /merrow/i.test(b.label || ''));\n  }\n  function applyBorderRules(list, t) {\n    var rule = (t && PX_BORDER_RULES[t.suffix]) || {};\n    if (rule.leather) return PX_LB_BORDERS.slice(); /* C219 */\n    if (rule.re) list = list.filter(function (b) { return rule.re.test(b.label || ''); });\n    if (rule.noBorder && !list.some(function (b) { return /no border/i.test(b.label || ''); })) list = list.concat([PX_NO_BORDER]);\n    return list;\n  }\n  function normalizeCfg(d, t) {\n    var shapes = [];\n    (d.shapes || []).forEach(function (s) {\n      if (!s || !s.label) return;\n      if (s.geom === 'rectangle-v' || s.geom === 'oval-h') return; /* C223 (Justin 2026-09-15): Tall Rectangle / Wide Oval retired \u2014 Rectangle and Oval orient themselves from the design (also scrubs the 24 h sessionStorage config cache) */\n      if (/free ?form/i.test(s.label)) return; /* C220: the PDP's Free Form (standalone artwork) path is not built here \u2014 hide the tile instead of showing a second Design's Shape */\n      var o = { label: s.label, geom: s.geom || 'circle', img: fixImg(s.img), crop: false, display: /^(custom shape|shape of my design)$/i.test(s.label) ? \"Design\u2019s Shape\" : s.label };\n      shapes.push(o);\n      if (s.geom === 'rectangle') shapes.push({ label: 'Cropped Rectangle', geom: 'rectangle', img: fixImg(s.img), crop: true, display: 'Cropped Rectangle' });\n      if (s.geom === 'oval') shapes.push({ label: 'Cropped Oval', geom: 'oval', img: fixImg(s.img), crop: true, display: 'Cropped Oval' });\n    });\n    shapes.sort(function (a, b) { return (a.label === 'Square' ? 0 : 1) - (b.label === 'Square' ? 0 : 1); }); /* Square first (Justin 2026-09-05) */\n    var fix = function (arr) { return (arr || []).map(function (o) { var c = {}; for (var k in o) c[k] = o[k]; if (c.img) c.img = fixImg(c.img); return c; }); };\n    var bgs = fix(d.bgs); /* C218 (Justin 2026-09-15, \"the color selection is missing colors\"): Kelly Green is back \u2014 the 9-08 drop only existed to make 25 + Custom fill two fixed rows, and C203 computes the rows from the rail width now */\n    if (t && LAB_MATS[t.handle] && LAB_MATS[t.handle].length) bgs = LAB_MATS[t.handle].slice(); /* leather: the PDP's material tiles, as the lab does */\n    return { shapes: shapes.length ? shapes : normalizeCfg(FALLBACK).shapes, borders: applyBorderRules(fix(d.borders), t) /* C160 */, backings: applyBackingRules(fix(d.backings), t) /* C220 */, bgs: pinFixed(bgs, t), threads: pinFixed(fix(d.threads), t), title: d.title || (t && t.title) || '', settings: d.settings || {} /* C230e: the product's size window (sizeMinMeta / sizeMaxMeta) was dropped here, so the studio judged min/max against 0.5\"\u201315\" instead of the PDP's 1\"\u201311\" */ };\n  }\n  /* the raw builder config for a type: on ninjapatches.com the product's own 2.0 builder page (#np-e2-config);\n     on another store host the snapshot asset (data-px-builders), keyed by product handle */\n  var buildersP = null;\n  function loadBuilders() {\n    if (buildersP) return buildersP;\n    buildersP = fetch(BUILDERS_URL, { credentials: 'omit' }).then(function (r) { if (!r.ok) throw new Error('builders ' + r.status); return r.json(); });\n    return buildersP;\n  }\n  function builderRaw(t) {\n    if (BUILDERS_URL) return loadBuilders().then(function (map) {\n      var d = map && map[t.handle];\n      if (!d || !d.shapes) throw new Error('no builder config');\n      return { shapes: d.shapes, borders: d.borders, backings: d.backings, bgs: d.bgs, threads: d.threads, productTitle: d.title };\n    });\n    return fetch('/products/' + t.handle + '?view=' + encodeURIComponent(t.suffix), { credentials: 'same-origin' })\n      .then(function (r) { return r.text(); })\n      .then(function (html) {\n        var m = /<script[^>]*id=\"np-e2-config\"[^>]*>([\\s\\S]*?)<\\/script>/.exec(html);\n        var d = m ? JSON.parse(m[1]) : null;\n        if (!d || !d.shapes) throw new Error('no builder config');\n        return d;\n      });\n  }\n  function loadCfgData(t) {\n    t = t || TYPES[0];\n    if (cfgData[t.handle]) return cfgData[t.handle].p;\n    var key = 'np_px_cfg3_' + t.handle; /* C229: slim gained settings; C471: cfg3 = the World Emblem background palettes (an open tab drops the old list at once) */\n    var p = new Promise(function (resolve) {\n      var cached = null;\n      try { cached = JSON.parse(sessionStorage.getItem(key) || 'null'); } catch (e) {}\n      if (cached && cached.d && cached.t && (Date.now() - cached.t) < 86400000) { resolve(cached.d); return; }\n      builderRaw(t)\n        .then(function (d) {\n          var slim = { shapes: d.shapes, borders: d.borders || [], backings: d.backings || [], bgs: d.bgs || [], threads: d.threads || [], title: d.productTitle || t.title, settings: d.settings || {} }; /* C229: sizeMin / sizeMinMeta / sizeMaxMeta */\n          try { sessionStorage.setItem(key, JSON.stringify({ t: Date.now(), d: slim })); } catch (e2) {}\n          resolve(slim);\n        })\n        .catch(function (e3) { try { console.warn('[patch-express] builder config unavailable for ' + t.handle + ', using fallback', e3); } catch (e4) {} resolve(FALLBACK); });\n    }).then(function (d) { cfgData[t.handle].d = normalizeCfg(d, t); if (cfg && cfg.type && cfg.type.handle === t.handle) renderAll(); return cfgData[t.handle].d; });\n    cfgData[t.handle] = { p: p, d: null };\n    return p;\n  }\n  function D() { var t = (cfg && cfg.type) || TYPES[0]; return (cfgData[t.handle] && cfgData[t.handle].d) || normalizeCfg(FALLBACK, t); }\n  function dataReady() { var t = (cfg && cfg.type) || TYPES[0]; return !!(cfgData[t.handle] && cfgData[t.handle].d); }\n  function curType() { return (cfg && cfg.type) || TYPES[0]; }\n  /* C219 (Justin 2026-09-15: \"we say Next \u00B7 Thread color when it's PVC, there is no thread\"): bg / thread copy follows the PDP's\n     per-type labels (lab config bg_label / thread_label = np-emb2 PATCH_TYPES bgLabel / threadLabel) */\n  function SD(key) {\n    var d = STEP_DEFS[key] || STEP_DEFS.type, t = curType() || {};\n    var cap = function (x) { return x ? x.charAt(0).toUpperCase() + x.slice(1) : x; };\n    if (key === 'thread' && t.threadLabel && !/thread/i.test(t.threadLabel)) return { label: 'Border', nextLabel: cap(t.threadLabel), title: cap(t.threadLabel), sub: t.border ? 'The color of the border around the edge of your patch.' : 'The color of the molded rim around the edge of your patch.' };\n    if (key === 'bg' && t.bgLabel && !/background/i.test(t.bgLabel)) return { label: d.label, nextLabel: cap(t.bgLabel), title: cap(t.bgLabel), sub: /leather/i.test(t.label || '') ? 'The hide your patch is cut from.' : 'The base color behind your design.' };\n    return d;\n  }\n  function steps() {\n    var t = cfg && (cfg.type || (cfg.reco && cfg.reco.primary)), out = ['type', 'art'];\n    if (!t) return out;\n    if (t.bg) out.push('bg'); if (t.border) out.push('border'); if (t.thread) out.push('thread'); if (t.backing) out.push('backing');\n    out.push('size'); /* C229: the last step before Generate */\n    return out;\n  }\n  function stepKey() { return steps()[cfg.step] || 'type'; }\n  function curShape() { var s = null; D().shapes.forEach(function (x) { if (cfg && x.label === cfg.shape) s = x; }); return s || D().shapes[0]; }\n  /* C223 (mirror of np-emb2 orientGeom): Rectangle / Oval draw tall when the artwork is clearly taller than wide (h/w > 1.05), else wide */\n  function orientGeom(g) { var r = cfg && cfg.art && cfg.art.ratio; if ((g !== 'rectangle' && g !== 'oval') || !r) return g; var t = r > 1.05; return g === 'rectangle' ? (t ? 'rectangle-v' : 'rectangle') : (t ? 'oval' : 'oval-h'); }\n  function dimsFor(s) {\n    var r = cfg && cfg.art && cfg.art.ratio;\n    if ((s.crop || s.geom === 'custom') && r) { var base = s.geom === 'custom' ? 76 : 84; return r >= 1 ? [Math.max(24, Math.round(base / r)), base] : [base, Math.max(24, Math.round(base * r))]; }\n    return SHAPE_DIMS[orientGeom(s.geom)] || [76, 76]; /* C223 */\n  }\n  function isRectGeom(g) { return g === 'square' || g === 'rectangle' || g === 'rectangle-v'; }\n  function cssFor(s, w, h) {\n    /* Justin 2026-09-08: a percentage radius on a non-square box (Cropped Rectangle, Rectangle) draws ELLIPTICAL corners and\n       the ring + face shared one radius, so the corners never looked concentric. Radii are now pixels from the short side\n       (10% like the canvas compose), the face radius is the ring radius minus the ring width, and square corners = 0. */\n    var g = s.geom, m = Math.min(w || 100, h || 100);\n    if (g === 'circle' || g === 'oval' || g === 'oval-h') return { radius: '50%', inner: '50%', clip: '', px: 0 };\n    if (SHAPE_CLIPS[g]) return { radius: '0', inner: '0', clip: SHAPE_CLIPS[g], px: 0 };\n    if (g === 'custom') return { radius: Math.round(m * 0.06) + 'px', inner: Math.round(m * 0.06) + 'px', clip: '', px: Math.round(m * 0.06) };\n    var r = (isRectGeom(g) && cfg && cfg.corners === 'square') ? 0 : Math.round(m * 0.1);\n    return { radius: r + 'px', inner: r + 'px', clip: '', px: r };\n  }\n  function isMerrow() { return !!(cfg && cfg.border && /merrow/i.test(cfg.border.label || '')); }\n  function isLeatherT() { return /leather/i.test(curType().label); }\n  /* C219: molded types (PVC / silicone / keychain / flex) have a rim in the Border Color but no border-style step */\n  function moldedT() { var t = curType(); return !!(t && !t.border && t.thread); }\n  function thickRule() { var t = curType(); return (t && PX_THICK[t.suffix]) || null; }\n  function thickOn() { var r = thickRule(); if (!r || !cfg) return false; if (r.etched) return !!(cfg.border && /etched/i.test(cfg.border.label || '')); if (r.zeroMax2) return !(cfg.thread && (cfg.thread.none || /^none$/i.test(cfg.thread.label || ''))); /* C222: the molded rim slider shows from the start like the PDP (default 5); None hides it */ return !!(cfg.thread && !/^none$/i.test(cfg.thread.label || '')); }\n  function lbThick() { var r = thickRule(); return Math.max(1, Math.min(10, (cfg && cfg.lbThick) || (r && r.def) || 3)); }\n  function lbFactor() { var r = thickRule(); if (!r || !thickOn()) return 1; var v = lbThick(); return r.zeroMax2 ? v / 5 : (0.55 + v * 0.15); } /* = the PDP's lbRingFactor (np-emb2 ~:3728) */\n  function thickTrack(v) { var p = Math.round((v - 1) / 9 * 100); return 'background:linear-gradient(to right, var(--px-green) ' + p + '%, var(--px-toggle-track) ' + p + '%)'; }\n  function thickRowHtml() {\n    if (!thickOn()) return '';\n    var v = lbThick(), r = thickRule();\n    return '<div class=\"np-px__zoomrow np-px__zoomrow--thick\"><span>Border thickness</span><input type=\"range\" data-px-lbthick min=\"1\" max=\"10\" step=\"1\" value=\"' + v + '\" aria-label=\"Border thickness\" style=\"' + thickTrack(v) + '\"><b data-px-lbthick-val>' + v + '/10</b></div>' + (r.zeroMax2 ? '<p class=\"np-px__thicknote\">5 is the standard rim, 1 a barely-there fine rim, 10 twice the standard width.</p>' : '');\n  }\n  /* C472 (np-emb2 parity): Full Color (sublimated) custom shapes keep the border at least this far (inches) from the design */\n  var NP_SUBLI_SAFE_IN = 0.125;\n  function pxSubliOn() { return TYPE_SUFFIX[(curType() || {}).handle || ''] === 'fullcolor-2-0' && !!(cfg && cfg.sizeEntered && cfg.w > 0); }\n  /* C472b (Justin 2026-10-05: \"match my artwork would be adding the color of the images background with the 1/8 margin\"):\n     the colour of the artwork's OWN background = the dominant colour along its outer edge \u2014 but only when the artwork has\n     one: its outline (holes filled) is one connected shape that is at least 90% opaque inside (a badge, a framed or\n     full-rectangle design). Line art or loose elements on a transparent background have no background to extend: null,\n     and the safety margin stays white fabric (filling it with the stroke colour would swallow the design). */\n  var npArtEdgeCache = {};\n  function npArtEdgeHex(img) {\n    try {\n      var nw = img.naturalWidth || img.width, nh = img.naturalHeight || img.height;\n      if (!(nw > 0 && nh > 0)) return null;\n      var key = (img.src || '') ? img.src + '|' + nw + 'x' + nh : '';\n      if (key && npArtEdgeCache.hasOwnProperty(key)) return npArtEdgeCache[key];\n      var sc = Math.min(1, 360 / Math.max(nw, nh)), w = Math.max(1, Math.round(nw * sc)), h = Math.max(1, Math.round(nh * sc));\n      var c = document.createElement('canvas'); c.width = w; c.height = h;\n      var x = c.getContext('2d'); x.drawImage(img, 0, 0, w, h);\n      var d = x.getImageData(0, 0, w, h).data, N = w * h, ext = new Uint8Array(N), stk = [];\n      var push = function (p) { if (!ext[p] && d[p * 4 + 3] < 128) { ext[p] = 1; stk.push(p); } };\n      for (var i = 0; i < w; i++) { push(i); push((h - 1) * w + i); }\n      for (var j = 0; j < h; j++) { push(j * w); push(j * w + w - 1); }\n      while (stk.length) { var p = stk.pop(), px = p % w; if (px > 0) push(p - 1); if (px < w - 1) push(p + 1); if (p >= w) push(p - w); if (p + w < N) push(p + w); }\n      var seed = -1, shape = 0, opaque = 0;\n      for (var k = 0; k < N; k++) if (!ext[k]) { shape++; if (d[k * 4 + 3] >= 128) opaque++; if (seed < 0) seed = k; }\n      var out = null;\n      if (seed >= 0 && opaque >= shape * 0.9) {\n        var seen = new Uint8Array(N), st2 = [seed], cnt = 0; seen[seed] = 1;\n        while (st2.length) {\n          var q = st2.pop(), qx = q % w; cnt++;\n          var nb = [qx > 0 ? q - 1 : -1, qx < w - 1 ? q + 1 : -1, q - w, q + w];\n          for (var m = 0; m < 4; m++) { var n = nb[m]; if (n >= 0 && n < N && !ext[n] && !seen[n]) { seen[n] = 1; st2.push(n); } }\n        }\n        if (cnt >= shape * 0.97) {\n          var bk = {}, tot = 0, best = null;\n          for (var e = 0; e < N; e++) {\n            if (ext[e] || d[e * 4 + 3] < 128) continue;\n            var ex = e % w, ey = (e / w) | 0;\n            if (!(ex === 0 || ey === 0 || ex === w - 1 || ey === h - 1 || ext[e - 1] || ext[e + 1] || ext[e - w] || ext[e + w])) continue;\n            var o = e * 4, kb = (d[o] >> 4) + '_' + (d[o + 1] >> 4) + '_' + (d[o + 2] >> 4);\n            var b = bk[kb] || (bk[kb] = { n: 0, r: 0, g: 0, b: 0 });\n            b.n++; b.r += d[o]; b.g += d[o + 1]; b.b += d[o + 2]; tot++;\n            if (!best || b.n > best.n) best = b;\n          }\n          if (best && best.n >= tot * 0.4) {\n            out = '#' + [best.r, best.g, best.b].map(function (v) { return ('0' + Math.round(v / best.n).toString(16)).slice(-2); }).join('');\n          }\n        }\n      }\n      if (key) npArtEdgeCache[key] = out;\n      return out;\n    } catch (eE) { return null; }\n  }\n  /* C463 (Justin 10-02, faux leather \"BM\" brush art \u2014 \"those thin lines should not look like that in digital mockup\"): a TRUE\n     disk dilation of a canvas's alpha, from an exact Euclidean distance field (Felzenszwalb\u2013Huttenlocher, two 1-D passes). It\n     replaces the stamped copies (4 radii x 24 angles for the custom-shape bubble, 28 for the border ring): stamping only\n     approximates a disk for SOLID shapes \u2014 hair-thin features (brush bristles) stayed separate thin copies and fanned out\n     into a hairy fringe on the cut line and the ring. The edge keeps a 1px anti-aliased ramp. */\n  /* C549 (Justin 2026-11-03, a faux leather Design's Shape came out as two pieces: \"it can never be 2 pieces\"): the Design's\n     Shape bubble dilates the art 5%, so art groups further apart than that were cut as separate pieces. A patch is ONE piece:\n     close the mask (grow r, shrink r) with the smallest r that leaves a single piece, so the extra hide / backing only fills\n     the gaps between the groups. r is searched on a <=200px copy, then applied once at full size. Returns r (0 = already one). */\n  function npOnePiece549(ctx, W, H, C) {\n    if (!(W > 0) || !(H > 0)) return 0;\n    var pieces = function (m, w, h) {\n      var seen = new Uint8Array(w * h), st = [], n = 0;\n      for (var s = 0; s < w * h; s++) {\n        if (m[s] < 128 || seen[s]) continue;\n        n++; if (n > 1) return n; seen[s] = 1; st.push(s);\n        while (st.length) { var p = st.pop(), x = p % w;\n          if (x > 0 && m[p - 1] > 127 && !seen[p - 1]) { seen[p - 1] = 1; st.push(p - 1); }\n          if (x < w - 1 && m[p + 1] > 127 && !seen[p + 1]) { seen[p + 1] = 1; st.push(p + 1); }\n          if (p >= w && m[p - w] > 127 && !seen[p - w]) { seen[p - w] = 1; st.push(p - w); }\n          if (p + w < w * h && m[p + w] > 127 && !seen[p + w]) { seen[p + w] = 1; st.push(p + w); } }\n      }\n      return n;\n    };\n    var maskOf = function (cv) { var dd = cv.getContext('2d').getImageData(0, 0, cv.width, cv.height).data, m = new Uint8Array(cv.width * cv.height); for (var q = 0; q < m.length; q++) m[q] = dd[q * 4 + 3]; return m; };\n    var closeOn = function (srcCv, w, h, r) {\n      /* closing on a canvas padded by r, so growing never clips at the edge: grow r, then grow the outside by r */\n      var p = r + 2, A = document.createElement('canvas'); A.width = w + p * 2; A.height = h + p * 2;\n      var ax = A.getContext('2d'); ax.drawImage(srcCv, p, p, w, h);\n      npDiskDilate(ax, A.width, A.height, r);\n      var id = ax.getImageData(0, 0, A.width, A.height), dd = id.data;\n      for (var q = 3; q < dd.length; q += 4) dd[q] = dd[q] > 127 ? 0 : 255;\n      ax.putImageData(id, 0, 0);\n      npDiskDilate(ax, A.width, A.height, r);\n      var id2 = ax.getImageData(p, p, w, h), d2 = id2.data, m = new Uint8Array(w * h);\n      for (var q2 = 0; q2 < m.length; q2++) m[q2] = 255 - d2[q2 * 4 + 3]; /* closed alpha, anti-aliased edge kept */\n      return m;\n    };\n    var full = ctx.canvas, m0 = maskOf(full);\n    if (pieces(m0, W, H) <= 1) return 0;\n    var k = Math.min(1, 200 / Math.max(W, H)), w = Math.max(1, Math.round(W * k)), h = Math.max(1, Math.round(H * k));\n    var small = document.createElement('canvas'); small.width = w; small.height = h;\n    small.getContext('2d').drawImage(full, 0, 0, w, h);\n    var rS = 0;\n    for (var r = Math.max(1, Math.round(C * k * 0.015)); r <= Math.round(C * k * 0.35); r = Math.max(r + 1, Math.round(r * 1.3))) {\n      if (pieces(closeOn(small, w, h, r), w, h) <= 1) { rS = r; break; }\n    }\n    if (!rS) return -1;\n    var rF = Math.ceil(rS / k) + 1, mF = closeOn(full, W, H, rF);\n    if (pieces(mF, W, H) > 1) { rF = Math.ceil(rF * 1.25); mF = closeOn(full, W, H, rF); }\n    var id3 = ctx.getImageData(0, 0, W, H), d3 = id3.data;\n    for (var q3 = 0; q3 < mF.length; q3++) if (mF[q3] > d3[q3 * 4 + 3]) { d3[q3 * 4] = 0; d3[q3 * 4 + 1] = 0; d3[q3 * 4 + 2] = 0; d3[q3 * 4 + 3] = mF[q3]; }\n    ctx.putImageData(id3, 0, 0);\n    return rF;\n  }\n  function npDiskDilate(ctx, W, H, R) {\n    if (!(R > 0) || !(W > 0) || !(H > 0)) return;\n    var id = ctx.getImageData(0, 0, W, H), d = id.data, N = W * H, BIG = 1e20;\n    var f = new Float64Array(N);\n    for (var i = 0; i < N; i++) f[i] = d[i * 4 + 3] > 127 ? 0 : BIG;\n    var n = Math.max(W, H), z = new Float64Array(n + 1), v = new Int32Array(n), g = new Float64Array(n), o = new Float64Array(n);\n    var dt1 = function (len) {\n      var k = 0; v[0] = 0; z[0] = -BIG; z[1] = BIG;\n      for (var q = 1; q < len; q++) {\n        var s = ((g[q] + q * q) - (g[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        while (s <= z[k]) { k--; s = ((g[q] + q * q) - (g[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); }\n        k++; v[k] = q; z[k] = s; z[k + 1] = BIG;\n      }\n      k = 0;\n      for (var q2 = 0; q2 < len; q2++) { while (z[k + 1] < q2) k++; var dq = q2 - v[k]; o[q2] = dq * dq + g[v[k]]; }\n    };\n    for (var x = 0; x < W; x++) { for (var y = 0; y < H; y++) g[y] = f[y * W + x]; dt1(H); for (var y2 = 0; y2 < H; y2++) f[y2 * W + x] = o[y2]; }\n    for (var y3 = 0; y3 < H; y3++) { var r0 = y3 * W; for (var x2 = 0; x2 < W; x2++) g[x2] = f[r0 + x2]; dt1(W); for (var x3 = 0; x3 < W; x3++) f[r0 + x3] = o[x3]; }\n    for (var j = 0; j < N; j++) {\n      var a = R + 0.5 - Math.sqrt(f[j]);\n      if (a <= 0) continue;\n      var p = j * 4, av = a >= 1 ? 255 : Math.round(a * 255);\n      if (av > d[p + 3]) { d[p] = 0; d[p + 1] = 0; d[p + 2] = 0; d[p + 3] = av; }\n    }\n    ctx.putImageData(id, 0, 0);\n  }\n  /* C461: the laser-etch burn tone the renderer is told \u2014 = np-emb2 leatherEtch(): faux mats keep their curated imprint tones\n     (Black & Silver burns SILVER), real leather burns in its own hue (r*.46 g*.38 b*.30 of the hide) */\n  function pxLeatherEtchHex() {\n    var bgL = pxLeatherBg(), lbl = bgL ? String(bgL.label || '').split(' w/ ')[0] : ''; /* C546: the seeded first mat until a pick */\n    var faux = /faux/i.test((curType() && curType().label) || '');\n    var F = { 'Black & Silver': '#9A9A9A', 'Light Brown': '#33180A', 'Dark Brown': '#1A0D06', 'Tan': '#2E2622' };\n    if (faux && F[lbl]) return F[lbl];\n    var m = /^#?([0-9a-f]{6})$/i.exec(String((bgL && bgL.hex) || ''));\n    if (m) { var n = parseInt(m[1], 16), k = [0.46, 0.38, 0.30]; return '#' + [n >> 16 & 255, n >> 8 & 255, n & 255].map(function (c, i) { return ('0' + Math.round(c * k[i]).toString(16)).slice(-2); }).join('').toUpperCase(); }\n    return ({ 'Sand': '#4A3830', 'Brown': '#3E2D1C', 'Dark Brown': '#55453A' })[lbl] || '#2E1B0E';\n  }\n  /* \u2550\u2550\u2550 C546 (Justin 2026-11-03, \"Patch Express and the ninjatransfers.com studio don't simulate laser etching for leather at all.\n     They draw the art's own white and colours on the hide\" \u2192 \"fix this\"): leather / faux leather previews are the PDP's two-tone\n     laser etch \u2014 the hide plus ONE burn tone, never the art's own white or colours. The block below is np-emb2's etchRegionBurn\n     (C473/C473b), etchSplit535 + npPrevNote535 (C535/C535b), etchArtCanvas (C220) and etchArtCanvasRaw copied VERBATIM from\n     Ninja-Patches main beabe02 (np-emb2.js :940-1466; the C535c line-property writer npPreviewFlag535 is left out \u2014 Patch Express\n     writes no line props). leatherEtch() maps the PDP's burn tone onto pxLeatherEtchHex() (C461, = np-emb2 leatherEtch). \u2550\u2550\u2550 */\n  function leatherEtch() { return { hex: pxLeatherEtchHex() }; }\n  function pxLeatherBg() {\n    /* C546: the hide on screen = the picked leather colour, else the type's FIRST mat \u2014 the PDP seeds st.bg with PTYPE.mats[0]\n       so a leather preview is never a white face (np-emb2 ~:506) */\n    if (cfg && cfg.bg && cfg.bg.hex) return cfg.bg;\n    var t = curType(), m = t && LAB_MATS[t.handle];\n    return (m && m[0]) || null;\n  }\n  /* C473 (Justin 2026-10-07, PATCH-2118780 \"Son's Rays Juices\", faux leather Tan: \"I can not see the actual logo on the proof\"):\n     the burn / bare split is ONE luminance threshold over the whole artwork, so a multi-colour logo collapsed to two classes \u2014 the\n     yellow sun and lettering fell on the bare side (bare tan hide on a tan patch: invisible, nothing outlines them) and the purple\n     disc and green fleur-de-lis fell together on the burn side (one solid disc). Inverting only swapped which half vanished.\n     This maps the artwork's flat COLOUR AREAS, nested from the outside in, and overrides the plain rule (dark burns, light stays\n     bare) in exactly two cases:\n       1. a coloured light shape sitting on bare hide (the patch, or a white knockout) burns \u2014 it has nothing else to show it \u2014\n          unless it outlines / highlights a dark shape, holds dark shapes (a panel), or the image has its own light background;\n       2. a distinctly-coloured dark detail inside a broad, solidly burned fill stays bare so it reads.\n     Every other pixel keeps the per-pixel etch exactly as before; photographs / gradients (no small set of flat areas) return null.\n     C473b (10-07, Justin's no-background version of the same logo still broke): a cut-out's soft edge (fragments within 3px of\n     transparency) now counts as OUTSIDE and fragments between two areas bridge them, so shapes fenced by their own anti-aliasing\n     are placed; area borders counted once; photo-texture art (>10% tiny fragments) keeps the plain rule.\n     Checked on the 695 leather / faux uploads ordered 9-10..10-06 at preview size: 604 identical, 48 under 2% (edge noise), the\n     rest the vanishing-shape / merged-detail cases this fixes. */\n  function etchRegionBurn(d, W, H, T) {\n    var N = W * H, i, j;\n    if (!N || N > 4000000) return null;\n    var buck = new Int16Array(N), opN = 0;\n    for (i = 0; i < N; i++) {\n      var o = i * 4;\n      if (d[o + 3] < 40) { buck[i] = -1; continue; }\n      buck[i] = ((d[o] >> 5) << 6) | ((d[o + 1] >> 5) << 3) | (d[o + 2] >> 5); opN++;\n    }\n    if (opN < 200) return null;\n    /* flat-colour components (4-connected, same bucket) */\n    var cc = new Int32Array(N).fill(-1), ccSize = [], stk = new Int32Array(N), nC = 0;\n    for (i = 0; i < N; i++) {\n      if (buck[i] < 0 || cc[i] >= 0) continue;\n      var b0 = buck[i], sp = 0, sz = 0; stk[sp++] = i; cc[i] = nC;\n      while (sp) {\n        var p = stk[--sp]; sz++;\n        var x = p % W;\n        if (x > 0 && cc[p - 1] < 0 && buck[p - 1] === b0) { cc[p - 1] = nC; stk[sp++] = p - 1; }\n        if (x < W - 1 && cc[p + 1] < 0 && buck[p + 1] === b0) { cc[p + 1] = nC; stk[sp++] = p + 1; }\n        if (p >= W && cc[p - W] < 0 && buck[p - W] === b0) { cc[p - W] = nC; stk[sp++] = p - W; }\n        if (p + W < N && cc[p + W] < 0 && buck[p + W] === b0) { cc[p + W] = nC; stk[sp++] = p + W; }\n      }\n      ccSize.push(sz); nC++;\n    }\n    var ccR = new Float64Array(nC), ccG = new Float64Array(nC), ccB = new Float64Array(nC);\n    for (i = 0; i < N; i++) if (cc[i] >= 0) { var o1 = i * 4, c1 = cc[i]; ccR[c1] += d[o1]; ccG[c1] += d[o1 + 1]; ccB[c1] += d[o1 + 2]; }\n    var minA = Math.max(24, Math.round(opN * 0.002));\n    var regOf = new Int32Array(nC).fill(-1), nR = 0, cover = 0;\n    var regR = [], regG = [], regB = [];\n    for (j = 0; j < nC; j++) if (ccSize[j] >= minA) { regOf[j] = nR++; cover += ccSize[j]; regR.push(ccR[j] / ccSize[j]); regG.push(ccG[j] / ccSize[j]); regB.push(ccB[j] / ccSize[j]); }\n    /* a photo / gradient is not a handful of flat areas: keep the luminance rule */\n    if (!nR || nR > 60 || cover < opN * 0.8) return null;\n    /* the anti-aliased fringe (a few px) joins the nearest large area (multi-source BFS, distance-capped so a small letter\n       next to a big area keeps its own shape instead of being swallowed by it) */\n    var lab = new Int32Array(N).fill(-1), dist = new Uint8Array(N), q = new Int32Array(N), qh = 0, qt = 0, FR = 3;\n    for (i = 0; i < N; i++) if (buck[i] >= 0 && regOf[cc[i]] >= 0) { lab[i] = regOf[cc[i]]; q[qt++] = i; }\n    var near = function (pp, L, dn) {\n      if (dn <= 1) return true; /* the 1px anti-aliased edge always joins */\n      var oo = pp * 4, dr = d[oo] - regR[L], dg = d[oo + 1] - regG[L], db = d[oo + 2] - regB[L];\n      return dr * dr + dg * dg + db * db < 48 * 48; /* further in, only the same colour joins (thin dark text next to a fill stays its own shape) */\n    };\n    while (qh < qt) {\n      var p2 = q[qh++], x2 = p2 % W, L = lab[p2], dn = dist[p2] + 1;\n      if (dn > FR) continue;\n      if (x2 > 0 && buck[p2 - 1] >= 0 && lab[p2 - 1] < 0 && near(p2 - 1, L, dn)) { lab[p2 - 1] = L; dist[p2 - 1] = dn; q[qt++] = p2 - 1; }\n      if (x2 < W - 1 && buck[p2 + 1] >= 0 && lab[p2 + 1] < 0 && near(p2 + 1, L, dn)) { lab[p2 + 1] = L; dist[p2 + 1] = dn; q[qt++] = p2 + 1; }\n      if (p2 >= W && buck[p2 - W] >= 0 && lab[p2 - W] < 0 && near(p2 - W, L, dn)) { lab[p2 - W] = L; dist[p2 - W] = dn; q[qt++] = p2 - W; }\n      if (p2 + W < N && buck[p2 + W] >= 0 && lab[p2 + W] < 0 && near(p2 + W, L, dn)) { lab[p2 + W] = L; dist[p2 + W] = dn; q[qt++] = p2 + W; }\n    }\n    /* leftover flat-colour pieces (a lone letter, a small leaf, a counter) are areas of their own \u2014 per colour, never merged\n       across colours; tiny fragments (anti-aliasing bits) stay unlabelled (-3): they keep the per-pixel rule and are left out\n       of the shape map */\n    var minS = Math.max(10, Math.round(minA / 10)), regOf2 = new Int32Array(nC).fill(-1);\n    for (i = 0; i < N; i++) {\n      if (buck[i] < 0 || lab[i] !== -1) continue;\n      var cj = cc[i];\n      if (ccSize[cj] >= minS) {\n        if (regOf2[cj] < 0) { regOf2[cj] = nR++; if (nR > 600) return null; } /* confetti / noise: keep the luminance rule */\n        lab[i] = regOf2[cj];\n      } else lab[i] = -3;\n    }\n    /* fragments joined to the transparency / frame (the soft edge left by a removed background) lead OUTSIDE: -4. Fragments\n       between two areas (-3) bridge those areas instead, so a shape fenced by its own anti-aliased edge is still placed */\n    /* (only the band within 3px of real transparency: a soft edge is thin, and a chain of fringe pixels deeper in the art\n       belongs to the shapes it separates) */\n    qh = 0; qt = 0; dist.fill(0);\n    for (i = 0; i < N; i++) {\n      var xe = i % W, ye = (i / W) | 0, onFrame = xe === 0 || ye === 0 || xe === W - 1 || ye === H - 1;\n      if (buck[i] < 0 || (onFrame && lab[i] === -3)) { if (lab[i] === -3) { lab[i] = -4; dist[i] = 1; } q[qt++] = i; }\n    }\n    while (qh < qt) {\n      var pe = q[qh++], xq = pe % W, de = dist[pe] + 1;\n      if (de > 3) continue;\n      if (xq > 0 && lab[pe - 1] === -3) { lab[pe - 1] = -4; dist[pe - 1] = de; q[qt++] = pe - 1; }\n      if (xq < W - 1 && lab[pe + 1] === -3) { lab[pe + 1] = -4; dist[pe + 1] = de; q[qt++] = pe + 1; }\n      if (pe >= W && lab[pe - W] === -3) { lab[pe - W] = -4; dist[pe - W] = de; q[qt++] = pe - W; }\n      if (pe + W < N && lab[pe + W] === -3) { lab[pe + W] = -4; dist[pe + W] = de; q[qt++] = pe + W; }\n    }\n    /* a photo texture (leather grain, distress, noise) breaks into a mass of tiny pieces: over 10% of the art = not flat colour\n       areas, keep the plain rule (measured: the textured tag PATCH-2118444 12%; real logos <8%, a transparent cut-out ~6%) */\n    var fragN = 0; for (i = 0; i < N; i++) if (lab[i] === -3 || lab[i] === -4) fragN++;\n    if (fragN > opN * 0.1) return null;\n    /* area stats + adjacency (EXT = transparency and the frame edge) */\n    var EXT = nR, size = new Float64Array(nR), lumS = new Float64Array(nR), edgeTouch = new Float64Array(nR);\n    var sR = new Float64Array(nR), sG = new Float64Array(nR), sB = new Float64Array(nR), darkThin = new Float64Array(nR + 1), thinE = new Float64Array(nR + 1);\n    var darkN = new Float64Array(nR + 1), trE = new Float64Array(nR + 1), w550 = new Uint8Array(nR + 1); /* C550: border with transparency; white burned */\n    var adj = {}, addE = function (a, b) { if (a === b) return; var k = a < b ? a + ',' + b : b + ',' + a; adj[k] = (adj[k] || 0) + 1; };\n    var thinDark = function (pp) { var o6 = pp * 4; return 0.299 * d[o6] + 0.587 * d[o6 + 1] + 0.114 * d[o6 + 2] < T; };\n    var fragOf = new Int32Array(N).fill(-1), fragTouch = [];\n    var touchF = function (fi, r) { var m = fragTouch[fi]; m[r] = (m[r] || 0) + 1; };\n    var link = function (r, q2) { /* region r meets pixel q2 */\n      var Lq = q2 < 0 ? -1 : lab[q2];\n      if (q2 < 0 || buck[q2] < 0) { addE(r, EXT); if (q2 >= 0) trE[r]++; return; }\n      if (Lq >= 0) { addE(r, Lq); return; }\n      if (Lq === -4) { addE(r, EXT); trE[r]++; if (thinDark(q2)) darkThin[r]++; return; }\n      thinE[r]++; if (thinDark(q2)) darkThin[r]++;\n      if (fragOf[q2] < 0) { /* label this internal fragment once */\n        var fi = fragTouch.length; fragTouch.push({}); var fs = [q2]; fragOf[q2] = fi;\n        while (fs.length) { var fp = fs.pop(), fx = fp % W;\n          var cand = [fx > 0 ? fp - 1 : -1, fx < W - 1 ? fp + 1 : -1, fp >= W ? fp - W : -1, fp + W < N ? fp + W : -1];\n          for (var ci = 0; ci < 4; ci++) { var cq = cand[ci]; if (cq >= 0 && lab[cq] === -3 && fragOf[cq] < 0) { fragOf[cq] = fi; fs.push(cq); } } }\n      }\n      touchF(fragOf[q2], r);\n    };\n    for (i = 0; i < N; i++) {\n      var Li = lab[i], xi = i % W, yi = (i / W) | 0;\n      if (Li < 0) continue;\n      var o2 = i * 4, l2 = 0.299 * d[o2] + 0.587 * d[o2 + 1] + 0.114 * d[o2 + 2]; size[Li]++; lumS[Li] += l2; sR[Li] += d[o2]; sG[Li] += d[o2 + 1]; sB[Li] += d[o2 + 2]; if (l2 < T) darkN[Li]++;\n      if (xi === 0 || yi === 0 || xi === W - 1 || yi === H - 1) { edgeTouch[Li]++; addE(Li, EXT); }\n      /* each area-to-area border is counted once (right / down); borders with non-areas (outside, fragments) from all four\n         sides, since those pixels are not walked */\n      if (xi > 0) { var nl = lab[i - 1]; if (nl < 0) link(Li, i - 1); }\n      if (xi < W - 1) { var nr2 = lab[i + 1]; if (nr2 !== Li) link(Li, i + 1); }\n      if (i >= W) { var nu = lab[i - W]; if (nu < 0) link(Li, i - W); }\n      if (i + W < N) { var nd = lab[i + W]; if (nd !== Li) link(Li, i + W); }\n    }\n    /* an internal fragment touching several areas bridges them (weight = the smaller contact) */\n    for (var fz = 0; fz < fragTouch.length; fz++) {\n      var ks = Object.keys(fragTouch[fz]); if (ks.length < 2) continue;\n      for (var ka = 0; ka < ks.length; ka++) for (var kb = ka + 1; kb < ks.length; kb++) {\n        var ra = +ks[ka], rb = +ks[kb], wgt = Math.min(fragTouch[fz][ra], fragTouch[fz][rb]);\n        var kk = ra < rb ? ra + ',' + rb : rb + ',' + ra; adj[kk] = (adj[kk] || 0) + wgt;\n      }\n    }\n    var nb = []; for (j = 0; j <= nR; j++) nb.push({});\n    Object.keys(adj).forEach(function (k) { var ab = k.split(','), a = +ab[0], b = +ab[1]; nb[a][b] = adj[k]; nb[b][a] = adj[k]; });\n    var depth = new Int32Array(nR + 1).fill(-1), order = [EXT]; depth[EXT] = 0;\n    for (var h = 0; h < order.length; h++) { var u = order[h]; Object.keys(nb[u]).forEach(function (v) { v = +v; if (depth[v] < 0) { depth[v] = depth[u] + 1; order.push(v); } }); }\n    var parent = new Int32Array(nR).fill(EXT), hasKids = new Uint8Array(nR + 1);\n    for (j = 0; j < nR; j++) {\n      if (depth[j] <= 1) { parent[j] = EXT; continue; }\n      var bestP = -1, bestE = -1;\n      Object.keys(nb[j]).forEach(function (v) { v = +v; if (depth[v] === depth[j] - 1 && nb[j][v] > bestE) { bestE = nb[j][v]; bestP = v; } });\n      parent[j] = bestP < 0 ? EXT : bestP;\n    }\n    var meanL = new Float64Array(nR + 1), per = new Float64Array(nR + 1);\n    for (j = 0; j < nR; j++) meanL[j] = lumS[j] / Math.max(1, size[j]);\n    for (j = 0; j < nR; j++) Object.keys(nb[j]).forEach(function (v) { per[j] += nb[j][v]; });\n    var hasDarkKids = new Uint8Array(nR + 1);\n    for (j = 0; j < nR; j++) { hasKids[parent[j]] = 1; if (meanL[j] < T) hasDarkKids[parent[j]] = 1; }\n    var perim = 2 * (W + H), burnR = new Uint8Array(nR + 1), thickMin = Math.max(4, Math.max(W, H) * 0.012);\n    /* an image with its OWN light, coloured background reaching the frame edge (parchment, cream, kraft, a vignette): its light\n       areas are background, not shapes that would vanish \u2014 the light-shape rule stays off for that image */\n    var edgeN = 0, edgeLight = 0;\n    var edgeChk = function (pp) { edgeN++; var o7 = pp * 4; if (d[o7 + 3] < 40) return; var l7 = 0.299 * d[o7] + 0.587 * d[o7 + 1] + 0.114 * d[o7 + 2]; if (l7 >= T && l7 < 246) edgeLight++; };\n    for (i = 0; i < W; i++) { edgeChk(i); edgeChk((H - 1) * W + i); }\n    for (j = 1; j < H - 1; j++) { edgeChk(j * W); edgeChk(j * W + W - 1); }\n    var lightBg = edgeLight >= edgeN * 0.5;\n    var clear550 = (N - opN) >= N * 0.08; /* C550: the art has real transparency (a removed or transparent background) */\n    for (h = 1; h < order.length; h++) {\n      var r = order[h]; if (r === EXT) continue;\n      var lum = meanL[r], pr = parent[r], dark = lum < T;\n      /* knockout: near-white, or the image's own light background panel (holds a large share of the frame edge and other shapes) */\n      /* C550 (Justin 2026-11-03, the Addams lettering vanished on leather: \"the 3rd one has no white at all\"): once the background is\n         gone, white IS the design \u2014 a laser cannot add white, so a pale shape standing on the cleared area (at least half its border\n         is transparency) that holds no dark detail and is not the outline / highlight of a dark shape burns instead of vanishing.\n         White inside the art (a face holding line-work, a fill inside an outline) is unchanged: bare hide. */\n      if (clear550 && !dark && pr === EXT && !hasDarkKids[r] && edgeTouch[r] < perim * 0.3) {\n        var dE550 = darkThin[r], tE550 = thinE[r];\n        Object.keys(nb[r]).forEach(function (v) { v = +v; tE550 += nb[r][v]; if (v !== EXT && meanL[v] < T) dE550 += nb[r][v]; });\n        if (trE[r] >= tE550 * 0.5 && dE550 < tE550 * 0.35) { burnR[r] = 1; w550[r] = 1; continue; }\n      }\n      var knock = lum >= 246 || (edgeTouch[r] >= perim * 0.3 && hasKids[r] && lum >= 150);\n      if (knock) { burnR[r] = 0; continue; }\n      if (dark) {\n        /* a detail inside a BROAD burned fill (not inside a thin outline) would merge into it: keep it bare so it reads */\n        var cdR = sR[r] / size[r] - (pr !== EXT ? sR[pr] / size[pr] : 0), cdG = sG[r] / size[r] - (pr !== EXT ? sG[pr] / size[pr] : 0), cdB = sB[r] / size[r] - (pr !== EXT ? sB[pr] / size[pr] : 0);\n        var distinct = cdR * cdR + cdG * cdG + cdB * cdB >= 70 * 70; /* a different colour (green on purple), not two shades of one dark */\n        var broad = pr !== EXT && burnR[pr] && distinct && darkN[pr] >= size[pr] * 0.8 && (size[pr] / Math.max(1, per[pr])) >= thickMin; /* the fill really renders solid burned */\n        burnR[r] = broad ? 0 : 1;\n      } else {\n        /* a light shape on bare hide (the patch itself or a knockout) has nothing to outline it and would vanish: burn it \u2014\n           unless it is the outline / highlight of a dark shape (that shape carries the silhouette) or a panel holding dark shapes */\n        var onBare = pr === EXT || !burnR[pr];\n        if (!onBare || lightBg) { burnR[r] = 0; continue; }\n        var darkEdge = darkThin[r], totE = thinE[r];\n        Object.keys(nb[r]).forEach(function (v) { v = +v; totE += nb[r][v]; if (v !== EXT && meanL[v] < T) darkEdge += nb[r][v]; });\n        /* only a real COLOUR vanishes this way (yellow, pink, gold, light blue); near-white and pale grey are paper/highlight: bare */\n        var mr = sR[r] / size[r], mg = sG[r] / size[r], mb = sB[r] / size[r], chroma = Math.max(mr, mg, mb) - Math.min(mr, mg, mb);\n        var colour = chroma >= 40 || lum < 200;\n        burnR[r] = (!colour || hasDarkKids[r] || darkEdge >= totE * 0.35) ? 0 : 1;\n      }\n    }\n    /* areas the shape map could not reach (fenced off by unlabelled fragments) keep the plain rule */\n    for (j = 0; j < nR; j++) if (depth[j] < 0) burnR[j] = meanL[j] < T ? 1 : 0;\n    /* override ONLY the areas whose decision differs from the plain luminance rule (dark burns, light stays bare), and only on\n       their pixels of that same tone; every other pixel keeps the existing per-pixel etch exactly as before (-1) */\n    var out = new Int8Array(N).fill(-1), flips = 0;\n    for (i = 0; i < N; i++) {\n      var Lr = lab[i]; if (Lr < 0) continue;\n      var baseDark = meanL[Lr] < T, want = burnR[Lr];\n      if ((baseDark ? 1 : 0) === want || (meanL[Lr] >= 246 && !w550[Lr])) continue;\n      var o5 = i * 4, pl = 0.299 * d[o5] + 0.587 * d[o5 + 1] + 0.114 * d[o5 + 2];\n      if ((pl < T) !== baseDark) continue;\n      out[i] = want; flips++;\n    }\n    return flips ? out : null;\n  }\n  /* C535 (Justin 2026-10-30, PATCH-2125023, faux leather Dark Brown, revision \"I can't see my logo at this patch !\"): the\n     upload was a mockup of the logo on a dark wall, opaque edge to edge. Otsu split it at 47, under the floor of 50, so the\n     cut-off fell back to 196, brighter than every pixel in it. The whole frame burned: the digital preview was one flat colour,\n     the AI drew a blank patch from it, and World Emblem proofed a blank patch.\n     This is the cut-off etchArtCanvasRaw has always used, moved here unchanged, plus `blank`: the 196 fallback burns 98% or\n     more of the WHOLE frame (not of the opaque pixels, so a dark logo on a transparent or white background never counts) while\n     the art still has a lighter part Otsu can split off. Then the etch keeps Otsu's split (keepT), so the logo shows as bare\n     hide in a burned frame. 6 of the 1,477 leather / faux uploads ordered 5-18..10-30 were blank this way; every other upload\n     etches exactly as before. Switching Remove background on automatically was tried and dropped: imgix's cut-out erased\n     most of the lettering on 2 of those 6 (HOWDY IDAHO, CNR). */\n  function etchSplit535(d) {\n    var __h = []; for (var hi = 0; hi < 256; hi++) __h[hi] = 0;\n    var __tot = 0;\n    for (var pi = 0; pi < d.length; pi += 4) {\n      if (d[pi + 3] < 40) continue;\n      var lP = Math.round(0.299 * d[pi] + 0.587 * d[pi + 1] + 0.114 * d[pi + 2]);\n      if (lP >= 246) continue; /* knockout white is bare, never ink data */\n      __h[Math.max(0, Math.min(255, lP))]++; __tot++;\n    }\n    var __etchT = 196, bestT = -1, minorFrac = 0;\n    if (__tot > 100) {\n      var sumAll = 0; for (var si = 0; si < 256; si++) sumAll += si * __h[si];\n      var wB = 0, sumB = 0, best = -1;\n      bestT = 128;\n      for (var ti = 0; ti < 256; ti++) {\n        wB += __h[ti]; if (!wB) continue;\n        var wF = __tot - wB; if (!wF) break;\n        sumB += ti * __h[ti];\n        var mB = sumB / wB, mF = (sumAll - sumB) / wF;\n        var v = wB * wF * (mB - mF) * (mB - mF);\n        if (v > best) { best = v; bestT = ti; }\n      }\n      var minor = 0; for (var mi = bestT + 1; mi < 256; mi++) minor += __h[mi];\n      minorFrac = Math.min(minor, __tot - minor) / __tot;\n      if (minorFrac >= 0.06 && bestT >= 50 && bestT <= 210) __etchT = bestT + 2;\n    }\n    var blank = false;\n    if (__etchT === 196 && bestT >= 12 && bestT <= 210 && minorFrac >= 0.01) {\n      var burnN = 0;\n      for (var bi = 0; bi < d.length; bi += 4) {\n        if (d[bi + 3] < 40) continue;\n        if (0.299 * d[bi] + 0.587 * d[bi + 1] + 0.114 * d[bi + 2] < 196) burnN++;\n      }\n      blank = burnN >= (d.length / 4) * 0.98;\n    }\n    return { T: __etchT, blank: blank, keepT: blank ? bestT + 2 : __etchT };\n  }\n  /* C535b (Justin 2026-10-30: \"we need to have a message to let the customer know while their Design may not be giving a good\n     preview. We will be sure to print it like their original design and the choices they chose\"): the note under the preview\n     and on the AI proof shows while the etch flags the artwork as a frame-filling burn (etchSplit535 `blank`). Every etch\n     decides it again, so switching Remove background on or uploading other art clears it. */\n  function npPrevNote535(on) {\n    st.__etchBlank535 = !!on; /* C535c: npPreviewFlag535 reads it at add time */\n    var els = document.querySelectorAll('[data-e2-prevnote]');\n    for (var i = 0; i < els.length; i++) els[i].hidden = !on;\n  }\n  function etchArtCanvas(img, w, h, toneHex, invertK) {\n    /* C220: the two-tone burn is decided at 2x and downsampled, so edges come out anti-aliased instead of stair-stepped and the\n       3x3 median / fleck cleanup nibble half as much of a thin stroke. Budget-capped (output <= 250k px, i.e. the 640-composite\n       and panning cases); larger art boxes already sit at device resolution and take the raw path unchanged. */\n    var W220 = Math.max(1, Math.round(w)), H220 = Math.max(1, Math.round(h));\n    if (W220 * H220 <= 250000) {\n      try {\n        var hi220 = etchArtCanvasRaw(img, W220 * 2, H220 * 2, toneHex, invertK);\n        var out220 = document.createElement('canvas'); out220.width = W220; out220.height = H220;\n        var ox220 = out220.getContext('2d'); ox220.imageSmoothingEnabled = true; try { ox220.imageSmoothingQuality = 'high'; } catch (eQ) {}\n        ox220.drawImage(hi220, 0, 0, W220, H220);\n        return out220;\n      } catch (e220) {}\n    }\n    return etchArtCanvasRaw(img, W220, H220, toneHex, invertK);\n  }\n  function etchArtCanvasRaw(img, w, h, toneHex, invertK) {\n    /* two-tone laser etch, ENGRAVER'S RULES (Justin 2026-08-21): thin dark\n       line-work burns; a BROAD dark fill flips \u2014 the fill reads as bare hide\n       with a burned rim, and the light detail enclosed in it (letters, gill\n       lines) burns instead \u2014 how a real vendor etches dark-fill art so the\n       patch still reads as leather. Near-white is paper/knockout: always\n       bare AND excluded from the ink split, so an un-removed white\n       background can no longer collapse the art into one solid silhouette.\n       Output stays STRICT TWO-TONE: hide + ONE burn tone. */\n    var t = document.createElement('canvas');\n    t.width = Math.max(1, Math.round(w)); t.height = Math.max(1, Math.round(h));\n    var tx = t.getContext('2d');\n    /* inverted designs get a small inset so the burned outline ringing the\n       silhouette has room inside the canvas (Justin 2026-08-21) */\n    var padK = invertK ? Math.max(4, Math.round(Math.min(t.width, t.height) * 0.025)) : 0;\n    tx.drawImage(img, padK, padK, t.width - padK * 2, t.height - padK * 2);\n    var id, d;\n    try { id = tx.getImageData(0, 0, t.width, t.height); d = id.data; }\n    catch (eTaint) {\n      /* CORS-tainted source: pixels unreadable \u2014 burn the whole silhouette\n         in the etch tone rather than break the compose */\n      tx.globalCompositeOperation = 'source-in';\n      tx.fillStyle = toneHex || leatherEtch().hex;\n      tx.fillRect(0, 0, t.width, t.height);\n      return t;\n    }\n    var W2 = t.width, H2 = t.height;\n    var sp535 = etchSplit535(d);\n    var __etchT = sp535.blank ? sp535.keepT : sp535.T; /* C535: a frame-filling burn keeps Otsu's own split */\n    try { npPrevNote535(sp535.blank); } catch (e535b) {}\n    var rb473 = null; try { rb473 = etchRegionBurn(d, W2, H2, __etchT); } catch (eRB) { rb473 = null; } /* C473: colour-area overrides (null = none) */\n    /* broad-fill analysis on a downsampled mask: morphological opening finds\n       fills wider than ~7%% of the art; thin strokes survive as line-work */\n    var sw = W2, sh = H2;\n    if (Math.max(W2, H2) > 300) {\n      if (W2 >= H2) { sw = 300; sh = Math.max(1, Math.round(H2 * 300 / W2)); }\n      else { sh = 300; sw = Math.max(1, Math.round(W2 * 300 / H2)); }\n    }\n    var scv = document.createElement('canvas'); scv.width = sw; scv.height = sh;\n    var scx = scv.getContext('2d'); scx.drawImage(t, 0, 0, sw, sh);\n    var sdd = null;\n    try { sdd = scx.getImageData(0, 0, sw, sh).data; } catch (eT2) { sdd = null; }\n    var NN = sw * sh, ink = new Uint8Array(NN), opq = new Uint8Array(NN), inkN = 0;\n    if (sdd) for (var qi = 0; qi < NN; qi++) {\n      var q4 = qi * 4;\n      if (sdd[q4 + 3] < 40) continue;\n      opq[qi] = 1;\n      var lQ = 0.299 * sdd[q4] + 0.587 * sdd[q4 + 1] + 0.114 * sdd[q4 + 2];\n      if (lQ < __etchT && lQ < 246) { ink[qi] = 1; inkN++; }\n    }\n    function mErode(src) {\n      var out = new Uint8Array(NN);\n      for (var y = 0; y < sh; y++) for (var x = 0; x < sw; x++) {\n        var i2 = y * sw + x; if (!src[i2]) continue;\n        if (x > 0 && !src[i2 - 1]) continue; if (x < sw - 1 && !src[i2 + 1]) continue;\n        if (y > 0 && !src[i2 - sw]) continue; if (y < sh - 1 && !src[i2 + sw]) continue;\n        out[i2] = 1;\n      }\n      return out;\n    }\n    function mDilate(src) {\n      var out = new Uint8Array(src);\n      for (var y = 0; y < sh; y++) for (var x = 0; x < sw; x++) {\n        var i2 = y * sw + x; if (src[i2]) continue;\n        if ((x > 0 && src[i2 - 1]) || (x < sw - 1 && src[i2 + 1]) || (y > 0 && src[i2 - sw]) || (y < sh - 1 && src[i2 + sw])) out[i2] = 1;\n      }\n      return out;\n    }\n    var RR = Math.max(3, Math.round(Math.min(sw, sh) * 0.035)), mz;\n    var opn = ink;\n    for (mz = 0; mz < RR; mz++) opn = mErode(opn);\n    for (mz = 0; mz < RR + 1; mz++) opn = mDilate(opn);\n    var opnN = 0;\n    for (qi = 0; qi < NN; qi++) { if (opn[qi] && !ink[qi]) opn[qi] = 0; opnN += opn[qi]; }\n    /* one plain solid mark (a silhouette logo) still burns solid \u2014 flip only\n       when real line-work exists alongside the fills */\n    /* C101 (2026-09-01): FLOOR on the flip - morphological remnants of bold\n       glyph cores used to satisfy `opnN > 0` and flip the fill bare, punching\n       light dots INSIDE dark lettering (the TRANSFERS speckles). A real broad\n       fill keeps at least ~20% of the ink after opening. */\n    /* C111 (2026-09-01, Justin sign-off on the etch-compare strip): the AUTO\n       broad-fill invert is DISABLED - it flipped solid text logos into\n       bare-with-outline (\"tops of NINJA missing\"). Dark always burns dark;\n       the explicit invert mode (invertK) is untouched. */\n    var invertOn = false;\n    /* inverted designs ALWAYS keep a burned outline around the artwork so\n       the silhouette never fades into the hide: a ring just OUTSIDE the\n       opaque footprint, in the etch tone */\n    var outlM = null;\n    if (invertK && sdd) {\n      var oR = Math.max(3, Math.round(Math.min(sw, sh) * 0.015)), oz;\n      var dil = opq;\n      for (oz = 0; oz < oR; oz++) dil = mDilate(dil);\n      outlM = new Uint8Array(NN);\n      for (qi = 0; qi < NN; qi++) outlM[qi] = (dil[qi] && !opq[qi]) ? 1 : 0;\n    }\n    var bareM = new Uint8Array(NN), holeM = new Uint8Array(NN);\n    if (invertOn) {\n      var cor = opn, rimW = Math.max(2, Math.round(RR / 2));\n      for (mz = 0; mz < rimW; mz++) cor = mErode(cor);\n      for (qi = 0; qi < NN; qi++) bareM[qi] = cor[qi];\n      /* enclosed light detail (letters, gill lines INSIDE a fill): bare\n         regions that never reach the outside and border mostly-broad ink */\n      var lbl = new Int32Array(NN), stk = [], comp = 0, opqN = 0;\n      for (qi = 0; qi < NN; qi++) opqN += opq[qi];\n      for (var s0 = 0; s0 < NN; s0++) {\n        if (lbl[s0] || ink[s0] || !opq[s0]) continue;\n        comp++;\n        var touchesOut = false, bInk = 0, bOpen = 0, members = [];\n        lbl[s0] = comp; stk.push(s0);\n        while (stk.length) {\n          var c0 = stk.pop(); members.push(c0);\n          var cy = (c0 / sw) | 0, cx = c0 - cy * sw;\n          for (var dn = 0; dn < 4; dn++) {\n            var nx = cx + (dn === 0 ? -1 : dn === 1 ? 1 : 0), ny = cy + (dn === 2 ? -1 : dn === 3 ? 1 : 0);\n            if (nx < 0 || ny < 0 || nx >= sw || ny >= sh) { touchesOut = true; continue; }\n            var n0 = ny * sw + nx;\n            if (!opq[n0]) { touchesOut = true; continue; }\n            if (ink[n0]) { bInk++; if (opn[n0]) bOpen++; continue; }\n            if (!lbl[n0]) { lbl[n0] = comp; stk.push(n0); }\n          }\n        }\n        if (!touchesOut && bInk && (bOpen / bInk) >= 0.55 && members.length <= opqN * 0.25) {\n          for (var m0 = 0; m0 < members.length; m0++) holeM[members[m0]] = 1;\n        }\n      }\n    }\n    function mSample(m, fx, fy) {\n      var x0 = fx | 0, y0 = fy | 0;\n      var x1 = Math.min(sw - 1, x0 + 1), y1 = Math.min(sh - 1, y0 + 1);\n      var ax = fx - x0, ay = fy - y0;\n      return m[y0 * sw + x0] * (1 - ax) * (1 - ay) + m[y0 * sw + x1] * ax * (1 - ay) + m[y1 * sw + x0] * (1 - ax) * ay + m[y1 * sw + x1] * ax * ay;\n    }\n    var hx = (toneHex || leatherEtch().hex).replace('#', '');\n    var er = parseInt(hx.substr(0, 2), 16), eg = parseInt(hx.substr(2, 2), 16), eb = parseInt(hx.substr(4, 2), 16);\n    var kxS = (sw - 1) / Math.max(1, W2 - 1), kyS = (sh - 1) / Math.max(1, H2 - 1);\n    /* C104 (2026-09-01): 3x3 MEDIAN on luminance BEFORE thresholding - kills\n       compression/AA salt at the source instead of patching dots afterwards.\n       Text edges survive a 3x3 median at this resolution; isolated specks\n       inside glyphs do not. */\n    var lum104 = new Float32Array(W2 * H2);\n    for (var q4 = 0, i4 = 0; i4 < d.length; i4 += 4, q4++) lum104[q4] = 0.299 * d[i4] + 0.587 * d[i4 + 1] + 0.114 * d[i4 + 2];\n    var med104 = lum104;\n    try {\n      med104 = new Float32Array(W2 * H2);\n      med104.set(lum104);\n      var win104 = new Float32Array(9);\n      for (var yM = 1; yM < H2 - 1; yM++) {\n        var rM = yM * W2;\n        for (var xM = 1; xM < W2 - 1; xM++) {\n          var pM = rM + xM, wN = 0;\n          for (var dy = -1; dy <= 1; dy++) { var rr = pM + dy * W2; win104[wN++] = lum104[rr - 1]; win104[wN++] = lum104[rr]; win104[wN++] = lum104[rr + 1]; }\n          /* median of 9 via partial selection */\n          for (var aM = 0; aM < 5; aM++) { var mn = aM; for (var bM = aM + 1; bM < 9; bM++) if (win104[bM] < win104[mn]) mn = bM; var tv = win104[aM]; win104[aM] = win104[mn]; win104[mn] = tv; }\n          med104[pM] = win104[4];\n        }\n      }\n    } catch (e104) { med104 = lum104; }\n    for (var i = 0; i < d.length; i += 4) {\n      var l = med104[i >> 2];\n      /* BINARY burn with an 8-unit AA ramp only \u2014 laser burns or it doesn't */\n      var k = l < __etchT - 4 ? 1 : (l < __etchT + 4 ? (__etchT + 4 - l) / 8 : 0);\n      if (l >= 246) k = 0;\n      if (rb473 && rb473[i >> 2] >= 0) k = rb473[i >> 2]; /* C473 */\n      if (invertOn) {\n        var p0 = i >> 2, pyF = (p0 / W2) | 0, pxF = p0 - pyF * W2;\n        var fB = mSample(bareM, pxF * kxS, pyF * kyS), hB = mSample(holeM, pxF * kxS, pyF * kyS);\n        k = Math.max(0, Math.min(1, k * (1 - fB) + hB));\n      }\n      /* INVERT-THE-DESIGN mode (standard shapes): flip burn/bare WITHIN the\n         artwork's own opaque footprint \u2014 the patch face is untouched */\n      if (invertK && d[i + 3] >= 40) k = 1 - k;\n      var aOut = Math.round(d[i + 3] * k);\n      if (outlM) {\n        var p1 = i >> 2, pyO = (p1 / W2) | 0, pxO = p1 - pyO * W2;\n        var oV = mSample(outlM, pxO * kxS, pyO * kyS);\n        if (oV > 0.02) aOut = Math.max(aOut, Math.round(oV * 255));\n      }\n      d[i + 3] = aOut;\n      d[i] = er; d[i + 1] = eg; d[i + 2] = eb;\n    }\n    /* C109 (2026-09-01, Justin: \"solid outlines solid, solid imprint solid -\n       not distressed - whether inverted or not\"). Two safe operations only:\n       CLOSE (r=2) fills pinholes/distress INSIDE burned strokes and fills -\n       it never removes ink, so thin outlines are safe. Fleck removal is by\n       CONNECTED-COMPONENT AREA, not erosion (C108's open erased 2px outline\n       strokes): an isolated burn island smaller than ~30px is distress; a\n       thin outline is one large connected component and survives untouched.\n       The etched-border ring (outlM) is protected from all of it. */\n    try {\n      var N9 = W2 * H2;\n      var B9 = new Uint8Array(N9);\n      for (var s9 = 0; s9 < N9; s9++) B9[s9] = d[s9 * 4 + 3] >= 128 ? 1 : 0;\n      var prot9 = null;\n      if (outlM) {\n        prot9 = new Uint8Array(N9);\n        for (var q9 = 0; q9 < N9; q9++) {\n          var py9 = (q9 / W2) | 0, px9 = q9 - py9 * W2;\n          if (mSample(outlM, px9 * kxS, py9 * kyS) > 0.02) prot9[q9] = 1;\n        }\n      }\n      function dil9(src9) {\n        var o9 = new Uint8Array(N9);\n        for (var y9 = 0; y9 < H2; y9++) { var r9 = y9 * W2;\n          for (var x9 = 0; x9 < W2; x9++) { var p9 = r9 + x9, v9 = src9[p9];\n            if (!v9) { for (var dy9 = -1; dy9 <= 1 && !v9; dy9++) { var yy9 = y9 + dy9; if (yy9 < 0 || yy9 >= H2) continue;\n              for (var dx9 = -1; dx9 <= 1; dx9++) { var xx9 = x9 + dx9; if (xx9 >= 0 && xx9 < W2 && src9[yy9 * W2 + xx9]) { v9 = 1; break; } } } }\n            o9[p9] = v9; } }\n        return o9;\n      }\n      function ero9(src9) {\n        var o9 = new Uint8Array(N9);\n        for (var y9 = 0; y9 < H2; y9++) { var r9 = y9 * W2;\n          for (var x9 = 0; x9 < W2; x9++) { var p9 = r9 + x9, v9 = src9[p9];\n            if (v9) { for (var dy9 = -1; dy9 <= 1 && v9; dy9++) { var yy9 = y9 + dy9; if (yy9 < 0 || yy9 >= H2) { v9 = 0; break; }\n              for (var dx9 = -1; dx9 <= 1; dx9++) { var xx9 = x9 + dx9; if (xx9 < 0 || xx9 >= W2 || !src9[yy9 * W2 + xx9]) { v9 = 0; break; } } } }\n            o9[p9] = v9; } }\n        return o9;\n      }\n      var C9 = ero9(ero9(dil9(dil9(B9)))); /* CLOSE r=2: fills interior distress */\n      /* fleck removal: kill small isolated BURN components */\n      var lbl9 = new Int32Array(N9), stack9 = [], comp9 = 0;\n      var minA9 = Math.max(30, Math.round(N9 * 0.00003));\n      for (var seed9 = 0; seed9 < N9; seed9++) {\n        if (C9[seed9] && !lbl9[seed9]) {\n          comp9++; var mem9 = [seed9]; lbl9[seed9] = comp9; stack9.length = 0; stack9.push(seed9);\n          while (stack9.length) {\n            var c9 = stack9.pop(), cy9 = (c9 / W2) | 0, cx9 = c9 - cy9 * W2;\n            for (var dy9b = -1; dy9b <= 1; dy9b++) { var ny9 = cy9 + dy9b; if (ny9 < 0 || ny9 >= H2) continue;\n              for (var dx9b = -1; dx9b <= 1; dx9b++) { var nx9 = cx9 + dx9b; if (nx9 < 0 || nx9 >= W2) continue;\n                var n9 = ny9 * W2 + nx9;\n                if (C9[n9] && !lbl9[n9]) { lbl9[n9] = comp9; stack9.push(n9); mem9.push(n9); } } }\n          }\n          if (mem9.length < minA9) { for (var k9 = 0; k9 < mem9.length; k9++) C9[mem9[k9]] = 0; }\n        }\n      }\n      for (var f9 = 0; f9 < N9; f9++) {\n        if (prot9 && prot9[f9]) continue;\n        if (C9[f9] && !B9[f9]) d[f9 * 4 + 3] = 255;      /* interior distress: fill solid */\n        else if (!C9[f9] && B9[f9]) d[f9 * 4 + 3] = 0;   /* isolated fleck: remove */\n      }\n    } catch (e109) {}\n    tx.putImageData(id, 0, 0);\n    return t;\n  }\n  var etchCache = {};\n  function etchUrl(src) {\n    /* C546: the live preview's leather art = the etched rendition (np-emb2 draws etchArtCanvas on its main preview), cached per\n       (source, burn tone, invert); '' while it etches \u2014 the caller re-renders on completion, exactly like plateUrl() */\n    if (!src) return '';\n    var tone = pxLeatherEtchHex(), inv = !!cfg.etchInvert, key = [src, tone, inv].join('|');\n    var hit = etchCache[key];\n    if (hit) return hit.url || '';\n    etchCache[key] = { pending: true, url: '' };\n    var im = new Image(); if (!/^(blob|data):/.test(src)) im.crossOrigin = 'anonymous';\n    im.onload = function () {\n      try { var k = Math.min(1, 900 / Math.max(im.naturalWidth, im.naturalHeight)); etchCache[key] = { url: etchArtCanvas(im, Math.max(1, Math.round(im.naturalWidth * k)), Math.max(1, Math.round(im.naturalHeight * k)), null, inv).toDataURL('image/png') }; }\n      catch (e) { etchCache[key] = { url: '' }; }\n      if (cfg) renderAll();\n    };\n    im.onerror = function () { etchCache[key] = { url: '' }; setTimeout(function () { delete etchCache[key]; if (cfg) renderAll(); }, 2500); };\n    im.src = src;\n    return '';\n  }\n  function artRawUrl(w) { if (!cfg || !cfg.art || !cfg.art.hosted) return ''; var u = cfg.art.hosted.split('?')[0], q = []; if (isRemotePreview(u)) q.push('fm=png'); if (w) q.push('w=' + w); return u + (q.length ? '?' + q.join('&') : ''); }\n  function artDisplayUrl(w) {\n    if (!cfg || !cfg.art || !cfg.art.hosted) return '';\n    var u = cfg.art.hosted.split('?')[0], q = [];\n    if (isRemotePreview(u)) q.push('fm=png');\n    q.push('trim=colorUnlessAlpha');\n    if (cfg.removeBg === true) q.push('bg-remove=true');\n    if (w) q.push('w=' + w);\n    return u + '?' + q.join('&');\n  }\n  function nameFromUrl(u) { var n = String(u || '').split('?')[0].split('/').pop() || 'artwork'; if (n.indexOf('____image') > -1) { var ext = n.split('.').pop(); n = n.split('____image')[0] + '.' + ext; } try { n = decodeURIComponent(n); } catch (e) {} return n; }\n  function showView(name) { $$('[data-px-view]').forEach(function (v) { v.hidden = v.getAttribute('data-px-view') !== name; }); syncOverlay(); }\n\n  /* ---- preview ---- */\n  var pvEl = $('[data-px-pv]'), pvRing = $('[data-px-pv-ring]'), pvFace = $('[data-px-pv-face]'), pvArt = $('[data-px-pv-art]'), pvBusy = $('[data-px-pv-busy]');\n  /* imgix answers 5xx while it GENERATES a bg-remove rendition on the first request (same as np-emb2's\n     rbTries probe): re-request the same src every 2s, up to 10 times, instead of leaving a broken image */\n  if (pvArt) {\n    pvArt.addEventListener('load', function () { st.pvTries = 0; st.artReady = true; try { remeasureArt(); } catch (eM) {} /* C222: the displayed rendition decides the cropped-shape ratio */ pvArt.classList.remove('is-loading'); if (pvBusy && !root.classList.contains('is-busy')) pvBusy.hidden = true; if (nextBtn && cfg && st.mode === 'options' && !cfg.error && !isBusy() && (!pvBusy || pvBusy.hidden)) nextBtn.hidden = false; /* AFTER the ring is dropped: the rendition landed, Next may show */ if (cfg && stepKey() === 'art' && optRail) { var lsc = optRail.querySelector('[data-px-scroller]'), lx = lsc ? lsc.scrollLeft : 0; optRail.innerHTML = railHtml('art'); var lsc2 = optRail.querySelector('[data-px-scroller]'); if (lsc2 && lx) jumpRail(lsc2, lx); setTimeout(syncArrows, 30); } });\n    pvArt.addEventListener('error', function () {\n      var cur = pvArt.getAttribute('src') || '';\n      if (!/[?&]bg-remove=true/.test(cur)) return;\n      st.pvTries = (st.pvTries || 0) + 1;\n      if (st.pvTries > 10) { st.pvTries = 0; if (cfg) { cfg.removeBg = false; say('Background removal is not available for this file, so it stays as uploaded.'); renderAll(); } return; }\n      setTimeout(function () { if ((pvArt.getAttribute('src') || '') === cur) { pvArt.removeAttribute('src'); pvArt.setAttribute('src', cur); } }, 2000);\n    });\n  }\n  var pvEyebrow = $('[data-px-pv-eyebrow]'), pvMeta = $('[data-px-pv-meta]'), pvTags = $('[data-px-pv-tags]'), pvWrap = $('[data-px-pvwrap]'), proofEl = $('[data-px-proof]');\n  function pvBase() {\n    st.pvMaxW = st.pvMaxH = Infinity; /* both caps reset before the early returns (review 2026-09-10: a desktop pvMaxH must not survive into the stacked path) */\n    if (stacked()) return 250; /* mobile handoff: 250px base, long side never exceeds 250 */\n    if (!pvWrap) return 320;\n    var r = pvWrap.getBoundingClientRect(), fit = 0.62, innerW = r.width;\n    /* short cards (Justin 2026-09-10: \"on a smaller monitor the preview cuts off\"; C218 2026-09-15 \"why is the image to\n       the left and not up top?\"): the CSS container query keeps the preview ABOVE the option rail and caps the wrapper\n       at 50cqh; --px-pv-fit (share of the wrapper width) and --px-pv-chrome (padding + eyebrow) on the wrapper size the patch */\n    try { var cs = getComputedStyle(pvWrap); var f = parseFloat(cs.getPropertyValue('--px-pv-fit')); if (f > 0) fit = f; innerW = r.width - (parseFloat(cs.paddingLeft) || 0) - (parseFloat(cs.paddingRight) || 0); } catch (e) {}\n    var wBudget = fit >= 1 ? Math.max(120, innerW) : r.width * fit;\n    if (fit >= 1) st.pvMaxW = Math.max(120, innerW);\n    var chrome = st.mode === 'proof' ? 190 : 120; /* wrapper padding + eyebrow + meta (+ the 3-line AI note and its gap in proof mode) */\n    if (st.mode === 'proof' && wearBarEl && !wearBarEl.hidden) chrome += Math.round(wearBarEl.getBoundingClientRect().height) + 8; /* C224q: the See-this-on-a bar is chrome too \u2014 without it the AI note ran into the action bar (Justin 2026-09-16 \"this warning message now in the way\") */\n    try { var chromeV = parseFloat(getComputedStyle(pvWrap).getPropertyValue('--px-pv-chrome')); if (chromeV > 0 && st.mode !== 'proof') chrome = chromeV; } catch (e2) {} /* C218: short stacked cards declare their own chrome (top padding + eyebrow) */\n    st.pvMaxH = Math.max(140, r.height - chrome);\n    var avail = Math.min(wBudget, Math.max(140, r.height - chrome));\n    return Math.round(Math.max(160, Math.min(avail, 360)));\n  }\n  function metaLine() {\n    var s = curShape(), parts = [];\n    if (cfg.type) parts.push(cfg.type.label);\n    parts.push(s.display || s.label);\n    if (cfg.removeBg === true) parts.push('background removed'); else if (cfg.removeBg === false) parts.push('original');\n    if (cfg.border) parts.push(isMerrow() ? 'merrow edge' : (/etched/i.test(cfg.border.label) ? 'etched edge' : (/no border/i.test(cfg.border.label) ? 'clean cut' : 'hot cut edge')));\n    if (cfg.backing) parts.push(String(cfg.backing.label).toLowerCase());\n    return parts.join(' \u00B7 ');\n  }\n  function isBusy() { return st.mode === 'processing' || st.mode === 'generating' || !!(cfg && cfg.busy); }\n  /* \u2550\u2550\u2550 C224 (2026-09-16, Justin) \u2014 \"See this on a: Patch | Hat | Polo\" on the AI proof, any colour (mirror of np-emb2 wearMount/wearApply;\n     bases + tint + placement in np-wear.js). The garment layer sits inside the AI side of the compare box only. Cosmetic. \u2550\u2550\u2550 */\n  var WEAR_SWATCHES = [['White', '#ffffff'], ['Black', '#0C0C0E'], ['Navy', '#1f3a6e'], ['Heather Gray', '#9ca3af'], ['Charcoal', '#4b5563'], ['Royal', '#1d4ed8'], ['Red', '#b91c1c'], ['Forest', '#14532d'], ['Maroon', '#7f1d1d'], ['Sand', '#d6c7a1'], ['Orange', '#ea580c'], ['Purple', '#4b2e83']];\n  function wearSt() { if (!cfg.wear) cfg.wear = { mode: 'patch', color: {}, place: {} }; return cfg.wear; }\n  function wearColorFor(key) { var w = wearSt(); return w.color[key] || '#ffffff'; } /* Justin 2026-09-16: \"default all garments on white color\" */\n  function wearBarHtml() {\n    var w = wearSt(), g = w.mode === 'patch' ? null : w.mode, G = g && window.NPWear ? NPWear.garment(g) : null, cur = g ? String(wearColorFor(g)).toLowerCase() : '';\n    var items = [['patch', 'Patch']].concat((window.NPWear ? NPWear.catalog() : []).map(function (x) { return [x.key, x.label]; })); /* C224e: Ninja Size Helper garments */\n    var seg = items.map(function (o) { return '<button type=\"button\" role=\"tab\" data-px-wear=\"' + esc(o[0]) + '\" class=\"' + (w.mode === o[0] ? 'is-on' : '') + '\" aria-selected=\"' + (w.mode === o[0] ? 'true' : 'false') + '\">' + esc(o[1]) + '</button>'; }).join('');\n    var stock = WEAR_SWATCHES.map(function (c) { return '<button type=\"button\" class=\"np-px__wear-sw' + (cur === c[1].toLowerCase() ? ' is-on' : '') + '\" data-px-wear-color=\"' + c[1] + '\" title=\"' + c[0] + '\" aria-label=\"' + c[0] + '\"><i style=\"background:' + c[1] + '\"></i></button>'; }).join('');\n    var isCustom = g && !WEAR_SWATCHES.some(function (c) { return c[1].toLowerCase() === cur; });\n    var places = (G && G.kind === 'tile' && G.zones.length > 1) ? '<div class=\"np-px__wear-row\"><span class=\"np-px__wear-lab\">Placement</span><div class=\"np-px__wear-seg\" role=\"tablist\">' + G.zones.map(function (z) { var on = (w.place[g] || G.zones[0].placement) === z.placement; return '<button type=\"button\" role=\"tab\" data-px-wear-place=\"' + esc(z.placement) + '\" class=\"' + (on ? 'is-on' : '') + '\">' + esc(z.placement.charAt(0).toUpperCase() + z.placement.slice(1).toLowerCase()) + '</button>'; }).join('') + '</div></div>' : '';\n    return '<div class=\"np-px__wear-row\"><span class=\"np-px__wear-lab\">See this on a:</span><div class=\"np-px__wear-seg\" role=\"tablist\" aria-label=\"Show the proof on\">' + seg + '</div></div>' + places +\n      '<div class=\"np-px__wear-colors\"' + (g ? '' : ' hidden') + '><span class=\"np-px__wear-lab\">' + esc(G ? G.label : 'Garment') + ' color</span><div class=\"np-px__wear-sws\">' + stock +\n      '<label class=\"np-px__wear-sw np-px__wear-wheel' + (isCustom ? ' is-on' : '') + '\" title=\"Any color\"><i' + (isCustom ? ' style=\"background:' + cur + '\"' : '') + '></i><input type=\"color\" value=\"' + (cur || '#1f3a6e') + '\" aria-label=\"Pick any garment color\"></label></div></div>' +\n      '<p class=\"np-px__wear-note\" data-px-wear-note' + (g ? '' : ' hidden') + '></p>';\n  }\n  var wearBarEl = null;\n  function wearPx(proof) {\n    var after = $('.np-px__proof-after'); if (!after) return;\n    if (!wearBarEl) {\n      var host = $('[data-px-pvwrap]'), eyebrow = $('[data-px-pv-eyebrow]'); if (!host) return;\n      wearBarEl = document.createElement('div'); wearBarEl.className = 'np-px__wear'; wearBarEl.hidden = true;\n      host.insertBefore(wearBarEl, eyebrow || null);\n      wearBarEl.addEventListener('click', function (e) {\n        var seg = e.target.closest('[data-px-wear]'); if (seg) { wearSt().mode = seg.getAttribute('data-px-wear'); wearBarEl.innerHTML = wearBarHtml(); wearPxApply(); return; }\n        var sw = e.target.closest('[data-px-wear-color]'); if (sw) { var w = wearSt(); if (w.mode !== 'patch') w.color[w.mode] = sw.getAttribute('data-px-wear-color'); wearBarEl.innerHTML = wearBarHtml(); wearPxApply(); return; }\n        var pl = e.target.closest('[data-px-wear-place]'); if (pl) { var w2 = wearSt(); if (w2.mode !== 'patch') w2.place[w2.mode] = pl.getAttribute('data-px-wear-place'); wearBarEl.innerHTML = wearBarHtml(); wearPxApply(); }\n      });\n      var onPick = function (e) { var inp = e.target; if (!inp || inp.type !== 'color') return; var w = wearSt(); if (w.mode === 'patch') return; w.color[w.mode] = inp.value; var wheel = inp.closest('.np-px__wear-wheel'); if (wheel) { wheel.classList.add('is-on'); var iW = wheel.querySelector('i'); if (iW) iW.style.background = inp.value; } wearBarEl.querySelectorAll('.np-px__wear-sw[data-px-wear-color]').forEach(function (b) { b.classList.remove('is-on'); }); wearPxApply(); };\n      wearBarEl.addEventListener('input', onPick); wearBarEl.addEventListener('change', onPick);\n    }\n    if (window.NPWear) {\n      var tk = (cfg.type && ((cfg.type.handle || '') + ' ' + (cfg.type.label || ''))) || '';\n      NPWear.setContext({ typeKey: tk, patchH: (cfg.sizeEntered && cfg.h > 0) ? cfg.h : 0 }); /* per-type garments: crewneck = Tackle Twill only; keychains = none; C512: no hat above 2.5\" tall */\n      var wsP = wearSt();\n      if (wsP.mode !== 'patch' && !NPWear.garment(wsP.mode)) {\n        var lcP = NPWear.isHat && NPWear.isHat(wsP.mode) && NPWear.leftChest ? NPWear.leftChest() : null; /* C512: the hat was dropped for height \u2192 the left chest */\n        if (lcP) { wsP.mode = lcP.key; if (lcP.placement) wsP.place[lcP.key] = lcP.placement; } else wsP.mode = 'patch';\n      }\n    }\n    var show = !!(proof && cfg.mockup && window.NPWear && NPWear.catalog().length); /* no garments for this type (PVC keychain) \u2192 no bar */\n    if (wearBarEl.hidden === show) { wearBarEl.hidden = !show; if (show) wearBarEl.innerHTML = wearBarHtml(); }\n    else if (show) wearBarEl.innerHTML = wearBarHtml();\n    wearPxApply();\n    wearRefit();\n  }\n  function wearRefit() { /* the bar changed height (garment picked \u2192 colour row + note, note wrapped) \u2192 size the proof stage around it again */\n    if (!wearBarEl) return; var hNow = wearBarEl.hidden ? 0 : Math.round(wearBarEl.getBoundingClientRect().height);\n    if (hNow === (wearBarEl.__h || 0)) return; wearBarEl.__h = hNow;\n    if (st.mode === 'proof') requestAnimationFrame(function () { try { renderPreview(); } catch (eR) {} });\n  }\n  var wearCut = {}; /* mockup url -> transparent data url (the Sensei render is an opaque studio square) */\n  function wearPxApply() {\n    var after = $('.np-px__proof-after'); if (!after) return;\n    var w = wearSt(), layer = after.querySelector('.np-px__wear-layer'), proofOn = !$('[data-px-proof]').hidden;\n    if (w.mode === 'patch' || !proofOn || !cfg.mockup || !window.NPWear) { after.classList.remove('is-wear'); after.classList.remove('is-tile'); after.style.removeProperty('background-color'); if (layer) layer.remove(); return; }\n    if (!layer) { layer = document.createElement('div'); layer.className = 'np-px__wear-layer'; after.insertBefore(layer, after.firstChild); }\n    after.classList.add('is-wear'); var G0 = NPWear.garment(w.mode), tileMode = !!(G0 && G0.kind === 'tile'); after.classList.toggle('is-tile', tileMode); if (tileMode) after.style.setProperty('background-color', '#fff', 'important'); else after.style.removeProperty('background-color');\n    var key = cfg.mockup, cut = wearCut[key];\n    if (cut === undefined) { wearCut[key] = null; NPWear.cutFlat(key, function (u) { wearCut[key] = u || false; try { wearPxApply(); } catch (eA) {} }); }\n    var patch = cut ? cut : (cut === false ? key : null);\n    var dm = dimsFor(curShape()), ratio = dm[1] / dm[0];\n    /* PX has no size step: the patch shows at the LARGEST size the placement's max print area allows (Justin 2026-09-16 \"carry over the max print area sizes\") */\n    NPWear.render(layer, { garment: w.mode, placement: w.place[w.mode] || '', color: wearColorFor(w.mode), patch: patch, patchRatio: ratio, patchIn: (cfg.sizeEntered && cfg.w > 0) ? cfg.w : 0, onReady: function (wrapEl, info) { /* C229: true to the chosen size */\n      var note = wearBarEl && wearBarEl.querySelector('[data-px-wear-note]'); if (!note || !info) return;\n      var fmt = function (n) { return (Math.round(n * 100) / 100).toString().replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, ''); }, inch = function (n) { return fmt(n) + '\\u2033'; };\n      if (info.kind === 'tile' && info.shownIn) { var pl = (info.placement || 'front').toLowerCase(); var szW = inch(info.shownIn[0]) + ' \\u00d7 ' + inch(info.shownIn[1]), mxW = inch(info.maxIn[0]) + ' \\u00d7 ' + inch(info.maxIn[1]), chosenSz = !!(cfg.sizeEntered && cfg.w > 0); note.textContent = info.over ? 'Your ' + inch(cfg.w) + ' patch is larger than the ' + mxW + ' ' + pl + ' zone \\u2014 shown scaled to fit.' : (chosenSz ? 'Shown true to size: ' + szW + ' on the ' + info.label.toLowerCase() + ' ' + pl + ' (max print area ' + mxW + ').' : 'Shown at the largest size for a ' + info.label.toLowerCase() + ' ' + pl + ': ' + szW + ' (max print area ' + mxW + ').'); note.hidden = false; } /* one line \u2014 the AI note below already says the size is picked next */\n      else if (info.shownIn) { note.textContent = 'Shown at ' + inch(info.shownIn[0]) + ' wide.'; note.hidden = false; } else note.hidden = true;\n      wearRefit();\n    } });\n  }\n  function renderPreview() {\n    if (!cfg || !pvEl) return;\n    var proof = st.mode === 'proof', busy = isBusy();\n    var s = curShape(), d = dimsFor(s), base = pvBase();\n    var k = base / Math.max(d[0], d[1]), W = Math.round(d[0] * k), H = Math.round(d[1] * k);\n    if (proof) { W = H = Math.min(380, base + 40, st.pvMaxW || 380, st.pvMaxH || 380); } /* never larger than the wrapper (short cards) or the preview column (side-by-side) */\n    pvEl.style.width = W + 'px'; pvEl.style.height = H + 'px';\n    var c = cssFor(s, W, H);\n    var bw = !cfg.border ? 3 : Math.max(2, Math.round(base * (isMerrow() ? 0.044 : (/no border/i.test(cfg.border.label) ? 0.006 : 0.019))));\n    if (moldedT() && cfg.thread) bw = cfg.thread.none ? 0 : Math.max(2, Math.round(base * 0.024 * lbFactor())); /* C220: None = no rim */ /* C219: molded rim in the Border Color, scaled by the thickness slider */\n    else if (thickOn()) bw = Math.max(2, Math.round(bw * lbFactor()));\n    var bc = (cfg.thread && cfg.thread.hex) ? cfg.thread.hex : (cfg.border ? '#1AA86C' : (theme() === 'dark' ? 'rgba(63,224,149,.6)' : '#43b67b'));\n    var hideL = isLeatherT() ? pxLeatherBg() : null;\n    if (isLeatherT()) bc = (hideL && hideL.hex) || '#DCA05F'; /* C546 (was C219's edge ring in etchTone): leather has no ring at all (np-emb2 ringC = 0) \u2014 the rim is hide and the Etched Border is the inset burn band below */\n    pvRing.style.padding = bw + 'px'; pvRing.style.backgroundColor = bc; pvRing.style.borderRadius = c.radius;\n    var faceR = c.px ? Math.max(2, c.px - bw) + 'px' : c.inner; /* concentric corners */\n    pvRing.style.clipPath = c.clip; pvRing.style.webkitClipPath = c.clip;\n    pvRing.style.backgroundImage = (cfg.border && isMerrow()) ? 'repeating-linear-gradient(45deg, rgba(0,0,0,.25) 0 2px, rgba(255,255,255,.15) 2px 3px, transparent 3px 6px)' : 'none';\n    pvFace.style.borderRadius = faceR; pvFace.style.clipPath = c.clip; pvFace.style.webkitClipPath = c.clip;\n    pvFace.style.background = (hideL && hideL.hex) ? hideL.hex : ((cfg.bg && cfg.bg.hex) ? cfg.bg.hex : (cfg.removeBg === true ? CHECKER : '#ffffff')); /* C546: leather = its hide */\n    var safe = s.geom === 'custom' ? 0.86 : (SHAPE_SAFE[s.geom] || 0.72);\n    pvArt.style.width = pvArt.style.height = Math.round(safe * 100 * (cfg.artZoom || 1)) + '%';\n    /* C151 artwork pan: the dragged offset is a fraction of the BOX (parity with the canvas reference), but pvArt lives inside\n       the face element (position: relative, W-2bw x H-2bw), so its % size/position resolve against the FACE. Clamp from the art\n       as actually rendered (face x fill%) against the face, then apply the offset in box pixels (review 2026-09-05). */\n    var pdx = 0, pdy = 0;\n    if (s.geom !== 'custom' && (cfg.artDx || cfg.artDy) && pvArt.naturalWidth && pvArt.naturalHeight) {\n      var pctZ = Math.round(safe * 100 * (cfg.artZoom || 1)) / 100, faceWP = Math.max(10, W - bw * 2), faceHP = Math.max(10, H - bw * 2);\n      var scP = Math.min(faceWP * pctZ / pvArt.naturalWidth, faceHP * pctZ / pvArt.naturalHeight);\n      var awP = pvArt.naturalWidth * scP, ahP = pvArt.naturalHeight * scP;\n      var mxP = Math.abs(awP - faceWP) / 2 / W, myP = Math.abs(ahP - faceHP) / 2 / H;\n      cfg.artDx = Math.max(-mxP, Math.min(mxP, cfg.artDx || 0)); cfg.artDy = Math.max(-myP, Math.min(myP, cfg.artDy || 0));\n      pdx = cfg.artDx; pdy = cfg.artDy;\n    }\n    pvArt.style.left = pdx ? 'calc(50% + ' + (Math.round(pdx * W * 100) / 100) + 'px)' : '50%';\n    pvArt.style.top = pdy ? 'calc(' + (Math.round((CENTER_Y[s.geom] || 0.5) * 10000) / 100) + '% + ' + (Math.round(pdy * H * 100) / 100) + 'px)' : (Math.round((CENTER_Y[s.geom] || 0.5) * 10000) / 100) + '%';\n    if (window.__npPxPanSync) window.__npPxPanSync(); /* C151 touch-action classes before the first touch */\n    var isPlate = s.geom === 'custom' && !proof;\n    /* C546 (np-emb2 ~:9041): the leather Etched Border is a burn line INSET from the edge (5.5% of the short side), in the etch\n       tone at 92%, 2-20px at the PDP's 1200px compose \u2014 two clipped layers (tone, then hide) like the ring + face pair */\n    var lbEl = pvFace.querySelector('.np-px__lb'), lbOn = isLeatherT() && !isPlate && !!(cfg.border && /etched/i.test(cfg.border.label || ''));\n    if (lbOn) {\n      if (!lbEl) { lbEl = document.createElement('div'); lbEl.className = 'np-px__lb'; lbEl.appendChild(document.createElement('i')); pvFace.insertBefore(lbEl, pvArt); }\n      var lbInP = Math.round(Math.min(W, H) * 0.055), lbWP = Math.max(1, Math.round(Math.max(2, Math.min(20, lbThick() * 2)) * Math.max(W, H) / 1128));\n      var lbClip = c.clip || 'none', lbR = c.px ? Math.max(0, c.px - bw - lbInP) + 'px' : c.inner, lbRi = c.px ? Math.max(0, c.px - bw - lbInP - lbWP) + 'px' : c.inner;\n      lbEl.hidden = false;\n      lbEl.style.cssText = 'position:absolute;inset:' + lbInP + 'px;background:' + pxLeatherEtchHex() + ';opacity:.92;pointer-events:none;border-radius:' + lbR + ';clip-path:' + lbClip + ';-webkit-clip-path:' + lbClip;\n      lbEl.firstChild.style.cssText = 'position:absolute;inset:' + lbWP + 'px;background:' + ((hideL && hideL.hex) || '#DCA05F') + ';border-radius:' + lbRi + ';clip-path:' + lbClip + ';-webkit-clip-path:' + lbClip;\n    } else if (lbEl) lbEl.hidden = true;\n    if (isPlate) {\n      pvRing.style.padding = '0'; pvRing.style.backgroundColor = 'transparent'; pvRing.style.backgroundImage = 'none'; pvRing.style.borderRadius = '0'; pvRing.style.clipPath = 'none'; pvRing.style.webkitClipPath = 'none';\n      pvFace.style.borderRadius = '0'; pvFace.style.clipPath = 'none'; pvFace.style.webkitClipPath = 'none'; pvFace.style.background = 'transparent';\n      pvArt.style.width = pvArt.style.height = '100%'; pvArt.style.top = '50%'; pvArt.style.left = '50%';\n    }\n    var src = cfg.art ? (isLeatherT() && !isPlate ? etchUrl(cfg.art.local || artDisplayUrl(1000)) : (cfg.art.local || (isPlate ? plateUrl(640, false) : artDisplayUrl(1000)))) : ''; /* C546: leather shows the etched art */\n    if (src && pvArt.getAttribute('src') !== src) { st.pvTries = 0; st.artReady = false; pvArt.setAttribute('src', src); if (nextBtn && st.mode === 'options' && !cfg.error) nextBtn.hidden = true; /* Next waits for the new rendition too */ }\n    pvArt.classList.toggle('is-loading', !st.artReady);\n    pvArt.style.visibility = src ? 'visible' : 'hidden';\n    if (pvBusy) pvBusy.hidden = !(busy || !st.artReady || (isPlate && !src)); /* futuristic scan while the rendition / plate composes (Justin 2026-09-05) */\n    if (nextBtn && pvBusy && !pvBusy.hidden && !proof && !cfg.error) nextBtn.hidden = true; /* the ring overlay is up: never show Next under it (Justin 2026-09-08) */\n    root.classList.toggle('is-busy', busy);\n    proofEl.hidden = !proof;\n    if (proof) {\n      var pa = $('[data-px-proof-after]'), po = $('[data-px-proof-orig]');\n      if (pa && pa.getAttribute('src') !== cfg.mockup) pa.setAttribute('src', cfg.mockup || '');\n      if (po) po.setAttribute('src', cfg.refPreview || cfg.refUrl || artDisplayUrl(1000)); /* the composed digital mockup on white, not the grey Sensei reference */\n      setSlider(cfg.slider);\n    }\n    try { wearPx(proof); } catch (eWp) {} /* C224: See this on a Patch | Hat | Polo */\n    if (pvEyebrow) { pvEyebrow.textContent = proof ? 'AI proof' : 'Live preview'; pvEyebrow.classList.toggle('is-live', !proof); }\n    if (pvMeta) { if (proof) { pvMeta.className = 'np-px__pv-meta np-px__pv-meta--note'; pvMeta.innerHTML = '<i>i</i><span><b>This is an AI-rendered proof.</b> ' + pxAiNote() + '</span>'; pvMeta.hidden = false; } else { pvMeta.className = 'np-px__pv-meta'; pvMeta.textContent = ''; pvMeta.hidden = true; } } /* Justin 2026-09-08: the PDP's AI-rendering note under the proof */\n    if (pvTags) pvTags.innerHTML = ''; /* applied-edit tags removed (Justin 2026-09-05) */\n  }\n\n  /* C151 artwork pan (Justin 2026-09-05): drag the zoomed artwork in the live preview; each axis snaps to the centre\n     line within 3.5% of the box. Only armed when the fill is not 100% and the shape is not Design's Shape. */\n  (function wireArtPan() {\n    if (!pvEl || !pvArt) return;\n    var PAN_SNAP = 0.035, ZMIN = 0.6, ZMAX = 2.5, drag = null, pinch = null, pts = {};\n    var PINCH = true; /* Justin 2026-09-05: pinch = Artwork fill stays ON for Patch Express (\"add pinch back to patch express for mobile\"); the PDPs and the lab keep it off */\n    function hasArt() { return !!(cfg && cfg.art && st.mode !== 'proof' && !isBusy() && curShape().geom !== 'custom'); }\n    function pannable() { return hasArt(); } /* Justin 2026-09-05: drag at ANY fill; the clamp keeps the art inside the face */\n    function zoomed() { return Math.abs((cfg.artZoom || 1) - 1) > 0.001; }\n    function guide() { var g = pvEl.querySelector('.np-px__panguide'); if (!g) { g = document.createElement('i'); g.className = 'np-px__panguide'; pvEl.appendChild(g); } g.style.setProperty('--pan-cy', ((CENTER_Y[curShape().geom] || 0.5) * 100) + '%'); return g; }\n    function sync() { var a = hasArt(); pvEl.classList.toggle('np-px__pv--pinch', a && PINCH); pvEl.classList.toggle('np-px__pv--pan', a && pannable()); pvEl.classList.toggle('np-px__pv--free', a && zoomed()); }\n    window.__npPxPanSync = sync;\n    function count() { return Object.keys(pts).length; }\n    function dist() { var k = Object.keys(pts); if (k.length < 2) return 0; var a = pts[k[0]], b = pts[k[1]]; return Math.hypot(a.x - b.x, a.y - b.y); }\n    function setZoom(z) {\n      z = Math.max(ZMIN, Math.min(ZMAX, Math.round(z * 20) / 20));\n      if (Math.abs(z - (cfg.artZoom || 1)) < 0.001) return false;\n      cfg.artZoom = z; var pct = Math.round(z * 100); if (Math.abs((cfg.artZoom || 1) - 1) < 0.001) { cfg.artDx = 0; cfg.artDy = 0; } /* 100% = centred again */\n      var zs = $('[data-px-artzoom]'), zv = $('[data-px-artzoom-val]');\n      if (zs) { zs.value = pct; zs.style.cssText = zoomTrack(z); } if (zv) zv.textContent = pct + '%';\n      return true;\n    }\n    function schedule() { if (schedule.raf) return; schedule.raf = true; requestAnimationFrame(function () { schedule.raf = false; renderPreview(); }); }\n    pvEl.addEventListener('pointerover', sync);\n    window.__npPxPanSync = sync; /* renderPreview calls this after every paint so the cursor / touch-action / user-drag state never waits for a pointerover */\n    pvArt.setAttribute('draggable', 'false');\n    pvEl.addEventListener('dragstart', function (e) { e.preventDefault(); }); /* Justin 2026-09-05 (shape step: 'I cant drag'): a browser that starts a NATIVE image drag cancels the pointer sequence \u2014 block it outright, every step, every browser */\n    pvEl.addEventListener('contextmenu', function (e) { if (hasArt()) e.preventDefault(); }); /* a long-press must not open the image callout / context menu mid-pan */\n    pvEl.addEventListener('pointerdown', function (e) {\n      if (e.button || !hasArt()) return;\n      var t = e.target; if (!(t === pvArt || (t.closest && t.closest('[data-px-pv-face], [data-px-pv-ring]')))) return;\n      pts[e.pointerId] = { x: e.clientX, y: e.clientY };\n      try { pvEl.setPointerCapture(e.pointerId); } catch (eC) {}\n      if (count() >= 2) { /* second finger: pinch = Artwork fill \u2014 OFF (PINCH flag) */\n        if (!PINCH) return;\n        if (drag) { pvEl.classList.remove('is-panning'); drag = null; }\n        pinch = { d0: dist() || 1, z0: cfg.artZoom || 1 };\n        pvEl.classList.add('is-pinching');\n        e.preventDefault(); return;\n      }\n      if (!pannable()) return;\n      var r = pvEl.getBoundingClientRect(); if (!r.width || !r.height) return;\n      drag = { id: e.pointerId, x: e.clientX, y: e.clientY, dx0: cfg.artDx || 0, dy0: cfg.artDy || 0, w: r.width, h: r.height }; /* the drag belongs to THIS pointer (review 2026-09-05) */\n      pvEl.classList.add('is-panning'); sync();\n      var g = guide(); g.classList.toggle('is-snapx', !cfg.artDx); g.classList.toggle('is-snapy', !cfg.artDy);\n      e.preventDefault();\n    });\n    function move(e) {\n      if (pts[e.pointerId]) pts[e.pointerId] = { x: e.clientX, y: e.clientY };\n      if (pinch) { if (count() >= 2 && setZoom(pinch.z0 * dist() / pinch.d0)) schedule(); return; }\n      if (!drag || e.pointerId !== drag.id) return; /* a stray second finger must not hijack the pan */\n      if (!drag.moved && Math.abs(e.clientX - drag.x) + Math.abs(e.clientY - drag.y) <= 2) return; drag.moved = true; /* 2px dead-zone: a tap never rewrites the offset */\n      var rx = drag.dx0 + (e.clientX - drag.x) / drag.w, ry = drag.dy0 + (e.clientY - drag.y) / drag.h;\n      cfg.artDx = Math.abs(rx) < PAN_SNAP ? 0 : rx; cfg.artDy = Math.abs(ry) < PAN_SNAP ? 0 : ry;\n      var g = pvEl.querySelector('.np-px__panguide'); if (g) { g.classList.toggle('is-snapx', !cfg.artDx); g.classList.toggle('is-snapy', !cfg.artDy); }\n      schedule();\n    }\n    function end(e) {\n      delete pts[e.pointerId];\n      if (pinch) { if (count() < 2) { pvEl.classList.remove('is-pinching'); pinch = null; sync(); renderPreview(); } return; }\n      if (!drag || e.pointerId !== drag.id) return; drag = null; /* only the owning pointer ends the pan */\n      pvEl.classList.remove('is-panning');\n      try { pvEl.releasePointerCapture(e.pointerId); } catch (eR) {}\n      renderPreview(); /* clamps to the face and writes the final offset back */\n    }\n    pvEl.addEventListener('pointermove', move);\n    pvEl.addEventListener('pointerup', end);\n    pvEl.addEventListener('pointercancel', end);\n  })();\n  function setSlider(v) {\n    cfg.slider = v;\n    var before = $('[data-px-proof-before]'), div = $('[data-px-proof-div]'), range = $('[data-px-proof-slider]');\n    if (before) { before.style.clipPath = 'inset(0 ' + (100 - v) + '% 0 0)'; before.style.webkitClipPath = 'inset(0 ' + (100 - v) + '% 0 0)'; }\n    if (div) div.style.left = v + '%';\n    if (range && String(range.value) !== String(v)) range.value = v;\n  }\n  var proofRange = $('[data-px-proof-slider]');\n  if (proofRange) proofRange.addEventListener('input', function () { if (cfg) setSlider(Number(proofRange.value)); });\n  /* finger / mouse drag anywhere on the compare (the hidden range input alone is unreliable under touch) (Justin 2026-09-05) */\n  var proofBox = $('[data-px-proof]'), proofDrag = false;\n  function proofFromX(e) { var r = proofBox.getBoundingClientRect(); if (!r.width) return; var v = Math.max(0, Math.min(100, (e.clientX - r.left) / r.width * 100)); setSlider(Math.round(v * 10) / 10); }\n  function proofDragEnd(e) { if (!proofDrag) return; proofDrag = false; try { proofBox.releasePointerCapture(e.pointerId); } catch (x) {} }\n  if (proofBox && window.PointerEvent) {\n    proofBox.addEventListener('pointerdown', function (e) { if (!cfg || proofBox.hidden || (e.button && e.button !== 0)) return; proofDrag = true; try { proofBox.setPointerCapture(e.pointerId); } catch (x) {} proofFromX(e); e.preventDefault(); });\n    proofBox.addEventListener('pointermove', function (e) { if (!proofDrag) return; proofFromX(e); e.preventDefault(); });\n    proofBox.addEventListener('pointerup', proofDragEnd); proofBox.addEventListener('pointercancel', proofDragEnd);\n    proofBox.addEventListener('dragstart', function (e) { e.preventDefault(); });\n  }\n  if (pvWrap && typeof ResizeObserver !== 'undefined') { var pvRO = new ResizeObserver(function () { if (cfg && root.getAttribute('data-px-phase') === 'config') renderPreview(); }); pvRO.observe(pvWrap); }\n\n  /* ---- HUD loader (the project's futuristic loader): green for the studio, purple for AI ---- */\n  /* mobile: the HUD sits over the (sticky) patch preview, not the viewport centre (Justin 2026-09-05) */\n  function placeHud() {\n    /* every HUD (upload, AI edit, proof) centres on the patch preview, desktop and mobile (Justin 2026-09-05) */\n    if (!loader || loader.hidden) return;\n    var pv = $('[data-px-pv]') || $('[data-px-patch]'); if (!pv) { loader.style.removeProperty('--px-hud-cy'); return; }\n    var r = pv.getBoundingClientRect(), lr = loader.getBoundingClientRect();\n    if (!r.height || !lr.height) return;\n    /* pin the RING's centre to the image centre (labels hang below), whatever the shape */\n    var ring = loader.querySelector('.np-px__hud'), rh = ring ? ring.getBoundingClientRect().height : 0;\n    var top = r.top + r.height / 2 - lr.top - rh / 2;\n    top = Math.max(12, Math.min(lr.height - rh - 96, top));\n    loader.style.setProperty('--px-hud-cy', Math.round(top) + 'px');\n  }\n  window.addEventListener('scroll', placeHud, { passive: true }); window.addEventListener('resize', placeHud);\n  function hud(label, line, purple) {\n    if (!loader) return;\n    loader.hidden = false;\n    loader.classList.toggle('is-purple', !!purple);\n    root.classList.add('is-loading'); root.classList.remove('is-failed');\n    if (loaderStep) loaderStep.textContent = label;\n    if (loaderPct) { loaderPct.textContent = line || ''; loaderPct.classList.toggle('is-text', !/^\\d+%$/.test(line || '')); }\n    say(label + (line ? '. ' + line : ''));\n    placeHud(); requestAnimationFrame(placeHud);\n  }\n  var etaT = null;\n  var etaT2 = null, etaT3 = null; /* C217 */\n  function hudEta(text) { /* Justin 2026-09-08: the generating HUD says how long it usually takes (PDP parity) */\n    if (!loader) return;\n    var el = loader.querySelector('.np-px__loader-eta');\n    if (!text) { if (el) el.remove(); if (etaT) { clearTimeout(etaT); etaT = null; } return; }\n    if (!el) { el = document.createElement('p'); el.className = 'np-px__loader-eta'; (loaderPct && loaderPct.parentNode ? loaderPct.parentNode : loader).appendChild(el); }\n    el.textContent = text;\n  }\n  function hudLine(line) { if (loaderPct && !loader.hidden) { loaderPct.textContent = line; loaderPct.classList.toggle('is-text', !/^\\d+%$/.test(line || '')); } var bs = $('[data-px-busy-status]'); if (bs) bs.textContent = line; }\n  function hudOff() { hudEta(''); hideLoader(); if (loader) loader.classList.remove('is-purple'); if (loaderCard) { loaderCard.hidden = true; loaderCard.innerHTML = ''; } }\n  function startCycle(msgs, ms) {\n    stopCycle();\n    var i = 0;\n    var tick = function () { var m = msgs[i % msgs.length]; i++; hudLine(m); var b = $('[data-px-busy-status]'); if (b) b.textContent = m; };\n    tick();\n    cycleT = setInterval(tick, ms);\n  }\n  function stopCycle() { if (cycleT) clearInterval(cycleT); cycleT = null; }\n\n  /* ---- artwork analysis: the lab's analyzeArtwork metrics, ported 1:1 (96px raster, border-dominant\n     background exclusion with the 15% floor, >>4 colour buckets, sat/hue, gradient/edge fractions) ---- */\n  /* C222 (Justin 2026-09-15, \"if I remove background why is cropped rectangle not getting thin?\"): cfg.art.ratio came from the\n     untrimmed upload probe only. This measures the OPAQUE bounding box of the rendition the customer actually sees (imgix\n     trim + bg-remove), so the cropped shapes and the tile stamps follow the artwork as it now stands. */\n  function alphaRatio(img) {\n    var W0 = img.naturalWidth || img.width, H0 = img.naturalHeight || img.height; if (!W0 || !H0) return 0;\n    var S = 256, r = Math.min(1, S / Math.max(W0, H0)), w = Math.max(1, Math.round(W0 * r)), h = Math.max(1, Math.round(H0 * r));\n    var cv = document.createElement('canvas'); cv.width = w; cv.height = h; var cx = cv.getContext('2d'); cx.drawImage(img, 0, 0, w, h);\n    var d = cx.getImageData(0, 0, w, h).data, x0 = w, y0 = h, x1 = -1, y1 = -1;\n    for (var y = 0; y < h; y++) for (var x = 0; x < w; x++) { if (d[(y * w + x) * 4 + 3] >= 24) { if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y; } }\n    if (x1 < 0) return H0 / W0; /* fully transparent \u2014 keep the frame */\n    var bw = x1 - x0 + 1, bh = y1 - y0 + 1;\n    if (bw >= w * 0.98 && bh >= h * 0.98) return H0 / W0; /* opaque image (no alpha to trim by) \u2014 the natural frame IS the artwork */\n    return bh / bw;\n  }\n  function remeasureArt() {\n    if (!cfg || !cfg.art || cfg.art.local) return;\n    var dsrc = artDisplayUrl(1000); if (!dsrc || st.ratioSrc === dsrc) return;\n    st.ratioSrc = dsrc;\n    var mim = new Image(); mim.crossOrigin = 'anonymous';\n    mim.onload = function () { try { if (!cfg || !cfg.art || artDisplayUrl(1000) !== dsrc) return; var nr = alphaRatio(mim); if (nr && isFinite(nr) && Math.abs((cfg.art.ratio || 0) - nr) > 0.005) { cfg.art.ratio = nr; renderAll(); } } catch (eR) {} };\n    mim.onerror = function () { if (st.ratioSrc === dsrc) st.ratioSrc = null; };\n    mim.src = dsrc;\n  }\n  function analyzeArt(img) {\n    var S = 96, cv = document.createElement('canvas'); cv.width = S; cv.height = S;\n    var cx = cv.getContext('2d');\n    var r = Math.min(S / img.width, S / img.height);\n    var w = Math.max(1, Math.round(img.width * r)), h = Math.max(1, Math.round(img.height * r));\n    cx.drawImage(img, 0, 0, w, h);\n    var data = cx.getImageData(0, 0, w, h).data;\n    var bKey = function (o) { return (data[o] >> 4) + ',' + (data[o + 1] >> 4) + ',' + (data[o + 2] >> 4); };\n    var borderB = {}, bTot = 0;\n    var bAdd = function (o) { if (data[o + 3] >= 128) { var kB = bKey(o); borderB[kB] = (borderB[kB] || 0) + 1; bTot++; } };\n    for (var xB = 0; xB < w; xB++) { bAdd(xB * 4); bAdd(((h - 1) * w + xB) * 4); }\n    for (var yB = 0; yB < h; yB++) { bAdd((yB * w) * 4); bAdd((yB * w + w - 1) * 4); }\n    var bgKey = null, bgMax = 0;\n    for (var kB2 in borderB) { if (borderB[kB2] > bgMax) { bgMax = borderB[kB2]; bgKey = kB2; } }\n    if (!(bTot && bgMax / bTot > 0.5)) bgKey = null;\n    var bgParts = bgKey ? bgKey.split(',') : null;\n    var isBgPx = function (o) { if (!bgParts) return false; return Math.abs((data[o] >> 4) - bgParts[0]) <= 1 && Math.abs((data[o + 1] >> 4) - bgParts[1]) <= 1 && Math.abs((data[o + 2] >> 4) - bgParts[2]) <= 1; };\n    if (bgParts) {\n      var keepPx = 0, totPx = 0;\n      for (var iF = 0; iF < data.length; iF += 4) { if (data[iF + 3] < 128) continue; totPx++; if (!isBgPx(iF)) keepPx++; }\n      if (!keepPx || keepPx / Math.max(1, totPx) < 0.15) bgParts = null;\n    }\n    /* a solid field behind the art = the lab's excluded background bucket (opaque, covering the border) */\n    cfg.solid = (bgParts && bTot / Math.max(1, 2 * (w + h) - 4) > 0.85) ? [(bgParts[0] << 4) + 8, (bgParts[1] << 4) + 8, (bgParts[2] << 4) + 8] : null;\n    var buckets = {}, opaque = 0, artPx = 0, hueBins = [], satPx = 0;\n    /* C517 (Justin 2026-10-27, a blurry WSU cougar in one maroon listed PMS 201 C + 194 C + 7419 C + 695 C): a soft or\n       anti-aliased EDGE is a blend of the colours either side of it, not a colour of the design. A blend pixel sits on the\n       straight line between two clearly different pixels 1-2 px away across it, or is a half-transparent cut-out edge next\n       to solid art of another colour. A swatch that is mostly blend pixels is dropped when its colour is explained: it lies\n       between two kept colours, between a kept colour and the background field, or is a kept colour faded toward grey /\n       white / black. A thin real colour (a gold chain, 90% edge pixels at this size) is not a shade of anything kept, so it\n       stays. Art touching a mostly transparent image edge is not a field, so it stays in the swatches; a solid dark or\n       coloured field is offered after the art colours (white / light grey cards stay out). Only the swatches use these;\n       every metric and verdict counts exactly as before. */\n    var pBk517 = {}, fld517 = { n: 0, r: 0, g: 0, b: 0 }, ring517 = 2 * (w + h) - 4, clear517 = bTot < 0.5 * ring517;\n    var blend517 = function (o) {\n      var p = o >> 2, x = p % w, y = (p - x) / w, ax, ay, bx, by, oa, ob, er, eg, eb, t, k, d, dx, dy, edge = false, other = false;\n      if (data[o + 3] < 230) {\n        for (ay = y - 2; ay <= y + 2; ay++) for (ax = x - 2; ax <= x + 2; ax++) {\n          if (ax < 0 || ay < 0 || ax >= w || ay >= h) { edge = true; continue; }\n          oa = (ay * w + ax) * 4;\n          if (data[oa + 3] < 128) { if (Math.abs(ax - x) <= 1 && Math.abs(ay - y) <= 1) edge = true; }\n          else if (data[oa + 3] >= 230 && Math.abs(data[o] - data[oa]) + Math.abs(data[o + 1] - data[oa + 1]) + Math.abs(data[o + 2] - data[oa + 2]) >= 40) other = true;\n        }\n        if (edge && other) return true;\n      }\n      for (k = 1; k <= 2; k++) for (d = 0; d < 4; d++) {\n        dx = d === 1 ? 0 : k; dy = d === 0 ? 0 : (d === 3 ? -k : k);\n        ax = x - dx; ay = y - dy; bx = x + dx; by = y + dy;\n        if (ax < 0 || bx >= w || ay < 0 || ay >= h || by < 0 || by >= h) continue;\n        oa = (ay * w + ax) * 4; ob = (by * w + bx) * 4;\n        if (data[oa + 3] < 128 || data[ob + 3] < 128) continue;\n        er = data[ob] - data[oa]; eg = data[ob + 1] - data[oa + 1]; eb = data[ob + 2] - data[oa + 2];\n        if (Math.abs(er) + Math.abs(eg) + Math.abs(eb) < 90) continue;\n        t = ((data[o] - data[oa]) * er + (data[o + 1] - data[oa + 1]) * eg + (data[o + 2] - data[oa + 2]) * eb) / (er * er + eg * eg + eb * eb);\n        if (t < 0.12 || t > 0.88) continue;\n        if (Math.abs(data[o] - data[oa] - t * er) + Math.abs(data[o + 1] - data[oa + 1] - t * eg) + Math.abs(data[o + 2] - data[oa + 2] - t * eb) <= 30) return true;\n      }\n      return false;\n    };\n    for (var hb = 0; hb < 24; hb++) hueBins.push(0);\n    for (var i = 0; i < data.length; i += 4) {\n      if (data[i + 3] < 128) continue;\n      opaque++;\n      if (clear517 || !isBgPx(i)) { var k517 = (data[i] >> 4) + ',' + (data[i + 1] >> 4) + ',' + (data[i + 2] >> 4), pb517 = pBk517[k517] = pBk517[k517] || { n: 0, r: 0, g: 0, b: 0, nb: 0 }; pb517.n++; pb517.r += data[i]; pb517.g += data[i + 1]; pb517.b += data[i + 2]; if (blend517(i)) pb517.nb++; } else { fld517.n++; fld517.r += data[i]; fld517.g += data[i + 1]; fld517.b += data[i + 2]; }\n      if (isBgPx(i)) continue;\n      artPx++;\n      var key = (data[i] >> 4) + ',' + (data[i + 1] >> 4) + ',' + (data[i + 2] >> 4);\n      var bk = buckets[key] = buckets[key] || { n: 0, r: 0, g: 0, b: 0 };\n      bk.n++; bk.r += data[i]; bk.g += data[i + 1]; bk.b += data[i + 2];\n      var rH = data[i] / 255, gH = data[i + 1] / 255, bH = data[i + 2] / 255;\n      var mxH = Math.max(rH, gH, bH), mnH = Math.min(rH, gH, bH), dH = mxH - mnH;\n      if (mxH > 0.15 && (mxH ? dH / mxH : 0) > 0.25) {\n        satPx++;\n        var hueD = 0;\n        if (dH) { if (mxH === rH) hueD = ((gH - bH) / dH) % 6; else if (mxH === gH) hueD = (bH - rH) / dH + 2; else hueD = (rH - gH) / dH + 4; hueD *= 60; if (hueD < 0) hueD += 360; }\n        hueBins[Math.min(23, Math.floor(hueD / 15))]++;\n      }\n    }\n    var hueUsed = 0; for (var hB = 0; hB < 24; hB++) if (satPx && hueBins[hB] / satPx > 0.03) hueUsed++;\n    var grads = 0, edges = 0, np2 = 0;\n    for (var yy2 = 0; yy2 < h - 1; yy2++) for (var xx2 = 0; xx2 < w - 1; xx2++) {\n      var o2 = (yy2 * w + xx2) * 4;\n      if (data[o2 + 3] < 128) continue;\n      if (isBgPx(o2)) continue;\n      np2++;\n      var l0 = 0.299 * data[o2] + 0.587 * data[o2 + 1] + 0.114 * data[o2 + 2];\n      var oR = o2 + 4, oD = o2 + w * 4;\n      var dm = Math.max(Math.abs(l0 - (0.299 * data[oR] + 0.587 * data[oR + 1] + 0.114 * data[oR + 2])), Math.abs(l0 - (0.299 * data[oD] + 0.587 * data[oD + 1] + 0.114 * data[oD + 2])));\n      if (dm > 40) edges++; else if (dm > 6) grads++;\n    }\n    /* dominant art colour (for Match my artwork) = the biggest non-background bucket's mean */\n    var domKey = null, domN = 0;\n    for (var kD in buckets) if (buckets[kD].n > domN) { domN = buckets[kD].n; domKey = kD; }\n    cfg.dominant = domKey ? [Math.round(buckets[domKey].r / domN), Math.round(buckets[domKey].g / domN), Math.round(buckets[domKey].b / domN)] : null;\n    cfg.metrics = { colors: Object.keys(buckets).length, satFrac: artPx ? satPx / artPx : 0, hueBins: hueUsed, grad: np2 ? grads / np2 : 0, edge: np2 ? edges / np2 : 0 };\n    /* detected palette = np-emb2 analyzeArtwork's rules: top buckets >= 0.5% of opaque px, near-duplicate collapse\n       (greys collapse hard), one entry per PMS name, max 8 \u2014 shown as \"Colors in your artwork\" on the colour steps */\n    var mean517 = function (q) { return [q.r / q.n, q.g / q.n, q.b / q.n]; };\n    var cand517 = Object.keys(pBk517).filter(function (k) { return pBk517[k].n / Math.max(1, opaque) >= 0.005; });\n    var solid517 = cand517.filter(function (k) { return pBk517[k].nb < 0.6 * pBk517[k].n; }).map(function (k) { return mean517(pBk517[k]); });\n    var fldC517 = (!clear517 && fld517.n) ? mean517(fld517) : null;\n    var seg517 = function (c, a, b) { /* c on the segment a -> b (not at either end), within 30 */\n      var e0 = b[0] - a[0], e1 = b[1] - a[1], e2 = b[2] - a[2], ee = e0 * e0 + e1 * e1 + e2 * e2; if (ee < 1) return false;\n      var t = ((c[0] - a[0]) * e0 + (c[1] - a[1]) * e1 + (c[2] - a[2]) * e2) / ee; if (t < 0.08 || t > 0.92) return false;\n      return Math.abs(c[0] - a[0] - t * e0) + Math.abs(c[1] - a[1] - t * e1) + Math.abs(c[2] - a[2] - t * e2) <= 30;\n    };\n    var expl517 = function (c) {\n      for (var s = 0; s < solid517.length; s++) {\n        var K = solid517[s];\n        for (var s2 = s + 1; s2 < solid517.length; s2++) if (seg517(c, K, solid517[s2])) return true;\n        if (fldC517 && seg517(c, K, fldC517)) return true;\n        for (var tq = 0.08; tq <= 0.921; tq += 0.02) { /* K faded toward some grey level */\n          var gq = Math.max(0, Math.min(255, ((c[0] - (1 - tq) * K[0]) + (c[1] - (1 - tq) * K[1]) + (c[2] - (1 - tq) * K[2])) / (3 * tq)));\n          if (Math.abs(c[0] - (1 - tq) * K[0] - tq * gq) + Math.abs(c[1] - (1 - tq) * K[1] - tq * gq) + Math.abs(c[2] - (1 - tq) * K[2] - tq * gq) <= 30) return true;\n        }\n      }\n      return false;\n    };\n    var pal517 = solid517.length ? cand517.filter(function (k) { var q = pBk517[k]; return q.nb < 0.6 * q.n || !expl517(mean517(q)); }) : []; /* nothing solid (an all-edge sketch) = the old palette */\n    var fldHex517 = '';\n    if (pal517.length && fldC517 && fld517.n / Math.max(1, opaque) >= 0.005) {\n      var fq517 = fldC517.map(Math.round);\n      if (Math.max(fq517[0], fq517[1], fq517[2]) - Math.min(fq517[0], fq517[1], fq517[2]) >= 24 || 0.299 * fq517[0] + 0.587 * fq517[1] + 0.114 * fq517[2] <= 80) fldHex517 = ('#' + fq517.map(function (v) { return ('0' + v.toString(16)).slice(-2); }).join('')).toUpperCase();\n    }\n    var palB517 = pal517.length ? pBk517 : buckets;\n    var topC = (pal517.length ? pal517 : Object.keys(buckets)).map(function (k) { return palB517[k]; }).sort(function (a, b) { return b.n - a.n; }).filter(function (b) { return b.n / Math.max(1, opaque) >= 0.005; }).slice(0, 24)\n      .map(function (b) { function hx(v) { return ('0' + Math.round(v / b.n).toString(16)).slice(-2); } return ('#' + hx(b.r) + hx(b.g) + hx(b.b)).toUpperCase(); });\n    if (fldHex517 && topC.indexOf(fldHex517) < 0) topC.push(fldHex517); /* C517: a solid dark or coloured field, after the art colours */\n    var outC = [];\n    topC.forEach(function (hex) {\n      var rr = parseInt(hex.slice(1, 3), 16), gg = parseInt(hex.slice(3, 5), 16), bb = parseInt(hex.slice(5, 7), 16);\n      var chN = Math.max(rr, gg, bb) - Math.min(rr, gg, bb);\n      var dupe = outC.some(function (o) {\n        var orr = parseInt(o.slice(1, 3), 16), ogg = parseInt(o.slice(3, 5), 16), obb = parseInt(o.slice(5, 7), 16);\n        var oCh = Math.max(orr, ogg, obb) - Math.min(orr, ogg, obb);\n        if (chN < 28 && oCh < 28) { var lN = 0.299 * rr + 0.587 * gg + 0.114 * bb, lO = 0.299 * orr + 0.587 * ogg + 0.114 * obb; return Math.abs(lN - lO) < 72; }\n        return Math.abs(rr - orr) + Math.abs(gg - ogg) + Math.abs(bb - obb) < 36;\n      });\n      if (!dupe) outC.push(hex);\n    });\n    cfg.paletteHex = outC; /* named + deduped by PMS at render time via paletteList() \u2014 the hub's PMS table can arrive after this analysis */\n    try { console.log('[patch-express] art metrics', cfg.metrics, 'solid', !!cfg.solid); } catch (e) {}\n  }\n  function hexToRgb(h) { h = String(h || '').replace('#', ''); if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2]; return [parseInt(h.substr(0, 2), 16) || 0, parseInt(h.substr(2, 2), 16) || 0, parseInt(h.substr(4, 2), 16) || 0]; }\n  function lum(rgb) { return (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255; }\n  function nearestColor(rgb, list) {\n    var best = null, bd = Infinity;\n    (list || []).forEach(function (c) { if (!c.hex) return; var p = hexToRgb(c.hex); var dd = (rgb[0] - p[0]) * (rgb[0] - p[0]) * 2 + (rgb[1] - p[1]) * (rgb[1] - p[1]) * 4 + (rgb[2] - p[2]) * (rgb[2] - p[2]) * 3; if (dd < bd) { bd = dd; best = c; } });\n    return best;\n  }\n  /* C471: nearest STOCK colour in CIELAB \u0394E76 (verbatim np-emb2 stockNearest471) \u2014 artwork colours on a stock-only\n     background are offered as the felt that will really be used */\n  function stockNearest471(hex, list) {\n    var toLab = function (hx) { var h = String(hx || '').replace('#', ''); if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2]; var c = [parseInt(h.substr(0, 2), 16), parseInt(h.substr(2, 2), 16), parseInt(h.substr(4, 2), 16)]; if (c.some(function (v) { return isNaN(v); })) return null; var lin = c.map(function (v) { v /= 255; return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }); var X = (lin[0] * 0.4124 + lin[1] * 0.3576 + lin[2] * 0.1805) / 0.95047, Y = lin[0] * 0.2126 + lin[1] * 0.7152 + lin[2] * 0.0722, Z = (lin[0] * 0.0193 + lin[1] * 0.1192 + lin[2] * 0.9505) / 1.08883; var f = function (t) { return t > 0.008856 ? Math.cbrt(t) : 7.787 * t + 16 / 116; }; return [116 * f(Y) - 16, 500 * (f(X) - f(Y)), 200 * (f(Y) - f(Z))]; };\n    var lab = toLab(hex), best = null, bd = Infinity;\n    if (!lab) return null;\n    (list || []).forEach(function (c) { var cl = c && c.hex ? toLab(c.hex) : null; if (!cl) return; var dd = (lab[0] - cl[0]) * (lab[0] - cl[0]) + (lab[1] - cl[1]) * (lab[1] - cl[1]) + (lab[2] - cl[2]) * (lab[2] - cl[2]); if (dd < bd) { bd = dd; best = c; } });\n    return best;\n  }\n  function findColor(list, label) { var f = null; (list || []).forEach(function (c) { if (!f && String(c.label).toLowerCase() === label.toLowerCase()) f = c; }); return f || (list && list[0]) || null; }\n\n  /* ---- recommendation: the lab's computeReco, with the central gate verdict for photo / dense / fine detail ---- */\n  function gateVerdict() {\n    if (!GATE_URL || !cfg || !cfg.art) return Promise.resolve(null);\n    var ctl = (typeof AbortController === 'function') ? new AbortController() : null;\n    var timer = ctl ? setTimeout(function () { try { ctl.abort(); } catch (e) {} }, 8000) : null;\n    return fetch(GATE_URL, { method: 'POST', mode: 'cors', credentials: 'omit', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ imageUrl: artDisplayUrl(), typeKey: 'embroidery-2-0', env: 'live', surface: 'patch-express' }), signal: ctl ? ctl.signal : undefined })\n      .then(function (r) { return r.json(); })\n      .then(function (res) { if (timer) clearTimeout(timer); try { console.log('[patch-express] gate', (res && res.verdict) || 'pass'); } catch (e) {} return (res && res.ok && res.verdict) ? String(res.verdict) : null; })\n      .catch(function () { if (timer) clearTimeout(timer); return null; });\n  }\n  function recommend() {\n    /* SAME LOGIC AS THE PDPs (Justin 2026-09-05): the central gate (typeKey embroidery-2-0 \u2014 the embroidered\n       PDP's own upload gates) decides whether embroidery can be done. Gate pass \u2192 EMBROIDERED FIRST (most\n       popular), with the lab's metric pick as the \"also great\" alternate. Photo \u2192 Printed only; dense \u2192\n       Printed (+ Print & Stitch when the hub lists it); fine detail \u2192 Print & Stitch (if listed) + Printed. */\n    var m = cfg.metrics || { colors: 0, satFrac: 0, hueBins: 99, edge: 0, grad: 0 }, v = cfg.verdict, picks, score = 96, chips;\n    var tPS = null; TYPES.forEach(function (t) { if (/print\\s*(&|and)\\s*stitch/i.test(t.label)) tPS = t; });\n    var colorsChip = m.colors <= 12 ? ['ok', m.colors + ' solid color' + (m.colors === 1 ? '' : 's')] : (m.colors > 400 ? ['warn', 'Hundreds of colors'] : ['warn', m.colors + ' colors']);\n    if (v === 'photo') { picks = [['Printed', 'Your image is a photograph. Full-color printing is the only patch type that reproduces photographic detail. Thread, leather, and rubber can\u2019t render photos.']]; score = 94; chips = [colorsChip, ['warn', 'Photo detail']]; }\n    else if (v === 'dense') { picks = [['Printed', 'Your art is packed with detail. Detail this fine won\u2019t hold in embroidery thread at patch size. Full-color printing keeps every bit of it crisp and true.']]; if (tPS) picks.push([tPS.label, 'Print & Stitch prints the fine detail and embroiders the rest. The best of both.']); score = 93; chips = [colorsChip, ['warn', 'Dense detail']]; }\n    else if (v === 'gradient') {\n      /* C516 (Justin 2026-10-26): a smooth colour gradient with stitched elements = Print & Stitch first (product page parity) */\n      picks = tPS ? [[tPS.label, 'Your design has a smooth color gradient. Embroidery thread can\u2019t blend colors. Print & Stitch prints the gradient and embroiders the rest.'], ['Printed', 'Full-color printing reproduces the whole design, gradient and all.']]\n                  : [['Printed', 'Your design has a smooth color gradient. Full-color printing reproduces it exactly; embroidery thread can\u2019t blend colors.']];\n      score = 95; chips = [colorsChip, ['warn', 'Color gradient']];\n    }\n    else if (v === 'fineDetail' || v === 'fine') {\n      /* C152 (Justin 2026-09-05, Ninja Blanks logo ranked Printed): small text / thin lines do NOT demote embroidery \u2014 only a photo or a\n         very intricate (dense) design does. Embroidered leads; the fine-detail escape (Print & Stitch, else Printed) is the alternate. */\n      picks = [['Embroidered', 'Our most popular patch. Bold shapes and solid colors stitch beautifully; the very smallest text may be simplified slightly.']];\n      if (tPS) picks.push([tPS.label, 'Want the small text and thin lines reproduced exactly? Print & Stitch prints the fine detail and embroiders the rest.']);\n      else picks.push(['Printed', 'Want every fine line reproduced exactly? Full-color printing keeps small text and thin lines crisp.']);\n      score = 95; chips = [colorsChip, ['warn', 'Small text / fine lines']];\n    }\n    else {\n      /* embroidery passed its gates: it leads. The alternate comes from the lab's metric rules. */\n      var vividSpot = (m.satFrac || 0) > 0.5 && (m.hueBins || 99) <= 8, alt;\n      if (vividSpot) alt = ['Printed', 'Full-color printing also reproduces every detail exactly at any size.'];\n      else if (m.colors > 400 || m.grad > 0.32) alt = ['Printed', (m.colors > 400 ? 'We counted hundreds of distinct colors.' : 'We detected smooth gradients.') + ' Full-color printing reproduces every tone exactly.'];\n      else if (m.edge > 0.14) alt = ['Woven', 'Fine lines and small details stay sharper in tightly woven thread.'];\n      else if (m.colors <= 10 && m.edge < 0.07) alt = ['3D Embroidered', 'Bold, chunky elements with just a few colors. Perfect for raised puff embroidery that pops.'];\n      else alt = ['3D Embroidered', 'Want more dimension? Your bold elements would pop in raised puff.'];\n      picks = [['Embroidered', 'Our most popular patch. Clean solid colors and clear shapes stitch beautifully in classic embroidery.'], alt];\n      score = 96;\n      chips = [colorsChip, m.grad > 0.32 ? ['warn', 'Smooth gradients'] : (m.edge > 0.14 ? ['warn', 'Fine lines'] : ['ok', 'Clean edges'])];\n    }\n    var rr = cfg.art && cfg.art.ratio;\n    chips.push((rr && (rr > 2.2 || rr < 0.45)) ? ['warn', rr > 2.2 ? 'Tall, thin artwork' : 'Long, thin artwork'] : ['ok', 'Clear shapes']);\n    var list = [];\n    picks.forEach(function (pk, i) { var t = typeByLabel(pk[0]); if (t) list.push({ type: t, reason: pk[1], score: Math.max(60, score - 8 * i), badge: i === 0 ? 'Best match' : 'Also great' }); });\n    /* C222 (Justin 2026-09-15, \"start showing 4 options that would work best instead of 2\"): the gate picks stay first; the rest of the\n       list is ranked from the same artwork metrics (colours, gradients, edge detail) and filled to FOUR cards */\n    var RANK = [\n      ['Embroidered', function () { return v === 'photo' ? 30 : v === 'dense' ? 45 : 88; }, 'Clean solid colors and clear shapes stitch beautifully in classic embroidery.'],\n      ['Woven', function () { return v === 'photo' ? 25 : v === 'dense' ? 58 : 74 + (m.edge > 0.14 ? 12 : 0) - (m.colors > 12 ? 8 : 0); }, 'Fine lines and small details stay sharper in tightly woven thread.'],\n      ['Printed', function () { return v === 'photo' ? 96 : v === 'dense' ? 94 : 66 + ((m.colors > 400 || m.grad > 0.32) ? 24 : 0); }, 'Full-color printing reproduces every tone and detail exactly.'],\n      ['3D Embroidered', function () { return (v === 'photo' || v === 'dense') ? 20 : 70 - (m.edge > 0.14 ? 18 : 0) - (m.colors > 10 ? 12 : 0); }, 'Bold elements pop in raised puff embroidery.'],\n      ['Chenille', function () { return (v === 'photo' || v === 'dense') ? 15 : 56 - (m.colors > 3 ? 20 : 0) - (m.edge > 0.07 ? 16 : 0); }, 'Big, simple shapes in fuzzy varsity chenille.'],\n      ['PVC / Rubber', function () { return (v === 'photo' || v === 'dense') ? 30 : 66 - (m.edge > 0.14 ? 14 : 0) - (m.colors > 8 ? 16 : 0); }, 'Molded rubber gives bold shapes a 3D, weatherproof finish.'],\n      ['Leather', function () { return v === 'photo' ? 10 : 48 + ((m.colors <= 2 && m.grad < 0.1) ? 26 : 0) - (m.colors > 4 ? 14 : 0); }, 'Single-tone line art laser-etches cleanly into leather.'],\n      ['Full Color Flex', function () { return v === 'photo' ? 86 : v === 'dense' ? 84 : 60 + ((m.colors > 400 || m.grad > 0.32) ? 14 : 0); }, 'Full-color print on a flexible molded base with a raised rim.'],\n      ['Metallic Flex', function () { return (v === 'photo' || v === 'dense') ? 36 : 54 - (m.colors > 6 ? 10 : 0); }, 'A molded metallic finish that makes simple designs shine.']\n    ];\n    var have = {}; list.forEach(function (it) { have[it.type.label] = 1; });\n    var extra = [];\n    RANK.forEach(function (rk) { if (have[rk[0]]) return; var tR = typeByLabel(rk[0]); if (!tR) return; var sc = Math.round(Math.max(35, Math.min(92, rk[1]()))); extra.push({ type: tR, reason: rk[2], score: sc, badge: 'Also works' }); });\n    extra.sort(function (a, b) { return b.score - a.score; });\n    var floor = list.length ? list[list.length - 1].score : 96;\n    extra.forEach(function (ex) { if (list.length >= 4) return; ex.score = Math.min(ex.score, floor - 3); floor = ex.score; list.push(ex); });\n    if (!list.length) list.push({ type: typeByLabel('Embroidered') || TYPES[0], reason: 'Classic embroidery suits most artwork.', score: score, badge: 'Best match' });\n    cfg.reco = { list: list, primary: list[0].type, alt: list[1] ? list[1].type : null, reason: list[0].reason, score: list[0].score, chips: chips };\n  }\n  /* Justin 2026-09-05: \"if customer clicks here to update a change it shouldn't reset all the other changes ONLY if the\n     new choice makes those options change\" \u2014 re-picking the type keeps every pick the new type still offers and clears\n     only what it cannot: a step the type lacks, a border / backing / shape label missing from its lists, or a stock\n     colour absent from its palette (custom hex colours stay wherever the custom picker exists, i.e. non-leather types). */\n  function reconcilePicks() {\n    var t = cfg.type, d = D(); if (!t || !d) return;\n    var leather = /leather/i.test(t.label || t.handle || '');\n    var colorOk = function (c, list, stockOnly) {\n      if (!c) return false;\n      var inList = (list || []).some(function (o) { return (c.hex && o.hex && String(o.hex).toLowerCase() === String(c.hex).toLowerCase()) || o.label === c.label; });\n      return inList || (!leather && !stockOnly && !!c.hex); /* C471: no custom colour carries onto a stock-only background (chenille) */\n    };\n    if (cfg.shape && !findIn(d.shapes, cfg.shape)) cfg.shape = null;\n    if (!t.bg) cfg.bg = null; else if (cfg.bg && !colorOk(cfg.bg, d.bgs, !!typeRule(t).noCustomBg)) cfg.bg = null;\n    if (!t.thread) cfg.thread = null; else if (cfg.thread && !colorOk(cfg.thread, d.threads)) cfg.thread = null;\n    if (!t.border) cfg.border = null; else if (cfg.border) { var b = findIn(d.borders, cfg.border.label); cfg.border = b || null; if (cfg.border && !pxBorderOk(cfg.border)) cfg.border = null; } /* C502 */\n    if (!t.backing) cfg.backing = null; else if (cfg.backing) cfg.backing = findIn(d.backings, cfg.backing.label) || null;\n  }\n  function selectType(t) {\n    if (!t) return;\n    var changed = !cfg.type || cfg.type.handle !== t.handle;\n    cfg.type = t;\n    var p = loadCfgData(t);\n    if (changed) {\n      cfg.mockup = null; /* a proof of another product type is never reused */\n      if (dataReady()) reconcilePicks();\n      if (p && p.then) p.then(function () { if (cfg && cfg.type === t) { reconcilePicks(); renderAll(); } }).catch(function () {}); /* re-check once the real option lists land */\n    }\n    renderAll();\n  }\n\n  /* ---- entry points ---- */\n  function beginUpload(file) {\n    var seq = ++st.seq;\n    st.lastFile = file;\n    stopCycle();\n    cfg = freshCfg();\n    cfg.art = { hosted: '', name: file.name, ratio: null, local: PREVIEW_RE.test(file.type) ? URL.createObjectURL(file) : null };\n    root.setAttribute('data-px-phase', 'config');\n    showView('config');\n    st.mode = 'processing';\n    renderAll();\n    hud('Opening Patch Express Studio', '0%', false);\n    showStage();\n    hostFile(file, function (pct) { if (seq === st.seq) hudLine('Uploading ' + Math.round(pct) + '%'); })\n      .then(function (hosted) {\n        if (seq !== st.seq) return;\n        saveToLibrary(file, hosted);\n        beginConfig(hosted, file.name, { keep: true, minMs: 1800 });\n      })\n      .catch(function (err) {\n        if (seq !== st.seq) return;\n        hudOff();\n        st.mode = 'options'; cfg.error = 'The upload did not finish. Try again, or choose another file.'; cfg.uploadFailed = true;\n        renderAll();\n        try { console.warn('[patch-express] upload failed', err); } catch (e) {}\n      });\n  }\n  function beginConfig(hosted, name, opts) {\n    opts = opts || {};\n    var seq = ++st.seq;\n    stopCycle();\n    if (!opts.keep || !cfg) { var oldLocal = cfg && cfg.art ? cfg.art.local : null; cfg = freshCfg(); cfg.art = { hosted: '', name: name || nameFromUrl(hosted), ratio: null, local: opts.keep ? oldLocal : null }; }\n    cfg.art.hosted = toImgix(String(hosted).split('#')[0]).split('?')[0];\n    if (name) cfg.art.name = name;\n    root.setAttribute('data-px-phase', 'config');\n    showView('config');\n    st.mode = 'processing';\n    renderAll();\n    hud('Opening Patch Express Studio', PROC_MSGS[0], false);\n    startCycle(PROC_MSGS, 650);\n    showStage();\n    var t0 = Date.now();\n    var probe = new Promise(function (res) {\n      var im = new Image(); im.crossOrigin = 'anonymous';\n      im.onload = function () { try { cfg.art.ratio = im.naturalHeight / Math.max(1, im.naturalWidth); analyzeArt(im); } catch (e) {} res(); };\n      im.onerror = function () { res(); };\n      im.src = artDisplayUrl(600);\n    });\n    Promise.all([loadTypes().then(function () { return loadCfgData(typeByLabel('Embroidered') || TYPES[0]); }), gateVerdict(), probe]).then(function (r) {\n      if (seq !== st.seq) return;\n      var wait = Math.max(0, (opts.minMs || 2800) - (Date.now() - t0));\n      setTimeout(function () {\n        if (seq !== st.seq) return;\n        stopCycle(); hudOff();\n        cfg.verdict = r[1];\n        recommend();\n        if (cfg.reco && cfg.reco.primary) { cfg.type = cfg.reco.primary; loadCfgData(cfg.reco.primary); } /* the top pick starts selected (Justin 2026-09-05) */\n        if (cfg.removeBg === null) cfg.removeBg = !!cfg.solid; /* the switch starts On when a solid backdrop was detected */\n        if (!cfg.shape) cfg.shape = 'Square'; /* Justin 2026-09-05: square by default (it is also the loading shape) */\n        if (cfg.art.local) { try { URL.revokeObjectURL(cfg.art.local); } catch (e) {} cfg.art.local = null; }\n        st.mode = 'options'; cfg.step = 0;\n        renderAll();\n      }, wait);\n    });\n  }\n  function changeFile() {\n    st.seq++; stopCycle(); hudOff();\n    if (cfg && cfg.art && cfg.art.local) { try { URL.revokeObjectURL(cfg.art.local); } catch (e) {} }\n    cfg = null;\n    root.classList.remove('is-busy');\n    root.setAttribute('data-px-phase', 'choose');\n    var p = $('[data-px-cfg]'); if (p) p.hidden = true;\n    if (fileInput) fileInput.value = '';\n    setMode('upload', true);\n  }\n\n  /* ---- rendering: left panel, rail, option rail, bar ---- */\n  var cfgPanel = $('[data-px-cfg]'), cfgEyebrow = $('[data-px-cfg-eyebrow]'), cfgTitle = $('[data-px-cfg-title]'), cfgSub = $('[data-px-cfg-sub]'), cfgBody = $('[data-px-cfg-body]'), railEl = $('[data-px-rail]');\n  var optRail = $('[data-px-optrail]'), railArea = $('[data-px-railarea]'), backBtn = $('[data-px-cfg-back]'), nextBtn = $('[data-px-cfg-next]');\n\n  /* \u2550\u2550\u2550 C229 (Justin 2026-09-17, \"I want the new sizing logic to be everywhere\") \u2014 SIZE BEFORE THE AI PROOF in the studio \u2550\u2550\u2550\n     Mirror of the product page's Size row: width/height with proportional fill, common sizes, rulers on the preview, and a\n     feasibility check. The studio has no classifier of its own, so it asks the Patch Gate service at the entered width\n     (judgeIn \u2014 deployed 2026-09-17); a reply without `judgedIn` (older service) means no width verdict, so only min/max apply.\n     Generate stays disabled until cfg.sizeOk. The block message offers the other patch types in place (type pick). */\n  function pxFmt(n) { return (Math.round(n * 100) / 100).toString().replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, ''); }\n  function pxSizeSettings() { return (D() && D().settings) || {}; }\n  function pxSizeMin() { var S = pxSizeSettings(); return Math.max(+S.sizeMin || 0.5, parseFloat(S.sizeMinMeta) || 0.5); }\n  function pxSizeMax() { var S = pxSizeSettings(); return parseFloat(S.sizeMaxMeta) || 15; }\n  function pxSizeRatio() { var dm = dimsFor(curShape()); return (dm && dm[0] > 0) ? dm[1] / dm[0] : 1; }\n  function pxHeightLocked() { var g = curShape().geom; return g === 'circle' || g === 'square' || g === 'hexagon'; }\n  var PX_GUIDE = [['Hat Square/Circle', 2.5, 2.5], ['Hat Rectangle', 4, 2.5], ['Front Left Chest Shirt', 4, 4], ['Sleeve', 3, 3], ['Back Neckline', 3, 3]]; /* C499: [placement, width, max height] */\n  function pxPsLink() {\n    /* C230d (Justin 2026-09-17 \"emb product page recommended print and stitch and full color and mockup gen ONLY recommended printed\n       patch\"): the studio has no Print & Stitch type, so the stop hands off to the P&S product page with the same carry-over the product\n       pages use (np_src=size + np_ml) \u2014 shape, colours, border, backing and size arrive preselected */\n    try {\n      var art = artDisplayUrl(); if (!art || !cfg) return '';\n      var carry = { shape: cfg.shape || '', corners: cfg.corners || 'rounded', border: cfg.border ? cfg.border.label : '', bg: (cfg.bg && cfg.bg.hex) ? { label: cfg.bg.label, hex: cfg.bg.hex } : null, thread: (cfg.thread && cfg.thread.hex) ? { label: cfg.thread.label, hex: cfg.thread.hex } : null, backing: cfg.backing ? cfg.backing.label : '', removeBg: cfg.removeBg === true, artZoom: cfg.artZoom || 1, artDx: cfg.artDx || 0, artDy: cfg.artDy || 0, w: cfg.sizeEntered ? cfg.w : 0, h: cfg.sizeEntered ? cfg.h : 0 };\n      var base = (typeof STORE === 'string' && STORE) ? STORE : '';\n      return '<a class=\"np-px__szf-alt\" href=\"' + base + '/products/print-stitch-patches?np_mode=ai&file=' + encodeURIComponent(art) + '&np_src=size&np_ml=' + encodeURIComponent(JSON.stringify(carry)) + '\">Print &amp; Stitch patch \\u2192</a>';\n    } catch (e) { return ''; }\n  }\n  function pxAltTypeButtons(withKeep) {\n    var out = pxPsLink(); /* C230d: Print & Stitch first, then the in-studio Printed pick \u2014 the same two routes the embroidered product page offers */\n    TYPES.forEach(function (ty) { if (cfg && cfg.type && ty.handle === cfg.type.handle) return; if (!/flex|vinyl/i.test(ty.label) && (/print.*stitch/i.test(ty.label) || /printed|full ?color/i.test(ty.label))) out += '<button type=\"button\" class=\"np-px__szf-alt\" data-px-type-pick=\"' + esc(ty.label) + '\">' + esc(ty.label) + ' patch \u2192</button>'; });\n    if (withKeep) out += '<button type=\"button\" class=\"np-px__szf-alt np-px__szf-keep\" data-px-szf-keep>Keep as ' + esc(curType().label || 'this patch type') + '</button>'; /* C430 */\n    return out ? '<span class=\"np-px__szf-alts\">' + out + '</span>' : '';\n  }\n  /* C430 (Justin 2026-09-28, product page parity: \"when we reccomend here after they enter size we still need to leave optoin for them to\n     continue with patch type they are on\"): a fine-detail size stop offers \"Keep as <type>\"; keeping is per artwork + type (np-emb2\n     szfKeptActive), and the min/max per side stay hard limits */\n  /* C433 (Justin 2026-09-28): \"it shouldnt say stitch on rubber silicone leather full color, etc (only on embroidered or 3d embroidered or\n     woven should it say stitched) / the messaging should be more reccomending not directive\" */\n  function pxStitched() { return /^(embroidery-2-0|3demb-2-0|woven-2-0|chenille-2-0)$/.test(String((curType() && curType().suffix) || '')); }\n  /* C441 (Justin 2026-09-28, \"yes I want the same printed pvc logic everywhere \u2026 Including ninjatransfers.com and shinobi and patch mockup\n     generator\"): PVC patches and PVC keychains with fine detail are made as printed rubber PVC \u2014 no warning, an info line, and the flag rides\n     the PDP hand-off (np-emb2 sets _Printed PVC: Yes). The gate treats PVC as photo-only, so its DETAIL is judged with the embroidery rules\n     (the thresholds are global; the type only switches the detail arms on). */\n  function pxPrintedPvc() { return /^(rubber-pvc-2-0|keychains-2-0)$/.test(String((curType() && curType().suffix) || '')); }\n  function pxKeepKey() { return String((curType() && curType().handle) || '') + '|' + String((cfg && cfg.art && cfg.art.hosted) || '').split('?')[0]; }\n  function pxKeptActive() { return !!(cfg && cfg.__szfKeepKey && cfg.__szfKeepKey === pxKeepKey()); }\n  function pxSizeBodyHtml() {\n    var locked = pxHeightLocked(), entered = !!cfg.sizeEntered, mn = pxSizeMin(), mx = pxSizeMax();\n    /* C499 (Justin 2026-10-14, product page parity): each common size shows its placement box (width x max height) and sets the width.\n       C499b (\"this shouldnt be red its just there for reference\"): reference only, never red / disabled */\n    var quick = PX_GUIDE.map(function (g) { return '<button type=\"button\" class=\"np-px__szf-chip\" data-px-szf-quick=\"' + g[1] + '\">' + pxFmt(g[1]) + '\u2033\u00D7' + pxFmt(g[2]) + '\u2033 ' + esc(g[0]) + '</button>'; }).join('');\n    setTimeout(pxSizeRecheck, 0);\n    return '<div class=\"np-px__szf\">' +\n      '<div class=\"np-px__szf-fields\">' +\n        '<label class=\"np-px__szf-field\"><span>Width</span><input type=\"number\" class=\"np-px__szf-in\" id=\"np-px-szf-w\" value=\"' + (entered ? cfg.w.toFixed(2) : '') + '\" placeholder=\"e.g. 3\" min=\"' + mn + '\" max=\"' + mx + '\" step=\"0.25\" inputmode=\"decimal\" aria-label=\"Width in inches\"><small>inches</small></label>' +\n        '<span class=\"np-px__szf-x\">\u00D7</span>' +\n        '<label class=\"np-px__szf-field' + (locked ? ' is-locked' : '') + '\"><span>Height</span><input type=\"number\" class=\"np-px__szf-in\" id=\"np-px-szf-h\" value=\"' + (entered ? cfg.h.toFixed(2) : '') + '\" placeholder=\"' + (locked ? 'matches width' : 'e.g. 2') + '\" min=\"' + mn + '\" max=\"' + mx + '\" step=\"0.25\" inputmode=\"decimal\" aria-label=\"Height in inches\"' + (locked ? ' readonly' : '') + '><small>inches</small></label>' +\n      '</div>' +\n      '<div class=\"np-px__szf-quick\"><span>Common sizes:</span>' + quick + '</div>' +\n      '<p class=\"np-px__szf-msg\" id=\"np-px-szf-msg\" data-state=\"' + (entered ? 'pending' : 'idle') + '\">' + (entered ? 'Checking your design at ' + pxFmt(cfg.w) + '\u2033 wide\u2026' : 'Enter a width or a height to continue.') + '</p>' +\n    '</div>';\n  }\n  function pxAiNote() { return (cfg && cfg.sizeEntered && cfg.w > 0) ? AI_NOTE_LONG.replace('your size and quantity', 'your quantity') : AI_NOTE_LONG; }\n  var pxSzT = null, pxSzSeq = 0;\n  function pxSizeSnap(rawW, rawH, locked, r, mn, mx) {\n    /* C230: the nearest size with BOTH sides inside the window for this shape (ratio kept; square shapes snap to the limit itself) */\n    var q4 = function (x, up) { return (up ? Math.ceil(x * 4 - 1e-9) : Math.floor(x * 4 + 1e-9)) / 4; }, r2 = function (x) { return Math.round(x * 100) / 100; }, rr = locked ? 1 : (r || 1);\n    if (rawW < mn - 1e-9 || rawH < mn - 1e-9) { var wMin = locked ? mn : q4(Math.max(mn, mn / rr), true); return { w: wMin, h: locked ? wMin : Math.max(mn, r2(wMin * rr)), kind: 'min', limit: mn }; }\n    if (rawW > mx + 1e-9 || rawH > mx + 1e-9) { var wMax = locked ? mx : q4(Math.min(mx, mx / rr), false); return { w: wMax, h: locked ? wMax : Math.min(mx, r2(wMax * rr)), kind: 'max', limit: mx }; }\n    return null;\n  }\n  function pxLimitNote(inp, kind, limit) {\n    /* C230 (like classic mode): a small red line right under the box \u2014 \"1\u2033 minimum\" / \"12\u2033 maximum\" \u2014 the box flashes red, both fall off after 2 s */\n    if (!inp || !inp.parentNode) return;\n    var note = inp.parentNode.querySelector('.np-px__szf-lim');\n    if (!note) { note = document.createElement('small'); note.className = 'np-px__szf-lim'; note.setAttribute('role', 'status'); inp.insertAdjacentElement('afterend', note); }\n    note.textContent = pxFmt(limit) + '\u2033 ' + (kind === 'max' ? 'maximum' : 'minimum');\n    note.hidden = false; inp.classList.add('is-error');\n    clearTimeout(note.__t); note.__t = setTimeout(function () { note.hidden = true; inp.classList.remove('is-error'); }, 2000);\n  }\n  function pxFocusAfterSwitch(tries) {\n    /* C230 (Justin 2026-09-17 \"when we swap to another patch lets auto focus to the field that needs to be entered or just the generate\n       AI proof button if all else are filled in\"): after a type switch from the size stop, open the first choice still empty \u2014 or the last\n       step with Generate \u2014 and put the focus there */\n    tries = tries || 0;\n    if (!cfg || st.mode !== 'options') return;\n    if (!dataReady()) { if (tries < 30) setTimeout(function () { pxFocusAfterSwitch(tries + 1); }, 100); return; }\n    var keys = steps(), i = -1;\n    for (var k = 0; k < keys.length; k++) { if (keys[k] !== 'type' && keys[k] !== 'art' && !stepDone(keys[k])) { i = k; break; } }\n    cfg.step = i === -1 ? keys.length - 1 : i; renderAll();\n    var el = i === -1 ? nextBtn : ((cfgBody && cfgBody.querySelector('input:not([disabled]), button:not([disabled])')) || (optRail && optRail.querySelector('button:not([disabled])')));\n    if (!el) return;\n    try { el.scrollIntoView({ behavior: 'smooth', block: 'center' }); } catch (eSV) {}\n    setTimeout(function () { try { el.focus({ preventScroll: true }); } catch (eF) {} }, 350);\n  }\n  function pxSizeCommit(kind, v) {\n    if (!(v > 0) || !cfg) return;\n    var r = pxSizeRatio(), locked = pxHeightLocked(), mn = pxSizeMin(), mx = pxSizeMax();\n    if (kind === 'h' && locked) kind = 'w';\n    var rawW, rawH;\n    if (kind === 'w') { rawW = Math.round(v * 100) / 100; rawH = locked ? rawW : Math.round(rawW * r * 100) / 100; }\n    else { rawH = Math.round(v * 100) / 100; rawW = Math.round(rawH / r * 100) / 100; }\n    /* C230 (Justin 2026-09-17 \"just need the little red text under the entry that says 1 inch min and then adjust the sizer for them\n       and the warning falls off after 2 seconds\"): an out-of-range entry snaps to the nearest size with BOTH sides inside the window\n       (ratio kept) and a small red note under the box says why for 2 s \u2014 box and rulers always agree, nothing goes below the minimum */\n    var sn = pxSizeSnap(rawW, rawH, locked, r, mn, mx);\n    if (sn) { rawW = sn.w; rawH = sn.h; pxLimitNote(document.getElementById(kind === 'h' ? 'np-px-szf-h' : 'np-px-szf-w'), sn.kind, sn.limit); }\n    cfg.w = rawW; cfg.h = locked ? cfg.w : rawH; cfg.sizeEntered = true; cfg.sizeOk = false;\n    var wI = document.getElementById('np-px-szf-w'), hI = document.getElementById('np-px-szf-h');\n    if (wI) wI.value = cfg.w.toFixed(2); if (hI) hI.value = cfg.h.toFixed(2);\n    var msg = document.getElementById('np-px-szf-msg'); if (msg) { msg.setAttribute('data-state', 'pending'); msg.textContent = 'Checking your design at ' + pxFmt(cfg.w) + '\u2033 wide\u2026'; }\n    pxSizeRefresh();\n    clearTimeout(pxSzT);\n    var JW = cfg.w, JH = cfg.h;\n    pxSzT = setTimeout(function () { var W0 = cfg.w, H0 = cfg.h; pxSizeJudge(JW, JH).then(function (res) { if (res && cfg && cfg.w === W0 && cfg.h === H0) pxSizeApply(res); }); }, 250);\n  }\n  function pxSizeRecheck() { /* the body re-rendered (type switch, shape change) with a size already entered \u2192 judge it again, cheaply from the memo when possible */\n    if (!cfg || !cfg.sizeEntered || !(cfg.w > 0) || stepKey() !== 'size') return;\n    var W0 = cfg.w, H0 = cfg.h; pxSizeJudge(W0, H0).then(function (res) { if (res && cfg && cfg.w === W0 && cfg.h === H0) pxSizeApply(res); });\n  }\n  function pxGateAt(W) {\n    /* one verdict per (artwork, type, width) \u2014 memoised; null = the service gave no width verdict (fail-open) */\n    if (!GATE_URL || !cfg || !cfg.art) return Promise.resolve(null);\n    var mem = cfg.__szfMem || (cfg.__szfMem = {}), k = String(curType().handle) + '|' + artDisplayUrl() + '|' + W.toFixed(2);\n    if (mem[k]) return mem[k];\n    var ctl = (typeof AbortController === 'function') ? new AbortController() : null, timer = ctl ? setTimeout(function () { try { ctl.abort(); } catch (e) {} }, 12000) : null;\n    mem[k] = fetch(GATE_URL, { method: 'POST', mode: 'cors', credentials: 'omit', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ imageUrl: artDisplayUrl(), typeKey: pxPrintedPvc() ? 'embroidery-2-0' : (curType().suffix || 'embroidery-2-0'), env: 'live', surface: 'patch-express-size', judgeIn: W, minIn: pxSizeMin() }), signal: ctl ? ctl.signal : undefined })\n      .then(function (r) { return r.json(); })\n      .then(function (res) { if (timer) clearTimeout(timer); if (!res || !res.ok || typeof res.judgedIn === 'undefined') return null; return { fine: res.verdict === 'fineDetail', dense: res.verdict === 'dense', gradient: res.verdict === 'gradient', arm: res.arm || '', txtH: res.metrics && res.metrics.txtH, judgedIn: res.judgedIn }; })\n      .catch(function () { if (timer) clearTimeout(timer); return null; });\n    return mem[k];\n  }\n  function pxSizeJudge(W, H) {\n    var my = ++pxSzSeq, mn = pxSizeMin(), mx = pxSizeMax(), name = ((curType().label || 'patch') + ' patch').toLowerCase();\n    var fmtIn = function (a, b) { return '<b>' + pxFmt(a) + '\u2033 \u00D7 ' + pxFmt(b) + '\u2033</b>'; };\n    if (W < mn - 1e-9 || H < mn - 1e-9) return Promise.resolve({ state: 'block', kind: 'min', text: pxFmt(mn) + '\u2033 minimum per side.' }); /* C230: unreachable from the boxes (they snap) \u2014 a compact safety line */\n    if (W > mx + 1e-9 || H > mx + 1e-9) return Promise.resolve({ state: 'block', kind: 'max', text: pxFmt(mx) + '\u2033 maximum per side.' });\n    var clean = pxStitched() ? 'stitch cleanly' : 'come through cleanly';\n    var okRes = { state: 'ok', text: 'Looks good at ' + fmtIn(W, H) + (pxStitched() ? ' \u2014 stitches cleanly.' : '.') }; /* C433 */\n    /* MONOTONIC PHYSICS (C230c \u2014 mirrors the product page's sizeFirstJudge; Justin 2026-09-17 \"why are you telling me 5 here when the\n       real # is 3 that works\"): a design that stitches at the calibrated 3\" frame stitches at every larger width, and one that fails at\n       W fails at every smaller width \u2014 so the answer is the SMALLEST passing width on the 0.5\" grid, found by bisection, never the\n       first of a few guessed candidates (that is what said 5\" when 3\" works) */\n    var BASE = 3, top = Math.min(mx, 12);\n    var fineAt = function (x) { return pxGateAt(x).then(function (r) { return !!(r && r.fine); }); }; /* no width verdict (older service / error) = pass, fail-open */\n    var tyName = esc(curType().label || 'this patch type');\n    var pxChange = '<span class=\"np-px__szf-alts\"><button type=\"button\" class=\"np-px__szf-change\" data-px-szf-unkeep>Change</button></span>'; /* C437 */\n    var keptRes = function (minW) { return { state: 'ok', kept: true, rec: 'Print & Stitch Patch / Full Color Patch', /* C519 */ minW: minW, alts: pxChange, text: 'Keeping it ' + tyName + ' at ' + fmtIn(W, H) + '. Heads up: fine detail may not ' + clean + ' at this size' + (minW ? ' \u2014 we recommend <b>' + pxFmt(minW) + '\u2033</b> or wider.' : '.') }; }; /* C430 / C433 */\n    var blockAt = function (minW) { if (pxKeptActive()) return keptRes(minW); return { state: 'block', kind: 'fine', minW: minW, text: 'This design has fine detail that may not ' + clean + ' at <b>' + pxFmt(W) + '\u2033</b>. We recommend <b>' + pxFmt(minW) + '\u2033</b> or wider, or a Print &amp; Stitch or Full Color patch \u2014 or you can keep it ' + tyName + '. We will contact you if necessary.' /* C439 */, alts: pxAltTypeButtons(true) }; };\n    var noneRes = pxKeptActive() ? keptRes(null) : { state: 'block', kind: 'fine', minW: null, text: 'This design has fine detail that may not ' + clean + ' at any size. We recommend a Print &amp; Stitch or Full Color patch \u2014 or you can keep it ' + tyName + '. We will contact you if necessary.' /* C439 */, alts: pxAltTypeButtons(true) };\n    /* C432 (Justin 2026-09-28, \"any other image due to fine detail etc \u2026 until they put their size in, where we will now give reccomendations\n       and the opportunity to continue\"): a dense verdict (detail and shading) at the calibrated frame is a recommendation at every size */\n    var pvcRes = { state: 'ok', printedPvc: true, text: 'Your design has a lot of fine detail, so we\\u2019ll create it as a <b>printed rubber PVC ' + (/keychains/.test(String(curType().suffix || '')) ? 'keychain' : 'patch') + '</b> at ' + fmtIn(W, H) + ' \\u2014 this will allow you to keep all your details!' }; /* C441 */\n    if (pxPrintedPvc()) { blockAt = function () { return pvcRes; }; noneRes = pvcRes; }\n    var denseRes = pxPrintedPvc() ? pvcRes : pxKeptActive() ? { state: 'ok', kept: true, rec: 'Print & Stitch Patch / Full Color Patch', /* C519 */ alts: pxChange, text: 'Keeping it ' + tyName + ' at ' + fmtIn(W, H) + '. Heads up: this design\\u2019s detail and shading may not ' + clean + '.' }\n      : { state: 'block', kind: 'dense', minW: null, text: 'This design has a lot of detail and shading that may not ' + clean + '. We recommend a Print &amp; Stitch or Full Color patch \u2014 or you can keep it ' + tyName + '. We will contact you if necessary.' /* C439 */, alts: pxAltTypeButtons(true) };\n    /* C516: a smooth colour gradient \u2014 the same recommendation at every size, Print & Stitch first (product page parity) */\n    var gradRes = pxKeptActive() ? { state: 'ok', kept: true, rec: 'Print & Stitch Patch', /* C519 */ alts: pxChange, text: 'Keeping it ' + tyName + ' at ' + fmtIn(W, H) + '. Heads up: embroidery thread can\\u2019t blend this design\\u2019s color gradient.' }\n      : { state: 'block', kind: 'dense', minW: null, text: 'This design has a smooth color gradient that embroidery thread can\\u2019t blend. We recommend a Print &amp; Stitch patch \u2014 it prints the gradient and stitches the rest \u2014 or you can keep it ' + tyName + '. We will contact you if necessary.', alts: pxAltTypeButtons(true) };\n    var bisect = function (lo, hi) { /* lo fails, hi passes */\n      if (hi - lo <= 0.5 + 1e-9) return Promise.resolve(blockAt(hi));\n      var mid = Math.round(((lo + hi) / 2) * 2) / 2; if (mid <= lo) mid = lo + 0.5; if (mid >= hi) mid = hi - 0.5;\n      return fineAt(mid).then(function (fm) { if (my !== pxSzSeq) return null; return fm ? bisect(mid, hi) : bisect(lo, mid); });\n    };\n    return pxGateAt(BASE).then(function (g3) {\n      if (my !== pxSzSeq) return null;\n      if (g3 && g3.dense) return denseRes; /* C432 */\n      if (g3 && g3.gradient && !pxPrintedPvc()) return gradRes; /* C516 */\n      var fine3 = !!(g3 && g3.fine);\n      if (W >= BASE && !fine3) return okRes;\n      return (Math.abs(W - BASE) < 1e-9 ? Promise.resolve(fine3) : fineAt(W)).then(function (fineW) {\n        if (my !== pxSzSeq) return null;\n        if (!fineW) return okRes;\n        if (W < BASE && !fine3) return bisect(W, BASE);\n        if (W >= top - 1e-9) return noneRes;\n        return fineAt(top).then(function (fineTop) {\n          if (my !== pxSzSeq) return null;\n          if (fineTop) return noneRes;\n          return bisect(Math.max(W, BASE), top);\n        });\n      });\n    });\n  }\n  function pxSizeApply(res) {\n    var msg = document.getElementById('np-px-szf-msg');\n    if (res) {\n      cfg.sizeOk = res.state === 'ok';\n      if (res.kind !== 'min' && res.kind !== 'max') cfg.printedPvc = !!res.printedPvc; /* C441 */\n      if (res.kind !== 'min' && res.kind !== 'max') cfg.patchRec = res.kept ? res.rec : ''; /* C519: the type(s) a size-step Keep turned down */\n      if (msg) { msg.setAttribute('data-state', res.kept ? 'kept' : res.state); var fixV = res.minW || res.fix; msg.innerHTML = res.text + (fixV ? ' <button type=\"button\" class=\"np-px__szf-fix\" data-px-szf-quick=\"' + fixV + '\">Use ' + pxFmt(fixV) + '\u2033 wide</button>' : '') + (res.alts || ''); }\n    }\n    pxSizeRefresh();\n  }\n  function pxSizeRefresh() {\n    /* rail chip + Generate button without re-rendering the body (that would destroy the input mid-typing) */\n    try { var keys = steps(), i = keys.indexOf('size'); var chip = railEl && railEl.querySelector('[data-px-rail-step=\"' + i + '\"] .np-px__rail-v'); if (chip) chip.innerHTML = railValue('size'); } catch (e) {}\n    if (nextBtn && stepKey() === 'size' && st.mode === 'options') nextBtn.disabled = isBusy() || !stepDone('size');\n    try { pxDims(); } catch (e2) {}\n  }\n  function pxDims() {\n    var pv = document.querySelector('[data-px-pv]'); if (!pv) return;\n    var on = !!(cfg && cfg.sizeEntered && cfg.w > 0 && cfg.h > 0 && root.getAttribute('data-px-phase') === 'config' && st.mode !== 'generating' && st.mode !== 'processing');\n    pv.classList.toggle('has-dims', on);\n    if (!on) return;\n    var wd = pv.querySelector('.np-px__dim--w'), hd = pv.querySelector('.np-px__dim--h');\n    if (!wd) { wd = document.createElement('div'); wd.className = 'np-px__dim np-px__dim--w'; wd.innerHTML = '<i></i><b></b>'; pv.appendChild(wd); }\n    if (!hd) { hd = document.createElement('div'); hd.className = 'np-px__dim np-px__dim--h'; hd.innerHTML = '<i></i><b></b>'; pv.appendChild(hd); }\n    wd.querySelector('b').textContent = cfg.w.toFixed(2) + '\"'; hd.querySelector('b').textContent = cfg.h.toFixed(2) + '\"';\n    /* C431 (Justin 2026-09-28, \"the arrows should ONLY measure the design itself \u2026 they are too big\"): the preview box is the shape tile\n       and the composed image fills it (Design's Shape drew a 1 : 1.4 design inside a square), so the rulers take the drawn patch's own\n       pixel bounds inside the image; until that is known \u2014 or when it cannot be read \u2014 they keep the box */\n    var reset = function () { wd.style.left = wd.style.right = wd.style.top = ''; hd.style.top = hd.style.bottom = hd.style.left = ''; };\n    pxDrawnBounds(pvArt, function (b) {\n      if (!b || !pvArt || !pv.classList.contains('has-dims')) { reset(); return; }\n      var pR = pv.getBoundingClientRect(), aR = pvArt.getBoundingClientRect(); if (!pR.width || !aR.width) { reset(); return; }\n      var zf = pv.offsetWidth / pR.width, nw = pvArt.naturalWidth, nh = pvArt.naturalHeight; if (!nw || !nh) { reset(); return; }\n      var aw = aR.width * zf, ah = aR.height * zf, s = Math.min(aw / nw, ah / nh), dw = nw * s, dh = nh * s;\n      var ox = (aR.left - pR.left) * zf + (aw - dw) / 2, oy = (aR.top - pR.top) * zf + (ah - dh) / 2;\n      var x0 = ox + b.x0 * dw, x1 = ox + b.x1 * dw, y0 = oy + b.y0 * dh, y1 = oy + b.y1 * dh, W = pv.offsetWidth, H = pv.offsetHeight;\n      wd.style.left = Math.round(x0) + 'px'; wd.style.right = Math.round(W - x1) + 'px'; wd.style.top = Math.round(y0 - 22) + 'px';\n      hd.style.top = Math.round(y0) + 'px'; hd.style.bottom = Math.round(H - y1) + 'px'; hd.style.left = Math.round(x0 - 22) + 'px';\n    });\n  }\n  var pxDimB = { src: '', b: null };\n  function pxDrawnBounds(img, cb) {\n    /* C431: the PDP's canvasDrawnBounds rule \u2014 alpha > 128 when the frame carries real transparency, else null (keep the box) */\n    var src = img ? (img.currentSrc || img.src || '') : '';\n    if (!src) { cb(null); return; }\n    if (pxDimB.src === src) { cb(pxDimB.b); return; }\n    var run = function () {\n      var b = null;\n      try {\n        var W = 300, H = Math.max(1, Math.round(img.naturalHeight * (W / img.naturalWidth)));\n        var c = document.createElement('canvas'); c.width = W; c.height = H;\n        var x = c.getContext('2d'); x.drawImage(img, 0, 0, W, H);\n        var d = x.getImageData(0, 0, W, H).data, clearPx = 0, minX = W, minY = H, maxX = -1, maxY = -1;\n        for (var aa = 3; aa < d.length; aa += 4) { if (d[aa] < 13) clearPx++; }\n        if (clearPx > (W * H) * 0.005) {\n          for (var yy = 0; yy < H; yy++) for (var xx = 0; xx < W; xx++) { if (d[(yy * W + xx) * 4 + 3] > 128) { if (xx < minX) minX = xx; if (xx > maxX) maxX = xx; if (yy < minY) minY = yy; if (yy > maxY) maxY = yy; } }\n          if (maxX >= 0) b = { x0: minX / W, y0: minY / H, x1: (maxX + 1) / W, y1: (maxY + 1) / H };\n        }\n      } catch (eB) { b = null; }\n      pxDimB = { src: src, b: b };\n      if ((img.currentSrc || img.src || '') === src) cb(b);\n    };\n    if (img.complete && img.naturalWidth) run(); else img.addEventListener('load', run, { once: true });\n  }\n  if (cfgBody) {\n    cfgBody.addEventListener('change', function (e) { var inp = e.target; if (!inp || !/^np-px-szf-[wh]$/.test(inp.id || '')) return; var v = parseFloat(inp.value); if (!(v > 0)) { inp.value = ''; return; } pxSizeCommit(inp.id === 'np-px-szf-h' ? 'h' : 'w', v); });\n    cfgBody.addEventListener('input', function (e) { var inp = e.target; if (!inp || !/^np-px-szf-[wh]$/.test(inp.id || '')) return; var v = parseFloat(inp.value); if (!(v > 0)) return; var other = document.getElementById(inp.id === 'np-px-szf-w' ? 'np-px-szf-h' : 'np-px-szf-w'); if (!other) return; var r = pxSizeRatio(), locked = pxHeightLocked(); other.value = (inp.id === 'np-px-szf-w' ? (locked ? v : v * r) : (locked ? v : v / r)).toFixed(2); });\n    cfgBody.addEventListener('keydown', function (e) { if (e.key === 'Enter' && e.target && /^np-px-szf-[wh]$/.test(e.target.id || '')) { e.preventDefault(); e.target.blur(); } });\n    cfgBody.addEventListener('click', function (e) { var q = e.target.closest && e.target.closest('[data-px-szf-quick]'); if (q) pxSizeCommit('w', parseFloat(q.getAttribute('data-px-szf-quick'))); });\n    cfgBody.addEventListener('click', function (e) { var k = e.target.closest && e.target.closest('[data-px-szf-keep]'); if (!k || !cfg) return; e.preventDefault(); cfg.__szfKeepKey = pxKeepKey(); pxSizeRecheck(); }); /* C430 */\n    cfgBody.addEventListener('click', function (e) { var u = e.target.closest && e.target.closest('[data-px-szf-unkeep]'); if (!u || !cfg) return; e.preventDefault(); cfg.__szfKeepKey = null; pxSizeRecheck(); }); /* C437: Change takes the keep back */\n  }\n  function stepDone(key) {\n    if (!cfg) return false;\n    return { type: !!cfg.type, art: cfg.removeBg !== null, bg: !!cfg.bg, border: !!cfg.border, thread: !!cfg.thread, backing: !!cfg.backing, size: !!cfg.sizeOk }[key] || false; /* C229: size counts once it is inside the window */\n  }\n  function colorName(c) { return c ? c.label : 'Not chosen'; }\n  function optionsSig() { if (!cfg) return ''; return JSON.stringify([cfg.type && cfg.type.handle, cfg.art && cfg.art.hosted, cfg.removeBg, cfg.artZoom, cfg.artDx || 0, cfg.artDy || 0, cfg.shape, cfg.corners || 'rounded', cfg.bg && cfg.bg.hex, cfg.border && cfg.border.label, cfg.thread && cfg.thread.hex, cfg.backing && cfg.backing.label, cfg.edits.length]); }\n  function proofFresh() { return !!(cfg && cfg.mockup && cfg.mockupSig === optionsSig()); } /* Justin 2026-09-05: any change after a proof means a new generate */\n  /* info tips \u2014 the PDP builder's np-e2-ftip pattern (Justin 2026-09-05: \"tool tips \u2026 from product pages\") */\n  var TIPS = {\n    ds: { img: 'https://ninjauploads-production.imgix.net/np-custom-shape-example-1787593373.png?w=520', alt: 'A patch cut to the exact shape of the uploaded design', head: 'Your design IS the patch shape', body: 'We cut the patch to the outer shape of your uploaded design. The edge follows your artwork\u2019s own outline.' },\n    match: { head: 'Match artwork', body: 'We pick the swatch closest to the main color in your design. You can change it anytime.' },\n    ai: { head: 'Let AI choose', body: 'AI will choose for you based on your design. The pick shows in your preview and you can change it anytime.' }\n  };\n  function ftip(aria, t) { return '<span class=\"np-px__ftip\" data-px-ftip tabindex=\"0\" role=\"button\" aria-label=\"' + esc(aria) + '\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg><span class=\"np-px__ftip-pop\">' + (t.img ? '<img src=\"' + esc(t.img) + '\" alt=\"' + esc(t.alt || '') + '\" loading=\"lazy\">' : '') + '<b>' + esc(t.head) + '</b><i>' + esc(t.body) + '</i></span></span>'; }\n  function closeTips() { $$('[data-px-ftip].is-open').forEach(function (x) { x.classList.remove('is-open'); }); }\n  function placeTip(trig) {\n    var pop = trig.querySelector('.np-px__ftip-pop'); if (!pop) return;\n    var r = trig.getBoundingClientRect(), pw = pop.offsetWidth, ph = pop.offsetHeight, vw = window.innerWidth;\n    var left = Math.max(8, Math.min(vw - pw - 8, r.left + r.width / 2 - pw / 2)), top = r.top - ph - 10;\n    if (top < 8) top = r.bottom + 10;\n    pop.style.left = Math.round(left) + 'px'; pop.style.top = Math.round(top) + 'px';\n  }\n  function openTip(trig) { closeTips(); trig.classList.add('is-open'); placeTip(trig); }\n  document.addEventListener('click', function (e) { if (!(e.target.closest && e.target.closest('[data-px-ftip]'))) closeTips(); }, true);\n  document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeTips(); });\n  window.addEventListener('scroll', closeTips, true);\n  root.addEventListener('mouseover', function (e) { var t = e.target.closest && e.target.closest('[data-px-ftip]'); if (t && !t.classList.contains('is-open')) openTip(t); });\n  root.addEventListener('mouseout', function (e) { var t = e.target.closest && e.target.closest('[data-px-ftip]'); if (t && !(e.relatedTarget && t.contains(e.relatedTarget))) t.classList.remove('is-open'); });\n  function paletteList() { if (!cfg || !cfg.paletteHex) return []; var seen = {}; return cfg.paletteHex.filter(function (hx) { var nm = pmsName(hx); if (seen[nm]) return false; seen[nm] = 1; return true; }).slice(0, 8).map(function (hx) { return { hex: hx, name: pmsName(hx) }; }); }\n  function zoomRowHtml() {\n    /* Artwork fill = the PDP builder's slider (60\u2013250%, np-emb2 data-e2-artzoom2); shown above the shape options\n       AND on the border step (Justin 2026-09-05); never on Design's Shape (PDP parity) */\n    if (curShape().geom === 'custom') return '';\n    var zPct = Math.round((cfg.artZoom || 1) * 100);\n    return '<div class=\"np-px__zoomrow\"><span>Artwork fill</span><input type=\"range\" data-px-artzoom min=\"60\" max=\"250\" step=\"5\" value=\"' + zPct + '\" aria-label=\"Artwork fill\" style=\"' + zoomTrack(cfg.artZoom || 1) + '\"><b data-px-artzoom-val>' + zPct + '%</b></div>';\n  }\n  function zoomTrack(z) { var p = Math.round((z * 100 - 60) / 190 * 100); return 'background:linear-gradient(to right, var(--px-green) ' + p + '%, var(--px-toggle-track) ' + p + '%)'; }\n  /* the step rail shows each pick under its label (Justin 2026-09-05 \"show these in status\") */\n  function railSw(c) { return (c && c.hex) ? '<em class=\"np-px__rail-sw\" style=\"background:' + esc(c.hex) + '\"></em>' : ''; }\n  function railValue(k) {\n    if (!cfg) return '';\n    if (k === 'type') return cfg.type ? esc(cfg.type.label) : '';\n    if (k === 'art') return cfg.shape ? esc(curShape().display || cfg.shape) : '';\n    if (k === 'bg') return cfg.bg ? railSw(cfg.bg) + esc(cfg.bg.label) : '';\n    if (k === 'border') return cfg.border ? esc(String(cfg.border.label).split('/').pop().trim()) : '';\n    if (k === 'thread') return cfg.thread ? railSw(cfg.thread) + esc(cfg.thread.label) : '';\n    if (k === 'backing') return cfg.backing ? esc(String(cfg.backing.label).replace(/\\s*\\(.*$/, '').replace(/\\s+Applied$/i, '').trim()) : '';\n    if (k === 'size') return (cfg.sizeEntered && cfg.w > 0) ? esc(pxFmt(cfg.w) + '\\u2033 \\u00d7 ' + pxFmt(cfg.h) + '\\u2033') : ''; /* C229 */\n    return '';\n  }\n  function renderAll() {\n    ensureFixedBg(); /* C220 */\n    if (cfg && !pxBackingOk(cfg.backing)) cfg.backing = null; /* C475: a Hot Cut pick drops Velcro */\n    if (root.getAttribute('data-px-phase') !== 'config' || !cfg) { if (cfgPanel) cfgPanel.hidden = true; return; }\n    cfgPanel.hidden = false;\n    if (cfgEyebrow) cfgEyebrow.textContent = 'Artwork'; /* Justin 2026-09-10: no file name in the studio eyebrow */\n    var busy = isBusy(), proof = st.mode === 'proof', opt = st.mode === 'options', keys = steps(), key = stepKey(), def = SD(key), t = curType();\n    if (st.mode === 'processing') { cfgTitle.textContent = 'Analyzing your artwork'; cfgSub.textContent = 'One question at a time once this finishes.'; }\n    else if (st.mode === 'generating') { cfgTitle.textContent = 'Generating your AI proof'; cfgSub.textContent = GEN_SUB_BY_KIND[genKind()] || GEN_SUB_BY_KIND.stitch; }\n    else if (proof) { cfgTitle.textContent = 'Your AI proof is ready'; cfgSub.textContent = 'Drag the handle on the preview to compare your upload with the stitched proof.'; }\n    else if (cfg.error) { cfgTitle.textContent = cfg.uploadFailed ? 'That upload did not finish' : 'Something went wrong'; cfgSub.textContent = ''; }\n    else if (cfg.busy) { cfgTitle.textContent = 'Applying your edit'; cfgSub.textContent = 'The AI is reworking the artwork. A few seconds.'; }\n    else {\n      cfgTitle.textContent = key === 'bg' && t.bgLabel ? t.bgLabel.charAt(0).toUpperCase() + t.bgLabel.slice(1) : (key === 'thread' && t.threadLabel ? t.threadLabel.charAt(0).toUpperCase() + t.threadLabel.slice(1) : def.title);\n      cfgSub.textContent = key === 'art' ? (cfg.solid ? 'We detected a solid backdrop behind the artwork. Choose how it should stitch.' : 'Your artwork already has a clear background. Choose how it should stitch.') : (key === 'size' && !pxStitched() ? String(def.sub || '').replace('We check it stitches', 'We check your design') : (def.sub || '')); /* C433 */\n    }\n    /* rail */\n    if (railEl) railEl.innerHTML = keys.map(function (k, i) {\n      /* a step that already holds a pick counts as done even if it sits AFTER the current one (Justin 2026-09-05: changing the type\n         keeps the other choices, so their chips must keep showing them and stay clickable) */\n      var picked = k !== 'type' && k !== 'art' && !!railValue(k);\n      var done = proof || (opt && !cfg.error && (i < cfg.step || picked)) || st.mode === 'generating';\n      var cur = opt && !cfg.error && i === cfg.step;\n      return '<li><button type=\"button\" data-px-rail-step=\"' + i + '\" class=\"' + (done ? 'is-done' : '') + (cur ? ' is-current' : '') + '\"' + ((!done || busy) ? ' disabled' : '') + '><i></i><span>' + SD(k).label + '</span><b class=\"np-px__rail-v\">' + ((done || cur) ? railValue(k) : '') + '</b></button></li>';\n    }).join('');\n    /* body */\n    var html = '';\n    if (st.mode === 'processing' || st.mode === 'generating' || cfg.busy) {\n      /* Justin 2026-09-05: the status card sits UNDER the image (inside the HUD) while the file loads, and is gone while the AI proof renders */\n      html = '';\n      if (loaderCard) { loaderCard.hidden = true; loaderCard.innerHTML = ''; } /* HUD label + status line only, like the proof HUD (Justin 2026-09-05) */\n    } else if (cfg.error) {\n      html = '<div class=\"np-px__errcard\"><b>' + esc(cfg.error) + '</b><div class=\"np-px__selcard-btns\">' + (cfg.uploadFailed ? '<button type=\"button\" class=\"np-px__btn\" data-px-act=\"retry-upload\">Try again</button>' : '<button type=\"button\" class=\"np-px__btn\" data-px-act=\"retry-gen\">Try again</button>') + '<button type=\"button\" class=\"np-px__btn np-px__btn--outline\" data-px-act=\"change-file\">Choose another file</button></div></div>';\n    } else if (proof) {\n      var rows = [['Patch type', esc(t.label)], ['Shape', esc(curShape().display || cfg.shape)], ['Background', cfg.removeBg === true ? 'Removed' : 'Kept']];\n      if (t.bg) rows.push([t.bgLabel ? 'Leather' : 'Felt color', esc(colorName(cfg.bg)) + (cfg.bg && cfg.bg.hex ? '<i style=\"background:' + esc(cfg.bg.hex) + '\"></i>' : '')]);\n      if (t.border) rows.push(['Border', esc(colorName(cfg.border))]);\n      if (t.thread) rows.push([t.threadLabel ? 'Border color' : 'Thread', esc(colorName(cfg.thread)) + (cfg.thread && cfg.thread.hex ? '<i style=\"background:' + esc(cfg.thread.hex) + '\"></i>' : '')]);\n      if (t.backing) rows.push(['Backing', esc(colorName(cfg.backing))]);\n      html = '<div class=\"np-px__summary\">' + rows.map(function (r) { return '<div><span>' + r[0] + '</span><span>' + r[1] + '</span></div>'; }).join('') + '</div><div class=\"np-px__okbanner\">\u2713 Stitch-ready. A designer double-checks before production.</div>';\n    } else if (key === 'type') {\n      var R = cfg.reco || { list: [{ type: TYPES[0], reason: '', score: 96 }], chips: [] };\n      html = (R.chips && R.chips.length ? '<div class=\"np-px__tags np-px__tags--diag\">' + R.chips.map(function (c) { return '<span class=\"np-px__tag is-' + c[0] + '\">' + esc(c[1]) + '</span>'; }).join('') + '</div>' : '') +\n        '<div class=\"np-px__recos\" role=\"radiogroup\" aria-label=\"Recommended patch types\">' + R.list.map(function (r, i) {\n          var on = cfg.type && cfg.type.handle === r.type.handle;\n          return '<button type=\"button\" class=\"np-px__recocard' + (on ? ' is-on' : '') + '\" role=\"radio\" aria-checked=\"' + (on ? 'true' : 'false') + '\" data-px-type-pick=\"' + esc(r.type.label) + '\"><span class=\"np-px__recocard-top\"><span class=\"np-px__radio\" aria-hidden=\"true\"></span><b>' + esc(r.type.label) + '</b></span><em class=\"np-px__match' + (i === 0 ? ' is-top' : '') + '\">' + r.score + '% match</em><small>' + esc(r.reason) + '</small></button>';\n        }).join('') + '</div>' +\n        '<button type=\"button\" class=\"np-px__ghost\" data-px-act=\"toggle-types\">' + (cfg.showAllTypes ? 'Hide other types' : 'View all patch types') + '</button>';\n    } else if (key === 'art') {\n      var bgOn = cfg.removeBg === true;\n      html = '<button type=\"button\" class=\"np-px__togglecard' + (bgOn ? ' is-on' : '') + '\" role=\"switch\" aria-checked=\"' + (bgOn ? 'true' : 'false') + '\" data-px-act=\"bg-toggle\"><span class=\"np-px__choice-text\"><b>Remove the background</b><small>' + (bgOn ? 'On \u00B7 only the artwork gets stitched' : 'Off \u00B7 the full image gets stitched') + '</small></span><span class=\"np-px__switch\" aria-hidden=\"true\"><i></i></span></button>' +\n        '<div class=\"np-px__aiedit\"><button type=\"button\" class=\"np-px__aiedit-head\" data-px-act=\"ai-toggle\" aria-expanded=\"' + (cfg.editOpen ? 'true' : 'false') + '\"><span class=\"np-px__aiedit-ico\">\u2726</span><span class=\"np-px__choice-text\"><b>Edit with AI</b><small>Clean up, simplify, recolor. Describe it</small></span><span class=\"np-px__aiedit-chev\">' + (cfg.editOpen ? '\u25B4' : '\u25BE') + '</span></button>' +\n        '<div class=\"np-px__aiedit-body\"' + (cfg.editOpen ? '' : ' hidden') + '><textarea class=\"np-px__aiedit-ta\" data-px-edit-text maxlength=\"400\" placeholder=\"Describe the change, e.g. \u201Cthicker outline, drop the shadow\u201D\">' + esc(cfg.editText) + '</textarea><div class=\"np-px__chips\" hidden></div>' +\n        '<button type=\"button\" class=\"np-px__btn np-px__btn--purple\" data-px-act=\"ai-apply\">\u2726 Apply edit</button></div></div>';\n    } else if (key === 'size') {\n      html = pxSizeBodyHtml(); /* C229 */\n    } else {\n      var labels = { bg: [t.bgLabel ? 'Leather' : 'Felt', colorName(cfg.bg)], border: ['Border', colorName(cfg.border)], thread: [t.threadLabel ? 'Border color' : 'Thread', colorName(cfg.thread)], backing: ['Backing', colorName(cfg.backing)] }[key];\n      var colorStep = (key === 'bg' && !isLeatherT()) || key === 'thread';\n      var curC = key === 'bg' ? cfg.bg : cfg.thread, palL = colorStep ? paletteList() : [];\n      html = '<div class=\"np-px__selcard\"><b>' + labels[0] + ': ' + esc(labels[1]) + '</b><p>Choose from the options under the preview \u2192</p></div>'; /* Justin 2026-09-08: the detected colours + Match / Let AI choose moved into the colour rail under the preview */\n    }\n    cfgBody.innerHTML = html;\n    /* option rail */\n    if (railArea) railArea.hidden = (st.mode === 'processing' || st.mode === 'generating');\n    if (optRail) {\n      /* Justin 2026-09-05: picking a shape rebuilt the rail and snapped it back to the start \u2014 keep the scroll position\n         when the same step re-renders so the customer can keep browsing from where they were */\n      var railScroller0 = optRail.querySelector('[data-px-scroller]'), railKeepX = (railScroller0 && optRail.getAttribute('data-px-rail-key') === key) ? railScroller0.scrollLeft : 0;\n      var railKeepY = optRail.getAttribute('data-px-rail-key') === key ? optRail.scrollTop : 0; /* the rail scrolls vertically on short cards: a pick must not jump it back to the top */\n      optRail.innerHTML = (opt && !cfg.error && !cfg.busy) ? railHtml(key) : '';\n      optRail.setAttribute('data-px-rail-key', key);\n      if (railKeepY) optRail.scrollTop = railKeepY;\n      var railScroller1 = optRail.querySelector('[data-px-scroller]');\n      if (railScroller1 && railKeepX) { jumpRail(railScroller1, railKeepX); try { syncArrows(); } catch (eSA) {} }\n    }\n    if (opt && !cfg.error && (key === 'art' || key === 'type')) setTimeout(syncArrows, 30);\n    /* bar */\n    if (backBtn) { backBtn.textContent = proof ? '\u2190 Edit options' : (cfg.step === 0 || cfg.error) ? '\u2190 Change file' : '\u2190 Back'; backBtn.disabled = busy; }\n    var soBtn = $('[data-px-startover]'); if (soBtn) soBtn.hidden = !proof;\n    if (nextBtn) {\n      nextBtn.hidden = !!cfg.error || (!proof && !!cfg.art && (busy || !st.artReady)); /* Justin 2026-09-08: no Next while the file is processing or the artwork rendition is still loading (the scan overlay is up) */\n      nextBtn.classList.remove('is-gen', 'is-approve');\n      var last = cfg.step >= keys.length - 1;\n      if (proof) { nextBtn.textContent = 'Approve & Order Proof'; nextBtn.classList.add('is-approve'); nextBtn.disabled = false; }\n      else if (!last) { nextBtn.textContent = 'Next \u00B7 ' + SD(keys[cfg.step + 1]).nextLabel; nextBtn.disabled = busy || !stepDone(key) || (key === 'type' && !dataReady()); }\n      else { var fresh = proofFresh(); nextBtn.textContent = fresh ? 'View AI proof' : '\u2726 Generate AI Patch'; if (!fresh) nextBtn.classList.add('is-gen'); nextBtn.disabled = busy || !stepDone(key); }\n    }\n    renderPreview(); try { pxDims(); } catch (ePD) {} /* C229 rulers */\n    /* the rail content above can flip the desktop layout (stacked <-> side by side, CSS :has + container query) AFTER this\n       synchronous pass measured the wrapper; size the preview once more when layout has settled (2026-09-10) */\n    clearTimeout(renderAll.pvT); renderAll.pvT = setTimeout(function () { if (cfg && root.getAttribute('data-px-phase') === 'config') { try { renderPreview(); pxDims(); } catch (e) {} } }, 40);\n  }\n  function railHtml(key) {\n    var d = D(), t = curType();\n    if (key === 'size') return ''; /* C229: the size inputs live in the left panel; nothing under the preview */\n    if (key === 'type') {\n      if (!cfg.showAllTypes) return '';\n      return '<div class=\"np-px__rail-head\"><span><b>All patch types</b></span><span class=\"np-px__arrows\"><button type=\"button\" class=\"np-px__arrow\" data-px-act=\"rail-left\" aria-label=\"Scroll types left\">\u2039</button><button type=\"button\" class=\"np-px__arrow\" data-px-act=\"rail-right\" aria-label=\"Scroll types right\">\u203A</button></span></div><div class=\"np-px__types\" data-px-scroller>' +\n        TYPES.map(function (ty) { var on = cfg.type && cfg.type.handle === ty.handle, rec = !!(cfg.reco && cfg.reco.list.some(function (r) { return r.type.handle === ty.handle; })); var im = typeImg(ty); return '<button type=\"button\" class=\"np-px__typecard' + (on ? ' is-on' : '') + '\" data-px-type-pick=\"' + esc(ty.label) + '\">' + (im ? '<img class=\"np-px__typecard-img\" src=\"' + esc(im) + '\" alt=\"\">' : '<span class=\"np-px__typecard-img\"></span>') + '<b>' + esc(ty.label) + '</b><small>' + esc(rec ? 'Recommended' : ty.short) + '</small></button>'; }).join('') + '</div>';\n    }\n    if (key === 'art') {\n      var zoomRow = zoomRowHtml();\n      if (!t.shape) return zoomRow;\n      var artSrc = st.artReady ? artDisplayUrl(1000) : ''; /* same rendition as the preview: cached once it lands; until then the thumbs show a mini HUD */\n      return zoomRow + '<div class=\"np-px__rail-head\"><span>Select shape</span><span class=\"np-px__arrows\"><button type=\"button\" class=\"np-px__arrow\" data-px-act=\"rail-left\" aria-label=\"Scroll shapes left\">\u2039</button><button type=\"button\" class=\"np-px__arrow\" data-px-act=\"rail-right\" aria-label=\"Scroll shapes right\">\u203A</button></span></div><div class=\"np-px__shapes\" data-px-shapes data-px-scroller>' +\n        d.shapes.map(function (s) {\n          var dm = dimsFor(s), k = 44 / Math.max(dm[0], dm[1]), c = cssFor(s, Math.round(dm[0] * k), Math.round(dm[1] * k));\n          var isP = s.geom === 'custom';\n          var geoStyle = isP ? 'width:44px;height:44px;' : ('width:' + Math.round(dm[0] * k) + 'px;height:' + Math.round(dm[1] * k) + 'px;border-radius:' + c.radius + ';' + (c.clip ? 'clip-path:' + c.clip + ';-webkit-clip-path:' + c.clip + ';' : ''));\n          var faceStyle = isP ? '' : ('border-radius:' + (c.px ? Math.max(1, c.px - 2) + 'px' : c.inner) + ';' + (c.clip ? 'clip-path:' + c.clip + ';-webkit-clip-path:' + c.clip + ';' : ''));\n          var plateT = isP && st.artReady ? plateUrl(200, true) : '';\n          var inner = isP ? (plateT ? '<img src=\"' + plateT + '\" alt=\"\">' : '<i class=\"np-px__minihud\"></i>') : (artSrc ? '<img src=\"' + esc(artSrc) + '\" alt=\"\">' : '<i class=\"np-px__minihud\"></i>');\n          return '<button type=\"button\" class=\"np-px__shape' + (cfg.shape === s.label ? ' is-on' : '') + '\" data-px-shape-pick=\"' + esc(s.label) + '\"><span class=\"np-px__shape-thumb\"><i class=\"' + (isP ? 'is-plate' : '') + '\" style=\"' + geoStyle + '\"><span class=\"np-px__shape-face' + (isP ? ' np-px__shape-face--plate' : '') + '\" style=\"' + faceStyle + '\">' + inner + '</span></i></span><span>' + esc(s.display || s.label) + (isP ? ftip('What is Design\u2019s Shape?', TIPS.ds) : '') + '</span></button>';\n        }).join('') + '</div>' + (isRectGeom(curShape().geom) ? '<div class=\"np-px__corners\"><span>Corners</span><button type=\"button\" class=\"np-px__corner' + (cfg.corners !== 'square' ? ' is-on' : '') + '\" data-px-corner=\"rounded\"><i class=\"np-px__corner-glyph np-px__corner-glyph--r\"></i>Rounded</button><button type=\"button\" class=\"np-px__corner' + (cfg.corners === 'square' ? ' is-on' : '') + '\" data-px-corner=\"square\"><i class=\"np-px__corner-glyph\"></i>Square</button></div>' : ''); /* PDP corners choice (Justin 2026-09-08) */\n    }\n    if (key === 'bg' || key === 'thread') {\n      var list = key === 'bg' ? d.bgs : d.threads, cur = key === 'bg' ? cfg.bg : cfg.thread;\n      var headL = key === 'bg' ? (t.bgLabel ? t.bgLabel.charAt(0).toUpperCase() + t.bgLabel.slice(1) : 'Patch background') : (t.threadLabel ? t.threadLabel.charAt(0).toUpperCase() + t.threadLabel.slice(1) : 'Border thread');\n      var mats = key === 'bg' && isLeatherT();\n      /* Justin 2026-09-05: two rows of swatches, then a \"Show all\" control (auto-expands when the pick sits further down) */\n      var all = list.filter(function (c) { return c.hex; }), LIMIT = twoRowLimit(), /* C203 (Justin 2026-09-14): exactly TWO rows at any width, the Custom tile taking the last slot of row two, View all underneath */ more = !!(cfg.moreColors && cfg.moreColors[key]) || mats || all.length <= LIMIT; /* C218b: 2\u00B7perRow slots hold LIMIT colours + the Custom tile \u2014 `<= LIMIT + 1` let a 26th colour push Custom onto a third row */ /* per step: felt and thread each start at two rows */\n      if (!more && cur && all.some(function (c, ix) { return ix >= LIMIT && c.label === cur.label && c.hex === cur.hex; })) more = true;\n      var visible = more ? all : all.slice(0, LIMIT);\n      st.twoRow = LIMIT; /* C218: remembered so a resize that changes how many tiles fit a row can re-render the palette */\n      var isCustomCur = !!(cur && !all.some(function (c) { return c.label === cur.label && c.hex === cur.hex; })); /* a PMS-named or detected pick lights the Custom tile */\n      var palR = mats ? [] : paletteList();\n      var noCustom471 = key === 'bg' && !!typeRule().noCustomBg; /* C471: no Custom tile, and the artwork colours snap to the nearest stock colour */\n      if (noCustom471) { var seen471 = {}; palR = palR.map(function (pc) { var sN = stockNearest471(pc.hex, all); return sN ? { hex: sN.hex, name: sN.label } : pc; }).filter(function (pc) { if (seen471[pc.name]) return false; seen471[pc.name] = 1; return true; }); }\n      var photoBtn = (key === 'bg' && typeRule().photoBtn) ? '<button type=\"button\" class=\"np-px__btn np-px__btn--outline np-px__btn--sm' + ((cur && cur.photo) ? ' is-on' : '') + '\" data-px-act=\"photo-bg\" title=\"The photo itself fills the patch; no background colour\">It\\u2019s a photo</button>' : ''; /* C220: PDP photoBtn (Printed) */\n      var actions = mats ? '' : '<div class=\"np-px__rail-actions\">' + photoBtn + '<button type=\"button\" class=\"np-px__btn np-px__btn--outline np-px__btn--sm\" data-px-act=\"match\">Match artwork' + ftip('What does Match artwork do?', TIPS.match) + '</button><button type=\"button\" class=\"np-px__btn np-px__btn--sm\" data-px-act=\"ai-choose\">\u2726 Let AI choose' + ftip('What does Let AI choose do?', TIPS.ai) + '</button></div>';\n      /* Justin 2026-09-08: the two buttons sit INSIDE the detected-colours panel, right of the chips; the body wraps in\n         reverse so they only move UP (above the chips) when the chips need the full width */\n      var noneTile = '<button type=\"button\" class=\"np-px__swatch np-px__swatch--none' + ((cur && cur.none) ? ' is-on' : '') + '\" data-px-color=\"none\" data-px-color-label=\"None\" title=\"No border rim\"><i></i><span>None</span></button>'; /* C220/C222: the PDP's None rim tile (np-emb2 :4833) */\n      var artBlock = palR.length ? '<div class=\"np-px__artcolors np-px__artcolors--rail\"><div class=\"np-px__artcolors-head\"><span>Colors in your artwork</span><em>' + palR.length + ' detected</em></div><div class=\"np-px__artcolors-body\"><div class=\"np-px__artcolors-row\">' + ((key === 'thread' && typeRule().noneTile) ? noneTile : '') +\n        palR.map(function (pc) { var onC = !!(cur && cur.hex && String(cur.hex).toUpperCase() === String(pc.hex).toUpperCase()); /* C471: snapped stock hexes keep the template's case */ return '<button type=\"button\" class=\"np-px__artcolor' + (onC ? ' is-on' : '') + '\" data-px-color=\"' + esc(pc.hex) + '\" data-px-color-label=\"' + esc(pc.name) + '\" title=\"' + esc(pc.name) + '\"><i style=\"background:' + esc(pc.hex) + '\"></i><span>' + esc(pc.name) + '</span></button>'; }).join('') + '</div>' + actions + '</div></div>' : actions;\n      return '<div class=\"np-px__rail-head\"><span><b>' + esc(headL) + '</b><em>' + (cur ? esc(cur.label) : 'None selected') + '</em></span></div>' + artBlock + '<div class=\"np-px__artcolors np-px__stdcolors\"><div class=\"np-px__artcolors-head\"><span>' + (mats ? 'Materials' : 'Standard colors') + '</span><em>' + all.length + (mats ? ' options' : ' colors') + '</em></div><div class=\"np-px__swatches' + (mats ? ' np-px__swatches--mats' : '') + '\">' + /* C219 (Justin 2026-09-15: \"all colors should be with a white background behind it like Colors in your artwork, then it should say Standard colors\") */\n        ((key === 'thread' && typeRule().noneTile && !palR.length) ? noneTile : '') + /* C220/C222: the None rim tile rides with the artwork colours when that row exists */\n        visible.map(function (c) { return '<button type=\"button\" class=\"np-px__swatch' + (cur && cur.label === c.label && cur.hex === c.hex ? ' is-on' : '') + '\" data-px-color=\"' + esc(c.hex) + '\" data-px-color-label=\"' + esc(c.label) + '\" title=\"' + esc(c.label) + '\"><i style=\"background:' + esc(c.hex) + (c.img ? ' url(' + esc(c.img) + ') center/cover' : '') + '\"></i><span>' + esc(c.label) + '</span></button>'; }).join('') +\n        ((mats || noCustom471) ? '' : '<label class=\"np-px__swatch' + (isCustomCur ? ' is-on' : '') + '\" title=\"Custom color\"><i style=\"background:conic-gradient(#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)\"></i><span>Custom</span><input type=\"color\" data-px-color-custom value=\"' + esc(isCustomCur ? cur.hex : '#1aa86c') + '\" style=\"position:absolute;opacity:0;width:1px;height:1px;pointer-events:none\"></label>') + '</div>' +\n        (more ? '' : '<button type=\"button\" class=\"np-px__ghost np-px__ghost--sm\" data-px-act=\"more-colors\">View all ' + all.length + ' colors</button>') + '</div>' + (key === 'thread' ? thickRowHtml() : '') + ((key === 'bg' && typeRule().etchInvert) ? '<div class=\"np-px__rail-actions np-px__rail-actions--etch\"><button type=\"button\" class=\"np-px__btn np-px__btn--sm ' + (cfg.etchInvert ? 'np-px__btn--green' : 'np-px__btn--outline') + '\" data-px-act=\"etch-invert\">' + (cfg.etchInvert ? 'Inverted Etch \\u2713' : 'Invert the etch') + '</button></div>' : ''); /* C220: PDP Invert the etch (leather) */\n    }\n    if (key === 'border' || key === 'backing') {\n      var isBorder = key === 'border';\n      var items = isBorder ? d.borders.filter(pxBorderOk) : pxBackings(d); /* C475; C502 */\n      var sel = isBorder ? cfg.border : cfg.backing;\n      return (isBorder ? zoomRowHtml() : '') + '<div class=\"np-px__rail-head\"><span><b>' + (isBorder ? 'Border style' : 'Backing') + '</b></span></div><div class=\"np-px__ocards' + (isBorder ? '' : ' np-px__ocards--backing') + '\">' +\n        items.map(function (o) { return '<button type=\"button\" class=\"np-px__ocard' + (sel && sel.label === o.label ? ' is-on' : '') + '\" data-px-opt-pick=\"' + esc(o.label) + '\">' + (o.img ? '<img class=\"np-px__ocard-img\" src=\"' + esc(o.img) + '\" alt=\"\" loading=\"lazy\">' : '<span class=\"np-px__ocard-img\"></span>') + '<b>' + esc(o.label) + '</b><small>' + esc(o.note || '') + '</small></button>'; }).join('') + '</div>' + (isBorder ? thickRowHtml() : '');\n    }\n    return '';\n  }\n  function jumpRail(sc, x) { /* instant restore: the rail scrolls smoothly by CSS, and a smooth restore would visibly slide in from the start */ var prev = sc.style.scrollBehavior; sc.style.scrollBehavior = 'auto'; sc.scrollLeft = x; sc.style.scrollBehavior = prev; }\n  function syncArrows() {\n    var sc = $('[data-px-scroller]'); if (!sc) return;\n    var l = $('[data-px-act=\"rail-left\"]'), r = $('[data-px-act=\"rail-right\"]');\n    var canL = sc.scrollLeft > 2, canR = sc.scrollLeft + sc.clientWidth < sc.scrollWidth - 2;\n    if (l) l.disabled = !canL; if (r) r.disabled = !canR;\n  }\n  root.addEventListener('scroll', function (e) { if (e.target && e.target.getAttribute && e.target.hasAttribute('data-px-scroller')) syncArrows(); }, true);\n\n  /* ---- interactions ---- */\n  function findIn(list, label) { var f = null; (list || []).forEach(function (o) { if (o.label === label) f = o; }); return f; }\n  root.addEventListener('click', function (e) {\n    var tipEl = e.target.closest && e.target.closest('[data-px-ftip]');\n    if (tipEl) { e.preventDefault(); e.stopPropagation(); if (e.target.closest('.np-px__ftip-pop')) return; if (tipEl.classList.contains('is-open')) closeTips(); else openTip(tipEl); return; } /* a tip tap never counts as a pick */\n    if (!cfg || root.getAttribute('data-px-phase') !== 'config') return;\n    var tEl = e.target.closest ? e.target.closest('[data-px-act],[data-px-corner],[data-px-shape-pick],[data-px-color],[data-px-opt-pick],[data-px-chip],[data-px-rail-step],[data-px-type-pick]') : null;\n    if (!tEl) return;\n    var d = D(), key = stepKey();\n    if (tEl.hasAttribute('data-px-rail-step')) { var i = parseInt(tEl.getAttribute('data-px-rail-step'), 10); if (!tEl.disabled) { cfg.step = i; st.mode = 'options'; renderAll(); } return; }\n    if (tEl.hasAttribute('data-px-type-pick')) { var fromSize = key === 'size'; selectType(typeByLabel(tEl.getAttribute('data-px-type-pick'))); if (fromSize) pxFocusAfterSwitch(); return; } /* C230 */\n    if (tEl.hasAttribute('data-px-corner')) { cfg.corners = tEl.getAttribute('data-px-corner') === 'square' ? 'square' : 'rounded'; renderAll(); return; }\n    if (tEl.hasAttribute('data-px-shape-pick')) { cfg.shape = tEl.getAttribute('data-px-shape-pick'); if (cfg.border && !pxBorderOk(cfg.border)) cfg.border = null; /* C502 */ renderAll(); return; }\n    if (tEl.hasAttribute('data-px-color')) { if (tEl.getAttribute('data-px-color') === 'none') { if (key === 'thread') cfg.thread = { label: 'None', hex: '', none: true }; renderAll(); return; } /* C220 */ var col = { label: tEl.getAttribute('data-px-color-label'), hex: tEl.getAttribute('data-px-color') }; if (key === 'bg') cfg.bg = col; else cfg.thread = col; renderAll(); return; }\n    if (tEl.hasAttribute('data-px-opt-pick')) { var lab = tEl.getAttribute('data-px-opt-pick'); if (key === 'border') cfg.border = findIn(d.borders, lab); else cfg.backing = findIn(d.backings, lab); renderAll(); return; }\n    if (tEl.hasAttribute('data-px-chip')) { var c = tEl.getAttribute('data-px-chip'); var ix = cfg.chips.indexOf(c); if (ix > -1) cfg.chips.splice(ix, 1); else cfg.chips.push(c); tEl.classList.toggle('is-on', ix === -1); return; }\n    var act = tEl.getAttribute('data-px-act');\n    if (act === 'toggle-types') { cfg.showAllTypes = !cfg.showAllTypes; renderAll(); }\n    else if (act === 'photo-bg') { cfg.bg = (cfg.bg && cfg.bg.photo) ? null : { label: 'Photo (full bleed)', hex: '', follow: true, photo: true }; renderAll(); } /* C220 */\n    else if (act === 'etch-invert') { cfg.etchInvert = !cfg.etchInvert; renderAll(); } /* C220 */\n    else if (act === 'more-colors') { cfg.moreColors = cfg.moreColors || {}; cfg.moreColors[key] = true; renderAll(); }\n    else if (act === 'bg-toggle') { cfg.removeBg = !(cfg.removeBg === true); renderAll(); }\n    else if (act === 'ai-toggle') { cfg.editOpen = !cfg.editOpen; renderAll(); if (cfg.editOpen) { var ta = $('[data-px-edit-text]'); if (ta) ta.focus(); } }\n    else if (act === 'ai-apply') { aiEdit(); }\n    else if (act === 'match') { if (!cfg.dominant) return; if (key === 'bg') cfg.bg = nearestColor(cfg.dominant, d.bgs); else cfg.thread = nearestColor(cfg.dominant, d.threads); renderAll(); }\n    else if (act === 'ai-choose') {\n      var dark = cfg.dominant ? lum(cfg.dominant) < 0.55 : true;\n      if (key === 'bg') cfg.bg = findColor(d.bgs, dark ? 'White' : 'Black');\n      else { var bgLight = cfg.bg && cfg.bg.hex ? lum(hexToRgb(cfg.bg.hex)) > 0.55 : true; cfg.thread = findColor(d.threads, bgLight ? 'Black' : 'White'); }\n      renderAll();\n    }\n    else if (act === 'rail-left' || act === 'rail-right') { var sc = $('[data-px-scroller]'); if (sc) sc.scrollBy({ left: act === 'rail-left' ? -320 : 320, behavior: (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) ? 'auto' : 'smooth' }); }\n    else if (act === 'retry-upload') { if (st.lastFile) beginUpload(st.lastFile); }\n    else if (act === 'retry-gen') { cfg.error = null; renderAll(); }\n    else if (act === 'change-file') { changeFile(); }\n  });\n  root.addEventListener('input', function (e) {\n    if (!cfg) return;\n    var tEl = e.target;\n    if (tEl.hasAttribute && tEl.hasAttribute('data-px-edit-text')) cfg.editText = tEl.value;\n    if (tEl.hasAttribute && tEl.hasAttribute('data-px-lbthick')) { cfg.lbThick = Math.max(1, Math.min(10, parseInt(tEl.value, 10) || lbThick())); tEl.style.cssText = thickTrack(cfg.lbThick); var tv = $('[data-px-lbthick-val]'); if (tv) tv.textContent = cfg.lbThick + '/10'; renderPreview(); } /* C219 */\n    if (tEl.hasAttribute && tEl.hasAttribute('data-px-artzoom')) { cfg.artZoom = Math.max(0.6, Math.min(2.5, (parseInt(tEl.value, 10) || 100) / 100)); if (Math.abs((cfg.artZoom || 1) - 1) < 0.001) { cfg.artDx = 0; cfg.artDy = 0; } /* 100% = centred again */ tEl.style.cssText = zoomTrack(cfg.artZoom); var zv = $('[data-px-artzoom-val]'); if (zv) zv.textContent = Math.round(cfg.artZoom * 100) + '%'; renderPreview(); }\n    if (tEl.hasAttribute && tEl.hasAttribute('data-px-color-custom')) { var col = { label: pmsName(tEl.value), hex: tEl.value }; if (stepKey() === 'bg') cfg.bg = col; else cfg.thread = col; renderPreview(); var em = $('.np-px__rail-head em'); if (em) em.textContent = pmsName(tEl.value); }\n  });\n  root.addEventListener('change', function (e) { var tEl = e.target; if (cfg && tEl.hasAttribute && tEl.hasAttribute('data-px-color-custom')) renderAll(); });\n  var startOver = $('[data-px-startover]');\n  if (startOver) startOver.addEventListener('click', function () { if (!isBusy()) changeFile(); });\n  if (backBtn) backBtn.addEventListener('click', function () {\n    if (!cfg || isBusy()) return;\n    if (st.mode === 'proof') { st.mode = 'options'; cfg.step = steps().length - 1; renderAll(); return; }\n    if (cfg.step === 0 || cfg.error) { changeFile(); return; }\n    cfg.step--; renderAll();\n  });\n  if (nextBtn) nextBtn.addEventListener('click', function () {\n    if (!cfg || isBusy() || nextBtn.disabled) return;\n    if (st.mode === 'proof') { approve(); return; }\n    var keys = steps(), key = stepKey();\n    if (cfg.step < keys.length - 1) { if (stepDone(key)) { cfg.step++; renderAll(); } return; }\n    if (stepDone(key)) { if (proofFresh()) { st.mode = 'proof'; renderAll(); } else generateProof(); }\n  });\n\n  /* ---- Edit with AI (image proxy, gram-edit \u2014 the builders' Edit-with-AI route) ---- */\n  /* C536 (Justin 2026-11-02): Ideogram 4.5 through its generate endpoint (gram-edit-45g). Unlike precise-edit (C533's gram-edit-45) it returns real transparency when the customer asks to remove a background. The concept generator (genOne) stays on gram-edit: it is not Edit with AI. */\n  function aiEdit() {\n    var text = safeText(cfg.editText || ''), chips = cfg.chips.slice();\n    var prompt = [text].concat(chips).filter(Boolean).join('. ');\n    if (!prompt) { var ta = $('[data-px-edit-text]'); if (ta) ta.focus(); return; }\n    var seq = ++st.seq;\n    cfg.busy = 'edit'; renderAll();\n    hud('Applying your edit', 'Reworking the artwork\u2026', true);\n    fetch(AI_API, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gram-edit-45g', imageUrl: artDisplayUrl(), prompt: prompt, transparency: 'AUTO' }) })\n      .then(function (r) { return r.json().then(function (j) { if (!r.ok || !j || !j.url) throw new Error(String((j && (j.details || j.error)) || ('HTTP ' + r.status)).slice(0, 200)); return toImgix(j.url); }); })\n      .then(function (url) {\n        if (seq !== st.seq) return;\n        cfg.art.hosted = url.split('?')[0];\n        cfg.edits = cfg.edits.concat(chips.length ? chips : [text.slice(0, 40)]);\n        cfg.editText = ''; cfg.chips = []; cfg.editOpen = false; cfg.busy = null;\n        hudOff();\n        var im = new Image(); im.crossOrigin = 'anonymous';\n        im.onload = function () { if (seq !== st.seq) return; try { cfg.art.ratio = im.naturalHeight / Math.max(1, im.naturalWidth); analyzeArt(im); } catch (e) {} renderAll(); };\n        im.onerror = function () { if (seq === st.seq) renderAll(); };\n        im.src = artDisplayUrl(600);\n        renderAll();\n      })\n      .catch(function (err) { if (seq !== st.seq) return; cfg.busy = null; hudOff(); renderAll(); say('The AI edit did not come back. Try a shorter description.'); try { console.warn('[patch-express] ai edit failed', err); } catch (e) {} });\n  }\n\n  /* ---- generate: composed reference \u2192 Patch Sensei session \u2192 poll \u2192 proof ---- */\n  function merrowPattern(x, hex, ring) {\n    var tt = Math.max(6, Math.round((ring || 24) * 0.55));\n    var p = document.createElement('canvas'); p.width = tt; p.height = tt;\n    var px = p.getContext('2d');\n    px.fillStyle = hex || '#0C0C0E'; px.fillRect(0, 0, tt, tt);\n    px.strokeStyle = 'rgba(0,0,0,0.32)'; px.lineWidth = Math.max(2, tt * 0.32);\n    px.beginPath(); px.moveTo(-tt * 0.25, tt * 0.75); px.lineTo(tt * 0.75, -tt * 0.25); px.moveTo(tt * 0.25, tt * 1.25); px.lineTo(tt * 1.25, tt * 0.25); px.stroke();\n    px.strokeStyle = 'rgba(255,255,255,0.24)'; px.lineWidth = Math.max(1, tt * 0.16);\n    px.beginPath(); px.moveTo(-tt * 0.125, tt); px.lineTo(tt, -tt * 0.125); px.moveTo(tt * 0.5, tt * 1.4); px.lineTo(tt * 1.4, tt * 0.5); px.stroke();\n    return x.createPattern(p, 'repeat');\n  }\n  /* the compare's Digital mockup uses the SAME framing as the Sensei reference (12% pad) on white, so the digital\n     patch and the AI patch render at the same size (Justin 2026-09-05) */\n  function padWhite(cv) {\n    var pad = Math.round(Math.max(cv.width, cv.height) * 0.12);\n    var out = document.createElement('canvas'); out.width = cv.width + pad * 2; out.height = cv.height + pad * 2;\n    var x = out.getContext('2d'); x.fillStyle = '#ffffff'; x.fillRect(0, 0, out.width, out.height); x.drawImage(cv, pad, pad);\n    return out;\n  }\n  function backdrop(cv, avoid) {\n    var cands = [[179, 179, 179, '#B3B3B3'], [98, 102, 109, '#62666D']], back = cands[0][3], bestD = -1;\n    cands.forEach(function (c) {\n      var dMin = Infinity;\n      (avoid || []).forEach(function (h) { if (!h || !/^#[0-9a-fA-F]{6}$/.test(h)) return; var p = hexToRgb(h); var dd = Math.sqrt((p[0] - c[0]) * (p[0] - c[0]) + (p[1] - c[1]) * (p[1] - c[1]) + (p[2] - c[2]) * (p[2] - c[2])); if (dd < dMin) dMin = dd; });\n      if (dMin > bestD) { bestD = dMin; back = c[3]; }\n    });\n    var pad = Math.round(Math.max(cv.width, cv.height) * 0.12);\n    var out = document.createElement('canvas'); out.width = cv.width + pad * 2; out.height = cv.height + pad * 2;\n    var x = out.getContext('2d'); x.fillStyle = back; x.fillRect(0, 0, out.width, out.height); x.drawImage(cv, pad, pad);\n    return out;\n  }\n  /* \u2500\u2500 Design's Shape plate = np-emb2 composePatchImage's custom branch (lines 7353-7569, C143), ported 1:1\n     (leather / Free Form / texture / monoTone paths left out \u2014 Express has none of those): the artwork\n     silhouette (binarised) is DILATED 5% of C into one bubble hugging the whole design (97 offset stamps),\n     a self-enclosed single-outline design cuts on its own contour instead (holes filled, no bubble), the\n     ring (28 stamps \u00D7 ringC) follows that contour, the plate fills it (#f2f2f2 until a background is picked,\n     then the picked colour), and the art sits on top. \u2500\u2500 */\n  function composePlate(img, C, ov) {\n    ov = ov || {};\n    var padC = Math.round(C * 0.1);\n    var sC = Math.min((C - padC * 2) / img.naturalWidth, (C - padC * 2) / img.naturalHeight);\n    var awC = Math.max(1, Math.round(img.naturalWidth * sC)), ahC = Math.max(1, Math.round(img.naturalHeight * sC));\n    var WC = awC + padC * 2, HC = ahC + padC * 2;\n    var cvC = document.createElement('canvas'); cvC.width = WC; cvC.height = HC;\n    var xC = cvC.getContext('2d');\n    var ringC = ov.thin ? Math.round(C * 0.012) : ((ov.noBorder || ov.noPick) ? 0 : Math.round(C * (ov.merrow ? 0.016 : 0.012)));\n    var baseR = Math.round(C * 0.05);\n    var bgHex = ov.bg || '#f2f2f2', ringHex = ov.ring || '#9CA3AF';\n    if (!ov.bg && ringC === 0 && !ov.thin && !ov.noBorder) ringC = Math.round(C * 0.012); /* plateDS: neutral hot-cut edge until a thread colour exists */\n    var leatherCutC = !!ov.leather;\n    if (leatherCutC) ringC = 0; /* C546 (np-emb2 leatherCutC): the hide is cut on the artwork's contour \u2014 no ring, the Etched Border is a burn band */\n    /* C472 mirror of np-emb2 (sublimation registration): a Full Color custom shape with a border keeps at least\n       NP_SUBLI_SAFE_IN between the design and the border at the entered size (ov.subli = [w, h] inches) */\n    var subliGapC = 0;\n    if (ov.subli && ringC > 0 && !ov.thin && ov.subli[0] > NP_SUBLI_SAFE_IN * 4) {\n      var ppiS = (awC + ringC * 2) / (ov.subli[0] - NP_SUBLI_SAFE_IN * 2);\n      if (ov.subli[1] > NP_SUBLI_SAFE_IN * 4) ppiS = Math.max(ppiS, (ahC + ringC * 2) / (ov.subli[1] - NP_SUBLI_SAFE_IN * 2));\n      subliGapC = Math.ceil(NP_SUBLI_SAFE_IN * ppiS);\n      baseR = Math.max(baseR, subliGapC);\n      if (baseR + ringC + 4 > padC) { padC = baseR + ringC + 4; WC = awC + padC * 2; HC = ahC + padC * 2; cvC.width = WC; cvC.height = HC; }\n    }\n    if (subliGapC && ov.follow) bgHex = npArtEdgeHex(img) || '#ffffff'; /* C472b: a follow/photo background = the art's own background colour in the margin, else white fabric */\n    var sil = document.createElement('canvas'); sil.width = awC; sil.height = ahC;\n    var sx2 = sil.getContext('2d');\n    sx2.drawImage(img, 0, 0, awC, ahC);\n    sx2.globalCompositeOperation = 'source-in';\n    sx2.fillStyle = '#000';\n    sx2.fillRect(0, 0, awC, ahC);\n    (function () { var sdI = sx2.getImageData(0, 0, awC, ahC), sdD = sdI.data; for (var oS = 3; oS < sdD.length; oS += 4) sdD[oS] = sdD[oS] < 64 ? 0 : 255; sx2.putImageData(sdI, 0, 0); })();\n    var contourCut = false;\n    (function () {\n      var sdI2 = sx2.getImageData(0, 0, awC, ahC), dd2 = sdI2.data;\n      var ext2 = new Uint8Array(awC * ahC), stk2 = [];\n      var push2 = function (px, py) { if (px < 0 || py < 0 || px >= awC || py >= ahC) return; var o2 = py * awC + px; if (ext2[o2] || dd2[o2 * 4 + 3] > 127) return; ext2[o2] = 1; stk2.push(o2); };\n      for (var bi = 0; bi < awC; bi++) { push2(bi, 0); push2(bi, ahC - 1); }\n      for (var bj = 0; bj < ahC; bj++) { push2(0, bj); push2(awC - 1, bj); }\n      while (stk2.length) { var oP = stk2.pop(), pxP = oP % awC, pyP = (oP / awC) | 0; push2(pxP + 1, pyP); push2(pxP - 1, pyP); push2(pxP, pyP + 1); push2(pxP, pyP - 1); }\n      var filled = new Uint8Array(awC * ahC), fillN = 0, seed = -1;\n      for (var oF = 0; oF < awC * ahC; oF++) if (!ext2[oF]) { filled[oF] = 1; fillN++; if (seed < 0) seed = oF; }\n      if (!fillN) return;\n      var comp = new Uint8Array(awC * ahC), compN = 0, stk3 = [seed];\n      comp[seed] = 1;\n      while (stk3.length) {\n        var oC = stk3.pop(); compN++;\n        var pxC = oC % awC, pyC = (oC / awC) | 0;\n        if (pxC + 1 < awC && !comp[oC + 1] && filled[oC + 1]) { comp[oC + 1] = 1; stk3.push(oC + 1); }\n        if (pxC > 0 && !comp[oC - 1] && filled[oC - 1]) { comp[oC - 1] = 1; stk3.push(oC - 1); }\n        if (pyC + 1 < ahC && !comp[oC + awC] && filled[oC + awC]) { comp[oC + awC] = 1; stk3.push(oC + awC); }\n        if (pyC > 0 && !comp[oC - awC] && filled[oC - awC]) { comp[oC - awC] = 1; stk3.push(oC - awC); }\n      }\n      if (compN / fillN < 0.97) return; /* disconnected pieces keep the bubble */\n      contourCut = true;\n      /* C426 (np-emb2 parity, Justin 2026-09-28 \"the holes in the letters kept filling in\"): an enclosed empty region that\n         touches only ONE piece of the art (a letter counter, a ring's opening) is cut out, and the border runs around it;\n         one that touches several pieces (a frame around a wordmark) still fills, as does anything under 1.5% of the box. */\n      (function () {\n        if (isLeatherT()) return; /* C545 (np-emb2 parity): leather is never cut \u2014 enclosed openings stay hide, no white shows through */\n        var N4 = awC * ahC, olab = new Int32Array(N4), nL = 0, stO = [], oMinX = awC, oMinY = ahC, oMaxX = -1, oMaxY = -1;\n        for (var o4 = 0; o4 < N4; o4++) {\n          if (olab[o4] || dd2[o4 * 4 + 3] <= 127) continue;\n          nL++; olab[o4] = nL; stO.push(o4);\n          while (stO.length) {\n            var q4 = stO.pop(), qx4 = q4 % awC, qy4 = (q4 / awC) | 0;\n            if (qx4 < oMinX) oMinX = qx4; if (qx4 > oMaxX) oMaxX = qx4; if (qy4 < oMinY) oMinY = qy4; if (qy4 > oMaxY) oMaxY = qy4;\n            if (qx4 + 1 < awC && !olab[q4 + 1] && dd2[(q4 + 1) * 4 + 3] > 127) { olab[q4 + 1] = nL; stO.push(q4 + 1); }\n            if (qx4 > 0 && !olab[q4 - 1] && dd2[(q4 - 1) * 4 + 3] > 127) { olab[q4 - 1] = nL; stO.push(q4 - 1); }\n            if (qy4 + 1 < ahC && !olab[q4 + awC] && dd2[(q4 + awC) * 4 + 3] > 127) { olab[q4 + awC] = nL; stO.push(q4 + awC); }\n            if (qy4 > 0 && !olab[q4 - awC] && dd2[(q4 - awC) * 4 + 3] > 127) { olab[q4 - awC] = nL; stO.push(q4 - awC); }\n          }\n        }\n        if (oMaxX < 0) return;\n        var minHole = (oMaxX - oMinX + 1) * (oMaxY - oMinY + 1) * 0.015, hseen = new Uint8Array(N4);\n        for (var h4 = 0; h4 < N4; h4++) {\n          if (hseen[h4] || ext2[h4] || dd2[h4 * 4 + 3] > 127) continue;\n          var pixH = [], stH = [h4], touch = 0, multi = false;\n          hseen[h4] = 1;\n          while (stH.length) {\n            var p4 = stH.pop(); pixH.push(p4);\n            var px4 = p4 % awC, nb4 = [px4 + 1 < awC ? p4 + 1 : -1, px4 > 0 ? p4 - 1 : -1, p4 + awC < N4 ? p4 + awC : -1, p4 - awC];\n            for (var k4 = 0; k4 < 4; k4++) {\n              var n4 = nb4[k4]; if (n4 < 0) continue;\n              if (dd2[n4 * 4 + 3] > 127) { if (!touch) touch = olab[n4]; else if (olab[n4] !== touch) multi = true; continue; }\n              if (!hseen[n4] && !ext2[n4]) { hseen[n4] = 1; stH.push(n4); }\n            }\n          }\n          if (multi || pixH.length < minHole) continue;\n          for (var c4 = 0; c4 < pixH.length; c4++) filled[pixH[c4]] = 0;\n        }\n      })();\n      for (var oW = 0; oW < awC * ahC; oW++) dd2[oW * 4 + 3] = filled[oW] ? 255 : 0;\n      sx2.putImageData(sdI2, 0, 0);\n    })();\n    var mask = document.createElement('canvas'); mask.width = WC; mask.height = HC;\n    var mx2 = mask.getContext('2d');\n    mx2.drawImage(sil, padC, padC);\n    if (!contourCut) npDiskDilate(mx2, WC, HC, baseR); /* C463: a true dilation, not 96 stamped copies */\n    else if (subliGapC) npDiskDilate(mx2, WC, HC, subliGapC); /* C472: art cut on its own contour still clears the border */\n    if (!contourCut) npOnePiece549(mx2, WC, HC, C); /* C549: one piece, never two */\n    if (leatherCutC) {\n      /* C546 (np-emb2 leatherCutC): fill INTERIOR holes of the silhouette so knockout detail sits on leather (etched), while the\n         outer contour stays the exact cut: flood the exterior from the canvas border, then everything not exterior becomes mask */\n      var midL = mx2.getImageData(0, 0, WC, HC), mdL = midL.data, extL = new Uint8Array(WC * HC), stkL = [];\n      var pushL = function (px3, py3) { if (px3 < 0 || py3 < 0 || px3 >= WC || py3 >= HC) return; var o3 = py3 * WC + px3; if (extL[o3] || mdL[o3 * 4 + 3] > 40) return; extL[o3] = 1; stkL.push(o3); };\n      for (var bi3 = 0; bi3 < WC; bi3++) { pushL(bi3, 0); pushL(bi3, HC - 1); }\n      for (var bj3 = 0; bj3 < HC; bj3++) { pushL(0, bj3); pushL(WC - 1, bj3); }\n      while (stkL.length) { var oPL = stkL.pop(), pxPL = oPL % WC, pyPL = (oPL / WC) | 0; pushL(pxPL + 1, pyPL); pushL(pxPL - 1, pyPL); pushL(pxPL, pyPL + 1); pushL(pxPL, pyPL - 1); }\n      for (var oFL = 0; oFL < WC * HC; oFL++) { if (!extL[oFL]) mdL[oFL * 4 + 3] = 255; }\n      mx2.putImageData(midL, 0, 0);\n    }\n    if (ringC > 0) {\n      var ringLayer = document.createElement('canvas'); ringLayer.width = WC; ringLayer.height = HC;\n      var rx2 = ringLayer.getContext('2d');\n      rx2.drawImage(mask, 0, 0); npDiskDilate(rx2, WC, HC, ringC); /* C463: the ring is the mask dilated for real, not 28 stamps */\n      rx2.globalCompositeOperation = 'source-in'; rx2.fillStyle = ringHex; rx2.fillRect(0, 0, WC, HC);\n      xC.drawImage(ringLayer, 0, 0);\n    }\n    var baseLayer = document.createElement('canvas'); baseLayer.width = WC; baseLayer.height = HC;\n    var bx2 = baseLayer.getContext('2d');\n    bx2.drawImage(mask, 0, 0); bx2.globalCompositeOperation = 'source-in'; bx2.fillStyle = bgHex; bx2.fillRect(0, 0, WC, HC);\n    xC.drawImage(baseLayer, 0, 0);\n    if (!leatherCutC) { xC.drawImage(img, padC, padC, awC, ahC); return cvC; }\n    /* C546 (np-emb2 custom branch): INVERTED etch burns the whole cut face, then the art is etched in the hide tone (bare);\n       otherwise the art is the two-tone etch on the hide */\n    if (ov.leather.inv) {\n      var invL = document.createElement('canvas'); invL.width = WC; invL.height = HC;\n      var ivx = invL.getContext('2d'); ivx.drawImage(mask, 0, 0); ivx.globalCompositeOperation = 'source-in'; ivx.fillStyle = ov.leather.tone; ivx.fillRect(0, 0, WC, HC);\n      xC.drawImage(invL, 0, 0);\n    }\n    xC.drawImage(etchArtCanvas(img, awC, ahC, ov.leather.inv ? (bgHex || '#DCA05F') : null), padC, padC, awC, ahC);\n    if (ov.leather.etched) {\n      /* etched border on a CUSTOM cut (np-emb2, Justin 2026-08-21): a burn band that FOLLOWS the contour, inset from the cut edge,\n         thickness 1-10 \u2014 erosion by 28-direction intersection; widths scaled from the PDP's 1200px compose */\n      var lbTC = Math.max(1, Math.min(10, ov.leather.lb || 3));\n      var lbWC = Math.max(1, Math.round(Math.max(2, Math.min(20, lbTC * 2)) * C / 1200));\n      var lbInC = Math.round(Math.min(WC, HC) * 0.045) + 2;\n      var erodeC = function (rE) {\n        var e = document.createElement('canvas'); e.width = WC; e.height = HC;\n        var ex2 = e.getContext('2d'); ex2.drawImage(mask, 0, 0); ex2.globalCompositeOperation = 'destination-in';\n        for (var aK = 0; aK < 28; aK++) { var angK = aK / 28 * Math.PI * 2; ex2.drawImage(mask, Math.cos(angK) * rE, Math.sin(angK) * rE); }\n        return e;\n      };\n      var bandC = erodeC(lbInC), bx3 = bandC.getContext('2d');\n      bx3.globalCompositeOperation = 'destination-out'; bx3.drawImage(erodeC(lbInC + lbWC), 0, 0);\n      bx3.globalCompositeOperation = 'source-in'; bx3.fillStyle = ov.leather.tone; bx3.fillRect(0, 0, WC, HC);\n      xC.globalAlpha = 0.92; xC.drawImage(bandC, 0, 0); xC.globalAlpha = 1;\n    }\n    return cvC;\n  }\n  var plateCache = {};\n  function plateOv(thin) { return thin ? { bg: '#f2f2f2', ring: '#0C0C0E', thin: true } : { bg: isLeatherT() ? ((pxLeatherBg() || {}).hex || null) : ((cfg.bg && cfg.bg.hex) || null), leather: isLeatherT() ? { tone: pxLeatherEtchHex(), inv: !!cfg.etchInvert, etched: !!(cfg.border && /etched/i.test(cfg.border.label || '')), lb: lbThick() } : null, /* C546; tiles (thin) stamp RAW art = np-emb2 C123 */ ring: (cfg.thread && cfg.thread.hex) || null, merrow: isMerrow(), noBorder: !!(cfg.border && /no border/i.test(cfg.border.label || '')), noPick: !cfg.thread && !cfg.border, subli: pxSubliOn() ? [cfg.w, cfg.h] : null, follow: !!(cfg.bg && cfg.bg.follow) /* C472 */ }; }\n  function plateUrl(C, thin) {\n    /* composed plate as a data URL, cached per (art, size, options); '' while it composes \u2014 the caller re-renders on completion */\n    if (!cfg || !cfg.art || !cfg.art.hosted) return '';\n    var ov = plateOv(thin), art = artDisplayUrl(800), key = [art, C, JSON.stringify(ov)].join('|');\n    var hit = plateCache[key];\n    if (hit) return hit.url || '';\n    plateCache[key] = { pending: true, url: '' };\n    var im = new Image(); im.crossOrigin = 'anonymous';\n    im.onload = function () { try { plateCache[key] = { url: composePlate(im, C, ov).toDataURL('image/png') }; } catch (e) { plateCache[key] = { url: '' }; } if (cfg) renderAll(); };\n    im.onerror = function () { plateCache[key] = { url: '' }; setTimeout(function () { delete plateCache[key]; if (cfg) renderAll(); }, 2500); };\n    im.src = art;\n    return '';\n  }\n  function composeReference() {\n    return new Promise(function (resolve, reject) {\n      var img = new Image(); img.crossOrigin = 'anonymous';\n      img.onload = function () {\n        try {\n          if (curShape().geom === 'custom') { /* Design's Shape: the same plate the preview shows, on the grey backdrop */\n            var pc = composePlate(img, 1200, plateOv(false)), S2 = Math.max(pc.width, pc.height), cvP = document.createElement('canvas'); cvP.width = S2; cvP.height = S2;\n            cvP.getContext('2d').drawImage(pc, (S2 - pc.width) / 2, (S2 - pc.height) / 2);\n            try { cfg.refPreview = padWhite(cvP).toDataURL('image/png'); } catch (eP) {} /* the compare's Digital mockup side shows this on white; Sensei still gets the grey-backdrop reference */\n            resolve(backdrop(cvP, [(cfg.bg && cfg.bg.hex) || '#f2f2f2', (cfg.thread && cfg.thread.hex) || '#9CA3AF'])); return;\n          }\n          var s = curShape(), dm = dimsFor(s), C = 1200, k = (C * 0.94) / Math.max(dm[0], dm[1]);\n          var W = Math.round(dm[0] * k), H = Math.round(dm[1] * k);\n          var cv = document.createElement('canvas'); cv.width = W; cv.height = H;\n          var x = cv.getContext('2d');\n          var bgHex = (isLeatherT() && pxLeatherBg() && pxLeatherBg().hex) || (cfg.bg && cfg.bg.hex) || '#FFFFFF', ringHex = (cfg.thread && cfg.thread.hex) || '#9CA3AF'; /* C546: leather = its hide */\n          var noRing = (moldedT() ? (!cfg.thread || !!cfg.thread.none) : (!cfg.border || /no border/i.test(cfg.border.label || ''))) || isLeatherT(); /* C219: molded types draw their rim in the Border Color */\n          var ring = noRing ? 0 : Math.round(C * (moldedT() ? 0.02 : (isMerrow() ? 0.024 : 0.016)));\n          if (ring > 0 && thickOn()) ring = Math.max(1, Math.round(ring * lbFactor()));\n          var poly = SHAPE_CLIPS[s.geom] ? (SHAPE_CLIPS[s.geom].match(/([\\d.]+)%\\s+([\\d.]+)%/g) || []).map(function (p) { var m = p.match(/([\\d.]+)%\\s+([\\d.]+)%/); return [parseFloat(m[1]) / 100, parseFloat(m[2]) / 100]; }) : null;\n          var path = function (x0, y0, w2, h2) {\n            x.beginPath();\n            var g = s.geom;\n            if (g === 'circle' || g === 'oval' || g === 'oval-h') x.ellipse(x0 + w2 / 2, y0 + h2 / 2, w2 / 2, h2 / 2, 0, 0, Math.PI * 2);\n            else if (poly && poly.length) poly.forEach(function (p, i) { var px = x0 + p[0] * w2, py = y0 + p[1] * h2; if (i === 0) x.moveTo(px, py); else x.lineTo(px, py); });\n            else { var rr = Math.min(w2, h2) * (g === 'custom' ? 0.08 : (cfg.corners === 'square' ? 0 : 0.1)); if (x.roundRect && rr > 0) x.roundRect(x0, y0, w2, h2, rr); else x.rect(x0, y0, w2, h2); }\n            x.closePath();\n          };\n          var inset = Math.max(ring, 2);\n          path(inset, inset, W - inset * 2, H - inset * 2); x.fillStyle = bgHex; x.fill();\n          x.save(); path(inset, inset, W - inset * 2, H - inset * 2); x.clip();\n          var safe = s.geom === 'custom' ? 0.86 : (SHAPE_SAFE[s.geom] || 0.68);\n          var sc = Math.min(W * safe / img.naturalWidth, H * safe / img.naturalHeight) * (cfg.artZoom || 1);\n          var aw = img.naturalWidth * sc, ah = img.naturalHeight * sc, cy = CENTER_Y[s.geom] || 0.5;\n          var panX = 0, panY = 0; /* C151 artwork pan, same clamp as the live preview */\n          if (s.geom !== 'custom' && (cfg.artDx || cfg.artDy)) {\n            var mxA = Math.abs(aw - (W - (inset + ring) * 2)) / 2 / W, myA = Math.abs(ah - (H - (inset + ring) * 2)) / 2 / H; /* band inner edge */\n            cfg.artDx = Math.max(-mxA, Math.min(mxA, cfg.artDx || 0)); cfg.artDy = Math.max(-myA, Math.min(myA, cfg.artDy || 0));\n            panX = cfg.artDx * W; panY = cfg.artDy * H;\n          }\n          if (isLeatherT()) x.drawImage(etchArtCanvas(img, Math.max(1, Math.round(aw)), Math.max(1, Math.round(ah)), null, !!cfg.etchInvert), (W - aw) / 2 + panX, H * cy - ah / 2 + panY, aw, ah); /* C546: the reference the renderer copies is etched, like the PDP's */\n          else x.drawImage(img, (W - aw) / 2 + panX, H * cy - ah / 2 + panY, aw, ah);\n          x.restore();\n          if (isLeatherT() && cfg.border && /etched/i.test(cfg.border.label || '')) {\n            /* C546 (np-emb2 ~:9041): laser-etched border line, inset from the edge (thickness 1-10) */\n            var lbInR = inset + Math.round(Math.min(W, H) * 0.055);\n            path(lbInR, lbInR, W - lbInR * 2, H - lbInR * 2);\n            x.strokeStyle = pxLeatherEtchHex(); x.globalAlpha = 0.92; x.lineWidth = Math.max(2, Math.min(20, lbThick() * 2)); x.lineJoin = 'round'; x.stroke(); x.globalAlpha = 1;\n          }\n          if (ring > 0) { path(inset, inset, W - inset * 2, H - inset * 2); x.strokeStyle = isMerrow() ? merrowPattern(x, ringHex, ring) : ringHex; x.lineWidth = ring * 2; x.lineJoin = (isRectGeom(s.geom) && cfg.corners === 'square') ? 'miter' : 'round'; /* square corners: a round join would re-round the ring's outer corners (review 2026-09-08) */ x.stroke(); }\n          try { cfg.refPreview = padWhite(cv).toDataURL('image/png'); } catch (eP2) {} /* white-background display copy (Justin 2026-09-05) */\n          resolve(backdrop(cv, [bgHex, ringHex]));\n        } catch (e) { reject(e); }\n      };\n      var tries = [artDisplayUrl(1600), artDisplayUrl(1000), artRawUrl(1200), (cfg.art ? cfg.art.hosted : '')];\n      var ti = 0;\n      img.onerror = function () { ti++; if (ti < tries.length && tries[ti]) { img.src = tries[ti]; } else { reject(new Error('artwork did not load')); } };\n      img.src = tries[0];\n    });\n  }\n  function hostReference(canvas) {\n    return new Promise(function (resolve) {\n      var blob = null;\n      try { var dU = canvas.toDataURL('image/png'), bin = atob(dU.split(',')[1]), arr = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i); blob = new Blob([arr], { type: 'image/png' }); } catch (e) {}\n      if (!blob) { resolve(null); return; }\n      var done = false, tm = setTimeout(function () { if (!done) { done = true; resolve(null); } }, 9000);\n      var name = 'mockup-ref____image_' + Date.now() + '_' + Math.floor(Math.random() * 1000) + '.png';\n      fetch(UPLOAD_API + '/uploads/getPresignedUploadUrl?file_name=' + encodeURIComponent(name) + '&file_type=image%2Fpng')\n        .then(function (r) { return r.json(); })\n        .then(function (p) { if (!p || !p.url) throw new Error('no presign'); return fetch(p.url, { method: 'PUT', body: blob }).then(function () { return p.sourceUrl || null; }); })\n        .then(function (u) { if (done) return; done = true; clearTimeout(tm); resolve(u); })\n        .catch(function () { if (done) return; done = true; clearTimeout(tm); resolve(null); });\n    });\n  }\n  /* C531 (Justin 2026-10-29: \"the only thing that should be pointing to brians code is shinobi \u2026 everything else should come\n     from the same database\"): proofs render through the product page's own generator (np-ideogram-gen.js -> window.NP_GEN ->\n     the nano proxy) instead of a Patch Sensei proof session, so ONE prompt drives the PDP, Patch Express and the\n     ninjatransfers.com studio. The generator loads from this script's own asset folder (the PDP's genLoad does the same;\n     data-px-gen overrides), and pxGenContext mirrors np-emb2 genContext(). The old Patch Sensei note (directive) is gone. */\n  var pxGenP = null;\n  function pxGenLoad() {\n    if (window.NP_GEN && window.NP_GEN.render) return Promise.resolve(window.NP_GEN);\n    if (pxGenP) return pxGenP;\n    pxGenP = new Promise(function (resolve, reject) {\n      var mine = document.querySelector('script[src*=\"patch-express.js\"]');\n      var src = attr('data-px-gen', '') || (mine ? mine.src.replace(/patch-express\\.js/, 'np-ideogram-gen.js') : '');\n      if (!src) { pxGenP = null; reject(new Error('generator not found')); return; }\n      var sc = document.createElement('script');\n      sc.src = src; sc.async = true;\n      sc.onload = function () { if (window.NP_GEN && window.NP_GEN.render) resolve(window.NP_GEN); else { pxGenP = null; reject(new Error('generator not ready')); } };\n      sc.onerror = function () { pxGenP = null; reject(new Error('generator did not load')); };\n      document.head.appendChild(sc);\n    });\n    return pxGenP;\n  }\n  function pxGenContext(refUrl) {\n    var t = curType(), s = curShape(), r = typeRule(), sfx = t.suffix || TYPE_SUFFIX[t.handle] || '';\n    var leather = isLeatherT(), dm = dimsFor(s), sized = !!(cfg.sizeEntered && cfg.w > 0 && cfg.h > 0);\n    var w = sized ? cfg.w : (dm[0] >= dm[1] ? 3 : 3 * dm[0] / dm[1]), h = sized ? cfg.h : (dm[0] >= dm[1] ? 3 * dm[1] / dm[0] : 3);\n    var th = cfg.thread || null, back = cfg.backing ? String(cfg.backing.label || '') : '';\n    return {\n      typeKey: sfx,\n      materialPhrase: leather ? (/faux/i.test(t.label || '') ? 'faux leather' : 'genuine leather')\n        : r.monoTone ? 'molded ' + ((r.fixedBg && r.fixedBg.label) || 'flex') + ' flex'\n        : /print-and-stitch/.test(sfx) ? 'hybrid print-and-stitch (embroidered thread with printed fine detail)'\n        : /fullcolor/.test(sfx) ? 'full-colour printed' : /woven/.test(sfx) ? 'woven' : /chenille/.test(sfx) ? 'chenille'\n        : /silicone|rubber/.test(sfx) ? 'moulded PVC' : 'embroidered',\n      isLeather: leather, etchHex: leather ? pxLeatherEtchHex() : '', etchInvert: !!(leather && cfg.etchInvert),\n      monoTone: !!r.monoTone, fixedBg: r.fixedBg || null,\n      fullColor: /fullcolor/.test(sfx), woven: /woven/.test(sfx), printStitch: /print-and-stitch/.test(sfx),\n      freeform: false, bareArt: sfx === 'tackle-twill-2-0', chenille: /chenille/.test(sfx), pvc: /silicone|rubber/.test(sfx),\n      shape: cfg.shape || '', shapeDesc: SHAPE_DESC[orientGeom(s.geom)] || '', geom: s.geom,\n      corners: isRectGeom(s.geom) ? (cfg.corners || '') : '',\n      w: w.toFixed(2), h: h.toFixed(2),\n      bg: cfg.bg || null, bgFollow: !!(cfg.bg && cfg.bg.follow),\n      thread: th, threadNone: !!(th && (th.none || th.follow || /^none$/i.test(th.label || ''))),\n      borderStyle: cfg.border ? String(cfg.border.label || '') : '',\n      borderThickness: lbThick(), lbTuned: !!(thickOn() && thickRule() && thickRule().zeroMax2),\n      texture: '', backing: back, velcroSew: /silicone|rubber/.test(sfx) && /hook|velcro/i.test(back),\n      notes: '',\n      referenceUrl: refUrl ? toImgix(refUrl) : artDisplayUrl(),\n      artworkUrl: artDisplayUrl()\n    };\n  }\n  function generateProof() { /* renamed 2026-09-05: it shadowed the concept generator above (same scope) and killed \"Generate 4 concepts\" */\n    var seq = ++st.seq;\n    st.mode = 'generating'; cfg.error = null; renderAll();\n    var genList = genMsgs();\n    hud('Generating your AI proof', genList[0], false);\n    startCycle(genList, 2600);\n    hudEta('Usually takes 20\\u201325 seconds.');\n    /* C217 (Justin 2026-09-15): the renderer re-renders a flagged proof at HIGHER quality (fine lettering), so a render can\n       legitimately run 60\\u2013120 s \\u2014 say what is happening at each stage so nobody feels stuck. Same copy as the PDP. */\n    if (etaT) clearTimeout(etaT); if (etaT2) clearTimeout(etaT2); if (etaT3) clearTimeout(etaT3);\n    etaT = setTimeout(function () { if (st.mode === 'generating' && seq === st.seq) hudEta('Taking a little longer than usual \\u2014 hang tight, it\\u2019s still rendering.'); }, 25000);\n    etaT2 = setTimeout(function () { if (st.mode === 'generating' && seq === st.seq) hudEta('Still working: designs with fine lettering or detail get a second, higher-quality pass. This can take another minute or two \\u2014 please keep this page open.'); }, 32000);\n    etaT3 = setTimeout(function () { if (st.mode === 'generating' && seq === st.seq) hudEta('Almost there. If the render can\\u2019t finish, you can still order with your digital preview and a patch specialist will email your proof by hand.'); }, 95000);\n    composeReference().then(hostReference).then(function (refUrl) { cfg.refUrl = refUrl; return pxGenLoad().then(function (gen) { if (seq !== st.seq) throw new Error('cancelled'); return gen.render(pxGenContext(refUrl)); }); })\n      .then(function (url) { if (seq !== st.seq) return; stopCycle(); hudOff(); cfg.mockup = toImgix(url); cfg.mockupSig = optionsSig(); cfg.slider = 50; st.mode = 'proof'; renderAll(); say('Your AI proof is ready.'); })\n      .catch(function (err) {\n        if (seq !== st.seq) return;\n        stopCycle(); hudOff(); st.mode = 'options'; cfg.step = steps().length - 1; cfg.error = 'The proof render did not come back (' + ((err && err.message) || 'error') + ').';\n        renderAll();\n        try { console.warn('[patch-express] generate failed', err); } catch (e) {}\n      });\n  }\n  /* ---- approve: the lab's PDP handoff (Size & Pricing with the proof attached) ---- */\n  function approve() {\n    if (!cfg || !cfg.mockup) return;\n    var t = curType();\n    var handoff = { t: Date.now(), printedPvc: !!(cfg.printedPvc && pxPrintedPvc()), /* C441 */ patchRec: (pxKeptActive() && cfg.patchRec) || '', /* C519: the PDP writes _Patch Rec */ artZoom: cfg.artZoom || 1, artDx: cfg.artDx || 0, artDy: cfg.artDy || 0, shape: cfg.shape || '', corners: cfg.corners || 'rounded', border: cfg.border ? cfg.border.label : '', bg: (cfg.bg && cfg.bg.hex) ? { label: cfg.bg.label, hex: cfg.bg.hex } : null, thread: (cfg.thread && cfg.thread.hex) ? { label: cfg.thread.label, hex: cfg.thread.hex } : null, backing: cfg.backing ? cfg.backing.label : '', lbThick: thickOn() ? lbThick() : 0, etchInvert: cfg.etchInvert ? 1 : 0, removeBg: cfg.removeBg === true, w: (cfg.sizeEntered && cfg.w > 0) ? cfg.w : 0, h: (cfg.sizeEntered && cfg.h > 0) ? cfg.h : 0 }; /* C229: the chosen size lands in the PDP's sizing pane */ /* the duplicate trailing artZoom: 1 used to clobber the real fill on arrival (review 2026-09-05) */\n    try { localStorage.setItem('np_ml_handoff', JSON.stringify(handoff)); } catch (e) {}\n    hud('Opening Size & Pricing', '', false);\n    var art = artDisplayUrl();\n    setTimeout(function () {\n      /* other-store host: localStorage does not cross origins, so the selections also ride the URL (np_ml) for the\n         builder to read as its fallback; without it the builder lands with the proof + art and defaults the options */\n      window.location.href = STORE + '/products/' + t.handle + '?view=' + encodeURIComponent(t.suffix) + '&np_src=ml&np_proof=' + encodeURIComponent(cfg.mockup) + '&np_art=' + encodeURIComponent(cfg.art.hosted) + '&file=' + encodeURIComponent(art) + (STORE ? '&np_ml=' + encodeURIComponent(JSON.stringify(handoff)) : '');\n    }, 400);\n  }\n  /* ---- arrival: ?file=<image url> opens the studio straight away. Our own uploads (imgix/S3) open directly;\n     any other http(s) image is fetched and pushed through the normal upload path so imgix/bg-remove work\n     (Justin 2026-09-05: \"make sure this page works with ?file=(image url)\") ---- */\n  (function () {\n    var fq = '';\n    try { fq = new URLSearchParams(location.search).get('file') || ''; } catch (e) {}\n    if (!fq || !/^https?:\\/\\//i.test(fq)) return;\n    if (/^https:\\/\\/(ninjauploads-production\\.imgix\\.net|ninja-services-production-ninjauploadss3bucket-[a-z0-9]+\\.s3\\.amazonaws\\.com)\\//i.test(fq)) { setTimeout(function () { beginConfig(fq, nameFromUrl(fq)); }, 0); return; }\n    setTimeout(function () {\n      hud('Opening Patch Express Studio', 'Fetching your image', false); showStage();\n      fetch(fq, { mode: 'cors' }).then(function (r) { if (!r.ok) throw new Error('fetch ' + r.status); return r.blob(); })\n        .then(function (b) {\n          if (!/^image\\//.test(b.type || '') && !OK_EXT.test(fq.split('?')[0])) throw new Error('not an image');\n          var nm = nameFromUrl(fq) || 'artwork.png'; if (!/\\.[a-z0-9]{2,5}$/i.test(nm)) nm += '.png';\n          takeFile(new File([b], nm, { type: b.type || 'image/png' }));\n        })\n        .catch(function (err) { hudOff(); say('That image URL could not be loaded. Upload the file instead.'); try { console.warn('[patch-express] file= fetch failed', err); } catch (e2) {} });\n    }, 0);\n  })();\n\n  /* desktop: tell CSS where the card starts so it can fill exactly to the viewport bottom */\n  var cardEl = $('.np-px__card');\n  function fitCard() {\n    if (!cardEl) return;\n    if (stacked()) {\n      root.style.removeProperty('--px-top');\n      /* a sticky/fixed site header pushes the sticky preview down by its height */\n      var hdr = document.querySelector('.shopify-section-group-header-group, #shopify-section-header, .site-header, header'), off = 0;\n      try { if (hdr) { var hp = getComputedStyle(hdr).position; if (hp === 'sticky' || hp === 'fixed') off = Math.round(hdr.getBoundingClientRect().height); } } catch (e) {}\n      root.style.setProperty('--px-sticky-top', off + 'px');\n      return;\n    }\n    var top = cardEl.getBoundingClientRect().top + (window.pageYOffset || document.documentElement.scrollTop || 0);\n    root.style.setProperty('--px-top', Math.max(0, Math.round(top)) + 'px');\n  }\n  fitCard();\n  window.addEventListener('resize', fitCard);\n  /* C218: the collapsed palette is exactly two rows for the rail width it was rendered at \u2014 when a resize (or the short-card\n     layout switch) changes how many tiles fit, render it again so it never shows four rows or a half row */\n  (function () { var tmr = null; window.addEventListener('resize', function () { clearTimeout(tmr); tmr = setTimeout(function () { try { if (cfg && root.getAttribute('data-px-phase') === 'config' && st.twoRow != null && twoRowLimit() !== st.twoRow) renderAll(); } catch (e) {} }, 160); }); })();\n  window.addEventListener('load', fitCard);\n  setTimeout(fitCard, 300); setTimeout(fitCard, 1200); setTimeout(fitCard, 3000);\n  syncPrompt();\n  setMode('upload', false);\n})();\n"],
  "mappings": "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",
  "names": ["html", "p", "w", "h", "st", "r", "L", "dn", "lum", "handoff"]
}
