{
  "version": 3,
  "sources": ["/cdn/shop/t/17/assets/pilit-store.js?build=1cd9afc"],
  "sourcesContent": ["/* Product page interactions: gallery switching and variant selection. */\n(() => {\n  const root = document.querySelector('[data-product-root]');\n  if (!root) return;\n\n  const mainImage = document.getElementById('ProductGalleryMain');\n  const thumbs = root.querySelectorAll('[data-gallery-thumb]');\n  const imageFrame = mainImage && mainImage.closest('.store-product-frame');\n  const fallbackSrc = imageFrame && imageFrame.dataset.fallbackSrc;\n  const fallbackMediaId = imageFrame && imageFrame.dataset.fallbackMediaId;\n\n  const showImage = (src, mediaId) => {\n    if (!mainImage || !src) return;\n    mainImage.removeAttribute('srcset');\n    mainImage.src = src;\n\n    // Keep the thumbnail strip in step, so the highlighted thumb is the image on screen.\n    if (mediaId != null) {\n      thumbs.forEach((thumb) => {\n        thumb.classList.toggle('is-active', thumb.dataset.mediaId === String(mediaId));\n      });\n    }\n  };\n\n  thumbs.forEach((thumb) => {\n    thumb.addEventListener('click', () => {\n      showImage(thumb.dataset.full);\n      thumbs.forEach((other) => other.classList.toggle('is-active', other === thumb));\n    });\n  });\n\n  /* Filter the strip to the selection, mirroring the Liquid. `data-variant-ids` is the\n     comma-wrapped list of variants claiming this media; a photo no variant claims is hidden\n     rather than treated as a general shot, because this catalog has no neutral photography.\n     See the Liquid for why that exemption was removed. */\n  const thumbStrip = root.querySelector('[data-gallery-thumbs]');\n\n  const syncThumbs = (variantId) => {\n    if (!thumbStrip) return;\n\n    const needle = `,${variantId},`;\n    let shown = 0;\n\n    thumbs.forEach((thumb) => {\n      const owners = thumb.dataset.variantIds;\n      // Absent attribute means an un-filtered strip (another product's markup): leave it be.\n      const visible = owners === undefined || owners.includes(needle);\n      thumb.hidden = !visible;\n      if (visible) shown += 1;\n    });\n\n    // One thumbnail only repeats the image already on screen.\n    thumbStrip.hidden = shown < 2;\n  };\n\n  // ---------------------------------------------------------------- variants\n\n  const dataEl = root.querySelector('[data-variant-data]');\n  const selects = Array.from(root.querySelectorAll('select[data-option-index]'));\n  const optionButtons = Array.from(root.querySelectorAll('[data-option-button]'));\n  const variantIdInput = root.querySelector('[data-variant-id]');\n  if (!dataEl || !selects.length || !variantIdInput) return;\n\n  let variants;\n  try {\n    variants = JSON.parse(dataEl.textContent);\n  } catch (error) {\n    return; // leave the server-rendered selection alone rather than break the buy box\n  }\n\n  const priceEl = root.querySelector('[data-product-price]');\n  const compareEl = root.querySelector('[data-product-compare]');\n  // Authored in the Liquid so the price line and the grid card cannot drift apart.\n  const quotePriceLabel = (priceEl && priceEl.dataset.quoteLabel) || 'Contact for pricing';\n  const skuEl = root.querySelector('[data-product-sku]');\n  const addButton = root.querySelector('[data-add-to-cart]');\n  const addButtonLabel = addButton && addButton.querySelector('[data-add-to-cart-label]');\n  const addButtonTotal = addButton && addButton.querySelector('[data-add-to-cart-total]');\n  const purchaseOrderLabel =\n    (addButton && addButton.dataset.purchaseOrderLabel) || 'Purchase order required';\n  const productCurrency = root.dataset.currency || 'USD';\n\n  const selection = () => selects.map((select) => select.value);\n\n  const findVariant = (values) =>\n    variants.find((variant) => variant.options.every((option, i) => option === values[i]));\n\n  let activeVariant =\n    variants.find((variant) => String(variant.id) === variantIdInput.value) || findVariant(selection());\n\n  const compactMoney = (cents) => {\n    const units = cents / 100;\n    const whole = Number.isInteger(units);\n\n    try {\n      return new Intl.NumberFormat(undefined, {\n        style: 'currency',\n        currency: productCurrency,\n        minimumFractionDigits: whole ? 0 : 2,\n        maximumFractionDigits: whole ? 0 : 2,\n      }).format(units);\n    } catch (error) {\n      return whole ? String(units) : units.toFixed(2);\n    }\n  };\n\n  const setCount = (value) => {\n    const parsed = parseInt(value, 10);\n    return parsed > 0 ? parsed : null;\n  };\n\n  /* Disable a value only when it is unreachable in *every* combination \u2014 not merely\n     incompatible with what is currently chosen.\n\n     The stricter rule is tempting and wrong. The flares have no Commuter Alkaline 10 Set, so\n     with 10 Set selected it would grey out Commuter Alkaline Battery entirely \u2014 a style that\n     exists in ten of the twenty-five variants \u2014 and a shopper reads a greyed-out option as\n     discontinued, not as \"incompatible with the size you happen to have selected\". It also\n     forces them to discover that axes must be changed in a particular order.\n\n     So incompatible-but-real values stay selectable and the snap below moves the other axes\n     to suit. That makes the snap a primary interaction rather than a defensive one. */\n  const reachable = selects.map((select, index) => {\n    const all = new Set(variants.map((variant) => variant.options[index]));\n    const available = new Set(\n      variants.filter((variant) => variant.available).map((variant) => variant.options[index])\n    );\n    return available.size ? available : all;\n  });\n\n  const markUnavailable = () => {\n    selects.forEach((select, index) => {\n      Array.from(select.options).forEach((option) => {\n        option.disabled = !reachable[index].has(option.value);\n      });\n    });\n\n    optionButtons.forEach((button) => {\n      const index = Number(button.dataset.optionIndex);\n      button.disabled = !reachable[index].has(button.dataset.optionValue);\n    });\n  };\n\n  const syncOptionButtons = () => {\n    const values = selection();\n\n    optionButtons.forEach((button) => {\n      const index = Number(button.dataset.optionIndex);\n      const selected = button.dataset.optionValue === values[index];\n      button.classList.toggle('is-selected', selected);\n      button.setAttribute('aria-pressed', selected ? 'true' : 'false');\n    });\n  };\n\n  /* Nearest match for an impossible combination: honour the axis the shopper just touched,\n     then keep as many of the others as possible. Availability is the secondary key and\n     catalog order the final tie-break \u2014 iterating in order with a strict > gives that.\n\n     (Availability is moot for this catalog today: every variant has inventory tracking\n     disabled to match the build-to-ship model, so all of them report available.) */\n  const nearest = (values, changedIndex) => {\n    let best = null;\n    let bestScore = -1;\n\n    variants.forEach((variant) => {\n      if (variant.options[changedIndex] !== values[changedIndex]) return;\n\n      let preserved = 0;\n      variant.options.forEach((value, i) => {\n        if (i !== changedIndex && value === values[i]) preserved += 1;\n      });\n\n      const score = preserved * 2 + (variant.available ? 1 : 0);\n      if (score > bestScore) {\n        bestScore = score;\n        best = variant;\n      }\n    });\n\n    return best;\n  };\n\n  const syncOptionDetails = () => {\n    const values = selection();\n\n    optionButtons.forEach((button) => {\n      if (!(button.dataset.optionRole || '').includes('size')) return;\n\n      const detail = button.querySelector('[data-option-detail]');\n      if (!detail) return;\n\n      const count = setCount(button.dataset.optionValue);\n      if (!count) {\n        detail.textContent = '';\n        return;\n      }\n\n      const preview = [...values];\n      preview[Number(button.dataset.optionIndex)] = button.dataset.optionValue;\n      const variant = findVariant(preview) || nearest(preview, Number(button.dataset.optionIndex));\n\n      detail.textContent =\n        variant && variant.priceCents > 0\n          ? `${compactMoney(Math.round(variant.priceCents / count))} / flare`\n          : '';\n    });\n  };\n\n  const quantity = root.querySelector('[data-quantity]');\n  const quoteOnlyNote = root.querySelector('[data-quote-only-note]');\n\n  // ---------------------------------------------------------------- add-ons\n\n  /* Optional accessories, rendered by snippets/product-add-ons.liquid between Qty and Add to\n     cart. Every variant of every accessory is already in the DOM; this only decides which\n     row is the compatible one and hides the rest, so the row markup exists in exactly one\n     place. See the snippet for why compatibility is matched on option values. */\n\n  const addOnRoot = root.querySelector('[data-add-ons]');\n  const quantityInput = root.querySelector('[name=\"quantity\"]');\n  const addOnTotal = addOnRoot && addOnRoot.querySelector('[data-add-on-total]');\n  const addOnError = addOnRoot && addOnRoot.querySelector('[data-add-on-error]');\n  const dockingStationGroup = '9188633018524';\n\n  if (addOnRoot) {\n    addOnRoot.querySelectorAll(`[data-add-on-group=\"${dockingStationGroup}\"]`).forEach((row) => {\n      const title = row.querySelector('.store-add-on-title');\n      if (title) title.textContent = 'Docking Station - Active Charging';\n    });\n  }\n\n  const parseList = (value) => {\n    try {\n      const parsed = JSON.parse(value || '[]');\n      return Array.isArray(parsed) ? parsed : [];\n    } catch (error) {\n      return []; // an unparseable row simply never matches, rather than throwing here\n    }\n  };\n\n  const addOns = Array.from(addOnRoot ? addOnRoot.querySelectorAll('[data-add-on-row]') : []).map(\n    (row) => ({\n      row,\n      check: row.querySelector('[data-add-on-check]'),\n      group: row.dataset.addOnGroup,\n      priceCents: Number(row.dataset.priceCents) || 0,\n      matchValues: parseList(row.dataset.matchValues),\n      styles: parseList(row.dataset.compatibleStyles),\n      defaultOnly: row.dataset.defaultOnly === 'true',\n    })\n  );\n\n  const quantityValue = () => {\n    const parsed = parseInt(quantityInput && quantityInput.value, 10);\n    return parsed > 0 ? parsed : 1;\n  };\n\n  /* A visible, enabled, checked row. Hidden rows are excluded rather than trusted to be\n     unchecked, so an incompatible accessory cannot reach the cart even if some later change\n     leaves a stale checkbox behind. */\n  const checkedAddOns = () =>\n    addOns.filter((addOn) => !addOn.row.hidden && addOn.check && addOn.check.checked && !addOn.check.disabled);\n\n  const currency = (addOnRoot && addOnRoot.dataset.currency) || 'USD';\n  const money = (cents) => {\n    try {\n      return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(cents / 100);\n    } catch (error) {\n      return (cents / 100).toFixed(2); // unknown currency code \u2014 a bare number beats throwing\n    }\n  };\n\n  const renderAddOnTotal = () => {\n    if (!addOnTotal) return;\n    const chosen = checkedAddOns();\n    if (!chosen.length) {\n      addOnTotal.hidden = true;\n      addOnTotal.textContent = '';\n      return;\n    }\n    const cents = chosen.reduce((sum, addOn) => sum + addOn.priceCents, 0) * quantityValue();\n    addOnTotal.hidden = false;\n    addOnTotal.textContent = `${chosen.length} accessor${chosen.length === 1 ? 'y' : 'ies'} selected \u2014 ${money(cents)}`;\n  };\n\n  const renderAddButtonTotal = () => {\n    if (!addButtonTotal) return;\n\n    if (!activeVariant || !activeVariant.available || activeVariant.priceCents === 0) {\n      addButtonTotal.hidden = true;\n      addButtonTotal.textContent = '';\n      return;\n    }\n\n    const addOnCents = checkedAddOns().reduce((sum, addOn) => sum + addOn.priceCents, 0);\n    addButtonTotal.hidden = false;\n    addButtonTotal.textContent = compactMoney((activeVariant.priceCents + addOnCents) * quantityValue());\n  };\n\n  const syncAddOns = (variant) => {\n    if (!addOns.length) return;\n\n    const values = variant.options;\n    // Mirrors the Liquid: a $0.00 variant is quote-led, and there is no cart to add to.\n    const sellable = variant.priceCents !== 0;\n    const shown = new Set();\n\n    addOns.forEach((addOn) => {\n      const styleOk = !addOn.styles.length || addOn.styles.some((style) => values.includes(style));\n      const sizeOk = addOn.defaultOnly || addOn.matchValues.some((value) => values.includes(value));\n      // First match wins per accessory, mirroring the Liquid's `break`.\n      const visible = sellable && styleOk && sizeOk && !shown.has(addOn.group);\n      if (visible) shown.add(addOn.group);\n\n      addOn.row.hidden = !visible;\n\n      /* A hidden row must not keep its checkbox checked. Otherwise switching 10 Set -> 4 Set\n         -> 10 Set would return the dock already selected, adding $180 the shopper never\n         asked for on this visit. */\n      if (!visible && addOn.check) addOn.check.checked = false;\n    });\n\n    if (addOnRoot) addOnRoot.hidden = shown.size === 0;\n    renderAddOnTotal();\n  };\n\n  addOns.forEach((addOn) => {\n    if (addOn.check) {\n      addOn.check.addEventListener('change', () => {\n        renderAddOnTotal();\n        renderAddButtonTotal();\n      });\n    }\n  });\n  if (quantityInput) {\n    quantityInput.addEventListener('input', () => {\n      renderAddOnTotal();\n      renderAddButtonTotal();\n    });\n  }\n\n  /* One Add to cart action, several cart lines. Accessories stay ordinary products on their\n     own lines so pricing, inventory, fulfilment, returns and cart editing all behave\n     normally \u2014 a bundle product would have to reimplement every one of those.\n\n     With nothing checked the handler does not intervene at all and the native form posts as\n     it always has, which is also the no-JavaScript path. */\n  const productForm = variantIdInput.closest('form');\n  if (productForm && addOns.length) {\n    productForm.addEventListener('submit', (event) => {\n      const chosen = checkedAddOns();\n      if (!chosen.length) return;\n\n      event.preventDefault();\n\n      const count = quantityValue();\n      const items = [{ id: Number(variantIdInput.value), quantity: count }].concat(\n        chosen.map((addOn) => ({ id: Number(addOn.row.dataset.variantId), quantity: count }))\n      );\n\n      /* `routes.cart_add_url` is the locale-aware base and resolves to `/cart/add`; the\n         documented Ajax endpoint that accepts an `items` array is the `.js` form. */\n      const base = (addOnRoot && addOnRoot.dataset.cartAddUrl) || '/cart/add';\n      const endpoint = base.endsWith('.js') ? base : `${base}.js`;\n      const cartUrl = (addOnRoot && addOnRoot.dataset.cartUrl) || '/cart';\n\n      if (addOnError) {\n        addOnError.hidden = true;\n        addOnError.textContent = '';\n      }\n      if (addButton) addButton.disabled = true;\n\n      fetch(endpoint, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ items }),\n      })\n        .then((response) => (response.ok ? response.json() : Promise.reject(new Error(String(response.status)))))\n        .then(() => {\n          window.location.href = cartUrl;\n        })\n        .catch(() => {\n          /* Selections are deliberately left as they were. Making a shopper re-pick their\n             accessories after a transient failure is how a recoverable error becomes a lost\n             sale. */\n          if (addButton) addButton.disabled = false;\n          if (addOnError) {\n            addOnError.hidden = false;\n            addOnError.textContent = 'We could not add that to your cart. Please try again.';\n          }\n        });\n    });\n  }\n\n  const apply = (variant) => {\n    activeVariant = variant;\n    variantIdInput.value = variant.id;\n    syncOptionButtons();\n    syncOptionDetails();\n\n    /* Mirrors the Liquid guard: a $0.00 variant is a quote-led record, not a free product,\n       and Shopify would accept a zero-total order for it. The disabled control stays visible\n       to explain the state, while quantity disappears because there is nothing to submit. */\n    const sellable = variant.priceCents !== 0;\n    if (quantity) quantity.hidden = !sellable;\n    if (quoteOnlyNote) quoteOnlyNote.hidden = sellable;\n\n    /* Showing \"$0.00\" beside \"contact us for pricing\" reads as a broken page, and a\n       struck-through compare-at price implies a discount off a price we are not quoting. */\n    if (priceEl) priceEl.textContent = sellable ? variant.price : quotePriceLabel;\n\n    if (compareEl) {\n      const compare = sellable ? variant.compare : null;\n      compareEl.textContent = compare || '';\n      compareEl.hidden = !compare;\n    }\n\n    if (skuEl) skuEl.textContent = variant.sku ? `SKU: ${variant.sku}` : '';\n\n    // Runs before showImage so the strip is filtered to this variant when showImage looks\n    // for the thumb to highlight.\n    syncThumbs(variant.id);\n\n    // A variant with no media falls back to the product image rather than stranding the\n    // previous variant's photo on screen.\n    showImage(variant.image || fallbackSrc, variant.mediaId ?? fallbackMediaId);\n\n    if (addButton) {\n      addButton.disabled = !variant.available || !sellable;\n      if (addButtonLabel) {\n        if (!sellable) {\n          addButtonLabel.textContent = purchaseOrderLabel;\n        } else {\n          addButtonLabel.textContent = variant.available\n            ? addButton.dataset.availableLabel\n            : addButton.dataset.soldOutLabel;\n        }\n      }\n    }\n\n    // Runs after the button state above, because a quote-led variant hides the accessories\n    // for the same reason it hides quantity: there is nothing to add.\n    syncAddOns(variant);\n    renderAddButtonTotal();\n\n    // Keep the URL shareable and back/forward-safe: the same link a use-case page would use.\n    const url = new URL(window.location.href);\n    url.searchParams.set('variant', variant.id);\n    window.history.replaceState({}, '', url);\n  };\n\n  const onChange = (changedIndex) => {\n    const values = selection();\n    let variant = findVariant(values);\n\n    // Changing one axis can strand the others on a combination that does not exist.\n    if (!variant) {\n      variant = nearest(values, changedIndex);\n      if (variant) {\n        selects.forEach((select, i) => { select.value = variant.options[i]; });\n      }\n    }\n\n    if (variant) apply(variant);\n  };\n\n  selects.forEach((select, index) => {\n    select.addEventListener('change', () => onChange(index));\n  });\n\n  markUnavailable();\n  syncOptionButtons();\n  syncOptionDetails();\n  renderAddButtonTotal();\n\n  optionButtons.forEach((button) => {\n    button.addEventListener('click', () => {\n      if (button.disabled) return;\n\n      const index = Number(button.dataset.optionIndex);\n      const select = selects[index];\n      if (!select) return;\n\n      select.value = button.dataset.optionValue;\n      onChange(index);\n    });\n  });\n})();\n"],
  "mappings": "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",
  "names": []
}
