{
  "version": 3,
  "sources": ["/cdn/shop/t/268/assets/locket-engraving.js?cb=20260624o"],
  "sourcesContent": ["/*\r\n * locket-engraving.js \u2014 3-style engraving selector + live preview for the\r\n * personalized locket PDP (ornament-type LOCKET_ENGRAVED, tag `engravable-locket`).\r\n *\r\n * Styles (mirror the backend DXF generators in automations/generate_locket_dxf.py):\r\n *   single   -> generate_locket_single_line_dxf  (one centered line)\r\n *   stacked  -> generate_locket_stacked_dxf       (1-6 names stacked)\r\n *   monogram -> generate_locket_dxf               (center initial + names curved on the edge)\r\n *\r\n * Integration: renders its own inputs as `.symbol-input-container[data-name]` fields inside\r\n * the existing engraving panel. The theme's add-to-cart calls generateTextValues(), which\r\n * harvests every such field into a cart line-item property keyed by data-name (UPPER-CASED)\r\n * \u2014 so no edit to the minified add-to-cart is needed. Font is read live from `.font-button.active`.\r\n *\r\n * Positioning: geometry is a tunable object per shape (GEO) with an optional per-variant\r\n * override (GEO_OVERRIDES, keyed by variant color/title so Gold vs Silver can differ).\r\n * The dev-only drag panel (snippets/locket-engraving-debug.liquid, ?lke-debug) edits these\r\n * live and exports the numbers. window.__lke exposes the hook it uses.\r\n */\r\n(function () {\r\n  'use strict';\r\n\r\n  var ORNAMENT_TYPE = 'LOCKET_ENGRAVED';\r\n\r\n  /* ---- Per-style limits (see docs/locket-engraving-contract.md) ---- */\r\n  var SINGLE_MAXLEN = 12;\r\n  var NAME_MAXLEN = 10;\r\n  var INITIAL_MAXLEN = 1;\r\n  var MAX_NAMES = 6;\r\n\r\n  var STYLES = [\r\n    { key: 'single', label: 'Single Line', hint: 'One line of text, centered on the locket.' },\r\n    { key: 'stacked', label: 'Stacked Names', hint: 'Up to six names, centered and stacked.' },\r\n    { key: 'monogram', label: 'Monogram', hint: 'A center initial with names curved around the edge.' }\r\n  ];\r\n\r\n  /* ---- FAITHFUL layout constants, lifted from automations/generate_locket_dxf.py ----\r\n     The preview reproduces the DXF math: locket-face dims (PRODUCT_DIMS, mm), the\r\n     single 11x11 / stacked 11x17 fill-boxes, the 0.79 edge-name ellipse, per-name-count\r\n     center-initial size ratios, edge cap-heights, and the 1.35 stacked line spacing.\r\n     LINE_SPACING_MULT and the ratios below are verbatim from the Python. ---- */\r\n  var LINE_SPACING_MULT = 1.35;\r\n  var LOCKET = {\r\n    // W,H = artboard mm (PRODUCT_DIMS). single/stack = fill-box mm. initRatio = [n<=2,n<=4,else].\r\n    // ellA/ellB = edge-ellipse semi-axes as fraction of half-W/half-H. ecy/initYoff = mm offsets.\r\n    // edgeCap = cap height as fraction of H [n<5, n>=5].\r\n    oval_necklace: { W: 18.9, H: 25.0, single: [11, 11], stack: [11, 17], initRatio: [0.38, 0.34, 0.32], ellA: 0.79,  ellB: 0.79, ecy: 0,    initYoff: 0,   edgeCap: [0.057, 0.048] },\r\n    oval_bracelet: { W: 25.0, H: 18.9, single: [11, 11], stack: [13, 12], initRatio: [0.49, 0.44, 0.41], ellA: 0.843, ellB: 0.80, ecy: 0,    initYoff: 0,   edgeCap: [0.085, 0.072] },\r\n    heart:         { W: 25.0, H: 23.6, single: [11, 11], stack: [12, 15], initRatio: [0.40, 0.36, 0.34], ellA: 0.73,  ellB: 0.77, ecy: 1.04, initYoff: 1.7, edgeCap: [0.065, 0.055] }\r\n  };\r\n  /* ---- Tunable FACE placement on the stage (the only hand-set numbers). longPct = the\r\n          locket's long dimension as % of the square preview; cx/cy = face center %; scale =\r\n          global engraving size nudge; edgeY/initY = small %-nudges. Drag panel edits these. ---- */\r\n  var TUNE_DEFAULTS = {\r\n    oval_necklace: { longPct: 78, cx: 50, cy: 53, scale: 1, edgeY: 0, initY: 0 },\r\n    oval_bracelet: { longPct: 84, cx: 50, cy: 52, scale: 1, edgeY: 0, initY: 0 },\r\n    heart:         { longPct: 80, cx: 50, cy: 52, scale: 1, edgeY: 0, initY: 0 }\r\n  };\r\n  // Per-variant TUNE overrides, keyed by variant title/color (e.g. \"Gold/Aurora\"). Filled from tuning.\r\n  var GEO_OVERRIDES = {};\r\n\r\n  var state = { layout: 'single', single: '', stacked: [''], initial: '', names: [''] };\r\n\r\n  var root, inputMount, hiddenMount, previewImg, previewStage, previewCanvas, shapeMount;\r\n  var variantMap = {};        // variantId -> { img, key }\r\n  var runtimeGeo = {};        // variantKey -> live geo object (default+override, mutated by panel)\r\n\r\n  /* ===================== variant / geometry ===================== */\r\n  function currentVariantId() {\r\n    var sel = document.querySelector('[name=\"id\"]');\r\n    return sel ? String(sel.value) : null;\r\n  }\r\n  function currentVariantKey() {\r\n    var vid = currentVariantId();\r\n    return (vid && variantMap[vid] && variantMap[vid].key) || '_default';\r\n  }\r\n  function productType() {\r\n    return (root && root.getAttribute('data-locket-product-type')) || 'oval_necklace';\r\n  }\r\n  // geo() = the (tunable) FACE placement for the current variant (default + per-variant override)\r\n  function geo() {\r\n    var k = currentVariantKey();\r\n    if (!runtimeGeo[k]) {\r\n      var base = TUNE_DEFAULTS[productType()] || TUNE_DEFAULTS.oval_necklace;\r\n      var ov = GEO_OVERRIDES[k] || {};\r\n      var merged = {};\r\n      for (var p in base) { if (base.hasOwnProperty(p)) merged[p] = base[p]; }\r\n      for (var q in ov) { if (ov.hasOwnProperty(q)) merged[q] = ov[q]; }\r\n      runtimeGeo[k] = merged;\r\n    }\r\n    return runtimeGeo[k];\r\n  }\r\n\r\n  /* ---- text measurement (canvas) \u2014 used to fit/scale text exactly like FreeType does ---- */\r\n  var _mctx;\r\n  function measure(text, family, px) {\r\n    if (!_mctx) _mctx = document.createElement('canvas').getContext('2d');\r\n    _mctx.font = px + 'px ' + family;\r\n    var m = _mctx.measureText(text || 'H');\r\n    var asc = m.actualBoundingBoxAscent, desc = m.actualBoundingBoxDescent;\r\n    if (typeof asc !== 'number') asc = px * 0.7;\r\n    if (typeof desc !== 'number') desc = px * 0.2;\r\n    return { w: m.width, asc: asc, desc: desc };\r\n  }\r\n  function capRatio(family) { return Math.max(0.4, measure('H', family, 100).asc / 100); }\r\n\r\n  /* ---- map the Python's mm artboard (origin = locket center, y-up) onto the stage ---- */\r\n  function face() {\r\n    var pt = productType();\r\n    var L = LOCKET[pt] || LOCKET.oval_necklace;\r\n    var T = geo();\r\n    var S = T.longPct / Math.max(L.W, L.H);   // % of stage per mm (uniform; stage is square)\r\n    var sw = (previewStage && previewStage.clientWidth) || 360;\r\n    return {\r\n      L: L, T: T, S: S, sw: sw,\r\n      faceW: L.W * S, faceH: L.H * S,         // % of stage\r\n      cx: T.cx, cy: T.cy,\r\n      mmToPx: function (mm) { return mm * S * sw / 100; },\r\n      // (mx,my) in mm -> stage % { left, top }\r\n      pt2: function (mx, my) { return { left: T.cx + mx * S, top: T.cy - my * S }; }\r\n    };\r\n  }\r\n\r\n  /* ===================== font ===================== */\r\n  function activeFont() {\r\n    var btn = document.querySelector('.font-button.active');\r\n    return (btn && btn.getAttribute('data-font')) || 'Alga';\r\n  }\r\n\r\n  /* ===================== backdrop (drawn shape vs photo) ===================== */\r\n  function variantTint() {\r\n    var k = (currentVariantKey() || '').toLowerCase();\r\n    if (k.indexOf('rose') > -1) return 'rose';\r\n    if (k.indexOf('silver') > -1 || k.indexOf('white gold') > -1 || k.indexOf('platinum') > -1 || k.indexOf('steel') > -1) return 'silver';\r\n    return 'gold';\r\n  }\r\n  var TINTS = {\r\n    gold:   { a: '#f4e3b0', b: '#d6ab63', c: '#9c7330', stroke: '#856326', hi: '#fff7e0' },\r\n    silver: { a: '#e6e9ec', b: '#969da6', c: '#646b73', stroke: '#52575d', hi: '#ffffff' },\r\n    rose:   { a: '#f7d9cb', b: '#e2a98f', c: '#b87959', stroke: '#9c6347', hi: '#fff1ea' }\r\n  };\r\n  function shapeSvg() {\r\n    var t = TINTS[variantTint()] || TINTS.gold;\r\n    var pt = productType();\r\n    var F = face();\r\n    var cx = F.cx, cy = F.cy, hw = F.faceW / 2, hh = F.faceH / 2;\r\n    var body, hiEl = '';\r\n    if (pt === 'heart') {\r\n      // plump heart path (getBBox x13..87, y11..80 => W74 H69, centre 50,45.5) scaled to the face box\r\n      var sx = F.faceW / 74, sy = F.faceH / 69, tx = cx - 50 * sx, ty = cy - 45.5 * sy;\r\n      var sw = (1.2 / ((sx + sy) / 2)).toFixed(2);\r\n      body = '<g transform=\"translate(' + tx.toFixed(2) + ',' + ty.toFixed(2) + ') scale(' + sx.toFixed(3) + ',' + sy.toFixed(3) + ')\">'\r\n        + '<path d=\"M50 80 C 37 73, 13 58, 13 34 C 13 19, 23 11, 34 11 C 42 11, 48 15, 50 23 C 52 15, 58 11, 66 11 C 77 11, 87 19, 87 34 C 87 58, 63 73, 50 80 Z\" fill=\"url(#lkeg)\" stroke=\"' + t.stroke + '\" stroke-width=\"' + sw + '\"/></g>';\r\n    } else {\r\n      body = '<ellipse cx=\"' + cx + '\" cy=\"' + cy + '\" rx=\"' + hw.toFixed(2) + '\" ry=\"' + hh.toFixed(2) + '\" fill=\"url(#lkeg)\" stroke=\"' + t.stroke + '\" stroke-width=\"1.2\"/>';\r\n      hiEl = '<ellipse cx=\"' + cx + '\" cy=\"' + (cy - 1).toFixed(2) + '\" rx=\"' + Math.max(0, hw - 6).toFixed(2) + '\" ry=\"' + Math.max(0, hh - 7).toFixed(2) + '\" fill=\"' + t.hi + '\" opacity=\"0.10\"/>';\r\n    }\r\n    return '<svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\" xmlns=\"http://www.w3.org/2000/svg\">'\r\n      + '<defs><radialGradient id=\"lkeg\" cx=\"38%\" cy=\"32%\" r=\"80%\">'\r\n      + '<stop offset=\"0%\" stop-color=\"' + t.a + '\"/><stop offset=\"55%\" stop-color=\"' + t.b + '\"/><stop offset=\"100%\" stop-color=\"' + t.c + '\"/>'\r\n      + '</radialGradient></defs>' + body + hiEl + '</svg>';\r\n  }\r\n  // Choose photo (only if a real close-up metafield image exists) else the drawn shape.\r\n  function applyBackdrop() {\r\n    var vid = currentVariantId();\r\n    var entry = vid && variantMap[vid];\r\n    var url = entry && entry.img;\r\n    if (url) {\r\n      root.classList.add('lke-mode-photo'); root.classList.remove('lke-mode-shape');\r\n      if (previewImg && previewImg.getAttribute('src') !== url) {\r\n        previewImg.addEventListener('load', renderPreview, { once: true });\r\n        previewImg.setAttribute('src', url);\r\n      }\r\n    } else {\r\n      root.classList.add('lke-mode-shape'); root.classList.remove('lke-mode-photo');\r\n      if (shapeMount) shapeMount.innerHTML = shapeSvg();\r\n    }\r\n  }\r\n\r\n  /* ===================== helpers ===================== */\r\n  function el(tag, cls, attrs) {\r\n    var n = document.createElement(tag);\r\n    if (cls) n.className = cls;\r\n    if (attrs) { for (var k in attrs) { if (attrs.hasOwnProperty(k)) n.setAttribute(k, attrs[k]); } }\r\n    return n;\r\n  }\r\n  function sanitize(v) { return (v || '').replace(/[^\\p{L}\\p{N}\\p{P}\\p{Z}]/gu, ''); }\r\n\r\n  function makeInput(backend, label, maxLen, value, onInput, onRemove) {\r\n    var c = el('div', 'symbol-input-container no-override locket-engrave-field', { 'data-char-limit': maxLen, 'data-name': backend });\r\n    var lab = el('label', 'symbol-dropdown-label'); lab.textContent = label;\r\n    var inner = el('div', 'symbol-input-inner');\r\n    var input = el('input', 'symbol-input', { type: 'text', maxlength: maxLen, value: value || '' });\r\n    input.style.setProperty('font-family', activeFont(), 'important');\r\n    var count = el('span', 'symbol-input-count');\r\n    function upd() { count.textContent = (input.value || '').length + '/' + maxLen; }\r\n    input.addEventListener('input', function () { input.value = sanitize(input.value); upd(); onInput(input.value); });\r\n    upd();\r\n    inner.appendChild(input); inner.appendChild(count);\r\n    if (onRemove) {\r\n      var rm = el('button', 'locket-engrave-remove-x', { type: 'button', 'aria-label': 'Remove ' + label, title: 'Remove' });\r\n      rm.innerHTML = '&times;';\r\n      rm.addEventListener('click', onRemove);\r\n      inner.appendChild(rm);\r\n    }\r\n    c.appendChild(lab); c.appendChild(inner);\r\n    return c;\r\n  }\r\n\r\n  function setHidden(backend, value) {\r\n    var id = 'lke-hidden-' + backend.replace(/[^a-z0-9]/gi, '');\r\n    var c = document.getElementById(id);\r\n    if (!c) {\r\n      c = el('div', 'symbol-input-container locket-engrave-hidden', { 'data-name': backend, id: id });\r\n      c.style.display = 'none';\r\n      c.appendChild(el('input', 'symbol-input', { type: 'hidden' }));\r\n      hiddenMount.appendChild(c);\r\n    }\r\n    c.querySelector('.symbol-input').value = value;\r\n  }\r\n  function styleLabel(key) { for (var i = 0; i < STYLES.length; i++) { if (STYLES[i].key === key) return STYLES[i].label; } return key; }\r\n  function syncHidden() {\r\n    setHidden('_engraving_layout', state.layout);\r\n    setHidden('Engraving Style', styleLabel(state.layout));\r\n    setHidden('_locket_product_type', productType());\r\n  }\r\n\r\n  /* ===================== inputs ===================== */\r\n  function renderInputs() {\r\n    inputMount.innerHTML = '';\r\n    if (state.layout === 'single') {\r\n      inputMount.appendChild(makeInput('Line 1', 'Your text', SINGLE_MAXLEN, state.single, function (v) { state.single = v; renderPreview(); }));\r\n    } else if (state.layout === 'stacked') {\r\n      appendNameCount(state.stacked.length);\r\n      state.stacked.forEach(function (val, i) {\r\n        inputMount.appendChild(makeInput('Line ' + (i + 1), 'Name ' + (i + 1), NAME_MAXLEN, val,\r\n          function (v) { state.stacked[i] = v; renderPreview(); },\r\n          state.stacked.length > 1 ? function () { state.stacked.splice(i, 1); renderInputs(); renderPreview(); } : null));\r\n      });\r\n      appendNameAdder(state.stacked.length >= MAX_NAMES, function () { state.stacked.push(''); renderInputs(); renderPreview(); });\r\n    } else {\r\n      inputMount.appendChild(makeInput('Initial', 'Center Initial', INITIAL_MAXLEN, state.initial, function (v) { state.initial = v; renderPreview(); }));\r\n      appendNameCount(state.names.length);\r\n      state.names.forEach(function (val, i) {\r\n        inputMount.appendChild(makeInput('Name ' + (i + 1), 'Name ' + (i + 1), NAME_MAXLEN, val,\r\n          function (v) { state.names[i] = v; renderPreview(); },\r\n          state.names.length > 1 ? function () { state.names.splice(i, 1); renderInputs(); renderPreview(); } : null));\r\n      });\r\n      appendNameAdder(state.names.length >= MAX_NAMES, function () { state.names.push(''); renderInputs(); renderPreview(); });\r\n    }\r\n    var f = activeFont();\r\n    inputMount.querySelectorAll('.symbol-input').forEach(function (i) { i.style.setProperty('font-family', f, 'important'); });\r\n  }\r\n\r\n  function appendNameCount(n) {\r\n    var c = el('div', 'locket-engrave-name-count');\r\n    c.textContent = 'Add up to ' + MAX_NAMES + ' names \u00B7 ' + n + ' of ' + MAX_NAMES;\r\n    inputMount.appendChild(c);\r\n  }\r\n  function appendNameAdder(disabled, onAdd) {\r\n    var add = el('button', 'locket-engrave-add', { type: 'button' });\r\n    add.textContent = '+ Add a name';\r\n    add.disabled = !!disabled;\r\n    add.addEventListener('click', onAdd);\r\n    inputMount.appendChild(add);\r\n  }\r\n\r\n  /* ===================== style selector ===================== */\r\n  // Icon outline follows the actual locket shape (oval for necklace/bracelet, heart for heart),\r\n  // with the style depicted inside: single line / stacked lines / centre initial + edge \"names\".\r\n  function styleIcon(key) {\r\n    var pt = productType();\r\n    var L = LOCKET[pt] || LOCKET.oval_necklace;\r\n    var cx = 20, gcy = 20, rx, ry, gw, shape;\r\n\r\n    if (pt === 'heart') {\r\n      shape = '<path d=\"M20 32.5 C 10 25, 6 17.5, 11.5 13 C 15 10.2, 20 12.2, 20 16.2 C 20 12.2, 25 10.2, 28.5 13 C 34 17.5, 30 25, 20 32.5 Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/>';\r\n      rx = 8.5; ry = 8.5; gw = 6.4; gcy = 21;   // heart's visual centre sits below the cleft (~y21), not 18\r\n    } else {\r\n      var lr = 14.3, sr = lr * Math.min(L.W, L.H) / Math.max(L.W, L.H);\r\n      if (L.H >= L.W) { rx = sr; ry = lr; } else { rx = lr; ry = sr; }\r\n      shape = '<ellipse cx=\"20\" cy=\"20\" rx=\"' + rx.toFixed(2) + '\" ry=\"' + ry.toFixed(2) + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\"/>';\r\n      gw = rx * 0.74;\r\n    }\r\n\r\n    var g = '';\r\n    if (key === 'single') {\r\n      g = '<line x1=\"' + (cx - gw).toFixed(1) + '\" y1=\"' + gcy + '\" x2=\"' + (cx + gw).toFixed(1) + '\" y2=\"' + gcy + '\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>';\r\n    } else if (key === 'stacked') {\r\n      // three centered lines of varied length \u2014 reads as stacked names and follows the tapering shape.\r\n      // On the heart, drop the group down off the cleft (and tighten a touch) so it sits centred.\r\n      var scy = gcy + (pt === 'heart' ? 2.2 : 0), sp = (pt === 'heart' ? 4.0 : 4.4);\r\n      [[-sp, 0.78], [0, 1.0], [sp, 0.6]].forEach(function (row) {\r\n        var y = scy + row[0], hw = gw * row[1];\r\n        g += '<line x1=\"' + (cx - hw).toFixed(1) + '\" y1=\"' + y.toFixed(1) + '\" x2=\"' + (cx + hw).toFixed(1) + '\" y2=\"' + y.toFixed(1) + '\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>';\r\n      });\r\n    } else { // monogram: just the centre initial inside the locket outline\r\n      // (curved names are illegible at icon size, so we keep it to the letter)\r\n      var msize = (pt === 'heart' ? 11 : 13);\r\n      g = '<text x=\"' + cx + '\" y=\"' + gcy + '\" text-anchor=\"middle\" dominant-baseline=\"central\" font-family=\"Georgia, \\'Times New Roman\\', serif\" font-size=\"' + msize + '\" fill=\"currentColor\">M</text>';\r\n    }\r\n    return shape + g;\r\n  }\r\n  function renderSelector(mount) {\r\n    var wrap = el('div', 'locket-engrave-styles', { role: 'radiogroup', 'aria-label': 'Engraving style' });\r\n    STYLES.forEach(function (s) {\r\n      var b = el('button', 'locket-engrave-style' + (s.key === state.layout ? ' is-active' : ''), { type: 'button', role: 'radio', 'data-style': s.key, 'aria-checked': s.key === state.layout ? 'true' : 'false' });\r\n      b.innerHTML = '<span class=\"locket-engrave-style-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 40 40\">' + styleIcon(s.key) + '</svg></span>'\r\n        + '<span class=\"locket-engrave-style-name\">' + s.label + '</span>';\r\n      b.addEventListener('click', function () { selectStyle(s.key); });\r\n      wrap.appendChild(b);\r\n    });\r\n    mount.appendChild(wrap);\r\n    mount.appendChild(el('div', 'locket-engrave-help'));\r\n    updateHelp();\r\n  }\r\n  function updateHelp() {\r\n    var help = root.querySelector('.locket-engrave-help');\r\n    if (!help) return;\r\n    for (var i = 0; i < STYLES.length; i++) { if (STYLES[i].key === state.layout) { help.textContent = STYLES[i].hint; return; } }\r\n  }\r\n  function selectStyle(key) {\r\n    if (state.layout === key) return;\r\n    state.layout = key;\r\n    root.querySelectorAll('.locket-engrave-style').forEach(function (b) {\r\n      var on = b.getAttribute('data-style') === key;\r\n      b.classList.toggle('is-active', on); b.setAttribute('aria-checked', on ? 'true' : 'false');\r\n    });\r\n    updateHelp();\r\n    syncHidden(); renderInputs(); renderPreview();\r\n    if (window.__lke && window.__lke._onChange) window.__lke._onChange();\r\n  }\r\n\r\n  /* ===================== curved text on a TRUE ELLIPSE (matches _add_edge_names) =====================\r\n     Places each glyph along the ellipse (semi-axes aPx,bPx) centered at the bottom, rotated to the\r\n     tangent, spaced by arc length. No global scale, so glyphs are NOT distorted. y-down canvas coords. */\r\n  function ellipseText(canvas, text, aPx, bPx, fontPx, fName, color, kerning) {\r\n    var dpr = window.devicePixelRatio || 1;\r\n    var a = aPx * dpr, b = bPx * dpr, F = fontPx * dpr;\r\n    kerning = (kerning || 0) * dpr;\r\n    var pad = F * 1.8;\r\n    var W = Math.ceil(2 * a + pad), H = Math.ceil(2 * b + pad);\r\n    canvas.width = W; canvas.height = H;\r\n    var ctx = canvas.getContext('2d');\r\n    ctx.fillStyle = color || '#f8f5ef';\r\n    ctx.font = F + 'px ' + fName;\r\n    ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\r\n    var cx = W / 2, cy = H / 2;\r\n\r\n    // arc-length table over t in [0,2pi)\r\n    var N = 2000, dt = 2 * Math.PI / N;\r\n    var cum = new Float64Array(N + 1); cum[0] = 0;\r\n    for (var i = 1; i <= N; i++) {\r\n      var tt = (i - 1) * dt, dx = -a * Math.sin(tt), dy = b * Math.cos(tt);\r\n      cum[i] = cum[i - 1] + Math.sqrt(dx * dx + dy * dy) * dt;\r\n    }\r\n    var total = cum[N];\r\n    function arcToT(s) {\r\n      s = ((s % total) + total) % total;\r\n      var lo = 0, hi = N;\r\n      while (lo < hi) { var mid = (lo + hi) >> 1; if (cum[mid] < s) lo = mid + 1; else hi = mid; }\r\n      var idx = Math.max(1, lo);\r\n      var f = (s - cum[idx - 1]) / ((cum[idx] - cum[idx - 1]) || 1);\r\n      return (idx - 1) * dt + f * dt;\r\n    }\r\n    var bottomArc = cum[Math.round((Math.PI / 2) / dt)]; // t=PI/2 -> bottom (y = cy + b)\r\n\r\n    var chars = text.split('');\r\n    var widths = chars.map(function (c) { return ctx.measureText(c).width; });\r\n    var totalW = widths.reduce(function (s, w) { return s + w; }, 0) + kerning * Math.max(0, chars.length - 1);\r\n\r\n    // read left->right along the bottom: leftmost char at the largest arc (t>PI/2), stepping down\r\n    var acc = bottomArc + totalW / 2;\r\n    for (var k = 0; k < chars.length; k++) {\r\n      var centerArc = acc - widths[k] / 2;\r\n      var t = arcToT(centerArc);\r\n      var px = cx + a * Math.cos(t), py = cy + b * Math.sin(t);\r\n      var ang = Math.atan2(b * Math.cos(t), -a * Math.sin(t)); // tangent direction (increasing t)\r\n      ctx.save();\r\n      ctx.translate(px, py);\r\n      ctx.rotate(ang - Math.PI); // upright at the bottom (t=PI/2 -> rotation 0)\r\n      ctx.fillText(chars[k], 0, 0);\r\n      ctx.restore();\r\n      acc -= widths[k] + kerning;\r\n    }\r\n  }\r\n\r\n  /* ===================== preview ===================== */\r\n  function clearStage() {\r\n    previewStage.querySelectorAll('.lke-line, .lke-initial').forEach(function (n) { n.remove(); });\r\n    var c = previewCanvas.getContext('2d');\r\n    c.clearRect(0, 0, previewCanvas.width, previewCanvas.height);\r\n    previewCanvas.style.display = 'none';\r\n  }\r\n  function addLine(text, leftPct, topPct, fontPx, cls) {\r\n    var d = el('div', cls || 'lke-line');\r\n    d.textContent = text;\r\n    d.style.fontFamily = activeFont();\r\n    d.style.left = leftPct + '%';\r\n    d.style.top = topPct + '%';\r\n    d.style.fontSize = fontPx + 'px';\r\n    previewStage.appendChild(d);\r\n    return d;\r\n  }\r\n  // Draw one glyph/word on its own canvas, centred by its *ink* bounding box (not the layout box) so\r\n  // fonts with big/asymmetric side-bearings or swashes (e.g. Magnum) still read centred on the locket.\r\n  function addCanvasText(text, leftPct, topPct, fontPx, weight) {\r\n    var dpr = window.devicePixelRatio || 1;\r\n    var fontStr = (weight ? weight + ' ' : '') + (fontPx * dpr) + 'px ' + activeFont();\r\n    var c = el('canvas', 'lke-line');\r\n    var ctx = c.getContext('2d');\r\n    ctx.font = fontStr; ctx.textAlign = 'left'; ctx.textBaseline = 'alphabetic';\r\n    var m = ctx.measureText(text);\r\n    var lft = m.actualBoundingBoxLeft, rgt = m.actualBoundingBoxRight;\r\n    var asc = m.actualBoundingBoxAscent, dsc = m.actualBoundingBoxDescent;\r\n    var pad = Math.ceil(fontPx * dpr * 0.14);\r\n    var W = Math.max(1, Math.ceil(lft + rgt + pad * 2)), H = Math.max(1, Math.ceil(asc + dsc + pad * 2));\r\n    c.width = W; c.height = H;\r\n    ctx.font = fontStr; ctx.textAlign = 'left'; ctx.textBaseline = 'alphabetic';\r\n    ctx.fillStyle = '#f8f5ef';\r\n    ctx.fillText(text, pad + lft, pad + asc);   // ink top-left at (pad,pad) => ink centred in the canvas\r\n    c.style.cssText = 'position:absolute;left:' + leftPct + '%;top:' + topPct + '%;width:' + (W / dpr) +\r\n      'px;height:' + (H / dpr) + 'px;transform:translate(-50%,-50%);pointer-events:none;z-index:6;';\r\n    previewStage.appendChild(c);\r\n    return c;\r\n  }\r\n\r\n  function renderPreview() {\r\n    if (!previewStage) return;\r\n    clearStage();\r\n    var F = face(), L = F.L, T = F.T, f = activeFont();\r\n    var nn = (state.names || []).filter(function (n) { return n && n.trim(); }).length;\r\n\r\n    if (state.layout === 'single') {\r\n      // generate_locket_single_line_dxf: scale text to fill the 11x11 box (fit larger dim), centered.\r\n      var txt = state.single;\r\n      if (txt) {\r\n        var boxW = F.mmToPx(L.single[0]), boxH = F.mmToPx(L.single[1]);\r\n        var m = measure(txt, f, 100), th = m.asc + m.desc;\r\n        var s = Math.min(boxW / Math.max(1, m.w), boxH / Math.max(1, th));\r\n        addCanvasText(txt, T.cx, T.cy, 100 * s * T.scale);\r\n      }\r\n\r\n    } else if (state.layout === 'stacked') {\r\n      // stacked names: line pitch is the DXF-faithful 1.35*cap, but never tighter than the actual\r\n      // glyph height (asc+desc, incl. script flourishes) + a small gap, so lines never overlap.\r\n      var names = state.stacked.filter(function (n) { return n && n.trim(); });\r\n      if (names.length) {\r\n        var bw = F.mmToPx(L.stack[0]), bh = F.mmToPx(L.stack[1]);\r\n        var capHRatio = measure('H', f, 100).asc / 100;   // NB: don't shadow the module-level capRatio() fn\r\n        var fullRatio = capHRatio, maxW = 1;\r\n        names.forEach(function (n) {\r\n          var m = measure(n, f, 100);\r\n          fullRatio = Math.max(fullRatio, (m.asc + m.desc) / 100);\r\n          maxW = Math.max(maxW, m.w);\r\n        });\r\n        var effN = Math.max(2, names.length);\r\n        var pitchRatio = Math.max(capHRatio * LINE_SPACING_MULT, fullRatio * 1.06);   // 6% gap floor\r\n        var fontH = bh / ((effN - 1) * pitchRatio + fullRatio);                       // fit the stack in the box\r\n        var fontW = 100 * (bw / maxW);\r\n        var fontPx = Math.min(fontH, fontW) * T.scale;\r\n        var lineH = fontPx * pitchRatio;\r\n        var cyPx = T.cy * F.sw / 100;\r\n        if (productType() === 'heart' && names.length > 2) {\r\n          // the heart tapers to a point, so a tall stack centred on the geometric centre reads\r\n          // top-heavy (the empty lower taper looks bigger than the equal gap in the wide lobes).\r\n          // Bias it down, scaling with the name count so short stacks stay centred.\r\n          cyPx += (names.length - 2) * 0.009 * F.sw;\r\n        }\r\n        names.forEach(function (n, i) {\r\n          var centerPx = cyPx + (i - (names.length - 1) / 2) * lineH;\r\n          addLine(n, T.cx, centerPx / F.sw * 100, fontPx);   // DOM: keep stacked baselines aligned across names\r\n        });\r\n      }\r\n\r\n    } else { // monogram \u2014 generate_locket_dxf: center initial + edge names on the 0.79 ellipse bottom\r\n      if (state.initial) {\r\n        var idx = nn <= 2 ? 0 : (nn <= 4 ? 1 : 2);\r\n        var targetPx = F.mmToPx(Math.min(L.W, L.H) * L.initRatio[idx]); // desired glyph height\r\n        var gm = measure(state.initial, f, 100), ghRatio = (gm.asc + gm.desc) / 100;\r\n        var iFontPx = targetPx / Math.max(0.4, ghRatio) * T.scale;\r\n        var ip = F.pt2(0, L.initYoff);\r\n        addCanvasText(state.initial, ip.left, ip.top + T.initY, iFontPx, '500');\r\n      }\r\n      var edge = state.names.filter(function (n) { return n && n.trim(); }).join('   ');\r\n      if (edge) {\r\n        previewCanvas.style.display = 'block';\r\n        var aPx = F.mmToPx((L.W / 2) * L.ellA);   // edge ellipse semi-axis x (mm->px)\r\n        var bPx = F.mmToPx((L.H / 2) * L.ellB);   // semi-axis y\r\n        var capPx = F.mmToPx(L.H * L.edgeCap[nn >= 5 ? 1 : 0]);\r\n        var eFontPx = capPx / capRatio(f) * T.scale;\r\n        // true-ellipse text \u2014 undistorted glyphs along the actual edge ellipse, centered at the bottom\r\n        ellipseText(previewCanvas, edge, aPx, bPx, eFontPx, f, '#f8f5ef', 0);\r\n        var dpr = window.devicePixelRatio || 1;\r\n        var ec = F.pt2(0, L.ecy);\r\n        previewCanvas.style.width = (previewCanvas.width / dpr) + 'px';\r\n        previewCanvas.style.height = (previewCanvas.height / dpr) + 'px';\r\n        previewCanvas.style.left = ec.left + '%';\r\n        previewCanvas.style.top = (ec.top + T.edgeY) + '%';\r\n        previewCanvas.style.transform = 'translate(-50%, -50%)';\r\n      }\r\n    }\r\n    if (window.__lke && window.__lke._afterRender) window.__lke._afterRender();\r\n  }\r\n\r\n  /* ===================== full 3-step configurator =====================\r\n     The redesign wraps the metal picker, engraving controls and photo upload into three\r\n     numbered step cards with a sticky Add-to-Cart bar. The metal/colour selector, font\r\n     selector and photo upload are theme-managed elements rendered elsewhere in the form;\r\n     we RELOCATE the live DOM nodes (keeping their event handlers + the ATC inside <form>)\r\n     into our cards and restyle them via locket-engraving.css (loaded only on this PDP). */\r\n  function makeStepCard(num, title, sub, optional) {\r\n    var card = el('div', 'lke-card lke-step-card');\r\n    var head = el('div', 'lke-step-head');\r\n    var n = el('span', 'lke-step-num'); n.textContent = num;\r\n    var titles = el('span', 'lke-step-titles');\r\n    var t = el('span', 'lke-step-title'); t.textContent = title;\r\n    var s = el('span', 'lke-step-sub'); s.textContent = sub;\r\n    titles.appendChild(t); titles.appendChild(s);\r\n    head.appendChild(n); head.appendChild(titles);\r\n    if (optional) { var b = el('span', 'lke-step-optional'); b.textContent = 'Optional'; head.appendChild(b); }\r\n    card.appendChild(head);\r\n    var body = el('div', 'lke-step-body');\r\n    card.appendChild(body);\r\n    card._body = body;\r\n    return card;\r\n  }\r\n\r\n  function buildConfigurator() {\r\n    if (!root || root.dataset.lkeConfig === '1') return;\r\n    var step2 = root.querySelector('.lke-card');           // the engrave card from the liquid\r\n    if (!step2) return;\r\n    step2.classList.add('lke-step-card');\r\n\r\n    // Step 1 \u2014 Choose your metal: relocate the colour/variant selector.\r\n    var color = document.querySelector('.variant-wrapper--button');\r\n    if (color) {\r\n      var step1 = makeStepCard('1', 'Choose your metal', 'Finish & semi-precious bead');\r\n      step1._body.appendChild(color);\r\n      root.insertBefore(step1, step2);\r\n    }\r\n\r\n    // Step 2 \u2014 fold the theme font selector in under our own \"Engraving font\" header.\r\n    var fontField = document.querySelector('.custom-ornament-field');\r\n    if (fontField) {\r\n      var fhead = el('div', 'lke-font-head');\r\n      var flab = el('span', 'lke-font-label'); flab.textContent = 'Engraving font';\r\n      fhead.appendChild(flab);\r\n      step2.appendChild(fhead);\r\n      step2.appendChild(fontField);\r\n    }\r\n\r\n    // Step 3 \u2014 Add a photo inside: relocate the photo upload control + match the design's\r\n    // \"Upload a photo\" copy, the trailing \"+\", and the explanatory note below the dropzone.\r\n    var photoBtn = document.getElementById('upload-btn-text');\r\n    var photo = photoBtn && photoBtn.closest('.upload');\r\n    if (photo) {\r\n      var step3 = makeStepCard('3', 'Add a photo inside', 'Sits within the locket');\r\n      if (photoBtn) photoBtn.textContent = 'Upload a photo';\r\n      step3._body.appendChild(photo);\r\n      var note = el('p', 'lke-photo-note');\r\n      note.textContent = 'The photo prints on the inner disc, hidden until you open the locket. Prefer to send it later? You can email it after checkout.';\r\n      step3._body.appendChild(note);\r\n      var lp = root.querySelector('.lke-livepreview-label');\r\n      root.insertBefore(step3, lp);\r\n    }\r\n\r\n    buildStickyBar();\r\n    root.dataset.lkeConfig = '1';\r\n  }\r\n\r\n  function buildStickyBar() {\r\n    var form = document.querySelector('.add-to-cart-form');\r\n    var atc = form && form.querySelector('.add-to-cart-btn');\r\n    if (!form || !atc || root.querySelector('.lke-inline-atc')) return;\r\n\r\n    // 1) Move the REAL Add-to-Cart button inline, just above the live preview (still in <form>).\r\n    var inlineWrap = el('div', 'lke-inline-atc');\r\n    inlineWrap.appendChild(atc);\r\n    var anchor = root.querySelector('.lke-livepreview-label') || root.querySelector('.locket-engrave-stage');\r\n    root.insertBefore(inlineWrap, anchor);\r\n\r\n    // 2) Sticky bar = a proxy button that just clicks the real one (kept as type=button so it\r\n    //    doesn't double-submit). The price stays under the product title.\r\n    var bar = el('div', 'lke-sticky-atc');\r\n    var proxy = el('button', 'lke-sticky-proxy', { type: 'button' });\r\n    var labelOf = function () { return (atc.textContent || 'Add to cart').trim(); };\r\n    proxy.textContent = labelOf();\r\n    proxy.addEventListener('click', function () { atc.click(); });\r\n    bar.appendChild(proxy);\r\n    form.appendChild(bar);\r\n    document.body.classList.add('lke-has-sticky');\r\n\r\n    // 3) Show the sticky bar only while the inline button is scrolled out of view.\r\n    //    On PDP variant B it additionally waits until SOMETHING is personalized\r\n    //    (any engraving line or a real photo) \u2014 a premature sticky invites\r\n    //    un-personalized orders. Photo alone stays optional here (the step-3\r\n    //    note says it can be emailed after checkout). A keeps the old behavior.\r\n    function personalizedB() {\r\n      try {\r\n        if (!window.__pdpAB || window.__pdpAB.variant !== 'B') return true;\r\n      } catch (e) { return true; }\r\n      var texts = document.querySelectorAll('.product-single__form .symbol-input, .product-single__form .custom-ornament-field.input input[type=\"text\"], .product-single__form #input-text');\r\n      for (var i = 0; i < texts.length; i++) { if (texts[i].offsetParent && (texts[i].value || '').trim()) return true; }\r\n      var comps = document.querySelectorAll('.symbol-dropdown-parent .active-character');\r\n      for (var j = 0; j < comps.length; j++) { if ((comps[j].textContent || '').trim()) return true; }\r\n      var up = document.getElementById('upload-preview');\r\n      if (up) { var s = up.getAttribute('src') || ''; if (s && s.indexOf('data:image/svg') < 0) return true; }\r\n      return false;\r\n    }\r\n    if ('IntersectionObserver' in window) {\r\n      var outOfView = false;\r\n      var syncBar = function () {\r\n        bar.classList.toggle('lke-sticky-show', outOfView && personalizedB());\r\n        proxy.textContent = labelOf();\r\n        proxy.disabled = !!atc.disabled;\r\n      };\r\n      new IntersectionObserver(function (entries) {\r\n        outOfView = !entries[0].isIntersecting;\r\n        syncBar();\r\n      }, { threshold: 0 }).observe(inlineWrap);\r\n      document.addEventListener('input', syncBar, true);\r\n      document.addEventListener('change', syncBar, true);\r\n      setInterval(syncBar, 800);   // photo upload + symbol picks don't fire input events\r\n    } else {\r\n      bar.classList.add('lke-sticky-show');\r\n    }\r\n  }\r\n\r\n  /* ===================== step-3 photo \"added\" state =====================\r\n     The theme uploader (snippets/photo-upload-ornament.liquid) runs the chosen file through the\r\n     Pintura cropper, then sets #upload-preview.src to the cropped Cloudinary image. We mirror the\r\n     design's .drop.has state: fill the circular chip with that image, swap the label to\r\n     \"Photo added / Tap to change\", and reveal a \"Your photo set inside\" chip under the preview. */\r\n  function realPhotoSrc(img) {\r\n    var s = img && img.getAttribute('src');\r\n    if (!s) return '';\r\n    if (s.indexOf('data:image/svg') > -1) return '';   // broken-image fallback placeholder, not a real photo\r\n    return s;\r\n  }\r\n  function wirePhotoState() {\r\n    var preview = document.getElementById('upload-preview');\r\n    var btn = root.querySelector('.upload .btn--upload');\r\n    var label = document.getElementById('upload-btn-text');\r\n    if (!preview || !btn || !label) return;\r\n\r\n    var chip = root.querySelector('.lke-inside-chip');\r\n    if (!chip) {\r\n      chip = el('div', 'lke-inside-chip');\r\n      chip.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M20 6 9 17l-5-5\"/></svg> Your photo set inside';\r\n      var stage = root.querySelector('.locket-engrave-stage');\r\n      if (stage && stage.parentNode) stage.parentNode.insertBefore(chip, stage.nextSibling);\r\n    }\r\n\r\n    function apply() {\r\n      var src = realPhotoSrc(preview);\r\n      if (src) {\r\n        btn.style.setProperty('--lke-thumb', 'url(\"' + src + '\")');\r\n        btn.classList.add('lke-has-photo');\r\n        label.innerHTML = 'Photo added<small>Tap to change</small>';\r\n        chip.classList.add('is-on');\r\n      } else {\r\n        btn.classList.remove('lke-has-photo');\r\n        btn.style.removeProperty('--lke-thumb');\r\n        label.textContent = 'Upload a photo';\r\n        chip.classList.remove('is-on');\r\n      }\r\n    }\r\n\r\n    apply();                                   // returning with a photo already set\r\n    preview.addEventListener('load', apply);   // runs after the snippet's inline \"Change Photo\" handler, so this wins\r\n    if ('MutationObserver' in window) {\r\n      new MutationObserver(apply).observe(preview, { attributes: true, attributeFilter: ['src'] });\r\n    }\r\n  }\r\n\r\n  /* ===================== boot ===================== */\r\n  function init() {\r\n    var typeEl = document.getElementById('ornament-type');\r\n    if (!typeEl || typeEl.value !== ORNAMENT_TYPE) return;\r\n    root = document.querySelector('.locket-engrave');\r\n    if (!root || root.dataset.lkeInit === '1') return;\r\n    root.dataset.lkeInit = '1';\r\n\r\n    previewStage = root.querySelector('.locket-engrave-stage');\r\n    previewImg = root.querySelector('.locket-engrave-img');\r\n    previewCanvas = root.querySelector('.locket-engrave-canvas');\r\n    shapeMount = root.querySelector('.locket-engrave-shape');\r\n    inputMount = root.querySelector('.locket-engrave-inputs');\r\n    hiddenMount = root.querySelector('.locket-engrave-hiddenmount');\r\n\r\n    try {\r\n      var mapEl = root.querySelector('.locket-engrave-variant-images');\r\n      if (mapEl) variantMap = JSON.parse(mapEl.textContent || '{}');\r\n    } catch (e) { variantMap = {}; }\r\n\r\n    renderSelector(root.querySelector('.locket-engrave-selector'));\r\n    syncHidden();\r\n    renderInputs();\r\n    renderPreview();\r\n\r\n    applyBackdrop();\r\n    var lastVid = currentVariantId();\r\n    setInterval(function () {\r\n      var vid = currentVariantId();\r\n      if (vid !== lastVid) {\r\n        lastVid = vid;\r\n        applyBackdrop();\r\n        renderPreview();\r\n        if (window.__lke && window.__lke._onChange) window.__lke._onChange();\r\n      }\r\n    }, 400);\r\n\r\n    document.addEventListener('click', function (e) {\r\n      if (e.target && e.target.closest && e.target.closest('.font-button')) {\r\n        setTimeout(function () {\r\n          var f = activeFont();\r\n          inputMount.querySelectorAll('.symbol-input').forEach(function (i) { i.style.setProperty('font-family', f, 'important'); });\r\n          renderPreview();\r\n          // re-render once the chosen font is actually downloaded \u2014 mobile often paints with the\r\n          // fallback first, whose metrics differ, so the glyph can be mis-sized and clipped.\r\n          if (document.fonts && document.fonts.load) { document.fonts.load('40px \"' + f + '\"').then(function () { renderPreview(); }).catch(function () {}); }\r\n        }, 40);\r\n      }\r\n    });\r\n    window.addEventListener('resize', renderPreview);\r\n    if (previewImg && !previewImg.complete) previewImg.addEventListener('load', renderPreview);\r\n\r\n    // ---- always-on live preview + full configurator ----\r\n    // The redesign shows LIVE PREVIEW always visible (no toggle), so we drop the collapse and\r\n    // hide the legacy #viewPreview button (whose jQuery handler opened the stock-photo modal).\r\n    root.classList.remove('lke-preview-collapsed');\r\n    var viewBtn = document.getElementById('viewPreview');\r\n    if (viewBtn) {\r\n      document.addEventListener('click', function (e) {\r\n        if (e.target && e.target.closest && e.target.closest('#viewPreview')) { e.stopImmediatePropagation(); e.preventDefault(); }\r\n      }, true);\r\n      var vWrap = viewBtn.closest('.upload') || viewBtn;\r\n      vWrap.style.display = 'none';\r\n    }\r\n    buildConfigurator();\r\n    wirePhotoState();\r\n    renderPreview();\r\n    // mobile can paint the preview before the webfonts finish loading (fallback metrics -> wrong glyph\r\n    // size -> the letter can clip); re-render once fonts are ready so it's measured/sized correctly.\r\n    if (document.fonts && document.fonts.ready) { document.fonts.ready.then(function () { renderPreview(); }); }\r\n\r\n    // ---- debug hook (used only by the dev-only drag panel) ----\r\n    window.__lke = {\r\n      stage: previewStage,\r\n      geo: geo,\r\n      render: renderPreview,\r\n      state: state,\r\n      style: function () { return state.layout; },\r\n      selectStyle: selectStyle,\r\n      key: currentVariantKey,\r\n      productType: productType,\r\n      overrides: GEO_OVERRIDES,\r\n      allGeo: runtimeGeo,\r\n      defaults: TUNE_DEFAULTS,\r\n      locket: LOCKET,\r\n      _onChange: null,\r\n      _afterRender: null\r\n    };\r\n    document.dispatchEvent(new CustomEvent('lke:ready'));\r\n  }\r\n\r\n  if (document.readyState !== 'loading') { setTimeout(init, 0); }\r\n  else { document.addEventListener('DOMContentLoaded', init); }\r\n  setTimeout(init, 400);\r\n  setTimeout(init, 1200);\r\n})();\r\n"],
  "mappings": "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",
  "names": ["m"]
}
