{
  "version": 3,
  "sources": ["/cdn/shop/t/56/assets/cardshop.js"],
  "sourcesContent": ["/* ==========================================================================\n   Cardshop \u2014 JS entry (original, ES module)\n   Phase 3: pub/sub bus, section-render Cart API, custom-element base, and\n   the disclosure-panel primitive now live in sibling modules \u2014 see\n   pubsub.js, section-render.js, cart-api.js, cardshop-element.js,\n   disclosure-panel.js, cart-drawer.js.\n   ========================================================================== */\n\nimport { addToCart } from 'cardshop/cart-api.js';\nimport { subscribe } from 'cardshop/pubsub.js';\nimport 'cardshop/cart-drawer.js';\nimport 'cardshop/cart-notification.js';\nimport 'cardshop/nav-drawer.js';\nimport 'cardshop/pinned-header.js';\nimport 'cardshop/announcement-bar.js';\nimport 'cardshop/facets.js';\nimport 'cardshop/product-recommendations.js';\nimport 'cardshop/recently-viewed.js';\nimport 'cardshop/cart-items.js';\nimport 'cardshop/cart-note.js';\nimport 'cardshop/predictive-search.js';\nimport 'cardshop/customer-addresses.js';\nimport 'cardshop/scroll-reveal.js';\n\n// Lightweight helper: run a callback when the DOM is ready.\nexport function onReady(fn) {\n  if (document.readyState !== 'loading') {\n    fn();\n  } else {\n    document.addEventListener('DOMContentLoaded', fn, { once: true });\n  }\n}\n\nonReady(() => {\n  document.documentElement.classList.add('cardshop-ready');\n});\n\n// ----------------------------------------------------------------------\n// Cart-count badges (header, and anywhere else [data-cart-count-badge]\n// shows up) react to cart changes instead of being poked directly by\n// whoever changed the cart. Deliberately its own attribute, distinct from\n// <cart-drawer>'s own data-cart-count (an initial-render-only count set\n// by Liquid, never touched at runtime) \u2014 data-cart-count would also\n// match the <cart-drawer> host element itself, and setting .textContent\n// on it wipes out its overlay/panel/line-item markup.\n//\n// The same event also drives the #cart-live-region announcer (see\n// layout/theme.liquid) so screen-reader users hear that the cart changed\n// \u2014 quantity/remove edits re-render the drawer/page sections silently\n// otherwise, since those swaps aren't themselves announced.\n// ----------------------------------------------------------------------\nonReady(() => {\n  const liveRegion = document.getElementById('cart-live-region');\n\n  subscribe('cart:updated', ({ itemCount } = {}) => {\n    if (itemCount === undefined) return;\n    document.querySelectorAll('[data-cart-count-badge]').forEach((el) => {\n      el.textContent = itemCount;\n    });\n    if (liveRegion && window.cartStrings?.updated) {\n      liveRegion.textContent = window.cartStrings.updated.replace('[count]', itemCount);\n    }\n  });\n});\n\n// ----------------------------------------------------------------------\n// Header cart icon: open the drawer instead of navigating when\n// cart_type is \"drawer\". The href stays a working fallback for other\n// cart types and no-JS.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const link = event.target.closest('.header__cart');\n    if (!link || window.cartType !== 'drawer') return;\n\n    const drawer = document.querySelector('cart-drawer');\n    if (!drawer) return;\n\n    event.preventDefault();\n    drawer.open(link);\n  });\n});\n\n// ----------------------------------------------------------------------\n// Mobile nav drawer: the hamburger button in sections/header.liquid is a\n// plain button (not the drawer's own trigger markup), so it opens the\n// <nav-drawer> imperatively via the same open()/close() API cart-drawer\n// uses.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const trigger = event.target.closest('[data-nav-drawer-open]');\n    if (!trigger) return;\n    const drawer = document.querySelector('nav-drawer');\n    if (drawer) drawer.open(trigger);\n  });\n});\n\n// ----------------------------------------------------------------------\n// Card quick-add (Phase 5, refactored in Phase 3 to use the shared Cart\n// API + bus instead of inline fetch/DOM mutation). Progressive\n// enhancement over the plain `{% form 'product' %}` in\n// snippets/card-product-quick-add.liquid \u2014 if the fetch fails, the\n// form's own POST + return_to fallback takes over.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('submit', (event) => {\n    const form = event.target.closest('.card-quick-add__form');\n    if (!form) return;\n\n    event.preventDefault();\n    const button = form.querySelector('.card-quick-add__button');\n    const formData = new FormData(form);\n\n    addToCart(formData)\n      .then(() => {\n        if (!button) return;\n        const addedLabel = button.getAttribute('data-added-label');\n        const addLabel = button.getAttribute('data-add-label');\n        button.classList.add('is-added');\n        if (addedLabel) button.setAttribute('aria-label', addedLabel);\n        window.setTimeout(() => {\n          button.classList.remove('is-added');\n          if (addLabel) button.setAttribute('aria-label', addLabel);\n        }, 1500);\n      })\n      .catch(() => {\n        // Fetch failed \u2014 fall back to a real form submission (return_to\n        // takes the shopper to /cart, same as a no-JS environment would).\n        form.submit();\n      });\n  });\n});\n\n// ----------------------------------------------------------------------\n// Product page \"Add to cart\" (HANDOFF \"Planned additions\" item 6): wires\n// the main product form into the same AJAX addToCart() path quick-add\n// already uses, so cart_type applies consistently everywhere instead of\n// only from collection/home-page quick-add tiles. drawer/notification need\n// no extra success handling here \u2014 the drawer/toast opening (via the\n// cart:item-added subscribers in cart-drawer.js/cart-notification.js) is\n// itself the confirmation. page type has no popup to open, so it navigates\n// to the cart page directly instead, matching theme-dev's own reference\n// behavior for this cart type (read for behavior only, not ported).\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('submit', (event) => {\n    const form = event.target.closest('.main-product__form');\n    if (!form) return;\n\n    event.preventDefault();\n\n    addToCart(new FormData(form))\n      .then(() => {\n        if (window.cartType === 'page') {\n          window.location.href = window.routes.cart_url;\n        }\n      })\n      .catch(() => {\n        // Same fallback precedent as quick-add: fetch failed, let the\n        // form's own POST + return_to take over.\n        form.submit();\n      });\n  });\n});\n\n// ----------------------------------------------------------------------\n// Product media lightbox (Phase 7): a thumbnail button sets the shared\n// <disclosure-panel class=\"media-lightbox\"> image src/alt from its own\n// data attributes, then opens it \u2014 one lightbox per page, reused across\n// every thumbnail, so this is just wiring rather than a new component.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const trigger = event.target.closest('[data-lightbox-open]');\n    if (!trigger) return;\n\n    const lightbox = document.querySelector('.media-lightbox');\n    const image = lightbox?.querySelector('[data-lightbox-image]');\n    if (!lightbox || !image) return;\n\n    image.src = trigger.getAttribute('data-lightbox-src') || '';\n    image.alt = trigger.getAttribute('data-lightbox-alt') || '';\n    lightbox.open(trigger);\n  });\n});\n\n// ----------------------------------------------------------------------\n// Product page \"Share\" button (Phase 7, extended per HANDOFF \"Planned\n// additions\" item 3): tries the native OS share sheet first where\n// navigator.share is supported (mainly mobile) \u2014 cancelling that sheet is\n// a silent no-op, no clipboard fallback, since the shopper already had and\n// declined that option. Only falls back to clipboard-copy (+ a label swap\n// confirmation) when navigator.share doesn't exist at all. Falls back to\n// doing nothing if neither API is available \u2014 no broken behavior either\n// way since there's no href to lose.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-share-link]');\n    if (!button) return;\n\n    const url = window.location.href;\n\n    if (navigator.share) {\n      navigator.share({ title: document.title, url }).catch(() => {});\n      return;\n    }\n\n    if (!navigator.clipboard) return;\n\n    navigator.clipboard.writeText(url).then(() => {\n      const copiedLabel = button.getAttribute('data-share-copied-label');\n      const label = button.getAttribute('data-share-label');\n      button.classList.add('is-copied');\n      if (copiedLabel) button.textContent = copiedLabel;\n      window.setTimeout(() => {\n        button.classList.remove('is-copied');\n        if (label) button.textContent = label;\n      }, 1500);\n    });\n  });\n});\n\n// ----------------------------------------------------------------------\n// Password page (Phase 11): the header's password-entry trigger opens the\n// shared <disclosure-panel> modal \u2014 same open()/close() API as every\n// other drawer/modal in this theme (cart-drawer, nav-drawer, search-modal).\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const trigger = event.target.closest('[data-password-open]');\n    if (!trigger) return;\n    const modal = document.querySelector('.password-modal');\n    if (modal) modal.open(trigger);\n  });\n});\n\n// ----------------------------------------------------------------------\n// Pickup availability (product page, HANDOFF \"Planned additions\" item 5):\n// the \"View store info\" trigger opens the shared <disclosure-panel>\n// modal, same convention as every other drawer/modal in this theme. No\n// AJAX needed \u2014 snippets/pickup-availability.liquid already renders fresh\n// current_variant.store_availabilities server-side on every page load.\n// ----------------------------------------------------------------------\nonReady(() => {\n  document.addEventListener('click', (event) => {\n    const trigger = event.target.closest('[data-pickup-open]');\n    if (!trigger) return;\n    const modal = document.querySelector('.pickup-availability-modal');\n    if (modal) modal.open(trigger);\n  });\n});\n\n// ----------------------------------------------------------------------\n// Every dropdown that opens as an overlay is a native <details>, and a\n// <details> has no click-away behavior of its own \u2014 re-clicking the same\n// summary was the only way to dismiss one. Any click that doesn't land\n// inside an open dropdown closes it, and Escape closes all of them.\n//\n// Deliberately a list rather than all <details>: the inline accordions\n// (cart note, address forms, password recovery, the nav drawer's submenus)\n// are expand/collapse sections that live in the page flow, and snapping\n// them shut on an unrelated click would be hostile.\n// ----------------------------------------------------------------------\nconst OVERLAY_DROPDOWNS = ['.custom-nav__dropdown', '.facets__group', '.quantity-popover'];\nconst OVERLAY_SELECTOR = OVERLAY_DROPDOWNS.join(', ');\nconst OVERLAY_OPEN_SELECTOR = OVERLAY_DROPDOWNS.map((sel) => `${sel}[open]`).join(', ');\nconst NAV_HOVER_DELAY_MS = 500;\nconst navHoverTimers = new WeakMap();\n\nfunction clearNavHoverTimer(dropdown) {\n  const timer = navHoverTimers.get(dropdown);\n  if (timer) window.clearTimeout(timer);\n  navHoverTimers.delete(dropdown);\n}\n\nfunction closeOverlayDropdowns(except) {\n  document.querySelectorAll(OVERLAY_OPEN_SELECTOR).forEach((dropdown) => {\n    if (dropdown === except) return;\n\n    clearNavHoverTimer(dropdown);\n    delete dropdown.dataset.navOpenMode;\n    dropdown.open = false;\n  });\n}\n\nonReady(() => {\n  const hoverCapableDesktop = window.matchMedia('(min-width: 990px) and (hover: hover)');\n\n  document.querySelectorAll('.custom-nav__dropdown').forEach((dropdown) => {\n    const summary = dropdown.querySelector(':scope > summary');\n    if (!summary) return;\n\n    dropdown.addEventListener('mouseenter', () => {\n      if (!hoverCapableDesktop.matches || dropdown.open) return;\n\n      clearNavHoverTimer(dropdown);\n      const timer = window.setTimeout(() => {\n        navHoverTimers.delete(dropdown);\n\n        // A menu explicitly opened by click stays in control until another\n        // click (or Escape) changes the selection. Merely passing over a\n        // neighbouring heading must not replace it.\n        const pinned = document.querySelector('.custom-nav__dropdown[open][data-nav-open-mode=\"pinned\"]');\n        if (pinned && pinned !== dropdown) return;\n\n        closeOverlayDropdowns(dropdown);\n        dropdown.dataset.navOpenMode = 'hover';\n        dropdown.open = true;\n      }, NAV_HOVER_DELAY_MS);\n      navHoverTimers.set(dropdown, timer);\n    });\n\n    dropdown.addEventListener('mouseleave', () => {\n      clearNavHoverTimer(dropdown);\n      if (dropdown.dataset.navOpenMode !== 'hover') return;\n      delete dropdown.dataset.navOpenMode;\n      dropdown.open = false;\n    });\n\n    summary.addEventListener('click', (event) => {\n      clearNavHoverTimer(dropdown);\n\n      // Clicking a menu that hover already revealed pins it instead of\n      // immediately toggling it shut beneath the pointer.\n      if (dropdown.open && dropdown.dataset.navOpenMode === 'hover') {\n        event.preventDefault();\n        dropdown.dataset.navOpenMode = 'pinned';\n        return;\n      }\n\n      if (dropdown.open) {\n        delete dropdown.dataset.navOpenMode;\n      } else {\n        document.querySelectorAll('.custom-nav__dropdown[data-nav-open-mode=\"pinned\"]').forEach((other) => {\n          if (other !== dropdown) delete other.dataset.navOpenMode;\n        });\n        dropdown.dataset.navOpenMode = 'pinned';\n      }\n    });\n\n    dropdown.addEventListener('toggle', () => {\n      if (!dropdown.open) delete dropdown.dataset.navOpenMode;\n    });\n  });\n\n  document.addEventListener('click', (event) => {\n    // A click on the summary \u2014 or anywhere inside the open panel, which for\n    // facets means its checkboxes and price inputs \u2014 belongs to that\n    // dropdown. Leave it to the native toggle and close only the others.\n    // A click-pinned header menu survives mouseleave, but any click outside\n    // that dropdown dismisses it just like the other overlay controls.\n    closeOverlayDropdowns(event.target.closest(OVERLAY_SELECTOR));\n  });\n\n  document.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape') closeOverlayDropdowns(null);\n  });\n});\n"],
  "mappings": "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",
  "names": []
}
