{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/tdhq-qty.js?b=20260923d"],
  "sourcesContent": ["/* ============================================================\n   ONE STOCK CEILING, EVERYWHERE.\n\n   Client, 2026-09-23: \"the quantity selection ... must make sure that it\n   would not go above the quantity we have in stock ... if they add 10 and\n   we have just 3 they find that only at checkout, this needs to be forced\n   across all website\".\n\n   WHY THIS IS ONE SHARED MODULE AND NOT FOUR SEPARATE FIXES: no storefront\n   Ajax endpoint returns stock. /products/<handle>.js carries\n   inventory_management but never inventory_quantity or inventory_policy,\n   and /cart.js knows nothing about stock at all (both measured on this\n   shop, 2026-09-23). The number exists ONLY in Liquid, at render time. So\n   every Liquid render hands its ceilings to this module, the module keeps\n   them for the session, and the controls that rebuild themselves from\n   /cart.js - the basket drawer - ask it instead of guessing.\n\n   A ceiling is recorded only for a variant that is TRACKED and DENIES\n   overselling. A variant that keeps selling past zero has no ceiling, and\n   inventing one would refuse a legitimate order.\n\n   THIS IS THE ONLY GUARD. Measured on this shop, 2026-09-23: /cart/add.js\n   answered HTTP 200 to every oversell tried, including 21 units of a variant\n   with 1 in stock, and the basket held all 21. Shopify is refusing nothing\n   here, so nothing catches a breach that gets past this file.\n   ============================================================ */\n(function () {\n  'use strict';\n\n  var STORE = 'tdhq:stock';\n  var ceilings = {};   /* variant id -> units available, 0 meaning \"no ceiling\" */\n  var inBasket = {};   /* variant id -> units the basket already holds */\n  var basketAsked = false;\n\n  try {\n    var saved = window.sessionStorage.getItem(STORE);\n    if (saved) { ceilings = JSON.parse(saved) || {}; }\n  } catch (e) { ceilings = {}; }\n\n  function keep() {\n    try { window.sessionStorage.setItem(STORE, JSON.stringify(ceilings)); } catch (e) {}\n  }\n\n  function num(v) { var n = parseInt(v, 10); return isNaN(n) ? 0 : n; }\n\n  /* A Liquid render telling us what it knows. Recording a 0 matters as much\n     as recording a 3: it retires a ceiling remembered from an earlier page\n     after the merchant stops tracking that variant. */\n  function remember(id, units) {\n    id = String(id || '');\n    if (!id || id === '0') { return; }\n    var n = num(units);\n    if (ceilings[id] === n) { return; }\n    ceilings[id] = n;\n    keep();\n  }\n\n  /* null means \"no ceiling\": either nothing has told us about this variant,\n     or it is one that keeps selling past zero. Both are handled the same\n     way - we do not stand in the shopper's way. */\n  function stock(id) {\n    var n = ceilings[String(id || '')];\n    return n > 0 ? n : null;\n  }\n\n  /* A battery kit built from its parts (owner + Simon, 20 Oct 2026) puts its PARTS in the basket, never itself, so\n     its own line count is always 0. What the basket holds of a kit is counted from its parts instead, the cautious\n     way: the part held most, in whole kits rounded up. Without this a second kit was offered on stock the first\n     one had already taken. The parts list is the kit form's data-tdhq-kit-items. */\n  function kitParts(id) {\n    var forms = document.querySelectorAll('form[data-tdhq-kit-items]');\n    for (var i = 0; i < forms.length; i++) {\n      var f = forms[i].elements ? forms[i].elements['id'] : null;\n      if (!f || String(f.value) !== id) { continue; }\n      var list = null;\n      try { list = JSON.parse(forms[i].getAttribute('data-tdhq-kit-items') || ''); } catch (e) { list = null; }\n      if (Array.isArray(list) && list.length) { return list; }\n    }\n    return null;\n  }\n\n  function held(id) {\n    id = String(id || '');\n    var parts = kitParts(id);\n    if (!parts) { return num(inBasket[id]); }\n    var most = 0;\n    for (var i = 0; i < parts.length; i++) {\n      var per = num(parts[i] && parts[i][1]);\n      if (per > 0) { most = Math.max(most, Math.ceil(num(inBasket[String(parts[i][0])]) / per)); }\n    }\n    return most;\n  }\n\n  /* What may still be ADDED: the stock, less what the basket already holds.\n     This is the half that the `max` attribute could never express, and the\n     half the client's complaint is actually about. */\n  function headroom(id) {\n    var s = stock(id);\n    if (s === null) { return null; }\n    return Math.max(0, s - held(id));\n  }\n\n  function absorb(cart) {\n    inBasket = {};\n    if (cart && cart.items) {\n      for (var i = 0; i < cart.items.length; i++) {\n        var it = cart.items[i];\n        var id = String(it.id);\n        inBasket[id] = num(inBasket[id]) + num(it.quantity);\n      }\n    }\n    repaint();\n  }\n\n  function readBasket() {\n    basketAsked = true;\n    return window.TdhqCart.get().catch(function () { return null; })\n      .then(function (cart) { absorb(cart); return cart; })\n      .catch(function () { return null; });\n  }\n\n  /* The drawer publishes the basket it just received, so the common case\n     costs no request at all. */\n  document.addEventListener('tdhq:cart:changed', function (e) {\n    if (e.detail && e.detail.cart) { absorb(e.detail.cart); }\n    else { readBasket(); }\n  });\n\n  /* ------------------------------------------------------------\n     THE ONE CLAMP\n     ------------------------------------------------------------ */\n\n  /* `mode` is 'add' on a buy form, where what the basket already holds counts\n     against the ceiling, or 'line' inside the basket, where the line's own\n     quantity IS that basket quantity and only the stock applies. */\n  function capFor(id, mode) {\n    return mode === 'line' ? stock(id) : headroom(id);\n  }\n\n  function allowed(id, desired, mode, floor) {\n    var min = num(floor);\n    var want = Math.max(min, num(desired));\n    var cap = capFor(id, mode);\n    if (cap === null || want <= cap) { return { value: want, capped: false, cap: cap }; }\n    return { value: Math.max(min, cap), capped: true, cap: cap };\n  }\n\n  /* Plain English, and never a sentence that reads wrong at one unit. */\n  function reason(id, mode) {\n    var s = stock(id);\n    if (s === null) { return ''; }\n    var have = mode === 'line' ? 0 : held(id);\n    if (have <= 0) { return 'Only ' + s + ' in stock.'; }\n    if (have >= s) {\n      return s === 1\n        ? 'The only one we have is already in your basket.'\n        : 'Your basket already holds all ' + s + ' we have.';\n    }\n    return 'Only ' + s + ' in stock, ' + have + ' already in your basket.';\n  }\n\n  /* ------------------------------------------------------------\n     THE CONTROLS\n     ------------------------------------------------------------ */\n\n  function variantOf(input) {\n    var form = input.form || input.closest('form');\n    /* form.elements, NOT querySelector. When the picker renders as cards the\n       variant id is carried by `<input type=\"radio\" name=\"id\" form=\"...\">`\n       elements that live outside the <form> and are associated to it by the\n       `form` attribute - querySelector cannot reach them, and on a radio\n       group it would return the first radio rather than the checked one.\n       form.elements sees form-associated controls wherever they sit, and a\n       RadioNodeList's .value is the CHECKED radio's value. */\n    var f = form && form.elements ? form.elements['id'] : null;\n    if (f && f.value) { return String(f.value); }\n    f = form && form.querySelector('[data-pdp-variant-id]');\n    if (f && f.value) { return String(f.value); }\n    /* A basket line: the line key's first segment is the variant id\n       (\"39072856015437:ecb5a8...\"). */\n    var holder = input.closest('[data-key]');\n    var key = input.getAttribute('data-cart-qty') || (holder && holder.getAttribute('data-key'));\n    return key ? String(key).split(':')[0] : '';\n  }\n\n  function modeOf(input) {\n    return input.getAttribute('data-qty-mode') ||\n      (input.name === 'quantity' ? 'add' : 'line');\n  }\n\n  /* WHERE THE SENTENCE GOES. Under the whole buy row, spanning the stepper\n     and the Add button: the stepper's own column is 142px, where this wraps\n     to four lines, and the buy row is a nowrap flex row, where appending\n     makes it a squeezed third column. Measured at 628px it is one line. */\n  function noteAnchor(input) {\n    var row = input.closest('.dtc-pdp__buyrow, .tdhq-qv__buyrow');\n    if (row && row.parentElement) { return { parent: row.parentElement, after: row }; }\n    var line = input.closest('[data-cart-line], .dtc-cart__qtywrap, .dtc-cart__qtycell');\n    /* in a basket line: beside the line's Remove, on its row */\n    var rm = line && line.querySelector('.dtc-cart__remove');\n    if (rm && rm.parentNode) { return { parent: rm.parentNode, after: rm }; }\n    if (line) { return { parent: line, after: null }; }\n    return { parent: input.parentElement, after: null };\n  }\n\n  function note(input, msg) {\n    var at = noteAnchor(input);\n    if (!at.parent) { return; }\n    var box = at.parent.querySelector('[data-qty-note]');\n    if (!msg) {\n      if (box) { box.textContent = ''; box.hidden = true; }\n      return;\n    }\n    if (!box) {\n      box = document.createElement('p');\n      box.className = 'tdhq-qtynote';\n      box.setAttribute('data-qty-note', '');\n      box.setAttribute('role', 'status');\n      if (at.after && at.after.nextSibling) { at.parent.insertBefore(box, at.after.nextSibling); }\n      else { at.parent.appendChild(box); }\n    }\n    var fresh = box.hidden || box.textContent !== msg;\n    box.hidden = false;\n    if (box.textContent !== msg) { box.textContent = msg; }\n    if (fresh && window.TdhqMotion) { window.TdhqMotion.show(box); }\n  }\n\n  /* The \"+\" that belongs to this box, whatever the section calls it. */\n  function plusOf(input) {\n    var wrap = input.closest('.dtc-pdp__stepper, .dtc-cart__qty, .dtc-cart__qtywrap') || input.parentElement;\n    if (!wrap) { return null; }\n    var btns = wrap.querySelectorAll('[data-pdp-step], [data-cart-step]');\n    for (var i = 0; i < btns.length; i++) {\n      var s = btns[i].getAttribute('data-pdp-step') || btns[i].getAttribute('data-cart-step');\n      if (num(s) > 0) { return btns[i]; }\n    }\n    return null;\n  }\n\n  /* Show the ceiling on the control: the \"+\" goes dead at the cap rather\n     than accepting a press that does nothing. */\n  function paint(input) {\n    /* A product card's quantity is a hidden 1: nothing to show beside it.\n       Its ceiling still clamps; the card's quick add says why on click. */\n    if (!input || input.disabled || input.type === 'hidden') { return; }\n    var id = variantOf(input);\n    var mode = modeOf(input);\n    var cap = capFor(id, mode);\n    var plus = plusOf(input);\n    if (plus && !plus.hasAttribute('data-qty-keep')) {\n      plus.disabled = cap !== null && num(input.value) >= cap;\n    }\n    /* At the cap, say why. Below it, say nothing: a permanent \"only 3 left\"\n       under every box is noise. Nor when the one unit left is the one in the\n       box and the basket holds none: the buy box's stock line already says\n       \"Only 1 left\", and the same fact twice in two wordings read as a\n       fault (audit pdp-25). A basket line has no stock line, so it keeps it. */\n    var said = mode === 'add' && held(id) === 0 && num(input.value) === 1 && cap === 1;\n    if (cap !== null && num(input.value) >= cap && !said) { note(input, reason(id, mode)); }\n    else { note(input, ''); }\n  }\n\n  function boxes() {\n    return document.querySelectorAll(\n      'input[name=\"quantity\"], input[name=\"updates[]\"], input[data-cart-qty]'\n    );\n  }\n\n  function repaint() {\n    var list = boxes();\n    for (var i = 0; i < list.length; i++) { paint(list[i]); }\n  }\n\n  /* Ask for the basket the first time a page actually has a ceiling to\n     enforce, not on every page load: this is a request, and the client\n     judges the site on speed. */\n  /* The basket drawer is drawn by the server with the page, so its lines ARE\n     the basket this page was built with: each carries its line key (the\n     variant id first) and its quantity. Counting them costs no request\n     (audit cart-16); later changes arrive through tdhq:cart:changed. */\n  function seedFromDrawer() {\n    var drawer = document.querySelector('[data-tdhq-cart-drawer]');\n    if (!drawer) { return false; }\n    var map = {};\n    var lines = drawer.querySelectorAll('[data-cd-item]');\n    for (var i = 0; i < lines.length; i++) {\n      var id = String(lines[i].getAttribute('data-key') || '').split(':')[0];\n      var q = lines[i].querySelector('[data-cd-qtyval]');\n      if (id) { map[id] = num(map[id]) + num(q ? q.textContent : 0); }\n    }\n    inBasket = map;\n    basketAsked = true;\n    return true;\n  }\n\n  function maybeReadBasket() {\n    if (basketAsked) { return; }\n    var list = boxes();\n    for (var i = 0; i < list.length; i++) {\n      if (modeOf(list[i]) === 'add' && stock(variantOf(list[i])) !== null) {\n        if (!seedFromDrawer()) { readBasket(); }\n        return;\n      }\n    }\n  }\n\n  function isQtyBox(el) {\n    return el && el.matches &&\n      el.matches('input[name=\"quantity\"], input[name=\"updates[]\"], input[data-cart-qty]');\n  }\n\n  /* TYPED NUMBERS, EVERYWHERE, IN ONE LISTENER. Delegated from the document\n     so a box that arrives later - quick view, a re-rendered basket - is\n     covered without being registered. `change` and `blur` do the clamping;\n     `input` only repaints, so the shopper can clear the box and retype\n     without the first digit being fought. */\n  document.addEventListener('input', function (e) {\n    if (isQtyBox(e.target)) { paint(e.target); }\n  });\n\n  /* A new variant is a new ceiling. */\n  document.addEventListener('change', function (e) {\n    var el = e.target;\n    if (el && el.name === 'id') { repaint(); }\n  });\n\n  function clampEvent(e) {\n    var el = e.target;\n    if (!isQtyBox(el)) { return; }\n    var floor = el.hasAttribute('min') ? num(el.getAttribute('min')) : 1;\n    var r = allowed(variantOf(el), el.value, modeOf(el), floor);\n    if (String(r.value) !== String(el.value)) { el.value = r.value; }\n    paint(el);\n  }\n\n  document.addEventListener('change', clampEvent, true);\n  document.addEventListener('blur', clampEvent, true);\n\n  document.addEventListener('submit', function (e) {\n    var form = e.target;\n    if (!form || !form.querySelectorAll) { return; }\n    var list = form.querySelectorAll('input[name=\"quantity\"], input[name=\"updates[]\"], input[data-cart-qty]');\n    for (var i = 0; i < list.length; i++) {\n      var el = list[i];\n      var floor = el.hasAttribute('min') ? num(el.getAttribute('min')) : 1;\n      var r = allowed(variantOf(el), el.value, modeOf(el), floor);\n      if (String(r.value) !== String(el.value)) { el.value = r.value; paint(el); }\n    }\n  }, true);\n\n  /* After a refused or unconfirmed add of several lines (a battery kit's parts) Shopify may have added some of\n     them: read the basket back so the header count, the drawer and every ceiling show what is really there. */\n  function reconcile() {\n    var d = window.tdhqCartDrawer;\n    return Promise.resolve(d && d.refresh ? d.refresh() : readBasket()).then(function (cart) {\n      if (!cart) { return null; }\n      absorb(cart);\n      var badges = document.querySelectorAll('[data-tdhq-cart-count]');\n      for (var i = 0; i < badges.length; i++) {\n        var sr = badges[i].querySelector('.tdhq-visually-hidden, .visually-hidden');\n        badges[i].textContent = cart.item_count;\n        if (sr) {\n          badges[i].appendChild(sr);\n          sr.textContent = cart.item_count === 1 ? 'item in basket' : 'items in basket';\n        }\n        badges[i].classList.toggle('tdhq-hidden', cart.item_count === 0);\n      }\n      return cart;\n    }).catch(function () { return null; });\n  }\n\n  window.TdhqQty = {\n    variantOf: variantOf,\n    remember: remember,\n    stock: stock,\n    held: held,\n    headroom: headroom,\n    allowed: allowed,\n    reason: reason,\n    note: note,\n    paint: paint,\n    repaint: repaint,\n    absorb: absorb,\n    readBasket: readBasket,\n    reconcile: reconcile\n  };\n\n  function start() {\n    /* Every box that Liquid rendered with a `max` is a ceiling we now know. */\n    var list = boxes();\n    for (var i = 0; i < list.length; i++) {\n      var el = list[i];\n      if (el.hasAttribute('max')) { remember(variantOf(el), el.getAttribute('max')); }\n    }\n    maybeReadBasket();\n    repaint();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', start);\n  } else { start(); }\n})();\n"],
  "mappings": "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",
  "names": []
}
