{
  "version": 3,
  "sources": ["/cdn/shop/t/1/assets/necklace-preview.js?r=2"],
  "sourcesContent": ["/*\n * Live preview of a personalised name necklace, built from real letter images.\n *\n * Every letter is one photo-real PNG (yellow gold, clear stones, transparent background).\n * Metal and stone colour are re-tinted here: neutral pixels are stones, warm pixels are metal.\n * Each letter is part of the chain: the chain is soldered straight onto the letter's top-left\n * and top-right edges (no jump rings), and letters spread along the curve by name length.\n *\n *   const p = new NecklacePreview(canvas, { A: 'https://\u2026/nl-A.png', \u2026 });\n *   await p.render({ text: 'CHLOE', metal: 'gold', stone: 'blue' });\n */\n(function () {\n  // Colours sampled from reference swatches so chain, letters and swatches agree.\n  const METALS = {\n    gold:   { hi: '#f8e2b4', mid: '#e7bf80', lo: '#b98a4c', tint: [0.98, 0.80, 0.52] },\n    silver: { hi: '#f4f3f0', mid: '#d1cec8', lo: '#9c9993', tint: [0.86, 0.85, 0.83] },\n    rose:   { hi: '#fbe3d4', mid: '#f0bc9c', lo: '#c2896b', tint: [0.99, 0.77, 0.65] },\n  };\n\n  const STONES = {\n    clear:    null,\n    black:    '#34363c',\n    blue:     '#4fa6ea',\n    emerald:  '#22876f',\n    lavender: '#cdb9ee',\n    pink:     '#f0455f',\n    purple:   '#c98ae6',\n    orange:   '#ee8a28',\n    peridot:  '#a2b23a',\n    sapphire: '#15356d',\n  };\n  const RAINBOW = ['pink', 'orange', 'peridot', 'blue', 'purple', 'emerald', 'sapphire', 'lavender'];\n\n  // Canvas units. One continuous strand: down the left side, across the bottom, up the right.\n  const W = 1200, H = 1200;\n  // The necklace spans y\u2248235\u20131215 in path units; zoom it to fill the square canvas.\n  const ZOOM = 1.11, OX = 600 - 600 * ZOOM, OY = 64 - 235 * ZOOM;\n  const CHAIN_PATH = 'M 462 350 C 330 470, 222 640, 220 784 C 218 960, 380 1142, 610 1142 C 840 1142, 1005 960, 999 784 C 993 640, 880 470, 745 368';\n  const LETTER_H = 68;   // cap height of a letter on the canvas (measured on a real piece)\n  const GAP = 0.95;      // chain between two letters, as a fraction of letter height (measured on real pieces)\n\n  const hexRgb = (h) => [1, 3, 5].map((i) => parseInt(h.slice(i, i + 2), 16) / 255);\n\n  const FIRE = ['#ff9fb8', '#ffcf80', '#b9f08f', '#8fd0ff', '#cfa6ff', '#86eadb'].map(hexRgb);\n  const fleck = (x, y) => { const n = Math.sin(x * 127.1 + y * 311.7) * 43758.5453; return n - Math.floor(n); };\n\n  // Numbers each stone (connected neutral-coloured pixels) so rainbow can give every stone one colour.\n  function labelStones(d, w, h) {\n    const lab = new Int32Array(w * h);\n    const isStone = (i) => {\n      const o = i * 4;\n      if (d[o + 3] < 128) return false;\n      const mx = Math.max(d[o], d[o + 1], d[o + 2]), mn = Math.min(d[o], d[o + 1], d[o + 2]);\n      return mx > 150 && (mx - mn) / mx < 0.2; // bright + neutral: dark facet/prong edges split stones apart\n    };\n    let next = 0;\n    const stack = [];\n    for (let i = 0; i < w * h; i++) {\n      if (lab[i] || !isStone(i)) continue;\n      next++;\n      lab[i] = next;\n      stack.push(i);\n      while (stack.length) {\n        const j = stack.pop(), x = j % w;\n        for (const k of [j - 1, j + 1, j - w, j + w]) {\n          if (k < 0 || k >= w * h || lab[k] || (k === j - 1 && x === 0) || (k === j + 1 && x === w - 1)) continue;\n          if (isStone(k)) { lab[k] = next; stack.push(k); }\n        }\n      }\n    }\n    // Stones that touch merge into one blob; cut oversized blobs into stone-sized cells.\n    const area = new Int32Array(next + 1);\n    for (let i = 0; i < w * h; i++) area[lab[i]]++;\n    const cell = Math.round(h / 7.5), max = cell * cell * 1.1;\n    for (let i = 0; i < w * h; i++) {\n      const n = lab[i];\n      if (n && area[n] > max) lab[i] = next + 1 + n * 97 + ((i % w) / cell | 0) + ((i / w / cell) | 0) * 13;\n    }\n    return lab;\n  }\n\n  class NecklacePreview {\n    constructor(canvas, sources, { gap = GAP } = {}) {\n      this.gap = gap * LETTER_H;\n      this.canvas = canvas;\n      canvas.width = W;\n      canvas.height = H;\n      this.ctx = canvas.getContext('2d');\n      this.sources = sources;\n      this.images = new Map();   // char \u2192 Promise<{img, ringL, ringR}>\n      this.tinted = new Map();   // char|metal|stone \u2192 canvas\n      this.path = new Path2D(CHAIN_PATH);\n      const svgPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n      svgPath.setAttribute('d', CHAIN_PATH);\n      this.measure = svgPath;\n      this.length = svgPath.getTotalLength();\n      this.token = 0;\n    }\n\n    // Loads a letter and finds where the chain attaches: the outermost opaque pixels in its top band.\n    #load(ch) {\n      if (this.images.has(ch)) return this.images.get(ch);\n      const url = this.sources[ch];\n      const p = !url ? Promise.resolve(null) : new Promise((resolve) => {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () => {\n          const c = document.createElement('canvas');\n          c.width = img.naturalWidth; c.height = img.naturalHeight;\n          const x = c.getContext('2d', { willReadFrequently: true });\n          x.drawImage(img, 0, 0);\n          const { data } = x.getImageData(0, 0, c.width, c.height);\n          const band = Math.max(4, Math.round(c.height * 0.1));\n          let top = 0;\n          rows: for (; top < c.height; top++) for (let i = 0; i < c.width; i++) if (data[(top * c.width + i) * 4 + 3] > 128) break rows;\n          let l = c.width, r = 0;\n          for (let y = top; y < Math.min(c.height, top + band); y++) {\n            for (let i = 0; i < c.width; i++) if (data[(y * c.width + i) * 4 + 3] > 128) { if (i < l) l = i; if (i > r) r = i; }\n          }\n          resolve({ img: c, ringL: l / c.width, ringR: r / c.width, top: top / c.height, stones: labelStones(data, c.width, c.height) });\n        };\n        img.onerror = () => resolve(null);\n        img.src = url;\n      });\n      this.images.set(ch, p);\n      return p;\n    }\n\n    // Re-tints one letter for a metal + stone colour; cached.\n    #tint(ch, letter, metal, stone) {\n      const key = `${ch}|${metal}|${stone}`;\n      if (this.tinted.has(key)) return this.tinted.get(key);\n      const src = letter.img;\n      const c = document.createElement('canvas');\n      c.width = src.width; c.height = src.height;\n      const x = c.getContext('2d', { willReadFrequently: true });\n      x.drawImage(src, 0, 0);\n      const mt = METALS[metal].tint;\n      const fixed = stone === 'rainbow' ? null : STONES[stone] ? hexRgb(STONES[stone]) : null;\n      {\n        const id = x.getImageData(0, 0, c.width, c.height);\n        const d = id.data;\n        for (let o = 0; o < d.length; o += 4) {\n          if (!d[o + 3]) continue;\n          const r = d[o] / 255, g = d[o + 1] / 255, b = d[o + 2] / 255;\n          const mx = Math.max(r, g, b), mn = Math.min(r, g, b);\n          const sat = mx ? (mx - mn) / mx : 0;\n          const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n          const ws = Math.max(0, Math.min(1, (0.32 - sat) / 0.14)); // 1 = stone, 0 = metal\n          let R = r, G = g, B = b;\n          if (mt && ws < 1) {\n            const l = Math.min(1, lum * 1.22), hi = Math.pow(l, 3.2);\n            R = R * ws + (mt[0] * l * (1 - hi) + hi) * (1 - ws);\n            G = G * ws + (mt[1] * l * (1 - hi) + hi) * (1 - ws);\n            B = B * ws + (mt[2] * l * (1 - hi) + hi) * (1 - ws);\n          }\n          let sc = fixed;\n          if (stone === 'rainbow') {\n            const i = o / 4, L = letter.stones, w = c.width;\n            const n = L[i] || L[i - 1] || L[i + 1] || L[i - w] || L[i + w] || L[i - 2] || L[i + 2] || L[i - 2 * w] || L[i + 2 * w];\n            if (n) sc = hexRgb(STONES[RAINBOW[(n * 5) % RAINBOW.length]]);\n          }\n          if (ws > 0) {\n            // Livelier stones: lift and stretch the facet contrast, then add a little dispersion\n            // (\"fire\") \u2014 small pastel flecks like light splitting inside a real stone.\n            const L = Math.min(1, Math.max(0, (lum - 0.2) * 1.3 + 0.14));\n            const px = (o / 4) % c.width, py = (o / 4 / c.width) | 0;\n            const h = fleck(px / 9 | 0, py / 9 | 0); // ~9px source \u2248 2px on screen once the letter is scaled down\n            let sR, sG, sB;\n            if (sc) {\n              const hi = Math.pow(L, 5) * 0.9; // brightest facets keep their white sparkle\n              const k = 1.3;\n              sR = Math.min(1, sc[0] * L * k) * (1 - hi) + hi;\n              sG = Math.min(1, sc[1] * L * k) * (1 - hi) + hi;\n              sB = Math.min(1, sc[2] * L * k) * (1 - hi) + hi;\n            } else {\n              sR = sG = sB = L;\n              sB = Math.min(1, sB * 1.03); // a hint of ice-blue, like a white diamond\n            }\n            if (h < (sc ? 0.08 : 0.3) && L > 0.35) {\n              const f = FIRE[(h * 997 | 0) % FIRE.length], a = sc ? 0.35 : 0.6;\n              sR = sR * (1 - a) + f[0] * a; sG = sG * (1 - a) + f[1] * a; sB = sB * (1 - a) + f[2] * a;\n            }\n            R = R * (1 - ws) + sR * ws;\n            G = G * (1 - ws) + sG * ws;\n            B = B * (1 - ws) + sB * ws;\n          }\n          d[o] = R * 255; d[o + 1] = G * 255; d[o + 2] = B * 255;\n        }\n        x.putImageData(id, 0, 0);\n      }\n      this.tinted.set(key, c);\n      return c;\n    }\n\n    async render({ text, metal = 'gold', stone = 'clear' }) {\n      const token = ++this.token;\n      metal = METALS[metal] ? metal : 'gold';\n      stone = stone === 'rainbow' || stone in STONES ? stone : 'clear';\n      const chars = Array.from(text || '');\n      const letters = await Promise.all(chars.map((ch) => (ch === ' ' ? null : this.#load(ch))));\n      if (token !== this.token) return; // a newer render started while images loaded\n\n      // Lay the letters out centred on the bottom of the strand.\n      const items = chars.map((ch, i) => {\n        const L = letters[i];\n        if (!L) return { ch, w: LETTER_H * 0.45, space: true };\n        const scale = LETTER_H / L.img.height;\n        return { ch, L, w: L.img.width * scale, h: LETTER_H, scale };\n      });\n      const total = items.reduce((s, it) => s + it.w, 0) + this.gap * Math.max(0, items.length - 1);\n      let s = this.length / 2 - total / 2;\n      const gaps = []; // arc-length spans where chain is visible inside the letter block\n      let chainFrom = 0;\n      const placed = [];\n      for (const it of items) {\n        const a = s, b = s + it.w;\n        if (!it.space) {\n          const pa = this.measure.getPointAtLength(Math.max(0, a + it.w * it.L.ringL));\n          const pb = this.measure.getPointAtLength(Math.min(this.length, a + it.w * it.L.ringR));\n          placed.push({ it, pa, pb });\n          gaps.push([chainFrom, a + it.w * it.L.ringL]);\n          chainFrom = a + it.w * it.L.ringR;\n        }\n        s = b + this.gap;\n      }\n      gaps.push([chainFrom, this.length]);\n\n      const ctx = this.ctx;\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.clearRect(0, 0, W, H);\n      ctx.setTransform(ZOOM, 0, 0, ZOOM, OX, OY);\n      const m = METALS[metal];\n      // Soft contact shadow under the metal, as if lying on a white surface.\n      ctx.shadowColor = 'rgba(0, 0, 0, 0.22)';\n      ctx.shadowBlur = 3;\n      ctx.shadowOffsetY = 2;\n      for (const [a, b] of gaps) this.#chain(a, b, m);\n      this.#clasp(m);\n\n      for (const { it, pa, pb } of placed) {\n        const img = this.#tint(it.ch, it.L, metal, stone);\n        const ang = Math.atan2(pb.y - pa.y, pb.x - pa.x);\n        const span = Math.hypot(pb.x - pa.x, pb.y - pa.y);\n        const ringSpan = (it.L.ringR - it.L.ringL) * it.w || 1;\n        const k = Math.min(1.15, Math.max(0.85, span / ringSpan)); // keep both attach points on the chain\n        ctx.save();\n        ctx.translate(pa.x, pa.y);\n        ctx.rotate(ang);\n        ctx.scale(k, 1);\n        ctx.shadowColor = 'rgba(0, 0, 0, 0.25)';\n        ctx.shadowBlur = 7;\n        ctx.shadowOffsetY = 4;\n        ctx.drawImage(img, -it.L.ringL * it.w, -2 - it.L.top * it.h, it.w, it.h);\n        ctx.restore();\n      }\n    }\n\n    // Cable chain: alternating flat / edge-on oval links following the strand.\n    #chain(a, b, m) {\n      for (let s = a, i = 0; s < b; s += 8, i++) {\n        const p = this.measure.getPointAtLength(s);\n        const q = this.measure.getPointAtLength(Math.min(this.length, s + 1));\n        this.#link(p.x, p.y, Math.atan2(q.y - p.y, q.x - p.x), i % 2, m, 6.2, 3.7);\n      }\n    }\n\n    // One chain link: an open oval (flat) or a short bar (seen edge-on).\n    #link(x, y, ang, flat, m, rx, ry) {\n      const ctx = this.ctx;\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(ang);\n      if (flat) {\n        ctx.strokeStyle = m.mid; ctx.lineWidth = rx * 0.38;\n        ctx.beginPath(); ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2); ctx.stroke();\n        ctx.strokeStyle = m.lo; ctx.lineWidth = rx * 0.1;\n        ctx.beginPath(); ctx.ellipse(0, 0.5, rx, ry, 0, Math.PI * 0.1, Math.PI * 0.9); ctx.stroke();\n        ctx.strokeStyle = m.hi; ctx.lineWidth = rx * 0.14;\n        ctx.beginPath(); ctx.ellipse(0, -0.5, rx * 0.86, ry * 0.76, 0, Math.PI * 1.1, Math.PI * 1.9); ctx.stroke();\n      } else {\n        ctx.fillStyle = m.mid; ctx.fillRect(-rx, -ry * 0.38, rx * 2, ry * 0.76);\n        ctx.fillStyle = m.hi; ctx.fillRect(-rx * 0.9, -ry * 0.3, rx * 1.8, ry * 0.22);\n        ctx.fillStyle = m.lo; ctx.fillRect(-rx, ry * 0.22, rx * 2, ry * 0.16);\n      }\n      ctx.restore();\n    }\n\n    // The closure: a lobster clasp hanging from the left end of the strand, hooked into an\n    // extender of bigger links that arcs over the top into the right end of the strand.\n    #clasp(m) {\n      const ctx = this.ctx;\n      const L = this.measure.getPointAtLength(0);\n      const R = this.measure.getPointAtLength(this.length);\n\n      // Clasp axis points up and to the right, away from the strand end.\n      const dir = -1.05, dx = Math.cos(dir), dy = Math.sin(dir);\n      const cx = L.x + dx * 30, cy = L.y + dy * 30;   // body centre\n      const hook = { x: L.x + dx * 54, y: L.y + dy * 54 }; // top of the gate, where the extender hooks in\n\n      // Extender: interlocking links along a curve from the hook up and over to the right end.\n      const P1 = { x: (hook.x + R.x) / 2 + 10, y: Math.min(hook.y, R.y) - 150 };\n      const at = (t) => ({\n        x: (1 - t) * (1 - t) * hook.x + 2 * (1 - t) * t * P1.x + t * t * R.x,\n        y: (1 - t) * (1 - t) * hook.y + 2 * (1 - t) * t * P1.y + t * t * R.y,\n      });\n      let len = 0, prev = at(0);\n      const samples = [];\n      for (let i = 1; i <= 200; i++) { const p = at(i / 200); len += Math.hypot(p.x - prev.x, p.y - prev.y); samples.push([len, i / 200]); prev = p; }\n      const pitch = 19, n = Math.floor(len / pitch);\n      for (let k = 0; k <= n; k++) {\n        const target = (k / n) * len;\n        const t = (samples.find(([l]) => l >= target) || samples[samples.length - 1])[1];\n        const p = at(t), q = at(Math.min(1, t + 0.005));\n        this.#link(p.x, p.y, Math.atan2(q.y - p.y, q.x - p.x) + (k % 2 ? 0.28 : -0.28), true, m, 12, 8.5);\n      }\n\n      // Lobster clasp body\n      const g = ctx.createLinearGradient(cx - 20, cy - 20, cx + 20, cy + 20);\n      g.addColorStop(0, m.hi); g.addColorStop(0.5, m.mid); g.addColorStop(1, m.lo);\n      ctx.save();\n      ctx.translate(cx, cy);\n      ctx.rotate(dir + Math.PI / 2); // local -y points along the clasp axis (towards the hook)\n      const body = new Path2D('M 0 -22 C 13 -22, 15 -4, 12 8 C 9 19, 4 24, 0 26 C -4 24, -9 19, -12 8 C -15 -4, -13 -22, 0 -22 Z');\n      ctx.fillStyle = g; ctx.fill(body);\n      ctx.strokeStyle = m.lo; ctx.lineWidth = 1.1; ctx.stroke(body);\n      ctx.fillStyle = '#000'; // any opaque colour: destination-out erases by the source alpha\n      ctx.globalCompositeOperation = 'destination-out';\n      ctx.beginPath(); ctx.ellipse(0, -1, 6.5, 12.5, 0, 0, Math.PI * 2); ctx.fill();\n      ctx.globalCompositeOperation = 'source-over';\n      ctx.strokeStyle = m.hi; ctx.lineWidth = 2;\n      ctx.beginPath(); ctx.moveTo(-6.5, 9); ctx.quadraticCurveTo(-9.5, -4, -4, -13); ctx.stroke(); // spring gate\n      ctx.fillStyle = g; ctx.fillRect(9, -6, 7, 5);                                             // thumb trigger\n      ctx.strokeStyle = m.mid; ctx.lineWidth = 2.4;\n      ctx.beginPath(); ctx.arc(0, 30, 4.5, 0, Math.PI * 2); ctx.stroke();                        // ring onto the strand\n      ctx.restore();\n    }\n  }\n\n  NecklacePreview.METALS = METALS;\n  NecklacePreview.STONES = STONES;\n  NecklacePreview.RAINBOW = RAINBOW;\n  window.NecklacePreview = NecklacePreview;\n})();\n"],
  "mappings": "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",
  "names": ["s"]
}
