{
  "version": 3,
  "sources": ["/cdn/shop/t/33/assets/rj-ring-builder.js?cb=1794313015025"],
  "sourcesContent": ["/* RJ RING BUILDER 2026-11-07 \u2014 joins the three steps: setting (theme product pages), centre stone (diamonds at\r\n   /a/diamonds and gemstones at /a/gemstones, App Proxy pages) and complete ring (/a/diamonds/ring). Loaded on setting\r\n   pages (snippets/rj-ring-options), the settings collection, and every diamond and gemstone page (layout/rj-diamonds.liquid).\r\n   The build in progress lives in localStorage (\"rj_ring\", 14 days), so it survives filtering, paging and going back:\r\n     { first: 'setting' | 'diamond', setting: <product handle>, variant: <variant id>,\r\n       did: <stone id>, stoneKind: 'diamond' | 'gemstone', stoneShape, stoneLength, stoneWidth (mm),\r\n       stoneLabel, stonePrice, stoneImage, stoneUrl }\r\n   Fit = same shape as the setting's centre shape, and the stone's size inside the setting's mm range\r\n   (ring.stone_length_min_mm \u2026 stone_width_max_mm; empty = any size). Length = the stone's long side.\r\n   A step bar (\"Design your ring  1 Setting  2 Centre stone  3 Complete ring\", in the order the visitor started) shows what\r\n   is chosen with View / Change links, like Brilliant Earth's builder.\r\n   Setting first:  setting page \u2192 \"Choose your diamond\" / \"or choose a gemstone\" \u2192 stones that fit \u2192 complete ring\r\n   Stone first:    stone page \u2192 \"Add to a ring setting\" \u2192 settings in that shape \u2192 \"Add this setting to your \u2026\" \u2192 complete ring */\r\n(() => {\r\n  if (window.__rjBuilder) return;\r\n  window.__rjBuilder = true;\r\n\r\n  const KEY = 'rj_ring', TTL = 14 * 864e5;\r\n  const read = () => { try { const s = JSON.parse(localStorage.getItem(KEY) || 'null'); return s && Date.now() - (s.at || 0) < TTL ? s : null; } catch { return null; } };\r\n  const write = s => { try { s ? localStorage.setItem(KEY, JSON.stringify({ ...s, at: Date.now() })) : localStorage.removeItem(KEY); } catch {} };\r\n  const an = w => (/^[aeiou]/i.test(w || '') ? 'an ' : 'a ') + w;\r\n  const cap = w => (w || '').charAt(0).toUpperCase() + (w || '').slice(1);\r\n  const esc = v => String(v ?? '').replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\r\n  const SETTINGS = '/collections/diamond-engagement-ring-settings';\r\n  // settings for one centre shape: the products carry the shape as a tag (ROUND, OVAL, \u2026), so /collections/\u2026/<shape> filters them\r\n  const settingsUrl = shape => SETTINGS + (/^[a-z]+$/.test(shape || '') ? '/' + shape : '');\r\n  const DIA = '/a/diamonds', GEM = '/a/gemstones';\r\n  const SIZE_KEYS = ['lmin', 'lmax', 'wmin', 'wmax'];\r\n  const nounOf = kind => kind === 'gemstone' ? 'gemstone' : 'diamond';\r\n\r\n  const rjd = document.querySelector('.rjd');                       // a diamond or gemstone page (App Proxy)\r\n  const review = document.querySelector('[data-rj-review]');        // the complete-ring page\r\n  // The complete-ring page and the cart helper live under the diamonds link, for gemstones too.\r\n  const reviewUrl = s => `${DIA}/ring?setting=${encodeURIComponent(s.setting)}&variant=${encodeURIComponent(s.variant || '')}&did=${encodeURIComponent(s.did)}`;\r\n  // Stone search for a setting: same shape, the setting's size range, and the setting kept in the URL.\r\n  /* Diamonds open on laboratory-grown first (owner, 8 Nov: most sales); a natural stone already chosen keeps natural. */\r\n  function searchUrl(kind, shape, st, s) {\r\n    const p = new URLSearchParams();\r\n    if (kind === 'gemstone' && shape) p.set('shape', cap(shape));\r\n    if (st?.setting) { p.set('setting', st.setting); if (st.variant) p.set('variant', st.variant); }\r\n    for (const k of SIZE_KEYS) if (s?.size?.[k] != null && s.size[k] !== '') p.set(k, s.size[k]);\r\n    const base = kind === 'gemstone' ? GEM : `${DIA}/${kind === 'natural' || st?.stoneKind === 'natural' ? 'natural' : 'lab-grown'}${shape ? '/' + encodeURIComponent(shape) : ''}`;\r\n    const qs = p.toString();\r\n    return base + (qs ? '?' + qs : '');\r\n  }\r\n  // Does a stone of length \u00D7 width mm fit the setting's range? true when either is unknown.\r\n  function fits(size, length, width) {\r\n    const L = Math.max(+length || 0, +width || 0), W = Math.min(+length || 0, +width || 0) || L;\r\n    if (!L || !size) return true;\r\n    const n = k => size[k] == null || size[k] === '' ? null : +size[k];\r\n    return !((n('lmin') != null && L < n('lmin')) || (n('lmax') != null && L > n('lmax')) || (n('wmin') != null && W < n('wmin')) || (n('wmax') != null && W > n('wmax')));\r\n  }\r\n  const rangeText = size => {\r\n    if (!size) return '';\r\n    const r = (a, b) => a == null && b == null ? '' : `${a ?? 'any'}\u2013${b ?? 'any'} mm`;\r\n    const l = r(size.lmin, size.lmax), w = r(size.wmin, size.wmax);\r\n    return [l && l + ' long', w && w + ' wide'].filter(Boolean).join(', ');\r\n  };\r\n  const sizeText = (l, w) => { const L = Math.max(+l || 0, +w || 0), W = Math.min(+l || 0, +w || 0) || L; return L ? (W !== L ? `${L} x ${W} mm` : `${L} mm`) : ''; };\r\n\r\n  const info = {};\r\n  const settingInfo = handle => !handle ? Promise.resolve(null) : info[handle] || (info[handle] = fetch(`/products/${encodeURIComponent(handle)}?view=rj-ring-json`, { credentials: 'same-origin' })\r\n    .then(r => r.ok ? r.json() : null).catch(() => null));\r\n\r\n  /* ---------- Arriving on the stones with a setting chosen (?setting=\u2026&variant=\u2026) ---------- */\r\n  const q = new URLSearchParams(location.search);\r\n  if (rjd && !review && /^[a-z0-9-]{1,200}$/.test(q.get('setting') || '')) {\r\n    const prev = read() || {};\r\n    const keepStone = prev.did && (prev.setting === q.get('setting') || prev.first === 'diamond');\r\n    write({ ...(keepStone ? prev : {}), first: prev.first && keepStone ? prev.first : 'setting',\r\n      setting: q.get('setting'), variant: /^\\d+$/.test(q.get('variant') || '') ? q.get('variant') : '' });\r\n  }\r\n  // The complete-ring page knows the whole build: keep it so \"Change\" on either part comes back to it.\r\n  if (review) {\r\n    const d = review.dataset, prev = read() || {};\r\n    write({ first: prev.first || 'setting', setting: d.settingHandle, variant: d.variant, did: d.stone, stoneKind: nounOf(d.stoneKind),\r\n      stoneShape: d.stoneShape, stoneLength: d.stoneLength, stoneWidth: d.stoneWidth,\r\n      stoneLabel: d.stoneLabel, stoneDesc: d.stoneDesc, stonePrice: d.stonePrice, stoneImage: d.stoneImage, stoneUrl: d.stoneUrl });\r\n  }\r\n\r\n  /* ---------- The step bar ---------- */\r\n  const RING_ICON = '<svg class=\"rjw__icon\" viewBox=\"0 0 32 40\" width=\"28\" height=\"35\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"><path d=\"M11 9 16 3l5 6-5 4z\"/><path d=\"M11 9h10\"/><circle cx=\"16\" cy=\"25\" r=\"11\"/><circle cx=\"16\" cy=\"25\" r=\"8\"/></svg>';\r\n\r\n  // current: 'setting' | 'stone' | 'ring'; s = setting JSON (or null); st = state\r\n  function barHtml(current, st, s, hasBuild) {\r\n    const v = s && (s.variants.find(x => String(x.id) === String(st.variant)) || s.variants[0]);\r\n    const noun = nounOf(st.stoneKind);\r\n    const settingStep = s ? {\r\n      key: 'setting', title: 'Setting', sum: `${s.design || s.title} \u00B7 ${s.metal || ''}`.replace(/ \u00B7 $/, ''), price: v?.price,\r\n      links: [[`${s.url}${v ? `?variant=${v.id}` : ''}`, 'View'], [settingsUrl(st.did ? st.stoneShape : ''), 'Change']], img: s.image,\r\n    } : { key: 'setting', title: 'Setting',\r\n      sum: (st.stoneShape ? `Choose a setting for your ${st.stoneShape} ${noun}` : 'Choose a setting') + (current === 'setting' ? ' below' : ''),\r\n      links: current === 'setting' ? [] : [[settingsUrl(st.stoneShape), 'Browse Settings']] };\r\n    const shape = s?.shape || st.stoneShape || '';\r\n    const stoneStep = st.did ? {\r\n      key: 'stone', title: cap(noun), sum: st.stoneLabel || `Your ${noun}`, price: st.stonePrice,\r\n      links: [[st.stoneUrl || '#', 'View'], [searchUrl(noun, shape, st, s), 'Change']], img: st.stoneImage,\r\n    } : { key: 'stone', title: 'Centre Stone', sum: shape ? `Choose ${an(shape)} diamond or gemstone` : 'Choose a diamond or gemstone',\r\n      links: [[searchUrl('diamond', shape, st, s), 'Diamonds'], [searchUrl('gemstone', shape, st, s), 'Gemstones']] };\r\n    const ready = s && st.did;\r\n    const ringStep = { key: 'ring', title: 'Complete Ring', sum: current === 'ring' ? 'Choose Your Ring Size' : 'Select Ring Size',\r\n      links: ready && current !== 'ring' ? [[reviewUrl(st), 'Review Your Ring']] : [], icon: true };\r\n    const steps = st.first === 'diamond' ? [stoneStep, settingStep, ringStep] : [settingStep, stoneStep, ringStep];\r\n    return `<div class=\"rjw__intro\"><span>Design Your Ring</span>${hasBuild ? '<button type=\"button\" data-rjb-clear>Start Over</button>' : ''}</div>\r\n<ol class=\"rjw__steps\">${steps.map((x, i) => {\r\n      const done = x.key === 'setting' ? !!s && current !== 'setting' : x.key === 'stone' ? !!st.did && current !== 'stone' : false;\r\n      return `<li class=\"rjw__step${x.key === current ? ' is-current' : ''}${done ? ' is-done' : ''}\"${x.key === current ? ' aria-current=\"step\"' : ''}>\r\n  <span class=\"rjw__num\" aria-hidden=\"true\">${i + 1}</span>\r\n  <div class=\"rjw__txt\"><b>${x.title}</b><span class=\"rjw__sum\">${esc(x.sum)}${x.price ? ` <span class=\"rjw__price\">\u2013 ${esc(x.price)}</span>` : ''}</span>\r\n  ${x.links.length ? `<span class=\"rjw__links\">${x.links.map(([h, t]) => `<a href=\"${esc(h)}\">${t}</a>`).join('')}</span>` : ''}</div>\r\n  ${x.icon ? RING_ICON : x.img ? `<img class=\"rjw__img\" src=\"${esc(x.img)}\" alt=\"\" width=\"56\" height=\"56\" loading=\"lazy\">` : ''}\r\n</li>`;\r\n    }).join('')}</ol>`;\r\n  }\r\n\r\n  async function renderBar(current, anchor, where, settingHandle, settingVariant) {\r\n    const st = read() || { first: 'setting' };\r\n    const s = await settingInfo(settingHandle || st.setting);\r\n    let bar = document.querySelector('.rjw');\r\n    if (!bar) {\r\n      bar = document.createElement('nav');\r\n      bar.className = 'rjw';\r\n      bar.setAttribute('aria-label', 'Design your ring');\r\n      if (settingHandle) {\r\n        // setting pages: the bar sits between sections, so give it the same container (width) as the product section\r\n        const wrap = document.createElement('div');\r\n        const inner = anchor.querySelector?.('.container');\r\n        wrap.className = `${inner ? inner.className : 'container'} rjw-wrap`;\r\n        wrap.append(bar);\r\n        anchor[where](wrap);\r\n      } else anchor[where](bar);\r\n    }\r\n    bar.innerHTML = barHtml(current, settingHandle ? { ...st, setting: settingHandle, variant: settingVariant || (st.setting === settingHandle ? st.variant : '') } : st, s, !!(st.setting || st.did));\r\n    return s;\r\n  }\r\n\r\n  /* ---------- Diamond and gemstone pages ---------- */\r\n  async function stones() {\r\n    const crumbs = rjd.querySelector('.rjd-crumbs');\r\n    const page = rjd.querySelector('.rjd-page') || rjd;\r\n    if (review) {\r\n      review.querySelector('.rjr-steps')?.remove();\r\n      // pre-set rings (&preset=1): no Ring Builder step bar\r\n      if (new URLSearchParams(location.search).get('preset') !== '1') await renderBar('ring', review.querySelector('h1') || review, 'before');\r\n      return;\r\n    }\r\n    const st = read();\r\n    const add = rjd.querySelector('.rjd-add[data-stone]');\r\n    const stoneId = add?.dataset.stone;\r\n    const kind = nounOf(add?.dataset.kind || (rjd.dataset.prefix === GEM ? 'gemstone' : 'diamond'));\r\n    const stone = () => ({\r\n      did: stoneId, stoneKind: kind,\r\n      stoneShape: (rjd.querySelector('.rjd-gallery [data-shape]')?.dataset.shape || '').toLowerCase(),\r\n      stoneLength: add?.dataset.length || '', stoneWidth: add?.dataset.width || '',\r\n      stoneLabel: (rjd.querySelector('.rjd-buy h1')?.textContent || '').trim(),\r\n      stoneDesc: [(rjd.querySelector('.rjd-buy .rjd-sub')?.textContent || '').replace(/s+/g, ' ').trim().replace(/s*[\u2022\u00B7]s*/g, ' \u00B7 '), sizeText(add?.dataset.length, add?.dataset.width)].filter(Boolean).join(' \u00B7 '),\r\n      stonePrice: (rjd.querySelector('.rjd-buy .rjd-price')?.childNodes[0]?.textContent || '').trim(),\r\n      stoneImage: rjd.querySelector('.rjd-gallery img')?.src || '',\r\n      stoneUrl: location.pathname,\r\n    });\r\n\r\n    if (!st?.setting && !st?.did) {\r\n      // No build in progress: plain loose-stone page, plus \"Add to a ring setting\" on a stone (stone first)\r\n      if (stoneId) {\r\n        const a = document.createElement('a');\r\n        a.className = 'rjd-btn rjd-btn--ghost rjb-start';\r\n        a.textContent = 'Add To A Ring Setting';\r\n        a.href = settingsUrl(stone().stoneShape);\r\n        a.addEventListener('click', () => write({ first: 'diamond', ...stone() }));\r\n        add.after(a);\r\n      }\r\n      return;\r\n    }\r\n\r\n    const s = await renderBar('stone', crumbs || page, crumbs ? 'after' : 'prepend');\r\n\r\n    // A list limited to the setting's size: say so, offer all sizes, and keep the limit when the filters change.\r\n    const form = document.getElementById('rjd-form');\r\n    const sized = SIZE_KEYS.filter(k => q.get(k));\r\n    if (sized.length) {\r\n      if (form) for (const k of sized) if (!form.querySelector(`[name=\"${k}\"]`)) { const i = document.createElement('input'); i.type = 'hidden'; i.name = k; i.value = q.get(k); form.append(i); }\r\n      if (!stoneId) {\r\n        const all = new URL(location.href); SIZE_KEYS.forEach(k => all.searchParams.delete(k));\r\n        const n = document.createElement('p');\r\n        n.className = 'rjw-note';\r\n        n.innerHTML = `Showing stones that fit your setting (${esc(rangeText(Object.fromEntries(sized.map(k => [k, q.get(k)]))))}). <a href=\"${esc(all.pathname + all.search)}\">Show All Sizes</a>`;\r\n        (document.querySelector('.rjw') || page).after(n);\r\n      }\r\n    }\r\n    if (!stoneId) return;\r\n\r\n    const noun = kind;\r\n    const buyOnly = () => { add.classList.add('rjd-btn--ghost'); add.textContent = `Buy This ${cap(noun)} Only`; };\r\n    if (!s) {\r\n      // stone-first build, setting not chosen yet: choosing this stone instead\r\n      const a = document.createElement('a');\r\n      a.className = 'rjd-btn rjb-add';\r\n      a.href = settingsUrl(stone().stoneShape);\r\n      a.textContent = st.did === stoneId ? `Choose A Setting For This ${cap(noun)}` : `Use This ${cap(noun)} For Your Ring`;\r\n      a.addEventListener('click', () => write({ ...st, first: 'diamond', ...stone() }));\r\n      add.before(a);\r\n      buyOnly();\r\n      return;\r\n    }\r\n    const me = stone();\r\n    const shapeOk = !s.shape || s.shape === me.stoneShape;\r\n    const sizeOk = fits(s.size, me.stoneLength, me.stoneWidth);\r\n    if (shapeOk && sizeOk) {\r\n      const a = document.createElement('a');\r\n      a.className = 'rjd-btn rjb-add';\r\n      a.href = reviewUrl({ ...st, did: stoneId });\r\n      a.textContent = 'Add To Your Ring';\r\n      a.addEventListener('click', () => write({ ...st, ...stone() }));\r\n      add.before(a);\r\n      buyOnly();\r\n    } else {\r\n      // Doesn't fit the chosen setting: say why, and offer the two ways forward instead of \"Add To Cart\"\r\n      // (the stone can still be bought on its own, as the outlined button under them).\r\n      const p = document.createElement('p');\r\n      p.className = 'rjd-warn';\r\n      p.innerHTML = !shapeOk\r\n        ? `Your setting is made for ${esc(an(s.shapeName.toLowerCase()))} centre stone, and this ${noun} is ${esc(me.stoneShape)}.`\r\n        : `Your setting takes a centre stone ${esc(rangeText(s.size))}, and this ${noun} is ${esc(sizeText(me.stoneLength, me.stoneWidth))}.`;\r\n      const find = document.createElement('a');\r\n      find.className = 'rjd-btn rjb-add';\r\n      find.href = searchUrl(noun, s.shape, st, s);\r\n      find.textContent = `Find A New ${cap(noun)} For Your Ring Setting`;\r\n      const change = document.createElement('a');\r\n      change.className = 'rjd-btn rjd-btn--ghost rjb-change-setting';\r\n      change.href = settingsUrl(me.stoneShape);\r\n      change.textContent = 'Change The Ring Setting';\r\n      // keep this stone and choose a setting in its shape\r\n      change.addEventListener('click', () => write({ ...st, first: 'diamond', ...stone() }));\r\n      add.before(p, find, change);\r\n      buyOnly();\r\n    }\r\n  }\r\n\r\n  /* ---------- Settings collection (templates/collection.diamond-setting.json) ---------- */\r\n  async function collectionPage() {\r\n    const hook = document.querySelector('[data-rj-ring-collection]');\r\n    if (!hook) return;\r\n    await renderBar('setting', hook, 'append');\r\n    const st = read();\r\n    if (!st?.did || !st.stoneShape) return;\r\n    // stone first: these settings should fit the chosen stone\r\n    const noun = nounOf(st.stoneKind);\r\n    const filtered = location.pathname.replace(/\\/$/, '').endsWith('/' + st.stoneShape);\r\n    const p = document.createElement('p');\r\n    p.className = 'rjw-note';\r\n    p.innerHTML = filtered\r\n      ? `Showing settings made for your ${esc(st.stoneShape)} ${noun}. <a href=\"${SETTINGS}\">See All Settings</a>`\r\n      : `Your ${noun} is ${esc(st.stoneShape)}. <a href=\"${esc(settingsUrl(st.stoneShape))}\">Show only settings for ${esc(an(st.stoneShape))} ${noun}</a>`;\r\n    hook.append(p);\r\n  }\r\n\r\n  /* ---------- Setting pages ---------- */\r\n  /* ---------- Pre-set ring pages (/pages/pre-set-engagement-rings/\u2026, sections/rj-preset-ring) ----------\r\n     The page draws the options, carat and total into [data-rj-preset]. \"Buy This Ring\": the proxy names the cheapest matching\r\n     stone right now (/api/preset-stone, the rule that set the shown price), then the Your Ring page opens with this setting\r\n     variant and that stone (&preset=1: no step bar there). */\r\n  function presetPage() {\r\n    document.addEventListener('click', async e => {\r\n      const btn = e.target.closest?.('[data-rj-preset-buy]');\r\n      if (!btn) return;\r\n      const card = document.querySelector('[data-rj-preset]');\r\n      const msg = document.querySelector('.rj-preset-msg');\r\n      if (!card) return;\r\n      btn.disabled = true; btn.setAttribute('aria-busy', 'true');\r\n      if (msg) msg.textContent = '';\r\n      try {\r\n        const q = new URLSearchParams({ shape: card.dataset.shape, carat: card.dataset.carat });\r\n        for (const k of ['lmin', 'lmax', 'wmin', 'wmax']) if (card.dataset[k]) q.set(k, card.dataset[k]);\r\n        const r = await fetch(`${DIA}/api/preset-stone?${q}`, { headers: { Accept: 'application/json' } }).then(x => x.json()).catch(() => null);\r\n        if (!r?.ok) throw new Error('No matching diamond is available right now. Please choose your own diamond for this setting.');\r\n        let stones = {};\r\n        try { stones = JSON.parse(card.querySelector('[data-rj-preset-stones]').textContent) || {}; } catch {}\r\n        const shown = stones[card.dataset.carat];\r\n        const same = shown && shown.id === r.id;\r\n        write({ first: 'setting', setting: card.dataset.setting, variant: card.dataset.settingVariant, did: r.id, preset: location.pathname,\r\n          stoneKind: 'lab', stoneShape: card.dataset.shape, stoneLabel: r.label, stonePrice: 'R ' + Number(r.price).toLocaleString('en-US', { minimumFractionDigits: 2 }),\r\n          stoneLength: same ? String(shown.length || '') : '', stoneWidth: same ? String(shown.width || '') : '',\r\n          stoneImage: same ? shown.image || '' : '', stoneUrl: same ? new URL(shown.url).pathname : '' });\r\n        location.href = `${DIA}/ring?setting=${encodeURIComponent(card.dataset.setting)}&variant=${encodeURIComponent(card.dataset.settingVariant)}&did=${encodeURIComponent(r.id)}&preset=1`;\r\n      } catch (err) {\r\n        if (msg) msg.textContent = err.message;\r\n        btn.disabled = false;\r\n      } finally {\r\n        btn.removeAttribute('aria-busy');\r\n      }\r\n    });\r\n  }\r\n\r\n  function settingPage() {\r\n    const box = document.querySelector('[data-rj-ring-options]');\r\n    if (!box || box.hasAttribute('data-preset')) return;   // pre-set rings: presetPage()\r\n    const section = box.closest('.shopify-section') || box;\r\n    renderBar('setting', section, 'before', box.dataset.handle, box.dataset.variant);   // outside the section, so in-place swaps keep it\r\n\r\n    const choose = section.querySelector('.rj-choose-stone');\r\n    const st = read();\r\n    section.querySelector('.rjb-diamond')?.remove();\r\n    if (st?.did) {\r\n      // A stone is chosen: offer this setting for it if it fits (the price card shows the stone, red when it doesn't fit)\r\n      const fit = stoneFit(box, st);\r\n      if (fit.ok) {\r\n        const el = document.createElement('div');\r\n        el.className = 'rjb-diamond';\r\n        el.innerHTML = `<a class=\"rj-choose-diamond\" href=\"#\" data-rjb-use>Add This Setting To Your ${cap(nounOf(st.stoneKind))}</a>`;\r\n        (choose || box).before(el);\r\n      }\r\n      if (choose) choose.hidden = fit.ok;\r\n    } else if (choose) {\r\n      choose.hidden = false;\r\n    }\r\n    priceCard(section);\r\n    watchPriceCard(section);\r\n  }\r\n\r\n  /* The price card on setting pages (\"Ring setting / Centre stone: Add next / Your ring total: Shown after step 2\",\r\n     product.setting.json liquid_rjPrice): once a stone is chosen, show it and the ring total. */\r\n  const amount = t => { const m = String(t || '').match(/\\d[\\d\\s,]*(?:\\.\\d{1,2})?/g); return m ? Number(m[m.length - 1].replace(/[\\s,]/g, '')) : NaN; };\r\n  const money = n => 'R ' + n.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n  // Shape and size check of the chosen stone against this setting page's product.\r\n  function stoneFit(box, st) {\r\n    const size = Object.fromEntries(SIZE_KEYS.map(k => [k, box.dataset[k] || null]));\r\n    const noun = nounOf(st.stoneKind);\r\n    if (st.stoneShape && box.dataset.shape && st.stoneShape !== box.dataset.shape)\r\n      return { ok: false, size, why: `Your ${esc(st.stoneShape)} ${noun} doesn't fit this ${esc(box.dataset.shape)} setting. Choose the ${esc(cap(st.stoneShape))} shape above, or choose a new ${esc(box.dataset.shape)} stone.` };\r\n    if (!fits(size, st.stoneLength, st.stoneWidth))\r\n      return { ok: false, size, why: `Your ${noun} (${esc(sizeText(st.stoneLength, st.stoneWidth))}) doesn't fit this setting, which takes a centre stone ${esc(rangeText(size))}.` };\r\n    return { ok: true, size };\r\n  }\r\n  function priceCard(section) {\r\n    const st = read();\r\n    const card = section.querySelector('.rj-price-card');\r\n    const box = section.querySelector('[data-rj-ring-options]');\r\n    if (!card || !box || !st?.did) return;\r\n    const row = card.querySelector('.rj-price-next');\r\n    const total = card.querySelector('.rj-price-total span:last-child');\r\n    const setting = amount(card.querySelector('.rj-price-amt')?.textContent);\r\n    const stone = amount(st.stonePrice);\r\n    const fit = stoneFit(box, st);\r\n    const noun = nounOf(st.stoneKind);\r\n    const newStone = searchUrl(noun, box.dataset.shape, { setting: box.dataset.handle, variant: box.dataset.variant }, { size: fit.size });\r\n    const sig = [st.did, fit.ok, setting, box.dataset.handle].join('|');\r\n    if (row && row.dataset.rjSig !== sig) {\r\n      row.dataset.rjSig = sig;\r\n      row.classList.add('rj-price-stone-row');\r\n      row.classList.toggle('is-bad', !fit.ok);\r\n      row.innerHTML = `<span class=\"rj-price-stone__title\">Centre Stone</span>\r\n<div class=\"rj-price-stone\">\r\n  ${st.stoneImage ? `<img src=\"${esc(st.stoneImage)}\" alt=\"\" width=\"64\" height=\"64\" loading=\"lazy\">` : ''}\r\n  <div class=\"rj-price-stone__info\"><a href=\"${esc(st.stoneUrl || '#')}\"><b>${esc(st.stoneLabel || 'Your ' + noun)}</b></a>${st.stoneDesc ? `<small>${esc(st.stoneDesc)}</small>` : ''}</div>\r\n  <span class=\"rj-price-stone__price\">${isNaN(stone) ? '' : money(stone)}</span>\r\n</div>\r\n${fit.ok ? `<a class=\"rj-price-stone__change\" href=\"${esc(newStone)}\">Change Stone</a>`\r\n  : `<p class=\"rj-price-stone__why\">${fit.why}</p><a class=\"rj-choose-new\" href=\"${esc(newStone)}\">Choose New Stone</a>`}`;\r\n    }\r\n    const totalText = fit.ok && !isNaN(setting) && !isNaN(stone) ? money(setting + stone) : 'Choose A Stone That Fits';\r\n    if (total && total.textContent !== totalText) total.textContent = totalText;\r\n    card.classList.add('rj-price-card--stone');\r\n  }\r\n  // The theme re-renders the card when the variant changes (stone type, side stone size): fill it in again.\r\n  let watched;\r\n  function watchPriceCard(section) {\r\n    if (watched === section) return;\r\n    watched = section;\r\n    let queued = false;\r\n    new MutationObserver(() => {\r\n      if (queued) return;\r\n      queued = true;\r\n      requestAnimationFrame(() => { queued = false; priceCard(section); });\r\n    }).observe(section, { childList: true, subtree: true, characterData: true });\r\n  }\r\n\r\n  document.addEventListener('click', e => {\r\n    const t = e.target;\r\n    if (t.closest('[data-rjb-clear]')) { write(null); location.reload(); return; }\r\n\r\n    const use = t.closest('[data-rjb-use]');\r\n    if (use) {\r\n      e.preventDefault();\r\n      const box = document.querySelector('[data-rj-ring-options]');\r\n      const v = document.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]')?.value || box.dataset.variant || '';\r\n      const next = { ...read(), setting: box.dataset.handle, variant: v };\r\n      write(next);\r\n      location.href = reviewUrl(next);\r\n      return;\r\n    }\r\n\r\n    const choose = t.closest('.rj-choose-stone a');\r\n    if (choose) {\r\n      // carry the variant chosen on the page (stone type, side stone size) to the stones and the complete ring\r\n      const v = document.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]')?.value;\r\n      if (v) { const u = new URL(choose.href, location.origin); u.searchParams.set('variant', v); choose.href = u.pathname + u.search; }\r\n    }\r\n\r\n    /* ---------- Complete ring: add the setting and the stone together ---------- */\r\n    const btn = t.closest('[data-rj-ring-add]');\r\n    if (btn && !btn.disabled) addRing(btn);\r\n  });\r\n\r\n  /* ---------- Your Ring: basket, legal tick boxes and checkout ----------\r\n     2026-11-07 (owner): Buy Your Ring goes straight to Shopify checkout, so the buy box on the complete-ring page does what the\r\n     cart did, in this order (proxy src/ring.ts):\r\n       Ring Total, Ring Size\r\n       [data-rj-basket]  other items already in the basket (each with its amount) and the Basket Total. Hidden when there are none.\r\n                         A builder ring (lines sharing _rj_ring) is one item. The same setting with this stone, from an earlier\r\n                         try, is left out: buying replaces it.\r\n       pay-later options on the ring or basket total ([data-rj-pay-total], read by snippets/rj-paylater)\r\n       [data-rj-legal]   delivery period and date, the fields and tick boxes of the legal pack RJ-PUB-14A section 7 (texts pasted\r\n                         exactly; RJ-PUB-11 section 3; RJ-PUB-12 Parts 2 and 3). Only the boxes that apply are shown. Required boxes\r\n                         are unticked and the button stays disabled until they are ticked. Everything is recorded on the order as\r\n                         cart attributes (RJ-PUB-14A section 13), with the timestamp and Terms version 3.15.\r\n       button            \"Buy Your Ring\", or \"Continue To Checkout\" with the basket total when there are other items.\r\n     Delivery period (RJ-PUB-11): 40 working days if anything in the order has a natural stone (centre or accents), else 30; the\r\n     longest applies to the whole order. Festive closure (Seasonal 3.2 section 8, 3 Dec 2026 to 10 Jan 2027): counted from 11 Jan 2027.\r\n     Wording is legal text: do not change it without legal@ralphjacobs.org. */\r\n  const track = (n, d) => { try { window.rjTrack && window.rjTrack(n, d); } catch (e) {} };\r\n  const rands = c => 'R ' + (c / 100).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\r\n  const RJ = 'https://ralphjacobs.org';\r\n  const ext = (path, text) => `<a href=\"${RJ}${path}\" target=\"_blank\" rel=\"noopener\">${text}</a>`;\r\n  const CLOSURE_START = 1796248800, REOPEN = 1799618400;   // 3 Dec 2026 00:00 and 11 Jan 2027 00:00 SAST (snippets/rj-season)\r\n  let basketState = { others: [], natural: false, total: 0, key: '' };\r\n\r\n  /* Working days from the first working day after today (or after 10 Jan 2027 in the closure); weekends and SA public holidays\r\n     skipped, a Sunday holiday moving to the Monday. Same rule as snippets/rj-bench. */\r\n  function deliveredBy(wd, closure) {\r\n    const key = d => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\r\n    const rjShut = function (d) { var n = d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate(); return n >= 20261221 && n <= 20270108; };   /* RJ-PUB-16E: workshop closed 21 Dec 2026 \u2013 8 Jan 2027, not counted */\r\n    const easter = y => {\r\n      const a = y % 19, b = Math.floor(y / 100), c = y % 100, d = Math.floor(b / 4), e = b % 4, f = Math.floor((b + 8) / 25), g = Math.floor((b - f + 1) / 3),\r\n        h = (19 * a + b - d - g + 15) % 30, i = Math.floor(c / 4), k = c % 4, l = (32 + 2 * e + 2 * i - h - k) % 7, m = Math.floor((a + 11 * h + 22 * l) / 451), n = h + l - 7 * m + 114;\r\n      return new Date(y, Math.floor(n / 31) - 1, (n % 31) + 1);\r\n    };\r\n    const hol = {};\r\n    const add = y => {\r\n      [[0, 1], [2, 21], [3, 27], [4, 1], [5, 16], [7, 9], [8, 24], [11, 16], [11, 25], [11, 26]].forEach(([mo, da]) => {\r\n        const d = new Date(y, mo, da); hol[key(d)] = 1;\r\n        if (d.getDay() === 0) hol[key(new Date(y, mo, da + 1))] = 1;\r\n      });\r\n      const e = easter(y);\r\n      hol[key(new Date(y, e.getMonth(), e.getDate() - 2))] = 1;\r\n      hol[key(new Date(y, e.getMonth(), e.getDate() + 1))] = 1;\r\n    };\r\n    const d = closure ? new Date(2027, 0, 10) : new Date();\r\n    d.setHours(12, 0, 0, 0);\r\n    add(d.getFullYear()); add(d.getFullYear() + 1);\r\n    let n = 0;\r\n    while (n < wd) { d.setDate(d.getDate() + 1); if (d.getDay() && d.getDay() !== 6 && !hol[key(d)] && !rjShut(d)) n++; }\r\n    return d;\r\n  }\r\n\r\n  /* A basket line with a natural stone: a natural accent option, or a stone line not titled lab-grown or moissanite\r\n     (the same rule as snippets/rj-mto-cart). */\r\n  function naturalLine(i) {\r\n    if ((i.options_with_values || []).some(o => /^natural$/i.test(o.value)) || /(^| \\/ )Natural( \\/ |$)/.test(i.variant_title || '')) return true;\r\n    const stone = /diamond|gemstone/i.test(i.product_type || '') || i.vendor === 'Diamond Picker' || i.properties?.Certificate || i.properties?._rj_ring && i.properties?.['Set in'];\r\n    return !!stone && !/lab|moissanite/i.test(`${i.product_title} ${i.variant_title || ''}`);\r\n  }\r\n\r\n  let ringCode = '';                     // this page's ring in the basket (_rj_ring), once it is there\r\n  let bandMark = () => {};               // redraws the wedding band card (set by bandOffer)\r\n  const post = (u, b) => fetch(u, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify(b) });\r\n  const refreshCount = () => { try { document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true })); } catch {} };\r\n  const LETTERS = 'F G H I J K L M N O P Q R S T U V W X Y Z'.split(' ');\r\n  const sizeOptions = (cur, first) => `<option value=\"\">${first}</option>${LETTERS.map(z => `<option${z === cur ? ' selected' : ''}>${z}</option>`).join('')}<option value=\"Not sure\"${cur === 'Not sure' ? ' selected' : ''}>Not Sure, Send Me A Ring Sizer</option>`;\r\n  const needsSize = i => /^(setting|wedding ring)$/i.test(i.product_type || '');\r\n  const lineRank = i => /^setting$/i.test(i.product_type || '') ? 0 : /wedding/i.test(i.product_type || '') ? 2 : i.properties?.['Rush rate'] ? 3 : 1;\r\n  /* a line's property changed (ring size): Shopify keeps the other properties only if all are sent; the line key changes */\r\n  async function setLineProp(key, name, value) {\r\n    const i = (basketState.cart?.items || []).find(x => x.key === key);\r\n    if (!i) return;\r\n    await post('/cart/change.js', { id: key, quantity: i.quantity, properties: { ...(i.properties || {}), [name]: value } }).catch(() => {});\r\n    await basket();\r\n  }\r\n\r\n  async function basket() {\r\n    const slot = review?.querySelector('[data-rj-basket]');\r\n    if (!slot) return;\r\n    const seq = basket.seq = (basket.seq || 0) + 1;   // only the newest read is drawn\r\n    const cart = await fetch('/cart.js?t=' + Date.now(), { headers: { Accept: 'application/json' }, cache: 'no-store' }).then(x => x.json()).catch(() => null);\r\n    if (seq !== basket.seq) return;\r\n    const items = cart?.items || [];\r\n    const mine = ringCode ? items.filter(i => i.properties?._rj_ring === ringCode || i.properties?._rj_band === ringCode) : [];\r\n    const settingLine = mine.find(i => /^setting$/i.test(i.product_type || ''));\r\n    const inCart = !!settingLine;\r\n    const bandLine = mine.find(i => i.properties?._rj_band === ringCode);\r\n    const rushLine = mine.find(i => i.properties?.['Rush rate']);\r\n    // everything else: a builder ring (setting, stone, its band, rush) is one item\r\n    const groups = [], byRing = {};\r\n    items.forEach(i => {\r\n      if (mine.includes(i)) return;\r\n      const k = i.properties?._rj_ring || i.properties?._rj_band;\r\n      if (k) { if (!byRing[k]) groups.push(byRing[k] = { ring: k, lines: [] }); byRing[k].lines.push(i); }\r\n      else groups.push({ lines: [i] });\r\n    });\r\n    groups.forEach(g => g.lines.sort((a, b) => lineRank(a) - lineRank(b)));\r\n    const others = groups;\r\n    const ringCents = Number(String(review.querySelector('[data-rj-ring-total]')?.textContent || '').replace(/[^0-9]/g, '')) || 0;\r\n    const btn = review.querySelector('[data-rj-ring-add]');\r\n    const ringNatural = review.dataset.stoneKind !== 'lab' && review.dataset.stoneKind !== 'moissanite' && !/lab|moissanite/i.test(review.dataset.stoneLabel || '')\r\n      || /(^| \\/ )Natural( \\/ |$)/.test(btn?.dataset.settingOptions || '');\r\n    const band = bandLine ? { variant: bandLine.variant_id, key: bandLine.key, title: bandLine.product_title, cents: bandLine.original_line_price, sale: bandLine.final_line_price, img: bandLine.featured_image?.url || bandLine.image, url: bandLine.url, size: bandLine.properties?.['Ring size'] || '', inCart: true }\r\n      : (inCart ? null : basketState.band);\r\n    const cartCents = (cart?.total_price || 0) - (rushLine?.final_line_price || 0);   // the rush charge is worked out again from the date\r\n    basketState = { cart, inCart, others, ringNatural, ringCents, rush: null, band,\r\n      natural: ringNatural || others.some(g => g.lines.some(naturalLine)) || (bandLine ? /natural/i.test(`${bandLine.product_title} ${bandLine.variant_title || ''}`) : false), mixed: false,\r\n      total: inCart ? cartCents : cartCents + ringCents + (band?.sale || 0) };\r\n    basketState.mixed = basketState.natural && !(ringNatural && others.every(g => g.lines.some(naturalLine)));\r\n    // the ring size saved on the basket line\r\n    const size = review.querySelector('[data-rj-size]');\r\n    if (size && settingLine) { size.value = settingLine.properties?.['Ring size'] || ''; size.dataset.key = settingLine.key; }\r\n    const left = review.querySelector('[data-rj-others]');\r\n    const amount = g => rands(g.lines.reduce((m, i) => m + i.final_line_price, 0));\r\n    if (left) {\r\n      left.hidden = !others.length;\r\n      left.innerHTML = !others.length ? '' : `<p class=\"rjr-kicker rjr-others__title\">Also In Your Basket</p>${others.map(g => {\r\n        const main = g.lines[0];\r\n        const sub = g.ring ? g.lines.slice(1).map(i => esc(i.product_title)).join(', ') : (main.variant_title && main.variant_title !== 'Default Title' ? esc(main.variant_title) : '');\r\n        const props = Object.entries(main.properties || {}).filter(([k, v]) => k[0] !== '_' && k !== 'Ring' && k !== 'Ring size' && k !== 'Wedding band for' && v).map(([k, v]) => `${esc(k)}: ${esc(v)}`).join(' \u00B7 ');\r\n        const img = main.featured_image?.url || main.image;\r\n        const view = g.ring && main.properties?._rj_url;\r\n        const sized = g.lines.filter(needsSize);\r\n        const sizes = sized.map(i => `<label class=\"rjr-band__size\">${/wedding/i.test(i.product_type) ? 'Wedding Band Size' : 'Ring Size'}<select data-rj-line-size=\"${esc(i.key)}\">${sizeOptions(i.properties?.['Ring size'] || '', 'Choose Your Size')}</select></label>`).join('');\r\n        return `<div class=\"rjr-part rjr-part--other\">\r\n  ${img ? `<img src=\"${esc(img)}${img.includes('?') ? '&' : '?'}width=400\" alt=\"\" width=\"160\" height=\"160\" loading=\"lazy\">` : ''}\r\n  <div>\r\n    <h2><a href=\"${esc(view || main.url)}\">${esc(main.product_title)}</a></h2>\r\n    ${sub ? `<p class=\"rjr-sub\">${g.ring ? 'With ' : ''}${sub}</p>` : ''}${props ? `<p class=\"rjr-sub\">${props}</p>` : ''}${!g.ring && main.quantity > 1 ? `<p class=\"rjr-sub\">Quantity ${main.quantity}</p>` : ''}\r\n    <p class=\"rjr-price\">${amount(g)}</p>\r\n    ${sizes}\r\n    <p class=\"rjr-band__actions\">${view ? `<a class=\"rjr-change\" href=\"${esc(view)}\">View This Ring</a> ` : ''}<button type=\"button\" class=\"rjr-change rjr-remove\" data-rj-basket-remove=\"${esc(g.lines.map(i => i.key).join(','))}\">Remove</button></p>\r\n  </div>\r\n</div>`;\r\n      }).join('')}`;\r\n    }\r\n    legal();\r\n    // the date from an earlier visit (its rush line)\r\n    const needed = review.querySelector('[data-rj-date-needed]');\r\n    if (needed && !needed.value && rushLine?.properties?.['Needed by']) needed.value = rushLine.properties['Needed by'];\r\n    rushChange();\r\n    bandMark();\r\n    renderSlot();\r\n    if (!basket.viewed) { basket.viewed = true; track('rj_view_ring', { value: ringCents / 100, currency: 'ZAR', stone_kind: review.dataset.stoneKind || '', preset: new URLSearchParams(location.search).get('preset') === '1', other_items: others.length, in_basket: inCart }); }\r\n  }\r\n\r\n  /* Buy box: your ring, the wedding band, other items, the rush order charge (if any), then the basket total; the button. */\r\n  function renderSlot() {\r\n    const slot = review?.querySelector('[data-rj-basket]');\r\n    const btn = review?.querySelector('[data-rj-ring-add]');\r\n    if (!slot) return;\r\n    const { others, rush, band, inCart } = basketState;\r\n    const amount = g => rands(g.lines.reduce((m, i) => m + i.final_line_price, 0));\r\n    const total = basketState.total + (rush?.cents || 0);\r\n    slot.hidden = false;\r\n    slot.innerHTML = `<p class=\"rjr-basket__title\">Your Basket</p><ul class=\"rjr-basket__list\" role=\"list\"><li class=\"rjr-basket__item\"><span class=\"rjr-basket__txt\">Your ring</span><b>${rands(basketState.ringCents)}</b></li>${band ? `<li class=\"rjr-basket__item\"><span class=\"rjr-basket__txt\">${esc(band.title)} (20% off)</span><b><s class=\"rjr-basket__was\">${rands(band.cents)}</s> ${rands(band.sale)}</b></li>` : ''}${others.map(g => `<li class=\"rjr-basket__item\"><span class=\"rjr-basket__txt\">${esc(g.lines[0].product_title)}${!g.ring && g.lines[0].quantity > 1 ? ` \u00D7 ${g.lines[0].quantity}` : ''}</span><b>${amount(g)}</b></li>`).join('')}${rush ? `<li class=\"rjr-basket__item\"><span class=\"rjr-basket__txt\">Rush Order Charge (${rush.pct}% of your ring, needed by ${esc(rush.label)})</span><b>${rands(rush.cents)}</b></li>` : ''}</ul>\r\n<p class=\"rjr-basket__total\"><span>Basket Total</span><b data-rj-pay-total>${rands(total)}</b></p>\r\n<p class=\"rjr-basket__note\">All prices include 15% VAT. Delivery is free in South Africa.${inCart ? '' : ' Your ring is not in your basket yet.'}</p>`;\r\n    if (btn) btn.textContent = `Checkout \u00B7 ${rands(total)}`;\r\n  }\r\n\r\n  /* Date needed (RJ-PUB-14A \u00A77.3): the date box allows dates from 20 working days ahead (earlier: contact us first). It is a\r\n     free request confirmed in writing before payment; the paid rush charge was switched off on 9 Nov (Legal). */\r\n  const isoDay = d => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\r\n  function workingDaysUntil(iso, closure) {\r\n    let n = 0;\r\n    while (n < 400 && isoDay(deliveredBy(n + 1, closure)) <= iso) n++;\r\n    return n;\r\n  }\r\n  function rushChange() {\r\n    const box = review?.querySelector('[data-rj-legal]');\r\n    const input = box?.querySelector('[data-rj-date-needed]');\r\n    const note = box?.querySelector('[data-rj-rush-note]');\r\n    if (!input || !note) return;\r\n    const closure = box.dataset.closure === '1';\r\n    const iso = input.value;\r\n    basketState.rush = null;\r\n    note.className = 'rjr-rush';\r\n    if (!iso) note.innerHTML = '';\r\n    else if (iso < input.min) {\r\n      note.classList.add('is-warn');\r\n      note.innerHTML = `The earliest date we can make your ring by is ${esc(box.dataset.minLabel)}. Need it earlier? <a href=\"/pages/contact\" target=\"_blank\" rel=\"noopener\">Contact us first</a>.`;\r\n    } else {\r\n      /* Legal 9 Nov (14A \u00A77.3): a free, optional request that staff confirm in writing before payment; no rush charge.\r\n         The paid rush service (15% / 10%) is kept on branch paid-rush-service until it has signed terms. */\r\n      const label = new Date(iso + 'T12:00:00').toLocaleDateString('en-ZA', { day: 'numeric', month: 'long', year: 'numeric' });\r\n      track('rj_date_needed', { working_days: workingDaysUntil(iso, closure) });\r\n      note.innerHTML = `Thanks \u2014 we'll confirm in writing whether we can make ${esc(label)} before you pay.`;\r\n    }\r\n    renderSlot();\r\n  }\r\n  document.addEventListener('change', e => { if (e.target.matches?.('[data-rj-date-needed]')) rushChange(); });\r\n\r\n  /* The tick boxes and fields (RJ-PUB-14A 7.2 and 7.3). Re-drawn only when what they say changes, so ticks are kept. */\r\n  if (!window.__rjDlg) {\r\n    window.__rjDlg = true;\r\n    document.addEventListener('click', e => {\r\n      const b = e.target.closest?.('[data-rj-details]');\r\n      if (b) { e.preventDefault(); e.stopPropagation(); const d = document.getElementById(b.dataset.rjDetails); if (d?.showModal) d.showModal(); else d?.setAttribute('open', ''); return; }\r\n      const c = e.target.closest?.('[data-rj-dlg-close]');\r\n      if (c) { e.preventDefault(); const dc = c.closest('dialog'); if (dc?.close) dc.close(); else dc?.removeAttribute('open'); return; }\r\n      if (e.target.matches?.('dialog.rjr-dlg')) e.target.close?.();\r\n    }, true);\r\n  }\r\n\r\n  function legal() {\r\n    const box = review?.querySelector('[data-rj-legal]');\r\n    if (!box) return;\r\n    const season = window.rjSeason;\r\n    const now = season ? season.now() : Date.now() / 1000;\r\n    const closure = now >= CLOSURE_START && now < REOPEN;\r\n    const festive = now < CLOSURE_START;   // RJ-PUB-16E: ordered by 2 Dec 23:59:59, counted without 21 Dec \u2013 8 Jan\r\n    const dm = !!season?.directMarketing?.();\r\n    const days = basketState.natural ? 40 : 30;\r\n    const by = deliveredBy(days, closure).toLocaleDateString('en-ZA', { day: 'numeric', month: 'long', year: 'numeric' });\r\n    const big = basketState.total >= 10000000;   // R100 000 or more (RJ-PUB-14A section 8)\r\n    const key = [days, closure, dm, big, by].join('|');\r\n    if (box.dataset.key === key) { syncLegal(); return; }\r\n    box.dataset.key = key;\r\n    const period = closure ? `${days} working days from 11 January 2027 (by ${by})` : festive ? `${days} working days of payment, not counting 21 December 2026 to 8 January 2027 while the workshop is closed (by ${by})` : `${days} working days`;\r\n    const deliveryText = closure\r\n      ? `<strong>I understand my piece is made to order for me. Ralph Jacobs makes it from 11 January 2027, when the workshop reopens, and delivers it within ${days} working days of 11 January 2027 (by ${by})</strong> (plus up to 10 working days outside South Africa), as set out in the ${ext('/seasonal/', 'Seasonal, High Season and Closure Policy')} section 8 and ${ext('/terms/#9', 'Terms section 9')}. If Ralph Jacobs is going to be late, they will tell me first and I may choose a new date or a full refund.`\r\n      : `<strong>I understand my piece is made to order for me and will be delivered within ${days} working days</strong> (plus up to 10 working days outside South Africa), as set out in ${ext('/terms/#9', 'Terms section 9')}. If Ralph Jacobs is going to be late, they will tell me first and I may choose a new date or a full refund.`;\r\n    /* RJ-PUB-14A 7.2 v1.1 (Legal, 9 Nov 2026; director: less space): each box has a short line that states the limit and its effect;\r\n       the full 7.2 text, word for word, is in a pop-up (native dialog, opening it never ticks the box). The text-version id of the\r\n       short line goes on the order (ack_*_text). Same texts as the basket (sections/rj-cart.liquid). */\r\n    const tick = (name, html, required = true, id = '', full = '', title = '') => `<label class=\"rjr-tick\"><input type=\"checkbox\" data-rj-ack=\"${name}\"${id ? ` data-rj-ack-text=\"${id}\"` : ''}${required ? ' required' : ''}><span>${html}${full ? ` <button type=\"button\" class=\"rjr-tick__more\" data-rj-details=\"rjr-dlg-${name}\" aria-haspopup=\"dialog\" aria-label=\"Details: ${title}\">Details</button>` : ''}</span></label>`\r\n      + (full ? `<dialog class=\"rjr-dlg\" id=\"rjr-dlg-${name}\" aria-labelledby=\"rjr-dlg-${name}-t\"><div class=\"rjr-dlg__in\"><h2 class=\"rjr-dlg__title\" id=\"rjr-dlg-${name}-t\">${title.charAt(0).toUpperCase() + title.slice(1)}</h2><div class=\"rjr-dlg__body\">${full}</div><button type=\"button\" class=\"rjd-btn rjr-dlg__close\" data-rj-dlg-close>Close</button></div></dialog>` : '');\r\n    const fee = c => rands(Math.round(c * 0.0175)) + ' to ' + rands(Math.round(c * 0.07));\r\n    box.innerHTML = `<p class=\"rjr-legal__title\">Before You Pay</p>\r\n${festive ? '<p class=\"rj-xmas\" data-rj-season=\"xmas\"><strong>Order by 2 December for priority production.</strong> We aim to dispatch before we close on 21 December, but we can&rsquo;t promise delivery before Christmas. Need your piece by a set date? <a href=\"/pages/contact\">Tell us before you order</a> and we&rsquo;ll confirm in writing whether we can make it.</p>' : ''}\r\n<p class=\"rjr-legal__period\">Delivery period for this order: <strong>${period}</strong>${closure ? '' : `, by <strong>${by}</strong>`}.${basketState.mixed ? ' Where the order has natural and laboratory-grown pieces, the longer period applies to the whole order.' : ''}</p>\r\n<fieldset class=\"rjr-field\" data-rj-allergy>\r\n  <legend>Do you have a known metal allergy (for example nickel)?</legend>\r\n  <label><input type=\"radio\" name=\"rj_allergy\" value=\"No\" required> No</label>\r\n  <label><input type=\"radio\" name=\"rj_allergy\" value=\"Yes\"> Yes</label>\r\n  <input type=\"text\" class=\"rjr-input\" data-rj-allergy-which placeholder=\"Please tell us which metal\" aria-label=\"Please tell us which metal\" hidden>\r\n</fieldset>\r\n<label class=\"rjr-field rjr-field--date\"><span><strong>Need it for a particular date?</strong> Tell us the date and we'll confirm in writing whether we can make it before you pay.</span>\r\n  <input type=\"date\" class=\"rjr-input\" data-rj-date-needed min=\"${isoDay(deliveredBy(20, closure))}\"></label>\r\n<p class=\"rjr-rush\" data-rj-rush-note aria-live=\"polite\"></p>\r\n${tick('ack_terms', `I have read and agree to the ${ext('/terms/', 'Terms and Conditions of Sale')}, including the ${ext('/returns/', 'Returns')} and ${ext('/shipping/', 'Shipping')} policies, and I have read the ${ext('/privacy/', 'Privacy Notice')}.`, true, '14A-7.2-A v1.1')}\r\n${tick('ack_delivery_period', closure ? `<strong>Made from 11 January 2027: delivered within ${days} working days, by ${by} if I pay before 11 January.</strong>` : festive ? `<strong>Made to order for me: delivered within ${days} working days of payment, not counting 21 December to 8 January while the workshop is closed (by ${by} if I pay today).</strong>` : `<strong>Made to order for me: delivered within ${days} working days of payment.</strong>`, true, `14A-7.2-B${closure ? '-closure' : festive ? '-festive' : ''} v1.1`, `${festive ? '<p>Working days from 21 December 2026 to 8 January 2027 are not counted, because our workshop is closed then (<a href=\"https://ralphjacobs.org/seasonal/#8\" target=\"_blank\" rel=\"noopener\">Seasonal Policy section 8</a>).</p>' : ''}<p data-rj-delivery-text>${deliveryText}</p>`, 'delivery period')}\r\n${dm\r\n    ? tick('ack_made_to_spec_dm', `<strong>Made to my specification.</strong> Because this purchase followed a direct approach from Ralph Jacobs, I may still cancel within 5 business days <strong>without reason or penalty</strong>.`, true, '14A-7.2-C-DM v1.1', `<p><strong>I understand this piece is made to my specification.</strong> Because this purchase followed a direct approach from Ralph Jacobs, I may still cancel without reason or penalty within five business days of the later of placing my order or delivery (${ext('/terms/#8A', 'Terms section 8A')}).</p>`, 'made to my specification, direct approach')\r\n    : tick('ack_made_to_spec', `<strong>Made to my specification, so the 7-day online cooling-off right does not apply.</strong> My rights if it is defective or not as described are not affected.`, true, '14A-7.2-C v1.1', `<p><strong>I understand this piece is made to my specification, so the seven-day online cooling-off right does not apply to it</strong> (${ext('/terms/#8A', 'Terms section 8A')}). My rights if the piece is defective or not as described are not affected.</p>`, 'made to my specification')}\r\n${tick('ack_cancellation_schedule', `<strong>If I cancel when no cooling-off right applies, cancellation charges apply:</strong> at least R172.50 plus the payment fee (about 1.75%\u20137%, roughly ${rands(Math.round(basketState.total * 0.0175)).replace(' ', '')}\u2013${rands(Math.round(basketState.total * 0.07)).replace(' ', '')} on this order), and up to the full price once production has started.`, true, '14A-7.2-D v1.1', `<p class=\"rjr-legal__fees\">If you cancel when no cooling-off right applies: an administration charge of R150 + VAT (R 172.50) and the payment-processing fee on your payment (about 1.75% to 7%, ${fee(basketState.total)} on this order).</p><p><strong>I have read how cancellation charges work</strong> (${ext('/terms/#13A', 'Terms section 13A')}). If I cancel this order when no cooling-off right applies and Ralph Jacobs has not failed to deliver, I pay the unrecoverable charges (the payment-processing fee on my payment of about 1.75% to 7%, any refund fee, an administration charge of R150, and USD 35 if a stone has to go back to the supplier, plus VAT) and, depending on how far production has gone, the committed cost up to the full price.</p>`, 'cancellation charges')}\r\n${big\r\n    ? `<p class=\"rjr-legal__big\"><em>Because your order is R100 000 or more, we will take you through the liability terms individually as part of verification.</em></p>`\r\n    : tick('ack_liability_limit', `<strong>Ralph Jacobs's liability is limited:</strong> no indirect loss (for example wedding or event costs if my piece is late), and other liability is capped at the greater of R50&nbsp;000 or 20% of what I paid. <strong>My refund, repair or replacement rights are not affected.</strong>`, true, '14A-7.2-E v1.1', `<p><strong>I have read the limits on Ralph Jacobs's liability</strong> (${ext('/terms/#17', 'Terms section 17')}): they are not liable for indirect or consequential loss, including the cost of a wedding, engagement or other occasion if my piece is late, and other liability is capped at the greater of R50 000 or 20% of what I paid. <strong>This does not reduce any refund, repair or replacement I am entitled to.</strong></p>`, 'liability limits')}\r\n${tick('marketing_opt_in', 'Send me news and offers from Ralph Jacobs by e-mail. I can unsubscribe at any time.', false)}\r\n<p class=\"rjr-legal__hint\" data-rj-legal-hint>Tick the boxes above to continue.</p>`;\r\n    box.dataset.period = period;\r\n    box.dataset.closure = closure ? '1' : '';\r\n    box.dataset.minLabel = deliveredBy(20, closure).toLocaleDateString('en-ZA', { day: 'numeric', month: 'long', year: 'numeric' });\r\n    box.dataset.ringByLabel = deliveredBy(basketState.ringNatural ? 40 : 30, closure).toLocaleDateString('en-ZA', { day: 'numeric', month: 'long', year: 'numeric' });\r\n    box.dataset.by = deliveredBy(days, closure).toISOString().slice(0, 10);\r\n    box.dataset.big = big ? '1' : '';\r\n    box.dataset.dm = dm ? 'true' : (season?.utm?.() ? 'false' : 'unknown');\r\n    box.dataset.seasonal = '3.4';   // Seasonal 3.4 with Terms 3.15 (Legal RJ-PUB-16B v1.3, 16E)\r\n    box.dataset.deliveryText = (box.querySelector('[data-rj-delivery-text]')?.textContent || '').replace(/\\s+/g, ' ').trim();\r\n    basketState.rush = null;\r\n    syncLegal();\r\n  }\r\n\r\n  /* The button is disabled until every required box is ticked (RJ-PUB-14A 7.1). */\r\n  function syncLegal() {\r\n    const box = review?.querySelector('[data-rj-legal]');\r\n    const btn = review?.querySelector('[data-rj-ring-add]');\r\n    if (!box || !btn) return;\r\n    const ok = [...box.querySelectorAll('[data-rj-ack][required]')].every(x => x.checked);\r\n    if (!btn.dataset.unavailable) btn.disabled = !ok;\r\n    const hint = box.querySelector('[data-rj-legal-hint]');\r\n    if (hint) hint.hidden = ok;\r\n    const yes = box.querySelector('input[name=\"rj_allergy\"][value=\"Yes\"]')?.checked;\r\n    const which = box.querySelector('[data-rj-allergy-which]');\r\n    if (which) which.hidden = !yes;\r\n  }\r\n\r\n  document.addEventListener('change', e => { if (e.target.closest?.('[data-rj-legal]')) syncLegal(); });\r\n  document.addEventListener('click', async e => {\r\n    const b = e.target.closest?.('[data-rj-basket-remove]');\r\n    if (!b) return;\r\n    b.disabled = true;\r\n    const updates = Object.fromEntries(b.dataset.rjBasketRemove.split(',').map(k => [k, 0]));\r\n    await post('/cart/update.js', { updates }).catch(() => {});\r\n    refreshCount();\r\n    basket();\r\n  });\r\n  /* ---------- Your Ring: wedding band offer (proxy src/ring.ts [data-rj-band]) ----------\r\n     The 4 most popular bands (2 on phones) in the setting's metal with the centre stone's stone type. Picking one puts it in\r\n     the basket with this ring (_rj_band) and shows it as its own card under the ring (photo, price at 20% off, band size,\r\n     Change / Remove). \"View All Wedding Bands\" opens every band in the ring's metal in this tab; the page is remembered\r\n     (sessionStorage rj_ring_return) and a band page's \"Add This Band To My Ring\" (snippets/rj-band-options) comes back here\r\n     with that band (sessionStorage rj_band_pick). */\r\n  async function addBand(p) {\r\n    if (!basketState.inCart) { basketState.band = p; await basket(); return; }\r\n    const old = basketState.band?.key;\r\n    if (old) await post('/cart/update.js', { updates: { [old]: 0 } }).catch(() => {});\r\n    const props = { 'Wedding band for': ringCode, _rj_band: ringCode };\r\n    const rs = review.querySelector('[data-rj-size]')?.value;\r\n    if (rs) props['Ring size'] = rs;\r\n    await post('/cart/add.js', { items: [{ id: p.variant, quantity: 1, properties: props }] }).catch(() => {});\r\n    refreshCount();\r\n    await basket();\r\n  }\r\n  function bandOffer() {\r\n    const box = review?.querySelector('[data-rj-band]');\r\n    if (!box) return;\r\n    box.querySelector('[data-rj-band-chosen]')?.remove();   // the chosen band is a card under the ring now\r\n    // the 4 most popular of the centre stone's type (the list is in best-selling order); the 3rd and 4th hidden on phones\r\n    let n = 0;\r\n    const type = box.dataset.want || 'natural';\r\n    box.querySelectorAll('[data-rj-band-stone]').forEach(li => {\r\n      const mine = li.dataset.rjBandStone === type;\r\n      li.hidden = !mine || n >= 4;\r\n      li.classList.toggle('is-more', mine && n >= 2);\r\n      if (mine) n++;\r\n    });\r\n    // View All: every band in the ring's metal, in this tab; this page is remembered for the way back\r\n    const m = box.dataset.metal || '';\r\n    const metalTag = m === 'platinum' ? m : m.split('-').slice(-1).concat(m.split('-').slice(0, -1)).join('-');\r\n    const all = box.querySelector('[data-rj-band-all]');\r\n    if (all && metalTag) all.href = '/collections/wedding-bands/' + metalTag;\r\n    all?.addEventListener('click', () => { try { sessionStorage.setItem('rj_ring_return', location.href); } catch {} });\r\n\r\n    const card = () => review.querySelector('[data-rj-band-card]');\r\n    const mark = () => {\r\n      const b = basketState.band;\r\n      box.querySelectorAll('[data-rj-band-pick]').forEach(x => { const on = !!b && Number(x.dataset.rjBandPick) === b.variant; x.classList.toggle('is-active', on); x.setAttribute('aria-pressed', on); });\r\n      let c = card();\r\n      if (!b) { c?.remove(); box.hidden = false; return; }\r\n      box.hidden = true;\r\n      if (!c) { c = document.createElement('div'); c.className = 'rjr-part rjr-part--band'; c.setAttribute('data-rj-band-card', ''); box.before(c); }\r\n      c.innerHTML = `${b.img ? `<img src=\"${esc(b.img)}${b.inCart ? (b.img.includes('?') ? '&' : '?') + 'width=400' : ''}\" alt=\"\" width=\"160\" height=\"160\" loading=\"lazy\">` : ''}\r\n  <div>\r\n    <p class=\"rjr-kicker\">Wedding Band \u00B7 20% Off With Your Ring</p>\r\n    <h2>${b.url ? `<a href=\"${esc(b.url)}\">${esc(b.title)}</a>` : esc(b.title)}</h2>\r\n    <p class=\"rjr-price\"><s class=\"rjr-basket__was\">${rands(b.cents)}</s> ${rands(b.sale)}</p>\r\n    <label class=\"rjr-band__size\">Wedding Band Size<select data-rj-band-size>${sizeOptions(b.size || '', 'Same As My Ring')}</select></label>\r\n    <p class=\"rjr-band__actions\"><button type=\"button\" class=\"rjr-change rjr-remove\" data-rj-band-change>Change Wedding Band</button> <button type=\"button\" class=\"rjr-change rjr-remove\" data-rj-band-remove>Remove</button></p>\r\n  </div>`;\r\n    };\r\n    bandMark = mark;\r\n    const pick = p => ({ variant: Number(p.dataset.rjBandPick), title: p.dataset.title, cents: Number(p.dataset.cents), sale: Number(p.dataset.sale), img: p.dataset.img, url: p.dataset.url });\r\n    box.addEventListener('click', e => {\r\n      const p = e.target.closest('[data-rj-band-pick]');\r\n      if (p) { p.disabled = true; addBand(pick(p)).finally(() => { p.disabled = false; }); }\r\n    });\r\n    review.addEventListener('click', async e => {\r\n      if (e.target.closest('[data-rj-band-remove]')) {\r\n        const k = basketState.band?.key;\r\n        basketState.band = null;\r\n        if (k) { await post('/cart/update.js', { updates: { [k]: 0 } }).catch(() => {}); refreshCount(); await basket(); } else await basket();\r\n        return;\r\n      }\r\n      if (e.target.closest('[data-rj-band-change]')) { box.hidden = false; box.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\r\n    });\r\n    mark();\r\n    if (!box.hidden) track('view_promotion', { promotion_name: 'Wedding band 20% off with a ring', items: [...box.querySelectorAll('li:not([hidden]) [data-rj-band-pick]')].map(x => ({ item_id: x.dataset.rjBandPick, item_name: x.dataset.title, price: Number(x.dataset.sale) / 100 })) });\r\n  }\r\n\r\n  if (review) {\r\n    document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') basket(); });\r\n    // sizes are saved on the basket lines as they are chosen\r\n    review.addEventListener('change', e => {\r\n      const t = e.target;\r\n      if (t.matches('[data-rj-size]') && t.dataset.key) setLineProp(t.dataset.key, 'Ring size', t.value);\r\n      else if (t.matches('[data-rj-band-size]') && basketState.band?.key) setLineProp(basketState.band.key, 'Ring size', t.value || review.querySelector('[data-rj-size]')?.value || '');\r\n      else if (t.matches('[data-rj-line-size]')) setLineProp(t.dataset.rjLineSize, 'Ring size', t.value);\r\n    });\r\n    review.addEventListener('click', async e => {\r\n      // \"Change Setting / Diamond\": the ring that comes back from the builder replaces this one in the basket\r\n      if (e.target.closest('a[data-rj-change]')) { try { ringCode && sessionStorage.setItem('rj_change_ring', ringCode); } catch {} return; }\r\n      const rm = e.target.closest('[data-rj-ring-remove]');\r\n      if (rm) {\r\n        rm.disabled = true;\r\n        const keys = (basketState.cart?.items || []).filter(i => ringCode && (i.properties?._rj_ring === ringCode || i.properties?._rj_band === ringCode)).map(i => i.key);\r\n        if (keys.length) await post('/cart/update.js', { updates: Object.fromEntries(keys.map(k => [k, 0])) }).catch(() => {});\r\n        write(null);\r\n        location.href = '/cart';\r\n      }\r\n    });\r\n    bandOffer();\r\n    const b0 = review.querySelector('[data-rj-ring-add]');\r\n    if (b0?.disabled) b0.dataset.unavailable = '1';   // the setting is sold out: stays disabled whatever is ticked\r\n    // 2026-11-07 (owner): the basket is Shopify's cart page (sections/rj-cart). The ring goes in, then the basket opens;\r\n    // this page stays only when the ring can't go in (a stone that doesn't fit the setting, sold, ordering paused).\r\n    review.classList.add('rjr-adding');\r\n    // 2026-11-09 (owner): the live stock check with the supplier can take 10\u201315 s, so show what is happening (not a static page)\r\n    const prog = addingProgress();\r\n    (async () => {\r\n      ringCode = await ensureRing(prog.step);\r\n      if (ringCode) { prog.step(3); location.replace('/cart'); return; }\r\n      prog.done();\r\n      review.classList.remove('rjr-adding');\r\n      await basket();\r\n      // back from a band page with a band chosen there\r\n      try {\r\n        const back = JSON.parse(sessionStorage.getItem('rj_band_pick') || 'null');\r\n        if (back?.variant) { sessionStorage.removeItem('rj_band_pick'); await addBand(back); }\r\n      } catch {}\r\n    })();\r\n  }\r\n\r\n  /* 2026-11-07 (owner): the Your Ring page IS the basket. The ring goes into the basket as soon as the customer reaches it\r\n     (ensureRing); size, wedding band and its size are saved on the basket lines as they are chosen; /cart and the cart drawer\r\n     open this page (the setting line keeps its address, _rj_url). Checkout: sizes, tick boxes and fields, the rush order\r\n     charge, what was agreed on the order, then Shopify checkout. */\r\n  /* The steps shown while the ring goes into the basket: a moving bar, each step ticked off as it really happens, and after\r\n     a few seconds a line on why it takes a moment. step(n): 1 stone being checked, 2 basket, 3 opening the basket. */\r\n  function addingProgress() {\r\n    const noun = nounOf(review.dataset.stoneKind);\r\n    const steps = [`Checking your ${noun} is still available with our supplier`, 'Adding your setting and ' + noun + ' to your basket', 'Opening your basket'];\r\n    const box = document.createElement('div');\r\n    box.className = 'rjr-prog'; box.setAttribute('role', 'status'); box.setAttribute('aria-live', 'polite');\r\n    box.innerHTML = '<p class=\"rjr-prog__t\">Building your ring</p><div class=\"rjr-prog__bar\"><span></span></div><ol class=\"rjr-prog__steps\">'\r\n      + steps.map(t => '<li>' + t + '</li>').join('') + '</ol><p class=\"rjr-prog__note\" hidden>We check every ' + noun\r\n      + ' live with our supplier, so you never pay for one that has just been sold elsewhere. This usually takes 10 to 15 seconds.</p>';\r\n    (review.querySelector('h1') || review.firstElementChild)?.after(box);\r\n    const lis = [...box.querySelectorAll('li')], bar = box.querySelector('.rjr-prog__bar span');\r\n    const t0 = Date.now();\r\n    // eases towards 90 % over about 15 s; the real steps push it on\r\n    let floor = 0;\r\n    const tick = setInterval(() => { const p = Math.max(floor, 90 * (1 - Math.exp(-(Date.now() - t0) / 7000))); bar.style.width = p.toFixed(1) + '%'; }, 200);\r\n    const noteT = setTimeout(() => { box.querySelector('.rjr-prog__note').hidden = false; }, 4000);\r\n    const step = n => { lis.forEach((li, i) => { li.classList.toggle('is-done', i < n - 1); li.classList.toggle('is-now', i === n - 1); }); floor = [0, 0, 70, 100][n] || floor; if (n === 3) bar.style.width = '100%'; };\r\n    step(1);\r\n    return { step, done() { clearInterval(tick); clearTimeout(noteT); box.remove(); } };\r\n  }\r\n\r\n  async function ensureRing(step = () => {}) {\r\n    if (review.querySelector('[data-rj-mismatch]') || review.querySelector('[data-rj-ring-add]')?.dataset.unavailable) return '';\r\n    const msg = review.querySelector('.rjd-msg');\r\n    const noun = nounOf(review.dataset.stoneKind);\r\n    const cart = await fetch('/cart.js', { headers: { Accept: 'application/json' } }).then(x => x.json()).catch(() => null);\r\n    const items = cart?.items || [];\r\n    const mineNow = items.find(i => i.properties?._rj_ring && String(i.variant_id) === review.dataset.variant && i.properties?.['Centre stone'] === review.dataset.stoneLabel);\r\n    let replacing = '';\r\n    try { replacing = sessionStorage.getItem('rj_change_ring') || ''; sessionStorage.removeItem('rj_change_ring'); } catch {}\r\n    if (mineNow) {\r\n      const code = mineNow.properties._rj_ring;\r\n      // came back from \"Change \u2026\" to the same ring: nothing to replace\r\n      return code;\r\n    }\r\n    const r = review.dataset.stoneVariant\r\n      ? { ok: true, variantId: Number(review.dataset.stoneVariant), properties: (() => {\r\n          // Moissanite: \"L x W mm\" from the variant's ring.stone_length_mm / stone_width_mm, for the CAD team (same format as diamonds).\r\n          const l = parseFloat(review.dataset.stoneMl), w = parseFloat(review.dataset.stoneMw);\r\n          return l > 0 && w > 0 ? { Measurements: `${l.toFixed(2)} x ${w.toFixed(2)} mm` } : {};\r\n        })() }\r\n      : await fetch(`${DIA}/api/cart-item`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: review.dataset.stone }) }).then(x => x.json()).catch(() => ({ ok: false }));\r\n    if (r.ok) step(2);\r\n    if (!r.ok && r.error === 'SOLD' && window.rjdSoldHtml && !review.querySelector('.rjd-sold')) {\r\n      // just sold: the closest available stones, each opening this same ring with that stone; none \u2192 contact us (rj-diamonds.js)\r\n      const box = document.createElement('div');\r\n      box.innerHTML = window.rjdSoldHtml(r.alternatives || [], review.dataset.stoneLabel || `the ${noun} I chose`, a => {\r\n        const u = new URL(location.href); u.searchParams.set('did', a.id); return u.pathname + u.search;\r\n      });\r\n      (msg || review).after(box.firstChild);\r\n    }\r\n    if (!r.ok) {\r\n      if (msg) msg.textContent = r.error === 'SOLD' ? `Sorry, this ${noun} has just been sold.`\r\n        : r.error === 'ORDERS_CLOSED' || r.error === 'CHECKOUT_OFF' ? 'Online ordering is paused at the moment. Please contact us about this ring.'\r\n        : r.error === 'ENQUIRY_ONLY' ? `A consultant will help you with this ${noun}. Please contact us about this ring.`\r\n        : 'We could not add your ring to your basket. Please try again.';\r\n      return '';\r\n    }\r\n    // replace: the ring being changed (\"Change Setting / Diamond\" on this page), and any ring with this same one-of-a-kind stone.\r\n    // Its wedding band and ring size move to the new ring.\r\n    const old = new Set([replacing].filter(Boolean));\r\n    if (!review.dataset.stoneVariant) items.filter(i => i.variant_id === r.variantId).forEach(i => i.properties?._rj_ring && old.add(i.properties._rj_ring));\r\n    const drop = {};\r\n    let keepBand = null, keepSize = '';\r\n    items.forEach(i => {\r\n      const k = i.properties?._rj_ring || i.properties?._rj_band;\r\n      if (!old.has(k) && !(!review.dataset.stoneVariant && i.variant_id === r.variantId)) return;\r\n      drop[i.key] = 0;\r\n      if (i.properties?._rj_band) keepBand = i;\r\n      if (/^setting$/i.test(i.product_type || '') && i.properties?.['Ring size']) keepSize = i.properties['Ring size'];\r\n    });\r\n    if (Object.keys(drop).length) await post('/cart/update.js', { updates: drop });\r\n    const ring = 'R-' + Date.now().toString(36).toUpperCase().slice(-6);\r\n    const setting = review.querySelector('[data-rj-ring-add]');\r\n    const sp = { 'Centre stone': review.dataset.stoneLabel, Ring: ring, _rj_ring: ring, _rj_url: location.pathname + location.search };\r\n    if (keepSize) sp['Ring size'] = keepSize;\r\n    const add = [\r\n      { id: Number(setting.dataset.settingVariant), quantity: 1, properties: sp },\r\n      { id: r.variantId, quantity: 1, properties: { ...(r.properties || {}), 'Set in': setting.dataset.settingTitle, Ring: ring, _rj_ring: ring } },\r\n    ];\r\n    if (keepBand) add.push({ id: keepBand.variant_id, quantity: 1, properties: { ...keepBand.properties, 'Wedding band for': ring, _rj_band: ring } });\r\n    const res = await post('/cart/add.js', { items: add });\r\n    if (!res.ok) {\r\n      const j = await res.json().catch(() => ({}));\r\n      if (msg) msg.textContent = /already|quantity|stock/i.test(j.description || '') ? `This ${noun} is already in your basket.` : (j.description || 'We could not add your ring to your basket.');\r\n      return '';\r\n    }\r\n    refreshCount();\r\n    track('rj_ring_in_basket', { currency: 'ZAR', value: (Number(String(review.querySelector('[data-rj-ring-total]')?.textContent || '').replace(/[^0-9]/g, '')) || 0) / 100, stone_kind: review.dataset.stoneKind || '', replaced: old.size > 0 });\r\n    return ring;\r\n  }\r\n\r\n  async function addRing(btn) {\r\n    const msg = review.querySelector('.rjd-msg');\r\n    const say = m => { if (msg) msg.textContent = m; };\r\n    const noun = nounOf(review.dataset.stoneKind);\r\n    const size = review.querySelector('[data-rj-size]');\r\n    const box = review.querySelector('[data-rj-legal]');\r\n    if (review.querySelector('[data-rj-mismatch]')) { say(`Please choose a ${noun} that fits this setting.`); return; }\r\n    if (!basketState.inCart) { ringCode = await ensureRing(); await basket(); if (!basketState.inCart) return; }\r\n    if (!size.value) { say('Please choose your ring size.'); size.focus(); return; }\r\n    const noSize = [...review.querySelectorAll('[data-rj-line-size]')].find(s => !s.value);\r\n    if (noSize) { say('Please choose a ring size for each ring and wedding band in your basket.'); noSize.focus(); return; }\r\n    const allergy = box?.querySelector('input[name=\"rj_allergy\"]:checked')?.value;\r\n    const which = box?.querySelector('[data-rj-allergy-which]')?.value.trim();\r\n    if (!allergy) { say('Please tell us whether you have a known metal allergy.'); box?.querySelector('input[name=\"rj_allergy\"]')?.focus(); return; }\r\n    if (allergy === 'Yes' && !which) { say('Please tell us which metal you are allergic to.'); box.querySelector('[data-rj-allergy-which]').focus(); return; }\r\n    const needed = box?.querySelector('[data-rj-date-needed]');\r\n    if (needed?.value && needed.value < needed.min) { say(`The earliest date is ${box.dataset.minLabel}. For an earlier date, please contact us first.`); needed.focus(); return; }\r\n    const missing = [...(box?.querySelectorAll('[data-rj-ack][required]') || [])].find(x => !x.checked);\r\n    if (missing) { say('Please tick the boxes above to continue.'); missing.focus(); return; }\r\n    btn.disabled = true; btn.setAttribute('aria-busy', 'true'); say('');\r\n    try {\r\n      // a wedding band left on \"Same As My Ring\" gets the ring's size\r\n      if (basketState.band?.key && !basketState.band.size) await setLineProp(basketState.band.key, 'Ring size', size.value);\r\n      // Legal 9 Nov (14A \u00A77.3): no paid rush charge. The needed-by date is a free request that staff confirm in writing before\r\n      // payment (stored as date_needed). Any rush line left in a basket from before is removed. Paid version: branch paid-rush-service.\r\n      const oldRush = (basketState.cart?.items || []).filter(i => i.properties?._rj_ring === ringCode && i.properties?.['Rush rate']);\r\n      if (oldRush.length) await post('/cart/update.js', { updates: Object.fromEntries(oldRush.map(i => [i.key, 0])) });\r\n      if (needed?.value && needed.min && needed.value < needed.min) throw new Error(`The earliest date is ${box.dataset.minLabel}. For an earlier date, please contact us first.`);\r\n      const rush = null;\r\n      // What the customer agreed to, on the order (RJ-PUB-14A section 13; the delivery attributes as in snippets/rj-mto-cart)\r\n      const at = new Date().toISOString();\r\n      const acked = n => box.querySelector(`[data-rj-ack=\"${n}\"]`)?.checked ? `true ${at}` : '';\r\n      const attributes = {\r\n        selling_entity: 'Ralph Jacobs SA (Pty) Ltd',\r\n        delivery_country: 'ZA', currency: 'ZAR',\r\n        terms_version: '3.15', 'Terms version': '3.15',\r\n        documents_linked: `terms 3.15, returns 3.13, shipping 3.3, privacy 3.8, seasonal ${box.dataset.seasonal}`,\r\n        ack_terms: acked('ack_terms'),\r\n        ack_delivery_period: acked('ack_delivery_period'),\r\n        ack_made_to_spec: acked('ack_made_to_spec'),\r\n        ack_made_to_spec_dm: acked('ack_made_to_spec_dm'),\r\n        ack_cancellation_schedule: acked('ack_cancellation_schedule'),\r\n        ack_liability_limit: acked('ack_liability_limit'),\r\n        liability_ack_route: box.dataset.big ? 'RJ-CT-10' : 'checkout',\r\n        ...Object.fromEntries(['ack_terms', 'ack_delivery_period', 'ack_made_to_spec', 'ack_made_to_spec_dm', 'ack_cancellation_schedule', 'ack_liability_limit']\r\n          .map(n => { const x = box.querySelector(`[data-rj-ack=\"${n}\"]`); return [`${n}_text`, x?.checked ? (x.dataset.rjAckText || '') : '']; })),\r\n        'Delivery period': box.dataset.period,\r\n        delivery_by_date: box.dataset.by,\r\n        'Delivery terms accepted': 'yes',\r\n        'Delivery terms accepted at': at,\r\n        'Delivery terms text': box.dataset.deliveryText,\r\n        'Seasonal version': box.dataset.seasonal,\r\n        ring_size: size.value,\r\n        metal_allergy: allergy === 'Yes' ? `Yes: ${which}` : 'No',\r\n        date_needed: needed?.value || '',\r\n        rush_order: rush?.charge > 0 ? `yes, ${Math.round(rush.rate * 100)}%, R ${rush.charge.toFixed(2)}, needed by ${needed.value} (${rush.days} working days)` : 'no',\r\n        direct_marketing: box.dataset.dm,\r\n        marketing_opt_in: box.querySelector('[data-rj-ack=\"marketing_opt_in\"]')?.checked ? `true ${at}` : `false ${at}`,\r\n        ...(window.rjSeason?.utmAttributes?.() || {}),\r\n      };\r\n      await post('/cart/update.js', { attributes });\r\n      write(null);\r\n      const items = (basketState.cart?.items || []);\r\n      track('rj_ring_checkout', { currency: 'ZAR', value: (basketState.total + (basketState.rush?.cents || 0)) / 100, band: !!basketState.band, rush: !!(rush?.charge > 0),\r\n        items: items.map(i => ({ item_id: String(i.variant_id), quantity: i.quantity, item_category: i.product_type || '' })) });\r\n      say('Taking you to checkout\u2026');\r\n      location.href = '/checkout';\r\n    } catch (err) {\r\n      say(err.message);\r\n      btn.disabled = false;\r\n    } finally {\r\n      btn.removeAttribute('aria-busy');\r\n    }\r\n  }\r\n\r\n  if (rjd) stones();\r\n  collectionPage();\r\n  settingPage();\r\n  presetPage();\r\n  document.addEventListener('rj:ring-swapped', settingPage);   // metal / shape switched in place (rj-ring.js)\r\n})();\r\n"],
  "mappings": "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",
  "names": ["q", "stones", "d", "n", "amount"]
}
