{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/tb-cart.js?x=1794560340067"],
  "sourcesContent": ["/* Gift wrap in the cart drawer and cart page (snippets/tb-cart-extras.liquid).\n   Wrap is charged per item: the cart option adds one Gift wrap line (Wrap: Whole order) with a quantity\n   equal to the items not already wrapped from their product page, plus the gift message and From name.\n   When items are added or removed later, the wrap lines are resized to match: on load, whenever Horizon\n   redraws the cart and updates this element's data-* counts (it updates in place without reconnecting\n   it), and after every cart:update as a fallback.\n   Shoppers can't change a gift wrap line themselves: its +/\u2212 and remove buttons are hidden (CSS in\n   tb-cart-extras) and its quantity box is made read-only here.\n   The gift message folds away behind a one-line preview once saved: \"Edit message\" opens it, \"Save\n   message\" saves and folds it again. */\nclass TbGiftWrap extends HTMLElement {\n  connectedCallback() {\n    this.box = this.querySelector('[data-toggle]');\n    this.msg = this.querySelector('[data-msg]');\n    this.from = this.querySelector('[data-from]');\n    this.left = this.querySelector('[data-left]');\n    this.box?.addEventListener('change', () => this.toggle());\n    this.msg?.addEventListener('input', () => { if (this.left) this.left.textContent = this.msg.value.length + ' / 150'; });\n    this.msg?.addEventListener('change', () => this.saveMessage());\n    this.from?.addEventListener('change', () => this.saveMessage());\n    this.querySelector('[data-msg-edit]')?.addEventListener('click', () => this.openMessage(true));\n    this.querySelector('[data-msg-done]')?.addEventListener('click', () => this.doneMessage());\n    this.check = (wait) => { clearTimeout(this.checkT); this.checkT = setTimeout(() => { this.lockRows(); this.sync(); }, wait); };\n    this.onCart = () => this.check(600);\n    document.addEventListener('cart:update', this.onCart);\n    if ('MutationObserver' in window) {\n      this.mo = new MutationObserver(() => this.check(150));\n      this.mo.observe(this, { attributes: true });\n    }\n    // Run after the cart finishes rendering, so two copies (drawer and cart page) don't both act.\n    this.check(0);\n  }\n  disconnectedCallback() {\n    if (this.onCart) document.removeEventListener('cart:update', this.onCart);\n    if (this.mo) this.mo.disconnect();\n    clearTimeout(this.checkT);\n  }\n  get need() { return parseInt(this.dataset.need, 10) || 0; }\n  attrs() {\n    return [\n      { key: 'Wrap', value: 'Whole order' },\n      { key: 'Gift message', value: (this.msg?.value || '').trim() },\n      { key: 'From', value: (this.from?.value || '').trim() }\n    ];\n  }\n\n  /* Message panel: open for editing, or folded behind the preview line. */\n  openMessage(focus) {\n    const wrap = this.querySelector('[data-msg-wrap]');\n    const sum = this.querySelector('[data-msg-sum]');\n    if (wrap) wrap.hidden = false;\n    if (sum) sum.hidden = true;\n    this.querySelector('[data-msg-edit]')?.setAttribute('aria-expanded', 'true');\n    if (focus) this.msg?.focus();\n  }\n  foldMessage() {\n    const text = (this.msg?.value || '').trim();\n    const wrap = this.querySelector('[data-msg-wrap]');\n    const sum = this.querySelector('[data-msg-sum]');\n    if (!text || !sum) return;\n    sum.querySelector('[data-sum-msg]').textContent = '\u201C' + text + '\u201D';\n    const who = (this.from?.value || '').trim();\n    const f = sum.querySelector('[data-sum-from]');\n    if (f) { f.textContent = '\u2014 ' + who; f.hidden = !who; }\n    if (wrap) wrap.hidden = true;\n    sum.hidden = false;\n    const edit = sum.querySelector('[data-msg-edit]');\n    edit?.setAttribute('aria-expanded', 'false');\n    edit?.focus();\n  }\n  doneMessage() {\n    this.saveMessage();\n    this.foldMessage();\n  }\n\n  /* Gift wrap lines follow the toys, so their quantity box can't be typed into. */\n  lockRows() {\n    document.querySelectorAll('.cart-items__table-row').forEach((row) => {\n      if (!row.querySelector('a.cart-items__title[href^=\"/products/gift-wrap\"]')) return;\n      row.querySelectorAll('input[name=\"updates[]\"]').forEach((input) => {\n        input.readOnly = true;\n        input.tabIndex = -1;\n        input.setAttribute('aria-label', 'Gift wrap quantity, set by your gift-wrapped items');\n      });\n    });\n  }\n\n  /* Resize wrap lines that no longer match the items in the cart. */\n  sync() {\n    if (window.tbWrapSyncing) { this.check(1600); return; }\n    // A tick or untick is waiting: apply it before anything else.\n    if (this.want != null) { if (this.classList.contains('is-busy')) this.check(800); else this.reconcile(); return; }\n    const fixes = [];\n    const line = this.dataset.line;\n    if (line && (parseInt(this.dataset.qty, 10) || 0) !== this.need) fixes.push({ id: line, quantity: this.need });\n    const itemLine = this.dataset.itemLine;\n    const wrapped = parseInt(this.dataset.wrapped, 10) || 0;\n    if (itemLine && (parseInt(this.dataset.itemQty, 10) || 0) !== wrapped) fixes.push({ id: itemLine, quantity: wrapped });\n    // A toy marked \"Gift wrap: Yes\" with no item wrap line (put back after being removed): add the line back.\n    if (!itemLine && wrapped > 0 && this.dataset.variant) fixes.push({ merchandiseId: 'gid://shopify/ProductVariant/' + this.dataset.variant, quantity: wrapped, attributes: [] });\n    if (!fixes.length) return;\n    window.tbWrapSyncing = true;\n    this.run(fixes).finally(() => { setTimeout(() => { window.tbWrapSyncing = false; }, 1500); });\n  }\n\n  async run(lines) {\n    this.classList.add('is-busy');\n    const actions = window.Shopify && window.Shopify.actions;\n    try {\n      if (actions && actions.updateCart) {\n        const res = await actions.updateCart({ lines }, { event: { context: 'cart' } });\n        if (res && res.userErrors && res.userErrors.length) throw new Error(res.userErrors[0].message);\n      } else {\n        const updates = {};\n        for (const l of lines) {\n          if (l.id) updates[l.id] = l.quantity;\n          else await fetch('/cart/add.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ items: [{ id: l.merchandiseId.split('/').pop(), quantity: l.quantity, properties: Object.fromEntries(l.attributes.map((a) => [a.key, a.value])) }] }) });\n        }\n        if (Object.keys(updates).length) await fetch('/cart/update.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ updates }) });\n        location.reload();\n      }\n    } catch (e) {\n      console.error('[Toybox] gift wrap', e);\n      if (this.box) this.box.checked = !this.box.checked;\n    } finally {\n      this.classList.remove('is-busy');\n    }\n  }\n\n  toggle() {\n    const on = this.box.checked;\n    this.classList.toggle('is-on', on);\n    const wrap = this.querySelector('[data-msg-wrap]');\n    const sum = this.querySelector('[data-msg-sum]');\n    if (on) this.openMessage(false);\n    else { if (wrap) wrap.hidden = true; if (sum) sum.hidden = true; }\n    // Remember what the shopper asked for last. If the previous tick or untick is still saving, it's applied\n    // once that finishes (sync), so a quick tick-then-untick can't leave the wrap on and charged.\n    this.want = on;\n    if (this.classList.contains('is-busy')) this.check(800); else this.reconcile();\n  }\n\n  /* Make the whole-order wrap line match the last tick or untick, reading the cart itself rather than this\n     element's data-* (Horizon may not have redrawn them yet). */\n  async reconcile() {\n    const want = this.want;\n    if (want == null) return;\n    this.want = null;\n    this.classList.add('is-busy'); // a tick or untick that comes in meanwhile waits for this one\n    try {\n      const c = await fetch('/cart.js', { headers: { Accept: 'application/json' } }).then((r) => r.json());\n      let toys = 0, wrapped = 0, ord = null;\n      (c.items || []).forEach((it) => {\n        const p = it.properties || {};\n        if (it.handle === 'gift-wrap') { if (p.Wrap === 'Whole order') ord = ord || it.key; }\n        else { toys += it.quantity; if (p['Gift wrap'] === 'Yes') wrapped += it.quantity; }\n      });\n      const need = Math.max(0, toys - wrapped);\n      // Only the whole-order wrap is removed; wraps chosen on product pages stay.\n      if (!want && ord) await this.run([{ id: ord, quantity: 0 }]);\n      else if (want && !ord && need > 0) await this.run([{ merchandiseId: 'gid://shopify/ProductVariant/' + this.dataset.variant, quantity: need, attributes: this.attrs() }]);\n    } catch (e) {\n      console.error('[Toybox] gift wrap', e);\n    } finally {\n      this.classList.remove('is-busy');\n    }\n    if (this.want != null) this.check(300);\n  }\n\n  saveMessage() {\n    if (!this.box?.checked) return;\n    const line = this.dataset.line;\n    const text = (this.msg?.value || '').trim();\n    const who = (this.from?.value || '').trim();\n    // Skip the save when nothing changed since the last one.\n    if (this.saved && this.saved.text === text && this.saved.who === who) return;\n    this.saved = { text, who };\n    if (line) this.run([{ id: line, quantity: this.need, attributes: this.attrs() }]);\n    else if (this.need > 0) this.run([{ merchandiseId: 'gid://shopify/ProductVariant/' + this.dataset.variant, quantity: this.need, attributes: this.attrs() }]);\n  }\n}\ncustomElements.get('tb-gift-wrap') || customElements.define('tb-gift-wrap', TbGiftWrap);"],
  "mappings": "AAUA,MAAM,mBAAmB,WAAY,CACnC,mBAAoB,CAClB,KAAK,IAAM,KAAK,cAAc,eAAe,EAC7C,KAAK,IAAM,KAAK,cAAc,YAAY,EAC1C,KAAK,KAAO,KAAK,cAAc,aAAa,EAC5C,KAAK,KAAO,KAAK,cAAc,aAAa,EAC5C,KAAK,KAAK,iBAAiB,SAAU,IAAM,KAAK,OAAO,CAAC,EACxD,KAAK,KAAK,iBAAiB,QAAS,IAAM,CAAM,KAAK,OAAM,KAAK,KAAK,YAAc,KAAK,IAAI,MAAM,OAAS,SAAU,CAAC,EACtH,KAAK,KAAK,iBAAiB,SAAU,IAAM,KAAK,YAAY,CAAC,EAC7D,KAAK,MAAM,iBAAiB,SAAU,IAAM,KAAK,YAAY,CAAC,EAC9D,KAAK,cAAc,iBAAiB,GAAG,iBAAiB,QAAS,IAAM,KAAK,YAAY,EAAI,CAAC,EAC7F,KAAK,cAAc,iBAAiB,GAAG,iBAAiB,QAAS,IAAM,KAAK,YAAY,CAAC,EACzF,KAAK,MAAS,MAAS,CAAE,aAAa,KAAK,MAAM,EAAG,KAAK,OAAS,WAAW,IAAM,CAAE,KAAK,SAAS,EAAG,KAAK,KAAK,CAAG,EAAG,IAAI,CAAG,EAC7H,KAAK,OAAS,IAAM,KAAK,MAAM,GAAG,EAClC,SAAS,iBAAiB,cAAe,KAAK,MAAM,EAChD,qBAAsB,SACxB,KAAK,GAAK,IAAI,iBAAiB,IAAM,KAAK,MAAM,GAAG,CAAC,EACpD,KAAK,GAAG,QAAQ,KAAM,CAAE,WAAY,EAAK,CAAC,GAG5C,KAAK,MAAM,CAAC,CACd,CACA,sBAAuB,CACjB,KAAK,QAAQ,SAAS,oBAAoB,cAAe,KAAK,MAAM,EACpE,KAAK,IAAI,KAAK,GAAG,WAAW,EAChC,aAAa,KAAK,MAAM,CAC1B,CACA,IAAI,MAAO,CAAE,OAAO,SAAS,KAAK,QAAQ,KAAM,EAAE,GAAK,CAAG,CAC1D,OAAQ,CACN,MAAO,CACL,CAAE,IAAK,OAAQ,MAAO,aAAc,EACpC,CAAE,IAAK,eAAgB,OAAQ,KAAK,KAAK,OAAS,IAAI,KAAK,CAAE,EAC7D,CAAE,IAAK,OAAQ,OAAQ,KAAK,MAAM,OAAS,IAAI,KAAK,CAAE,CACxD,CACF,CAGA,YAAY,MAAO,CACjB,MAAM,KAAO,KAAK,cAAc,iBAAiB,EAC3C,IAAM,KAAK,cAAc,gBAAgB,EAC3C,OAAM,KAAK,OAAS,IACpB,MAAK,IAAI,OAAS,IACtB,KAAK,cAAc,iBAAiB,GAAG,aAAa,gBAAiB,MAAM,EACvE,OAAO,KAAK,KAAK,MAAM,CAC7B,CACA,aAAc,CACZ,MAAM,MAAQ,KAAK,KAAK,OAAS,IAAI,KAAK,EACpC,KAAO,KAAK,cAAc,iBAAiB,EAC3C,IAAM,KAAK,cAAc,gBAAgB,EAC/C,GAAI,CAAC,MAAQ,CAAC,IAAK,OACnB,IAAI,cAAc,gBAAgB,EAAE,YAAc,SAAM,KAAO,SAC/D,MAAM,KAAO,KAAK,MAAM,OAAS,IAAI,KAAK,EACpC,EAAI,IAAI,cAAc,iBAAiB,EACzC,IAAK,EAAE,YAAc,UAAO,IAAK,EAAE,OAAS,CAAC,KAC7C,OAAM,KAAK,OAAS,IACxB,IAAI,OAAS,GACb,MAAM,KAAO,IAAI,cAAc,iBAAiB,EAChD,MAAM,aAAa,gBAAiB,OAAO,EAC3C,MAAM,MAAM,CACd,CACA,aAAc,CACZ,KAAK,YAAY,EACjB,KAAK,YAAY,CACnB,CAGA,UAAW,CACT,SAAS,iBAAiB,wBAAwB,EAAE,QAAS,KAAQ,CAC9D,IAAI,cAAc,kDAAkD,GACzE,IAAI,iBAAiB,yBAAyB,EAAE,QAAS,OAAU,CACjE,MAAM,SAAW,GACjB,MAAM,SAAW,GACjB,MAAM,aAAa,aAAc,oDAAoD,CACvF,CAAC,CACH,CAAC,CACH,CAGA,MAAO,CACL,GAAI,OAAO,cAAe,CAAE,KAAK,MAAM,IAAI,EAAG,MAAQ,CAEtD,GAAI,KAAK,MAAQ,KAAM,CAAM,KAAK,UAAU,SAAS,SAAS,EAAG,KAAK,MAAM,GAAG,EAAQ,KAAK,UAAU,EAAG,MAAQ,CACjH,MAAM,MAAQ,CAAC,EACT,KAAO,KAAK,QAAQ,KACtB,OAAS,SAAS,KAAK,QAAQ,IAAK,EAAE,GAAK,KAAO,KAAK,MAAM,MAAM,KAAK,CAAE,GAAI,KAAM,SAAU,KAAK,IAAK,CAAC,EAC7G,MAAM,SAAW,KAAK,QAAQ,SACxB,QAAU,SAAS,KAAK,QAAQ,QAAS,EAAE,GAAK,EAClD,WAAa,SAAS,KAAK,QAAQ,QAAS,EAAE,GAAK,KAAO,SAAS,MAAM,KAAK,CAAE,GAAI,SAAU,SAAU,OAAQ,CAAC,EAEjH,CAAC,UAAY,QAAU,GAAK,KAAK,QAAQ,SAAS,MAAM,KAAK,CAAE,cAAe,gCAAkC,KAAK,QAAQ,QAAS,SAAU,QAAS,WAAY,CAAC,CAAE,CAAC,EACxK,MAAM,SACX,OAAO,cAAgB,GACvB,KAAK,IAAI,KAAK,EAAE,QAAQ,IAAM,CAAE,WAAW,IAAM,CAAE,OAAO,cAAgB,EAAO,EAAG,IAAI,CAAG,CAAC,EAC9F,CAEA,MAAM,IAAI,MAAO,CACf,KAAK,UAAU,IAAI,SAAS,EAC5B,MAAM,QAAU,OAAO,SAAW,OAAO,QAAQ,QACjD,GAAI,CACF,GAAI,SAAW,QAAQ,WAAY,CACjC,MAAM,IAAM,MAAM,QAAQ,WAAW,CAAE,KAAM,EAAG,CAAE,MAAO,CAAE,QAAS,MAAO,CAAE,CAAC,EAC9E,GAAI,KAAO,IAAI,YAAc,IAAI,WAAW,OAAQ,MAAM,IAAI,MAAM,IAAI,WAAW,CAAC,EAAE,OAAO,CAC/F,KAAO,CACL,MAAM,QAAU,CAAC,EACjB,UAAW,KAAK,MACV,EAAE,GAAI,QAAQ,EAAE,EAAE,EAAI,EAAE,SACvB,MAAM,MAAM,eAAgB,CAAE,OAAQ,OAAQ,QAAS,CAAE,eAAgB,kBAAmB,EAAG,KAAM,KAAK,UAAU,CAAE,MAAO,CAAC,CAAE,GAAI,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI,EAAG,SAAU,EAAE,SAAU,WAAY,OAAO,YAAY,EAAE,WAAW,IAAK,GAAM,CAAC,EAAE,IAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAE,CAAC,CAAE,CAAC,EAEhR,OAAO,KAAK,OAAO,EAAE,QAAQ,MAAM,MAAM,kBAAmB,CAAE,OAAQ,OAAQ,QAAS,CAAE,eAAgB,kBAAmB,EAAG,KAAM,KAAK,UAAU,CAAE,OAAQ,CAAC,CAAE,CAAC,EACtK,SAAS,OAAO,CAClB,CACF,OAAS,EAAG,CACV,QAAQ,MAAM,qBAAsB,CAAC,EACjC,KAAK,MAAK,KAAK,IAAI,QAAU,CAAC,KAAK,IAAI,QAC7C,QAAE,CACA,KAAK,UAAU,OAAO,SAAS,CACjC,CACF,CAEA,QAAS,CACP,MAAM,GAAK,KAAK,IAAI,QACpB,KAAK,UAAU,OAAO,QAAS,EAAE,EACjC,MAAM,KAAO,KAAK,cAAc,iBAAiB,EAC3C,IAAM,KAAK,cAAc,gBAAgB,EAC3C,GAAI,KAAK,YAAY,EAAK,GACnB,OAAM,KAAK,OAAS,IAAU,MAAK,IAAI,OAAS,KAG3D,KAAK,KAAO,GACR,KAAK,UAAU,SAAS,SAAS,EAAG,KAAK,MAAM,GAAG,EAAQ,KAAK,UAAU,CAC/E,CAIA,MAAM,WAAY,CAChB,MAAM,KAAO,KAAK,KAClB,GAAI,MAAQ,KACZ,MAAK,KAAO,KACZ,KAAK,UAAU,IAAI,SAAS,EAC5B,GAAI,CACF,MAAM,EAAI,MAAM,MAAM,WAAY,CAAE,QAAS,CAAE,OAAQ,kBAAmB,CAAE,CAAC,EAAE,KAAM,GAAM,EAAE,KAAK,CAAC,EACnG,IAAI,KAAO,EAAG,QAAU,EAAG,IAAM,MAChC,EAAE,OAAS,CAAC,GAAG,QAAS,IAAO,CAC9B,MAAM,EAAI,GAAG,YAAc,CAAC,EACxB,GAAG,SAAW,YAAmB,EAAE,OAAS,gBAAe,IAAM,KAAO,GAAG,MACxE,MAAQ,GAAG,SAAc,EAAE,WAAW,IAAM,QAAO,SAAW,GAAG,UAC1E,CAAC,EACD,MAAM,KAAO,KAAK,IAAI,EAAG,KAAO,OAAO,EAEnC,CAAC,MAAQ,IAAK,MAAM,KAAK,IAAI,CAAC,CAAE,GAAI,IAAK,SAAU,CAAE,CAAC,CAAC,EAClD,MAAQ,CAAC,KAAO,KAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAE,cAAe,gCAAkC,KAAK,QAAQ,QAAS,SAAU,KAAM,WAAY,KAAK,MAAM,CAAE,CAAC,CAAC,CACzK,OAAS,EAAG,CACV,QAAQ,MAAM,qBAAsB,CAAC,CACvC,QAAE,CACA,KAAK,UAAU,OAAO,SAAS,CACjC,CACI,KAAK,MAAQ,MAAM,KAAK,MAAM,GAAG,EACvC,CAEA,aAAc,CACZ,GAAI,CAAC,KAAK,KAAK,QAAS,OACxB,MAAM,KAAO,KAAK,QAAQ,KACpB,MAAQ,KAAK,KAAK,OAAS,IAAI,KAAK,EACpC,KAAO,KAAK,MAAM,OAAS,IAAI,KAAK,EAEtC,KAAK,OAAS,KAAK,MAAM,OAAS,MAAQ,KAAK,MAAM,MAAQ,MACjE,KAAK,MAAQ,CAAE,KAAM,GAAI,EACrB,KAAM,KAAK,IAAI,CAAC,CAAE,GAAI,KAAM,SAAU,KAAK,KAAM,WAAY,KAAK,MAAM,CAAE,CAAC,CAAC,EACvE,KAAK,KAAO,GAAG,KAAK,IAAI,CAAC,CAAE,cAAe,gCAAkC,KAAK,QAAQ,QAAS,SAAU,KAAK,KAAM,WAAY,KAAK,MAAM,CAAE,CAAC,CAAC,EAC7J,CACF,CACA,eAAe,IAAI,cAAc,GAAK,eAAe,OAAO,eAAgB,UAAU",
  "names": []
}
