{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/calli-scratch.js?cb=1792701167514"],
  "sourcesContent": ["/*\n * Calli scratch-card popup.\n * - Opens after `data-delay` seconds on any page, unless the visitor already claimed the code\n *   or closed the popup within the last `data-snooze-days` days.\n * - The email unlocks the card, and the form posts the way Shopify expects: natively, with a page\n *   reload. That is not laziness. Shopify's bot protection puts an `h-captcha-response` field in\n *   this form and only fills it during a real form submission, so posting it in the background with\n *   fetch is ALWAYS rejected with HTTP 400 and the address is silently lost. We set a flag, let the\n *   browser submit, and reopen the card already unlocked when the page comes back.\n * - If anything about that goes wrong the visitor still gets the code: the gate exists to ask for an\n *   address, not to hold it hostage. An earlier version failed closed and left people dragging a\n *   locked card with nothing to explain why.\n * - `claimed` is only written once the code is actually revealed, so a failed or abandoned attempt\n *   does not burn the one showing a visitor gets.\n * - ?scratch forces the popup open for testing; ?scratch=skip also skips the email step.\n *\n * Canvas note: `destination-out` erases by the source alpha, so carve() sets opaque styles.\n * Inheriting the half-transparent styles used to paint the grounds only thins them.\n */\n(() => {\n  const dialog = document.querySelector('[data-calli-scratch]');\n  if (!dialog || typeof dialog.showModal !== 'function') return;\n\n  const KEY = 'calli-scratch';\n  const PENDING = 'calli-scratch-pending';\n  const THRESHOLD = 0.45; // share of the cover cleared before it gives up the rest\n  const root = document.documentElement;\n  const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const designMode = !!(window.Shopify && window.Shopify.designMode);\n  const forcedMatch = location.search.match(/[?&]scratch(?:=([^&]*))?/);\n  const forced = !!forcedMatch;\n  const skipGate = forcedMatch && forcedMatch[1] === 'skip';\n\n  const form = dialog.querySelector('[data-scratch-form]');\n  const submit = dialog.querySelector('[data-scratch-submit]');\n  const note = dialog.querySelector('[data-scratch-note]');\n  const card = dialog.querySelector('[data-scratch-card]');\n  const cover = dialog.querySelector('[data-scratch-cover]');\n  const ctx = cover?.getContext('2d', { willReadFrequently: true });\n  const steps = {\n    form: dialog.querySelector('[data-scratch-step=\"form\"]'),\n    scratch: dialog.querySelector('[data-scratch-step=\"scratch\"]'),\n    result: dialog.querySelector('[data-scratch-step=\"result\"]'),\n  };\n\n  // Storage can throw in private mode; the popup still works, it just can't remember.\n  const read = () => {\n    try {\n      return JSON.parse(localStorage.getItem(KEY) || '{}');\n    } catch (e) {\n      return {};\n    }\n  };\n  const write = (data) => {\n    try {\n      localStorage.setItem(KEY, JSON.stringify(data));\n    } catch (e) {}\n  };\n\n  function shouldShow() {\n    if (forced) return true;\n    const state = read();\n    if (state.claimed) return false;\n    const days = parseFloat(dialog.dataset.snoozeDays) || 1;\n    if (state.closedAt && Date.now() - state.closedAt < days * 864e5) return false;\n    return true;\n  }\n\n  function open() {\n    if (dialog.open) return;\n    // Don't stack on top of the cart drawer or another modal; try again shortly.\n    if (document.querySelector('dialog[open]:modal')) {\n      setTimeout(open, 4000);\n      return;\n    }\n    dialog.showModal();\n    root.setAttribute('scroll-lock', '');\n    requestAnimationFrame(paint);\n    if (skipGate) unlock();\n  }\n\n  function close() {\n    if (!dialog.open) return;\n    dialog.close();\n  }\n\n  dialog.addEventListener('close', () => {\n    root.removeAttribute('scroll-lock');\n    const state = read();\n    if (!state.claimed && !designMode && !forced) write({ ...state, closedAt: Date.now() });\n  });\n  dialog.querySelectorAll('[data-scratch-close]').forEach((b) => b.addEventListener('click', close));\n  // Click on the dimmed backdrop closes too.\n  dialog.addEventListener('click', (e) => {\n    if (e.target === dialog) close();\n  });\n\n  function showStep(name) {\n    Object.entries(steps).forEach(([key, el]) => el && (el.hidden = key !== name));\n  }\n\n  /* ---------- Painting the grounds ---------- */\n\n  let painted = false;\n  let started = false; // true once scratched, so a resize can't wipe progress\n\n  // Canvas letter-spacing is not supported everywhere, so space the glyphs by hand.\n  function fillSpaced(text, cx, cy, spacing) {\n    const chars = [...text];\n    const widths = chars.map((c) => ctx.measureText(c).width);\n    const total = widths.reduce((a, b) => a + b, 0) + spacing * (chars.length - 1);\n    let x = cx - total / 2;\n    chars.forEach((c, i) => {\n      ctx.fillText(c, x, cy);\n      x += widths[i] + spacing;\n    });\n  }\n\n  function paint() {\n    if (!ctx || started) return;\n    const rect = cover.getBoundingClientRect();\n    if (!rect.width || !rect.height) return;\n\n    const dpr = Math.min(window.devicePixelRatio || 1, 2);\n    cover.width = Math.round(rect.width * dpr);\n    cover.height = Math.round(rect.height * dpr);\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    ctx.globalCompositeOperation = 'source-over';\n\n    const w = rect.width;\n    const h = rect.height;\n\n    // Base: roasted browns, lighter at the top left\n    const base = ctx.createLinearGradient(0, 0, w, h);\n    base.addColorStop(0, '#5c3c2b');\n    base.addColorStop(0.5, '#4a2e22');\n    base.addColorStop(1, '#361f16');\n    ctx.fillStyle = base;\n    ctx.fillRect(0, 0, w, h);\n\n    // Ground coffee: thousands of little specks\n    const shades = [\n      'rgba(26, 14, 8, 0.55)',\n      'rgba(126, 90, 64, 0.42)',\n      'rgba(92, 62, 42, 0.5)',\n      'rgba(172, 134, 104, 0.2)',\n    ];\n    const dots = Math.round(w * h * 0.3);\n    for (let i = 0; i < dots; i++) {\n      ctx.fillStyle = shades[(Math.random() * shades.length) | 0];\n      ctx.beginPath();\n      ctx.arc(Math.random() * w, Math.random() * h, Math.random() * 1.7 + 0.3, 0, 6.2832);\n      ctx.fill();\n    }\n\n    // Darken the edges so the card reads as a printed panel\n    const vignette = ctx.createRadialGradient(w / 2, h / 2, Math.min(w, h) * 0.25, w / 2, h / 2, Math.max(w, h) * 0.75);\n    vignette.addColorStop(0, 'rgba(0, 0, 0, 0)');\n    vignette.addColorStop(1, 'rgba(0, 0, 0, 0.4)');\n    ctx.fillStyle = vignette;\n    ctx.fillRect(0, 0, w, h);\n\n    // Hairline frame\n    ctx.strokeStyle = 'rgba(246, 239, 223, 0.22)';\n    ctx.lineWidth = 1.5;\n    ctx.setLineDash([6, 6]);\n    ctx.strokeRect(10, 10, w - 20, h - 20);\n    ctx.setLineDash([]);\n\n    // Label\n    const family = getComputedStyle(card).fontFamily || 'sans-serif';\n    const size = Math.max(11, Math.min(15, w * 0.038));\n    ctx.font = `600 ${size}px ${family}`;\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    ctx.fillStyle = 'rgba(246, 239, 223, 0.82)';\n    fillSpaced(dialog.dataset.coverLabel || 'SCRATCH HERE', w / 2, h / 2, size * 0.26);\n\n    painted = true;\n  }\n\n  // Repaint on resize, but only while the cover is still untouched.\n  if (window.ResizeObserver && cover) {\n    new ResizeObserver(() => {\n      if (!started && dialog.open) paint();\n    }).observe(cover);\n  }\n\n  /* ---------- Scratching ---------- */\n\n  function pointAt(e) {\n    const rect = cover.getBoundingClientRect();\n    return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n  }\n\n  function carve(from, to) {\n    const radius = Math.max(16, cover.getBoundingClientRect().width * 0.07);\n    ctx.globalCompositeOperation = 'destination-out';\n    // Both styles must be fully opaque or this only thins the grounds (see the note up top).\n    ctx.strokeStyle = '#000';\n    ctx.fillStyle = '#000';\n    ctx.lineWidth = radius * 2;\n    ctx.lineCap = 'round';\n    ctx.lineJoin = 'round';\n    ctx.beginPath();\n    ctx.moveTo(from.x, from.y);\n    ctx.lineTo(to.x, to.y);\n    ctx.stroke();\n    ctx.beginPath();\n    ctx.arc(to.x, to.y, radius, 0, 6.2832);\n    ctx.fill();\n  }\n\n  // Share of the cover already cleared, sampled every 8th pixel in both directions.\n  function clearedRatio() {\n    if (!painted) return 0;\n    const { width, height } = cover;\n    let data;\n    try {\n      data = ctx.getImageData(0, 0, width, height).data;\n    } catch (e) {\n      return 0;\n    }\n    let clear = 0;\n    let total = 0;\n    for (let y = 0; y < height; y += 8) {\n      const row = y * width * 4;\n      for (let x = 0; x < width * 4; x += 32) {\n        total++;\n        if (data[row + x + 3] < 24) clear++;\n      }\n    }\n    return total ? clear / total : 0;\n  }\n\n  let drawing = false;\n  let last = null;\n  let moves = 0;\n\n  cover?.addEventListener('pointerdown', (e) => {\n    if (card.dataset.state !== 'ready') return;\n    e.preventDefault();\n    drawing = true;\n    started = true;\n    try {\n      cover.setPointerCapture(e.pointerId);\n    } catch (err) {}\n    last = pointAt(e);\n    carve(last, last);\n  });\n\n  cover?.addEventListener('pointermove', (e) => {\n    if (!drawing) return;\n    const point = pointAt(e);\n    carve(last, point);\n    last = point;\n    // Checking the pixels is the expensive bit, so only do it every few moves.\n    if (++moves % 6 === 0 && clearedRatio() >= THRESHOLD) finish();\n  });\n\n  ['pointerup', 'pointercancel', 'pointerleave'].forEach((type) => {\n    cover?.addEventListener(type, () => {\n      if (!drawing) return;\n      drawing = false;\n      if (clearedRatio() >= THRESHOLD) finish();\n    });\n  });\n\n  /* ---------- States ---------- */\n\n  function unlock() {\n    if (card.dataset.state !== 'locked') return;\n    card.dataset.state = 'ready';\n    showStep('scratch');\n    paint();\n    // Reduced motion: dragging is the whole interaction, so hand the code straight over.\n    if (reduceMotion) finish();\n  }\n\n  function finish() {\n    if (card.dataset.state === 'done') return;\n    drawing = false;\n    card.dataset.state = 'done';\n    if (!designMode && !forced) write({ claimed: true, at: Date.now() });\n    showStep('result');\n  }\n\n  dialog.querySelectorAll('[data-scratch-reveal]').forEach((b) => b.addEventListener('click', finish));\n\n  function say(message, tone) {\n    if (!note) return;\n    note.textContent = message;\n    note.dataset.tone = tone || '';\n    note.hidden = false;\n  }\n\n  /* ---------- The email gate ---------- */\n\n  form?.addEventListener('submit', (e) => {\n    if (!form.reportValidity()) {\n      e.preventDefault();\n      return;\n    }\n    note && (note.hidden = true);\n    // In the theme editor, never post: editing a section must not create real customers.\n    if (designMode) {\n      e.preventDefault();\n      unlock();\n      return;\n    }\n    // Deliberately NOT preventDefault. Shopify's bot protection only fills the form's\n    // h-captcha-response during a native submit, so fetch would 400 and lose the address.\n    // Leave a flag and finish the card when the page comes back.\n    try {\n      sessionStorage.setItem(PENDING, '1');\n    } catch (err) {}\n    say('One moment...', '');\n    // Deferred on purpose: disabling the submitter DURING the submit event cancels the\n    // submission in Chrome and Safari. Let the post start, then block a second click.\n    setTimeout(() => {\n      submit.disabled = true;\n    }, 0);\n    // Shopify's invisible hCaptcha guards this form, and it cannot always complete above a\n    // modal dialog's top layer. When that happens the post never leaves and the page never\n    // navigates. Never strand the visitor on a spinner: give them the card regardless.\n    setTimeout(() => {\n      if (card.dataset.state !== 'locked') return;\n      try {\n        sessionStorage.removeItem(PENDING);\n      } catch (err) {}\n      submit.disabled = false;\n      say('We could not save your email just now, but your card is unlocked anyway.', 'warn');\n      unlock();\n    }, 6000);\n  });\n\n  dialog.querySelector('[data-scratch-copy]')?.addEventListener('click', async (e) => {\n    const btn = e.currentTarget;\n    try {\n      await navigator.clipboard.writeText(dialog.dataset.code);\n      btn.textContent = 'Copied';\n    } catch (err) {\n      btn.textContent = 'Select it above';\n    }\n    setTimeout(() => (btn.textContent = 'Copy'), 2000);\n  });\n\n  /* Theme editor: show the popup only while its section is selected. */\n  if (designMode) {\n    document.addEventListener('shopify:section:select', (e) => {\n      if (e.target.contains(dialog)) open();\n    });\n    document.addEventListener('shopify:section:deselect', (e) => {\n      if (e.target.contains(dialog)) close();\n    });\n    return;\n  }\n\n  /* Back from Shopify's own form post: the address is saved, so hand the card straight over. */\n  let pending = false;\n  try {\n    pending = sessionStorage.getItem(PENDING) === '1';\n    sessionStorage.removeItem(PENDING);\n  } catch (err) {}\n  if (pending && /customer_posted=true/.test(location.search)) {\n    // Tidy the URL so a reload is not mistaken for another signup, and drop the\n    // #contact_form hash that would otherwise jump the page to the footer form.\n    try {\n      const url = new URL(location.href);\n      url.searchParams.delete('customer_posted');\n      url.hash = '';\n      history.replaceState(null, '', url);\n    } catch (err) {}\n    open();\n    unlock();\n    return;\n  }\n\n  if (!shouldShow()) return;\n  // ?scratch opens it straight away for testing; everyone else waits out the delay,\n  // counted from when they landed rather than from when this script finished loading.\n  const delay = forced ? 0 : (parseFloat(dialog.dataset.delay) || 25) * 1000;\n  setTimeout(() => shouldShow() && open(), Math.max(0, delay - performance.now()));\n})();\n"],
  "mappings": "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",
  "names": []
}
