{
  "version": 3,
  "sources": ["/cdn/shop/t/273/assets/pdp-personalizer.js?cb=20261014q"],
  "sourcesContent": ["/* =====================================================================\r\n   pdp-personalizer.js \u2014 Option B PDP behaviors\r\n   ---------------------------------------------------------------------\r\n   Loaded ONLY on eligible personalized PDPs (engraving + photo singles).\r\n   The ab_pdp_v1 A/B test concluded 2026-08-21 with B as the winner; the\r\n   inline script in product-template.liquid now sets html.pdp-b for every\r\n   visitor (before first paint, no flicker) and exposes:\r\n\r\n       window.__pdpAB = { name, variant:'B', active:false, cartAttr }\r\n\r\n   This file does the non-critical-path work:\r\n     1. Test-era tracking (ab_pdp_test_v1 cart attr + GA4 assignment\r\n        event) \u2014 kept behind AB.active, which is now permanently false;\r\n        inert, retained so a future test can re-arm the same plumbing.\r\n     2. Sticky bottom Add-to-Cart proxy on mobile that forwards clicks\r\n        to the real ATC button (so all personalizer property-harvesting\r\n        / confirm-modals still run).\r\n   ===================================================================== */\r\n(function () {\r\n  'use strict';\r\n\r\n  var AB = window.__pdpAB;\r\n  if (!AB || AB.variant !== 'B') return;         // not an eligible Option B PDP -> no-op\r\n  var VARIANT = AB.variant === 'B' ? 'B' : 'A';\r\n  var CART_ATTR = AB.cartAttr || 'ab_pdp_test_v1';\r\n  var GA4_TEST_NAME = 'pdp_option_b_v1';\r\n\r\n  /* ---------------------------------------------------------------\r\n     1. Cart-attribute stamping (exposure tracking)\r\n     --------------------------------------------------------------- */\r\n  function stampCart() {\r\n    var attrs = {};\r\n    attrs[CART_ATTR] = VARIANT;\r\n    return fetch('/cart/update.js', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application/json' },\r\n      body: JSON.stringify({ attributes: attrs })\r\n    });\r\n  }\r\n\r\n  function trackAssignment() {\r\n    stampCart().catch(function () { /* retried on add-to-cart */ });\r\n\r\n    // Re-stamp on every add-to-cart (cart guaranteed to exist by then).\r\n    if (typeof jQuery !== 'undefined') {\r\n      try {\r\n        jQuery(document.body).on('afterAddItem.ajaxCart added.ajaxProduct', function () {\r\n          stampCart().catch(function () {});\r\n        });\r\n      } catch (e) {}\r\n    }\r\n    // Belt-and-suspenders: also re-stamp when the real ATC is submitted.\r\n    document.addEventListener('click', function (e) {\r\n      var t = e.target && e.target.closest && e.target.closest('.add-to-cart-btn');\r\n      if (t) setTimeout(function () { stampCart().catch(function () {}); }, 400);\r\n    }, true);\r\n\r\n    // GA4 cross-check event. MUST use the ab_test_assignment schema \u2014 it is\r\n    // the only A/B event GTM-5TT8DJX forwards (trigger CE - ab_test_assignment,\r\n    // params ab_test_name/ab_test_variant registered as GA4 custom dimensions).\r\n    // The theme never defines window.gtag; dataLayer is the working path.\r\n    // (Primary tracking is the first-party beacon + cart attribute \u2014 this is\r\n    // segmentation backup only.)\r\n    try {\r\n      window.dataLayer = window.dataLayer || [];\r\n      window.dataLayer.push({\r\n        event: 'ab_test_assignment',\r\n        ab_test_name: GA4_TEST_NAME,\r\n        ab_test_variant: VARIANT\r\n      });\r\n    } catch (e) {}\r\n  }\r\n\r\n  /* ---------------------------------------------------------------\r\n     2. Sticky Add-to-Cart proxy (variant B, mobile)\r\n     The proxy forwards clicks to the REAL button so the theme's\r\n     personalizer harvesting / confirm modals all still fire.\r\n     --------------------------------------------------------------- */\r\n  function buildStickyAtc() {\r\n    if (VARIANT !== 'B') return;\r\n    if (document.querySelector('.wf-sticky-atc')) return;\r\n\r\n    var realBtn = document.querySelector('.product-single__form .add-to-cart-btn')\r\n               || document.querySelector('.add-to-cart-btn');\r\n    if (!realBtn) return;\r\n\r\n    // The locket ships its own sticky proxy (.lke-sticky-atc); never double up.\r\n    if (document.querySelector('.lke-sticky-atc')) return;\r\n\r\n    // current price only \u2014 .product__price also matches the struck compare price\r\n    var priceEl = document.querySelector('.product-single__meta .product__price:not(.product__price--compare)');\r\n\r\n    var bar = document.createElement('div');\r\n    bar.className = 'wf-sticky-atc';\r\n    var proxy = document.createElement('button');\r\n    proxy.type = 'button';\r\n    proxy.className = 'wf-sticky-proxy';\r\n    bar.appendChild(proxy);\r\n    document.body.appendChild(bar);\r\n    document.body.classList.add('wf-has-sticky');\r\n\r\n    function syncLabel() {\r\n      var label = (realBtn.textContent || 'Add to cart').trim() || 'Add to cart';\r\n      var price = priceEl ? (priceEl.textContent || '').trim() : '';\r\n      proxy.innerHTML = '';\r\n      proxy.appendChild(document.createTextNode(label));\r\n      if (price) {\r\n        var span = document.createElement('span');\r\n        span.className = 'p';\r\n        span.textContent = '\u00B7 ' + price;\r\n        proxy.appendChild(span);\r\n      }\r\n      proxy.disabled = !!realBtn.disabled;\r\n    }\r\n    syncLabel();\r\n\r\n    // keep proxy price/disabled in sync as the theme updates the real button\r\n    try {\r\n      var mo = new MutationObserver(syncLabel);\r\n      mo.observe(realBtn, { attributes: true, childList: true, subtree: true, characterData: true });\r\n      if (priceEl) mo.observe(priceEl, { childList: true, subtree: true, characterData: true });\r\n    } catch (e) {}\r\n\r\n    proxy.addEventListener('click', function () {\r\n      if (realBtn.disabled) return;\r\n      realBtn.click();\r\n      realBtn.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n    });\r\n\r\n    /* personalization gate: the sticky must not invite an add-to-cart before\r\n       the buyer has personalized \u2014 premature sticky taps produce\r\n       un-personalized orders (support tickets, remakes). Gates only on what\r\n       the page actually has: at least one engraving line when text entry\r\n       exists (inputs or symbol-dropdown components), and a real uploaded\r\n       photo when the uploader exists. Fonts always have a default selected,\r\n       so they never block. The main ATC button is untouched. */\r\n    function personalized() {\r\n      /* handwriting-engraving mode (snippets/handwriting-engraving.liquid):\r\n         the typed-text inputs are hidden, so gate on the uploaded photo */\r\n      var handForm = document.querySelector('.product-single__form.wf-hand-on');\r\n      if (handForm) {\r\n        var handUrl = handForm.querySelector('.wf-hand-url');\r\n        return !!(handUrl && handUrl.value);\r\n      }\r\n      /* Custom Keepsake Flag (snippets/flag-picker.liquid): gate on the chosen\r\n         flag, whose hidden input stays disabled until one is picked */\r\n      var flagIn = document.querySelector('.product-single__form [data-wf-flag-field] input[name=\"properties[Flag]\"]');\r\n      if (flagIn && (flagIn.disabled || !flagIn.value)) return false;\r\n      /* Painted Pet Portrait (snippets/painted-background-picker.liquid):\r\n         gate on the chosen background (no default) */\r\n      var pbg = document.querySelector('.product-single__form [data-wf-pbg-field]');\r\n      if (pbg && !pbg.querySelector('input.wf-pbg__input:checked')) return false;\r\n      var texts = [].filter.call(document.querySelectorAll(\r\n        '.product-single__form .symbol-input,' +\r\n        '.product-single__form .custom-ring-field.input input[type=\"text\"],' +\r\n        '.product-single__form .custom-ornament-field.input input[type=\"text\"],' +\r\n        '.product-single__form #input-text'\r\n      ), function (i) { return i.offsetParent; });\r\n      var comps = document.querySelectorAll('.symbol-dropdown-parent .active-character');\r\n      if (texts.length || comps.length) {\r\n        var hasText = texts.some(function (i) { return (i.value || '').trim(); })\r\n          || [].some.call(comps, function (c) { return (c.textContent || '').trim(); });\r\n        if (!hasText) return false;\r\n      } else if (document.getElementById('ornament-type') || document.getElementById('custom-ring-type')\r\n          || document.getElementById('FONT') || document.querySelector('.product-single__form .wf-customring-block')) {\r\n        // engravable page whose inputs the theme JS hasn't mounted yet \u2014 these\r\n        // markers are server-rendered, so hold the sticky instead of letting it\r\n        // flash on load and vanish once the empty inputs appear\r\n        return false;\r\n      }\r\n      var up = document.getElementById('upload-preview');\r\n      if (up && photoUploadEl()) {\r\n        var s = up.getAttribute('src') || '';\r\n        if (!s || s.indexOf('data:image/svg') > -1) return false;\r\n      }\r\n      return true;\r\n    }\r\n    // show the sticky bar only while the real button is off-screen AND the page is personalized\r\n    var offscreen = false;\r\n    function sync() { bar.classList.toggle('is-show', offscreen && personalized()); }\r\n    function evalVisibility() {\r\n      var r = realBtn.getBoundingClientRect();\r\n      offscreen = !(r.top < (window.innerHeight - 40) && r.bottom > 0);\r\n      sync();\r\n    }\r\n    if ('IntersectionObserver' in window) {\r\n      var io = new IntersectionObserver(function (entries) {\r\n        offscreen = !entries[0].isIntersecting;\r\n        sync();\r\n      }, { rootMargin: '0px 0px -40px 0px' });\r\n      io.observe(realBtn);\r\n    } else {\r\n      window.addEventListener('scroll', evalVisibility, { passive: true });\r\n      window.addEventListener('resize', evalVisibility);\r\n      evalVisibility();\r\n    }\r\n    var sdeb = null;\r\n    function onEdit() { if (sdeb) clearTimeout(sdeb); sdeb = setTimeout(sync, 80); }\r\n    document.addEventListener('input', onEdit, true);\r\n    document.addEventListener('change', onEdit, true);\r\n    setInterval(sync, 800);   // photo uploads + dropdown picks don't fire input events\r\n  }\r\n\r\n  /* ---------------------------------------------------------------\r\n     boot\r\n     --------------------------------------------------------------- */\r\n  /* ---------------------------------------------------------------\r\n     3. Move the photo uploader to the bottom (just above the live-preview\r\n     card), so the order is: options -> engraving -> photo -> preview -> ATC.\r\n     --------------------------------------------------------------- */\r\n  function photoUploadEl() {\r\n    var ups = [].slice.call(document.querySelectorAll('.product-single__form .upload'));\r\n    for (var i = 0; i < ups.length; i++) { if (ups[i].querySelector('#upload-file, .btn__file-picker')) return ups[i]; }\r\n    return null;\r\n  }\r\n  function atcAnchor() {\r\n    var atc = document.querySelector('.product-single__form .add-to-cart-btn');\r\n    if (!atc) return null;\r\n    return atc.closest('.payment-buttons') || atc;\r\n  }\r\n  function moveUploadToBottom() {\r\n    if (VARIANT !== 'B') return;\r\n    var up = photoUploadEl(), anchor = atcAnchor();\r\n    if (!up || !anchor || !anchor.parentNode) return;\r\n    // Sit the uploader just ABOVE the live-preview card (which itself sits just\r\n    // above the ATC). Until that card exists, sit it just above the ATC.\r\n    var card = document.querySelector('.wf-livecard');\r\n    var target = (card && card.parentNode === anchor.parentNode) ? card : anchor;\r\n    if (up.nextElementSibling === target) return;           // already in place\r\n    target.parentNode.insertBefore(up, target);\r\n  }\r\n\r\n  /* ---------------------------------------------------------------\r\n     2. Inline live-preview card. Relocate the theme's self-contained\r\n     engraving overlay (product image + live canvases/text) into a gold\r\n     card placed below the photo uploader (just above the ATC) \u2014 reusing the\r\n     theme's exact per-product rendering, so the preview is shaped per product.\r\n     --------------------------------------------------------------- */\r\n  function productPhotoSrc() {\r\n    var cands = [].slice.call(document.querySelectorAll('.product__main-photos img, .product__photos img'));\r\n    for (var i = 0; i < cands.length; i++) {\r\n      var s = cands[i].currentSrc || cands[i].src || '';\r\n      if (s && s.indexOf('/cdn/shop/') > -1 && cands[i].naturalWidth > 50) return s;\r\n    }\r\n    var og = (document.querySelector('meta[property=\"og:image\"]') || {}).content || '';\r\n    return og.replace(/^http:/, 'https:');\r\n  }\r\n\r\n  /* ---- 2a. SVG-shape preview (Claude-Design look): a stylized vector of the\r\n     product, recolored to the selected finish, with the live engraving drawn on\r\n     it. Uses window.WF_PREVIEW_SHAPES (assets/pdp-preview-shapes.js). ---- */\r\n  var WF_METALS = {\r\n    silver: ['#fbfbfd', '#c9ccd2', '#8b9098'],\r\n    gold:   ['#f6e7bd', '#d7ab63', '#9c7330'],\r\n    rose:   ['#f7e3da', '#e3a589', '#b06b50']\r\n  };\r\n  function selectedMetalKey() {\r\n    var v = '';\r\n    var sw = document.querySelector('.product-single__form .variant-input input.color-swatch-input:checked, .product-single__form .variant-input input[type=\"radio\"]:checked');\r\n    if (sw) v = sw.getAttribute('data-color-name') || sw.value || '';\r\n    if (!v) { var info = document.querySelector('[id^=\"VariantColorLabel\"]'); if (info) v = info.textContent || ''; }\r\n    v = (v || '').toLowerCase();\r\n    if (v.indexOf('rose') > -1) return 'rose';\r\n    if (v.indexOf('gold') > -1 || v.indexOf('brass') > -1) return 'gold';\r\n    return 'silver';\r\n  }\r\n  function engravingLines() {\r\n    var lines = [].slice.call(document.querySelectorAll('.pdp-overlay-container .preview-text'))\r\n      .map(function (s) { return (s.textContent || '').trim(); }).filter(Boolean);\r\n    if (lines.length) return lines;\r\n    ['TEXT1', 'TEXT2', 'TEXT3', 'TEXT4'].forEach(function (id) { var el = document.getElementById(id); if (el && el.value) lines.push(el.value.trim()); });\r\n    if (!lines.length) { var si = document.querySelector('.symbol-input'); if (si && si.value) lines.push(si.value.trim()); }\r\n    if (!lines.length) { var it = document.getElementById('input-text'); if (it && it.value) lines.push(it.value.trim()); }\r\n    return lines.filter(Boolean);\r\n  }\r\n  function engravingFont() {\r\n    var b = document.querySelector('.font-button.active');\r\n    if (b && b.getAttribute('data-font')) return b.getAttribute('data-font');\r\n    return 'Georgia';\r\n  }\r\n  function currentVariantId() {\r\n    var sel = document.querySelector('.product-single__form [name=\"id\"]');\r\n    if (sel && sel.value) return String(sel.value);\r\n    var m = (location.search.match(/[?&]variant=(\\d+)/) || [])[1];\r\n    return m ? String(m) : null;\r\n  }\r\n  /* Draw the live engraving into svg's .wf-engrave-layer, scaled to FILL the\r\n     text-area box (ta.w x ta.h) as large as it fits. We render at a reference\r\n     size, measure the REAL rendered bounds with getBBox() \u2014 so each font's own\r\n     metrics decide the fit (scripts, wide caps, etc. all auto-size correctly) \u2014\r\n     then uniformly scale to the box. ta.fontScale (<=1) is an optional inset so\r\n     the text can stop short of the box edges. */\r\n  var WF_FONTS_TRIED = {};\r\n  var WF_INK_CANVAS = null;\r\n  function inkCtx() {\r\n    if (!WF_INK_CANVAS) WF_INK_CANVAS = document.createElement('canvas');\r\n    return WF_INK_CANVAS.getContext('2d');\r\n  }\r\n  function fontStack(fontName) { return '\"' + fontName + '\", Icons, Georgia, serif'; }\r\n  // Icons symbol glyphs live in the PUA block (angel U+E90C, heart, ...).\r\n  // Codepoint comparisons, not regex literals, so the source stays ASCII.\r\n  function isSymCp(cp) { return cp >= 0xE000 && cp <= 0xF8FF; }\r\n  function hasSym(s) {\r\n    for (var i = 0; i < s.length; i++) { if (isSymCp(s.charCodeAt(i))) return true; }\r\n    return false;\r\n  }\r\n  /* split a line into runs of plain text vs Icons symbol glyphs */\r\n  function symRuns(t) {\r\n    var runs = [], cur = null;\r\n    for (var i = 0; i < t.length; i++) {\r\n      var sym = isSymCp(t.charCodeAt(i));\r\n      if (!cur || cur.sym !== sym) { cur = { s: '', sym: sym }; runs.push(cur); }\r\n      cur.s += t.charAt(i);\r\n    }\r\n    return runs;\r\n  }\r\n  /* symbols render EVEN with the letters: the Icons glyphs fill their em (a\r\n     heart towers over caps), while real engraving cuts symbols at letter\r\n     height \u2014 scale each symbol run so its ink height matches the current\r\n     font's cap height. */\r\n  function symRunScale(fontName, REF, runText) {\r\n    try {\r\n      var c = inkCtx(); if (!c) return 1;\r\n      c.font = REF + 'px ' + fontStack(fontName);\r\n      var capA = c.measureText('HA').actualBoundingBoxAscent;\r\n      var symA = c.measureText(runText).actualBoundingBoxAscent;\r\n      if (!capA || !symA) return 1;\r\n      return Math.max(0.4, Math.min(1, capA / symA));\r\n    } catch (e) { return 1; }\r\n  }\r\n  /* symbols also center OPTICALLY on the letters they sit beside. The anchor\r\n     is the band from the baseline to the letters' MEAN top (each letter's own\r\n     ink ascent, descenders ignored so \"nugget\" isn't dragged low): all caps ->\r\n     cap band, all x-height (\"emma\") -> x-height band, mixed (\"Bella\") -> in\r\n     between. Like a letter without a descender, a symbol is never pushed below\r\n     the baseline \u2014 the factory engraves symbols on the text baseline \u2014 so a\r\n     cap-height paw beside \"Bella\" stays on it instead of sinking under it,\r\n     while a glyph that floats above the baseline (infinity beside \"hey\") can\r\n     still settle down onto it. Returns a baseline dy in REF units (+ = down,\r\n     0 = no shift, e.g. symbol-only lines). */\r\n  function symRunShift(fontName, REF, plainText, runText, symSize) {\r\n    try {\r\n      if (!plainText) return 0;\r\n      var c = inkCtx(); if (!c) return 0;\r\n      var stack = fontStack(fontName);\r\n      c.font = REF + 'px ' + stack;\r\n      var sumA = 0, n = 0;\r\n      for (var i = 0; i < plainText.length; i++) {\r\n        var ch = plainText.charAt(i);\r\n        if (!/[0-9A-Za-z\u00C0-\u024F]/.test(ch)) continue;   // spaces / punctuation carry no band\r\n        var a = c.measureText(ch).actualBoundingBoxAscent;\r\n        if (typeof a !== 'number') return 0;\r\n        sumA += a; n++;\r\n      }\r\n      if (!n) return 0;\r\n      c.font = symSize + 'px ' + stack;\r\n      var mS = c.measureText(runText);\r\n      var aS = mS.actualBoundingBoxAscent, dS = mS.actualBoundingBoxDescent;\r\n      if (typeof aS !== 'number' || typeof dS !== 'number') return 0;\r\n      var dy = (-(sumA / n) / 2) - ((dS - aS) / 2);   // band centre minus symbol ink centre\r\n      return Math.min(dy, Math.max(0, -dS));           // never push the symbol's ink below the baseline\r\n    } catch (e) { return 0; }\r\n  }\r\n  /* True INK bounds of the engraving as it is laid out in the SVG (each line's\r\n     tspan anchored middle at x=0, baselines stacked by `lh`, symbol runs at\r\n     their cap-height-matched size), measured per-font with the canvas\r\n     TextMetrics actualBoundingBox* properties. This is the font's real visible\r\n     extent \u2014 unlike SVG getBBox(), which returns the em-box and makes script\r\n     faces size and centre inconsistently. \"Icons\" is explicitly in the stack,\r\n     matching the SVG, so PUA symbol glyphs resolve identically in both.\r\n     Returns {x,y,width,height} in REF units, or null when the metrics aren't\r\n     available (older browsers). */\r\n  function inkBounds(lines, fontName, REF, lh) {\r\n    try {\r\n      var c = inkCtx();\r\n      if (!c) return null;\r\n      var stack = fontStack(fontName);\r\n      c.textAlign = 'left'; c.textBaseline = 'alphabetic';\r\n      var x0 = Infinity, x1 = -Infinity, y0 = Infinity, y1 = -Infinity, any = false;\r\n      for (var i = 0; i < lines.length; i++) {\r\n        var t = lines[i]; if (!t) continue;\r\n        // measure per run (matching the SVG's per-run font sizes), compose by\r\n        // advance; no kerning across run boundaries in SVG tspans either\r\n        var runs = symRuns(t), parts = [], xAdv = 0, j;\r\n        var plain = runs.filter(function (r) { return !r.sym; }).map(function (r) { return r.s; }).join('');\r\n        for (j = 0; j < runs.length; j++) {\r\n          var size = runs[j].sym ? REF * symRunScale(fontName, REF, runs[j].s) : REF;\r\n          c.font = size + 'px ' + stack;\r\n          var m = c.measureText(runs[j].s);\r\n          var aA = m.actualBoundingBoxAscent, aD = m.actualBoundingBoxDescent;\r\n          if (typeof aA !== 'number' || typeof aD !== 'number') return null;   // ink vertical unsupported\r\n          // sym runs baseline-shift to the letters' ink centre in the SVG (symRunShift) \u2014 mirror it here\r\n          var sh = runs[j].sym ? symRunShift(fontName, REF, plain, runs[j].s, size) : 0;\r\n          parts.push({ x: xAdv, w: m.width || 0, aL: m.actualBoundingBoxLeft, aR: m.actualBoundingBoxRight, aA: aA, aD: aD, sh: sh });\r\n          xAdv += m.width || 0;\r\n        }\r\n        var by = i * lh;                                  // this line's baseline (matches its SVG tspan y)\r\n        for (j = 0; j < parts.length; j++) {\r\n          var pr = parts[j], lx0, lx1;\r\n          if (typeof pr.aL === 'number' && typeof pr.aR === 'number' && (pr.aL + pr.aR) > 0.01) {\r\n            lx0 = pr.x - pr.aL; lx1 = pr.x + pr.aR;      // ink-tight horizontal (incl. side bearings / swashes)\r\n          } else { lx0 = pr.x; lx1 = pr.x + pr.w; }      // fallback: advance box\r\n          lx0 -= xAdv / 2; lx1 -= xAdv / 2;              // the SVG line is advance-centred (text-anchor middle)\r\n          if (lx0 < x0) x0 = lx0; if (lx1 > x1) x1 = lx1;\r\n          if (by + pr.sh - pr.aA < y0) y0 = by + pr.sh - pr.aA;\r\n          if (by + pr.sh + pr.aD > y1) y1 = by + pr.sh + pr.aD;\r\n          any = true;\r\n        }\r\n      }\r\n      if (!any || !isFinite(x0) || !isFinite(y0) || x1 <= x0 || y1 <= y0) return null;\r\n      return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\r\n    } catch (e) { return null; }\r\n  }\r\n  /* positional line values for per-line spots (textAreas array): index i must\r\n     stay line i even when earlier lines are empty, so empties are KEPT (unlike\r\n     engravingLines, which collapses them). The symbol-dropdown components are\r\n     the line-ordered source of truth (their DOM order matches the Line 1..N\r\n     labels); the legacy #ornament-textN-overlay mirror spans are NOT\r\n     line-ordered \u2014 the old overlay numbers them by its own photo layout (on\r\n     the quadrant necklace, Line 1 lands in span 4) \u2014 so spans/#TEXTn are only\r\n     the fallback when no components exist. Returns null when every line is\r\n     empty. */\r\n  function positionalLines(n) {\r\n    var comps = document.querySelectorAll('.symbol-dropdown-parent .active-character');\r\n    var sins = document.querySelectorAll('.symbol-input');   // multi-row symbol-input products (circle photo necklace)\r\n    var spans = document.querySelectorAll('.pdp-overlay-container .preview-text');\r\n    var out = [], any = false;\r\n    for (var i = 0; i < n; i++) {\r\n      var v = '';\r\n      if (comps.length) {\r\n        v = comps[i] ? (comps[i].textContent || '').trim() : '';\r\n      } else if (sins.length) {\r\n        v = sins[i] ? (sins[i].value || '').trim() : '';\r\n      } else {\r\n        var el = document.getElementById('TEXT' + (i + 1));\r\n        if (el && el.value) v = el.value.trim();\r\n        if (!v && spans[i]) v = (spans[i].textContent || '').trim();\r\n      }\r\n      out.push(v); if (v) any = true;\r\n    }\r\n    return any ? out : null;\r\n  }\r\n  function drawEngrave(svg, ta, linesOverride) {\r\n    var layer = svg.querySelector('.wf-engrave-layer'); if (!layer) return;\r\n    var fontName = engravingFont().replace(/\"/g, '');\r\n    if (ta && typeof ta.length === 'number') {           // textAreas array: one spot per line\r\n      var pl = positionalLines(ta.length);\r\n      layer.textContent = '';\r\n      if (!pl) return;\r\n      ensureEngraveFonts(pl.join(''), fontName, function () { drawEngrave(svg, ta); });\r\n      for (var si = 0; si < ta.length; si++) {\r\n        if (pl[si]) buildEngraveGroup(layer, [pl[si]], ta[si], fontName);\r\n      }\r\n      return;\r\n    }\r\n    /* linesOverride: positional front lines from a back-aware shape \u2014 keeps\r\n       empty middle lines (line 3 stays line 3) instead of collapsing them */\r\n    var lines = linesOverride || engravingLines();\r\n    var maxLines = ta.lines || 1; if (lines.length > maxLines) lines = lines.slice(0, maxLines);\r\n    if (!lines.join('').trim()) { layer.textContent = ''; return; }   // nothing to draw\r\n    layer.textContent = '';\r\n    ensureEngraveFonts(lines.join(''), fontName, function () { drawEngrave(svg, ta, linesOverride); });\r\n    buildEngraveGroup(layer, lines, ta, fontName);\r\n  }\r\n  /* ---- back-side stage (shape.backTextArea, e.g. SPIN_NECKLACE's \"Line 1\r\n     (Back)\"): the photo stage is duplicated beside the front one and the back\r\n     engraving drawn on it, only while the back line has content. The front\r\n     lines are the .symbol-input rows in DOM order; the back line is the\r\n     symbol-dropdown component (its characters mirror into .active-character\r\n     and overlay span n+1). backTextArea is a normal photo-space text box. ---- */\r\n  function wfFrontLines(n) {\r\n    var sins = document.querySelectorAll('.product-single__form .symbol-input');\r\n    var spans = document.querySelectorAll('.pdp-overlay-container .preview-text');\r\n    var out = [];\r\n    for (var i = 0; i < n; i++) {\r\n      var v = sins[i] ? (sins[i].value || '').trim() : '';\r\n      if (!v && !sins.length && spans[i]) v = (spans[i].textContent || '').trim();\r\n      out.push(v);\r\n    }\r\n    return out;\r\n  }\r\n  function wfBackText(n) {\r\n    var comp = document.querySelector('.symbol-dropdown-parent .active-character');\r\n    var v = comp ? (comp.textContent || '').trim() : '';\r\n    if (!v) {\r\n      var spans = document.querySelectorAll('.pdp-overlay-container .preview-text');\r\n      if (spans[n]) v = (spans[n].textContent || '').trim();\r\n    }\r\n    return v;\r\n  }\r\n  /* if the chosen web font (or the Icons symbol font, when a symbol is in the\r\n     text) isn't loaded yet the measurement would use a fallback (wrong\r\n     metrics) \u2014 load it once, then redraw with the correct font. */\r\n  function ensureEngraveFonts(allText, fontName, redraw) {\r\n    try {\r\n      var need = [];\r\n      if (fontName && fontName !== 'Georgia') need.push(fontName);\r\n      if (hasSym(allText)) need.push('Icons');\r\n      need.forEach(function (fam) {\r\n        if (document.fonts && document.fonts.check && !document.fonts.check('24px \"' + fam + '\"') && !WF_FONTS_TRIED[fam]) {\r\n          WF_FONTS_TRIED[fam] = 1;\r\n          document.fonts.load('24px \"' + fam + '\"').then(function () {\r\n            redraw();                                   // redraw with correct per-font metrics\r\n            try { WFZoom.sync(); } catch (e) {}         // refresh the open zoom modal too\r\n          }, function () {});\r\n        }\r\n      });\r\n    } catch (e) {}\r\n  }\r\n  /* curved engraving (ta.curve = arc bulge in viewBox units, + = dome up,\r\n     - = valley down): the text follows a circular arc whose chord is the box\r\n     width and whose sagitta is |curve|, centered vertically on the box (chord\r\n     at y+curve/2, apex at y-curve/2). Font size fills the box height, shrunk\r\n     if the text outruns the arc length. Rendered via <textPath> at final size\r\n     (no group scaling), so the arc geometry stays true. */\r\n  var WF_CURVE_SEQ = 0;\r\n  function buildEngraveGroupCurve(layer, lines, ta, fontName) {\r\n    var NS = 'http://www.w3.org/2000/svg';\r\n    var REF = 100;\r\n    var line = lines.filter(Boolean).join(' ');            // curved spots are single-line\r\n    if (!line) return;\r\n    var s = ta.curve, c = Math.max(ta.w, 4), as = Math.abs(s);\r\n    var r = as / 2 + (c * c) / (8 * as);\r\n    var arcLen = 2 * r * Math.asin(Math.min(1, c / (2 * r)));\r\n    var bb = inkBounds([line], fontName, REF, REF * 1.05);\r\n    var adv = (bb && bb.width) || line.length * REF * 0.6;\r\n    var ih = (bb && bb.height) || REF * 0.72;\r\n    var f = Math.min(ta.h / ih, arcLen / adv) * REF * (ta.fontScale || 1);\r\n    var pid = 'wf-curve-' + (WF_CURVE_SEQ++);\r\n    var y0 = ta.y + s / 2, sweep = s > 0 ? 1 : 0;\r\n    var path = document.createElementNS(NS, 'path');\r\n    path.setAttribute('id', pid); path.setAttribute('fill', 'none');\r\n    path.setAttribute('d', 'M ' + (ta.x - c / 2) + ' ' + y0 + ' A ' + r.toFixed(2) + ' ' + r.toFixed(2) + ' 0 0 ' + sweep + ' ' + (ta.x + c / 2) + ' ' + y0);\r\n    var text = document.createElementNS(NS, 'text');\r\n    text.setAttribute('font-size', f.toFixed(2));\r\n    text.setAttribute('font-family', fontName + ', Icons, Georgia, serif');\r\n    text.setAttribute('fill', ta.color || '#f8f5ef');\r\n    var tp = document.createElementNS(NS, 'textPath');\r\n    tp.setAttribute('href', '#' + pid);\r\n    tp.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + pid);   // Safari\r\n    tp.setAttribute('startOffset', '50%');\r\n    tp.setAttribute('text-anchor', 'middle');\r\n    var runs = symRuns(line);\r\n    if (runs.length === 1 && !runs[0].sym) {\r\n      tp.textContent = line;\r\n    } else {\r\n      // symbol runs shrink to cap height and centre on the letters' ink, as in the flat path\r\n      var plainC = runs.filter(function (r) { return !r.sym; }).map(function (r) { return r.s; }).join('');\r\n      var pendC = 0;\r\n      runs.forEach(function (rn) {\r\n        var rs = document.createElementNS(NS, 'tspan');\r\n        if (rn.sym) {\r\n          var szC = f * symRunScale(fontName, f, rn.s);\r\n          rs.setAttribute('font-size', szC.toFixed(1));\r\n          var shC = symRunShift(fontName, f, plainC, rn.s, szC);\r\n          if (shC) { rs.setAttribute('dy', (shC + pendC).toFixed(1)); pendC = -shC; }\r\n          else if (pendC) { rs.setAttribute('dy', pendC.toFixed(1)); pendC = 0; }\r\n        } else if (pendC) {\r\n          rs.setAttribute('dy', pendC.toFixed(1)); pendC = 0;\r\n        }\r\n        rs.textContent = rn.s;\r\n        tp.appendChild(rs);\r\n      });\r\n    }\r\n    text.appendChild(tp);\r\n    var g = document.createElementNS(NS, 'g');\r\n    g.appendChild(path); g.appendChild(text);\r\n    if (ta.rotate) g.setAttribute('transform', 'rotate(' + ta.rotate + ' ' + ta.x + ' ' + ta.y + ')');\r\n    layer.appendChild(g);\r\n  }\r\n  /* build ONE positioned engraving text group for `lines` inside `ta` and\r\n     append it to `layer` (never clears the layer \u2014 per-line spot groups\r\n     coexist) */\r\n  function buildEngraveGroup(layer, lines, ta, fontName) {\r\n    if (ta.curve && Math.abs(ta.curve) >= 0.5) { buildEngraveGroupCurve(layer, lines, ta, fontName); return; }\r\n    var NS = 'http://www.w3.org/2000/svg';\r\n    var REF = 100, lh = REF * 1.05;\r\n\r\n    // render at the reference size: each line centered on x=0, stacked by line-height\r\n    var inner = document.createElementNS(NS, 'g');\r\n    var text = document.createElementNS(NS, 'text');\r\n    text.setAttribute('font-size', REF);\r\n    text.setAttribute('font-family', fontName + ', Icons, Georgia, serif');   // Icons = the symbol glyphs, same stack as inkBounds\r\n    // warm white on EVERY metal (matches the 3-style locket engraving fill\r\n    // and real engraving photos). Legibility on silver comes from the PHOTOS:\r\n    // the specular glare band is toned down to matte in the preview images\r\n    // (merchant direction 2026-07-03; the earlier adaptive grey-frost + edge\r\n    // copy for glare backdrops lives in git history if photos regress). An\r\n    // explicitly authored non-default ta.color always wins.\r\n    text.setAttribute('fill', ta.color || '#f8f5ef');\r\n    text.setAttribute('text-anchor', 'middle');\r\n    lines.forEach(function (l, i) {\r\n      var ts = document.createElementNS(NS, 'tspan');\r\n      ts.setAttribute('x', 0); ts.setAttribute('y', i * lh);\r\n      var runs = symRuns(l);\r\n      if (runs.length === 1 && !runs[0].sym) {\r\n        ts.textContent = l;\r\n      } else {\r\n        // symbol runs shrink to cap height (symRunScale) and centre on the\r\n        // letters' ink (symRunShift); dy is cumulative in SVG, so each shift\r\n        // is undone on the next plain run\r\n        var plain = runs.filter(function (r) { return !r.sym; }).map(function (r) { return r.s; }).join('');\r\n        var pend = 0;\r\n        runs.forEach(function (r) {\r\n          var rs = document.createElementNS(NS, 'tspan');\r\n          if (r.sym) {\r\n            var size = REF * symRunScale(fontName, REF, r.s);\r\n            rs.setAttribute('font-size', size.toFixed(1));\r\n            var sh = symRunShift(fontName, REF, plain, r.s, size);\r\n            if (sh) { rs.setAttribute('dy', (sh + pend).toFixed(1)); pend = -sh; }\r\n            else if (pend) { rs.setAttribute('dy', pend.toFixed(1)); pend = 0; }\r\n          } else if (pend) {\r\n            rs.setAttribute('dy', pend.toFixed(1)); pend = 0;\r\n          }\r\n          rs.textContent = r.s;\r\n          ts.appendChild(rs);\r\n        });\r\n      }\r\n      text.appendChild(ts);\r\n    });\r\n    // NOTE: never put an SVG filter on this text \u2014 iOS Safari rasterizes a\r\n    // filtered <text> through its layout box and flat-clips any ink painting\r\n    // past it (angel halo, tall script ascenders) no matter the declared\r\n    // filter region. If an engraved-edge effect returns, use a layered dark\r\n    // text copy (see git history), not a filter.\r\n    inner.appendChild(text);\r\n    layer.appendChild(inner);\r\n\r\n    // measure the real INK bounds (per-font) and uniformly scale to fill the box.\r\n    // Ink bounds (canvas TextMetrics) are the font's true visible extent, so every\r\n    // face \u2014 Magnum, Holland Land, scripts \u2014 sizes and centres consistently. Fall\r\n    // back to SVG getBBox() (the em-box) only where the canvas metrics are missing.\r\n    var bb = inkBounds(lines, fontName, REF, lh);\r\n    if (!bb) { try { bb = text.getBBox(); } catch (e) { bb = null; } }\r\n    if (!bb || !bb.width || !bb.height) {\r\n      inner.setAttribute('transform', 'translate(' + ta.x + ' ' + ta.y + ')');   // un-measurable: at least position it\r\n      return;\r\n    }\r\n    var s = Math.min(ta.w / bb.width, ta.h / bb.height) * (ta.fontScale || 1);\r\n    var cx = bb.x + bb.width / 2, cy = bb.y + bb.height / 2;\r\n    inner.setAttribute('transform',\r\n      'translate(' + ta.x + ' ' + ta.y + ') scale(' + s.toFixed(4) + ') translate(' + (-cx).toFixed(2) + ' ' + (-cy).toFixed(2) + ')');\r\n\r\n    if (ta.rotate) {   // rotate the placed text about the box centre\r\n      var outer = document.createElementNS(NS, 'g');\r\n      outer.setAttribute('transform', 'rotate(' + ta.rotate + ' ' + ta.x + ' ' + ta.y + ')');\r\n      layer.removeChild(inner);                        // re-wrap in place; sibling spot groups stay\r\n      outer.appendChild(inner);\r\n      layer.appendChild(outer);\r\n    }\r\n  }\r\n\r\n  /* a short text line for the modal (what's being engraved) \u2014 hidden when empty */\r\n  function previewMetaLine() {\r\n    var l = engravingLines();\r\n    return l.length ? l.join('   \u00B7   ') : '';\r\n  }\r\n\r\n  /* ---------------------------------------------------------------\r\n     Shared live-preview ZOOM MODAL (mock .lc-modal). Each preview builder adds a\r\n     zoom button to its card; tapping it opens this single modal showing the SAME\r\n     live preview, large:\r\n       - svg / image variants  -> clone the live <svg> into the modal stage and\r\n         re-clone on every edit (WFZoom.sync()), so it stays live.\r\n       - photo-overlay fallback -> move the live stage into the modal and back out\r\n         on close (the overlay can't be cloned live), re-fitting via a resize event.\r\n     --------------------------------------------------------------- */\r\n  var WFZoom = (function () {\r\n    var modal = null, slot = null, mmeta = null;\r\n    var liveGetSvg = null, onCloseCb = null, lastFocus = null, isOpen = false;\r\n\r\n    function ensure() {\r\n      if (modal) return;\r\n      modal = document.createElement('div');\r\n      modal.className = 'wf-lc-modal'; modal.hidden = true;\r\n      modal.innerHTML =\r\n        '<div class=\"wf-lc-modal-bg\" data-lc-close></div>' +\r\n        '<div class=\"wf-lc-modal-card\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Live engraving preview\">' +\r\n          '<button class=\"wf-lc-close\" type=\"button\" aria-label=\"Close preview\" data-lc-close>' +\r\n            '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\"/></svg>' +\r\n          '</button>' +\r\n          '<div class=\"wf-lc-mcap\">Live preview</div>' +\r\n          '<div class=\"wf-lc-mstage\"></div>' +\r\n          '<div class=\"wf-lc-mmeta\" hidden></div>' +\r\n        '</div>';\r\n      document.body.appendChild(modal);\r\n      slot = modal.querySelector('.wf-lc-mstage');\r\n      mmeta = modal.querySelector('.wf-lc-mmeta');\r\n      modal.addEventListener('click', function (e) {\r\n        if (e.target && e.target.closest && e.target.closest('[data-lc-close]')) close();\r\n      });\r\n      document.addEventListener('keydown', function (e) {\r\n        if (!isOpen) return;\r\n        if (e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27) { close(); return; }\r\n        if (e.key === 'Tab' || e.keyCode === 9) {                       // trap focus inside the dialog card\r\n          var card = modal.querySelector('.wf-lc-modal-card'); if (!card) return;\r\n          var f = [].filter.call(\r\n            card.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\r\n            function (el) { return !el.disabled && el.offsetParent !== null; });\r\n          if (!f.length) { e.preventDefault(); return; }\r\n          var first = f[0], last = f[f.length - 1], a = document.activeElement;\r\n          if (e.shiftKey && (a === first || !card.contains(a))) { e.preventDefault(); last.focus(); }\r\n          else if (!e.shiftKey && (a === last || !card.contains(a))) { e.preventDefault(); first.focus(); }\r\n        }\r\n      });\r\n    }\r\n\r\n    function setMeta(t) {\r\n      if (!mmeta) return;\r\n      if (t) { mmeta.textContent = t; mmeta.hidden = false; }\r\n      else { mmeta.textContent = ''; mmeta.hidden = true; }\r\n    }\r\n\r\n    /* make a cloned svg self-contained: rewrite its element ids (e.g. #wf-metal)\r\n       and url(#id) references so duplicate ids don't resolve to the card's svg */\r\n    function uniquifyIds(node, suffix) {\r\n      var ATTRS = ['fill', 'stroke', 'clip-path', 'filter', 'mask'];\r\n      var ided = node.querySelectorAll('[id]');\r\n      for (var i = 0; i < ided.length; i++) {\r\n        var oldId = ided[i].id, newId = oldId + suffix;\r\n        ided[i].id = newId;\r\n        var refs = node.querySelectorAll('*');\r\n        for (var j = 0; j < refs.length; j++) {\r\n          for (var k = 0; k < ATTRS.length; k++) {\r\n            var v = refs[j].getAttribute(ATTRS[k]);\r\n            if (v && v.indexOf('url(#' + oldId + ')') > -1) {\r\n              refs[j].setAttribute(ATTRS[k], v.replace('url(#' + oldId + ')', 'url(#' + newId + ')'));\r\n            }\r\n          }\r\n          // direct references too (textPath href to its curve path)\r\n          if (refs[j].getAttribute('href') === '#' + oldId) refs[j].setAttribute('href', '#' + newId);\r\n          if (refs[j].getAttribute('xlink:href') === '#' + oldId) {\r\n            refs[j].setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#' + newId);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    function sync() {\r\n      if (!isOpen || !liveGetSvg || !slot) return;\r\n      var src = liveGetSvg(); if (!src) return;\r\n      var clone = src.cloneNode(true);\r\n      uniquifyIds(clone, '-lcm');\r\n      // carry the card's sampled image background onto the modal stage\r\n      var card = src.closest ? src.closest('.wf-livecard') : null;\r\n      var bgv = card ? card.style.getPropertyValue('--wf-img-stage-bg') : '';\r\n      if (bgv) slot.style.setProperty('--wf-img-stage-bg', bgv);\r\n      else slot.style.removeProperty('--wf-img-stage-bg');\r\n      slot.innerHTML = '';\r\n      slot.appendChild(clone);\r\n    }\r\n\r\n    function open(cfg) {\r\n      ensure();\r\n      if (isOpen) return;                              // never re-open over an already-open modal\r\n      lastFocus = document.activeElement;\r\n      onCloseCb = (cfg && cfg.onClose) || null;\r\n      liveGetSvg = (cfg && cfg.getSvg) || null;\r\n      slot.className = 'wf-lc-mstage' + (cfg && cfg.svgMode === 'svg' ? ' wf-lc-mstage--svg' : '');\r\n      slot.innerHTML = '';\r\n      setMeta(cfg && cfg.meta);\r\n      // Make the modal visible and flag it open BEFORE mount/sync, so the slot has\r\n      // real layout (photo fit() reads clientWidth) and sync()'s isOpen guard passes.\r\n      modal.hidden = false; isOpen = true;\r\n      document.documentElement.classList.add('wf-lc-lock');\r\n      if (cfg && cfg.mount) { try { cfg.mount(slot); } catch (e) {} }   // photo: move live stage in + fit\r\n      sync();                                                            // svg/img: clone live svg into slot\r\n      var c = modal.querySelector('.wf-lc-close'); if (c) { try { c.focus(); } catch (e) {} }\r\n    }\r\n\r\n    function close() {\r\n      if (!isOpen) return;\r\n      isOpen = false; modal.hidden = true;\r\n      document.documentElement.classList.remove('wf-lc-lock');\r\n      var cb = onCloseCb; onCloseCb = null; liveGetSvg = null;\r\n      if (cb) { try { cb(slot); } catch (e) {} }\r\n      if (slot) slot.innerHTML = '';\r\n      if (lastFocus && lastFocus.focus) { try { lastFocus.focus(); } catch (e) {} }\r\n    }\r\n\r\n    function addBtn(card, onClick) {\r\n      // zoom button removed from the card (preview is now full-width); the\r\n      // modal machinery stays dormant behind it in case it comes back\r\n    }\r\n\r\n    return {\r\n      sync: sync,\r\n      /* clone-and-resync zoom for the svg / image preview variants */\r\n      attachSvg: function (card, getSvg, svgMode, getMeta) {\r\n        addBtn(card, function () {\r\n          open({ getSvg: getSvg, svgMode: svgMode, meta: getMeta && getMeta() });\r\n        });\r\n      },\r\n      /* move-the-live-stage zoom for the photo-overlay fallback */\r\n      attachMove: function (card, stage, getMeta) {\r\n        addBtn(card, function () {\r\n          var home = { parent: stage.parentNode, next: stage.nextSibling };\r\n          var frozen = card.offsetHeight;\r\n          open({\r\n            meta: getMeta && getMeta(),\r\n            mount: function (sl) {\r\n              card.style.minHeight = frozen + 'px';   // keep the card from collapsing behind the blur\r\n              sl.appendChild(stage);\r\n              try { window.dispatchEvent(new Event('resize')); } catch (e) {}   // re-fit the overlay to the big stage\r\n            },\r\n            onClose: function () {\r\n              if (home.next && home.next.parentNode === home.parent) home.parent.insertBefore(stage, home.next);\r\n              else if (home.parent) home.parent.appendChild(stage);\r\n              card.style.minHeight = '';\r\n              try { window.dispatchEvent(new Event('resize')); } catch (e) {}\r\n            }\r\n          });\r\n        });\r\n      }\r\n    };\r\n  })();\r\n\r\n  /* Content-aware vertical crop for the image-preview stage. The merchant's\r\n     preview images are squares whose product may be a short band (bar ring) or\r\n     nearly full-bleed (oval locket ring) \u2014 a fixed crop cuts the latter off.\r\n     Measure the image's content rows on a small canvas (background = corner\r\n     color), union with the engraving box so text is never cropped, pad, clamp\r\n     to the drawn image band and to [0.15, 1] of the square, and expose the\r\n     window as CSS vars on the card (--wf-img-crop-top / --wf-img-crop-h;\r\n     defaults mean \"no crop\"). */\r\n  /* crop / tone sampling need one axis-aligned rectangle \u2014 the bounding box of\r\n     all spots (textAreas array) or of the single textArea, accounting for\r\n     rotate: a -90\u00B0 bar (vertical bar charm) extends vertically by its WIDTH,\r\n     and the crop must reserve that, not the unrotated height */\r\n  function taUnion(ta) {\r\n    var list = (ta && typeof ta.length === 'number') ? ta : (ta ? [ta] : []);\r\n    var x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\r\n    for (var i = 0; i < list.length; i++) {\r\n      var t = list[i], r = (t.rotate || 0) * Math.PI / 180;\r\n      var eh = t.h + Math.abs(t.curve || 0);   // a curved arc bulges past the box height\r\n      var hw = (Math.abs(t.w * Math.cos(r)) + Math.abs(eh * Math.sin(r))) / 2;\r\n      var hh = (Math.abs(t.w * Math.sin(r)) + Math.abs(eh * Math.cos(r))) / 2;\r\n      x0 = Math.min(x0, t.x - hw); y0 = Math.min(y0, t.y - hh);\r\n      x1 = Math.max(x1, t.x + hw); y1 = Math.max(y1, t.y + hh);\r\n    }\r\n    if (!isFinite(x0)) return null;\r\n    return { x: (x0 + x1) / 2, y: (y0 + y1) / 2, w: x1 - x0, h: y1 - y0 };\r\n  }\r\n  var WF_CROP_CACHE = {};\r\n  function applyStageCrop(card, url, ta, onTone) {\r\n    if (!url) return;\r\n    function set(c) {\r\n      card._wfCrop = c;\r\n      card.style.setProperty('--wf-img-crop-top', c.top);\r\n      card.style.setProperty('--wf-img-crop-h', c.h);\r\n      if (c.bg) card.style.setProperty('--wf-img-stage-bg', c.bg);\r\n      else card.style.removeProperty('--wf-img-stage-bg');\r\n      applyStageZoom(card);\r\n      // hand the measured backdrop color to the engraving renderer;\r\n      // redraw once when it first arrives (image decode is async)\r\n      var sv = card.querySelector('.wf-preview-svg');\r\n      if (sv && (sv._wfTaLum !== c.lum || sv._wfTaChroma !== c.chroma)) {\r\n        sv._wfTaLum = (c.lum == null ? null : c.lum);\r\n        sv._wfTaChroma = (c.chroma == null ? null : c.chroma);\r\n        if (typeof onTone === 'function') onTone();\r\n      }\r\n    }\r\n    var cached = WF_CROP_CACHE[url];\r\n    card.dataset.wfCropUrl = url;\r\n    if (cached) { set(cached); return; }\r\n    var im = new Image();\r\n    im.crossOrigin = 'anonymous';\r\n    im.onload = function () {\r\n      var crop = { top: 0, h: 1 };\r\n      try {\r\n        var S = 80, cv = document.createElement('canvas');\r\n        cv.width = S; cv.height = S;\r\n        var cx = cv.getContext('2d', { willReadFrequently: true });\r\n        cx.drawImage(im, 0, 0, S, S);\r\n        var d = cx.getImageData(0, 0, S, S).data;\r\n        var corners = [0, (S - 1) * 4, (S - 1) * S * 4, (S * S - 1) * 4];\r\n        var bg = [0, 1, 2].map(function (c) {\r\n          return (d[corners[0] + c] + d[corners[1] + c] + d[corners[2] + c] + d[corners[3] + c]) / 4;\r\n        });\r\n        // stage backdrop matches the image's own background, so any letterboxing\r\n        // around a non-square image blends in instead of showing white bars\r\n        var bgCss = 'rgb(' + Math.round(bg[0]) + ',' + Math.round(bg[1]) + ',' + Math.round(bg[2]) + ')';\r\n        crop.bg = bgCss;\r\n        var TH = 28, top = -1, bot = -1;\r\n        for (var y = 0; y < S; y++) {\r\n          for (var x = 0; x < S; x++) {\r\n            var i = (y * S + x) * 4;\r\n            if (Math.abs(d[i] - bg[0]) > TH || Math.abs(d[i + 1] - bg[1]) > TH || Math.abs(d[i + 2] - bg[2]) > TH) {\r\n              if (top < 0) top = y;\r\n              bot = y;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        if (top > -1) {\r\n          // to viewBox units: the <image> is meet-fitted inside the 200x200 box\r\n          var ar = im.naturalWidth / im.naturalHeight;\r\n          var drawnH = ar >= 1 ? 200 / ar : 200;\r\n          var offY = (200 - drawnH) / 2;\r\n          var y0 = offY + (top / S) * drawnH;\r\n          var y1 = offY + ((bot + 1) / S) * drawnH;\r\n          if (ta) {                                    // never crop the engraving box\r\n            y0 = Math.min(y0, ta.y - ta.h / 2 - 4);\r\n            y1 = Math.max(y1, ta.y + ta.h / 2 + 4);\r\n          }\r\n          var PAD = 10;\r\n          y0 = Math.max(0, y0 - PAD); y1 = Math.min(200, y1 + PAD);\r\n          // never show past the drawn image itself: a misplaced engraving box\r\n          // (or padding) must not reserve empty letterbox rows in the stage\r\n          y0 = Math.max(y0, offY); y1 = Math.min(y1, offY + drawnH);\r\n          var h = Math.min(1, Math.max(0.15, (y1 - y0) / 200));\r\n          var center = (y0 + y1) / 400;\r\n          // mean color of the metal under the engraving box \u2014 drawEngrave flips\r\n          // the text tone on BRIGHT-NEUTRAL backdrops (polished silver / glare,\r\n          // where real frosting reads dark). Chroma keeps gold (bright but\r\n          // yellow) and black on the default warm white.\r\n          var lum = null, chroma = null;\r\n          if (ta) {\r\n            var drawnW = ar >= 1 ? 200 : 200 * ar, offX = (200 - drawnW) / 2;\r\n            var lx0 = Math.max(0, Math.round((ta.x - ta.w / 2 - offX) / drawnW * S));\r\n            var lx1 = Math.min(S - 1, Math.round((ta.x + ta.w / 2 - offX) / drawnW * S));\r\n            var ly0 = Math.max(0, Math.round((ta.y - ta.h / 2 - offY) / drawnH * S));\r\n            var ly1 = Math.min(S - 1, Math.round((ta.y + ta.h / 2 - offY) / drawnH * S));\r\n            var sr = 0, sg = 0, sb = 0, n = 0;\r\n            for (var yy = ly0; yy <= ly1; yy++) {\r\n              for (var xx = lx0; xx <= lx1; xx++) {\r\n                var ll = (yy * S + xx) * 4;\r\n                sr += d[ll]; sg += d[ll + 1]; sb += d[ll + 2]; n++;\r\n              }\r\n            }\r\n            if (n) {\r\n              sr /= n; sg /= n; sb /= n;\r\n              lum = 0.299 * sr + 0.587 * sg + 0.114 * sb;\r\n              chroma = Math.max(sr, sg, sb) - Math.min(sr, sg, sb);\r\n            }\r\n          }\r\n          crop = { top: Math.max(0, Math.min(1 - h, center - h / 2)), h: h, bg: bgCss, lum: lum, chroma: chroma };\r\n        }\r\n      } catch (e) { /* tainted canvas etc. -> full square */ }\r\n      WF_CROP_CACHE[url] = crop;\r\n      if (card.dataset.wfCropUrl === url) set(crop);   // still the current image\r\n    };\r\n    im.src = url;\r\n  }\r\n\r\n  /* Wide products have a short content band and render small inside the fixed\r\n     square stage \u2014 scale the whole square up (--wf-img-zoom) until the band\r\n     fills the card's inner width, capped so the band never grows taller than\r\n     the base square. Everything scales together, so image + engraving stay\r\n     registered. */\r\n  function applyStageZoom(card) {\r\n    var c = card._wfCrop || { top: 0, h: 1 };\r\n    var S = Math.min(window.innerWidth * 0.54, 170);      // base square = css min(54vw, 170px)\r\n    var maxW = Math.max(S, (card.clientWidth || S) - 36); // inner width (18px side padding)\r\n    // twin (front+back) stages share the row: each may only grow to half of it\r\n    if (card.classList.contains('wf-livecard--twin')) maxW = Math.max(S, (maxW - 10) / 2);\r\n    var z = Math.max(1, Math.min(1 / c.h, maxW / S));\r\n    card.style.setProperty('--wf-img-zoom', Math.round(z * 100) / 100);\r\n  }\r\n\r\n  /* ---- 2a-i. Engraving Preview Image: the merchant's per-variant\r\n     custom.engraving_preview_image as the backdrop, with the live engraving drawn\r\n     on top (text-area from the authored shape geometry). Preferred over the drawn\r\n     SVG when an image exists. ---- */\r\n  function buildMetafieldPreview() {\r\n    var imgs = window.WF_PREVIEW_IMAGES; if (!imgs) return false;\r\n    function firstImg() { for (var k in imgs) { if (imgs[k]) return imgs[k]; } return null; }\r\n    var url = (function () { var v = currentVariantId(); return (v && imgs[v]) || firstImg(); })();\r\n    if (!url) return false;\r\n\r\n    var SH = window.WF_PREVIEW_SHAPES || {};\r\n    var ot = (document.getElementById('ornament-type') || {}).value || '';\r\n    // textAreas (per-line spots, e.g. CIRCLE_QUADRANT_NECKLACE) wins over the single textArea\r\n    var ta = (SH[ot] && (SH[ot].textAreas || SH[ot].textArea)) || { x: 100, y: 118, w: 130, h: 46, rotate: 0, lines: 1, maxChars: 11, color: '#f8f5ef' };\r\n    var backTa = (SH[ot] && SH[ot].backTextArea) || null;\r\n\r\n    var card = document.createElement('div'); card.className = 'wf-livecard wf-livecard--img';\r\n    var stage = document.createElement('div'); stage.className = 'wf-livecard-stage wf-img-stage';\r\n    var cap = document.createElement('div'); cap.className = 'wf-livecard-cap'; cap.textContent = 'Live preview';\r\n    function makeSvg() {\r\n      var s = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n      s.setAttribute('viewBox', '0 0 200 200'); s.setAttribute('class', 'wf-preview-svg wf-preview-img');\r\n      s.innerHTML = '<image class=\"wf-bg-img\" x=\"0\" y=\"0\" width=\"200\" height=\"200\" preserveAspectRatio=\"xMidYMid meet\"></image><g class=\"wf-engrave-layer\"></g>';\r\n      return s;\r\n    }\r\n    var svg = makeSvg();\r\n    function setImg(u) {\r\n      card.querySelectorAll('.wf-bg-img').forEach(function (im) {\r\n        im.setAttribute('href', u); im.setAttributeNS('http://www.w3.org/1999/xlink', 'href', u);\r\n      });\r\n    }\r\n    stage.appendChild(svg);\r\n    card.appendChild(cap);\r\n    var backSvg = null;\r\n    if (backTa) {\r\n      /* twin stages: the back side is the same photo stage duplicated beside\r\n         the front, its engraving drawn from the back line. Both stages share\r\n         the card's crop/zoom CSS vars, so they stay registered. The back wrap\r\n         is CSS-hidden until the back line has content (.wf-livecard--twin). */\r\n      var row = document.createElement('div'); row.className = 'wf-stage-row';\r\n      var fw = document.createElement('div'); fw.className = 'wf-stage-wrap';\r\n      var flb = document.createElement('div'); flb.className = 'wf-stage-label'; flb.textContent = 'Front';\r\n      fw.appendChild(stage); fw.appendChild(flb);\r\n      var bw = document.createElement('div'); bw.className = 'wf-stage-wrap wf-back-wrap';\r\n      var bStage = document.createElement('div'); bStage.className = 'wf-livecard-stage wf-img-stage';\r\n      backSvg = makeSvg();\r\n      bStage.appendChild(backSvg);\r\n      var blb = document.createElement('div'); blb.className = 'wf-stage-label'; blb.textContent = 'Back';\r\n      bw.appendChild(bStage); bw.appendChild(blb);\r\n      row.appendChild(fw); row.appendChild(bw);\r\n      card.appendChild(row);\r\n    } else {\r\n      card.appendChild(stage);\r\n    }\r\n    setImg(url);\r\n\r\n    var insertBefore = atcAnchor() || photoUploadEl();\r\n    if (!insertBefore || !insertBefore.parentNode) return false;\r\n    insertBefore.parentNode.insertBefore(card, insertBefore);\r\n\r\n    var vp = document.getElementById('viewPreview');\r\n    if (vp) { vp.classList.add('wf-gone'); var w = vp.closest('.upload'); if (w && !w.querySelector('#upload-file')) w.classList.add('wf-gone'); }\r\n\r\n    WFZoom.attachSvg(card, function () { return svg; }, 'img', previewMetaLine);\r\n\r\n    var curUrl = url;\r\n    function cropBox() {\r\n      return backTa ? taUnion([].concat(ta).concat([backTa])) : taUnion(ta);\r\n    }\r\n    function drawAll() {\r\n      if (backTa) {\r\n        var n = (typeof ta.length === 'number') ? ta.length : (ta.lines || 1);\r\n        var front = wfFrontLines(n);\r\n        while (front.length && !front[front.length - 1]) front.pop();\r\n        drawEngrave(svg, ta, front);\r\n        var backText = wfBackText(n);\r\n        card.classList.toggle('wf-livecard--twin', !!backText);\r\n        if (backSvg) {\r\n          var layer = backSvg.querySelector('.wf-engrave-layer');\r\n          layer.textContent = '';\r\n          if (backText) {\r\n            var fontName = engravingFont().replace(/\"/g, '');\r\n            ensureEngraveFonts(backText, fontName, function () { drawAll(); WFZoom.sync(); });\r\n            buildEngraveGroup(layer, [backText], backTa, fontName);\r\n          }\r\n        }\r\n        applyStageZoom(card);\r\n      } else {\r\n        drawEngrave(svg, ta);\r\n      }\r\n    }\r\n    function render() {\r\n      var v = currentVariantId(); var u = v && imgs[v]; if (u) { setImg(u); curUrl = u; }   // swap image on variant change\r\n      applyStageCrop(card, curUrl, cropBox(), function () { drawAll(); WFZoom.sync(); });\r\n      drawAll();\r\n      WFZoom.sync();                                                        // keep the open modal in sync\r\n    }\r\n    render();\r\n    var deb = null;\r\n    function onChange() { if (deb) clearTimeout(deb); deb = setTimeout(render, 60); }\r\n    document.addEventListener('input', onChange, true);\r\n    document.addEventListener('change', onChange, true);\r\n    document.addEventListener('click', function (e) { if (e.target && e.target.closest && e.target.closest('.font-button, .variant-input, .color-swatch')) onChange(); }, true);\r\n    var oc = document.querySelector('.pdp-overlay-container');\r\n    if (oc) { try { new MutationObserver(onChange).observe(oc, { subtree: true, childList: true, characterData: true }); } catch (e) {} }\r\n    var rz = null;\r\n    window.addEventListener('resize', function () { if (rz) clearTimeout(rz); rz = setTimeout(function () { applyStageZoom(card); }, 150); });\r\n    return true;\r\n  }\r\n\r\n  function buildSvgPreview() {\r\n    var SH = window.WF_PREVIEW_SHAPES; if (!SH) return false;\r\n    var ot = (document.getElementById('ornament-type') || {}).value || '';\r\n    var shape = SH[ot]; if (!shape || !shape.svgInner) return false;\r\n\r\n    var card = document.createElement('div'); card.className = 'wf-livecard wf-livecard--svg';\r\n    var stage = document.createElement('div'); stage.className = 'wf-livecard-stage wf-svg-stage';\r\n    var cap = document.createElement('div'); cap.className = 'wf-livecard-cap'; cap.textContent = 'Live preview';\r\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n    svg.setAttribute('viewBox', shape.viewBox || '0 0 200 200');\r\n    svg.setAttribute('class', 'wf-preview-svg');\r\n    svg.innerHTML =\r\n      '<defs><linearGradient id=\"wf-metal\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">' +\r\n      '<stop class=\"wf-m0\" offset=\"0\"/><stop class=\"wf-m1\" offset=\"0.5\"/><stop class=\"wf-m2\" offset=\"1\"/></linearGradient></defs>' +\r\n      shape.svgInner + '<g class=\"wf-engrave-layer\"></g>';\r\n    stage.appendChild(svg);\r\n    card.appendChild(cap); card.appendChild(stage);\r\n\r\n    var insertBefore = atcAnchor() || photoUploadEl();\r\n    if (!insertBefore || !insertBefore.parentNode) return false;\r\n    insertBefore.parentNode.insertBefore(card, insertBefore);\r\n\r\n    var vp = document.getElementById('viewPreview');\r\n    if (vp) { vp.classList.add('wf-gone'); var w = vp.closest('.upload'); if (w && !w.querySelector('#upload-file')) w.classList.add('wf-gone'); }\r\n\r\n    WFZoom.attachSvg(card, function () { return svg; }, 'svg', previewMetaLine);\r\n\r\n    var ta = shape.textAreas || shape.textArea || { x: 100, y: 100, w: 100, h: 40, rotate: 0, lines: 1, maxChars: 9 };\r\n    function render() {\r\n      var m = WF_METALS[selectedMetalKey()] || WF_METALS.silver;\r\n      var g = svg.querySelector('#wf-metal');\r\n      g.querySelector('.wf-m0').setAttribute('stop-color', m[0]);\r\n      g.querySelector('.wf-m1').setAttribute('stop-color', m[1]);\r\n      g.querySelector('.wf-m2').setAttribute('stop-color', m[2]);\r\n      drawEngrave(svg, ta);\r\n      WFZoom.sync();                                                        // keep the open modal in sync\r\n    }\r\n    render();\r\n    var deb = null;\r\n    function onChange() { if (deb) clearTimeout(deb); deb = setTimeout(render, 60); }\r\n    document.addEventListener('input', onChange, true);\r\n    document.addEventListener('change', onChange, true);\r\n    document.addEventListener('click', function (e) { if (e.target && e.target.closest && e.target.closest('.font-button, .variant-input, .color-swatch')) onChange(); }, true);\r\n    var oc = document.querySelector('.pdp-overlay-container');\r\n    if (oc) { try { new MutationObserver(onChange).observe(oc, { subtree: true, childList: true, characterData: true }); } catch (e) {} }\r\n    return true;\r\n  }\r\n\r\n  function buildPhotoPreview() {\r\n    if (VARIANT !== 'B') return;\r\n    if (document.querySelector('.wf-livecard')) return;\r\n    var oc = document.querySelector('.pdp-overlay-container');\r\n    if (!oc || !oc.querySelector('canvas, .preview-text')) return;  // nothing to preview yet\r\n\r\n    // natural square size while still positioned over the gallery\r\n    var natW = Math.round(oc.getBoundingClientRect().width) || oc.offsetWidth || 440;\r\n    if (natW < 120) natW = 440;\r\n\r\n    var card = document.createElement('div');\r\n    card.className = 'wf-livecard';\r\n    var stage = document.createElement('div'); stage.className = 'wf-livecard-stage';\r\n    var cap = document.createElement('div'); cap.className = 'wf-livecard-cap'; cap.textContent = 'Live preview';\r\n    card.appendChild(cap); card.appendChild(stage);\r\n\r\n    // the PRODUCT PHOTO is the stage backdrop (the product's shape); the relocated\r\n    // overlay contributes only the live engraving text/canvas on top.\r\n    var ps = productPhotoSrc();\r\n    if (ps) stage.style.backgroundImage = 'url(\"' + ps + '\")';\r\n    var oimg = oc.querySelector('img'); if (oimg) oimg.style.display = 'none';\r\n\r\n    stage.appendChild(oc);\r\n    oc.style.width = natW + 'px';\r\n    oc.style.height = natW + 'px';\r\n    function fit() {\r\n      var sw = stage.clientWidth || 300;\r\n      oc.style.transform = 'scale(' + (sw / natW) + ')';\r\n      stage.style.height = Math.round(sw) + 'px';   // square stage matches square overlay\r\n    }\r\n\r\n    // place just above the ATC (below the photo uploader)\r\n    var insertBefore = atcAnchor() || photoUploadEl();\r\n    if (!insertBefore || !insertBefore.parentNode) return;\r\n    insertBefore.parentNode.insertBefore(card, insertBefore);\r\n    fit();\r\n    window.addEventListener('resize', fit);\r\n\r\n    WFZoom.attachMove(card, stage, previewMetaLine);\r\n\r\n    // the inline card replaces the now-redundant \"View Preview\" button\r\n    var vp = document.getElementById('viewPreview');\r\n    if (vp) {\r\n      vp.classList.add('wf-gone');\r\n      var w = vp.closest('.upload');\r\n      if (w && !w.querySelector('#upload-file')) w.classList.add('wf-gone');\r\n    }\r\n  }\r\n\r\n  function buildLivePreview() {\r\n    if (VARIANT !== 'B') return;\r\n    if (document.querySelector('.wf-livecard')) return;\r\n    if (buildMetafieldPreview()) return;  // merchant \"Preview Image\" metafield (preferred)\r\n    if (buildSvgPreview()) return;         // authored Claude-Design SVG shape\r\n    buildPhotoPreview();                   // fallback: gallery photo + theme overlay\r\n  }\r\n\r\n  /* ---- 4. Match the design's engraving input: add a \"Up to N letters\" placeholder\r\n     and strip the \"(N characters)\" suffix from the field labels (the count already\r\n     sits on the right of the input). ---- */\r\n  function tidyEngravingLabels() {\r\n    if (VARIANT !== 'B') return;                            // control A must match production\r\n    var root = document.querySelector('.product-single__form'); if (!root) return;\r\n    root.querySelectorAll('.symbol-input, .custom-ornament-field.input input[type=\"text\"], .custom-ring-field.input input[type=\"text\"], .custom-bracelet-field.input input[type=\"text\"]').forEach(function (inp) {\r\n      if (inp.dataset.wfPh === '1') return;\r\n      var max = parseInt(inp.getAttribute('maxlength'), 10);\r\n      if (max && !(inp.getAttribute('placeholder') || '').trim()) inp.setAttribute('placeholder', 'Up to ' + max + ' letters');\r\n      inp.dataset.wfPh = '1';\r\n    });\r\n    // no once-only flag here: the theme rewrites these labels (re-adding the\r\n    // count) on variant/config changes, so strip by content every pass \u2014 the\r\n    // observer loop settles because nothing is written unless a count matches\r\n    root.querySelectorAll('.symbol-input-container label, .symbol-input-container .symbol-dropdown-label, .symbol-input-label, .custom-ornament-field > label, .custom-ring-field > label, .custom-bracelet-field > label').forEach(function (l) {\r\n      [].slice.call(l.querySelectorAll('*')).forEach(function (c) {\r\n        if (!c.children.length && /^\\(\\s*\\d+\\s*characters?\\s*\\)$/i.test((c.textContent || '').trim())) c.remove();\r\n      });\r\n      for (var i = 0; i < l.childNodes.length; i++) {\r\n        var n = l.childNodes[i];\r\n        if (n.nodeType === 3 && /\\(\\s*\\d+\\s*characters?\\s*\\)/i.test(n.nodeValue)) {\r\n          n.nodeValue = n.nodeValue.replace(/\\(\\s*\\d+\\s*characters?\\s*\\)/ig, '').replace(/\\s{2,}/g, ' ');\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  /* ---- 4b. Caret to the END when first clicking into a filled engraving\r\n     input. The theme rebuilds these inputs' values (symbols live in\r\n     data-char-N and the value gets reconstructed), which can leave the caret\r\n     at position 0 on focus. Only the focusing interaction is corrected \u2014\r\n     clicks while already focused position the caret freely. ---- */\r\n  function wireCaretToEnd() {\r\n    if (VARIANT !== 'B') return;\r\n    if (document._wfCaretWired) return;\r\n    document._wfCaretWired = true;\r\n    var SEL = '.symbol-input, .custom-ornament-field.input input[type=\"text\"], .custom-ring-field.input input[type=\"text\"], .custom-bracelet-field.input input[type=\"text\"]';\r\n    document.addEventListener('focusin', function (e) {\r\n      var el = e.target;\r\n      if (!el || !el.matches || !el.matches(SEL)) return;\r\n      function toEnd() {\r\n        try {\r\n          if (document.activeElement !== el) return;\r\n          var n = (el.value || '').length;\r\n          if (n) el.setSelectionRange(n, n);\r\n        } catch (err) {}\r\n      }\r\n      setTimeout(toEnd, 0);\r\n      // the pointerup completing the focusing click can re-place the caret \u2014\r\n      // correct once more right after it, then leave the user alone\r\n      el.addEventListener('pointerup', function () { setTimeout(toEnd, 0); }, { once: true });\r\n    });\r\n  }\r\n\r\n  /* ---- 5. Uploaded photo shows inside the upload button's icon tile (not the\r\n     theme's .upload__preview-wrap card), clipped to the product's crop shape. ---- */\r\n  function injectHeartClip() {\r\n    if (document.getElementById('wf-heart-clip')) return;\r\n    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n    svg.setAttribute('width', '0'); svg.setAttribute('height', '0'); svg.setAttribute('aria-hidden', 'true');\r\n    svg.style.cssText = 'position:absolute;width:0;height:0;pointer-events:none';\r\n    svg.innerHTML = '<defs><clipPath id=\"wf-heart-clip\" clipPathUnits=\"objectBoundingBox\"><path d=\"M0.5 1 C0.324 0.899 0 0.681 0 0.333 C0 0.116 0.135 0 0.284 0 C0.392 0 0.473 0.058 0.5 0.174 C0.527 0.058 0.608 0 0.716 0 C0.865 0 1 0.116 1 0.333 C1 0.681 0.676 0.899 0.5 1 Z\"/></clipPath></defs>';\r\n    document.body.appendChild(svg);\r\n  }\r\n  function photoShape() {\r\n    var lt = ((document.getElementById('locket-type') || {}).value || '');\r\n    if (/heart/i.test(lt)) return 'heart';\r\n    if (/oval/i.test(lt)) return 'oval';\r\n    if (/rectangle|memorial-frame/i.test(lt)) return 'square';\r\n    if (/cocktail/i.test(lt)) return 'circle';\r\n    var ot = ((document.getElementById('ornament-type') || {}).value || '');\r\n    if (/HEART/.test(ot)) return 'heart';\r\n    if (/OVAL/.test(ot)) return 'oval';\r\n    if (/SQUARE|RECTANGLE/.test(ot)) return 'square';\r\n    return 'circle';\r\n  }\r\n  function wirePhotoThumb() {\r\n    if (VARIANT !== 'B') return;\r\n    var preview = document.getElementById('upload-preview');\r\n    var btn = document.querySelector('.product-single__form .upload .btn--upload:not(#viewPreview)');\r\n    if (!preview || !btn || btn.dataset.wfPhotoWired === '1') return;\r\n    btn.dataset.wfPhotoWired = '1';\r\n    injectHeartClip();\r\n    btn.classList.add('wf-photo-' + photoShape());\r\n    var label = document.getElementById('upload-btn-text');\r\n    function realSrc() { var s = preview.getAttribute('src') || ''; return (!s || s.indexOf('data:image/svg') > -1) ? '' : s; }\r\n    function apply() {\r\n      var src = realSrc();\r\n      if (src) {\r\n        btn.style.setProperty('--wf-thumb', 'url(\"' + src + '\")');\r\n        btn.classList.add('wf-has-photo');\r\n        if (label) label.innerHTML = 'Photo added<small>Tap to change</small>';\r\n      } else {\r\n        btn.classList.remove('wf-has-photo');\r\n        btn.style.removeProperty('--wf-thumb');\r\n        if (label && !label.querySelector('input')) label.textContent = 'Upload Photo';\r\n      }\r\n    }\r\n    apply();\r\n    preview.addEventListener('load', apply);            // wins over the theme's inline \"Change Photo\" handler\r\n    if ('MutationObserver' in window) new MutationObserver(apply).observe(preview, { attributes: true, attributeFilter: ['src'] });\r\n  }\r\n\r\n  function ready(fn) {\r\n    if (document.readyState !== 'loading') fn();\r\n    else document.addEventListener('DOMContentLoaded', fn);\r\n  }\r\n\r\n  /* create the character count for symbol fields that lack one (the theme only\r\n     builds it when an \"Add symbol\" button is present \u2014 fields without symbols got none) */\r\n  function ensureSymbolCounts() {\r\n    if (VARIANT !== 'B') return;                            // control A must match production\r\n    document.querySelectorAll('.product-single__form .symbol-input-container').forEach(function (c) {\r\n      if (c.querySelector('.symbol-input-count')) return;\r\n      var inner = c.querySelector('.symbol-input-inner'); if (!inner) return;\r\n      var input = inner.querySelector('.symbol-input'); if (!input) return;\r\n      var limit = parseInt(c.getAttribute('data-char-limit'), 10);\r\n      if (!limit) limit = parseInt(input.getAttribute('maxlength'), 10);\r\n      if (!limit) return;\r\n      var span = document.createElement('span');\r\n      span.className = 'symbol-input-count';\r\n      var btn = inner.querySelector('.symbol-input-button');\r\n      if (btn) inner.insertBefore(span, btn); else inner.appendChild(span);\r\n      var upd = function () { span.textContent = (input.value || '').length + '/' + limit; };\r\n      upd();\r\n      input.addEventListener('input', upd);\r\n      input.addEventListener('change', upd);\r\n    });\r\n  }\r\n\r\n  /* Legacy customring pages (e.g. Engravable Heart Ring): read like the circle\r\n     signet page on B \u2014 font picker above the engraving input, and the big\r\n     symbols grid collapsed by default (zodiac already is). One-shot guards so\r\n     reopening the accordion isn't fought, and A keeps the production layout. */\r\n  function tidyLegacyCustomring() {\r\n    if (VARIANT !== 'B') return;\r\n    var blk = document.querySelector('.product-single__form .wf-customring-block');\r\n    if (!blk) return;\r\n    var chk = blk.querySelector('#symbols-check');\r\n    if (chk && chk.dataset.wfCollapsed !== '1') { chk.dataset.wfCollapsed = '1'; chk.checked = false; }\r\n    if (blk.dataset.wfFontFirst !== '1') {\r\n      var input = blk.querySelector('.custom-ring-field.input');\r\n      var label = blk.querySelector('label[for=\"font-container\"]');\r\n      var font = blk.querySelector('#font-container');\r\n      if (input && label && font && font.children.length) {\r\n        blk.insertBefore(label, input);\r\n        blk.insertBefore(font, input);\r\n        blk.dataset.wfFontFirst = '1';\r\n      }\r\n    }\r\n  }\r\n\r\n  function tick() { buildStickyAtc(); moveUploadToBottom(); buildLivePreview(); tidyEngravingLabels(); ensureSymbolCounts(); wireCaretToEnd(); wirePhotoThumb(); tidyLegacyCustomring(); }\r\n\r\n  if (AB.active) trackAssignment();              // test concluded -> no stamping/GA4\r\n  ready(function () {\r\n    tick();\r\n    // personalizer markup mounts late (minified theme JS) \u2014 retry as it appears\r\n    [600, 1200, 2000, 3000].forEach(function (t) { setTimeout(tick, t); });\r\n    // late mounts / re-renders \u2014 keep things tidy (guards prevent loops)\r\n    var form = document.querySelector('.product-single__form');\r\n    if (form) {\r\n      try {\r\n        var deb;\r\n        new MutationObserver(function () {\r\n          // strip label counts synchronously: MO callbacks are microtasks, so\r\n          // this runs before the browser paints the theme's rewritten label \u2014\r\n          // no \"(6 characters)\" flash while typing. Writes only happen when a\r\n          // count is present, so the observer loop settles.\r\n          tidyEngravingLabels();\r\n          clearTimeout(deb); deb = setTimeout(function () { wirePhotoThumb(); }, 80);\r\n        }).observe(form, { childList: true, subtree: true, characterData: true });\r\n      } catch (e) {}\r\n    }\r\n  });\r\n})();\r\n"],
  "mappings": "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",
  "names": ["r"]
}
