{
  "version": 3,
  "sources": ["/cdn/shop/t/67/assets/spacetrash.js?nocache=1791822316700"],
  "sourcesContent": ["/* SPACETRASH 4.0 \u2014 dependency-free storefront interactions. */\n(() => {\n  'use strict';\n\n  const $ = (selector, root = document) => root.querySelector(selector);\n  const $$ = (selector, root = document) => Array.from(root.querySelectorAll(selector));\n  let lastDrawerTrigger = null;\n\n  const focusableSelector = [\n    'a[href]',\n    'button:not([disabled])',\n    'input:not([disabled])',\n    'select:not([disabled])',\n    'textarea:not([disabled])',\n    '[tabindex]:not([tabindex=\"-1\"])'\n  ].join(',');\n\n  const setTriggerState = (drawerId, expanded) => {\n    $$(`[data-drawer-open=\"${drawerId}\"]`).forEach((trigger) => {\n      trigger.setAttribute('aria-expanded', String(expanded));\n    });\n  };\n\n  const openDrawer = (drawer, trigger = null) => {\n    if (!drawer) return;\n    lastDrawerTrigger = trigger || document.activeElement;\n    drawer.classList.add('is-open');\n    drawer.setAttribute('aria-hidden', 'false');\n    setTriggerState(drawer.id, true);\n    document.body.style.overflow = 'hidden';\n    const closeButton = $('button[data-drawer-close]', drawer);\n    const panel = $('.drawer__panel', drawer);\n    (closeButton || panel)?.focus();\n  };\n\n  const closeDrawer = (drawer) => {\n    if (!drawer) return;\n    drawer.classList.remove('is-open');\n    drawer.setAttribute('aria-hidden', 'true');\n    setTriggerState(drawer.id, false);\n    if (!$('.drawer.is-open')) document.body.style.overflow = '';\n    if (lastDrawerTrigger instanceof HTMLElement) lastDrawerTrigger.focus();\n    lastDrawerTrigger = null;\n  };\n\n  document.addEventListener('click', (event) => {\n    const openButton = event.target.closest('[data-drawer-open]');\n    if (openButton) {\n      event.preventDefault();\n      openDrawer($(`#${openButton.dataset.drawerOpen}`), openButton);\n      return;\n    }\n\n    const closeButton = event.target.closest('[data-drawer-close]');\n    if (closeButton) closeDrawer(closeButton.closest('.drawer'));\n  });\n\n  document.addEventListener('keydown', (event) => {\n    const drawer = $('.drawer.is-open');\n    if (!drawer) return;\n\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      closeDrawer(drawer);\n      return;\n    }\n\n    if (event.key !== 'Tab') return;\n    const focusable = $$(focusableSelector, drawer).filter((element) => element.offsetParent !== null);\n    if (!focusable.length) {\n      event.preventDefault();\n      $('.drawer__panel', drawer)?.focus();\n      return;\n    }\n\n    const first = focusable[0];\n    const last = focusable[focusable.length - 1];\n    if (event.shiftKey && document.activeElement === first) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && document.activeElement === last) {\n      event.preventDefault();\n      first.focus();\n    }\n  });\n\n  document.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-qty]');\n    if (!button) return;\n    const input = $('input', button.parentElement);\n    if (!input) return;\n    const step = button.dataset.qty === 'up' ? 1 : -1;\n    input.value = Math.max(1, (parseInt(input.value, 10) || 1) + step);\n    input.dispatchEvent(new Event('change', { bubbles: true }));\n  });\n\n  const formatMoney = (cents, currency) => {\n    try {\n      return new Intl.NumberFormat(document.documentElement.lang || 'en', {\n        style: 'currency',\n        currency: currency || 'USD'\n      }).format(Number(cents) / 100);\n    } catch (error) {\n      return `$${(Number(cents) / 100).toFixed(2)}`;\n    }\n  };\n\n  /* 6.3.3: ask the Shopify CDN for an image about as wide as the main slot needs\n     (theme assets and files both accept &width=), instead of the 1000\u20131254px originals. */\n  const sizedPdpSrc = (src, image) => {\n    if (!src || !/\\/cdn\\/shop\\//.test(src)) return src;\n    const slot = (image && image.clientWidth) || 400;\n    const width = Math.min(1200, Math.max(400, Math.ceil(slot * (window.devicePixelRatio || 1) / 200) * 200));\n    return /[?&]width=\\d+/.test(src)\n      ? src.replace(/([?&])width=\\d+/, `$1width=${width}`)\n      : `${src}${src.includes('?') ? '&' : '?'}width=${width}`;\n  };\n  const pdpDecoded = new Map();\n  const decodePdpSrc = (src) => {\n    if (!pdpDecoded.has(src)) {\n      const probe = new Image();\n      probe.decoding = 'async';\n      probe.src = src;\n      pdpDecoded.set(src, (probe.decode ? probe.decode() : Promise.resolve()).catch(() => {}));\n    }\n    return pdpDecoded.get(src);\n  };\n  window.stPdpPreload = (src, image) => decodePdpSrc(sizedPdpSrc(src, image));\n\n  const setPdpMedia = ({ src, alt, cutout = false, thumbnail = null }, scope = document) => {\n    const mainImage = $('[data-pdp-main]', scope);\n    if (!mainImage) return;\n    mainImage.closest('.pdp__media')?.dispatchEvent(new Event('st:product-zoom-reset'));\n    /* 6.3.3 (INP): decode off the main thread first, then swap. Setting src directly made the\n       next paint wait for a full-size decode (~0.6\u20131.3s per tap on mobile). */\n    const bare = (url) => String(url || '').replace(/^https?:/, '').replace(/[?&]width=\\d+/, '');\n    const token = String(Date.now() + Math.random());\n    mainImage.dataset.pdpPending = token;\n    const sameImage = bare(mainImage.getAttribute('src')) === bare(src);\n    const nextSrc = sameImage ? mainImage.getAttribute('src') : sizedPdpSrc(src, mainImage);\n    (sameImage ? Promise.resolve() : decodePdpSrc(nextSrc)).then(() => {\n      if (mainImage.dataset.pdpPending !== token) return;\n      if (!sameImage) {\n        mainImage.removeAttribute('srcset');\n        mainImage.removeAttribute('sizes');\n        mainImage.src = nextSrc;\n      }\n      mainImage.alt = alt || mainImage.alt;\n      mainImage.classList.toggle('is-cutout', cutout);\n      mainImage.dispatchEvent(new CustomEvent('st:pdp-media-swapped', { bubbles: true }));\n    });\n    if (thumbnail) {\n      const thumbnails = $$('[data-thumb]', scope);\n      thumbnails.forEach((button) => button.setAttribute('aria-current', String(button === thumbnail)));\n      const visible = thumbnails.filter((button) => !button.hidden);\n      const counter = $('[data-pdp-count]', scope);\n      if (counter) counter.textContent = `${Math.max(0, visible.indexOf(thumbnail)) + 1} / ${visible.length}`;\n      const strip = thumbnail.closest('.pdp__thumbs');\n      if (strip && strip.scrollWidth > strip.clientWidth) {\n        const delta = thumbnail.getBoundingClientRect().left - strip.getBoundingClientRect().left;\n        strip.scrollTo({ left: strip.scrollLeft + delta - (strip.clientWidth - thumbnail.clientWidth) / 2, behavior: 'auto' });\n      }\n    }\n  };\n\n  const initProductForm = (form) => {\n    const variantsElement = $('[data-product-variants]', form.parentElement);\n    if (!variantsElement) return;\n\n    let variants;\n    try {\n      variants = JSON.parse(variantsElement.textContent);\n    } catch (error) {\n      return;\n    }\n\n    const optionSelects = $$('[data-product-option-index]', form);\n    if (!optionSelects.length) return;\n\n    const updateVariant = () => {\n      const selectedOptions = optionSelects.map((select) => select.value);\n      const variant = variants.find((candidate) => (\n        candidate.options.every((option, index) => option === selectedOptions[index])\n      ));\n      const idInput = $('[name=\"id\"]', form);\n      const addButton = $('[data-add-to-cart-button]', form);\n      const status = $('[data-variant-status]');\n      const inventoryRow = $('[data-variant-inventory-row]');\n      const inventory = $('[data-variant-inventory]');\n      const price = $('[data-pdp-price]');\n      const currency = form.dataset.currency;\n\n      if (!variant) {\n        if (addButton) {\n          addButton.disabled = true;\n          addButton.textContent = 'Unavailable';\n        }\n        if (status) status.textContent = 'Unavailable';\n        if (inventoryRow) inventoryRow.hidden = true;\n        return;\n      }\n\n      if (idInput) {\n        idInput.value = variant.id;\n        idInput.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      if (addButton) {\n        addButton.disabled = !variant.available;\n        addButton.textContent = variant.available ? 'Add to cart' : 'Sold out';\n      }\n      if (status) status.textContent = variant.available ? 'Available' : 'Sold out';\n\n      const quantity = Number(variant.inventory_quantity);\n      const showInventory = variant.available && Number.isFinite(quantity) && quantity > 0 && quantity <= 100;\n      if (inventoryRow) inventoryRow.hidden = !showInventory;\n      if (inventory && showInventory) inventory.textContent = quantity;\n\n      if (price) {\n        const compare = Number(variant.compare_at_price);\n        const current = Number(variant.price);\n        price.innerHTML = compare > current\n          ? `<s>${formatMoney(compare, currency)}</s> ${formatMoney(current, currency)}`\n          : formatMoney(current, currency);\n      }\n\n      const pdpScope = form.closest('.pdp') || document;\n      const allThumbnails = $$('[data-thumb]', pdpScope);\n      const colorGallery = pdpScope.dataset?.pdpColorGallery === 'true';\n      if (colorGallery) {\n        const color = String(variant.option1 || variant.options[0] || '').toLowerCase();\n        allThumbnails.forEach((button) => {\n          button.hidden = Boolean(button.dataset.thumbColor && button.dataset.thumbColor !== color);\n        });\n      }\n      const matchesVariant = (ids) => (ids || '').split(',').includes(String(variant.id));\n      const thumbnail = allThumbnails.find((button) => matchesVariant(button.dataset.thumbVariantIds))\n        || (colorGallery ? allThumbnails.find((button) => !button.hidden) : null);\n      const image = variant.featured_image;\n      if (image?.src || thumbnail) {\n        const mainImage = $('[data-pdp-main]', pdpScope);\n        if (mainImage) {\n          const isObjectImage = matchesVariant(mainImage.dataset.pdpObjectVariantIds);\n          setPdpMedia({\n            src: thumbnail?.dataset.thumb || (isObjectImage ? mainImage.dataset.pdpObjectSrc : image.src),\n            alt: thumbnail?.dataset.thumbAlt || image?.alt,\n            cutout: thumbnail ? thumbnail.dataset.thumbCutout === 'true' : isObjectImage && mainImage.dataset.pdpObjectCutout === 'true',\n            thumbnail\n          }, pdpScope);\n        }\n      }\n      if (colorGallery) pdpScope.querySelector('.pdp__media')?.dispatchEvent(new Event('st:pdp-gallery-filtered'));\n\n      const url = new URL(window.location.href);\n      url.searchParams.set('variant', variant.id);\n      window.history.replaceState({}, '', url);\n    };\n\n    optionSelects.forEach((select) => select.addEventListener('change', updateVariant));\n    updateVariant();\n  };\n\n  $$('form[data-product-form]').forEach(initProductForm);\n\n  const refreshCart = async () => {\n    const drawer = $('#cart-drawer');\n    if (!drawer) return;\n\n    const sectionResponse = await fetch(`${window.routes.cart_url}?section_id=cart-drawer`);\n    if (!sectionResponse.ok) throw new Error('Cart section refresh failed');\n    const html = await sectionResponse.text();\n    const documentFragment = new DOMParser().parseFromString(html, 'text/html');\n    const currentPanel = $('.drawer__panel', drawer);\n    const sectionContent = $('.shopify-section', documentFragment) || documentFragment.body;\n    if (currentPanel && sectionContent) {\n      currentPanel.innerHTML = sectionContent.innerHTML;\n      // The product dialog renders its own gift card and is not inside this panel.\n      // Leave it on \"size\" and a later checkout click still sees a size gate.\n      const freshGift = currentPanel.querySelector('[data-founder-gift]');\n      if (freshGift) {\n        document.querySelectorAll('[data-founder-gift]').forEach((el) => {\n          if (drawer.contains(el)) return;\n          el.replaceWith(freshGift.cloneNode(true));\n        });\n      }\n    }\n\n    const cartResponse = await fetch(`${window.routes.cart_url}.js`, { cache: 'no-store' });\n    if (!cartResponse.ok) throw new Error('Cart count refresh failed');\n    const cart = await cartResponse.json();\n    $$('[data-cart-count]').forEach((element) => {\n      element.textContent = cart.item_count;\n      element.hidden = cart.item_count === 0;\n    });\n    if (typeof window.__stUpdateCartSnapshot === 'function') window.__stUpdateCartSnapshot(cart);\n    if (window.__stFounderGift) await window.__stFounderGift.syncCart(cart, cartResponse.headers.get('Date')).catch(() => {});\n    if (window.__stFounderReveal) window.__stFounderReveal.sync(cart);\n  };\n  window.__stRefreshCart = refreshCart;\n\n  const addToCart = async (form) => {\n    const button = $('[data-add-to-cart-button]', form);\n    const status = $('[data-cart-status]', form);\n    const originalLabel = button?.textContent || 'Add to cart';\n    if (button?.disabled) return;\n    if (status) {\n      status.textContent = '';\n      status.classList.remove('form-note--err');\n    }\n    if (button) {\n      button.disabled = true;\n      button.setAttribute('aria-busy', 'true');\n      button.textContent = 'Adding\u2026';\n    }\n\n    try {\n      const response = await fetch(window.routes.cart_add_url, {\n        method: 'POST',\n        headers: { Accept: 'application/json' },\n        body: new FormData(form)\n      });\n      if (!response.ok) throw new Error('Add to cart failed');\n      await response.json();\n      // Promotion bookkeeping cannot turn a successful add into a cart failure.\n      if (window.__stFounderGift) {\n        try { await window.__stFounderGift.afterSuccessfulAdd(response.headers.get('Date')); } catch (_) {}\n      }\n      await refreshCart();\n      if (button) {\n        button.classList.add('is-added');\n        button.textContent = 'Added \u2713 [Secured]';\n      }\n      if (status) status.textContent = 'Item added to your cart.';\n      // 6.2: the quick view is a modal <dialog> (top layer) \u2014 close it first or the drawer opens behind it.\n      const hostDialog = form.closest('dialog');\n      if (hostDialog && hostDialog.open) hostDialog.close();\n      openDrawer($('#cart-drawer'), hostDialog ? document.activeElement : button);\n      if (window.__stFounderReveal) window.__stFounderReveal.afterAdd();\n    } catch (error) {\n      if (status) {\n        status.classList.add('form-note--err');\n        status.textContent = 'Unable to add this item. Please try again.';\n      }\n    } finally {\n      window.setTimeout(() => {\n        if (button) {\n          button.classList.remove('is-added');\n          button.removeAttribute('aria-busy');\n          button.disabled = false;\n          button.textContent = originalLabel;\n        }\n      }, 1200);\n    }\n  };\n\n  // 2026-10-13: start the add on the submit button's click and never let the form submit.\n  // Shopify reports product_added_to_cart for every submit of a /cart/add form \u2014 even one we\n  // cancel, and before the add has happened \u2014 and again when the Ajax add succeeds. With both,\n  // every add counted twice in Meta (pixel + CAPI) and GA4. Without the submit event only the\n  // Ajax add is reported: once, and only when it worked. Covers the PDP button, the sticky bar\n  // (form=\"pdp-form\"), the quick view, and Enter in a field (the browser clicks the default button).\n  document.addEventListener('click', (event) => {\n    const target = event.target instanceof Element ? event.target : null;\n    const button = target && target.closest('button[type=\"submit\"], input[type=\"submit\"]');\n    const form = button && button.form;\n    if (!form || !form.matches('form[data-add-to-cart]')) return;\n    event.preventDefault();\n    addToCart(form);\n  }, true);\n\n  // Fallback for anything that still submits the form (requestSubmit, no submit button).\n  document.addEventListener('submit', (event) => {\n    const form = event.target.closest('form[data-add-to-cart]');\n    if (!form) return;\n    event.preventDefault();\n    addToCart(form);\n  });\n\n  const changeCartLine = async (control, line, quantity) => {\n    const errorMessage = $('[data-cart-error]');\n    if (errorMessage) errorMessage.textContent = '';\n    control.disabled = true;\n    try {\n      const response = await fetch(window.routes.cart_change_url, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n        body: JSON.stringify({ line, quantity: Math.max(0, quantity) })\n      });\n      if (!response.ok) throw new Error('Cart change failed');\n      if (document.body.classList.contains('template-cart')) window.location.reload();\n      else await refreshCart();\n    } catch (error) {\n      control.disabled = false;\n      if (errorMessage) errorMessage.textContent = 'Unable to update the cart. Please try again.';\n    }\n  };\n\n  document.addEventListener('click', (event) => {\n    const quantityButton = event.target.closest('[data-line-quantity]');\n    if (quantityButton) {\n      event.preventDefault();\n      changeCartLine(\n        quantityButton,\n        Number(quantityButton.dataset.lineQuantity),\n        Number(quantityButton.dataset.quantity)\n      );\n      return;\n    }\n\n    const removeButton = event.target.closest('[data-line-remove]');\n    if (!removeButton) return;\n    event.preventDefault();\n    changeCartLine(removeButton, Number(removeButton.dataset.lineRemove), 0);\n  });\n\n  document.addEventListener('click', (event) => {\n    const thumbnail = event.target.closest('[data-thumb]');\n    if (!thumbnail) return;\n    setPdpMedia({\n      src: thumbnail.dataset.thumb,\n      alt: thumbnail.dataset.thumbAlt,\n      cutout: thumbnail.dataset.thumbCutout === 'true',\n      thumbnail\n    }, thumbnail.closest('.pdp') || document);\n  });\n\n  const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const saveData = navigator.connection?.saveData === true;\n  if (reduceMotion || saveData) {\n    $$('[data-motion-video]').forEach((video) => {\n      video.pause();\n      video.removeAttribute('autoplay');\n    });\n  }\n})();\n\n/* checkout_start_click (2026-09-25 fix, 2026-10-02 G1 2-for-1 gift tracking fix).\n   Previously an inline <script> in snippets/cart-checkout-tracking.liquid bound listeners per surface.\n   That never worked for the drawer's main path: the drawer only rendered the script when the cart already had items,\n   and after an AJAX add-to-cart refreshCart() swaps in new HTML whose <script> never runs.\n   One capture-phase listener on document survives every re-render. Event shape is unchanged (immediate + with_cart; still divide by 2).\n   2026-10-02 G1 Fix:\n   1. Support all 3 gift handles: bad-angle-earring-pink-armor, bad-angle-earring-pink-wound, cruciform-flower-ring.\n   2. Pre-cache cart snapshot on load and on cart update so immediate click already includes cart data.\n   3. Capture gift_add_click when user clicks any .cart-upsell__add button.\n   2026-10-11 (6.3.7): since 10-05 the gift is a hidden $0 founders-gift-* product carrying the\n   `_founder_gift` line property, with no discount allocation, so has_addon was always false.\n   has_addon / gift_handle now recognise that line (gift_handle = the founders-gift-* handle);\n   the old discounted real-product gift is still recognised for legacy carts. */\n(() => {\n  if (window.__stCheckoutTrack) return;\n  window.__stCheckoutTrack = true;\n\n  const giftHandles = ['bad-angle-earring-pink-armor', 'bad-angle-earring-pink-wound', 'cruciform-flower-ring'];\n  const isGiftLine = (i) => Boolean(i && ((i.properties && i.properties._founder_gift) ||\n    /^founders-gift-/.test(i.handle || '') ||\n    (giftHandles.includes(i.handle) && (i.line_level_discount_allocations || []).length > 0)));\n\n  const track = (params) => {\n    if (typeof window.gtag === 'function') window.gtag('event', 'checkout_start_click', params);\n  };\n\n  let cachedSnapshot = null;\n\n  const parseCart = (c) => {\n    if (!c || typeof c !== 'object') return { cart_value: null, cart_items: null, has_addon: null, gift_handle: null };\n    const giftItem = (c.items || []).find(isGiftLine);\n    return {\n      cart_value: Math.round(c.total_price || 0) / 100,\n      cart_items: c.item_count || 0,\n      has_addon: Boolean(giftItem),\n      gift_handle: giftItem ? giftItem.handle : null,\n    };\n  };\n\n  const fetchCartSnapshot = () =>\n    fetch(`${(window.routes && window.routes.cart_url) || '/cart'}.js`, { cache: 'no-store', headers: { Accept: 'application/json' } })\n      .then(async (r) => {\n        if (!r.ok) throw new Error('Cart snapshot failed');\n        const c = await r.json();\n        if (window.__stFounderGift) window.__stFounderGift.syncCart(c, r.headers.get('Date')).catch(() => {});\n        return c;\n      })\n      .then((c) => {\n        cachedSnapshot = parseCart(c);\n        return cachedSnapshot;\n      })\n      .catch(() => ({ cart_value: null, cart_items: null, has_addon: null, gift_handle: null }));\n\n  // Expose cache updater for refreshCart\n  window.__stUpdateCartSnapshot = (cart) => {\n    cachedSnapshot = parseCart(cart);\n  };\n\n  // Pre-fetch cart snapshot on page load\n  fetchCartSnapshot();\n\n  // Wallet buttons live in a closed shadow root; composedPath is truncated there, so 'unknown' is expected.\n  const guessWallet = (event) => {\n    try {\n      const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n      const blob = path.map((n) => (!n || !n.tagName) ? '' :\n        `${n.tagName} ${typeof n.className === 'string' ? n.className : ''} ${n.getAttribute ? (n.getAttribute('aria-label') || '') : ''}`.toLowerCase()\n      ).join(' ');\n      if (blob.includes('shop-pay') || blob.includes('shoppay')) return 'shop_pay';\n      if (blob.includes('paypal')) return 'paypal';\n      if (blob.includes('google') || blob.includes('gpay')) return 'google_pay';\n    } catch (e) { /* expected on closed shadow roots */ }\n    return 'unknown';\n  };\n\n  const fire = (method, wallet, surface) => {\n    const immediateData = Object.assign({ method, wallet, surface, detail: 'immediate' }, cachedSnapshot || {});\n    track(immediateData);\n    fetchCartSnapshot().then((snap) => track({ method, wallet, surface, detail: 'with_cart', ...snap }));\n  };\n\n  document.addEventListener('click', (event) => {\n    const t = event.target;\n    if (!(t instanceof Element)) return;\n    const surface = t.closest('#cart-drawer') ? 'drawer' : 'cart';\n\n    // Gift Add button click tracking (2026-10-02 G1 fix)\n    const giftBtn = t.closest('.cart-upsell__add');\n    if (giftBtn) {\n      const giftHandle = giftBtn.getAttribute('data-gift-handle') || '';\n      const giftVariant = giftBtn.getAttribute('data-gift-variant') || '';\n      if (typeof window.gtag === 'function') {\n        window.gtag('event', 'gift_add_click', {\n          gift_handle: giftHandle,\n          gift_variant: giftVariant,\n          surface: surface\n        });\n      }\n      return;\n    }\n\n    // 6.3.9: a ring gift still waiting on a size is not a checkout. Only the surface\n    // being clicked counts \u2014 a stale size card in the product dialog must not drop\n    // checkout_start_click after the drawer has already revealed the gift.\n    const checkoutControl = t.closest('.cart-express, [name=\"checkout\"]');\n    if (checkoutControl) {\n      const surfaceRoot = t.closest('#cart-drawer') || checkoutControl.closest('form');\n      if (surfaceRoot && surfaceRoot.querySelector('[data-founder-gift][data-fg=\"size\"]')) return;\n      if (checkoutControl.closest('.cart-express')) fire('express', guessWallet(event), surface);\n      else fire('standard', 'none', surface);\n    }\n  }, true);\n})();\n\n\n/* ---- 6.1 (2026-10-01) ------------------------------------------------------\n   (a) Product grid: on touch screens the first tap on a card image swaps to the\n       worn image; a second tap follows the link. Desktop uses CSS :hover.\n   (b) PDP: swipe the main image left/right to step through the thumbnails.\n       Reuses the existing [data-thumb] click handler, so variant image logic stays in one place. */\n(() => {\n  const touchOnly = window.matchMedia('(hover: none)');\n  const track = (name, params) => { if (typeof window.gtag === 'function') window.gtag('event', name, params); };\n\n  // 6.2: tiles are <article class=\"product\"> with the link on .product-photo (was a.card).\n  document.addEventListener('click', (event) => {\n    const open = document.querySelector('.product.is-worn, .card.is-worn');\n    const ph = event.target.closest('[data-card-alt]');\n    if (!ph) {\n      if (open && !event.target.closest('.product, .card')) open.classList.remove('is-worn');\n      return;\n    }\n    if (!touchOnly.matches) return;\n    const card = ph.closest('.product, .card');\n    if (!card || card.classList.contains('is-worn')) return; // second tap: follow the link\n    event.preventDefault();\n    if (open) open.classList.remove('is-worn');\n    card.classList.add('is-worn');\n    track('card_worn_tap', { product_url: ph.getAttribute('href') || card.getAttribute('href') || '' });\n  }, true);\n\n  const media = document.querySelector('.pdp__media');\n  const allThumbs = Array.from(document.querySelectorAll('[data-thumb]'));\n  if (!media || allThumbs.length < 2) return;\n  const thumbs = () => allThumbs.filter((button) => !button.hidden);\n  const counter = media.querySelector('[data-pdp-count]');\n  const current = () => Math.max(0, thumbs().findIndex((b) => b.getAttribute('aria-current') === 'true'));\n  const refreshCount = () => { if (counter) counter.textContent = (current() + 1) + ' / ' + thumbs().length; };\n  allThumbs.forEach((b) => b.addEventListener('click', () => setTimeout(refreshCount, 0)));\n  media.addEventListener('st:pdp-gallery-filtered', refreshCount);\n\n  /* 6.3.3: warm the neighbours after load, and the whole gallery on the first touch of it,\n     so a tap swaps to an already-decoded image. */\n  const mainImg = media.querySelector('[data-pdp-main]');\n  const preload = (i) => { const visible = thumbs(); const b = visible[(i + visible.length) % visible.length]; if (b && window.stPdpPreload) window.stPdpPreload(b.dataset.thumb, mainImg); };\n  const idle = window.requestIdleCallback || ((fn) => setTimeout(fn, 1200));\n  window.addEventListener('load', () => idle(() => { preload(current() + 1); preload(current() - 1); }), { once: true });\n  let warmedGallery = '';\n  const warmAll = () => {\n    const visible = thumbs();\n    const signature = visible.map((b) => b.dataset.thumb).join('|');\n    if (warmedGallery === signature) return;\n    warmedGallery = signature;\n    visible.forEach((b, i) => preload(i));\n  };\n  media.parentElement.addEventListener('pointerdown', warmAll, { passive: true });\n  media.parentElement.addEventListener('focusin', warmAll);\n\n  let pendingDir = 0;\n  const step = (dir) => {\n    const visible = thumbs();\n    if (!visible.length) return;\n    pendingDir = dir;\n    visible[(current() + dir + visible.length) % visible.length].click();\n  };\n  /* Slide-in plays when the decoded image is actually swapped in, not on the tap. */\n  mainImg?.addEventListener('st:pdp-media-swapped', () => {\n    if (!pendingDir) return;\n    mainImg.classList.remove('is-in-next', 'is-in-prev');\n    void mainImg.offsetWidth;\n    mainImg.classList.add(pendingDir > 0 ? 'is-in-next' : 'is-in-prev');\n    pendingDir = 0;\n  });\n  media.querySelector('[data-pdp-gallery-prev]')?.addEventListener('click', () => step(-1));\n  media.querySelector('[data-pdp-gallery-next]')?.addEventListener('click', () => step(1));\n  media.tabIndex = 0;\n  media.setAttribute('role', 'group');\n  media.setAttribute('aria-label', 'Product image gallery');\n  const pdpGallery = media.parentElement;\n  pdpGallery.addEventListener('keydown', (event) => {\n    if (!event.target.closest('.pdp__media, .pdp__thumbs') || event.altKey || event.ctrlKey || event.metaKey) return;\n    if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n    event.preventDefault();\n    step(event.key === 'ArrowRight' ? 1 : -1);\n  });\n\n  let x0 = null, y0 = null, t0 = 0, swipes = 0;\n  media.addEventListener('touchstart', (e) => {\n    if (media.classList.contains('is-product-zoomed') || e.target.closest('button, a')) { x0 = null; return; }\n    if (e.touches.length !== 1) { x0 = null; return; }\n    x0 = e.touches[0].clientX; y0 = e.touches[0].clientY; t0 = Date.now();\n  }, { passive: true });\n  media.addEventListener('touchend', (e) => {\n    if (media.classList.contains('is-product-zoomed')) { x0 = null; return; }\n    if (x0 === null || !e.changedTouches.length) return;\n    const dx = e.changedTouches[0].clientX - x0, dy = e.changedTouches[0].clientY - y0;\n    x0 = null;\n    if (Math.abs(dx) < 40 || Math.abs(dx) < Math.abs(dy) * 1.2 || Date.now() - t0 > 900) return;\n    const dir = dx < 0 ? 1 : -1;\n    step(dir);\n    swipes += 1;\n    if (swipes === 1) track('pdp_swipe', { product_handle: location.pathname.split('/products/')[1] || '' });\n  }, { passive: true });\n  media.addEventListener('touchcancel', () => { x0 = null; }, { passive: true });\n})();\n\n\n/* ---- 6.1b (2026-10-01): custom option dropdown ------------------------------\n   Enhances every select[data-product-option-index] on the PDP. The native select stays the\n   source of truth: picking an option sets select.value and dispatches `change`, so the\n   existing variant logic (id / price / status / URL) is unchanged. Keyboard: Enter/Space/\n   ArrowDown opens, arrows move, Enter/Space picks, Esc closes. */\n(() => {\n  const selects = document.querySelectorAll('select[data-product-option-index]:not([data-no-dd])');\n  if (!selects.length) return;\n  let variants = [];\n  try { variants = JSON.parse(document.querySelector('[data-product-variants]')?.textContent || '[]'); } catch (e) {}\n  const RING_DIAMETER = { 'US 7': '\u00D8 0.68 in', 'US 9': '\u00D8 0.74 in' }; // same numbers as .pdp__sizeguide (10-13: inches only, was 17.3 / 18.9 mm)\n  let uid = 0;\n\n  selects.forEach((select) => {\n    const idx = Number(select.dataset.productOptionIndex);\n    const isSize = (select.dataset.optionName || '').toLowerCase() === 'size';\n    const wrap = document.createElement('div');\n    wrap.className = 'st-dd';\n    const listId = 'st-dd-list-' + (++uid);\n    wrap.innerHTML = '<button type=\"button\" class=\"st-dd__btn\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-controls=\"' + listId + '\">' +\n      '<span class=\"st-dd__val\"></span><span class=\"st-dd__chev\" aria-hidden=\"true\"></span></button>' +\n      '<ul class=\"st-dd__list\" id=\"' + listId + '\" role=\"listbox\" tabindex=\"-1\"></ul>';\n    const btn = wrap.querySelector('.st-dd__btn');\n    const list = wrap.querySelector('.st-dd__list');\n    const val = wrap.querySelector('.st-dd__val');\n    const label = document.querySelector('label[for=\"' + select.id + '\"]');\n    if (label) { label.id = label.id || select.id + '-label'; btn.setAttribute('aria-labelledby', label.id + ' ' + listId + '-cur'); list.setAttribute('aria-labelledby', label.id); }\n\n    const soldOut = (value) => {\n      const hits = variants.filter((v) => v.options && v.options[idx] === value);\n      return hits.length > 0 && hits.every((v) => !v.available);\n    };\n    const subFor = (value) => soldOut(value) ? 'Sold out' : (isSize ? (RING_DIAMETER[value] || '') : '');\n\n    const opts = Array.from(select.options).map((o, i) => {\n      const li = document.createElement('li');\n      li.className = 'st-dd__opt';\n      li.id = listId + '-o' + i;\n      li.setAttribute('role', 'option');\n      li.dataset.value = o.value;\n      li.style.setProperty('--i', i);\n      const sub = subFor(o.value);\n      li.innerHTML = '<span class=\"st-dd__name\"></span>' + (sub ? '<span class=\"st-dd__sub\"></span>' : '');\n      li.querySelector('.st-dd__name').textContent = o.textContent.trim();\n      if (sub) li.querySelector('.st-dd__sub').textContent = sub;\n      list.appendChild(li);\n      return li;\n    });\n\n    let active = -1;\n    const render = (animate) => {\n      const cur = select.value;\n      opts.forEach((li) => li.setAttribute('aria-selected', String(li.dataset.value === cur)));\n      const sub = subFor(cur);\n      val.innerHTML = '<span id=\"' + listId + '-cur\"></span>' + (sub ? '<span class=\"st-dd__sub\"></span>' : '');\n      val.firstChild.textContent = cur;\n      if (sub) val.lastChild.textContent = sub;\n      if (animate) { val.classList.remove('is-swap'); void val.offsetWidth; val.classList.add('is-swap'); }\n    };\n    const setActive = (i) => {\n      active = (i + opts.length) % opts.length;\n      opts.forEach((li, k) => li.classList.toggle('is-active', k === active));\n      list.setAttribute('aria-activedescendant', opts[active].id);\n    };\n    const open = () => {\n      document.querySelectorAll('.st-dd.is-open').forEach((d) => d !== wrap && d.dispatchEvent(new CustomEvent('st-dd-close')));\n      opts.forEach((li) => li.classList.remove('is-picked'));\n      wrap.classList.add('is-open');\n      btn.setAttribute('aria-expanded', 'true');\n      setActive(Math.max(0, opts.findIndex((li) => li.dataset.value === select.value)));\n      list.focus({ preventScroll: true });\n    };\n    const close = (refocus) => {\n      wrap.classList.remove('is-open');\n      btn.setAttribute('aria-expanded', 'false');\n      opts.forEach((li) => li.classList.remove('is-active'));\n      if (refocus) btn.focus({ preventScroll: true });\n    };\n    const pick = (i) => {\n      const li = opts[i];\n      const changed = li.dataset.value !== select.value;\n      li.classList.add('is-picked');\n      if (changed) {\n        select.value = li.dataset.value;\n        select.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      setTimeout(() => { close(true); render(changed); }, 170);\n    };\n\n    wrap.addEventListener('st-dd-close', () => close(false));\n    btn.addEventListener('click', () => (wrap.classList.contains('is-open') ? close(true) : open()));\n    btn.addEventListener('keydown', (e) => {\n      if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(e.key)) { e.preventDefault(); open(); }\n    });\n    list.addEventListener('keydown', (e) => {\n      if (e.key === 'ArrowDown') { e.preventDefault(); setActive(active + 1); }\n      else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(active - 1); }\n      else if (e.key === 'Home') { e.preventDefault(); setActive(0); }\n      else if (e.key === 'End') { e.preventDefault(); setActive(opts.length - 1); }\n      else if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); pick(active); }\n      else if (e.key === 'Escape') { e.preventDefault(); close(true); }\n      else if (e.key === 'Tab') { close(false); }\n    });\n    opts.forEach((li, i) => {\n      li.addEventListener('pointerenter', () => setActive(i));\n      li.addEventListener('click', () => pick(i));\n    });\n    document.addEventListener('click', (e) => { if (wrap.classList.contains('is-open') && !wrap.contains(e.target)) close(false); });\n    select.addEventListener('change', () => render(false));\n\n    select.classList.add('is-enhanced');\n    select.setAttribute('tabindex', '-1');\n    select.setAttribute('aria-hidden', 'true');\n    select.after(wrap);\n    render(false);\n  });\n})();\n\n\n/* ---- 6.2 (2026-10-01): creative redesign interactions -------------------------------\n   Ported from the creative demo script.js (r6-mobile-20261001) and wired to the store:\n   - every link keeps a real href (collections / pages / PDP); JS only enhances it\n   - \"Visit store\" became the cart, product dialog gained size + add to cart\n   - interactive type is scoped to [data-st-interactive] so PDP / cart text stays still */\n(() => {\n  'use strict';\n  const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n  const mqMobile = window.matchMedia('(max-width:700px)');\n  const track = (name, params) => { if (typeof window.gtag === 'function') window.gtag('event', name, params); };\n  const behavior = () => (reducedMotion.matches ? 'auto' : 'smooth');\n  const plainClick = (event) => !(event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey);\n\n  /* Olive page wipe (demo: page-transition) ---------------------------------------- */\n  const transitionLayer = document.createElement('div');\n  transitionLayer.className = 'page-transition';\n  transitionLayer.setAttribute('aria-hidden', 'true');\n  const transitionWordmark = document.createElement('span');\n  transitionWordmark.textContent = 'SPACETRASH';\n  transitionLayer.append(transitionWordmark);\n  document.body.append(transitionLayer);\n  let changingPage = false;\n\n  const afterWipe = () => new Promise((resolve) => {\n    const done = () => { clearTimeout(timer); transitionLayer.removeEventListener('transitionend', done); resolve(); };\n    const timer = setTimeout(done, 420);\n    transitionLayer.addEventListener('transitionend', done, { once: true });\n  });\n  const revealPage = () => {\n    transitionLayer.className = 'page-transition is-uncovering';\n    setTimeout(() => { transitionLayer.className = 'page-transition'; changingPage = false; }, 420);\n  };\n  const changePage = async (action, leavesDocument = false) => {\n    if (changingPage) return;\n    if (reducedMotion.matches) { action(); return; }\n    changingPage = true;\n    transitionLayer.className = 'page-transition is-covering';\n    await afterWipe();\n    try { action(); } finally { if (!leavesDocument) revealPage(); }\n  };\n  try {\n    if (sessionStorage.getItem('spacetrash-page-wipe') === '1') {\n      sessionStorage.removeItem('spacetrash-page-wipe');\n      if (!reducedMotion.matches) {\n        changingPage = true;\n        transitionLayer.className = 'page-transition is-covering';\n        requestAnimationFrame(() => requestAnimationFrame(revealPage));\n      }\n    }\n  } catch (error) { /* navigation works without session storage */ }\n  window.addEventListener('pageshow', (event) => {\n    if (event.persisted) { transitionLayer.className = 'page-transition'; changingPage = false; }\n  });\n  document.addEventListener('click', (event) => {\n    const link = event.target.closest('a[data-transition]');\n    if (!link || !plainClick(event) || link.target === '_blank' || link.hasAttribute('download')) return;\n    const destination = new URL(link.href, location.href);\n    if (destination.origin !== location.origin) return;\n    if (destination.pathname === location.pathname && destination.hash) return;\n    event.preventDefault();\n    changePage(() => {\n      try { sessionStorage.setItem('spacetrash-page-wipe', '1'); } catch (error) { /* optional entry wipe */ }\n      location.assign(destination.href);\n    }, true);\n  });\n\n  /* Shop mega menu (desktop hover/click, mobile toggle) ----------------------------- */\n  const siteHeader = document.querySelector('[data-site-header]');\n  const shopMenu = document.getElementById('shop-menu');\n  const shopToggle = document.getElementById('shop-toggle');\n  const mobileToggle = siteHeader ? siteHeader.querySelector('.mobile-menu-toggle') : null;\n  const setMenuState = (open) => {\n    if (!shopMenu) return;\n    shopMenu.hidden = !open;\n    [shopToggle, mobileToggle].filter(Boolean).forEach((t) => t.setAttribute('aria-expanded', String(open)));\n    if (mobileToggle) mobileToggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation');\n  };\n  const openShop = () => setMenuState(true);\n  const closeShop = () => setMenuState(false);\n  if (siteHeader && shopMenu) {\n    mobileToggle?.addEventListener('click', () => (shopMenu.hidden ? openShop() : closeShop()));\n    shopToggle?.addEventListener('click', (event) => {\n      if (event.pointerType === 'mouse' && window.matchMedia('(hover: hover)').matches) openShop();\n      else if (shopMenu.hidden) openShop(); else closeShop();\n    });\n    shopToggle?.addEventListener('pointerenter', (event) => { if (event.pointerType === 'mouse') openShop(); });\n    siteHeader.addEventListener('pointerleave', (event) => { if (event.pointerType === 'mouse' && !mqMobile.matches) closeShop(); });\n    shopMenu.querySelector('.menu-close')?.addEventListener('click', closeShop);\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape' && !shopMenu.hidden) { closeShop(); (mqMobile.matches ? mobileToggle : shopToggle)?.focus(); }\n    });\n    siteHeader.addEventListener('focusout', (event) => { if (!siteHeader.contains(event.relatedTarget)) closeShop(); });\n    document.addEventListener('click', (event) => { if (!siteHeader.contains(event.target)) closeShop(); });\n  }\n\n  /* Homepage objects: category filter + \"View all objects\" drawer ------------------- */\n  const objects = document.querySelector('[data-st-objects]');\n  const catalogDrawer = document.getElementById('all-objects');\n  const catalogToggle = objects ? objects.querySelector('.catalog-toggle') : null;\n  if (objects) {\n    const grid = objects.querySelector('[data-objects-grid]');\n    const titleEl = objects.querySelector('#collection-title');\n    const showAll = objects.querySelector('[data-show-all]');\n    const empty = objects.querySelector('[data-objects-empty]');\n    const titles = {\n      all: objects.dataset.titleAll || 'Best sellers', rings: 'Rings', earrings: 'Earrings', bracelets: 'Bracelets',\n      necklaces: 'Necklaces', brain: 'Brain Stimulation', angel: 'Bad Angel', entropic: 'Entropic Singularity', orbital: 'Orbital Bloom'\n    };\n    const pad = (n) => String(n).padStart(2, '0');\n    const filterObjects = (category) => {\n      if (!Object.prototype.hasOwnProperty.call(titles, category)) category = 'all';\n      grid.querySelectorAll('[data-clone]').forEach((node) => node.remove());\n      const featured = Array.from(grid.querySelectorAll('.product[data-featured]'));\n      let shown = 0;\n      if (category === 'all') {\n        featured.forEach((node) => { node.hidden = false; });\n        shown = featured.length;\n      } else {\n        featured.forEach((node) => { node.hidden = true; });\n        const pool = catalogDrawer ? Array.from(catalogDrawer.querySelectorAll('.product')) : featured;\n        pool.filter((node) => node.dataset.kind === category || node.dataset.series === category).forEach((node) => {\n          const clone = node.cloneNode(true);\n          clone.dataset.clone = '1';\n          clone.hidden = false;\n          clone.classList.remove('catalog-product');\n          shown += 1;\n          const number = clone.querySelector('.object-number');\n          if (number) number.textContent = pad(shown);\n          grid.append(clone);\n        });\n      }\n      if (titleEl) titleEl.textContent = titles[category];\n      if (showAll) showAll.hidden = category === 'all';\n      if (empty) empty.hidden = shown > 0;\n      document.querySelectorAll('[data-category]').forEach((link) => {\n        if (link.dataset.category === category && category !== 'all') link.setAttribute('aria-current', 'true');\n        else link.removeAttribute('aria-current');\n      });\n      if (category !== 'all') track('home_filter', { category });\n    };\n    document.addEventListener('click', (event) => {\n      const link = event.target.closest('[data-category]');\n      if (!link || !plainClick(event)) return;\n      event.preventDefault();\n      filterObjects(link.dataset.category);\n      closeShop();\n      objects.scrollIntoView({ behavior: behavior(), block: 'start' });\n    });\n    showAll?.addEventListener('click', () => filterObjects('all'));\n    const initial = new URLSearchParams(location.search).get('category');\n    if (initial) filterObjects(initial);\n  }\n\n  if (catalogDrawer && catalogToggle) {\n    const labelOpen = catalogToggle.dataset.labelOpen || 'View all objects';\n    const labelClose = catalogToggle.dataset.labelClose || 'Hide all objects';\n    const setCatalog = (open, scroll = false) => {\n      catalogDrawer.hidden = !open;\n      catalogToggle.setAttribute('aria-expanded', String(open));\n      catalogToggle.innerHTML = `${open ? labelClose : labelOpen} <span aria-hidden=\"true\">+</span>`;\n      if (open && scroll) catalogDrawer.scrollIntoView({ behavior: behavior(), block: 'start' });\n      if (!open) catalogToggle.focus({ preventScroll: true });\n      if (open) track('home_view_all', {});\n    };\n    catalogToggle.addEventListener('click', () => setCatalog(catalogDrawer.hidden, true));\n    catalogDrawer.querySelector('[data-close-catalog]')?.addEventListener('click', () => setCatalog(false));\n    document.addEventListener('click', (event) => {\n      const link = event.target.closest('[data-open-catalog]');\n      if (!link || !plainClick(event)) return;\n      event.preventDefault();\n      closeShop();\n      setCatalog(true, true);\n    });\n    if (location.hash === '#all-objects') setCatalog(true, true);\n  }\n\n  /* Product quick view (demo: product-dialog) + add to cart ------------------------- */\n  const dialog = document.getElementById('product-dialog');\n  if (dialog) {\n    const image = dialog.querySelector('#dialog-image');\n    const galleryMedia = dialog.querySelector('.dialog-gallery__media');\n    const galleryCount = dialog.querySelector('[data-qv-gallery-count]');\n    const playback = dialog.querySelector('[data-qv-gallery-playback]');\n    const galleryArrows = dialog.querySelectorAll('[data-qv-gallery-prev], [data-qv-gallery-next]');\n    const switcher = dialog.querySelector('.image-switch');\n    const sizes = dialog.querySelector('#dialog-sizes');\n    const variantInput = dialog.querySelector('#dialog-variant');\n    const addButton = dialog.querySelector('#dialog-add');\n    const status = dialog.querySelector('[data-cart-status]');\n    let opener = null;\n    let active = null;\n    let gallery = [];\n    let imageIndex = 0;\n    let slideshowTimer = null;\n    let pausedByUser = false;\n    let galleryGesture = false;\n\n    const stopAutoplay = () => {\n      clearTimeout(slideshowTimer);\n      slideshowTimer = null;\n    };\n    const updatePlayback = () => {\n      if (!playback) return;\n      playback.hidden = gallery.length < 2;\n      const zoomed = galleryMedia?.classList.contains('is-product-zoomed');\n      playback.disabled = Boolean(zoomed);\n      playback.textContent = zoomed ? 'Paused while zoomed' : pausedByUser ? 'Play' : 'Pause';\n      playback.setAttribute('aria-label', zoomed ? 'Slideshow paused while image is zoomed' : pausedByUser ? 'Play image slideshow' : 'Pause image slideshow');\n      playback.setAttribute('aria-pressed', String(pausedByUser || zoomed));\n    };\n    const scheduleAutoplay = () => {\n      stopAutoplay();\n      if (!dialog.open || !active || gallery.length < 2 || pausedByUser || galleryGesture || galleryMedia?.classList.contains('is-product-zoomed') || document.hidden) return;\n      slideshowTimer = setTimeout(() => {\n        showImage(imageIndex + 1);\n        scheduleAutoplay();\n      }, 5000);\n    };\n    const showImage = (index) => {\n      if (!active || !gallery.length) return;\n      galleryMedia?.dispatchEvent(new Event('st:product-zoom-reset'));\n      imageIndex = (index + gallery.length) % gallery.length;\n      const slide = gallery[imageIndex];\n      image.src = slide.src;\n      image.alt = slide.alt || active.fullTitle;\n      image.classList.toggle('object-view', slide.view === 'object');\n      image.classList.toggle('is-cutout', !!slide.cutout);\n      image.style.cssText = slide.cutout && slide.objectStyle ? slide.objectStyle : '';\n      if (galleryCount) {\n        galleryCount.textContent = `${imageIndex + 1} / ${gallery.length}`;\n        galleryCount.hidden = gallery.length < 2;\n      }\n      dialog.querySelectorAll('[data-image-view]').forEach((control) => {\n        control.setAttribute('aria-pressed', String(control.dataset.imageView === slide.view));\n      });\n      if (gallery.length > 1) {\n        const next = new Image();\n        next.src = gallery[(imageIndex + 1) % gallery.length].src;\n      }\n    };\n    const stepGallery = (direction) => {\n      showImage(imageIndex + direction);\n      scheduleAutoplay();\n    };\n\n    const showView = (worn) => {\n      if (!active) return;\n      const index = gallery.findIndex((slide) => slide.view === (worn ? 'worn' : 'object'));\n      showImage(index < 0 ? 0 : index);\n      scheduleAutoplay();\n    };\n    const pickVariant = (id) => {\n      variantInput.value = id;\n      sizes.querySelectorAll('.size-option').forEach((b) => b.setAttribute('aria-pressed', String(b.dataset.variantId === String(id))));\n      const v = active.variants.find((x) => String(x.id) === String(id));\n      addButton.disabled = !v || !v.available;\n      addButton.textContent = v && v.available ? addButton.dataset.labelAdd : addButton.dataset.labelSoldOut;\n    };\n    const fill = (data) => {\n      stopAutoplay();\n      active = data;\n      gallery = Array.isArray(data.gallery) ? data.gallery.filter((slide) => slide.src) : [];\n      if (!gallery.length) {\n        if (data.image) gallery.push({ src: data.image, alt: data.fullTitle, view: 'object', cutout: data.cutout, objectStyle: data.objectStyle });\n        if (data.worn && data.worn !== data.image) gallery.push({ src: data.worn, alt: `${data.fullTitle} worn`, view: 'worn', cutout: false });\n      }\n      pausedByUser = reducedMotion.matches;\n      galleryGesture = false;\n      galleryArrows.forEach((button) => { button.hidden = gallery.length < 2; });\n      if (galleryMedia) galleryMedia.hidden = !gallery.length;\n      updatePlayback();\n      dialog.dataset.handle = data.handle;\n      dialog.querySelector('#dialog-collection').textContent = data.series || '';\n      dialog.querySelector('#dialog-title').textContent = data.title;\n      dialog.querySelector('#dialog-price').innerHTML = data.priceHtml;\n      // 10-12: US shipping is free from $35; pieces under it (TT-SKU) say so in the small print.\n      const note = dialog.querySelector('[data-dialog-note]');\n      if (note) {\n        const cents = Number(data.price);\n        note.textContent = cents > 0 && cents < 3500 ? 'Free US shipping over $35 \u00B7 30-day returns.' : (note.dataset.noteDefault || note.textContent);\n      }\n      dialog.querySelector('#dialog-link').href = data.url;\n      if (status) { status.textContent = ''; status.classList.remove('form-note--err'); }\n      switcher.hidden = !gallery.some((slide) => slide.view === 'worn');\n      showView(!mqMobile.matches && !switcher.hidden);\n      sizes.innerHTML = '';\n      const firstAvailable = data.variants.find((v) => v.available) || data.variants[0];\n      if (!data.single && data.variants.length > 1) {\n        const label = document.createElement('span');\n        label.className = 'dialog-sizes__label';\n        label.textContent = data.optionName || 'Size';\n        sizes.append(label);\n        data.variants.forEach((v) => {\n          const b = document.createElement('button');\n          b.type = 'button';\n          b.className = 'size-option';\n          b.dataset.variantId = v.id;\n          b.textContent = v.title;\n          b.disabled = !v.available;\n          b.addEventListener('click', () => pickVariant(v.id));\n          sizes.append(b);\n        });\n        sizes.hidden = false;\n      } else {\n        sizes.hidden = true;\n      }\n      pickVariant(firstAvailable ? firstAvailable.id : '');\n    };\n\n    // Open instantly from the card's embedded JSON, then read the current\n    // Liquid payload in the background. Keeping a tab open must not freeze\n    // yesterday's price, variants or gallery; a changed payload refills the\n    // open dialog, an unchanged one leaves it untouched.\n    let productRequest = 0;\n    let productAbort = null;\n    const refreshProduct = async (json, data, request) => {\n      productAbort?.abort();\n      const controller = new AbortController();\n      productAbort = controller;\n      const timer = setTimeout(() => controller.abort(), 4000);\n      try {\n        const url = new URL(data.url, window.location.origin);\n        if (url.origin !== window.location.origin) return;\n        url.searchParams.set('section_id', 'st-product-data');\n        url.searchParams.set('_st_refresh', Date.now().toString());\n        const response = await fetch(url, { cache: 'no-store', credentials: 'same-origin', signal: controller.signal });\n        const showing = () => request === productRequest && dialog.open && dialog.dataset.handle === data.handle;\n        const doc = response.ok ? new DOMParser().parseFromString(await response.text(), 'text/html') : null;\n        const payload = doc && doc.querySelector('script[data-qv]');\n        if (response.status === 404 || response.status === 410 || (response.ok && !payload)) {\n          // Product removed or unpublished since this page loaded.\n          if (showing()) {\n            addButton.disabled = true;\n            addButton.textContent = addButton.dataset.labelSoldOut;\n          }\n          return;\n        }\n        if (!payload) return;\n        const current = JSON.parse(payload.textContent);\n        if (current.handle !== data.handle || typeof current.priceHtml !== 'string' || !Array.isArray(current.variants)) return;\n        const fresh = JSON.stringify(current);\n        // The next opening starts from the newest data, even offline.\n        json.textContent = fresh;\n        if (fresh !== JSON.stringify(data) && showing()) {\n          fill(current);\n          scheduleAutoplay();\n        }\n      } catch (error) {\n        // Timeout or network failure: the embedded data stays on screen.\n      } finally {\n        clearTimeout(timer);\n        if (productAbort === controller) productAbort = null;\n      }\n    };\n    document.addEventListener('click', (event) => {\n      const trigger = event.target.closest('[data-quickview]');\n      if (!trigger || !plainClick(event)) return;\n      const card = trigger.closest('.product');\n      const json = card && card.querySelector('script[data-qv]');\n      if (!json) return;\n      let data;\n      try { data = JSON.parse(json.textContent); } catch (error) { return; }\n      event.preventDefault();\n      const request = ++productRequest;\n      changePage(() => {\n        opener = trigger;\n        fill(data);\n        dialog.showModal();\n        scheduleAutoplay();\n        document.body.classList.add('modal-open');\n        track('quickview_open', { product_handle: data.handle });\n        refreshProduct(json, data, request);\n      });\n    });\n    dialog.querySelectorAll('[data-image-view]').forEach((button) => {\n      button.addEventListener('click', () => showView(button.dataset.imageView === 'worn'));\n    });\n    dialog.querySelector('[data-qv-gallery-prev]')?.addEventListener('click', () => stepGallery(-1));\n    dialog.querySelector('[data-qv-gallery-next]')?.addEventListener('click', () => stepGallery(1));\n    playback?.addEventListener('click', () => {\n      pausedByUser = !pausedByUser;\n      updatePlayback();\n      scheduleAutoplay();\n    });\n    galleryMedia?.addEventListener('st:product-zoom-change', () => {\n      updatePlayback();\n      scheduleAutoplay();\n    });\n    image.addEventListener('load', scheduleAutoplay);\n    dialog.addEventListener('keydown', (event) => {\n      if (!event.target.closest('.dialog-gallery') || event.altKey || event.ctrlKey || event.metaKey) return;\n      if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n      event.preventDefault();\n      stepGallery(event.key === 'ArrowRight' ? 1 : -1);\n    });\n    if (galleryMedia) {\n      let touchX = null, touchY = null, touchTime = 0;\n      galleryMedia.addEventListener('touchstart', (event) => {\n        touchX = null;\n        if (galleryMedia.classList.contains('is-product-zoomed') || event.target.closest('button, a') || event.touches.length !== 1) return;\n        touchX = event.touches[0].clientX;\n        touchY = event.touches[0].clientY;\n        touchTime = Date.now();\n        galleryGesture = true;\n        stopAutoplay();\n      }, { passive: true });\n      galleryMedia.addEventListener('touchend', (event) => {\n        const startX = touchX;\n        touchX = null;\n        galleryGesture = false;\n        if (!galleryMedia.classList.contains('is-product-zoomed') && startX !== null && event.changedTouches.length) {\n          const dx = event.changedTouches[0].clientX - startX;\n          const dy = event.changedTouches[0].clientY - touchY;\n          if (Math.abs(dx) >= 40 && Math.abs(dx) > Math.abs(dy) * 1.2 && Date.now() - touchTime < 900) showImage(imageIndex + (dx < 0 ? 1 : -1));\n        }\n        scheduleAutoplay();\n      }, { passive: true });\n      galleryMedia.addEventListener('touchcancel', () => {\n        touchX = null;\n        galleryGesture = false;\n        scheduleAutoplay();\n      }, { passive: true });\n    }\n    document.addEventListener('visibilitychange', scheduleAutoplay);\n    window.addEventListener('pagehide', stopAutoplay);\n    window.addEventListener('pageshow', scheduleAutoplay);\n    reducedMotion.addEventListener('change', (event) => {\n      if (!event.matches) return;\n      pausedByUser = true;\n      updatePlayback();\n      stopAutoplay();\n    });\n    dialog.querySelector('.close-dialog')?.addEventListener('click', () => dialog.close());\n    dialog.addEventListener('cancel', stopAutoplay);\n    dialog.addEventListener('click', (event) => {\n      const r = dialog.getBoundingClientRect();\n      if (event.target === dialog && (event.clientX < r.left || event.clientX > r.right || event.clientY < r.top || event.clientY > r.bottom)) dialog.close();\n    });\n    dialog.addEventListener('close', () => {\n      stopAutoplay();\n      active = null;\n      gallery = [];\n      document.body.classList.remove('modal-open');\n      opener?.focus({ preventScroll: true });\n    });\n    dialog.querySelector('#dialog-link')?.addEventListener('click', () => {\n      if (active) track('quickview_pdp_click', { product_handle: active.handle });\n    });\n  }\n\n  /* Campaign banner (6.2b): no pause button \u2014 the loop just plays. Reveal / placeholder fallback\n     runs inline in sections/st-campaign.liquid; here only the 700px phone/desktop source swap. */\n  const campaignVideo = document.querySelector('[data-campaign-video]');\n  if (campaignVideo) {\n    const banner = campaignVideo.closest('.campaign-banner');\n    window.matchMedia('(max-width:700px)').addEventListener('change', () => {\n      if (!banner || banner.classList.contains('is-fallback')) return;\n      banner.classList.remove('is-playing');\n      campaignVideo.load();\n      campaignVideo.play().catch(() => {});\n    });\n    reducedMotion.addEventListener('change', (event) => {\n      if (event.matches && banner) { banner.classList.remove('is-playing'); banner.classList.add('is-fallback'); campaignVideo.pause(); }\n    });\n  }\n\n  /* SHOP \u2014\u25CF\u2014 MORE rail: the bead follows the pointer ------------------------------- */\n  document.querySelectorAll('.motion-rail').forEach((rail) => {\n    const bead = rail.querySelector('.rolling-bead');\n    if (!bead) return;\n    rail.addEventListener('pointermove', (event) => {\n      const rect = rail.getBoundingClientRect();\n      bead.style.animation = 'none';\n      bead.style.left = `${Math.max(0, Math.min(rect.width - 14, event.clientX - rect.left - 7))}px`;\n    });\n    rail.addEventListener('pointerleave', () => { bead.style.animation = ''; bead.style.left = ''; });\n  });\n\n  /* Interactive type (demo), scoped to the redesigned surfaces ---------------------- */\n  const typeSelector = 'h1,h2,h3,h4,p,a,button,small,.product-info span,.object-number,.series-label>span,.footer-bottom>span';\n  const skipSelector = '.product-photo,.series-tile,.archive-card';\n  document.querySelectorAll('[data-st-interactive]').forEach((root) => {\n    root.querySelectorAll(typeSelector).forEach((element) => {\n      if (element.matches(skipSelector)) return;\n      element.classList.add('interactive-type');\n      if (!element.children.length || Array.from(element.children).every((child) => child.tagName === 'BR')) element.classList.add('type-leaf');\n    });\n  });\n\n  /* Brand cursor (desktop mouse only; touch, keyboard and form fields keep native) -- */\n  const cursorMedia = window.matchMedia('(hover: hover) and (pointer: fine) and (min-width:701px)');\n  const brandCursor = document.createElement('div');\n  brandCursor.className = 'brand-cursor';\n  brandCursor.setAttribute('aria-hidden', 'true');\n  document.body.append(brandCursor);\n  const hideBrandCursor = () => {\n    document.documentElement.classList.remove('brand-cursor-active');\n    brandCursor.classList.remove('is-pressed');\n  };\n  const trackBrandCursor = (event) => {\n    if (!cursorMedia.matches || event.pointerType !== 'mouse' || !(event.target instanceof Element)) { hideBrandCursor(); return; }\n    if (event.target.closest('input,textarea,select,[contenteditable=\"true\"],iframe,.jdgm-widget,.jm-review-widget')) { hideBrandCursor(); return; }\n    const surface = event.target.closest('dialog[open]') || document.body;\n    if (brandCursor.parentElement !== surface) surface.append(brandCursor);\n    brandCursor.style.transform = `translate3d(${event.clientX}px,${event.clientY}px,0)`;\n    brandCursor.classList.toggle('is-interactive', !!event.target.closest('a,button,summary,label,.interactive-type,.announcement,.bottom-band,[role=\"button\"]'));\n    document.documentElement.classList.add('brand-cursor-active');\n  };\n  document.addEventListener('pointermove', trackBrandCursor, { passive: true });\n  document.addEventListener('pointerover', trackBrandCursor, { passive: true });\n  document.addEventListener('pointerdown', (event) => { trackBrandCursor(event); if (event.pointerType === 'mouse') brandCursor.classList.add('is-pressed'); }, { passive: true });\n  document.addEventListener('pointerup', () => brandCursor.classList.remove('is-pressed'), { passive: true });\n  document.documentElement.addEventListener('pointerleave', hideBrandCursor);\n  document.addEventListener('keydown', hideBrandCursor);\n  document.addEventListener('visibilitychange', () => { if (document.hidden) hideBrandCursor(); });\n  window.addEventListener('blur', hideBrandCursor);\n  cursorMedia.addEventListener('change', hideBrandCursor);\n  dialog?.addEventListener('close', () => { document.body.append(brandCursor); hideBrandCursor(); });\n\n  /* Back to top (the sticky header is not a reliable #top target) ------------------- */\n  document.querySelectorAll('a[href$=\"#top\"]').forEach((link) => link.addEventListener('click', (event) => {\n    event.preventDefault();\n    window.scrollTo({ top: 0, behavior: behavior() });\n  }));\n\n  /* Same-page anchors (/#series, /#archive \u2026) scroll instead of reloading the homepage */\n  document.addEventListener('click', (event) => {\n    const link = event.target.closest('a[href*=\"#\"]');\n    if (!link || !plainClick(event) || link.hasAttribute('data-category') || link.hasAttribute('data-open-catalog')) return;\n    const url = new URL(link.href, location.href);\n    if (url.origin !== location.origin || url.pathname !== location.pathname || !url.hash || url.hash === '#top') return;\n    const target = document.getElementById(decodeURIComponent(url.hash.slice(1)));\n    if (!target) return;\n    event.preventDefault();\n    closeShop();\n    target.scrollIntoView({ behavior: behavior(), block: 'start' });\n    history.replaceState(null, '', url.hash);\n  });\n})();\n\n/* 6.3.1: one real founder-gift window per cart; never a repeating countdown. */\n(() => {\n  'use strict';\n  /* ST_FOUNDER_GIFT_FACTORY_START */\n  const createFounderGiftController = function (env) {\n    const DAY = 24 * 60 * 60 * 1000;\n    const START = 'Founder gift window started';\n    const END = 'Founder gift window ends';\n    const KEY = 'st-founder-gift-window-v1';\n    let token = null;\n    let record = null;\n    let serverOffset = 0;\n    let pendingStart = null;\n    let lastAttempt = -Infinity;\n    let queue = Promise.resolve();\n    const clock = () => env.now() + serverOffset;\n    const tokenOf = (cart) => typeof cart?.token === 'string' ? cart.token.split('?')[0] : '';\n    const stamp = (value) => typeof value === 'string' && /^\\d{4}-\\d\\d-\\d\\dT/.test(value) ? Date.parse(value) : NaN;\n    const validRecord = (start, end) => Number.isFinite(start) && start > 0 && start <= clock() + 300000 && Number.isFinite(end) && end > start && end - start <= DAY;\n    const fromAttributes = (attributes = {}) => {\n      const start = stamp(attributes[START]);\n      const end = stamp(attributes[END]);\n      if (!Number.isFinite(start)) return null;\n      const deadline = Number.isFinite(end) && end > start && end <= start + DAY ? end : start + DAY;\n      return validRecord(start, deadline) ? { start, end: deadline } : null;\n    };\n    const readLocal = (cartToken) => {\n      try {\n        const saved = JSON.parse(env.storage?.getItem(KEY) || 'null');\n        return saved?.token === cartToken && validRecord(saved.start, saved.end) ? { start: saved.start, end: saved.end } : null;\n      } catch (_) { return null; }\n    };\n    const writeLocal = () => {\n      if (!token || !record) return;\n      try { env.storage?.setItem(KEY, JSON.stringify({ token, start: record.start, end: record.end })); } catch (_) { /* Cart attributes still recover it. */ }\n    };\n    const earliest = (records) => {\n      const candidates = records.filter(Boolean).sort((a, b) => a.start - b.start || a.end - b.end);\n      if (!candidates.length) return null;\n      const first = candidates[0];\n      return { start: first.start, end: Math.min(first.start + DAY, ...candidates.map((value) => value.end)) };\n    };\n    const updateClock = (date) => {\n      const time = date && Date.parse(date);\n      if (Number.isFinite(time)) serverOffset = time - env.now();\n    };\n    const snapshot = () => {\n      if (!record) return { state: pendingStart === null ? 'idle' : 'pending', start: pendingStart, end: null, remaining: null };\n      const remaining = Math.max(0, Math.ceil((record.end - clock()) / 1000));\n      return { state: record.persisted ? (remaining > 0 ? 'active' : 'expired') : 'pending', start: record.start, end: record.end, remaining };\n    };\n    const render = () => {\n      const state = snapshot();\n      const hours = state.remaining === null ? 0 : Math.floor(state.remaining / 3600);\n      const minutes = state.remaining === null ? 0 : Math.floor(state.remaining % 3600 / 60);\n      const seconds = state.remaining === null ? 0 : state.remaining % 60;\n      const time = state.state === 'active' ? `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')} remaining`\n        : state.state === 'expired' ? 'YOUR 24-HOUR WINDOW HAS ENDED'\n        : state.state === 'pending' ? 'GIFT WINDOW PENDING'\n        : '24H AFTER ADDING';\n      /* 6.3.3: every qualifying order gets a gift (random among pieces of equal price; five from 6.3.4) \u2014 no \"chance\" copy. */\n      const copy = state.state === 'expired' ? 'The 24-hour gift window for this cart has ended. You can still shop your objects.'\n        : state.state === 'pending' ? 'Your item is in the cart. We\u2019re confirming your gift window; refresh before checkout if this message remains.'\n        : 'Add any SPACETRASH piece and our founder picks a piece for you, on us.';\n      env.panels().forEach((panel) => {\n        panel.dataset.state = state.state;\n        const timer = panel.querySelector('[data-founder-gift-time]');\n        const text = panel.querySelector('[data-founder-gift-copy]');\n        const status = panel.querySelector('[data-founder-gift-status]');\n        const fg = panel.dataset.fg || 'idle';\n        const panelTime = fg === 'revealed' && state.state === 'active' ? time.replace('remaining', 'left to keep it')\n          : fg === 'revealed' || fg === 'held' || state.state === 'expired' ? time\n          : 'ONE GIFT PER ORDER';\n        if (timer && timer.textContent !== panelTime) timer.textContent = panelTime;\n        // 10-18: a one-piece pool names the gift (data-fg-idle-copy from st-founder-gift.liquid).\n        const panelCopy = state.state === 'expired' || state.state === 'pending' ? copy : (panel.dataset.fgIdleCopy || copy);\n        if (text && !panel.hasAttribute('data-copy-static') && text.textContent !== panelCopy) text.textContent = panelCopy;\n        const announcement = `${state.state}:${state.start || ''}:${fg}`;\n        if (panel.dataset.giftAnnouncement !== announcement) {\n          panel.dataset.giftAnnouncement = announcement;\n          if (status) status.textContent = fg === 'revealed' && state.state === 'active' ? 'Your founder\u2019s gift is reserved for 24 hours.'\n            : state.state === 'expired' ? 'Your founder gift window has ended.' : '';\n        }\n      });\n      return state;\n    };\n    const serial = (work) => {\n      const next = queue.then(work, work);\n      queue = next.catch(() => {});\n      return next;\n    };\n    const request = async (url, options = {}) => {\n      const controller = new env.AbortController();\n      const timeout = env.setTimeout(() => controller.abort(), 4000);\n      try {\n        const response = await env.fetch(url, { ...options, signal: controller.signal, cache: 'no-store', credentials: 'same-origin', headers: { Accept: 'application/json', ...(options.headers || {}) } });\n        if (!response.ok) throw new Error('Cart promotion request failed');\n        return { cart: await response.json(), date: response.headers?.get('Date') };\n      } finally { env.clearTimeout(timeout); }\n    };\n    const applyCart = (cart, date) => {\n      updateClock(date);\n      const nextToken = tokenOf(cart);\n      if (!nextToken) return false;\n      if (nextToken !== token) { token = nextToken; record = null; }\n      const remote = fromAttributes(cart.attributes);\n      const pending = pendingStart === null ? null : { start: pendingStart, end: pendingStart + DAY };\n      const selected = earliest([remote, readLocal(token), record, pending]);\n      pendingStart = null;\n      record = selected ? { ...selected, persisted: !!remote && remote.start === selected.start && remote.end === selected.end && cart.attributes?.[START] === new Date(selected.start).toISOString() && cart.attributes?.[END] === new Date(selected.end).toISOString() } : null;\n      writeLocal();\n      render();\n      return true;\n    };\n    const persist = async (force = false) => {\n      if (!record || record.persisted || !token || (!force && env.now() - lastAttempt < 15000)) return;\n      lastAttempt = env.now();\n      // Only these names are updated; other cart attributes, quantities and notes survive.\n      const requested = { token, start: record.start, end: record.end };\n      try {\n        const result = await request(env.cartUrl + '/update.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ attributes: {\n            [START]: new Date(requested.start).toISOString(),\n            [END]: new Date(requested.end).toISOString(),\n            '__Founder gift campaign': 'founder-gift-random-v2'\n          } })\n        });\n        if (tokenOf(result.cart) !== requested.token || token !== requested.token) return;\n        applyCart(result.cart, result.date);\n      } catch (_) { render(); /* Keep the original pending time for the next retry. */ }\n    };\n    const syncCart = (cart, date) => serial(async () => {\n      if (applyCart(cart, date)) await persist();\n      return render();\n    });\n    const afterSuccessfulAdd = (date) => {\n      const received = date && Date.parse(date);\n      const successfulAt = Number.isFinite(received) ? received : clock();\n      return serial(async () => {\n        const begin = async () => {\n          // Re-read the cart before writing, including changes made in another tab.\n          try {\n            const result = await request(env.cartUrl + '.js');\n            if (!applyCart(result.cart, result.date || date)) { pendingStart = pendingStart === null ? successfulAt : Math.min(pendingStart, successfulAt); return render(); }\n            if (!record) {\n              const start = successfulAt;\n              record = { start, end: start + DAY, persisted: false };\n              writeLocal();\n              render();\n            }\n            await persist(true);\n          } catch (_) {\n            // A confirmed cart identity is necessary; never invent a ticking window.\n            if (token && !record) {\n              updateClock(date);\n              const start = successfulAt;\n              record = { start, end: start + DAY, persisted: false };\n              writeLocal();\n            } else if (!token) {\n              pendingStart = pendingStart === null ? successfulAt : Math.min(pendingStart, successfulAt);\n            }\n            render();\n          }\n          return render();\n        };\n        return env.lock ? env.lock('st-founder-gift-first-add', begin) : begin();\n      });\n    };\n    const recover = () => serial(async () => {\n      try {\n        const result = await request(env.cartUrl + '.js');\n        if (applyCart(result.cart, result.date)) await persist(true);\n      } catch (_) { render(); }\n      return render();\n    });\n    const interval = env.setInterval(render, 1000);\n    return { syncCart, afterSuccessfulAdd, recover, render, snapshot, destroy: () => env.clearInterval(interval) };\n  };\n  /* ST_FOUNDER_GIFT_FACTORY_END */\n  let storage = null;\n  try { storage = window.localStorage; } catch (_) { /* Browsers may disable storage. */ }\n  const offer = createFounderGiftController({\n    now: () => Date.now(),\n    fetch: (url, options) => fetch(url, options),\n    storage,\n    panels: () => Array.from(document.querySelectorAll('[data-founder-gift]')),\n    cartUrl: (window.routes && window.routes.cart_url) || '/cart',\n    AbortController,\n    setTimeout: window.setTimeout.bind(window),\n    clearTimeout: window.clearTimeout.bind(window),\n    setInterval: window.setInterval.bind(window),\n    clearInterval: window.clearInterval.bind(window),\n    lock: navigator.locks?.request ? (name, work) => navigator.locks.request(name, work) : null\n  });\n  window.__stFounderGift = offer;\n  offer.render();\n  window.addEventListener('online', () => { offer.recover().catch(() => {}); });\n  window.addEventListener('pageshow', (event) => { if (event.persisted) offer.recover().catch(() => {}); });\n  window.addEventListener('storage', (event) => { if (event.key === 'st-founder-gift-window-v1') offer.recover().catch(() => {}); });\n  document.addEventListener('visibilitychange', () => { if (!document.hidden) offer.recover().catch(() => {}); });\n})();\n\n/* 6.3.3 (2026-10-05) Founder's gift reveal \u2014 the founder picks the gift, the customer does not.\n   One draw per order (cart attribute \"Founder gift drawn\" = handle|variantId|ISO), no swaps, no re-rolls.\n   - afterAdd(): after a successful add + drawer refresh. Draws if the cart qualifies and nothing was drawn yet;\n     restores the SAME gift if it was set aside because no qualifying piece was left (\"held\").\n   - sync(): after every drawer refresh. Sets the gift aside when no qualifying piece remains, and\n     releases it when the 24-hour window (window controller above) has ended.\n   - Removing the gift line on purpose marks \"Founder gift released\": it never comes back for this order.\n   The $0 price is the automatic discount (bogo-eligible-auto \u2192 one of the three gifts); TT-SKU never qualifies. */\n(() => {\n  'use strict';\n  const DRAWN = 'Founder gift drawn';\n  const RELEASED = 'Founder gift released';\n  const PROP = '_founder_gift';\n  const cartUrl = (window.routes && window.routes.cart_url) || '/cart';\n  const addUrl = (window.routes && window.routes.cart_add_url) || '/cart/add';\n  const changeUrl = (window.routes && window.routes.cart_change_url) || '/cart/change';\n  const reduceMotion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  let busy = false;\n\n  const track = (name, params = {}) => {\n    try {\n      if (typeof window.gtag === 'function') window.gtag('event', name, params);\n      if (typeof window.clarity === 'function') window.clarity('event', name);\n    } catch (_) { /* analytics must never break the cart */ }\n  };\n  const postJSON = async (url, body) => {\n    const response = await fetch(url, {\n      method: 'POST', credentials: 'same-origin', keepalive: true,\n      headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n      body: JSON.stringify(body)\n    });\n    if (!response.ok) throw new Error(`${url} failed`);\n    return response.json();\n  };\n  const setAttributes = (attributes) => postJSON(`${cartUrl}/update.js`, { attributes });\n  const panel = () => document.querySelector('#cart-drawer [data-founder-gift]');\n  const pool = (el) => { try { return JSON.parse(el.querySelector('[data-fg-pool]')?.textContent || '[]'); } catch (_) { return []; } };\n  const randomIndex = (n) => {\n    if (n <= 1) return 0;\n    try { const a = new Uint32Array(1); crypto.getRandomValues(a); return a[0] % n; } catch (_) { return Math.floor(Math.random() * n); }\n  };\n  const windowExpired = () => window.__stFounderGift?.snapshot?.().state === 'expired';\n  const refresh = () => (window.__stRefreshCart ? window.__stRefreshCart() : Promise.resolve());\n  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n\n  const addGift = async (gift, variantId) => {\n    // Attribute first so a refresh cannot treat the new line as not-drawn and remove it.\n    await setAttributes({ [DRAWN]: `${gift.handle}|${variantId}|${new Date().toISOString()}` });\n    await postJSON(`${addUrl}.js`, { items: [{ id: Number(variantId), quantity: 1, properties: { [PROP]: gift.name } }] });\n  };\n\n  /* ---------- the show ---------- */\n  const sparkBurst = (box) => {\n    if (!box || reduceMotion()) return;\n    box.innerHTML = '';\n    for (let i = 0; i < 18; i += 1) {\n      const s = document.createElement('span');\n      const angle = (Math.PI * 2 * i) / 18 + Math.random() * 0.3;\n      const dist = 60 + Math.random() * 70;\n      s.style.setProperty('--dx', `${Math.cos(angle) * dist}px`);\n      s.style.setProperty('--dy', `${Math.sin(angle) * dist}px`);\n      s.style.setProperty('--d', `${520 + Math.random() * 380}ms`);\n      s.className = i % 3 === 0 ? 'is-star' : '';\n      box.append(s);\n    }\n    setTimeout(() => { box.innerHTML = ''; }, 1100);\n  };\n\n  const play = (el, items, winner) => new Promise((resolve) => {\n    const stage = el.querySelector('[data-fg-stage]');\n    const reel = el.querySelector('[data-fg-reel]');\n    const crate = el.querySelector('[data-fg-crate]');\n    const headline = el.querySelector('[data-fg-headline]');\n    const skip = el.querySelector('[data-fg-skip]');\n    if (!stage || !reel) { resolve(); return; }\n    // Long strip: several laps through the pool, ending on the winner.\n    const laps = reduceMotion() ? 0 : 6;\n    const strip = [];\n    for (let lap = 0; lap < laps; lap += 1) items.forEach((it) => strip.push(it));\n    strip.push(winner);\n    reel.innerHTML = strip.map((it) => `<div class=\"st-fg-slide\"><img src=\"${it.image}\" alt=\"\" width=\"120\" height=\"120\" decoding=\"async\"></div>`).join('');\n    el.classList.add('is-revealing');\n    stage.hidden = false;\n    headline.textContent = items.length === 1 ? 'Unboxing your gift\u2026' : 'The founder is choosing\u2026';\n    let done = false;\n    const animations = [];\n    const finish = () => {\n      if (done) return;\n      done = true;\n      animations.forEach((a) => { try { a.finish(); } catch (_) {} });\n      reel.style.transform = `translateX(${-(strip.length - 1) * 100}%)`;\n      el.classList.add('is-landed');\n      sparkBurst(el.querySelector('[data-fg-sparks]'));\n      try { if (navigator.vibrate) navigator.vibrate([18, 40, 28]); } catch (_) {}\n      headline.innerHTML = items.length === 1 ? `Your <strong>${winner.name}</strong> \u2014 on us.` : `The founder picked <strong>${winner.name}</strong> for you \u2014 on us.`;\n      skip.hidden = true;\n      resolve();\n    };\n    skip.hidden = reduceMotion();\n    skip.onclick = finish;\n    // Backgrounded tabs pause animations; never leave the customer waiting on a paused show.\n    setTimeout(finish, 4500);\n    stage.addEventListener('click', (e) => { if (!e.target.closest('[data-fg-sizes]')) finish(); }, { once: true });\n    if (reduceMotion() || !reel.animate) { finish(); return; }\n    // Images first (they are small and cached by the drawer), then shake \u2192 spin \u2192 settle.\n    Promise.race([Promise.all([...reel.querySelectorAll('img')].map((img) => img.decode?.().catch(() => {}))), sleep(900)]).then(() => {\n      if (done) return;\n      const shake = crate.animate([\n        { transform: 'rotate(0)' }, { transform: 'rotate(-6deg)' }, { transform: 'rotate(5deg)' },\n        { transform: 'rotate(-4deg)' }, { transform: 'rotate(3deg)' }, { transform: 'scale(1.08)', opacity: 1 }, { transform: 'scale(.6)', opacity: 0 }\n      ], { duration: 650, easing: 'ease-in-out', fill: 'forwards' });\n      animations.push(shake);\n      shake.onfinish = () => {\n        if (done) return;\n        el.classList.add('is-spinning');\n        const spin = reel.animate([\n          { transform: 'translateX(0)', filter: 'blur(0)' },\n          { transform: `translateX(${-(strip.length - 1) * 60}%)`, filter: 'blur(2px)', offset: 0.55 },\n          { transform: `translateX(${-(strip.length - 1) * 100}%)`, filter: 'blur(0)' }\n        ], { duration: 1900, easing: 'cubic-bezier(.15,.75,.2,1)', fill: 'forwards' });\n        animations.push(spin);\n        spin.onfinish = finish;\n      };\n    });\n  });\n\n  const draw = async (el) => {\n    const items = pool(el);\n    if (!items.length) return;\n    const winner = items[randomIndex(items.length)];\n    // Lock the draw before the show: closing the drawer or reloading can never re-roll it.\n    const needsSize = winner.variants.length > 1;\n    const single = needsSize ? 'size' : winner.variants[0]?.id;\n    if (!single) return;\n    await setAttributes({ [DRAWN]: `${winner.handle}|${single}|${new Date().toISOString()}` });\n    track('founder_gift_draw', { gift_handle: winner.handle, needs_size: needsSize ? 'true' : 'false' });\n    // Size buttons are server-rendered on the next refresh. Don't wait on a click while busy.\n    if (needsSize) el.dataset.fg = 'size';\n    await play(el, items, winner);\n    if (!needsSize) {\n      await addGift(winner, single);\n      track('founder_gift_reveal', { gift_handle: winner.handle, gift_variant: String(single) });\n      await sleep(reduceMotion() ? 0 : 900);\n    }\n    await refresh();\n  };\n\n  const restore = async (el) => {\n    const [handle, variant] = String(el.dataset.fgDrawn || '').split('|');\n    const gift = pool(el).find((g) => g.handle === handle);\n    const variantId = gift && gift.variants.find((v) => String(v.id) === String(variant))?.id;\n    // A missing size is the liquid \"size\" state. Never block here waiting for a click.\n    if (!gift || !variantId) return;\n    await addGift(gift, variantId);\n    track('founder_gift_restore', { gift_handle: gift.handle });\n    await refresh();\n  };\n\n  const afterAdd = async () => {\n    if (busy) return;\n    const el = panel();\n    if (!el || el.dataset.fgEligible !== 'true') return;\n    if (el.dataset.fg === 'size' || el.dataset.fg === 'held') return;\n    busy = true;\n    try {\n      if (el.dataset.fg === 'idle' && !windowExpired()) await draw(el);\n      else if (el.dataset.fg === 'restore' && !windowExpired()) await restore(el);\n    } catch (_) {\n      // The paid item is already in the cart; a failed gift step must not look like a failed add.\n      el.classList.remove('is-revealing', 'is-landed', 'is-spinning');\n      el.querySelector('[data-fg-stage]')?.setAttribute('hidden', '');\n    } finally { busy = false; }\n  };\n\n  const sizeRootFor = (form) => {\n    const drawer = form.closest && form.closest('#cart-drawer');\n    if (drawer) return drawer.querySelector('[data-founder-gift][data-fg=\"size\"]');\n    return form.querySelector('[data-founder-gift][data-fg=\"size\"]');\n  };\n  const focusSize = (root) => {\n    if (!root) return;\n    const hint = root.querySelector('[data-fg-size-hint]');\n    if (hint) hint.hidden = false;\n    const picker = root.querySelector('[data-fg-size-picker]');\n    try { picker?.scrollIntoView({ block: 'nearest' }); } catch (_) {}\n    picker?.querySelector('[data-fg-size]')?.focus();\n  };\n\n  // Size buttons survive drawer refreshes because the listener is on document, not the node.\n  document.addEventListener('click', async (event) => {\n    const t = event.target instanceof Element ? event.target : null;\n    const sizeBtn = t && t.closest('[data-fg-size]');\n    if (!sizeBtn || sizeBtn.disabled) return;\n    const root = sizeBtn.closest('[data-founder-gift]');\n    if (!root || root.dataset.fg !== 'size') return;\n    event.preventDefault();\n    const handle = String(root.dataset.fgDrawn || '').split('|')[0];\n    const gift = pool(root).find((g) => g.handle === handle);\n    const variantId = sizeBtn.dataset.fgSize;\n    if (!gift || !variantId) return;\n    root.querySelectorAll('[data-fg-size], [data-fg-skip-gift]').forEach((x) => { x.disabled = true; });\n    try {\n      if (windowExpired()) {\n        // 10-12: the page sat open past the 24 hours \u2014 end the gift, don't add a line the guard removes.\n        await setAttributes({ [RELEASED]: `expired ${new Date().toISOString()}` });\n        track('founder_gift_guard', { reason: 'expired_unclaimed' });\n        if (document.body.classList.contains('template-cart')) { window.location.reload(); return; }\n        await refresh();\n        return;\n      }\n      await addGift(gift, variantId);\n      track('founder_gift_size_pick', { gift_handle: gift.handle, size: sizeBtn.dataset.fgSizeLabel || '' });\n      track('founder_gift_reveal', { gift_handle: gift.handle, gift_variant: String(variantId) });\n      if (document.body.classList.contains('template-cart')) {\n        window.location.reload();\n        return;\n      }\n      await refresh();\n    } catch (_) {\n      root.querySelectorAll('[data-fg-size], [data-fg-skip-gift]').forEach((x) => { x.disabled = false; });\n    }\n  });\n\n  document.addEventListener('click', async (event) => {\n    const t = event.target instanceof Element ? event.target : null;\n    const skip = t && t.closest('[data-fg-skip-gift]');\n    if (!skip || skip.disabled) return;\n    event.preventDefault();\n    const root = skip.closest('[data-founder-gift]');\n    const handle = String(root?.dataset.fgDrawn || '').split('|')[0];\n    skip.disabled = true;\n    try {\n      await setAttributes({ [RELEASED]: `skipped ${new Date().toISOString()}` });\n      track('founder_gift_skip', { gift_handle: handle });\n      document.querySelectorAll('[data-founder-gift][data-fg=\"size\"]').forEach((el) => { el.dataset.fg = 'released'; });\n      const form = skip.closest('form') || document.querySelector('#cart-drawer form, form.cart-layout');\n      const checkout = form && form.querySelector('[name=\"checkout\"]');\n      if (checkout) checkout.click();\n      else if (form && form.requestSubmit) form.requestSubmit();\n    } catch (_) { skip.disabled = false; }\n  });\n\n  document.addEventListener('submit', (event) => {\n    const form = event.target;\n    if (!form || form.nodeName !== 'FORM' || !form.querySelector('[name=\"checkout\"]')) return;\n    const root = sizeRootFor(form);\n    if (!root) return;\n    event.preventDefault();\n    focusSize(root);\n  }, true);\n\n  // Cart guard (runs after every drawer refresh and on page load). Option C: the gift is a hidden $0 product\n  // (product_type \"Founder Gift\"), so the only way to a free piece is the draw. The guard removes any $0 gift that\n  // did not come from this order's draw, keeps one at quantity 1, swaps old-flow lines (real product + founder\n  // property) to the $0 gift, sets the gift aside when no paid SPACETRASH piece is left, and releases it at expiry.\n  const GIFT_TYPE = 'Founder Gift';\n  const sync = async (cart) => {\n    if (busy || !cart) return;\n    const el = panel();\n    const items = cart.items || [];\n    const drawnVariant = String((cart.attributes || {})[DRAWN] || '').split('|')[1] || '';\n    const actions = [];\n    let kept = null;\n    let swap = null;\n    items.forEach((line) => {\n      const marked = Boolean(line.properties && line.properties[PROP]);\n      if (line.product_type === GIFT_TYPE) {\n        if (!marked || String(line.variant_id) !== drawnVariant || kept) { actions.push({ id: line.key, quantity: 0, why: 'not_drawn' }); return; }\n        kept = line;\n        if (line.quantity > 1) actions.push({ id: line.key, quantity: 1, why: 'quantity' });\n      } else if (marked) {\n        actions.push({ id: line.key, quantity: 0, why: 'old_flow' });\n        const gift = el && pool(el).find((g) => g.handle === line.handle);\n        const variant = gift && (gift.variants.find((v) => v.title === line.variant_title) || (gift.variants.length === 1 ? gift.variants[0] : null));\n        if (gift && variant) swap = { gift, id: variant.id };\n      }\n    });\n    const expired = windowExpired();\n    const eligible = el ? el.dataset.fgEligible === 'true' : true;\n    if (kept && (expired || !eligible)) actions.push({ id: kept.key, quantity: 0, why: expired ? 'expired' : 'held' });\n    // 10-12: a drawn gift that never reached the cart (ring size not picked, or set aside) also ends with\n    // the window. Without this the card kept asking for a size, gated checkout, and a picked gift was\n    // added and then removed again.\n    const attrs = cart.attributes || {};\n    const unclaimedExpired = expired && !kept && Boolean(attrs[DRAWN]) && !attrs[RELEASED];\n    if (!actions.length && !unclaimedExpired) return;\n    busy = true;\n    try {\n      for (const a of actions) {\n        await postJSON(`${changeUrl}.js`, { id: a.id, quantity: a.quantity });\n        if (a.why !== 'held' && a.why !== 'quantity') track('founder_gift_guard', { reason: a.why });\n      }\n      if ((expired && kept) || unclaimedExpired) await setAttributes({ [RELEASED]: `expired ${new Date().toISOString()}` });\n      if (unclaimedExpired) track('founder_gift_guard', { reason: 'expired_unclaimed' });\n      if (swap && !kept && !expired) await addGift(swap.gift, swap.id);\n      busy = false;\n      await refresh();\n    } catch (_) { /* next refresh retries */ } finally { busy = false; }\n  };\n\n  // Removing the gift on purpose = released for this order (drawer button or cart page).\n  document.addEventListener('click', (event) => {\n    const t = event.target instanceof Element ? event.target : null;\n    const hit = t && (t.closest('[data-founder-remove]') || t.closest('[data-founder-line] cart-remove-button'));\n    if (!hit) return;\n    setAttributes({ [RELEASED]: `removed ${new Date().toISOString()}` }).catch(() => {});\n    track('founder_gift_release', {});\n  }, true);\n\n  // Window can run out while the page sits open.\n  setInterval(() => {\n    if (!windowExpired() || !panel() || !['revealed', 'size', 'restore'].includes(panel().dataset.fg)) return;\n    fetch(`${cartUrl}.js`, { cache: 'no-store' }).then((r) => r.json()).then(sync).catch(() => {});\n  }, 30000);\n\n  // A known variant that never made it into the cart is added back. A missing ring size is not:\n  // those buttons are already in the HTML, and waiting on them used to leave `busy` stuck.\n  window.addEventListener('load', async () => {\n    try { await sync(await fetch(`${cartUrl}.js`, { cache: 'no-store' }).then((r) => r.json())); } catch (_) {}\n    const el = panel();\n    if (el && el.dataset.fg === 'restore' && el.dataset.fgEligible === 'true') afterAdd();\n    // 10-18: drawn from an older gift pool and never claimed \u2192 draw again from the current pool.\n    else if (el && el.dataset.fgStale === 'true' && el.dataset.fg === 'idle' && el.dataset.fgEligible === 'true') afterAdd();\n  }, { once: true });\n\n  window.__stFounderReveal = { afterAdd, sync };\n})();\n\n\n"],
  "mappings": "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",
  "names": []
}
