{
  "version": 3,
  "sources": ["/cdn/shop/t/3/assets/tb-motion.js?x=1794560349508"],
  "sourcesContent": ["/* Toybox motion: pops cards and tiles in, one after another, as they scroll into view.\n   Works for cards added later too (tab switches, filters, loaded rails).\n   Cards start their pop-in a little before they reach the screen (REVEAL_AHEAD), so the next row\n   is already showing at the bottom edge instead of looking like empty space.\n   The page scrolls inside .page-wrapper rather than the window, so the observers watch that\n   container; watching the window would only see cards once they were already on screen. */\n(() => {\n  const root = document.documentElement;\n  if (!root.classList.contains('tb-rv') || !('IntersectionObserver' in window)) return;\n  window.tbRevealReady = true;\n\n  const SEL = '.tb-card, .tb-cat, .tb-brand, .tb-post, .tb-why__item, .tb-rev, .tbx-feature, '\n    // tiles on the other pages (gifting, Our story, help, contact, tracking, Vault, brands, product)\n    + '.tb-gtile, .tb-occ > a, .tb-gstrip > div, .tb-stat, .tb-value, .tb-timeline li, .tb-team article, .tb-way, .tb-tip, '\n    + '.tb-step, .tb-piece, .tb-line, .tb-vbrand, .tb-vstat, .tb-fact, .tb-faq__item, .tb-bcard, .tb-side__box, .tb-split, .tb-hello';\n  const STEP = 70;    // ms between items\n  const MAX = 6;      // cap the stagger so nothing waits too long\n  const REVEAL_AHEAD = '0px 0px 25% 0px'; // start revealing a quarter of a screen before items come into view\n  let queue = [];\n  let raf = 0;\n  let io, catIo, railIo;\n\n  /* The element the page actually scrolls in: .page-wrapper when it scrolls, otherwise the window. */\n  const scrollRoot = () => {\n    const pw = document.querySelector('.page-wrapper');\n    if (!pw) return null;\n    const oy = getComputedStyle(pw).overflowY;\n    return oy === 'auto' || oy === 'scroll' ? pw : null;\n  };\n\n  const flush = () => {\n    raf = 0;\n    const batch = queue.splice(0);\n    const pos = new Map(batch.map((el) => [el, el.getBoundingClientRect()]));\n    batch.sort((a, b) => (Math.round(pos.get(a).top / 40) - Math.round(pos.get(b).top / 40)) || (pos.get(a).left - pos.get(b).left));\n    batch.forEach((el, i) => {\n      el.style.setProperty('--tb-d', Math.min(i, MAX) * STEP + 'ms');\n      el.classList.add('is-in');\n      setTimeout(() => el.style.removeProperty('--tb-d'), 2400);\n    });\n  };\n\n  const onSeen = (entries, obs) => {\n    for (const e of entries) {\n      if (!e.isIntersecting) continue;\n      obs.unobserve(e.target);\n      queue.push(e.target);\n    }\n    if (queue.length && !raf) raf = requestAnimationFrame(flush);\n  };\n\n  /* Countdown timers: each digit group snaps in when its value changes.\n     The timer rewrites its numbers every second, so only real changes animate. */\n  const DIGITS = '[data-d], [data-h], [data-m], [data-s]';\n  const tick = (el) => {\n    const v = el.textContent;\n    if (el.dataset.tbPrev === v) return;\n    const first = el.dataset.tbPrev === undefined;\n    el.dataset.tbPrev = v;\n    if (first) return;\n    el.classList.remove('tb-tick');\n    void el.offsetWidth; // restart the animation\n    el.classList.add('tb-tick');\n  };\n  const watchTimer = (cd) => {\n    if (cd.tbTickWatched) return;\n    cd.tbTickWatched = true;\n    cd.querySelectorAll(DIGITS).forEach(tick);\n    new MutationObserver((muts) => {\n      const seen = new Set();\n      for (const m of muts) {\n        const el = m.target.nodeType === 1 ? m.target : m.target.parentElement;\n        const d = el?.closest(DIGITS);\n        if (d && !seen.has(d)) { seen.add(d); tick(d); }\n      }\n    }).observe(cd, { childList: true, characterData: true, subtree: true });\n  };\n\n  /* Vault photo and category tiles: track the mouse so the spotlight, drift and tilt follow the cursor */\n  const followCursor = (el) => {\n    if (el.tbFollow) return;\n    el.tbFollow = true;\n    let r = 0;\n    el.addEventListener('pointermove', (e) => {\n      if (e.pointerType !== 'mouse') return;\n      cancelAnimationFrame(r);\n      r = requestAnimationFrame(() => {\n        const b = el.getBoundingClientRect();\n        const x = Math.min(1, Math.max(0, (e.clientX - b.left) / b.width));\n        const y = Math.min(1, Math.max(0, (e.clientY - b.top) / b.height));\n        el.style.setProperty('--mx', (x * 100).toFixed(1) + '%');\n        el.style.setProperty('--my', (y * 100).toFixed(1) + '%');\n        el.style.setProperty('--px', ((x - 0.5) * 2).toFixed(3));\n        el.style.setProperty('--py', ((y - 0.5) * 2).toFixed(3));\n      });\n    });\n    el.addEventListener('pointerleave', () => {\n      cancelAnimationFrame(r);\n      el.style.setProperty('--px', '0');\n      el.style.setProperty('--py', '0');\n    });\n  };\n\n  /* Sideways sliders (bestsellers, brands, reviews): animating a tile's size while the row\n     snaps makes the browser re-snap and skip ahead. So snapping stays off (CSS, until\n     .tb-rail-ready), every tile in the slider pops in together when it comes into view,\n     and snapping comes back once they have settled. */\n  /* Only the real slider rows count. Some page wrappers report themselves as scrollable\n     (a browser rule turns hidden overflow on one axis into auto on the other), and treating\n     them as sliders made whole sections reveal at once on load instead of on scroll.\n     A row only counts while it actually scrolls sideways (category and brand grids do on phones). */\n  const RAILS = '.tbx-track, .tb-brands--rail, .tb-revs, .tb-cats, .tb-brands';\n  const railOf = (el) => {\n    const p = el.parentElement?.closest(RAILS);\n    if (!p) return null;\n    const ox = getComputedStyle(p).overflowX;\n    return ox === 'auto' || ox === 'scroll' ? p : null;\n  };\n  const revealRail = (rail) => {\n    rail.tbShown = true;\n    const items = [...rail.querySelectorAll(SEL)].filter((x) => !x.classList.contains('is-in') && railOf(x) === rail);\n    if (!items.length) { if (!rail.tbUnlock) rail.classList.add('tb-rail-ready'); return; }\n    rail.classList.remove('tb-rail-ready');\n    clearTimeout(rail.tbUnlock);\n    const pos = new Map(items.map((el) => [el, el.getBoundingClientRect()]));\n    items.sort((a, b) => (Math.round(pos.get(a).left / 40) - Math.round(pos.get(b).left / 40)) || (pos.get(a).top - pos.get(b).top));\n    items.forEach((el, i) => {\n      el.style.setProperty('--tb-d', Math.min(i, MAX) * STEP + 'ms');\n      el.classList.add('is-in');\n      setTimeout(() => el.style.removeProperty('--tb-d'), 2400);\n    });\n    rail.tbUnlock = setTimeout(() => { rail.tbUnlock = 0; rail.classList.add('tb-rail-ready'); }, MAX * STEP + 1500);\n  };\n  const track = (el) => {\n    if (el.classList.contains('is-in')) return;\n    const rail = railOf(el);\n    if (!rail) { (el.matches('.tb-cat') ? catIo : io).observe(el); return; }\n    if (rail.tbShown) { revealRail(rail); return; }   // new tiles added after the slider was shown\n    if (!rail.tbWatched) { rail.tbWatched = true; railIo.observe(rail); }\n  };\n\n  const watch = (node) => {\n    if (node.nodeType !== 1 && node !== document) return;\n    if (node.matches?.(SEL)) track(node);\n    node.querySelectorAll(SEL).forEach(track);\n    if (node.matches?.('tb-countdown')) watchTimer(node);\n    node.querySelectorAll('tb-countdown').forEach(watchTimer);\n    if (node.matches?.('.tb-vault__media, .tb-cat')) followCursor(node);\n    node.querySelectorAll('.tb-vault__media, .tb-cat').forEach(followCursor);\n  };\n\n  const start = () => {\n    const sr = scrollRoot();\n    io = new IntersectionObserver(onSeen, { root: sr, rootMargin: REVEAL_AHEAD, threshold: 0 });\n    /* Category tiles zoom forward in place, so they wait until a good part of the tile is on\n       screen; starting while only the top edge shows would make the zoom read as a rise. */\n    catIo = new IntersectionObserver(onSeen, { root: sr, rootMargin: '0px 0px -4% 0px', threshold: 0.35 });\n    railIo = new IntersectionObserver((entries) => {\n      for (const e of entries) {\n        if (!e.isIntersecting) continue;\n        railIo.unobserve(e.target);\n        revealRail(e.target);\n      }\n    }, { root: sr, rootMargin: REVEAL_AHEAD, threshold: 0 });\n    watch(document);\n    new MutationObserver((muts) => {\n      for (const m of muts) m.addedNodes.forEach(watch);\n    }).observe(document.body, { childList: true, subtree: true });\n  };\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, { once: true });\n  else start();\n})();\n"],
  "mappings": "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",
  "names": []
}
