{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/pz-world-main.js?cb=1793647251154"],
  "sourcesContent": ["(function () {\n  var ROOT = document.getElementById(('pw-' + window.__PWQ.sid));\n  if (!ROOT) return;\n\n  var viewport = ROOT.querySelector('.pw__viewport');\n  var scene    = ROOT.querySelector('.pw__scene');\n  var hint     = ROOT.querySelector('.pw__hint');\n  /* Read once, at the top, because the device filter runs during start-up\n     and anything it needs has to exist before that first call. */\n  var FOLDER_RULES = {};\n  try { FOLDER_RULES = JSON.parse(ROOT.dataset.folderRules || '{}') || {}; } catch (err) { FOLDER_RULES = {}; }\n\n  /* The theme editor gets to see things a visitor should not, like an empty\n     projection screen, so its corners can be dragged onto the curtain. */\n  var screenBar = ROOT.querySelector('.pw__screen-bar');\n  var LOCK_916 = !!window.__PWQ.p916;\n  var DESIGN = !!(window.Shopify && window.Shopify.designMode);\n  if (DESIGN) ROOT.classList.add('pw--design');\n\n  /* =========================================================\n     1. THE WORLD \u2014 drag, wheel, keys, momentum\n     One rule: horizontal input moves the world. Nothing scrolls\n     the page from inside the viewport.\n     ========================================================= */\n  var x = 0, minX = 0, velocity = 0, raf = null;\n  /* How far the scene is lifted when the wide art is reframed for a phone */\n  var shiftY = 0;\n  var dragging = false, startPointer = 0, startX = 0, lastPointer = 0, lastTime = 0, moved = 0;\n  var startPointerY = 0, axis = null, touchGesture = false;\n  var lastScrollY = 0, lastScrollTime = 0, scrollVelocity = 0, scrollRaf = null;\n\n  function bounds() {\n    minX = Math.min(0, viewport.clientWidth - scene.offsetWidth);\n  }\n\n  function place(next, immediate) {\n    x = Math.max(minX, Math.min(0, next));\n    scene.style.transform = 'translate3d(' + x + 'px,' + shiftY + 'px,0)';\n    if (immediate) velocity = 0;\n  }\n\n  function glide() {\n    velocity *= 0.94;\n    if (Math.abs(velocity) < 0.4) { velocity = 0; raf = null; return; }\n    place(x + velocity);\n    if (x === minX || x === 0) { velocity = 0; raf = null; return; }\n    raf = requestAnimationFrame(glide);\n  }\n\n  function down(e) {\n    if (e.target.closest('.pw-win, .pw-mini, .pw__hint, .pw__full')) return;\n    dragging = true; moved = 0;\n    axis = null;\n    touchGesture = e.pointerType === 'touch';\n    startPointer = lastPointer = e.clientX;\n    startPointerY = lastScrollY = e.clientY;\n    lastScrollTime = performance.now();\n    scrollVelocity = 0;\n    if (scrollRaf) { cancelAnimationFrame(scrollRaf); scrollRaf = null; }\n    startX = x;\n    lastTime = performance.now();\n    velocity = 0;\n    if (raf) { cancelAnimationFrame(raf); raf = null; }\n    viewport.classList.add('is-dragging');\n    /* capture waits for a real drag (see move) - capturing on press stole the click from every object in desktop Chrome */\n  }\n\n  function move(e) {\n    if (!dragging) return;\n    var delta = e.clientX - startPointer;\n    var deltaY = e.clientY - startPointerY;\n\n    /* Move with the finger from the very first pixel -- no dead zone, no\n       waiting to decide. Smoothness comes from never lagging the input. */\n    if (axis !== 'y') {\n      moved = Math.max(moved, Math.abs(delta)); if (moved > 6 && viewport.setPointerCapture && !viewport.hasPointerCapture(e.pointerId)) { try { viewport.setPointerCapture(e.pointerId); } catch (err) {} }\n      place(startX + delta);\n      var now = performance.now();\n      var dt = now - lastTime;\n      if (dt > 0) velocity = (e.clientX - lastPointer) / dt * 15;\n      lastPointer = e.clientX;\n      lastTime = now;\n      dismissHint();\n    }\n\n    /* Once the gesture has clearly committed to one direction, honour it.\n       Only touch can hand over to the page; a mouse drag is always the world. */\n    if (axis === null && touchGesture && (Math.abs(delta) > 10 || Math.abs(deltaY) > 10)) {\n      axis = Math.abs(delta) > Math.abs(deltaY) ? 'x' : 'y';\n      if (axis === 'y') {\n        /* it was a scroll all along: give the world back untouched */\n        place(startX, true);\n        moved = 0;\n        lastScrollY = e.clientY;\n      }\n    }\n\n    if (axis === 'y') {\n      var step = e.clientY - lastScrollY;\n      lastScrollY = e.clientY;\n      window.scrollBy(0, -step);\n      var nowY = performance.now();\n      var dtY = nowY - lastScrollTime;\n      if (dtY > 0) scrollVelocity = -step / dtY * 15;\n      lastScrollTime = nowY;\n    }\n  }\n\n  function scrollGlide() {\n    scrollVelocity *= 0.94;\n    if (Math.abs(scrollVelocity) < 0.4) { scrollVelocity = 0; scrollRaf = null; return; }\n    window.scrollBy(0, scrollVelocity);\n    scrollRaf = requestAnimationFrame(scrollGlide);\n  }\n\n  function up() {\n    if (!dragging) return;\n    dragging = false;\n    viewport.classList.remove('is-dragging');\n    if (axis === 'y') {\n      if (Math.abs(scrollVelocity) > 1) scrollRaf = requestAnimationFrame(scrollGlide);\n    } else if (Math.abs(velocity) > 1) {\n      raf = requestAnimationFrame(glide);\n    }\n  }\n\n  viewport.addEventListener('pointerdown', down);\n  window.addEventListener('pointermove', move, { passive: true });\n  window.addEventListener('pointerup', up);\n  window.addEventListener('pointercancel', up);\n\n  /* A trackpad or mouse wheel drives the world sideways too,\n     including plain vertical wheeling, which is what people reach for first. */\n  /* A wheel or trackpad drives the world sideways, including plain vertical\n     wheeling, which is what people reach for first. But once the world has\n     run out in the direction being pushed, the page takes over -- so the\n     section never becomes somewhere you cannot scroll out of. */\n  viewport.addEventListener('wheel', function (e) {\n    if (e.target.closest('.pw-win')) return;\n\n    var sideways = Math.abs(e.deltaX) > Math.abs(e.deltaY);\n    var amount = sideways ? e.deltaX : e.deltaY;\n    if (!amount) return;\n\n    var atStart = x >= -0.5 && amount < 0;\n    var atEnd = x <= minX + 0.5 && amount > 0;\n    if (!sideways && (atStart || atEnd)) return;   /* hand it to the page */\n\n    e.preventDefault();\n    if (raf) { cancelAnimationFrame(raf); raf = null; }\n    place(x - amount);\n    dismissHint();\n  }, { passive: false });\n\n  viewport.addEventListener('keydown', function (e) {\n    var step = viewport.clientWidth * 0.5;\n    if (e.key === 'ArrowRight') { e.preventDefault(); place(x - step); dismissHint(); }\n    if (e.key === 'ArrowLeft')  { e.preventDefault(); place(x + step); dismissHint(); }\n  });\n\n  /* The world can change size without the window changing: leaving full\n     screen, the iPad's address bar folding away, the fit to one screen.\n     Each time, re-measure its edges and pull it back inside its own art. */\n  if (window.ResizeObserver) {\n    var edgeRaf = null;\n    var edgeWatch = new ResizeObserver(function () {\n      if (edgeRaf) return;\n      edgeRaf = requestAnimationFrame(function () {\n        edgeRaf = null;\n        bounds();\n        place(x, true);\n        var scr = ROOT.querySelector('.pw__screen');\n        if (scr && typeof warp === 'function') warp(scr);\n      });\n    });\n    edgeWatch.observe(scene);\n    edgeWatch.observe(viewport);\n  }\n\n  /* Oct 23 2026: until the visitor touches the world, keep it landed where it should land,\n     even when the frame is resized after load (the one-screen fit runs late on phones) */\n  var untouched = true;\n  ['pointerdown', 'wheel', 'keydown', 'touchstart'].forEach(function (ev) {\n    viewport.addEventListener(ev, function (e) { if (e.isTrusted) untouched = false; }, { passive: true, capture: true });\n  });\n  if (window.ResizeObserver) {\n    var landWatch = new ResizeObserver(function () { if (untouched) settle(); });\n    landWatch.observe(scene);\n    landWatch.observe(viewport);\n  }\n\n  function settle() {\n    bounds();\n    var SP = window.__PWQ.start; if (SP === 'centre') { place(minX / 2, true); } else if (SP === 'right') { place(minX, true); } else if (SP === 'sun') { place(viewport.clientWidth / 2 - scene.offsetWidth * window.__PWQ.startAt / 100, true); } else { place(0, true); }\n  }\n  window.addEventListener('resize', function () {\n    reframe();\n    applyDeviceFilter();\n    ROOT.querySelectorAll('.pw-win:not([hidden])').forEach(function (w) {\n      if (w._pwFrom) sizeWindow(w, w._pwFrom);\n    });\n    bounds();\n    place(x, true);\n    var sc = ROOT.querySelector('.pw__screen');\n    if (sc) warp(sc);\n    /* Rotating the phone can leave a dragged window stranded off the edge */\n    ROOT.querySelectorAll('.pw-win[data-placed]').forEach(function (win) {\n      if (win.hidden) return;\n      var host = ROOT.getBoundingClientRect();\n      var grip = 76;\n      var left = parseFloat(win.style.left) || 0;\n      var top = parseFloat(win.style.top) || 0;\n      win.style.left = Math.max(grip - win.offsetWidth, Math.min(host.width - grip, left)) + 'px';\n      win.style.top = Math.max(0, Math.min(host.height - 44, top)) + 'px';\n    });\n  });\n  /* =========================================================\n     1b. THE PHONE CROP\n     A 4.5:1 panorama fitted to the height of a tall screen leaves the\n     visitor peering through a letterbox. Instead the scene is pushed\n     taller than the viewport and anchored on the band worth looking at,\n     so the art is cropped the way a photographer would crop it.\n\n     The scene is what gets resized, not the image -- the objects and the\n     screen corners are positioned in percentages of the scene, so they\n     travel with the art instead of drifting off it.\n\n     Uploading a mobile panorama turns all of this off by itself: the\n     reframe class is only printed when there is no mobile art.\n     ========================================================= */\n  function isNarrow() { return window.innerWidth < 750; }\n\n  function reframe() {\n    var wants = scene.dataset.reframe === '1' && isNarrow();\n    if (!wants) {\n      scene.style.height = '';\n      shiftY = 0;\n    } else {\n      var zoom  = parseFloat(ROOT.dataset.mZoom || '1') || 1;\n      var focus = parseFloat(ROOT.dataset.mFocus);\n      if (isNaN(focus)) focus = 0.5;\n      var vh = viewport.clientHeight;\n      if (!vh) return;\n      var h = Math.round(vh * Math.max(1, zoom));\n      scene.style.height = h + 'px';\n      shiftY = -Math.round((h - vh) * focus);\n    }\n    bounds();\n    place(x, true);\n    var sc = ROOT.querySelector('.pw__screen');\n    if (sc) warp(sc);\n  }\n\n  /* Fill the screen. Native fullscreen if the browser gives it, and a fixed\n     overlay otherwise -- an iPhone will only ever take the second route. */\n  var fullBtn = ROOT.querySelector('.pw__full');\n  function immersive(on) {\n    ROOT.classList.toggle('is-immersive', on);\n    document.documentElement.style.overflow = on ? 'hidden' : '';\n    setTimeout(reframe, 60);\n  }\n  if (fullBtn) {\n    fullBtn.addEventListener('click', function () {\n      var on = !ROOT.classList.contains('is-immersive');\n      immersive(on);\n      try {\n        if (on && viewport.requestFullscreen) {\n          viewport.requestFullscreen().catch(function () {});\n        } else if (!on && document.fullscreenElement && document.exitFullscreen) {\n          document.exitFullscreen().catch(function () {});\n        }\n      } catch (err) { /* the overlay already did the job */ }\n    });\n  }\n  document.addEventListener('fullscreenchange', function () {\n    if (!document.fullscreenElement && ROOT.classList.contains('is-immersive')) immersive(false);\n    else setTimeout(reframe, 60);\n  });\n  ROOT.addEventListener('keydown', function (e) {\n    if (e.key === 'Escape' && ROOT.classList.contains('is-immersive')) immersive(false);\n  });\n\n  ROOT.querySelectorAll('.pw__pano').forEach(function (img) {\n    if (img.complete) settle(); else img.addEventListener('load', settle);\n  });\n  settle();\n  /* Start-up steps are run independently. If one ever fails it says so in\n     the console and the rest of the world still works. */\n  [reframe, applyDeviceFilter].forEach(function (step) {\n    try { step(); } catch (err) { if (window.console) console.error('[parade world]', err); }\n  });\n  (function () {\n    var sc = ROOT.querySelector('.pw__screen');\n    if (sc) { warp(sc); setTimeout(function () { reframe(); warp(sc); }, 300); }\n  })();\n\n  /* =========================================================\n     2. THE HINT \u2014 shown once a visit, gone on first real move\n     ========================================================= */\n  var hintKey = ('pw-hint-' + window.__PWQ.sid);\n  var hintTimer = null;\n  function dismissHint() {\n    if (!hint.classList.contains('is-on')) return;\n    hint.classList.remove('is-on');\n    try { sessionStorage.setItem(hintKey, '1'); } catch (err) {}\n    clearTimeout(hintTimer);\n  }\n  var alreadyTold = false;\n  try { alreadyTold = sessionStorage.getItem(hintKey) === '1'; } catch (err) {}\n  if (!alreadyTold && ROOT.dataset.hint) {\n    setTimeout(function () { hint.classList.add('is-on'); }, 1200);\n    hintTimer = setTimeout(dismissHint, window.__PWQ.hintMs);\n  }\n  hint.querySelector('.pw__hint-close').addEventListener('click', dismissHint);\n\n  /* =========================================================\n     3. WINDOWS \u2014 open, stack, drag, close\n     ========================================================= */\n  var zTop = 60;\n  var windows = {};\n  ROOT.querySelectorAll('.pw-win').forEach(function (win) {\n    windows[win.dataset.window] = win;\n    var offset = Object.keys(windows).length - 1;\n    win.dataset.homeTop = (10 + offset * 4);\n    win.dataset.homeLeft = (9 + offset * 5);\n  });\n\n  function raise(win) { win.style.zIndex = ++zTop; }\n\n  /* Place a window near the object that opened it, kept fully in view */\n  function placeNear(win, obj) {\n    var host = ROOT.getBoundingClientRect();\n    var o = obj.getBoundingClientRect();\n    var w = win.offsetWidth || 320;\n    var h = win.offsetHeight || 260;\n    var gap = 14;\n\n    var left = (o.left - host.left) + o.width / 2 - w / 2;\n    var top  = (o.top - host.top) - h - gap;          /* above the object */\n    if (top < 8) top = (o.bottom - host.top) + gap;   /* no room, sit below */\n\n    left = Math.max(8, Math.min(host.width - w - 8, left));\n    top  = Math.max(8, Math.min(host.height - h - 8, top));\n    win.style.left = left + 'px';\n    win.style.top = top + 'px';\n  }\n\n  /* A window is sized by the object that opens it, so a window holding two\n     lines and a window holding two hundred need not be the same shape.\n     Desktop and phone are set separately: a width that reads well on a\n     desk is a wall on a phone. */\n  function sizeWindow(win, from) {\n    if (!from) return;\n    var narrow = window.innerWidth < 750;\n    var w = parseFloat(narrow ? from.dataset.winWm : from.dataset.winW);\n    var h = parseFloat(narrow ? from.dataset.winHm : from.dataset.winH);\n    if (w > 0) win.style.width = narrow ? 'min(' + w + 'vw, 96vw)' : 'min(' + w + 'rem, 92vw)';\n    if (h > 0) win.style.maxHeight = h + '%';\n  }\n\n  function openWindow(name, from) {\n    var win = windows[name];\n    if (!win) return;\n    sizeWindow(win, from);\n    if (win.hidden) {\n      win.hidden = false;\n      if (!win.dataset.placed) {\n        if (from) {\n          /* measure first, then position, or the size is still zero */\n          win.style.visibility = 'hidden';\n          requestAnimationFrame(function () {\n            placeNear(win, from);\n            win.style.visibility = '';\n          });\n        } else {\n          var narrow = window.innerWidth < 750;\n          win.style.top = (narrow ? 8 + (+win.dataset.homeTop - 10) * 0.5 : +win.dataset.homeTop) + '%';\n          win.style.left = (narrow ? 4 + (+win.dataset.homeLeft - 9) * 0.4 : +win.dataset.homeLeft) + '%';\n        }\n      }\n      requestAnimationFrame(function () { win.classList.add('is-open'); });\n      ROOT.classList.add('has-open');\n      if (from) win._pwFrom = from;\n    }\n    raise(win);\n    var firstControl = win.querySelector('.pw-win__close');\n    firstControl && firstControl.focus({ preventScroll: true });\n  }\n\n  function anyOpen() {\n    return !!ROOT.querySelector('.pw-win:not([hidden])');\n  }\n\n  function closeWindow(win) {\n    win.classList.remove('is-open', 'is-max');\n    setTimeout(function () {\n      win.hidden = true;\n      if (!anyOpen()) ROOT.classList.remove('has-open');\n    }, 300);\n    if (win.dataset.window === 'projector') stopTape();\n  }\n\n  ROOT.querySelectorAll('.pw__object').forEach(function (obj) {\n    obj.addEventListener('click', function (e) {\n      if (moved > 6) { e.preventDefault(); return; }   /* it was a drag, not a tap */\n      dismissHint();\n      /* Parade 01 and its siblings are places, not windows: the object is a\n         door out of the world rather than a drawer inside it. */\n      if (obj.dataset.opens === 'link') {\n        var href = (obj.dataset.href || '').trim();\n        if (href) window.location.href = href;\n        return;\n      }\n      openWindow(obj.dataset.opens, obj);\n    });\n  });\n\n  ROOT.querySelectorAll('.pw-win__max').forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      var win = btn.closest('.pw-win');\n      var full = win.classList.toggle('is-max');\n      btn.setAttribute('aria-label', full ? 'Exit full screen' : 'Full screen');\n      if (!full && win.dataset.placed) {\n        /* hand the window back exactly where it was before */\n        win.style.top = win.dataset.prevTop;\n        win.style.left = win.dataset.prevLeft;\n      } else if (full) {\n        win.dataset.prevTop = win.style.top;\n        win.dataset.prevLeft = win.style.left;\n      }\n      raise(win);\n    });\n  });\n\n  ROOT.querySelectorAll('.pw-win__close').forEach(function (btn) {\n    btn.addEventListener('click', function () { closeWindow(btn.closest('.pw-win')); });\n  });\n\n  ROOT.addEventListener('keydown', function (e) {\n    if (e.key !== 'Escape') return;\n    var open = Array.prototype.slice.call(ROOT.querySelectorAll('.pw-win:not([hidden])'));\n    if (!open.length) return;\n    open.sort(function (a, b) { return (+b.style.zIndex || 0) - (+a.style.zIndex || 0); });\n    closeWindow(open[0]);\n  });\n\n  /* Drag by the title bar. Desktop only: on a phone the windows are sheets. */\n  /* =========================================================\n     3b. DRESSING THE SHEET\n     Every window is stamped and signed off the same way, so the head\n     and foot are set here once rather than seven times in the markup.\n     ========================================================= */\n  function pad(n) { return (n < 10 ? '0' : '') + n; }\n\n  (function dress() {\n    var footerLine = (ROOT.dataset.footer || '').trim();\n    ROOT.querySelectorAll('.pw-win').forEach(function (win) {\n\n      /* The signature, if it is wanted. Nothing else is added to the sheet:\n         no index stamp, no code, no imprint. */\n      if (footerLine && !win.querySelector('.pw-win__foot')) {\n        var foot = document.createElement('footer');\n        foot.className = 'pw-win__foot';\n        foot.textContent = footerLine;\n        win.appendChild(foot);\n      }\n\n      /* each tab gets a filed number, set later once we know which of\n         them this device is actually showing */\n      win.querySelectorAll('.pw-nav__folder').forEach(function (btn) {\n        if (btn.querySelector('.pw-nav__no')) return;\n        var no = document.createElement('i');\n        no.className = 'pw-nav__no';\n        btn.insertBefore(no, btn.firstChild);\n      });\n    });\n    /* the tabs exist now, so number them for this device */\n    applyDeviceFilter();\n  })();\n\n  ROOT.querySelectorAll('.pw-win').forEach(function (win) {\n    var bar = win.querySelector('.pw-win__bar');\n    var wDragging = false, ox = 0, oy = 0;\n\n    win.addEventListener('pointerdown', function () { raise(win); });\n\n    bar.addEventListener('pointerdown', function (e) {\n      if (e.target.closest('button') || win.classList.contains('is-max')) return;\n      wDragging = true;\n      var rect = win.getBoundingClientRect();\n      var host = ROOT.getBoundingClientRect();\n      ox = e.clientX - rect.left;\n      oy = e.clientY - rect.top;\n      win.style.top = (rect.top - host.top) + 'px';\n      win.style.left = (rect.left - host.left) + 'px';\n      win.dataset.placed = '1';\n      bar.classList.add('is-dragging');\n      bar.setPointerCapture && bar.setPointerCapture(e.pointerId);\n      e.preventDefault();\n    });\n\n    window.addEventListener('pointermove', function (e) {\n      if (!wDragging) return;\n      var host = ROOT.getBoundingClientRect();\n      var left = e.clientX - host.left - ox;\n      var top  = e.clientY - host.top - oy;\n      /* Never let a window get thrown somewhere it cannot be grabbed back:\n         keep a thumb-sized piece of the title bar inside the world at all times. */\n      var grip = 76;\n      left = Math.max(grip - win.offsetWidth, Math.min(host.width - grip, left));\n      /* Oct 30 2026: and never higher than the foot of the header, so the title bar can't slide up behind it */\n      var hdr = document.querySelector('.section-header .header-wrapper') || document.querySelector('.section-header');\n      var minTop = hdr ? Math.max(0, hdr.getBoundingClientRect().bottom + 4 - host.top) : 0;\n      top  = Math.max(minTop, Math.min(host.height - 44, top));\n      win.style.left = left + 'px';\n      win.style.top = top + 'px';\n    }, { passive: true });\n\n    window.addEventListener('pointerup', function () {\n      wDragging = false;\n      bar.classList.remove('is-dragging');\n    });\n  });\n\n  /* =========================================================\n     4. FOLDER NAV \u2014 one behaviour, both windows\n     ========================================================= */\n\n  /* ---------------------------------------------------------------\n     Two libraries, one set of files.\n\n     A folder rule marks a folder as belonging to the phone, the desktop\n     or both, so a shorts-only folder can exist on mobile without ever\n     appearing on a wide screen. Counts are worked out here rather than\n     in the template, because the right number depends on the device\n     doing the looking, and a folder with nothing left to show on this\n     device is not shown at all.\n     --------------------------------------------------------------- */\n  function applyDeviceFilter() {\n    var device = isNarrow() ? 'mobile' : 'desktop';\n\n    ROOT.querySelectorAll('.pw-win').forEach(function (win) {\n      var nav = win.querySelector('.pw-nav');\n      if (!nav) return;\n      var rules = (FOLDER_RULES || {})[win.getAttribute('data-window')] || {};\n\n      var files = nav.querySelectorAll('.pw-nav__files li');\n      files.forEach(function (li) {\n        var folder = li.getAttribute('data-folder') || '';\n        /* a rule on the file itself overrides the folder's rule */\n        var own = li.getAttribute('data-show') || '';\n        if (own === 'inherit') own = '';\n        var rule = own || rules[folder] || 'both';\n        li.classList.toggle('is-offdevice', rule !== 'both' && rule !== device);\n      });\n\n      var filed = 0;\n      nav.querySelectorAll('.pw-nav__folder').forEach(function (btn) {\n        var folder = btn.dataset.folder || '';\n        var live = 0;\n        files.forEach(function (li) {\n          if (li.getAttribute('data-folder') === folder && !li.classList.contains('is-offdevice')) live++;\n        });\n        var tally = btn.querySelector('em');\n        if (tally) tally.textContent = live;\n        var rule = rules[folder] || 'both';\n        var off = live === 0 || (rule !== 'both' && rule !== device);\n        var row = btn.closest('li') || btn.parentElement;\n        if (row) row.classList.toggle('is-offdevice', off);\n        var no = btn.querySelector('.pw-nav__no');\n        if (no) no.textContent = off ? '' : pad(++filed);\n      });\n    });\n  }\n\n  ROOT.querySelectorAll('.pw-nav').forEach(function (nav) {\n    var win   = nav.closest('.pw-win');\n    var back  = win.querySelector('.pw-win__back');\n    var crumb = nav.querySelector('.pw-nav__crumb');\n\n    /* One leaf lifts out before the next lands. Anyone who has asked\n       not to be moved around gets the swap with no travel at all. */\n    var still = window.matchMedia('(prefers-reduced-motion: reduce)');\n    function turn(to) {\n      if (still.matches) { to(); return; }\n      nav.classList.add('is-turning');\n      setTimeout(function () {\n        to();\n        requestAnimationFrame(function () { nav.classList.remove('is-turning'); });\n      }, 200);\n    }\n\n    nav.querySelectorAll('.pw-nav__folder').forEach(function (btn) {\n      btn.addEventListener('click', function () {\n        var folder = btn.dataset.folder;\n        turn(function () {\n          nav.querySelectorAll('.pw-nav__files li').forEach(function (li) {\n            li.classList.toggle('is-shown', li.dataset.folder === folder);\n          });\n          crumb.textContent = folder;\n          nav.dataset.view = 'files';\n          back.hidden = false;\n          var body = nav.closest('.pw-win__body');\n          if (body) body.scrollTop = 0;\n        });\n      });\n    });\n\n    back.addEventListener('click', function () {\n      turn(function () {\n        nav.dataset.view = 'folders';\n        back.hidden = true;\n      });\n    });\n  });\n\n  /* =========================================================\n     5. TAPES -- the picture lands on the curtain, not in the window\n     ========================================================= */\n  /* ---------------------------------------------------------------\n     Four corners -> one perspective warp.\n     CSS skew can only slant a rectangle. A projector throws a\n     trapezoid: the far edge is taller than the near one. Solving the\n     homography from the unit rectangle to the four corners gives the\n     matrix3d that does that properly.\n     --------------------------------------------------------------- */\n  function warp(el) {\n    var scene = el.parentElement;\n    var W = scene.offsetWidth, H = scene.offsetHeight;\n    if (!W || !H) return;\n\n    /* Four shapes, not one: the phone and the desktop each have a landscape\n       frame and a portrait frame, and the tape that is playing picks. */\n    var narrow = window.innerWidth < 750;\n    var portrait = el.dataset.orientation === 'portrait';\n    var raw = narrow\n      ? (portrait ? el.dataset.cornersMobilePortrait : el.dataset.cornersMobile)\n      : (portrait ? el.dataset.cornersPortrait : el.dataset.corners);\n    raw = raw || el.dataset.corners;\n    var n = raw.split(',').map(parseFloat);\n    if (n.length !== 8 || n.some(isNaN)) return;\n\n    /* percentages of the scene -> pixels */\n    var pts = [];\n    for (var i = 0; i < 8; i += 2) pts.push([n[i] / 100 * W, n[i + 1] / 100 * H]);\n\n    /* A vertical film is nine wide by sixteen tall and should look it. The\n       corners you dragged set the plane and its perspective; this squeezes\n       the quad about its own centre until it carries that ratio, so a Short\n       is never stretched across a frame drawn for a landscape picture. */\n    if (portrait && LOCK_916 && !(narrow ? el.dataset.exactPortraitMobile : el.dataset.exactPortrait)) {\n      var wNow = (Math.abs(pts[1][0] - pts[0][0]) + Math.abs(pts[2][0] - pts[3][0])) / 2;\n      var hNow = (Math.abs(pts[3][1] - pts[0][1]) + Math.abs(pts[2][1] - pts[1][1])) / 2;\n      if (wNow > 0.5 && hNow > 0.5) {\n        var k = (hNow * 9 / 16) / wNow;\n        var cx = (pts[0][0] + pts[1][0] + pts[2][0] + pts[3][0]) / 4;\n        for (var q = 0; q < 4; q++) pts[q][0] = cx + (pts[q][0] - cx) * k;\n      }\n    }\n\n    var xs = pts.map(function (p) { return p[0]; });\n    var ys = pts.map(function (p) { return p[1]; });\n    var minX = Math.min.apply(null, xs), minY = Math.min.apply(null, ys);\n    var w = Math.max.apply(null, xs) - minX;\n    var h = Math.max.apply(null, ys) - minY;\n    if (w < 2 || h < 2) return;\n\n    var inner = el.querySelector('.pw__screen-inner');\n    /* The picture is laid out in a box of the film's own shape, 16:9 or 9:16,\n       and the warp carries that box onto the corners. Laying it out in the\n       corners' bounding box instead made YouTube letterbox the film and the\n       warp stretch it. */\n    var bh = h, bw = h * (portrait ? 9 / 16 : 16 / 9);\n    inner.style.width = bw + 'px';\n    inner.style.height = bh + 'px';\n    var from = [[0, 0], [bw, 0], [bw, bh], [0, bh]];\n    var to = pts.map(function (p) { return [p[0] - minX, p[1] - minY]; });\n\n    var A = [], b = [];\n    for (var k = 0; k < 4; k++) {\n      var f = from[k], t = to[k];\n      A.push([f[0], f[1], 1, 0, 0, 0, -f[0] * t[0], -f[1] * t[0]]);\n      b.push(t[0]);\n      A.push([0, 0, 0, f[0], f[1], 1, -f[0] * t[1], -f[1] * t[1]]);\n      b.push(t[1]);\n    }\n\n    /* Gaussian elimination with partial pivoting */\n    for (var col = 0; col < 8; col++) {\n      var piv = col;\n      for (var r = col + 1; r < 8; r++) {\n        if (Math.abs(A[r][col]) > Math.abs(A[piv][col])) piv = r;\n      }\n      if (Math.abs(A[piv][col]) < 1e-10) return;\n      var tmp = A[col]; A[col] = A[piv]; A[piv] = tmp;\n      var tb = b[col]; b[col] = b[piv]; b[piv] = tb;\n      for (var r2 = 0; r2 < 8; r2++) {\n        if (r2 === col) continue;\n        var factor = A[r2][col] / A[col][col];\n        for (var c2 = col; c2 < 8; c2++) A[r2][c2] -= factor * A[col][c2];\n        b[r2] -= factor * b[col];\n      }\n    }\n    var m = b.map(function (v, i) { return v / A[i][i]; });\n\n    inner.style.transform =\n      'translate(' + minX + 'px,' + minY + 'px) matrix3d(' +\n      [m[0], m[3], 0, m[6],\n       m[1], m[4], 0, m[7],\n       0, 0, 1, 0,\n       m[2], m[5], 0, 1].join(',') + ')';\n\n    /* The strip lives outside the warp, so it has to be told where the\n       picture ended up. Measured from the quad itself on every redraw, so it\n       follows the corners you drag, the world as it slides, and the switch\n       between landscape and portrait. */\n    if (screenBar) {\n      /* Level, centred under the picture and just clear of its lowest\n         corner. Never tilted, never pushed past the edge of the world. */\n      var mx = (pts[2][0] + pts[3][0]) / 2;\n      var low = Math.max(pts[2][1], pts[3][1]);\n      var span = Math.abs(pts[2][0] - pts[3][0]);\n      var wide = Math.max(230, Math.min(span, 420));\n      var room = el.offsetWidth || 99999;\n      var lft = Math.max(8, Math.min(room - wide - 8, mx - wide / 2));\n      var barH = screenBar.offsetHeight || 40;\n      var tp = Math.min(low + 12, (el.offsetHeight || 99999) - barH - 8);\n      screenBar.style.left = lft + 'px';\n      screenBar.style.top = tp + 'px';\n      screenBar.style.width = wide + 'px';\n      screenBar.style.setProperty('--bar-tilt', '0deg');\n    }\n  }\n\n  var screen    = ROOT.querySelector('.pw__screen');\n  var projector = screen ? screen.querySelector('.pw__screen-video') : null;\n  var reel      = screen ? screen.querySelector('.pw__screen-file') : null;\n  var showing   = ROOT.querySelector('.pw-tapes__showing');\n  var showLabel = ROOT.querySelector('.pw-tapes__label');\n  var soundBtn  = ROOT.querySelector('.pw__screen-bar .pw-tapes__sound');\n  var playBtn   = ROOT.querySelector('.pw-tapes__play');\n  var seekBar   = ROOT.querySelector('.pw-tapes__seek');\n  var timeRead  = ROOT.querySelector('.pw-tapes__time');\n  var expandBtn = ROOT.querySelector('.pw-tapes__expand');\n\n  function clock(t) {\n    if (!isFinite(t) || t < 0) t = 0;\n    var m = Math.floor(t / 60), sec = Math.floor(t % 60);\n    return m + ':' + (sec < 10 ? '0' : '') + sec;\n  }\n\n  function filmControls(on) {\n    if (!screenBar) return;\n    screenBar.hidden = !on;\n    if (on) {\n      if (screen) warp(screen);               /* place it before it is seen */\n      requestAnimationFrame(function () { screenBar.classList.add('is-live'); });\n    } else {\n      screenBar.classList.remove('is-live');\n    }\n  }\n\n  if (reel) {\n    if (playBtn) {\n      playBtn.addEventListener('click', function () {\n        reel.paused ? reel.play().catch(function () {}) : reel.pause();\n      });\n      reel.addEventListener('play',  function () { playBtn.classList.add('is-playing'); playBtn.setAttribute('aria-label', 'Pause'); });\n      reel.addEventListener('pause', function () { playBtn.classList.remove('is-playing'); playBtn.setAttribute('aria-label', 'Play'); });\n    }\n    if (seekBar) {\n      var dragging = false;\n      seekBar.addEventListener('input', function () { dragging = true; });\n      seekBar.addEventListener('change', function () {\n        if (reel.duration) reel.currentTime = (seekBar.value / 1000) * reel.duration;\n        dragging = false;\n      });\n      reel.addEventListener('timeupdate', function () {\n        if (!dragging && reel.duration) seekBar.value = Math.round((reel.currentTime / reel.duration) * 1000);\n        if (timeRead) timeRead.textContent = clock(reel.currentTime) + (reel.duration ? ' / ' + clock(reel.duration) : '');\n      });\n    }\n    if (expandBtn) {\n      expandBtn.addEventListener('click', function () {\n        /* the video element itself, because iOS will give fullscreen to a\n           video and to nothing else */\n        var go = reel.requestFullscreen || reel.webkitRequestFullscreen || reel.webkitEnterFullscreen;\n        if (go) { try { go.call(reel); } catch (err) {} }\n      });\n    }\n  }\n\n  /* ---------------------------------------------------------------\n     Which way up is this tape?\n\n     Three sources, in order of how much they can be trusted:\n       1. the orientation set on the tape itself -- always wins\n       2. an uploaded file, whose real pixel size Shopify hands over\n       3. a YouTube link, where a /shorts/ address is portrait by\n          definition and anything else starts landscape and is checked\n          against the thumbnail in the background\n\n     The check is a courtesy, not a dependency: if it never answers the\n     tape keeps the landscape frame it already opened in.\n     --------------------------------------------------------------- */\n  function setOrientation(o) {\n    if (!screen || !o) return;\n    if (screen.dataset.orientation === o) return;\n    screen.dataset.orientation = o;\n    warp(screen);\n  }\n\n  function probeOrientation(id, done) {\n    var img = new Image();\n    var settled = false;\n    var giveUp = setTimeout(function () {\n      if (!settled) { settled = true; done(null); }\n    }, 4000);\n    img.onload = function () {\n      if (settled) return;\n      settled = true; clearTimeout(giveUp);\n      var w = img.naturalWidth, h = img.naturalHeight;\n      if (!w || !h) return done(null);\n      done(h > w * 1.1 ? 'portrait' : 'landscape');\n    };\n    img.onerror = function () {\n      if (settled) return;\n      settled = true; clearTimeout(giveUp);\n      done(null);\n    };\n    /* the thumbnail kept at the video's own aspect, where one exists */\n    img.src = 'https://i.ytimg.com/vi/' + id + '/oardefault.jpg';\n  }\n\n  function clearMedia() {\n    if (projector) { projector.src = ''; projector.hidden = true; }\n    if (reel) {\n      reel.pause();\n      reel.removeAttribute('src');\n      reel.removeAttribute('poster');\n      reel.load();\n      reel.hidden = true;\n      reel.muted = true;\n    }\n    if (soundBtn) soundBtn.classList.remove('is-live');\n    filmControls(false);\n  }\n\n  function stopTape() {\n    if (!screen) return;\n    clearMedia();\n    screen.classList.remove('is-on');\n    if (showing) showing.hidden = true;\n    ROOT.querySelectorAll('.pw-nav__file').forEach(function (f) { f.classList.remove('is-playing'); });\n  }\n\n  if (soundBtn && reel) {\n    soundBtn.addEventListener('click', function () {\n      reel.muted = !reel.muted;\n      soundBtn.classList.toggle('is-live', !reel.muted);\n      soundBtn.setAttribute('aria-label', reel.muted ? 'Sound on' : 'Sound off');\n      if (!reel.muted) window.dispatchEvent(new Event('parade:hush'));\n    });\n  }\n\n  /* Walk the world over to the curtain so the visitor is looking at it */\n  function panTo(el) {\n    if (!el) return;\n    var target = el.offsetLeft + el.offsetWidth / 2 - viewport.clientWidth / 2;\n    var to = Math.max(minX, Math.min(0, -target));\n    var from = x, start = null;\n    if (raf) { cancelAnimationFrame(raf); raf = null; }\n    function ease(t) { return t < .5 ? 4*t*t*t : 1 - Math.pow(-2*t + 2, 3) / 2; }\n    function step(now) {\n      if (start === null) start = now;\n      var k = Math.min(1, (now - start) / 900);\n      place(from + (to - from) * ease(k), true);\n      if (k < 1) requestAnimationFrame(step);\n    }\n    requestAnimationFrame(step);\n  }\n\n  ROOT.querySelectorAll('.pw-nav__file[data-youtube], .pw-nav__file[data-video]').forEach(function (btn) {\n    btn.addEventListener('click', function () {\n      if (!screen) return;\n      if (!projector && !reel) {\n        if (showLabel && showing) {\n          showLabel.textContent = 'Add a Screen block to play tapes on the curtain';\n          showing.hidden = false;\n        }\n        return;\n      }\n\n      var declared = btn.dataset.orientation || 'auto';\n      var file = btn.dataset.video || '';\n      clearMedia();\n\n      if (file && reel) {\n        /* An uploaded film. Shopify already told us its real size, so the\n           frame is cut to shape before a single pixel is drawn. */\n        var vw = parseInt(btn.dataset.w, 10) || 0;\n        var vh = parseInt(btn.dataset.h, 10) || 0;\n        var o = declared !== 'auto' ? declared : (vh > vw ? 'portrait' : 'landscape');\n        setOrientation(o);\n        if (btn.dataset.poster) reel.poster = btn.dataset.poster;\n        if (declared === 'auto' && !vw) {\n          /* A link pasted into a folder list carries no dimensions, so the\n             browser is asked for them the moment it opens the file. */\n          reel.addEventListener('loadedmetadata', function once() {\n            reel.removeEventListener('loadedmetadata', once);\n            if (reel.videoWidth && reel.videoHeight) {\n              setOrientation(reel.videoHeight > reel.videoWidth ? 'portrait' : 'landscape');\n            }\n          });\n        }\n        reel.src = file;\n        reel.hidden = false;\n        reel.muted = true;\n        reel.loop = false;\n        reel.play().catch(function () { /* a tap will start it */ });\n        /* YouTube brings its own player; a file you host has none, so the\n           strip under the picture becomes the player for it */\n        if (soundBtn) { soundBtn.classList.remove('is-live'); soundBtn.setAttribute('aria-label', 'Sound on'); }\n        filmControls(true);\n      } else if (projector) {\n        var raw = btn.dataset.youtube || '';\n        var match = raw.match(/(?:youtu\\.be\\/|[?&]v=|\\/embed\\/|\\/shorts\\/)([A-Za-z0-9_-]{6,})/);\n        var id = match ? match[1] : raw.trim();\n        var guess = declared !== 'auto'\n          ? declared\n          : (/\\/shorts\\//.test(raw) ? 'portrait' : 'landscape');\n        setOrientation(guess);\n        projector.hidden = false;\n        projector.src = 'https://www.youtube-nocookie.com/embed/' + id +\n          '?autoplay=1&mute=1&playsinline=1&rel=0&modestbranding=1&enablejsapi=1';\n        if (declared === 'auto' && guess === 'landscape' && id) {\n          probeOrientation(id, function (res) {\n            /* only if this tape is still the one on the cloth */\n            if (res && btn.classList.contains('is-playing')) setOrientation(res);\n          });\n        }\n      }\n\n      screen.classList.add('is-on');\n\n      ROOT.querySelectorAll('.pw-nav__file').forEach(function (f) { f.classList.remove('is-playing'); });\n      btn.classList.add('is-playing');\n      if (showing) {\n        showLabel.textContent = btn.textContent.trim();\n        showing.hidden = false;\n      }\n      /* one thing plays at a time */ window.dispatchEvent(new Event('parade:hush'));\n      /* Stay put if the curtain is already in view: switching tapes should\n         not move the world under the visitor. Only walk over if it is off\n         screen entirely, which means they cannot see what they just chose. */\n      if (screen) {\n        var left = screen.offsetLeft + x;\n        var right = left + screen.offsetWidth;\n        if (right < 40 || left > viewport.clientWidth - 40) panTo(screen);\n      }\n    });\n  });\n\n  if (showing) {\n    showing.querySelector('.pw-tapes__stop').addEventListener('click', stopTape);\n  }\n  /* Tapping the picture itself walks you back to it */\n  if (screen) {\n    screen.addEventListener('dblclick', function () { openWindow('projector'); });\n  }\n\n  /* In the theme editor, open whatever block the merchant just clicked */\n  document.addEventListener('shopify:block:deselect', function (e) {\n    if (ROOT.contains(e.target)) ROOT.classList.remove('is-placing');\n  });\n\n  document.addEventListener('shopify:block:select', function (e) {\n    if (!ROOT.contains(e.target)) return;\n    ROOT.classList.toggle('is-placing', e.target.classList.contains('pw__screen'));\n    var map = { tape: 'projector', track: 'record', event: 'calendar', marshal: 'signboard', dispatch: 'newspaper' };\n    var kind = e.target.classList.contains('pw__object') ? e.target.dataset.opens : null;\n    if (kind) { openWindow(kind); return; }\n    var li = e.target.closest('li');\n    for (var key in map) {\n      if (e.target.querySelector('[data-audio]') || e.target.querySelector('[data-youtube]')) break;\n    }\n    if (e.target.querySelector('[data-youtube]') || e.target.dataset.folder) openWindow('projector');\n  });\n})();\n"],
  "mappings": "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",
  "names": ["scene", "minX", "i"]
}
