{
  "version": 3,
  "sources": ["/cdn/shop/t/36/assets/ark-quickadd.js?b=20260826a"],
  "sourcesContent": ["/* ============================================================\n   TDHQ quick add - ark-quickadd.js\n\n   Adds a product to the basket straight from a product card.\n\n   WHY: every competitor checked puts this on the card. MyCarCleaning's card\n   carries \"In stock\", \"Add to cart\" and \"Quick view\"; TDHQ's card ended at\n   \"View Details\", so buying two known items meant two full page journeys.\n\n   PROGRESSIVE ENHANCEMENT, and it matters here more than usual because this\n   touches the basket:\n     - the card is a REAL form whose button posts to /cart/add (formaction),\n       so with no JavaScript, before this file has run, or if it fails to\n       load, the button still adds the item and Shopify redirects to the cart.\n       The form itself has no action (U.58): Shopify's analytics script reads\n       every form whose action is /cart/add at page load, logging a \"viewed\"\n       variant per card and erroring on cards outside the page's product list.\n     - this script takes the click over and posts the card's\n       data-ark-variant-id to /cart/add.js, after checking the stock left\n       (ark-qty.js knows the stock and what the basket already holds).\n     - if that request fails for ANY reason the form is submitted natively\n       rather than showing an error. A shopper who clicks \"Add\" must never end\n       up with nothing in the basket and no explanation.\n\n   The basket count and total are refreshed by re-rendering the HEADER SECTION\n   through the Section Rendering API and copying the two values across. That is\n   deliberate: formatting money in JavaScript means reimplementing the shop's\n   currency format, which drifts. Letting Liquid render it cannot drift.\n   ============================================================ */\n/* CARD SIDES (6 Nov 2026, clothing front / back): the Back | Front pill on a card turns the garment (ark-home.css,\n   \"FRONT AND BACK\"). Delegated, so cards added later (filters, rails, saved items) work too. */\ndocument.addEventListener('click', function (e) {\n  var b = e.target && e.target.closest ? e.target.closest('[data-ark-side]') : null;\n  var card = b && b.closest('.ark-pcard');\n  if (!card) { return; }\n  e.preventDefault();\n  card.classList.add('is-picked');\n  card.classList.toggle('is-turned', b.getAttribute('data-ark-side') === 'b');\n  [].forEach.call(card.querySelectorAll('[data-ark-side]'), function (x) { x.setAttribute('aria-pressed', x === b ? 'true' : 'false'); });\n});\n/* HOVER AND LEAVE (6 Nov 2026, owner: \"if I manually press on front or back then it never moves automatically again\"):\n   hovering a card turns it (pointer devices) and the pill names the shown side to assistive tech; a pressed side holds\n   only while the pointer or keyboard focus is on that card - leaving returns it to its artwork side, so the next hover\n   turns it again. */\n(function () {\n  var hov = window.matchMedia ? window.matchMedia('(hover: hover)') : null;\n  function cardOf(e) { return e.target && e.target.closest ? e.target.closest('.ark-pcard') : null; }\n  function pair(card) { var bs = card ? card.querySelectorAll('[data-ark-side]') : []; return bs.length === 2 ? bs : null; }\n  function press(bs, other) { bs[0].setAttribute('aria-pressed', other ? 'false' : 'true'); bs[1].setAttribute('aria-pressed', other ? 'true' : 'false'); }\n  function inside(card, e) { return !!(e.relatedTarget && card.contains(e.relatedTarget)); }\n  document.addEventListener('mouseover', function (e) {\n    var card = cardOf(e), bs = pair(card);\n    if (!bs || !hov || !hov.matches || card.classList.contains('is-picked') || inside(card, e)) { return; }\n    press(bs, true);\n  });\n  document.addEventListener('mouseout', function (e) {\n    var card = cardOf(e), bs = pair(card);\n    if (!bs || inside(card, e)) { return; }\n    card.classList.remove('is-picked', 'is-turned');\n    press(bs, false);\n  });\n  document.addEventListener('focusout', function (e) {\n    var card = cardOf(e), bs = pair(card);\n    if (!bs || inside(card, e) || card.matches(':hover')) { return; }\n    card.classList.remove('is-picked', 'is-turned');\n    press(bs, false);\n  });\n})();\n(function () {\n  'use strict';\n\n  var BUSY = 'is-adding';\n  var DONE_MS = 1800;\n\n  /* ONE ADD AT A TIME PER STOCK-TRACKED ITEM, until the basket is known\n     again. The add answers before the basket refresh lands, and until then\n     the stock check reads the old basket - so a quick second click, or a\n     second card for the same item, could pass it twice. */\n  var pending = {};\n  document.addEventListener('ark:cart:changed', function () { pending = {}; });\n\n  /* Refresh the header basket count.\n\n     The first version of this asked the Section Rendering API to re-render the\n     header section so Liquid could format everything. That does not work, and\n     the reason is a hard platform limit worth recording: the header lives in a\n     SECTION GROUP (rendered by `{% sections 'header-group' %}`), and the\n     Section Rendering API cannot render section-group sections. Requesting it\n     returned the page's own main section instead \u2014 `{\"collection\": \u2026}` \u2014 so the\n     badge silently never updated.\n\n     /cart.js is the right source anyway. The only value the badge shows is an\n     INTEGER, so there is no currency to format and nothing that can drift.\n     When the \"show basket value\" setting is on there is a money string too.\n     That is formatted with the drawer's published formatter - the shop's own\n     money_format, one implementation for the whole theme - rather than by\n     fetching and parsing a copy of the current page for one span. */\n  function refreshBasket() {\n    return window.ArkCart.get().catch(function () { return null; })\n      .then(function (cart) {\n        if (!cart) return;\n        if (window.ArkQty) { window.ArkQty.absorb(cart); }\n        pending = {};\n        var badge = document.querySelector('[data-ark-cart-count]');\n        if (badge) {\n          /* Replace ONLY the leading text node. The badge also contains a\n             visually-hidden label, and overwriting textContent would delete it,\n             leaving screen readers with a bare number and no context. */\n          var first = badge.firstChild;\n          if (first && first.nodeType === 3) {\n            first.nodeValue = String(cart.item_count) + ' ';\n          } else {\n            badge.insertBefore(document.createTextNode(String(cart.item_count) + ' '), badge.firstChild);\n          }\n          var label = badge.querySelector('.ark-visually-hidden');\n          if (label) {\n            label.textContent = cart.item_count === 1 ? 'item in basket' : 'items in basket';\n          }\n          badge.classList.toggle('ark-hidden', cart.item_count === 0);\n        }\n\n        /* The header's basket TOTAL.\n\n           This used to be read out of a freshly fetched copy of the whole\n           current page: `fetch(location.pathname)` for the sole purpose of\n           copying one money string. Measured on the homepage that is 636 KB of\n           HTML plus a full DOMParser parse, and the submit handler awaited it\n           BEFORE flashing \"Added to basket\" and before dispatching the event\n           that opens the drawer - so the most frequent action on the site sat\n           silent for the length of a page load with nothing on screen moving.\n\n           The cart payload already in hand carries `total_price`, and the\n           drawer publishes the shop's own money formatter, so the figure is\n           written directly. If the drawer script is not on the page the total\n           is simply left alone rather than paying for a page fetch: the count\n           badge beside it has already updated, so the header is not stale in\n           any way a shopper would notice. */\n        var total = document.querySelector('[data-ark-cart-total]');\n        var fmt = window.arkFormatMoney;\n        if (!fmt) { return; }\n\n        if (total) {\n          total.textContent = fmt(cart.total_price);\n          return;\n        }\n\n        /* NO ELEMENT MEANS THE MERCHANT SAID NO. This used to build one -\n           after every add, unconditionally, with a class that has no rule\n           anywhere in the theme - so a header configured with \"show basket\n           value\" OFF grew an unstyled price the moment anything was added, and\n           kept it for the rest of the visit. The header renders the total when\n           it is wanted; when it is not, there is nothing here to update and\n           that is the correct outcome. The count badge beside it has already\n           updated either way. */\n      })\n      .catch(function () { /* a stale badge is not worth an error state */ });\n  }\n\n  /* A message beside the card that failed, in the same shape both baskets use.\n     role=\"alert\" so it is announced as well as shown, and it clears itself:\n     a card the shopper has moved past should not keep an old complaint. */\n  function showAddError(form, message) {\n    if (!form || !message) { return; }\n    var card = form.closest('.ark-pcard') || form.parentNode;\n    /* over the bottom of the picture, in the site's notification style (window.ArkNote, 23 Oct 2026) */\n    var media = card.querySelector('.ark-pcard__media');\n    if (window.ArkNote && media) { window.ArkNote.show(media, message); return; }\n    var box = card.querySelector('.ark-pcard__adderr');\n    if (!box) {\n      box = document.createElement('p');\n      box.className = 'ark-pcard__adderr';\n      box.setAttribute('role', 'alert');\n      /* inside the form, under the button, so it keeps the form's side padding (23 Oct 2026) */\n      form.appendChild(box);\n    }\n    box.textContent = message;\n    if (window.ArkMotion) { window.ArkMotion.show(box); }\n    window.clearTimeout(box._t);\n    box._t = window.setTimeout(function () {\n      if (!box.parentNode) { return; }\n      if (window.ArkMotion) { window.ArkMotion.exit(box, function () { box.remove(); }); } else { box.remove(); }\n    }, 8000);\n  }\n\n  function flash(button, label) {\n    if (!button) return;\n    var original = button.getAttribute('data-ark-label') || button.textContent.trim();\n    button.setAttribute('data-ark-label', original);\n    button.textContent = label;\n    window.setTimeout(function () {\n      if (button.getAttribute('data-ark-label')) {\n        button.textContent = button.getAttribute('data-ark-label');\n      }\n    }, DONE_MS);\n  }\n\n  /* ONE ADD, TWO WAYS IN (10 Nov 2026): the shopper's click, or a shopping agent using the card's form as a WebMCP\n     tool (toolautosubmit: the browser submits it, there is no click). Both run this; it resolves with the sentence the\n     agent is told, which a click ignores. */\n  function addFrom(form, button) {\n    if (form.classList.contains(BUSY)) return Promise.resolve('This item is already being added to the basket.');\n\n    var variantId = form.getAttribute('data-ark-variant-id');\n    if (!variantId) return Promise.resolve('This item cannot be added from here: open its product page.');\n\n    /* NOTHING LEFT TO ADD. The basket already holds every unit in stock:\n       say so here instead of posting - Shopify does not always refuse an\n       add past the stock (an oversell went through on 23 Sep). */\n    var qty = window.ArkQty;\n    if (qty) {\n      /* A card drawn after page load (Saved items, recently viewed) has not\n         told ark-qty its stock yet: its hidden quantity carries it. No max\n         means the item is not stock-limited, which retires an old ceiling. */\n      var box = form.querySelector('input[name=\"quantity\"]');\n      if (box) { qty.remember(variantId, box.getAttribute('max') || 0); }\n      if (pending[variantId]) { return Promise.resolve('This item is already being added to the basket.'); }\n      if (qty.headroom(variantId) === 0) {\n        var why = qty.reason(variantId, 'add');\n        showAddError(form, why);\n        return Promise.resolve('Not added: ' + why);\n      }\n      if (qty.stock(variantId) !== null) {\n        pending[variantId] = true;\n        window.setTimeout(function () { delete pending[variantId]; }, 8000);\n      }\n    }\n\n    form.classList.add(BUSY);\n    if (button) button.disabled = true;\n\n    var kitList = null;\n    try { kitList = JSON.parse((form.getAttribute('data-ark-kit-items') || '').trim() || 'null'); } catch (err) { kitList = null; }\n    if (!Array.isArray(kitList) || !kitList.length) { kitList = null; }\n\n    return fetch(((window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/') + 'cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      /* A battery kit built from its parts (data-ark-kit-items, snippets/ark-kit-items.liquid) adds the parts as\n         separate basket lines, each times the quantity, never the kit itself (owner + Simon, 20 Oct 2026). */\n      body: JSON.stringify(kitList\n        ? { items: kitList.map(function (p) { return { id: p[0], quantity: p[1] }; }), sections: 'ark-cart-state', sections_url: window.location.pathname }\n        : { id: parseInt(variantId, 10), quantity: 1, sections: 'ark-cart-state', sections_url: window.location.pathname })\n    })\n      .then(window.ArkCart.check)\n      .then(function (r) {\n        /* Shopify explains its own refusals - \"Cannot find variant\", \"All 3 of\n           this item are in your cart\" - and that sentence is the only thing\n           that tells the shopper why nothing happened. Carry it through as the\n           error message instead of throwing a status code away. */\n        if (!r.ok) {\n          return r.json()\n            .catch(function () { throw new Error('Could not add this item. Please try again.'); })\n            .then(function (e) { throw new Error(e.description || e.message || 'Could not add this item.'); });\n        }\n        return r.json();\n      })\n      .then(function (added) {\n        /* Confirm FIRST, reconcile after. The add has already succeeded at this\n           point, so the shopper sees the label change and the drawer open in\n           the same frame; the header badge and total settle a moment later\n           without anything waiting on them. Ordering these the other way round\n           is what made a card click feel like it had not registered. */\n        form.classList.remove(BUSY);\n        if (button) button.disabled = false;\n        flash(button, 'Added to basket');\n        /* The drawer's own refresh (on ark:cart:added below) redraws the\n           header count and total; a second /cart.js here only raced it. */\n        if (!window.arkCartDrawer) { window.setTimeout(refreshBasket, 0); }\n        /* Announce it: a visual label change is invisible to a screen reader\n           when it happens outside the focused element's own text. */\n        /* Hand off to the basket drawer. This script owns ADDING; the drawer\n           owns SHOWING. Dispatching instead of calling it directly keeps the two\n           independent - with no drawer on the page nothing listens and the flash\n           message above remains the confirmation. */\n        document.dispatchEvent(new CustomEvent('ark:cart:added', { detail: { source: 'quickadd', productId: (form.getAttribute('data-ark-product-id') || null), item: added } }));\n        var live = document.getElementById('ark-quickadd-live');\n        if (live) {\n          live.textContent = '';\n          /* A timer rather than requestAnimationFrame: rAF is paused in a\n             background tab, and an announcement that never fires is worse than\n             one that fires 30ms late. */\n          window.setTimeout(function () {\n            live.textContent = (form.getAttribute('data-ark-title') || 'Item') + ' added to your basket';\n          }, 30);\n        }\n        return (form.getAttribute('data-ark-title') || 'The item') + ' was added to the basket.';\n      })\n      .catch(function (err) {\n        /* SAY IT HERE. This used to call form.submit(), which posts the real\n           /cart/add form as a browser navigation - and a refusal then lands on\n           Shopify's own error page (\"Cart Error: Cannot find variant\",\n           \"Something went wrong\", one link back to the myshopify domain). The\n           shopper loses the page they were browsing to be told, badly, that\n           one card did not work. Both baskets already answer this class of\n           failure in place; so does this now. */\n        /* The one exception: a request Shopify's bot check turned down never reached the basket, and the shopper\n           cannot see that check from here. Then the card adds as a normal page load (ArkCart, layout, 14 Nov 2026). */\n        if (err && err.refused && !err.network && !kitList && window.ArkCart.add({ id: variantId, quantity: 1 })) { return; }\n        form.classList.remove(BUSY);\n        if (button) button.disabled = false;\n        delete pending[variantId];\n        showAddError(form, err && err.name === 'TypeError' ? 'We could not reach the shop. Please check your connection and try again.' : ((err && err.message) || 'Could not add this item.'));\n        /* a refused kit add may still have put some of its parts in the basket */\n        if (kitList && window.ArkQty && window.ArkQty.reconcile) { window.ArkQty.reconcile(); }\n        return 'Not added: ' + ((err && err.message) || 'Could not add this item.');\n      });\n  }\n\n  document.addEventListener('click', function (event) {\n    var button = event.target && event.target.closest ? event.target.closest('[data-ark-quickadd-btn]') : null;\n    /* `form` is the card's add form (form[data-ark-quickadd]) */\n    var form = button && button.closest('[data-ark-quickadd]');\n    if (!form) return;\n    event.preventDefault();\n    addFrom(form, button);\n  }, true);\n\n  /* THE PAGE'S ONE add_to_basket TOOL (layout form[data-ark-agent-add], 10 Nov 2026): the agent names a product\n     shown on the page; its card's form is found by name (exact, then contained) and added by the same addFrom(). */\n  document.addEventListener('submit', function (event) {\n    var gen = event.target && event.target.closest ? event.target.closest('form[data-ark-agent-add]') : null;\n    if (!gen) return;\n    event.preventDefault();\n    var box = gen.querySelector('input[name=\"product\"]');\n    var want = ((box && box.value) || '').replace(/\\s+/g, ' ').trim().toLowerCase();\n    var cards = document.querySelectorAll('form[data-ark-quickadd]');\n    var hit = null, near = null;\n    for (var i = 0; i < cards.length && want; i++) {\n      var t = (cards[i].getAttribute('data-ark-title') || '').replace(/\\s+/g, ' ').trim().toLowerCase();\n      if (t === want) { hit = cards[i]; break; }\n      if (!near && t.indexOf(want) > -1) { near = cards[i]; }\n    }\n    hit = hit || near;\n    var job = hit\n      ? addFrom(hit, hit.querySelector('[data-ark-quickadd-btn]'))\n      : Promise.resolve('Not added: no product called \"' + want + '\" has an add button on this page. A product with options is added from its own page.');\n    if (window.arkAgentReply) { window.arkAgentReply(event, job); }\n  }, true);\n\n  /* The agent's submit (no click): the same add, and its result goes back to the agent. A shopper's own click never\n     reaches here - the click handler above already cancelled it. */\n  document.addEventListener('submit', function (event) {\n    var form = event.target && event.target.closest ? event.target.closest('form[data-ark-quickadd]') : null;\n    if (!form || !event.agentInvoked) return;\n    event.preventDefault();\n    var job = addFrom(form, form.querySelector('[data-ark-quickadd-btn]'));\n    if (window.arkAgentReply) { window.arkAgentReply(event, job); }\n  }, true);\n})();\n\n/* CARD PHOTO FIT moved to snippets/ark-fit-script.liquid (2026-09-22): one\n   rule for every product picture on the site, not only non-square cards. */\n"],
  "mappings": "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",
  "names": []
}
