{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/tb-like.js?x=1794560342343"],
  "sourcesContent": ["/* Toybox likes: a public heart and like count on product cards and product pages.\n   Counts live in Supabase (table product_likes, function toggle_like). snippets/tb-likes sets\n   window.TbLikes = { url, key }. Anyone can like, once per browser. Without settings the hearts stay hidden.\n   Markup: <tb-like data-id=\"{{ product.id }}\" data-title=\"...\" [data-pdp]>. Styles in assets/tb-like.css. */\n(() => {\n  const cfg = window.TbLikes || {};\n  const ready = !!(cfg.url && cfg.key);\n  const LIKED = 'tb-liked';\n  const DEVICE = 'tb-device';\n  const HEART = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 20s-7-4.4-7-10a4 4 0 017-2.6A4 4 0 0119 10c0 5.6-7 10-7 10z\"/></svg>';\n  const api = String(cfg.url || '').replace(/\\/+$/, '');\n  const headers = { apikey: cfg.key, 'Content-Type': 'application/json' };\n  const read = () => { try { return JSON.parse(localStorage.getItem(LIKED)) || []; } catch (e) { return []; } };\n  const write = (l) => { try { localStorage.setItem(LIKED, JSON.stringify(l)); } catch (e) {} };\n  const uuid = () => (window.crypto && crypto.randomUUID ? crypto.randomUUID() : '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) => (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)));\n  const device = () => {\n    let d = '';\n    try { d = localStorage.getItem(DEVICE) || ''; } catch (e) {}\n    if (!d) { d = uuid(); try { localStorage.setItem(DEVICE, d); } catch (e) {} }\n    return d;\n  };\n  const counts = new Map();\n  const queue = new Set();\n  let timer;\n  const changed = () => document.dispatchEvent(new CustomEvent('tb:likes'));\n\n  /* Counts for every heart on the page are fetched together, in one request. */\n  const load = async () => {\n    const ids = [...queue].filter((id) => !counts.has(id));\n    queue.clear();\n    if (!ids.length) return;\n    let rows = [];\n    try {\n      const r = await fetch(api + '/rest/v1/product_likes?select=product_id,likes&product_id=in.(' + ids.join(',') + ')', { headers });\n      if (r.ok) rows = await r.json();\n    } catch (e) {}\n    ids.forEach((id) => counts.set(id, 0));\n    rows.forEach((x) => counts.set(String(x.product_id), x.likes));\n    changed();\n  };\n  const want = (id) => {\n    if (counts.has(id) || queue.has(id)) return;\n    queue.add(id);\n    clearTimeout(timer);\n    timer = setTimeout(load, 80);\n  };\n  const short = (n) => (n >= 1000 ? String(Math.round(n / 100) / 10).replace(/\\.0$/, '') + 'k' : String(n));\n  const sentence = (n) => '<b>' + n.toLocaleString('en-IN') + '</b> ' + (n === 1 ? 'person likes this' : 'people like this');\n\n  class TbLike extends HTMLElement {\n    connectedCallback() {\n      if (!ready || !/^\\d+$/.test(this.dataset.id || '')) { this.hidden = true; return; }\n      if (!this.btn) this.build();\n      document.addEventListener('tb:likes', this.sync);\n      this.sync();\n      want(this.dataset.id);\n    }\n    disconnectedCallback() {\n      if (this.sync) document.removeEventListener('tb:likes', this.sync);\n    }\n    build() {\n      const pdp = this.hasAttribute('data-pdp');\n      this.innerHTML = '<button type=\"button\" class=\"tb-like__btn\" aria-pressed=\"false\">' + HEART + (pdp ? '<span class=\"tb-like__lbl\" data-l>Like</span>' : '<span class=\"tb-like__n\" data-n></span>') + '</button>' + (pdp ? '<span class=\"tb-like__text\" data-t aria-live=\"polite\"></span>' : '');\n      this.btn = this.querySelector('button');\n      this.sync = () => {\n        const id = this.dataset.id;\n        const liked = read().includes(id);\n        const n = counts.get(id);\n        const name = this.dataset.title || 'this toy';\n        this.btn.setAttribute('aria-pressed', liked ? 'true' : 'false');\n        this.btn.setAttribute('aria-label', (liked ? 'Unlike ' : 'Like ') + name + (n ? ' (' + n + (n === 1 ? ' like)' : ' likes)') : ''));\n        const l = this.querySelector('[data-l]');\n        if (l) l.textContent = liked ? 'Liked' : 'Like';\n        const t = this.querySelector('[data-t]');\n        if (t) t.innerHTML = n == null ? '' : (n > 0 ? sentence(n) : 'Be the first to like this');\n        const c = this.querySelector('[data-n]');\n        if (c) c.textContent = n > 0 ? short(n) : '';\n        this.classList.toggle('has-likes', n > 0);\n      };\n      this.btn.addEventListener('click', (e) => this.toggle(e));\n    }\n    async toggle(e) {\n      e.preventDefault();\n      e.stopPropagation();\n      if (this.busy) return;\n      this.busy = true;\n      const id = this.dataset.id;\n      const before = read();\n      const was = before.includes(id);\n      const n = counts.get(id) || 0;\n      write(was ? before.filter((x) => x !== id) : [id, ...before]);\n      counts.set(id, Math.max(0, n + (was ? -1 : 1)));\n      changed();\n      this.btn.classList.remove('is-bump');\n      void this.btn.offsetWidth;\n      if (!was) this.btn.classList.add('is-bump');\n      try {\n        const r = await fetch(api + '/rest/v1/rpc/toggle_like', { method: 'POST', headers, body: JSON.stringify({ pid: Number(id), did: device(), liked: !was }) });\n        if (!r.ok) throw new Error('like');\n        const c = await r.json();\n        if (typeof c === 'number') counts.set(id, c);\n      } catch (err) {\n        write(before);\n        counts.set(id, n);\n      }\n      this.busy = false;\n      changed();\n    }\n  }\n  customElements.get('tb-like') || customElements.define('tb-like', TbLike);\n  window.addEventListener('storage', (e) => { if (e.key === LIKED) changed(); });\n})();\n"],
  "mappings": "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",
  "names": []
}
