{
  "version": 3,
  "sources": ["/cdn/shop/t/213/assets/ibkul-hide-soldout-swatches.js?nc=1518"],
  "sourcesContent": ["/**\r\n * IBKUL - Hide sold-out color swatches on product cards\r\n *\r\n * Covers swatch groups rendered by the swatch app on product cards:\r\n *   - Boost collection cards\r\n *   - \"Recently viewed\" cards on the PDP\r\n * The main PDP swatches are handled in Liquid by\r\n * snippets/ibkul-hide-soldout-colors.liquid (CSS, no JS needed).\r\n *\r\n * Product tags:\r\n *   hide-soldout         -> hide every sold-out color\r\n *   hide: Color|Color    -> hide only these colors, and only while sold out\r\n *\r\n * CW - 20261026 - Moved out of theme.liquid. Fixes:\r\n *   - One request per product (cached promise, no duplicate fetches)\r\n *   - Groups processed in parallel instead of one by one\r\n *   - Single scheduler: runs never overlap, one re-run if the DOM changed mid-run\r\n *   - No flash: card swatches stay invisible (space kept) until checked\r\n *   - Results cached in sessionStorage, so the next pages hide instantly\r\n */\r\n(function () {\r\n  'use strict';\r\n\r\n  const GROUP_SELECTOR = '.swatch-view[data-product-handle]';\r\n  const READY_ATTR = 'data-ibk-swatch-ready';\r\n  const DEFAULT_VISIBLE = 6;\r\n  const SCHEDULE_DELAY = 50;\r\n  const STORAGE_PREFIX = 'ibkHideSwatches:v1:';\r\n  const STORAGE_TTL = 10 * 60 * 1000; // 10 minutes\r\n\r\n  const memoryCache = {};\r\n\r\n  // Keep card swatches invisible until this script has checked them.\r\n  // Injected by the script itself: if the script never loads, swatches show as normal.\r\n  function injectStyle() {\r\n    if (document.getElementById('ibk-hide-soldout-swatches-style')) return;\r\n    const style = document.createElement('style');\r\n    style.id = 'ibk-hide-soldout-swatches-style';\r\n    style.textContent = `${GROUP_SELECTOR}:not([${READY_ATTR}]) { visibility: hidden; }`;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  function readStorage(handle) {\r\n    try {\r\n      const raw = sessionStorage.getItem(STORAGE_PREFIX + handle);\r\n      if (!raw) return null;\r\n      const entry = JSON.parse(raw);\r\n      if (!entry || Date.now() - entry.time > STORAGE_TTL) return null;\r\n      return Array.isArray(entry.colors) ? entry.colors : null;\r\n    } catch (err) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  function writeStorage(handle, colors) {\r\n    try {\r\n      sessionStorage.setItem(STORAGE_PREFIX + handle, JSON.stringify({ time: Date.now(), colors }));\r\n    } catch (err) {\r\n      // Storage full or blocked: memory cache still works for this page\r\n    }\r\n  }\r\n\r\n  // Colors to hide for a product: sold out AND (tagged hide-soldout OR listed in a hide: tag)\r\n  function getColorsToHide(product) {\r\n    const tags = product.tags || [];\r\n    const hideAllSoldOut = tags.includes('hide-soldout');\r\n    const hiddenColors = tags\r\n      .filter((tag) => tag.toLowerCase().startsWith('hide:'))\r\n      .flatMap((tag) =>\r\n        tag\r\n          .replace(/^hide:/i, '')\r\n          .split('|')\r\n          .map((color) => color.trim())\r\n          .filter(Boolean)\r\n      );\r\n\r\n    if (!hideAllSoldOut && hiddenColors.length === 0) return [];\r\n\r\n    const availability = {};\r\n    product.variants.forEach((variant) => {\r\n      const color = variant.option1;\r\n      if (!(color in availability)) availability[color] = false;\r\n      if (variant.available) availability[color] = true;\r\n    });\r\n\r\n    return Object.keys(availability).filter(\r\n      (color) => availability[color] === false && (hideAllSoldOut || hiddenColors.includes(color))\r\n    );\r\n  }\r\n\r\n  // Cache the promise so parallel runs share a single request\r\n  function getHiddenColors(handle) {\r\n    if (memoryCache[handle]) return memoryCache[handle];\r\n\r\n    const stored = readStorage(handle);\r\n    if (stored) {\r\n      memoryCache[handle] = Promise.resolve(stored);\r\n      return memoryCache[handle];\r\n    }\r\n\r\n    memoryCache[handle] = fetch(`/products/${handle}.js`)\r\n      .then((res) => {\r\n        if (!res.ok) throw new Error(`HTTP ${res.status}`);\r\n        return res.json();\r\n      })\r\n      .then((product) => {\r\n        const colors = getColorsToHide(product);\r\n        writeStorage(handle, colors);\r\n        return colors;\r\n      })\r\n      .catch((err) => {\r\n        delete memoryCache[handle];\r\n        throw err;\r\n      });\r\n\r\n    return memoryCache[handle];\r\n  }\r\n\r\n  function updateMinificationButton(group, hiddenCount) {\r\n    let minBtn = group.querySelector('.minification-btn');\r\n\r\n    if (hiddenCount <= 0) {\r\n      if (minBtn) minBtn.remove();\r\n      return;\r\n    }\r\n\r\n    if (!minBtn) {\r\n      minBtn = document.createElement('li');\r\n      minBtn.className = 'minification-btn swatch-minification btn-with-count';\r\n      minBtn.setAttribute('minification-btn', 'true');\r\n      minBtn.innerHTML = `\r\n        <div swatch-inside=\"true\" class=\"swatch-image swatch-selector swatch-allow-animation\">\r\n          <div class=\"star-set-image minification-text\" style=\"width:32px;height:32px\" swatch-inside=\"true\">\r\n            +${hiddenCount}\r\n          </div>\r\n        </div>\r\n      `;\r\n      group.appendChild(minBtn);\r\n      return;\r\n    }\r\n\r\n    const text = minBtn.querySelector('.minification-text');\r\n    if (text && text.textContent.trim() !== `+${hiddenCount}`) {\r\n      text.textContent = `+${hiddenCount}`;\r\n    }\r\n  }\r\n\r\n  function applyHide(group, colorsToHide) {\r\n    const maxVisible = parseInt(group.dataset.totalVisibleSwatches || DEFAULT_VISIBLE, 10);\r\n    const visibleSwatches = [];\r\n\r\n    group.querySelectorAll('.swatch-view-item').forEach((item) => {\r\n      if (colorsToHide.includes(item.getAttribute('orig-value'))) {\r\n        item.style.display = 'none';\r\n        return;\r\n      }\r\n      item.style.display = '';\r\n      item.classList.add('star-hide');\r\n      visibleSwatches.push(item);\r\n    });\r\n\r\n    visibleSwatches.slice(0, maxVisible).forEach((item) => item.classList.remove('star-hide'));\r\n    updateMinificationButton(group, Math.max(visibleSwatches.length - maxVisible, 0));\r\n  }\r\n\r\n  async function processGroup(group) {\r\n    const handle = group.dataset.productHandle;\r\n    try {\r\n      if (!handle) return;\r\n      const colorsToHide = await getHiddenColors(handle);\r\n      if (colorsToHide.length) applyHide(group, colorsToHide);\r\n    } catch (err) {\r\n      console.error('[IBKUL hide sold-out swatches]', handle, err);\r\n    } finally {\r\n      // Always reveal, even on error, so swatches never stay invisible\r\n      group.setAttribute(READY_ATTR, '');\r\n    }\r\n  }\r\n\r\n  function processSwatches() {\r\n    const groups = Array.from(document.querySelectorAll(GROUP_SELECTOR));\r\n    return Promise.all(groups.map(processGroup));\r\n  }\r\n\r\n  // Single scheduler: never run in parallel, re-run once if the DOM changed mid-run.\r\n  // A short timeout (not requestAnimationFrame) batches bursts of DOM changes and\r\n  // still runs when the tab is in the background.\r\n  let running = false;\r\n  let pending = false;\r\n\r\n  function scheduleProcess() {\r\n    if (running) {\r\n      pending = true;\r\n      return;\r\n    }\r\n    running = true;\r\n    setTimeout(async () => {\r\n      try {\r\n        await processSwatches();\r\n      } finally {\r\n        running = false;\r\n        if (pending) {\r\n          pending = false;\r\n          scheduleProcess();\r\n        }\r\n      }\r\n    }, SCHEDULE_DELAY);\r\n  }\r\n\r\n  injectStyle();\r\n  scheduleProcess();\r\n\r\n  // Cards are rendered after load (Boost filters, Recently viewed), so keep watching\r\n  const observer = new MutationObserver(scheduleProcess);\r\n  observer.observe(document.body, { childList: true, subtree: true });\r\n})();\r\n"],
  "mappings": "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",
  "names": []
}
