{
  "version": 3,
  "sources": ["/cdn/shop/t/89/assets/wm-vertical-scroll.js?wmv=20260929-audible-manual-play-1"],
  "sourcesContent": ["    var WM_IS_SAFARI_DESKTOP = (() => {\n      const ua = navigator.userAgent || '';\n      const isSafari = /Safari/.test(ua) && !/Chrome|Chromium|Edg|OPR/.test(ua);\n      const isMobile = /Mobile|iP(hone|ad|od)/.test(ua) || (navigator.maxTouchPoints > 1 && navigator.platform === 'MacIntel');\n      return isSafari && !isMobile;\n    })();\n\n    var WM_IS_IOS = (() => {\n      const ua = navigator.userAgent || '';\n      const platform = navigator.platform || '';\n      const iOS = /iP(ad|hone|od)/.test(platform);\n      const iPadOS = (platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n      return iOS || iPadOS || (/Safari/.test(ua) && /Mobile/.test(ua));\n    })();\n\n    function wmGetFeedContainer() {\n      return document.getElementById('verticalSwipeContainer');\n    }\n    \n    \n    let WM_MEDIA_UNLOCKED = false;\n    let WM_AUDIO_CTX = null;\n    let WM_PLAYER = null;\n    let WM_OWNER = { slide: null };\n    let WM_AUDIO_SOURCE_SWITCHING_UNTIL = 0;\n    let WM_AUDIO_LAST_PLAY_STARTED_AT = 0;\n    let WM_AUDIO_REQUEST_ID = 0;\n    let WM_AUDIO_MANUAL_LOCK_UNTIL = 0;\n\t\tlet WM_SHUFFLE_BOOTING = false;\n\tlet WM_PENDING_AUTOBOOT = false;\n\tlet WM_OVERLAY_UNLOCKING = false;\n\tlet WM_LISTENING_INTERACTION_STARTED = false;\n\tlet WM_GESTURE_UNLOCK_PRIME = null;\n\n    const WM_AUDIO_DEBUG_ENABLED = (() => {\n      try {\n        const params = new URLSearchParams(window.location.search || '');\n        return params.get('wm_audio_debug') === '1' || params.get('wm_audio_debug') === 'true';\n      } catch(e) {\n        return false;\n      }\n    })();\n    const WM_AUDIO_DEBUG_SESSION_ID = (() => {\n      try {\n        const existing = sessionStorage.getItem('wm_audio_debug_session_id');\n        if (existing) return existing;\n        const id = 'wmad_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 9);\n        sessionStorage.setItem('wm_audio_debug_session_id', id);\n        return id;\n      } catch(e) {\n        return 'wmad_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 9);\n      }\n    })();\n    const WM_AUDIO_DEBUG_LOG = [];\n    let WM_AUDIO_DEBUG_SEQUENCE = 0;\n    let WM_AUDIO_DEBUG_MANUAL_ATTEMPTED = false;\n    let WM_AUDIO_DEBUG_LAST_POST_AT = 0;\n\n    function wmAudioDebugSafeValue(value, depth = 0) {\n      if (depth > 3) return '[depth]';\n      if (value == null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value;\n      if (value instanceof Error) {\n        return {\n          name: value.name || 'Error',\n          message: value.message || '',\n          code: value.code || null\n        };\n      }\n      if (Array.isArray(value)) return value.slice(0, 20).map(item => wmAudioDebugSafeValue(item, depth + 1));\n      if (typeof value === 'object') {\n        const out = {};\n        Object.keys(value).slice(0, 40).forEach(key => {\n          try { out[key] = wmAudioDebugSafeValue(value[key], depth + 1); } catch(e) {}\n        });\n        return out;\n      }\n      return String(value);\n    }\n\n    function wmAudioDebugPlayerState(player = WM_PLAYER) {\n      if (!player) return null;\n      let audioSessionType = null;\n      try { audioSessionType = navigator.audioSession?.type || null; } catch(e) {}\n      return {\n        paused: !!player.paused,\n        muted: !!player.muted,\n        ended: !!player.ended,\n        currentTime: Number.isFinite(player.currentTime) ? Number(player.currentTime.toFixed(3)) : null,\n        duration: Number.isFinite(player.duration) ? Number(player.duration.toFixed(3)) : null,\n        readyState: player.readyState,\n        networkState: player.networkState,\n        error: player.error ? {\n          code: player.error.code,\n          message: player.error.message || ''\n        } : null,\n        src: player.currentSrc || player.src || '',\n        datasetPlaying: player.dataset?.playing || '',\n        audioSessionType\n      };\n    }\n\n    function wmAudioDebugEvent(name, detail = {}) {\n      if (!WM_AUDIO_DEBUG_ENABLED) return;\n      const entry = {\n        seq: ++WM_AUDIO_DEBUG_SEQUENCE,\n        t: Math.round(performance.now()),\n        name,\n        detail: wmAudioDebugSafeValue(detail),\n        player: wmAudioDebugPlayerState()\n      };\n      WM_AUDIO_DEBUG_LOG.push(entry);\n      if (WM_AUDIO_DEBUG_LOG.length > 140) WM_AUDIO_DEBUG_LOG.shift();\n    }\n\n    function wmAudioDebugEnvironment() {\n      let audioSessionType = null;\n      try { audioSessionType = navigator.audioSession?.type || null; } catch(e) {}\n      return {\n        href: location.href,\n        path: location.pathname,\n        search: location.search,\n        referrer: document.referrer || '',\n        userAgent: navigator.userAgent || '',\n        platform: navigator.platform || '',\n        vendor: navigator.vendor || '',\n        maxTouchPoints: navigator.maxTouchPoints || 0,\n        language: navigator.language || '',\n        languages: Array.from(navigator.languages || []),\n        cookieEnabled: navigator.cookieEnabled,\n        onLine: navigator.onLine,\n        visibilityState: document.visibilityState,\n        viewport: { width: window.innerWidth, height: window.innerHeight, dpr: window.devicePixelRatio || 1 },\n        isIOS: WM_IS_IOS,\n        isApp: typeof WM_IS_APP !== 'undefined' ? WM_IS_APP : null,\n        feedSource: window.WM_FEED_SOURCE || '',\n        customerId: window.WM_CUSTOMER_ID || null,\n        audioSessionSupported: !!navigator.audioSession,\n        audioSessionType,\n        debugLabel: (() => {\n          try { return new URLSearchParams(location.search).get('wm_debug_label') || ''; } catch(e) { return ''; }\n        })()\n      };\n    }\n\n    function wmAudioDebugPost(reason = 'snapshot') {\n      if (!WM_AUDIO_DEBUG_ENABLED) return;\n      const now = Date.now();\n      if (reason !== 'pagehide' && now - WM_AUDIO_DEBUG_LAST_POST_AT < 1500) return;\n      WM_AUDIO_DEBUG_LAST_POST_AT = now;\n      const proxyBase = String(window.WM_RECOMMENDATIONS_PROXY_BASE || '/apps/wm-recommendations').replace(/\\/+$/, '');\n      const payload = {\n        anonymous_id: WM_AUDIO_DEBUG_SESSION_ID,\n        occurred_at: new Date().toISOString(),\n        source: 'scroll_feed_audio_debug',\n        event_type: 'scroll_audio_debug_report',\n        product_handle: 'scroll-feed-audio-debug',\n        product_id: null,\n        recommendation: null,\n        debug_reason: reason,\n        debug_session_id: WM_AUDIO_DEBUG_SESSION_ID,\n        debug_environment: wmAudioDebugEnvironment(),\n        debug_state: {\n          mediaUnlocked: WM_MEDIA_UNLOCKED,\n          autobootAllowed: typeof WM_AUTOBOOT_ALLOWED !== 'undefined' ? WM_AUTOBOOT_ALLOWED : null,\n          listeningInteractionStarted: WM_LISTENING_INTERACTION_STARTED,\n          pendingAutoboot: WM_PENDING_AUTOBOOT,\n          ownerHandle: WM_OWNER.slide?.closest?.('.product-slide')?.dataset?.productHandle || '',\n          ownerTrackTitle: WM_OWNER.slide?.querySelector?.('.track-title')?.textContent?.trim?.() || '',\n          manualAttempted: WM_AUDIO_DEBUG_MANUAL_ATTEMPTED,\n          player: wmAudioDebugPlayerState()\n        },\n        debug_events: WM_AUDIO_DEBUG_LOG.slice(-120),\n        metadata: {\n          artists: [],\n          labels: [],\n          genres: ['debug'],\n          sub_genres: [],\n          mood_style: [],\n          other_tags: ['audio-debug'],\n          raw_tags: ['debug', 'audio-debug']\n        }\n      };\n      fetch(proxyBase + '/audio-debug', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json',\n          'X-Requested-With': 'XMLHttpRequest'\n        },\n        body: JSON.stringify(payload),\n        keepalive: true\n      }).catch(() => {});\n    }\n\n    if (WM_AUDIO_DEBUG_ENABLED) {\n      wmAudioDebugEvent('debug-init');\n      window.addEventListener('error', event => {\n        wmAudioDebugEvent('window-error', {\n          message: event.message,\n          filename: event.filename,\n          lineno: event.lineno,\n          colno: event.colno,\n          error: event.error\n        });\n        wmAudioDebugPost('window-error');\n      });\n      window.addEventListener('unhandledrejection', event => {\n        wmAudioDebugEvent('unhandled-rejection', { reason: event.reason });\n        wmAudioDebugPost('unhandled-rejection');\n      });\n      document.addEventListener('visibilitychange', () => {\n        wmAudioDebugEvent('visibility-change', { visibilityState: document.visibilityState });\n        if (document.visibilityState === 'hidden' && WM_AUDIO_DEBUG_MANUAL_ATTEMPTED) wmAudioDebugPost('hidden');\n      });\n      window.addEventListener('pagehide', () => {\n        if (WM_AUDIO_DEBUG_MANUAL_ATTEMPTED || WM_AUDIO_DEBUG_LOG.length > 3) wmAudioDebugPost('pagehide');\n      });\n      setTimeout(() => wmAudioDebugPost('initial'), 2500);\n    }\n\n    function wmRequiresPlayButtonFirstStart() {\n      return WM_IS_IOS && !WM_IS_APP && !WM_MEDIA_UNLOCKED;\n    }\n\n    function wmSetAudioSessionType(type) {\n      try {\n        if (!navigator.audioSession || !type) return false;\n        navigator.audioSession.type = type;\n        wmAudioDebugEvent('audio-session-type-set', { type, actual: navigator.audioSession.type || null });\n        return true;\n      } catch(e) {\n        wmAudioDebugEvent('audio-session-type-error', { type, error: e });\n        return false;\n      }\n    }\n\n    function wmPrimePlaybackAudioSession() {\n      if (!WM_IS_IOS || WM_IS_APP) return;\n      wmSetAudioSessionType('playback');\n    }\n\n    async function wmCyclePlaybackAudioSession() {\n      if (!WM_IS_IOS || WM_IS_APP || !navigator.audioSession) return;\n      wmAudioDebugEvent('audio-session-cycle-start');\n      wmSetAudioSessionType('ambient');\n      await new Promise(resolve => setTimeout(resolve, 0));\n      wmSetAudioSessionType('playback');\n      wmAudioDebugEvent('audio-session-cycle-end');\n    }\n\n    window.WM_AUDIO_STATE = window.WM_AUDIO_STATE || {\n      player: null,\n      slide: null,\n      productSlide: null,\n      src: '',\n      status: 'idle'\n    };\n\n    function wmPublishAudioState(player = WM_PLAYER, slide = WM_OWNER.slide, status = null) {\n      window.WM_AUDIO_STATE = window.WM_AUDIO_STATE || {};\n      window.WM_AUDIO_STATE.player = player || null;\n      window.WM_AUDIO_STATE.slide = slide || null;\n      window.WM_AUDIO_STATE.productSlide = slide?.closest?.('.product-slide') || null;\n      window.WM_AUDIO_STATE.src = player?.currentSrc || player?.src || '';\n      if (status) window.WM_AUDIO_STATE.status = status;\n      window.dispatchEvent(new CustomEvent('wm:audio-state', {\n        detail: {\n          slide: window.WM_AUDIO_STATE.slide,\n          productSlide: window.WM_AUDIO_STATE.productSlide,\n          src: window.WM_AUDIO_STATE.src,\n          status: window.WM_AUDIO_STATE.status\n        }\n      }));\n    }\n\n    function setButtonToPlay(btn){\n      if (!btn) return;\n      btn.innerHTML = `\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n          <path fill=\"#ffffff\" d=\"M8 5v14l11-7z\"></path>\n        </svg>\n      `;\n    }\n\n    function setButtonToPause(btn){\n      if (!btn) return;\n      btn.innerHTML = `\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n          <path fill=\"#ffffff\" d=\"M6 5h4v14H6zM14 5h4v14h-4z\"></path>\n        </svg>\n      `;\n    }\n\n    function setButtonToStarting(btn){\n      setButtonToPause(btn);\n    }\n    \n    \n    let WM_WARM_VIDEO = null;\n    function wmEnsureWarmVideo() {\n      if (WM_WARM_VIDEO) return;\n      const v = document.createElement('video');\n      v.playsInline = true; v.muted = true; v.loop = true; v.autoplay = true;\n      v.style.display = 'none';\n      v.src = 'data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAAAAG1wNDFtcDQy';\n      document.body.appendChild(v);\n      WM_WARM_VIDEO = v;\n    }\n    function wmSyncOwnerButtonState(isPlaying) {\n      const slide = WM_OWNER.slide;\n      if (!slide) return;\n\n      const productSlide = slide.closest('.product-slide');\n      if (productSlide) {\n        productSlide.querySelectorAll('.play-pause-button').forEach(btn => setButtonToPlay(btn));\n      }\n\n      const btn = slide.querySelector('.play-pause-button');\n      if (!btn) return;\n      if (isPlaying) {\n        setButtonToPause(btn);\n      } else {\n        setButtonToPlay(btn);\n      }\n    }\n\n    function wmSetProductButtonStarting(slide) {\n      const productSlide = slide?.closest?.('.product-slide');\n      if (productSlide) {\n        productSlide.querySelectorAll('.play-pause-button').forEach(btn => setButtonToPlay(btn));\n      }\n      setButtonToStarting(slide?.querySelector?.('.play-pause-button'));\n    }\n\n    function wmGetSlideAudioSrc(slide) {\n      const srcHolder = slide?.querySelector?.('.slide-audio');\n      return ((srcHolder?.dataset && srcHolder.dataset.src) ? srcHolder.dataset.src : srcHolder?.src) || '';\n    }\n\n    function wmResolveAudioSrc(src) {\n      if (!src) return '';\n      try {\n        return new URL(src, window.location.href).href;\n      } catch(e) {\n        return src;\n      }\n    }\n\n    function wmMarkAudioSourceSwitching() {\n      WM_AUDIO_SOURCE_SWITCHING_UNTIL = Date.now() + 900;\n    }\n\n    function wmResetSlideProgress(slide) {\n      const filled = slide?.querySelector?.('.progress-filled');\n      const dot = slide?.querySelector?.('.progress-dot');\n      if (filled) filled.style.width = '0%';\n      if (dot) dot.style.left = '0%';\n    }\n\n    function wmAudioReasonIsAutoplay(reason) {\n      return reason === 'autoplay' || reason === 'scroll' || reason === 'app-boot' || reason === 'audio-unlocked';\n    }\n\n    function wmAudioMarkManualControl() {\n      WM_AUDIO_MANUAL_LOCK_UNTIL = Date.now() + 1200;\n    }\n\n    function wmAudioManualControlActive() {\n      return Date.now() < WM_AUDIO_MANUAL_LOCK_UNTIL;\n    }\n\n    function wmResetSingletonPlayer() {\n      wmAudioDebugEvent('singleton-reset-start');\n      if (WM_PLAYER) {\n        try { WM_PLAYER.pause(); } catch(e) {}\n        try { WM_PLAYER.removeAttribute('src'); } catch(e) {}\n        try { WM_PLAYER.load(); } catch(e) {}\n        try { WM_PLAYER.remove(); } catch(e) {\n          try { WM_PLAYER.parentNode?.removeChild(WM_PLAYER); } catch(err) {}\n        }\n      }\n      WM_PLAYER = null;\n      WM_OWNER.slide = null;\n      WM_GESTURE_UNLOCK_PRIME = null;\n      wmPublishAudioState(null, null, 'idle');\n      wmAudioDebugEvent('singleton-reset-end');\n    }\n\n    function wmCreateSingletonPlayer() {\n      if (WM_PLAYER) return WM_PLAYER;\n      WM_PLAYER = document.createElement('audio');\n      WM_PLAYER.id = 'WM_PLAYER';\n      WM_PLAYER.playsInline = true;\n      WM_PLAYER.muted = true;\n      WM_PLAYER.preload = 'none';\n      WM_PLAYER.style.display = 'none';\n      document.body.appendChild(WM_PLAYER);\n      wmPublishAudioState(WM_PLAYER, WM_OWNER.slide);\n      wmAudioDebugEvent('player-created');\n    \n      WM_PLAYER.addEventListener('timeupdate', () => {\n        const slide = WM_OWNER.slide;\n        if (!slide) return;\n        const filled = slide.querySelector('.progress-filled');\n        const dot = slide.querySelector('.progress-dot');\n        const d = WM_PLAYER.duration || 0;\n        if (d > 0) {\n          const pct = (WM_PLAYER.currentTime / d) * 100;\n          if (filled) filled.style.width = `${pct}%`;\n          if (dot) dot.style.left = `${pct}%`;\n        }\n      });\n      WM_PLAYER.addEventListener('ended', () => {\n        wmAudioDebugEvent('player-ended');\n        const slide = WM_OWNER.slide;\n        if (!slide) return;\n        wmSyncOwnerButtonState(false);\n        wmResetSlideProgress(slide);\n      });\n      WM_PLAYER.addEventListener('play', () => {\n        wmAudioDebugEvent('player-play-event');\n        wmPublishAudioState(WM_PLAYER, WM_OWNER.slide, 'starting');\n      });\n      WM_PLAYER.addEventListener('playing', () => {\n        wmAudioDebugEvent('player-playing-event');\n        wmPublishAudioState(WM_PLAYER, WM_OWNER.slide, 'playing');\n        wmSyncOwnerButtonState(true);\n      });\n      WM_PLAYER.addEventListener('pause', () => {\n        wmAudioDebugEvent('player-pause-event');\n        wmPublishAudioState(WM_PLAYER, WM_OWNER.slide, 'paused');\n        wmSyncOwnerButtonState(false);\n      });\n      WM_PLAYER.addEventListener('waiting', () => wmAudioDebugEvent('player-waiting-event'));\n      WM_PLAYER.addEventListener('stalled', () => wmAudioDebugEvent('player-stalled-event'));\n      WM_PLAYER.addEventListener('suspend', () => wmAudioDebugEvent('player-suspend-event'));\n      WM_PLAYER.addEventListener('error', () => wmAudioDebugEvent('player-error-event'));\n      return WM_PLAYER;\n    }\n    function wmPreparePlayerSourceFromSlide(slide) {\n      const player = wmCreateSingletonPlayer();\n      const nextSrc = wmGetSlideAudioSrc(slide);\n      if (nextSrc && wmResolveAudioSrc(player.currentSrc || player.src) !== wmResolveAudioSrc(nextSrc)) {\n        wmMarkAudioSourceSwitching();\n        try { player.pause(); } catch(e) {}\n        player.src = nextSrc;\n        player.preload = 'auto';\n        wmResetSlideProgress(slide);\n      }\n      return player;\n    }\n\n    async function wmUnlockAudioOnce(slide = null, options = {}) {\n      if (WM_MEDIA_UNLOCKED) return true;\n      if (wmRequiresPlayButtonFirstStart() && options.allowFirstStart !== true) return false;\n      const keepPlaying = options.keepPlaying === true;\n      const suppressUnlockedEvent = options.suppressUnlockedEvent === true;\n      const useMediaElementUnlock = options.useMediaElementUnlock !== false;\n      const p = (useMediaElementUnlock && slide) ? wmPreparePlayerSourceFromSlide(slide) : wmCreateSingletonPlayer();\n      let contextUnlocked = false;\n      let mediaElementUnlocked = false;\n      let mediaPlaybackConfirmed = false;\n      const primedAttempt = WM_GESTURE_UNLOCK_PRIME?.player === p\n        ? WM_GESTURE_UNLOCK_PRIME.playPromise\n        : null;\n      let slidePlayAttempt = primedAttempt || null;\n      try {\n        if (useMediaElementUnlock && p.src && !slidePlayAttempt) {\n          p.muted = true;\n          slidePlayAttempt = p.play();\n        }\n      } catch(e){}\n      try {\n        WM_AUDIO_CTX = WM_AUDIO_CTX || new (window.AudioContext || window.webkitAudioContext)();\n        if (WM_AUDIO_CTX.state !== 'running') await WM_AUDIO_CTX.resume();\n        const osc = WM_AUDIO_CTX.createOscillator();\n        const gain = WM_AUDIO_CTX.createGain();\n        gain.gain.value = 0.00001;\n        osc.connect(gain).connect(WM_AUDIO_CTX.destination);\n        osc.start(); osc.stop(WM_AUDIO_CTX.currentTime + 0.03);\n        contextUnlocked = true;\n      } catch(e){}\n      try { wmEnsureWarmVideo(); await WM_WARM_VIDEO.play().catch(()=>{}); } catch(e){}\n      try {\n        if (slidePlayAttempt) {\n          await slidePlayAttempt;\n          mediaElementUnlocked = true;\n          if (useMediaElementUnlock && p.src && keepPlaying) {\n            mediaPlaybackConfirmed = await wmWaitForPlaybackConfirmation(p, WM_AUDIO_REQUEST_ID, 900);\n          }\n        }\n      } catch(e){}\n      if (!keepPlaying) {\n        try { p.pause(); } catch(e){}\n      }\n      WM_MEDIA_UNLOCKED = (useMediaElementUnlock && p.src ? (mediaElementUnlocked && mediaPlaybackConfirmed) : contextUnlocked) || !!WM_IS_APP;\n      if (!WM_MEDIA_UNLOCKED) return false;\n      WM_GESTURE_UNLOCK_PRIME = null;\n      if (!suppressUnlockedEvent) window.dispatchEvent(new Event('audioUnlocked'));\n      return true;\n    }\n    function wmWhenCanPlay(el) {\n      return new Promise(res => {\n        if (el.readyState >= 3) return res();\n        const done = () => { cleanup(); res(); };\n        const cleanup = () => ['canplay','canplaythrough','loadeddata','loadedmetadata'].forEach(ev => el.removeEventListener(ev, done));\n        ['canplay','canplaythrough','loadeddata','loadedmetadata'].forEach(ev => el.addEventListener(ev, done, { once:true }));\n        setTimeout(()=>{ cleanup(); res(); }, 800);\n      });\n    }\n\n    function wmWaitForPlaybackConfirmation(player, requestId, timeout = 1200) {\n      return new Promise(resolve => {\n        if (!player) return resolve(false);\n\n        const startTime = Number.isFinite(player.currentTime) ? player.currentTime : 0;\n        let done = false;\n        let timer = null;\n\n        const cleanup = () => {\n          if (timer) clearTimeout(timer);\n          player.removeEventListener('playing', onPlaying);\n          player.removeEventListener('timeupdate', onTimeUpdate);\n        };\n        const finish = (ok) => {\n          if (done) return;\n          done = true;\n          cleanup();\n          resolve(ok && requestId === WM_AUDIO_REQUEST_ID);\n        };\n        const playbackIsMoving = () => {\n          if (player.paused || player.ended) return false;\n          const now = Number.isFinite(player.currentTime) ? player.currentTime : 0;\n          return Math.abs(now - startTime) > 0.015;\n        };\n        const onPlaying = () => finish(!player.paused && !player.ended);\n        const onTimeUpdate = () => {\n          if (playbackIsMoving()) finish(true);\n        };\n\n        player.addEventListener('playing', onPlaying, { once: true });\n        player.addEventListener('timeupdate', onTimeUpdate);\n\n        if (!player.paused && player.readyState >= 3) {\n          requestAnimationFrame(() => {\n            if (playbackIsMoving()) finish(true);\n          });\n        }\n\n        timer = setTimeout(() => finish(playbackIsMoving()), timeout);\n      });\n    }\n\n    async function wmSafePlaySlide(slide, { unmute = true, reason = 'unknown' } = {}) {\n      if (!slide) return false;\n      if (wmRequiresPlayButtonFirstStart() && reason !== 'manual') return false;\n      if (wmAudioReasonIsAutoplay(reason) && wmAudioManualControlActive()) return false;\n\n      const userInitiatedPlay = reason === 'manual' || reason === 'track-nav';\n      const unlockEligiblePlay = reason === 'manual' || (!wmRequiresPlayButtonFirstStart() && reason === 'track-nav');\n      if (reason === 'manual') WM_AUDIO_DEBUG_MANUAL_ATTEMPTED = true;\n      if (reason === 'manual' || reason === 'track-nav') {\n        wmAudioMarkManualControl();\n      }\n\n      if (unlockEligiblePlay) wmPrimePlaybackAudioSession();\n\n      const requestId = ++WM_AUDIO_REQUEST_ID;\n      const srcHolder = slide.querySelector('.slide-audio');\n      if (!srcHolder) return false;\n      const nextSrc = (srcHolder.dataset && srcHolder.dataset.src) ? srcHolder.dataset.src : srcHolder.src;\n      if (!nextSrc) return false;\n      wmAudioDebugEvent('play-request', {\n        reason,\n        requestId,\n        unmute,\n        unlockEligiblePlay,\n        userInitiatedPlay,\n        slideHandle: slide.closest?.('.product-slide')?.dataset?.productHandle || '',\n        nextSrc\n      });\n\n      const attemptPlay = async () => {\n      const player = wmCreateSingletonPlayer();\n        const isNewSrc = (wmResolveAudioSrc(player.currentSrc || player.src) !== wmResolveAudioSrc(nextSrc));\n    \n      if (isNewSrc) {\n        wmAudioDebugEvent('source-switch', { reason, requestId, nextSrc });\n        wmMarkAudioSourceSwitching();\n        try { player.pause(); } catch(e) {}\n        player.src = nextSrc;\n        player.preload = 'auto';\n        wmResetSlideProgress(slide);\n      }\n    \n      const readyEnough = player.readyState >= 2;\n      if (!userInitiatedPlay && (isNewSrc || !readyEnough)) {\n        await wmWhenCanPlay(player);\n      }\n      if (requestId !== WM_AUDIO_REQUEST_ID) return false;\n    \n      if (!userInitiatedPlay) {\n        await new Promise(r => requestAnimationFrame(r));\n        if (requestId !== WM_AUDIO_REQUEST_ID) return false;\n      }\n    \n    \n      WM_OWNER.slide = slide;\n      wmPublishAudioState(player, slide, 'starting');\n      try {\n        const shouldPlayAudibly = !!(unmute && (WM_MEDIA_UNLOCKED || unlockEligiblePlay));\n        player.muted = !shouldPlayAudibly;\n        wmAudioDebugEvent('play-call-before', { reason, requestId, audible: shouldPlayAudibly });\n        await player.play();\n        wmAudioDebugEvent('play-promise-resolved', { reason, requestId });\n        if (requestId !== WM_AUDIO_REQUEST_ID) return false;\n        const confirmed = await wmWaitForPlaybackConfirmation(player, requestId, userInitiatedPlay ? 1400 : 1000);\n        wmAudioDebugEvent('play-confirmation-result', { reason, requestId, confirmed });\n        if (!confirmed) {\n          if (requestId === WM_AUDIO_REQUEST_ID) {\n            try { player.pause(); } catch(e) {}\n            player.dataset.playing = '0';\n            wmPublishAudioState(player, slide, 'blocked');\n          }\n          return false;\n        }\n        if (unlockEligiblePlay) WM_MEDIA_UNLOCKED = true;\n        WM_AUDIO_LAST_PLAY_STARTED_AT = Date.now();\n        player.dataset.playing = '1';\n        wmPublishAudioState(player, slide, 'playing');\n        wmSyncOwnerButtonState(true);\n        if (reason === 'manual') wmAudioDebugPost('manual-play-confirmed');\n        return true;\n      } catch (e) {\n        wmAudioDebugEvent('play-error', { reason, requestId, error: e });\n        if (e && e.name === 'NotAllowedError') {\n          const retry = () => { window.removeEventListener('touchstart', retry); wmSafePlaySlide(slide, { unmute, reason: 'manual' }); };\n          window.addEventListener('touchstart', retry, { once:true, passive:true });\n        }\n      }\n      return false;\n      };\n\n      const started = await attemptPlay();\n      if (started || !unlockEligiblePlay || reason !== 'manual' || requestId !== WM_AUDIO_REQUEST_ID) {\n        if (!started && reason === 'manual') wmAudioDebugPost('manual-play-failed-before-recovery');\n        return started;\n      }\n\n      wmAudioDebugEvent('manual-recovery-start', { requestId });\n      await wmCyclePlaybackAudioSession();\n      if (requestId !== WM_AUDIO_REQUEST_ID) return false;\n      wmResetSingletonPlayer();\n      WM_AUDIO_REQUEST_ID = requestId;\n      const recovered = await attemptPlay();\n      wmAudioDebugEvent('manual-recovery-result', { requestId, recovered });\n      wmAudioDebugPost(recovered ? 'manual-recovery-confirmed' : 'manual-recovery-failed');\n      return recovered;\n    }\n    function wmPauseSlide(slide, { reason = 'unknown' } = {}) {\n      if (!WM_PLAYER) return;\n      if (reason === 'manual') wmAudioMarkManualControl();\n      if (WM_OWNER.slide === slide) {\n        WM_AUDIO_REQUEST_ID += 1;\n        try { WM_PLAYER.pause(); } catch {}\n        WM_PLAYER.dataset.playing = '0';\n      }\n    }\n    \n    function wmEnhanceCoverImage(img, indexOnPage){\n      if (!img) return;\n    \n      if (WM_IS_SAFARI_DESKTOP) {\n        try { img.loading = 'eager'; } catch(e){}\n        try { img.setAttribute('loading', 'eager'); } catch(e){}\n    \n        try { img.fetchPriority = 'high'; } catch(e){}\n        try { img.setAttribute('fetchpriority', 'high'); } catch(e){}\n    \n      } else {\n        try { img.loading = (indexOnPage < 3 ? 'eager' : 'lazy'); } catch(e){}\n        try { img.setAttribute('loading', (indexOnPage < 3 ? 'eager' : 'lazy')); } catch(e){}\n        if (indexOnPage < 3) {\n          try { img.fetchPriority = 'high'; } catch(e){}\n          try { img.setAttribute('fetchpriority', 'high'); } catch(e){}\n        }\n      }\n    \n      try { img.decoding = 'async'; } catch(e){}\n      try { img.setAttribute('decoding', 'async'); } catch(e){}\n    \n    }\n    \n    \n    function wmPrefetchSlideNeighbors(carousel, activeIdx){\n      const slides = carousel.querySelectorAll('.audio-player-slide');\n      [-1, 1].forEach(offset => {\n        const s = slides[activeIdx + offset];\n        if (!s) return;\n        const img = s.querySelector('.audio-cover');\n        if (img) { const pre = new Image(); pre.decoding = 'async'; pre.src = img.currentSrc || img.src; }\n        const a = s.querySelector('.slide-audio');\n        if (a && !a.src && a.dataset?.src) { a.src = a.dataset.src; a.preload = 'metadata'; }\n      });\n    }\n    function wmHydrateSlidesNearViewport(rootEl){\n      if (!rootEl) return;\n      if (!rootEl._wmHydrateIO) {\n        rootEl._wmHydrateIO = new IntersectionObserver((entries) => {\n          entries.forEach(entry => {\n            if (!entry.isIntersecting) return;\n            const slide = entry.target;\n            const audio = slide.querySelector('.slide-audio');\n            if (!(WM_IS_IOS && wmIsFeedScrollHot()) && audio && !audio.src && audio.dataset?.src) { audio.src = audio.dataset.src; audio.preload = 'metadata'; }\n            const next = slide.nextElementSibling;\n            if (next) {\n              const nimg = next.querySelector('.audio-cover');\n              if (nimg) { const pre = new Image(); pre.decoding = 'async'; pre.src = nimg.currentSrc || nimg.src; }\n              const na = next.querySelector('.slide-audio');\n              if (!(WM_IS_IOS && wmIsFeedScrollHot()) && na && !na.src && na.dataset?.src) { na.src = na.dataset.src; na.preload = 'metadata'; }\n            }\n            rootEl._wmHydrateIO.unobserve(slide);\n          });\n        }, { root: rootEl, rootMargin: '900px 0px', threshold: 0.01 });\n      }\n\n      rootEl.querySelectorAll('.audio-player-slide').forEach((slide) => {\n        if (slide.closest('.product-slide')?.dataset?.wmDormant === '1') return;\n        rootEl._wmHydrateIO.observe(slide);\n      });\n    }\n\n    const WM_WINDOW_KEEP_BEHIND = 4;\n    const WM_WINDOW_KEEP_AHEAD = 8;\n    const WM_WINDOW_KEEP_BEHIND_IOS = 1;\n    const WM_WINDOW_KEEP_AHEAD_IOS = 5;\n    const WM_VIRTUALIZE_MIN_MOUNTED = 18;\n    const WM_VIRTUALIZE_MIN_MOUNTED_IOS = 8;\n    const WM_MAX_DORMANT_HYDRATES = 1;\n    let wmDormantRefreshTimer = null;\n    let wmDormantHydratesInFlight = 0;\n    let wmLastFeedScrollAt = 0;\n    let wmDormantTrimRaf = 0;\n    let wmPendingFeedBatch = false;\n    let wmPendingFeedBatchTimer = 0;\n\n    function wmDormantVirtualizationDisabled(){\n      return window.WM_FEED_SOURCE === 'weekly_digs' || window.WM_FEED_SOURCE === 'wishlist';\n    }\n\n    function wmGetVirtualizeMinMounted(){\n      return WM_IS_IOS ? WM_VIRTUALIZE_MIN_MOUNTED_IOS : WM_VIRTUALIZE_MIN_MOUNTED;\n    }\n\n    function wmGetWindowKeepBehind(){\n      return WM_IS_IOS ? WM_WINDOW_KEEP_BEHIND_IOS : WM_WINDOW_KEEP_BEHIND;\n    }\n\n    function wmGetWindowKeepAhead(){\n      return WM_IS_IOS ? WM_WINDOW_KEEP_AHEAD_IOS : WM_WINDOW_KEEP_AHEAD;\n    }\n\n    function wmIsFeedScrollHot(){\n      return (Date.now() - wmLastFeedScrollAt) < (WM_IS_IOS ? 220 : 140);\n    }\n\n    function wmIsSlideNearViewport(slide, multiplier = 1.15){\n      const feedContainer = wmGetFeedContainer();\n      if (!feedContainer || !slide) return false;\n      const containerRect = feedContainer.getBoundingClientRect();\n      const rect = slide.getBoundingClientRect();\n      const top = rect.top - containerRect.top;\n      const bottom = top + rect.height;\n      const margin = feedContainer.clientHeight * multiplier;\n      return bottom >= -margin && top <= (feedContainer.clientHeight + margin);\n    }\n\n    function wmCanVirtualizeSlide(slide){\n      if (!slide) return false;\n      if (slide.classList.contains('wm-special-card') || slide.dataset.wmSpecial === '1') return false;\n      if (slide.dataset.wmPinned === '1') return false;\n      if (!slide.dataset.productHandle) return false;\n      return true;\n    }\n\n    function wmCreateDormantPlaceholder(height){\n      const placeholder = document.createElement('div');\n      placeholder.className = 'wm-dormant-card-placeholder';\n      placeholder.setAttribute('aria-hidden', 'true');\n      placeholder.style.height = `${Math.max(1, Math.round(height || 1))}px`;\n      return placeholder;\n    }\n\n    function wmPrimeSlideShell(slide){\n      if (!slide) return;\n\n      slide.querySelectorAll('picture source').forEach((source) => {\n        const srcset = source.getAttribute('srcset');\n        if ((!srcset || srcset === '') && source.dataset?.srcset) {\n          source.setAttribute('srcset', source.dataset.srcset);\n        }\n      });\n\n      slide.querySelectorAll('.audio-cover, .static-cover-wrapper img, picture img, img').forEach((img, index) => {\n        try { img.decoding = 'async'; } catch (e) {}\n        if (index === 0) {\n          try { img.loading = 'eager'; } catch (e) {}\n          try { img.fetchPriority = 'high'; } catch (e) {}\n        }\n        const srcAttr = img.getAttribute('src');\n        if ((!srcAttr || srcAttr === '') && img.dataset?.src) {\n          img.src = img.dataset.src;\n        }\n        const srcsetAttr = img.getAttribute('srcset');\n        if ((!srcsetAttr || srcsetAttr === '') && img.dataset?.srcset) {\n          img.setAttribute('srcset', img.dataset.srcset);\n        }\n      });\n    }\n\n    function wmPrimePrimaryAudioForProduct(slide){\n      if (!slide) return;\n      const carousel = slide.querySelector('.audio-player-carousel');\n      if (!carousel) return;\n\n      const swiper = carousel.swiperInstance;\n      const activeSlide = swiper && swiper.slides && swiper.slides.length\n        ? (swiper.slides[swiper.activeIndex]?.querySelector('.audio-player-slide') || swiper.slides[swiper.activeIndex])\n        : carousel.querySelector('.audio-player-slide');\n      const audio = activeSlide?.querySelector('.slide-audio');\n      if (audio && !audio.src && audio.dataset?.src) {\n        audio.src = audio.dataset.src;\n        audio.preload = 'metadata';\n      }\n    }\n\n    function wmInitLiveSlideRuntime(slide){\n      const feedContainer = wmGetFeedContainer();\n      if (!slide || slide.dataset.wmDormant === '1') return;\n      if (slide.dataset.wmRuntimeReady === '1') return;\n\n      initializeSwiperForSlides([slide]);\n      wmPrimePrimaryAudioForProduct(slide);\n      initializeAudioControlsForProduct(slide);\n      wmInitTitleMarquees(feedContainer);\n      wmObserveNewMarqueeCards([slide]);\n      wmSafariLazyImageFix(feedContainer);\n      if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide);\n      wmHydrateSlidesNearViewport(feedContainer);\n      wmEnsureFilterPills(feedContainer);\n      slide.dataset.wmRuntimeReady = '1';\n      delete slide.dataset.wmRuntimeDeferred;\n    }\n\n    function wmFlushDeferredSlideRuntime(){\n      const feedContainer = wmGetFeedContainer();\n      if (!feedContainer || (WM_IS_IOS && wmIsFeedScrollHot())) return;\n\n      const deferredSlides = Array.from(\n        feedContainer.querySelectorAll('.product-slide[data-wm-runtime-deferred=\"1\"]')\n      ).filter((slide) => slide.dataset.wmDormant !== '1' && wmIsSlideNearViewport(slide, 1.1));\n\n      if (!deferredSlides.length) return;\n\n      deferredSlides.sort((a, b) => {\n        const aScore = Math.abs((a.offsetTop || 0) - feedContainer.scrollTop);\n        const bScore = Math.abs((b.offsetTop || 0) - feedContainer.scrollTop);\n        return aScore - bScore;\n      });\n\n      deferredSlides.slice(0, WM_IS_IOS ? 1 : deferredSlides.length).forEach((slide) => {\n        wmInitLiveSlideRuntime(slide);\n      });\n    }\n\n    function wmDestroyProductSlideRuntime(productSlide){\n      const feedContainer = wmGetFeedContainer();\n      if (!productSlide) return;\n\n      if (WM_OWNER.slide && productSlide.contains(WM_OWNER.slide)) {\n        wmPauseSlide(WM_OWNER.slide, { reason: 'lifecycle' });\n        WM_OWNER.slide = null;\n      }\n      if (typeof WM_ACTIVE_PRODUCT !== 'undefined' && WM_ACTIVE_PRODUCT === productSlide) {\n        WM_ACTIVE_PRODUCT = null;\n      }\n      delete productSlide.dataset.wmRuntimeReady;\n      delete productSlide.dataset.wmRuntimeDeferred;\n\n      if (typeof WM_PRODUCT_IO !== 'undefined' && WM_PRODUCT_IO) {\n        try { WM_PRODUCT_IO.unobserve(productSlide); } catch(e){}\n      }\n      if (feedContainer?._wmTitleMarqueeObserver) {\n        try { feedContainer._wmTitleMarqueeObserver.unobserve(productSlide); } catch(e){}\n      }\n      if (feedContainer?._wmHydrateIO) {\n        productSlide.querySelectorAll('.audio-player-slide').forEach((slide) => {\n          try { feedContainer._wmHydrateIO.unobserve(slide); } catch(e){}\n        });\n      }\n\n      clearTimeout(productSlide._wmMarqueeStartTimer);\n      productSlide.querySelectorAll('.wm-title-marquee').forEach((el) => {\n        clearTimeout(el._wmMarqueeEndTimer);\n        clearTimeout(el._wmMarqueeReturnTimer);\n      });\n\n      productSlide.querySelectorAll('.audio-player-slide').forEach((slide) => {\n        if (!slideObservers.has(slide)) return;\n        const entry = slideObservers.get(slide);\n        try {\n          entry.observer?.disconnect?.();\n          entry.cleanup?.();\n        } catch(e){}\n        slideObservers.delete(slide);\n        slide.__wmBound = false;\n      });\n\n      const carousel = productSlide.querySelector('.audio-player-carousel');\n      const swiper = carousel?.swiperInstance;\n      if (carousel?.hideControlsTimer) clearTimeout(carousel.hideControlsTimer);\n      if (swiper && typeof swiper.destroy === 'function') {\n        try { swiper.destroy(true, true); } catch(e){}\n      }\n      if (carousel) delete carousel.swiperInstance;\n    }\n\n    async function wmHydrateDormantProductSlide(slide){\n      if (!wmCanVirtualizeSlide(slide)) return;\n      if (slide.dataset.wmDormant !== '1') return;\n      if (slide.dataset.wmHydrating === '1') return;\n      if (wmDormantHydratesInFlight >= WM_MAX_DORMANT_HYDRATES) return;\n      if (wmIsFeedScrollHot() && !wmIsSlideNearViewport(slide, 0.9)) return;\n\n      const handle = slide.dataset.productHandle || '';\n      if (!handle) return;\n\n      slide.dataset.wmHydrating = '1';\n      wmDormantHydratesInFlight += 1;\n\n      try {\n        const item = (wmGetCurrentIndexSource() || []).find((entry) => {\n          const entryHandle = entry && (entry.handle || entry.product_handle);\n          return entryHandle === handle;\n        }) || {};\n        const html = await wmFetchIndexCardHtml(item);\n        if (!html) throw new Error('Dormant slide payload empty');\n\n        const doc = new DOMParser().parseFromString(html, 'text/html');\n        const fetchedSlide = wmBuildSlideFromIndexHtml(html, item, doc);\n        if (!fetchedSlide) throw new Error('Dormant slide payload missing .product-slide');\n\n        slide.innerHTML = fetchedSlide.innerHTML;\n        slide.className = fetchedSlide.className;\n        Array.from(fetchedSlide.attributes).forEach((attr) => {\n          if (attr.name === 'class' || attr.name === 'style') return;\n          slide.setAttribute(attr.name, attr.value);\n        });\n        slide.style.height = '';\n        slide.style.minHeight = '';\n        slide.style.containIntrinsicSize = '';\n        slide.dataset.wmDormant = '0';\n        slide.removeAttribute('aria-busy');\n\n        if (slide.dataset.wmPinned === '1') {\n          wmApplyPinnedStockState(slide, item);\n        } else {\n          wmApplyWishlistStockState(slide, item);\n        }\n\n        wmPrimeSlideShell(slide);\n\n        if (WM_IS_IOS && wmIsFeedScrollHot()) {\n          const feedContainer = wmGetFeedContainer();\n          slide.dataset.wmRuntimeDeferred = '1';\n          delete slide.dataset.wmRuntimeReady;\n          wmInitTitleMarquees(feedContainer);\n          wmObserveNewMarqueeCards([slide]);\n          wmSafariLazyImageFix(feedContainer);\n          wmEnsureFilterPills(feedContainer);\n        } else {\n          wmInitLiveSlideRuntime(slide);\n\n          if (mostVisibleProductSlide?.() === slide && WM_AUTOBOOT_ALLOWED && WM_MEDIA_UNLOCKED) {\n            wmAutoplayProduct(slide);\n          }\n        }\n      } catch (e) {\n        console.warn('WM dormant slide hydrate failed', slide?.dataset?.productHandle, e);\n      } finally {\n        wmDormantHydratesInFlight = Math.max(0, wmDormantHydratesInFlight - 1);\n        delete slide.dataset.wmHydrating;\n      }\n    }\n\n    function wmOffloadDormantProductSlide(slide){\n      if (!wmCanVirtualizeSlide(slide)) return;\n      if (slide.dataset.wmDormant === '1') return;\n\n      const rect = slide.getBoundingClientRect();\n      const measuredHeight = Math.max(\n        slide.offsetHeight || 0,\n        rect.height || 0,\n        parseFloat(slide.dataset.wmLastHeight || '0') || 0\n      );\n      if (!measuredHeight) return;\n\n      slide.dataset.wmLastHeight = String(Math.round(measuredHeight));\n      wmDestroyProductSlideRuntime(slide);\n\n      slide.innerHTML = '';\n      slide.appendChild(wmCreateDormantPlaceholder(measuredHeight));\n      slide.style.height = `${Math.round(measuredHeight)}px`;\n      slide.style.minHeight = `${Math.round(measuredHeight)}px`;\n      slide.style.containIntrinsicSize = `${Math.round(measuredHeight)}px`;\n      slide.dataset.wmDormant = '1';\n      slide.setAttribute('aria-busy', 'false');\n    }\n\n    function wmGetAnchorSlide(){\n      const feedContainer = wmGetFeedContainer();\n      if (!feedContainer) return null;\n      const current = mostVisibleProductSlide?.();\n      if (current && current.dataset.wmDormant !== '1') return current;\n      return feedContainer.querySelector('.product-slide[data-product-handle][data-wm-dormant=\"0\"]')\n        || feedContainer.querySelector('.product-slide[data-product-handle]:not([data-wm-dormant=\"1\"])')\n        || feedContainer.querySelector('.product-slide[data-product-handle]');\n    }\n\n    function wmScheduleDormantRefresh(){\n      if (wmDormantVirtualizationDisabled()) return;\n      if (!wmGetFeedContainer()) return;\n      clearTimeout(wmDormantRefreshTimer);\n      wmDormantRefreshTimer = setTimeout(() => {\n        wmRefreshDormantSlides({ allowHydrate: true });\n      }, WM_IS_IOS ? 140 : 90);\n    }\n\n    function wmScheduleDormantTrim(){\n      if (wmDormantVirtualizationDisabled()) return;\n      if (!wmGetFeedContainer() || wmDormantTrimRaf) return;\n      wmDormantTrimRaf = requestAnimationFrame(() => {\n        wmDormantTrimRaf = 0;\n        wmRefreshDormantSlides({ allowHydrate: false });\n      });\n    }\n\n    function wmRefreshDormantSlides(options = {}){\n      if (wmDormantVirtualizationDisabled()) return;\n      const feedContainer = wmGetFeedContainer();\n      if (!feedContainer) return;\n\n      const allowHydrate = options.allowHydrate !== false;\n      const productSlides = Array.from(\n        feedContainer.querySelectorAll('.product-slide[data-product-handle]')\n      ).filter(slide => wmCanVirtualizeSlide(slide));\n\n      if (productSlides.length <= wmGetVirtualizeMinMounted()) {\n        if (allowHydrate) {\n          productSlides.forEach((slide) => {\n            if (slide.dataset.wmDormant === '1') wmHydrateDormantProductSlide(slide);\n          });\n        }\n        return;\n      }\n\n      const ownerProduct = WM_OWNER.slide?.closest?.('.product-slide') || null;\n      const anchor = ownerProduct || wmGetAnchorSlide() || productSlides[0] || null;\n      if (!anchor) return;\n\n      const activeIndex = productSlides.indexOf(anchor);\n      if (activeIndex === -1) return;\n\n      const keepStart = Math.max(0, activeIndex - wmGetWindowKeepBehind());\n      const keepEnd = Math.min(productSlides.length - 1, activeIndex + wmGetWindowKeepAhead());\n\n      productSlides.forEach((slide, index) => {\n        if (slide === ownerProduct) return;\n        if (index >= keepStart && index <= keepEnd) {\n          if (allowHydrate && slide.dataset.wmDormant === '1') wmHydrateDormantProductSlide(slide);\n        } else {\n          wmOffloadDormantProductSlide(slide);\n        }\n      });\n\n      if (allowHydrate) wmFlushDeferredSlideRuntime();\n    }\n    \n    function wmSafariLazyImageFix(rootEl){\n      if (!WM_IS_SAFARI_DESKTOP || !rootEl) return;\n    \n      if (!rootEl._wmSafariLazyFixIO) {\n        const io = new IntersectionObserver((entries) => {\n          entries.forEach(entry => {\n            if (!entry.isIntersecting) return;\n    \n            const img = entry.target;\n    \n            try { img.loading = 'eager'; } catch(e){}\n            try { img.decoding = 'async'; } catch(e){}\n    \n            const srcAttr = img.getAttribute('src');\n            if (img.dataset?.src && (!srcAttr || srcAttr === '')) {\n              img.src = img.dataset.src;\n            }\n            const srcsetAttr = img.getAttribute('srcset');\n            if (img.dataset?.srcset && (!srcsetAttr || srcsetAttr === '')) {\n              img.srcset = img.dataset.srcset;\n            }\n    \n            const pic = img.closest('picture');\n            if (pic) {\n              pic.querySelectorAll('source').forEach(source => {\n                const ss = source.getAttribute('srcset');\n                if ((!ss || ss === '') && source.dataset?.srcset) {\n                  source.setAttribute('srcset', source.dataset.srcset);\n                }\n              });\n            }\n    \n            setTimeout(() => {\n              if (img.naturalWidth === 0) {\n                const s = img.currentSrc || img.getAttribute('src') || img.src;\n                if (!s) return;\n    \n                if (img.getAttribute('srcset')) img.removeAttribute('srcset');\n    \n                img.src = '';\n                img.src = s;\n              }\n            }, 120);\n    \n            io.unobserve(img);\n          });\n        }, { root: rootEl, rootMargin: '900px 0px', threshold: 0.01 });\n    \n        rootEl._wmSafariLazyFixIO = io;\n      }\n    \n      const io = rootEl._wmSafariLazyFixIO;\n    \n      rootEl.querySelectorAll('img.audio-cover, img[loading=\"lazy\"], picture img').forEach(img => {\n        if (img.dataset.wmSafariObserved === '1') return;\n        img.dataset.wmSafariObserved = '1';\n        io.observe(img);\n      });\n    }\n    \n    \n    \n    \n    \n    /* ================================\n       Section logic\n    ================================ */\n    document.addEventListener('DOMContentLoaded', () => {\n    window.addEventListener('error', (e) => {\n      console.warn('[WM] JS error:', e.message, e.filename, e.lineno);\n    });\n    window.addEventListener('unhandledrejection', (e) => {\n      console.warn('[WM] Unhandled promise rejection:', e.reason);\n    });\n\n    const WM_FOR_YOU_GRID_VIEW = !!window.WM_FOR_YOU_GRID_VIEW || (() => {\n      try {\n        const params = new URLSearchParams(window.location.search || '');\n        return (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') && params.get('wm_view') === 'grid';\n      } catch (e) {\n        return false;\n      }\n    })();\n\n    function wmDisableScrollFeedRuntimeForGridView() {\n      if (!WM_FOR_YOU_GRID_VIEW) return;\n      document.documentElement.classList.add('wm-for-you-grid-view');\n      document.documentElement.classList.remove('wm-feed-lock', 'wm-prepinned', 'wm-shuffle-boot');\n      document.body.classList.remove('wm-feed-lock');\n      document.querySelectorAll('audio, video').forEach(media => {\n        try {\n          media.pause();\n          media.removeAttribute('autoplay');\n          media.autoplay = false;\n        } catch (e) {}\n      });\n      if (WM_PLAYER) {\n        try {\n          WM_AUDIO_REQUEST_ID += 1;\n          WM_PLAYER.pause();\n          WM_PLAYER.removeAttribute('src');\n          WM_PLAYER.load();\n        } catch (e) {}\n      }\n      WM_MEDIA_UNLOCKED = false;\n      WM_PENDING_AUTOBOOT = false;\n      if (typeof wmPublishAudioState === 'function') wmPublishAudioState(null, null);\n    }\n\n    wmDisableScrollFeedRuntimeForGridView();\n    \n      /* =========================================================\n       WM SPECIAL CARDS (works for shuffle + lazy load)\n    ========================================================= */\n    const WM_SPECIAL = {\n      inserted: new Set(),\n      // counts PRODUCT slides rendered (excludes special cards)\n      productCount: 0,\n    };\n    // If Liquid already rendered any special cards on page 1,\n    // mark them as inserted so JS won't duplicate them.\n    document.querySelectorAll('.wm-special-card[data-wm-special-id]').forEach(el => {\n      const id = el.getAttribute('data-wm-special-id');\n      if (id) WM_SPECIAL.inserted.add(id);\n    });\n    \n    \n    function wmCountProductsInDom(container){\n      return Array.from(container.querySelectorAll('.product-slide'))\n        .filter(s => !s.classList.contains('wm-special-card') && s.dataset.wmSpecial !== '1')\n        .length;\n    }\n    \n    function wmBuildSpecialCardEl(sc){\n      const section = document.createElement('section');\n    section.className = 'product-slide wm-special-card'\n      + (sc.hide_on_desktop ? ' wm-hide-desktop' : '')\n      + (sc.card_layout === 'app_popup' ? ' wm-special-card--app-popup' : '');\n      section.dataset.wmSpecial = '1';\n      section.dataset.wmSpecialId = sc.id;\n      section.dataset.wmVisibility = sc.visibility || 'everyone';\n      section.dataset.wmCardLayout = sc.card_layout || 'standard';\n    \n      // match your structure so sizing/snap works\n      const inner = document.createElement('div');\n      inner.className = 'product-slide-inner';\n        inner.dataset.wmSpecialInner = '1';\n      inner.style.overflow = 'hidden';\n    \n      inner.style.position = 'relative';\n    \n      // image (DOM-only, avoids template literal paste issues)\n    const desktopImg = sc.image_desktop || sc.image_mobile;\n    const mobileImg = sc.image_mobile || sc.image_desktop;\n\n    if (sc.card_layout === 'app_popup') {\n      if (typeof window.wmBuildSpecialPopupContent === 'function') {\n        window.wmBuildSpecialPopupContent(inner, sc, desktopImg, mobileImg);\n      }\n    } else {\n      if (desktopImg) {\n        const picture = document.createElement('picture');\n        picture.className = 'wm-special-card__media';\n\n        if (mobileImg) {\n          const source = document.createElement('source');\n          source.setAttribute('media', '(max-width: 767px)');\n          source.setAttribute('srcset', mobileImg);\n          picture.appendChild(source);\n        }\n\n        const img = document.createElement('img');\n        img.className = 'wm-special-card__img';\n        img.src = desktopImg;\n        img.alt = sc.alt || 'Wax Merchant';\n        img.loading = 'lazy';\n        picture.appendChild(img);\n\n        inner.appendChild(picture);\n      }\n\n      if (sc.cta_url && sc.cta_text){\n        const ctaWrap = document.createElement('div');\n        ctaWrap.className = 'wm-special-cta';\n        ctaWrap.style.cssText = 'position:absolute;left:16px;right:16px;bottom:16px;z-index:3;pointer-events:auto;';\n\n        const btn = document.createElement('a');\n        btn.className = 'wm-special-cta__btn ' + (sc.cta_style === 'outline' ? 'is-outline' : 'is-fill');\n        btn.href = sc.cta_url;\n        btn.textContent = sc.cta_text;\n\n        if (sc.cta_new_tab){\n          btn.target = '_blank';\n          btn.rel = 'noopener';\n        }\n\n        btn.addEventListener('click', (e) => {\n          e.stopPropagation();\n        });\n\n        ctaWrap.appendChild(btn);\n        inner.appendChild(ctaWrap);\n      }\n\n      if (sc.link_url){\n        const a = document.createElement('a');\n        a.href = sc.link_url;\n        a.setAttribute('aria-label', sc.alt || 'Wax Merchant');\n        a.style.cssText = 'position:absolute;inset:0;z-index:1;';\n\n        if (sc.open_new_tab){\n          a.target = '_blank';\n          a.rel = 'noopener';\n        }\n        inner.appendChild(a);\n      }\n    }\n    \n      section.appendChild(inner);\n      return section;\n    }\n    \n    /**\n     * Insert any special cards whose insert_after threshold\n     * is now reached, based on total PRODUCT slides rendered.\n     *\n     * Call this after:\n     *  - initial render\n     *  - shuffle swap-in\n     *  - lazy append\n     *  - shuffle append\n     */\n\nfunction wmIsMobiLoudApp() {\n  if (typeof window.WM_IS_APP === 'boolean') return window.WM_IS_APP;\n\n  var ua = (navigator.userAgent || '').toLowerCase();\n  var deviceData = window.deviceData || window.DeviceData || null;\n\n  if (deviceData && deviceData.isCanvas === true) return true;\n  if (ua.indexOf('canvas') !== -1) return true;\n\n  var params = new URLSearchParams(window.location.search);\n  if (params.get('wm_app') === '1') return true;\n\n  return false;\n}\n\nconst WM_IS_APP = wmIsMobiLoudApp();\n     \n    function wmMaybeInsertSpecialCards(container){\n  const specials = (window.WM_SPECIAL_CARDS || [])\n    .slice()\n    .sort((a,b)=>a.insert_after-b.insert_after);\n\n  if (!specials.length) return;\n\n  container.querySelectorAll('.wm-special-card[data-wm-special-id]').forEach(el => {\n    const id = el.getAttribute('data-wm-special-id');\n    if (id) WM_SPECIAL.inserted.add(id);\n  });\n\n  const productsOnly = Array.from(container.querySelectorAll('.product-slide'))\n    .filter(s => !s.classList.contains('wm-special-card') && s.dataset.wmSpecial !== '1');\n\n  for (const sc of specials){\n    if (!sc || !sc.id) continue;\n\n    // WM: per-card app visibility\n    if (sc.visibility === 'non_app_only' && WM_IS_APP) continue;\n    if (sc.visibility === 'app_only' && !WM_IS_APP) continue;\n\n    if (WM_SPECIAL.inserted.has(sc.id)) continue;\n\n    const anchor = productsOnly[sc.insert_after - 1];\n    if (!anchor) continue;\n\n    const el = wmBuildSpecialCardEl(sc);\n    el.setAttribute('data-wm-special-id', sc.id);\n    el.setAttribute('data-wm-special', '1');\n\n    anchor.insertAdjacentElement('afterend', el);\n    WM_SPECIAL.inserted.add(sc.id);\n\n    if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(el);\n  }\n}\n    \n    \n    \n      /* =========================================================\n       WM RANDOM SHUFFLE ENGINE (Option A \u2013 full collection)\n       Loads product HANDLES only (50 per page), shuffles client-side\n    ========================================================= */\n    \n    let WM_HANDLE_POOL = [];\n    let WM_HANDLE_CURSOR = 0;\n    let WM_HANDLES_PAGE = 1;\n    let WM_HANDLES_DONE = false;\n    let WM_RENDERED_HANDLES = new Set(); // prevents repeats within the session\n    let WM_UNIQUE_HANDLES = new Set();   // \u2705 NEW: prevents duplicates entering the pool\n    \n    \n    function wmIsShuffleMode(){\n      const c = document.getElementById('verticalSwipeContainer');\n      const params = new URLSearchParams(window.location.search);\n      if (params.has('sort_by')) return params.get('sort_by') === 'wm-random';\n      return !!(c && c.dataset && c.dataset.wmShuffle === '1');\n    }\n\n    function wmBuildAjaxCardUrl(handle){\n      const url = new URL(`/products/${encodeURIComponent(handle)}`, window.location.origin);\n      url.searchParams.set('view', 'ajax-card');\n\n      const current = new URL(window.location.href);\n      const artist = current.searchParams.get('artist');\n      const label = current.searchParams.get('label');\n      const feedContainer = document.getElementById('verticalSwipeContainer');\n      const filterSource = feedContainer?.dataset?.wmFilterSource || '';\n      const filterValue = feedContainer?.dataset?.wmFilterValue || '';\n\n      if (artist) url.searchParams.set('artist', artist);\n      if (label) url.searchParams.set('label', label);\n      if (!artist && !label) {\n        if (filterSource === 'artist' && filterValue) {\n          url.searchParams.set('artist', filterValue);\n        }\n        if (filterSource === 'label' && filterValue) {\n          url.searchParams.set('label', filterValue);\n        }\n      }\n\n      if (window.WM_FEED_SOURCE === 'wishlist') {\n        url.searchParams.set('wm_feed_source', 'wishlist');\n      }\n\n      return url.pathname + '?' + url.searchParams.toString();\n    }\n    \n      // ================================\n      // WM: Show full onboarding once. Returning users unlock from their first listening gesture.\n      // ================================\n      const WM_OVERLAY_SEEN_KEY = 'wm_feed_unlock_seen_v1';\n      const WM_ONBOARDING_DISMISSED_KEY = 'wm_feed_intro_dismissed_v1';\n      let WM_AUTOBOOT_ALLOWED = !!WM_IS_APP; // app users can attempt autoplay immediately\n    \n      let overlay = document.getElementById('audioUnlockOverlay');\n      const overlaySeen =\n        sessionStorage.getItem(WM_OVERLAY_SEEN_KEY) === '1' ||\n        localStorage.getItem(WM_ONBOARDING_DISMISSED_KEY) === '1';\n      const wmSuppressWeeklyDigsUnlockOverlay =\n        window.WM_FEED_SOURCE === 'weekly_digs' &&\n        (\n          window.WM_WEEKLY_DIGS_ONBOARDING_ACTIVE === true ||\n          document.documentElement.classList.contains('wm-weekly-digs-pending') ||\n          window.WM_RECOMMENDATIONS_STATUS === 'not_ready' ||\n          window.WM_RECOMMENDATIONS_STATUS === 'no_products'\n        );\n      if (wmSuppressWeeklyDigsUnlockOverlay) {\n        WM_AUTOBOOT_ALLOWED = false;\n      }\n      if (overlay && (WM_IS_APP || overlaySeen)) {\n\t        overlay.remove();\n\t        overlay = null;\n\t      } else if (overlay) {\n\t        document.documentElement.classList.toggle('wm-unlock-overlay-mini', overlaySeen);\n\t      }\n\n    // Autoboot only after an explicit user gesture (overlay tap OR play tap)\n    WM_AUTOBOOT_ALLOWED = !!WM_IS_APP;\n      if (WM_FOR_YOU_GRID_VIEW) {\n      WM_AUTOBOOT_ALLOWED = false;\n      if (overlay) overlay.remove();\n      overlay = null;\n      wmDisableScrollFeedRuntimeForGridView();\n    }\n\n    if (overlay && !document.documentElement.classList.contains('wm-unlock-overlay-mini')) {\n      const revealFullIntroWhenFeedIsReady = () => {\n        const feed = document.getElementById('verticalSwipeContainer');\n        const hasProductSlide = !!feed?.querySelector?.(\n          '.product-slide[data-product-handle]:not([data-wm-dormant=\"1\"]), .product-slide[data-product-handle]'\n        );\n        if (!hasProductSlide) return false;\n        document.documentElement.classList.add('wm-feed-intro-ready');\n        return true;\n      };\n\n      if (!revealFullIntroWhenFeedIsReady()) {\n        const feed = document.getElementById('verticalSwipeContainer');\n        const introReadyObserver = new MutationObserver(() => {\n          if (revealFullIntroWhenFeedIsReady()) introReadyObserver.disconnect();\n        });\n        introReadyObserver.observe(feed || document.body, { childList: true, subtree: true });\n\n        let introReadyAttempts = 0;\n        const introReadyTimer = window.setInterval(() => {\n          introReadyAttempts += 1;\n          if (revealFullIntroWhenFeedIsReady() || introReadyAttempts >= 40) {\n            window.clearInterval(introReadyTimer);\n            introReadyObserver.disconnect();\n          }\n        }, 250);\n\n        window.addEventListener('load', revealFullIntroWhenFeedIsReady, { once: true });\n        window.addEventListener('pageshow', revealFullIntroWhenFeedIsReady, { once: true });\n      }\n    }\n    \n    \n    \n      \n    \n    \n    function wmShuffleArray(arr){\n      for (let i = arr.length - 1; i > 0; i--){\n        const j = Math.floor(Math.random() * (i + 1));\n        [arr[i], arr[j]] = [arr[j], arr[i]];\n      }\n    }\n    \n    /* Fetch ONE page of 50 handles */\n    async function wmFetchHandlesPage(page){\n      const url = `${window.location.pathname}?view=handles&page=${page}`;\n    \n      try {\n        const res = await fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } });\n        if (!res.ok) return [];\n    \n        // Shopify theme views often come back as text/html even if the body is JSON.\n        const txt = await res.text();\n    \n        // Try JSON first\n        try {\n          const json = JSON.parse(txt);\n          return json.handles || [];\n        } catch (e) {\n          console.warn('[WM SHUFFLE] handles not JSON (check collection.handles template):', url);\n          // Optional: log a snippet to help debug quickly\n          console.warn(txt.slice(0, 200));\n          return [];\n        }\n      } catch (e) {\n        console.warn('[WM SHUFFLE] handles fetch failed:', e);\n        return [];\n      }\n    }\n    \n    \n    \n    /* Ensure we have at least N unseen handles */\n    async function wmEnsureHandlesAvailable(n){\n      while ((WM_HANDLE_POOL.length - WM_HANDLE_CURSOR) < n && !WM_HANDLES_DONE){\n        const next = await wmFetchHandlesPage(WM_HANDLES_PAGE);\n    \n        if (!next.length){\n          WM_HANDLES_DONE = true;\n          break;\n        }\n    \n        for (const h of next) {\n      if (!h) continue;\n      if (WM_UNIQUE_HANDLES.has(h)) continue;\n      WM_UNIQUE_HANDLES.add(h);\n      WM_HANDLE_POOL.push(h);\n    }\n    WM_HANDLES_PAGE += 1;\n    \n      }\n    }\n    \n    /* OPTION A \u2014 warm the ENTIRE collection in background */\n    async function wmWarmAllHandles(container){\n      const totalPages = parseInt(container?.dataset?.wmHandlesPages || '0', 10);\n      if (!totalPages) return;\n    \n      for (let p = 1; p <= totalPages; p++){\n        const next = await wmFetchHandlesPage(p);\n        if (!next.length){\n          // stop if a page returns empty\n          break;\n        }\n    for (const h of next) {\n      if (!h) continue;\n      if (WM_UNIQUE_HANDLES.has(h)) continue;\n      WM_UNIQUE_HANDLES.add(h);\n      WM_HANDLE_POOL.push(h);\n    }\n    \n        // yield to UI\n        await new Promise(r => setTimeout(r, 0));\n      }\n    \n      WM_HANDLES_DONE = true;\n    }\n    \n    \n    /* Load one RANDOM batch (6 like your current pagination) */\n    async function wmLoadRandomBatch(container){\n      await wmEnsureHandlesAvailable(6);\n    \n      const handles = WM_HANDLE_POOL.slice(WM_HANDLE_CURSOR, WM_HANDLE_CURSOR + 6);\n    WM_HANDLE_CURSOR += handles.length;\n    \n    // If no more handles, show end message (like normal pagination)\n    if (!handles.length) {\n      if (endMessage) endMessage.style.display = 'block';\n      return;\n    }\n    \n    // If we\u2019re about to exhaust the pool, show the end message after this batch\n    if (WM_HANDLES_DONE && WM_HANDLE_CURSOR >= WM_HANDLE_POOL.length) {\n      // we'll reveal it after append so user can scroll onto it naturally\n      setTimeout(() => { if (endMessage) endMessage.style.display = 'block'; }, 0);\n    }\n    \n    \n      const htmlChunks = await Promise.all(\n        handles.map(async (h) => {\n          const ajaxCardUrl = wmBuildAjaxCardUrl(h);\n  \n  const res = await fetch(ajaxCardUrl, {\n    headers: { 'X-Requested-With': 'XMLHttpRequest' }\n  });\n          if (!res.ok) return '';\n          return await res.text();\n        })\n      );\n    \n      const newSlides = [];\n    \n      for (const html of htmlChunks) {\n        if (!html) continue;\n        const doc = new DOMParser().parseFromString(html, 'text/html');\n        const slide = doc.querySelector('.product-slide');\n        if (!slide) continue;\n    \n        const node = document.importNode(slide, true);\n        container.appendChild(node);\n        newSlides.push(node);\n      }\n    \n      if (!newSlides.length) return;\n    \n      initializeSwiperForSlides(newSlides);\n      newSlides.forEach(slide => initializeAudioControlsForProduct(slide));\n      wmInitTitleMarquees(container);\n      wmObserveNewMarqueeCards(newSlides);\n      wmMaybeInsertSpecialCards(container);\n    \n    \n      newSlides.forEach(slide => { if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide); });\n    }\n    \n    \n    \n    /* First load */\n    async function wmInitShuffle(container){\n      if (!container) return;\n    \n      WM_SHUFFLE_BOOTING = true;\n    \n      WM_HANDLE_POOL = [];\n    WM_HANDLE_CURSOR = 0;\n    WM_HANDLES_PAGE = 1;\n    WM_HANDLES_DONE = false;\n    \n    WM_RENDERED_HANDLES = new Set();\n    WM_UNIQUE_HANDLES = new Set(); // \u2705 NEW reset\n    \n    \n    \n      // show spinner during shuffle boot (optional but helps perception)\n      if (loadingIndicator) loadingIndicator.style.display = 'block';\n\n      function wmFailOpenShuffleBoot(){\n        WM_SHUFFLE_BOOTING = false;\n        if (loadingIndicator) loadingIndicator.style.display = 'none';\n        document.documentElement.classList.remove('wm-shuffle-boot');\n        initializeAllExistingSlides();\n        wmSafariLazyImageFix(container);\n        wmInitTitleMarquees(container);\n        wmMaybeInsertSpecialCards(container);\n      }\n    \n      // 1) Get enough handles for the first 6 (fast)\n      await wmEnsureHandlesAvailable(6);\n    \n      // If handles failed, keep server-rendered slides and allow normal autoplay\n      if ((WM_HANDLE_POOL.length - WM_HANDLE_CURSOR) < 1) {\n        console.warn('[WM SHUFFLE] No handles returned \u2014 leaving initial server batch.');\n        wmFailOpenShuffleBoot();\n        return;\n      }\n    \n      // Shuffle what we have now (we'll append more later, and re-shuffle pool once warmed)\n      wmShuffleArray(WM_HANDLE_POOL);\n    \n      // 2) Prefetch first 6 cards BEFORE touching the DOM\n      const handles = WM_HANDLE_POOL.slice(WM_HANDLE_CURSOR, WM_HANDLE_CURSOR + 6);\n      WM_HANDLE_CURSOR += handles.length;\n    \n      const htmlChunks = await Promise.all(handles.map(async (h) => {\n        const ajaxCardUrl = wmBuildAjaxCardUrl(h);\n  \n  const res = await fetch(ajaxCardUrl, {\n    headers: { 'X-Requested-With': 'XMLHttpRequest' }\n  });\n        if (!res.ok) return '';\n        return await res.text();\n      }));\n    \n      // Robust parse: supports fragments or full HTML docs\n      const slides = [];\n      for (const html of htmlChunks) {\n        if (!html) continue;\n        const doc = new DOMParser().parseFromString(html, 'text/html');\n        const found = doc.querySelector('.product-slide');\n        if (found) slides.push(found);\n      }\n    \n      if (!slides.length) {\n        console.warn('[WM SHUFFLE] ajax-card returned no .product-slide \u2014 leaving initial server batch.');\n        wmFailOpenShuffleBoot();\n        return;\n      }\n    \n      // Pause anything that may have started (prevents \u201Cfeatured starts then cuts\u201D)\n      if (WM_OWNER.slide) {\n        wmPauseSlide(WM_OWNER.slide, { reason: 'special-card' });\n        const oldBtn = WM_OWNER.slide.querySelector('.play-pause-button');\n        setButtonToPlay(oldBtn);\n      }\n    \n      \n    \n      // 3) Swap instantly\n        // IMPORTANT: we're about to remove Liquid-rendered specials too.\n      // Reset inserted set so specials can be re-inserted for the shuffled batch.\n      WM_SPECIAL.inserted = new Set();\n      WM_SPECIAL.productCount = 0;\n    \n      container.querySelectorAll('.product-slide').forEach(s => s.remove());\n    \n      slides.forEach(s => {\n        const node = document.importNode(s, true);\n        container.appendChild(node);\n      });\n    \n      const injectedSlides = Array.from(container.querySelectorAll('.product-slide'));\n    \n      // Make first shuffled covers load like your server-rendered batch\n    injectedSlides.forEach((ps, idx) => {\n      const cover = ps.querySelector('.audio-cover');\n      wmEnhanceCoverImage(cover, idx);\n    });\n    \n    \n      // 4) Init behaviours on injected slides\n      initializeSwiperForSlides(injectedSlides);\n      injectedSlides.forEach(slide => initializeAudioControlsForProduct(slide));\n      wmInitTitleMarquees(container);\n      wmObserveNewMarqueeCards(injectedSlides);\n      wmMaybeInsertSpecialCards(container);\n      wmSafariLazyImageFix(container);\n    \n    \n    \n      injectedSlides.forEach(slide => { if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide); });\n      wmStartAppAutoplayWhenFeedReady({ force: true });\n    \n     // 5) Boot done \u2014 decide what happens next\n    WM_SHUFFLE_BOOTING = false;\n    if (loadingIndicator) loadingIndicator.style.display = 'none';\n    \n    document.documentElement.classList.remove('wm-shuffle-boot');\n    \n    // If we dismissed overlay during boot, autoplay now\n    if (WM_PENDING_AUTOBOOT && WM_MEDIA_UNLOCKED) {\n      WM_PENDING_AUTOBOOT = false;\n      kickVisibleSlide();\n    } else if (!WM_AUTOBOOT_ALLOWED) {\n      setTimeout(() => wmPromptPlayOnFirstVisible(), 0);\n    } else {\n      if (WM_MEDIA_UNLOCKED) kickVisibleSlide();\n      else if (WM_IS_APP) {\n        wmUnlockAudioOnce(wmGetVisibleAudioSlideForUnlock()).then(() => {\n          if (WM_MEDIA_UNLOCKED) kickVisibleSlide();\n        }).catch(() => {});\n      }\n    }\n    \n    \n    // 6) Warm remaining handles in background (so infinite scroll stays strong)\n    wmWarmAllHandles(container).then(() => {\n      const used = WM_HANDLE_CURSOR;\n      const remaining = WM_HANDLE_POOL.slice(used);\n      wmShuffleArray(remaining);\n      WM_HANDLE_POOL = WM_HANDLE_POOL.slice(0, used).concat(remaining);\n      WM_HANDLES_DONE = true;\n    }).catch(()=>{});\n    }\n    \n    \n    \n    \n    \n      var container = document.getElementById('verticalSwipeContainer');\n      console.log('WM container found:', !!container, container);\n      // ================================\n    // WM: iOS scroll-snap stabiliser (end-of-feed bounce fix)\n    // ================================\n    var WM_IS_IOS = (() => {\n      const ua = navigator.userAgent || '';\n      const platform = navigator.platform || '';\n      const iOS = /iP(ad|hone|od)/.test(platform);\n      const iPadOS = (platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n      return iOS || iPadOS || /Safari/.test(ua) && /Mobile/.test(ua);\n    })();\n    \n    \n    \n    \n    \n    function wmSnapToNearestProductSlide(){\n      if (!container) return;\n      if (!WM_IS_IOS) return;\n      if (isLoading) return;\n    \n      // Only stabilize at feed edges (prevents mid-feed forced snap-back)\n      const edgeThreshold = 36;\n      const atTopEdge = container.scrollTop <= edgeThreshold;\n      const atBottomEdge = (container.scrollTop + container.clientHeight) >= (container.scrollHeight - edgeThreshold);\n      if (!atTopEdge && !atBottomEdge) return;\n    \n      const slides = Array.from(container.querySelectorAll('.product-slide'));\n      if (!slides.length) return;\n    \n      const y = container.scrollTop;\n      let best = slides[0];\n      let bestDist = Infinity;\n    \n      for (const s of slides){\n        const top = s.offsetTop;\n        const d = Math.abs(top - y);\n        if (d < bestDist){\n          bestDist = d;\n          best = s;\n        }\n      }\n    \n      // Relaxed nudge threshold (was 6)\n      const snapTolerance = Math.max(72, Math.round(container.clientHeight * 0.12));\n      if (best && bestDist > snapTolerance){\n        container.scrollTo({ top: best.offsetTop, behavior: 'auto' });\n      }\n    }\n\n    function wmSnapPersonalizedFeedToNearestSlide(){\n      if (!container) return;\n      if (isLoading) return;\n      if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') return;\n\n      const slides = Array.from(container.querySelectorAll('.product-slide:not(.wm-special-card)'));\n      if (!slides.length) return;\n\n      const y = container.scrollTop;\n      let best = null;\n      let bestDist = Infinity;\n\n      slides.forEach((slide) => {\n        const dist = Math.abs(slide.offsetTop - y);\n        if (dist < bestDist) {\n          best = slide;\n          bestDist = dist;\n        }\n      });\n\n      if (!best || bestDist <= 3) return;\n      if (bestDist > Math.max(90, container.clientHeight * 0.42)) return;\n      container.scrollTo({ top: best.offsetTop, behavior: 'auto' });\n    }\n    \n    \n    // Debounce: run after momentum scrolling finishes\n    let wmSnapTimer = null;\n    let wmPersonalizedSnapTimer = null;\n    if (container) {\n    container.addEventListener('scroll', () => {\n      if (wmPersonalizedSnapTimer) clearTimeout(wmPersonalizedSnapTimer);\n      wmPersonalizedSnapTimer = setTimeout(wmSnapPersonalizedFeedToNearestSlide, 220);\n    }, { passive: true });\n\n    container.addEventListener('scroll', () => {\n      if (scrollThrottle) return;\n      scrollThrottle = true;\n  \n      setTimeout(async () => {\n        scrollThrottle = false;\n        if (isLoading) return;\n  \n        const source = wmGetCurrentIndexSource();\n        if (!wmIsShuffleMode() && window.WM_INDEX_CURSOR >= source.length) {\n          if (endMessage) endMessage.style.display = 'block';\n          return;\n        }\n  \n        const scrollPos = container.scrollTop + container.clientHeight;\n        const triggerPoint = container.scrollHeight - 1400;\n  \n        if (scrollPos >= triggerPoint) {\n          await wmWaitForCollectionIndex();\n  \n          if (wmIsShuffleMode() && !wmShouldPrioritizePinnedHandle()) {\n            if (WM_HANDLES_DONE && WM_HANDLE_CURSOR >= WM_HANDLE_POOL.length) {\n              if (endMessage) endMessage.style.display = 'block';\n              return;\n            }\n            wmLoadRandomBatch(container);\n          } else {\n            await loadNextPage();\n          }\n        }\n      }, 150);\n    });\n  }\n    \n    if (document.documentElement.classList.contains('wm-prepinned')) {\n      setTimeout(() => document.documentElement.classList.remove('wm-prepinned'), 2000);\n    }\n    \n    \n      (function wmForcePinnedStartNoSmooth(){\n      if (!container) return;\n    \n      const params = new URLSearchParams(window.location.search);\n      const hasPinned = !!params.get('p');\n      const isReturn = params.get('wm_return') === '1';\n    \n      // Only force top for pinned links (not \u201Creturn to feed\u201D restores)\n      if (!hasPinned || isReturn) return;\n    \n      // Stop browser restoring scroll (Safari especially)\n      if ('scrollRestoration' in history) history.scrollRestoration = 'manual';\n    \n      // Kill smooth behavior while we reset scroll positions\n      container.classList.add('wm-no-smooth');\n    \n      // Reset *both* window and container (some browsers restore one or the other)\n      const goTop = () => {\n        window.scrollTo(0, 0);\n        document.documentElement.scrollTop = 0;\n        document.body.scrollTop = 0;\n        container.scrollTop = 0;\n      };\n    \n      goTop();\n      requestAnimationFrame(goTop);\n      setTimeout(goTop, 50);\n      setTimeout(goTop, 150);\n    \n      // Re-enable smooth scrolling after initial stabilisation\n      setTimeout(() => {\n        container.classList.remove('wm-no-smooth');\n      }, 400);\n    })();\n    \n      \n      // --- Force start at top when using pinned links (?p=...), unless returning from filter ---\n    (function wmForcePinnedStart(){\n      if (!container) return;\n    \n      const params = new URLSearchParams(window.location.search);\n      const hasPinned = !!params.get('p');\n      const isReturn = params.get('wm_return') === '1';\n    \n      if (!hasPinned || isReturn) return;\n    \n      // Stop the browser from restoring scroll position (especially iOS Safari)\n      if ('scrollRestoration' in history) history.scrollRestoration = 'manual';\n    \n      // Hard reset container scroll a few times to beat late layout / image loads\n      const goTop = () => { container.scrollTop = 0; };\n    \n      goTop();\n      requestAnimationFrame(goTop);\n      setTimeout(goTop, 50);\n      setTimeout(goTop, 150);\n      setTimeout(goTop, 300);\n    })();\n    \n    \n    // --- PINNED PRODUCT: read ?p=HANDLE from the URL and inject the slide ---\n    const pinnedHandle = wmGetPinnedHandleFromUrl();\n    if (pinnedHandle && window.WM_FEED_SOURCE === 'recommendations') {\n      wmInsertPinnedCard(pinnedHandle);\n    }\n    \n    \n        // ================================\n      // WM PINNED PRODUCT (inject full audio card)\n      // Fetches: /products/HANDLE?view=pinned-product-card\n      // ================================\n      function wmGetPinnedHandleFromUrl() {\n        try { return new URLSearchParams(window.location.search).get('p') || ''; }\n        catch (e) { return ''; }\n      }\n\n      function wmShouldPrioritizePinnedHandle() {\n        try {\n          const params = new URLSearchParams(window.location.search);\n          return !!(params.get('p') && params.get('wm_return') !== '1');\n        } catch (e) {\n          return false;\n        }\n      }\n\n      function wmPinnedFallbackItem(handle) {\n        const item = {\n          handle: handle,\n          product_handle: handle,\n          available: false\n        };\n\n        try {\n          const debug = document.getElementById('wmPinnedDebug');\n          const debugHandle = debug?.dataset?.handle || debug?.dataset?.p || '';\n          const debugAvailable = debug?.dataset?.available || '';\n          if (debug && debugHandle === handle && debugAvailable !== '') {\n            item.available = debugAvailable === 'true' || debugAvailable === '1';\n          }\n        } catch (e) {}\n\n        return item;\n      }\n\n      function wmRemoveDuplicatePinnedSlides(handle, pinnedNode) {\n        if (!handle || !container) return;\n\n        wmDedupeRenderedProductSlides(handle, pinnedNode);\n      }\n\n      async function wmFetchPinnedProductState(handle) {\n        try {\n          const res = await fetch(`/products/${encodeURIComponent(handle)}.js`, {\n            headers: { 'Accept': 'application/json' }\n          });\n\n          if (!res.ok) return wmPinnedFallbackItem(handle);\n\n          const product = await res.json();\n\n          return {\n            handle: product?.handle || handle,\n            product_handle: product?.handle || handle,\n            id: product?.id || '',\n            product_id: product?.id || '',\n            available: !!product?.available,\n            tags: Array.isArray(product?.tags) ? product.tags : []\n          };\n        } catch (e) {\n          return wmPinnedFallbackItem(handle);\n        }\n      }\n\n      async function wmFetchPinnedSlide(handle) {\n        const urls = [\n          `/products/${encodeURIComponent(handle)}?view=pinned-product-card`,\n          wmBuildAjaxCardUrl(handle)\n        ];\n\n        for (const url of urls) {\n          try {\n            const res = await fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } });\n            if (!res.ok) continue;\n\n            const html = await res.text();\n            const doc = new DOMParser().parseFromString(html, 'text/html');\n            const slide = doc.querySelector('.product-slide');\n\n            if (slide) return slide;\n          } catch (e) {}\n        }\n\n        return null;\n      }\n    \n      async function wmInsertPinnedCard(handle) {\n        if (!handle || !container) return;\n    \n        // prevent duplicate insert\n        if (container.querySelector('.product-slide[data-wm-pinned=\"1\"]')) {\n          document.documentElement.classList.remove('wm-prepinned');\n          return;\n        }\n    \n    \n        try {\n          const [pinnedSlide, pinnedItem] = await Promise.all([\n            wmFetchPinnedSlide(handle),\n            wmFetchPinnedProductState(handle)\n          ]);\n\n          if (!pinnedSlide) {\n            document.documentElement.classList.remove('wm-prepinned');\n            return;\n          }\n    \n          // Import node into this document\n          const node = document.importNode(pinnedSlide, true);\n          node.setAttribute('data-wm-pinned', '1');\n\n          if (!node.getAttribute('data-product-handle')) {\n            node.setAttribute('data-product-handle', handle);\n          }\n\n          if (pinnedItem && Object.prototype.hasOwnProperty.call(pinnedItem, 'available')) {\n            node.setAttribute('data-wm-available', pinnedItem.available ? '1' : '0');\n          }\n    \n          container.prepend(node);\n          wmRemoveDuplicatePinnedSlides(handle, node);\n          wmApplyPinnedStockState(node, pinnedItem || wmPinnedFallbackItem(handle));\n    \n          document.documentElement.classList.remove('wm-prepinned');\n    container.scrollTop = 0;\n    \n    \n          // Init all behaviors on the inserted slide\n          const inserted = container.querySelector('.product-slide[data-wm-pinned=\"1\"]') || container.querySelector('.product-slide');\n          if (inserted) {\n            initializeSwiperForSlides([inserted]);\n            initializeAudioControlsForProduct(inserted);\n            wmInitTitleMarquees(container);\n            if (typeof wmObserveNewMarqueeCards === 'function') wmObserveNewMarqueeCards([inserted]);\n          }\n    \n          container.scrollTop = 0;\n    \n        } catch (e) {\n          document.documentElement.classList.remove('wm-prepinned');\n        }\n      }\n    \n       \n    let WM_PENDING_RETURN = null;\n    let WM_RETURN_RESTORE_ACTIVE = false;\n\n    function wmBuildComparableUrl(urlLike) {\n      try {\n        const url = new URL(urlLike, window.location.origin);\n        url.searchParams.delete('wm_return');\n        return url.pathname + (url.searchParams.toString() ? `?${url.searchParams.toString()}` : '');\n      } catch (e) {\n        return '';\n      }\n    }\n    \n    try {\n      const saved = JSON.parse(sessionStorage.getItem('wm_feed_return') || 'null');\n      const params = new URLSearchParams(window.location.search);\n    \n      // Only restore when we came back from the clear-filter pill\n      const currentComparableUrl = wmBuildComparableUrl(window.location.href);\n      const savedComparableUrl = saved?.originUrl ? wmBuildComparableUrl(saved.originUrl) : '';\n\n      const isAuthReturn = sessionStorage.getItem('wm_auth_return_pending') === '1';\n\n      if (\n        saved &&\n        params.get('wm_return') === '1' &&\n        (\n          isAuthReturn ||\n          (\n            savedComparableUrl &&\n            savedComparableUrl === currentComparableUrl\n          )\n        )\n      ) {\n        WM_PENDING_RETURN = saved;\n      } else if (params.get('wm_return') === '1') {\n        sessionStorage.removeItem('wm_feed_return');\n        sessionStorage.removeItem('wm_auth_return_pending');\n      }\n    } catch (e) {}\n    \n    document.addEventListener('click', (e) => {\n      const clearPill = e.target.closest('.wm-filter-sticker'); // your \u201Cfilter\u201D sticker / clear pill\n      if (!clearPill) return;\n    \n      try {\n        e.preventDefault();\n        e.stopPropagation();\n\n        let targetUrl = '/collections/all-records?sort_by=created-descending&wm_return=1';\n        try {\n          const saved = JSON.parse(sessionStorage.getItem('wm_feed_return') || 'null');\n          const origin = saved?.originUrl ? new URL(saved.originUrl, window.location.origin) : null;\n          const current = new URL(window.location.href);\n          const originSort =\n            origin?.searchParams?.get('sort_by') ||\n            current.searchParams.get('sort_by') ||\n            container?.dataset?.sortBy ||\n            'created-descending';\n\n          if (originSort === 'wm-random') {\n            sessionStorage.removeItem('wm_feed_return');\n            sessionStorage.removeItem('wm_auth_return_pending');\n            targetUrl = '/collections/all-records?sort_by=wm-random';\n          } else if (originSort === 'title-ascending' || originSort === 'title-descending') {\n            sessionStorage.removeItem('wm_feed_return');\n            sessionStorage.removeItem('wm_auth_return_pending');\n            targetUrl = '/collections/all-records?sort_by=created-descending&wm_return=1';\n          } else if (origin) {\n            origin.searchParams.set('wm_return', '1');\n            if (!origin.searchParams.get('sort_by') && originSort) {\n              origin.searchParams.set('sort_by', originSort);\n            }\n            targetUrl = origin.pathname + (origin.search ? origin.search : '');\n          } else {\n            targetUrl = `/collections/all-records?sort_by=${encodeURIComponent(originSort)}&wm_return=1`;\n          }\n        } catch (err) {}\n\n        window.location.href = targetUrl;\n      } catch (err) {\n        // if anything fails, let the normal href happen\n      }\n    }, true);\n    \n    \n    // Find the \"current\" slide at the top of the viewport (best anchor)\n    function wmGetAnchorSlide() {\n      if (!container) return null;\n      const slides = Array.from(\n        container.querySelectorAll('.product-slide[data-product-handle]')\n      ).filter((slide) => !wmIsSpecialCard(slide));\n      if (!slides.length) return null;\n    \n      // anchor line: a little below the top so it feels natural\n      const anchorY = container.scrollTop + 40;\n    \n      let best = slides[0];\n      let bestDist = Infinity;\n    \n      for (const s of slides) {\n        const top = s.offsetTop;\n        const dist = Math.abs(top - anchorY);\n        if (dist < bestDist) {\n          best = s;\n          bestDist = dist;\n        }\n      }\n      return best;\n    }\n\n    function wmSaveFeedReturnState(){\n      if (!container) return;\n\n      const anchor = wmGetAnchorSlide();\n      const handle = anchor?.dataset?.productHandle || null;\n      const offsetInSlide = anchor ? (container.scrollTop - anchor.offsetTop) : 0;\n      const source = wmGetCurrentIndexSource();\n      const sourceIndex = handle\n        ? source.findIndex((item) => (item?.handle || item?.product_handle) === handle)\n        : -1;\n\n      sessionStorage.setItem('wm_feed_return', JSON.stringify({\n        originUrl: window.location.pathname + window.location.search,\n        productHandle: handle,\n        sourceIndex: sourceIndex,\n        offsetInSlide: offsetInSlide,\n        scrollTop: container.scrollTop,\n        ts: Date.now()\n      }));\n    }\n    \n    // 1) Remember position before entering a filter\n    document.addEventListener('click', (e) => {\n      const link = e.target.closest('.wm-artist-link, .wm-label-link');\n      if (!link || !container) return;\n\n      const isCurrentlyFiltered = !!(\n        container?.dataset?.wmFilterSource &&\n        container?.dataset?.wmFilterValue\n      );\n\n      if (isCurrentlyFiltered) {\n        try {\n          const existingReturn = JSON.parse(sessionStorage.getItem('wm_feed_return') || 'null');\n          if (existingReturn?.originUrl) {\n            console.log('[WM RETURN] preserve-existing', {\n              href: window.location.href,\n              existingReturn\n            });\n            return;\n          }\n        } catch (err) {}\n      }\n    \n      wmSaveFeedReturnState();\n    }, true);\n    \n    \n    \n    \n    \n       \n    \n    \n      const loadingIndicator = document.getElementById('loadingIndicator');\n      const endMessage = document.getElementById('endOfFeedMessage');\n    \n      const filterDropdown = document.getElementById('filterOptions');\n      if (filterDropdown) {\n        filterDropdown.addEventListener('change', function () {\n      const selectedUrl = this.value;\n      if (!selectedUrl) return;\n    \n      try {\n        const current = new URL(window.location.href);\n        const next = new URL(selectedUrl, window.location.origin);\n        const shouldPreserveGridView =\n          current.searchParams.get('wm_view') === 'grid' ||\n          current.searchParams.get('view') === 'grid' ||\n          window.WM_FOR_YOU_GRID_VIEW === true ||\n          document.documentElement.classList.contains('wm-for-you-grid-view');\n    \n        // Carry across tracking params\n    const keepKeys = [\"utm_source\",\"utm_medium\",\"utm_campaign\",\"utm_content\",\"utm_term\",\"utm_id\"];\n    keepKeys.forEach(k => {\n      const v = current.searchParams.get(k);\n      if (v && !next.searchParams.get(k)) next.searchParams.set(k, v);\n    });\n    \n    // Conditionally carry pinned (?p=...) ONLY if pinned belongs to destination collection\n    const pinned = current.searchParams.get(\"p\");\n    if (pinned) {\n      const dbg = document.getElementById(\"wmPinnedDebug\");\n      const cols = (dbg?.dataset?.collections || \"\")\n        .split(\",\")\n        .map(s => s.trim())\n        .filter(Boolean);\n    \n      // destination collection handle from /collections/HANDLE\n      const parts = next.pathname.split(\"/\").filter(Boolean);\n      const destHandle = parts[0] === \"collections\" ? (parts[1] || \"\") : \"\";\n    \n      if (destHandle && cols.includes(destHandle)) {\n        next.searchParams.set(\"p\", pinned);\n      } else {\n        next.searchParams.delete(\"p\");\n      }\n    }\n    \n    \n        const isRecommendationsDestination =\n          next.pathname === '/pages/recommendations' ||\n          next.pathname.endsWith('/pages/recommendations') ||\n          next.searchParams.get('view') === 'recommendations';\n        if (isRecommendationsDestination) {\n          next.searchParams.delete('sort_by');\n        }\n\n        // Preserve current sort_by for normal collection/feed switches only.\n        const sortBy = current.searchParams.get(\"sort_by\");\n        if (!isRecommendationsDestination && sortBy && !next.searchParams.get(\"sort_by\") && !wmHasCollectionDefaultSort(next.pathname)) next.searchParams.set(\"sort_by\", sortBy);\n\n        if (shouldPreserveGridView) {\n          if (isRecommendationsDestination) {\n            next.searchParams.delete('view');\n            next.searchParams.set('wm_view', 'grid');\n          } else {\n            next.searchParams.delete('wm_view');\n            next.searchParams.set('view', 'grid');\n          }\n        }\n    \n        if (next.toString() !== current.toString()) window.location.href = next.toString();\n      } catch (e) {\n        // fallback\n        try {\n          const fallbackNext = new URL(selectedUrl, window.location.origin);\n          const shouldPreserveGridView =\n            window.WM_FOR_YOU_GRID_VIEW === true ||\n            document.documentElement.classList.contains('wm-for-you-grid-view') ||\n            new URLSearchParams(window.location.search).get('wm_view') === 'grid' ||\n            new URLSearchParams(window.location.search).get('view') === 'grid';\n          if (\n            fallbackNext.pathname === '/pages/recommendations' ||\n            fallbackNext.pathname.endsWith('/pages/recommendations') ||\n            fallbackNext.searchParams.get('view') === 'recommendations'\n          ) {\n            fallbackNext.searchParams.delete('sort_by');\n            if (shouldPreserveGridView) {\n              fallbackNext.searchParams.delete('view');\n              fallbackNext.searchParams.set('wm_view', 'grid');\n            }\n            window.location.href = fallbackNext.toString();\n            return;\n          }\n          if (shouldPreserveGridView) {\n            fallbackNext.searchParams.delete('wm_view');\n            fallbackNext.searchParams.set('view', 'grid');\n            window.location.href = fallbackNext.toString();\n            return;\n          }\n        } catch (err) {}\n        window.location.href = selectedUrl;\n      }\n    });\n    \n      }\n      \n      // Lock the document scroll while this section is mounted.\n    if (!WM_FOR_YOU_GRID_VIEW) {\n      document.documentElement.classList.add('wm-feed-lock');\n      document.body.classList.add('wm-feed-lock');\n      \n      // Prevent stray touches from scrolling the page (mobile Safari)\n      window.addEventListener('touchmove', function (e) {\n        if (e.target.closest('.wm-select__panel, .wm-feed-menu, #verticalSwipeContainer')) {\n          return;\n        }\n        e.preventDefault();\n      }, { passive: false });\n    } else {\n      wmDisableScrollFeedRuntimeForGridView();\n    }\n    \n    \n    \n    // If you ever navigate away via AJAX, you can clean up like this:\n    // window.addEventListener('beforeunload', () => {\n    //   document.documentElement.classList.remove('wm-feed-lock');\n    //   document.body.classList.remove('wm-feed-lock');\n    // });\n    \n    \n      let currentPage = parseInt(container.dataset.currentPage || '1', 10);\n      const totalPages = parseInt(container.dataset.totalPages || '1', 10);\n      const sortBy = container.dataset.sortBy || '';\n      const collectionHandle = container.dataset.collectionHandle || '';\n    \n      // unlock overlay\n\t    async function unlockAudioPlayback(e) {\n\t      if (WM_OVERLAY_UNLOCKING) return;\n\t      WM_OVERLAY_UNLOCKING = true;\n      e.preventDefault();\n      e.stopPropagation();\n\n      // On iOS web, the coach overlay is instructional only. The first audio\n      // start must be the real play button so WebKit and our UI agree.\n      if (wmRequiresPlayButtonFirstStart()) {\n        try { sessionStorage.setItem(WM_OVERLAY_SEEN_KEY, '1'); } catch(err){}\n        try { localStorage.setItem(WM_ONBOARDING_DISMISSED_KEY, '1'); } catch(err){}\n        overlay?.remove();\n        overlay = null;\n        document.documentElement.classList.remove('wm-unlock-overlay-mini');\n        setTimeout(() => wmPromptPlayOnFirstVisible(), 0);\n        WM_OVERLAY_UNLOCKING = false;\n        return;\n      }\n    \n      // This gesture IS consent for autoplay this session\n      WM_LISTENING_INTERACTION_STARTED = true;\n      WM_AUTOBOOT_ALLOWED = true;\n      WM_PENDING_AUTOBOOT = true;\n    \n      // Mark full onboarding as seen so future visits unlock from their first listening gesture.\n      try { sessionStorage.setItem(WM_OVERLAY_SEEN_KEY, '1'); } catch(err){}\n      try { localStorage.setItem(WM_ONBOARDING_DISMISSED_KEY, '1'); } catch(err){}\n    \n      // Unlock audio in this gesture\n      if (!WM_MEDIA_UNLOCKED) {\n        await wmUnlockAudioOnce(wmGetVisibleAudioSlideForUnlock(), { keepPlaying: true });\n      }\n    \n      // Remove overlay\n      overlay?.remove();\n      overlay = null;\n      document.documentElement.classList.remove('wm-unlock-overlay-mini');\n    \n      // If shuffle is still swapping, let shuffle finish then autoplay\n      if (wmIsShuffleMode() && WM_SHUFFLE_BOOTING) return;\n    \n      // Next frame so Swiper/layout is ready\n      requestAnimationFrame(() => {\n\t        if (WM_PENDING_AUTOBOOT) kickVisibleSlide();\n\t      });\n\t    }\n\n\t    function wmGetVisibleAudioSlideForUnlock() {\n\t      const productSlide = (typeof mostVisibleProductSlide === 'function') ? mostVisibleProductSlide() : null;\n\t      if (!productSlide) return null;\n\t      return (\n\t        (typeof wmGetActiveAudioSlideFromProduct === 'function' && wmGetActiveAudioSlideFromProduct(productSlide)) ||\n\t        productSlide.querySelector('.audio-player-slide')\n\t      );\n\t    }\n\n\t    async function wmStartListeningFromGesture({ autoplay = false, slide = null } = {}) {\n\t      if (WM_FOR_YOU_GRID_VIEW || overlay) return;\n\t      if (wmRequiresPlayButtonFirstStart()) return false;\n\t      WM_LISTENING_INTERACTION_STARTED = true;\n\t      WM_AUTOBOOT_ALLOWED = true;\n\t      if (autoplay) WM_PENDING_AUTOBOOT = true;\n\t      try { sessionStorage.setItem(WM_OVERLAY_SEEN_KEY, '1'); } catch(e){}\n\t      try { localStorage.setItem(WM_ONBOARDING_DISMISSED_KEY, '1'); } catch(e){}\n\t      const unlockSlide = slide || wmGetVisibleAudioSlideForUnlock();\n\t      if (!WM_MEDIA_UNLOCKED) {\n\t        await wmUnlockAudioOnce(unlockSlide, { keepPlaying: true });\n\t      }\n\t      if (autoplay) {\n\t        requestAnimationFrame(() => {\n\t          setTimeout(() => {\n\t            if (WM_PENDING_AUTOBOOT) kickVisibleSlide();\n\t          }, 80);\n\t        });\n\t      }\n\t      return true;\n\t    }\n\n\t    function wmIsFeedListeningGestureTarget(target) {\n\t      if (!target || target.closest?.('.play-pause-button, .progress-bar-wrapper, .progress-bar')) return false;\n\t      return !target.closest?.(\n\t        'a[href], button:not(.play-pause-button), input, select, textarea, ' +\n\t        '.wk-button, .add-to-cart, .view-product-button, .wm-special-cta, .wm-special-cta__btn'\n\t      );\n\t    }\n\n\t    function wmPrimeAudioUnlockForGesture(slide) {\n\t      if (wmRequiresPlayButtonFirstStart()) return;\n\t      if (WM_MEDIA_UNLOCKED || !slide) return;\n\t      if (WM_GESTURE_UNLOCK_PRIME) return;\n\t      const player = wmPreparePlayerSourceFromSlide(slide);\n\t      if (!player?.src) return;\n\t      try {\n\t        player.muted = true;\n        const playPromise = player.play();\n        WM_GESTURE_UNLOCK_PRIME = { slide, player, playPromise };\n        playPromise\n          .then(() => {})\n          .catch(() => {\n            if (WM_GESTURE_UNLOCK_PRIME?.player === player) {\n              WM_GESTURE_UNLOCK_PRIME = null;\n            }\n\t          });\n\t      } catch(e) {\n\t        WM_GESTURE_UNLOCK_PRIME = null;\n\t      }\n\t    }\n\n\t    function wmCancelGestureAudioPrime() {\n\t      const prime = WM_GESTURE_UNLOCK_PRIME;\n\t      WM_GESTURE_UNLOCK_PRIME = null;\n\t      if (!prime || WM_LISTENING_INTERACTION_STARTED) return;\n\t      try { prime.player.pause(); } catch(e) {}\n\t    }\n    \n    \n    \n    \n      const overlayDismissers = overlay\n        ? [\n            ...(overlay.matches?.('[data-wm-unlock-dismiss]') ? [overlay] : []),\n            ...Array.from(overlay.querySelectorAll('[data-wm-unlock-dismiss]'))\n          ]\n        : [];\n\n      if (overlayDismissers.length) {\n        overlayDismissers.forEach((button) => {\n          button.addEventListener('click', unlockAudioPlayback, { passive:false });\n          button.addEventListener('touchend', unlockAudioPlayback, { passive:false });\n        });\n      } else {\n        overlay?.addEventListener('click', unlockAudioPlayback, { passive:false });\n        overlay?.addEventListener('touchend', unlockAudioPlayback, { passive:false });\n      }\n\n      const overlayCarouselTrack = overlay?.querySelector('[data-wm-unlock-track]');\n      const overlayCarouselDots = overlay\n        ? Array.from(overlay.querySelectorAll('.wm-unlock-dots i'))\n        : [];\n\t      if (overlayCarouselTrack && overlayCarouselDots.length) {\n        const updateOverlayCarouselDots = () => {\n          const slideWidth = overlayCarouselTrack.clientWidth || 1;\n          const activeIndex = Math.max(0, Math.min(\n            overlayCarouselDots.length - 1,\n            Math.round(overlayCarouselTrack.scrollLeft / slideWidth)\n          ));\n          overlayCarouselDots.forEach((dot, index) => {\n            dot.classList.toggle('is-active', index === activeIndex);\n          });\n        };\n        overlayCarouselTrack.addEventListener('scroll', () => {\n          window.requestAnimationFrame(updateOverlayCarouselDots);\n        }, { passive:true });\n        let overlayDragActive = false;\n        let overlayDragStartX = 0;\n        let overlayDragScrollLeft = 0;\n\n        const getOverlayDragPoint = (event) => event.touches?.[0] || event.changedTouches?.[0] || event;\n        const snapOverlayCarousel = () => {\n          const slideWidth = overlayCarouselTrack.clientWidth || 1;\n          const index = Math.max(0, Math.min(\n            overlayCarouselDots.length - 1,\n            Math.round(overlayCarouselTrack.scrollLeft / slideWidth)\n          ));\n          overlayCarouselTrack.scrollTo({ left: index * slideWidth, behavior: 'smooth' });\n          updateOverlayCarouselDots();\n        };\n        const beginOverlayDrag = (event) => {\n          const point = getOverlayDragPoint(event);\n          if (!point) return;\n          overlayDragActive = true;\n          overlayDragStartX = point.clientX || 0;\n          overlayDragScrollLeft = overlayCarouselTrack.scrollLeft;\n        };\n        const moveOverlayDrag = (event) => {\n          if (!overlayDragActive) return;\n          const point = getOverlayDragPoint(event);\n          if (!point) return;\n          const dx = (point.clientX || 0) - overlayDragStartX;\n          if (Math.abs(dx) < 3) return;\n          overlayCarouselTrack.scrollLeft = overlayDragScrollLeft - dx;\n          event.preventDefault();\n        };\n        const endOverlayDrag = () => {\n          if (!overlayDragActive) return;\n          overlayDragActive = false;\n          snapOverlayCarousel();\n        };\n        overlayCarouselTrack.addEventListener('touchstart', beginOverlayDrag, { passive: true });\n        overlayCarouselTrack.addEventListener('touchmove', moveOverlayDrag, { passive: false });\n        overlayCarouselTrack.addEventListener('touchend', endOverlayDrag, { passive: true });\n        overlayCarouselTrack.addEventListener('pointerdown', beginOverlayDrag, { passive: true });\n        overlayCarouselTrack.addEventListener('pointermove', moveOverlayDrag, { passive: false });\n        overlayCarouselTrack.addEventListener('pointerup', endOverlayDrag, { passive: true });\n        overlayCarouselTrack.addEventListener('pointercancel', endOverlayDrag, { passive: true });\n\t        updateOverlayCarouselDots();\n\t      }\n\n\t      let wmGestureStartX = 0;\n\t      let wmGestureStartY = 0;\n\t      let wmGestureStartTime = 0;\n\t      let wmGestureStartTarget = null;\n\n\t      function wmRememberFeedGestureStart(event) {\n\t        if (overlay || WM_FOR_YOU_GRID_VIEW || WM_IS_APP) return;\n\t        const point = event.touches?.[0] || event;\n\t        if (!point) return;\n\t        wmMarkFeedNavIntent();\n\t        wmGestureStartX = point.clientX || 0;\n\t        wmGestureStartY = point.clientY || 0;\n\t        wmGestureStartTime = Date.now();\n\t        wmGestureStartTarget = event.target;\n\t        if (!WM_AUTOBOOT_ALLOWED && wmIsFeedListeningGestureTarget(wmGestureStartTarget)) {\n\t          wmPrimeAudioUnlockForGesture(wmGetVisibleAudioSlideForUnlock());\n\t        }\n\t      }\n\n\t      function wmHandleFeedGestureEnd(event) {\n\t        if (overlay || WM_FOR_YOU_GRID_VIEW || WM_IS_APP || WM_AUTOBOOT_ALLOWED) return;\n\t        if (!wmIsFeedListeningGestureTarget(wmGestureStartTarget || event.target)) {\n\t          wmCancelGestureAudioPrime();\n\t          return;\n\t        }\n\t        const point = event.changedTouches?.[0] || event;\n\t        if (!point) {\n\t          wmCancelGestureAudioPrime();\n\t          return;\n\t        }\n\t        const dx = (point.clientX || 0) - wmGestureStartX;\n\t        const dy = (point.clientY || 0) - wmGestureStartY;\n\t        const elapsed = Date.now() - wmGestureStartTime;\n\t        if (elapsed > 1200) {\n\t          wmCancelGestureAudioPrime();\n\t          return;\n\t        }\n\t        if (Math.max(Math.abs(dx), Math.abs(dy)) < 34) {\n\t          wmCancelGestureAudioPrime();\n\t          return;\n\t        }\n\t        wmStartListeningFromGesture({ autoplay: true, slide: wmGetVisibleAudioSlideForUnlock() });\n\t      }\n\n\t      function wmHandleFeedWheel(event) {\n\t        if (overlay || WM_FOR_YOU_GRID_VIEW || WM_IS_APP || WM_AUTOBOOT_ALLOWED) return;\n\t        if (!wmIsFeedListeningGestureTarget(event.target)) return;\n\t        const movement = Math.max(Math.abs(event.deltaX || 0), Math.abs(event.deltaY || 0));\n\t        if (movement < 8) return;\n\t        wmMarkFeedNavIntent();\n\t        wmStartListeningFromGesture({ autoplay: true, slide: wmGetVisibleAudioSlideForUnlock() });\n\t      }\n\n\t      container.addEventListener('touchstart', wmRememberFeedGestureStart, { passive: true });\n\t      container.addEventListener('touchend', wmHandleFeedGestureEnd, { passive: true });\n\t      container.addEventListener('pointerdown', wmRememberFeedGestureStart, { passive: true });\n\t      container.addEventListener('pointerup', wmHandleFeedGestureEnd, { passive: true });\n\t      container.addEventListener('wheel', wmHandleFeedWheel, { passive: true });\n\n\t      ['keydown'].forEach(ev=>{\n\t        window.addEventListener(ev, () => wmUnlockAudioOnce(wmGetVisibleAudioSlideForUnlock()), { once:true, capture:true, passive:true });\n\t      });\n    \n      let isLoading = false;\n      const slideObservers = new Map();\n\n    function wmShouldPinPlayPrompt(){\n      return !WM_IS_APP && !overlay && !WM_AUTOBOOT_ALLOWED && !WM_LISTENING_INTERACTION_STARTED;\n    }\n    \n    function wmScheduleControlsHideForSlide(slide){\n      const carousel = slide?.closest?.('.audio-player-carousel');\n      if (!carousel) return;\n\n      clearTimeout(carousel.hideControlsTimer);\n      if (wmShouldPinPlayPrompt()) {\n        return;\n      }\n\n      carousel.hideControlsTimer = setTimeout(() => {\n        carousel.classList.add('hide-controls');\n      }, 2000);\n    }\n\n    // WM: show controls with fade-in (no double toggle \u2192 no flicker)\n    function wmShowControlsForSlide(slide, options = {}){\n      const carousel = slide?.closest?.('.audio-player-carousel');\n      if (!carousel) return;\n      const autoHide = options.autoHide !== false;\n\n      clearTimeout(carousel.hideControlsTimer);\n\n      // Just reveal (CSS handles fade because we start hidden)\n      carousel.classList.remove('hide-controls');\n\n      if (autoHide) wmScheduleControlsHideForSlide(slide);\n    }\n    // WM: toggle controls visibility on tap (mobile friendly)\n    function wmToggleControlsForSlide(slide){\n      const carousel = slide?.closest?.('.audio-player-carousel');\n      if (!carousel) return;\n    \n      const isHidden = carousel.classList.contains('hide-controls');\n    \n      if (isHidden) {\n        wmShowControlsForSlide(slide);   // fade in using existing logic\n      } else {\n        if (wmShouldPinPlayPrompt()) return;\n        clearTimeout(carousel.hideControlsTimer);\n        carousel.classList.add('hide-controls'); // hide immediately\n      }\n    }\n    \n    \n    \n    \n    \n    \n    /* ================================\n       Title marquee: auto-run once per card when fully in view\n       - waits, scrolls to end, pauses, returns to start\n       - does NOT repeat unless user leaves card + comes back\n    ================================ */\n    \n    // 1) Mark which titles are actually truncated + set distance/duration CSS vars\n    function wmInitTitleMarquees(root = container) {\n      if (!root) return;\n      const titles = root.querySelectorAll('.wm-title-marquee');\n      titles.forEach(el => {\n        const inner = el.querySelector('.wm-title-marquee__inner');\n        if (!inner) return;\n    \n        // reset truncation flags + vars\n        el.classList.remove('wm-title--truncated', 'wm-title--play');\n        el.style.removeProperty('--wm-marquee-distance');\n        el.style.removeProperty('--wm-marquee-duration');\n    \n        // allow accurate measurement\n        const available = el.clientWidth;\n        const full = inner.scrollWidth;\n    \n        if (full > available + 12) {\n          el.classList.add('wm-title--truncated');\n    \n          const distance = (full - available) + 18; // include a little breathing room\n          el.style.setProperty('--wm-marquee-distance', String(distance)); // NO px\n    \n    \n          const seconds = Math.min(12, Math.max(6, distance / 40));\n          el.style.setProperty('--wm-marquee-duration', `${seconds}s`);\n        }\n    \n        // ensure fresh state\n        el.dataset.wmMarqueePlayed = '0';\n      });\n    }\n    \n    // 2) Run marquee sequence once (play -> pause -> return)\n    function wmRunMarqueeOnce(titleEl) {\n      if (!titleEl || titleEl.dataset.wmMarqueeRunning === '1') return;\n    \n      // Only if truncated\n      if (!titleEl.classList.contains('wm-title--truncated')) return;\n    \n      titleEl.dataset.wmMarqueeRunning = '1';\n      titleEl.dataset.wmMarqueePlayed = '1';\n    \n      // start animation (forward scroll)\n      titleEl.classList.remove('wm-title--play');\n      void titleEl.offsetWidth; // restart\n      titleEl.classList.add('wm-title--play');\n    \n      // read duration from CSS var\n      const durRaw = getComputedStyle(titleEl).getPropertyValue('--wm-marquee-duration').trim();\n      const dur = parseFloat(durRaw) || 8;\n    \n      // after it reaches the end, pause, then return to start\n      clearTimeout(titleEl._wmMarqueeEndTimer);\n      clearTimeout(titleEl._wmMarqueeReturnTimer);\n    \n      titleEl._wmMarqueeEndTimer = setTimeout(() => {\n        // pause at end\n        titleEl.classList.add('wm-title--at-end');\n    \n        // return to start (remove play + at-end so it snaps/truncates again)\n        titleEl._wmMarqueeReturnTimer = setTimeout(() => {\n          titleEl.classList.remove('wm-title--play');\n          titleEl.classList.remove('wm-title--at-end');\n          titleEl.dataset.wmMarqueeRunning = '0';\n        }, 900); // pause time at end\n      }, dur * 1000);\n    }\n    \n    function wmSetupAutoTitleMarquee() {\n      if (!container) return;\n      if (container._wmTitleMarqueeObserver) return;\n    \n      const isDesktop = window.matchMedia('(min-width: 1024px)').matches;\n      const threshold = isDesktop ? 0.60 : 0.85;\n    \n      // helper: run one marquee and return how long it will take (ms)\n      function runOne(el){\n        if (!el) return 0;\n        if (!el.classList.contains('wm-title--truncated')) return 0;\n        if (el.dataset.wmMarqueeRunning === '1') return 0;\n    \n        // mark it as played for this in-view session\n        el.dataset.wmMarqueeRunning = '1';\n        el.dataset.wmMarqueePlayed  = '1';\n    \n        el.classList.remove('wm-title--play', 'wm-title--at-end');\n        void el.offsetWidth; // restart\n        el.classList.add('wm-title--play');\n    \n        const durRaw = getComputedStyle(el).getPropertyValue('--wm-marquee-duration').trim();\n        const durSec = parseFloat(durRaw) || 8;\n    \n        // pause at end a bit, then reset\n        clearTimeout(el._wmMarqueeEndTimer);\n        clearTimeout(el._wmMarqueeReturnTimer);\n    \n        el._wmMarqueeEndTimer = setTimeout(() => {\n          el.classList.add('wm-title--at-end');\n    \n          el._wmMarqueeReturnTimer = setTimeout(() => {\n            el.classList.remove('wm-title--play', 'wm-title--at-end');\n            el.dataset.wmMarqueeRunning = '0';\n          }, 900);\n        }, durSec * 1000);\n    \n        // total time = duration + end pause\n        return (durSec * 1000) + 900;\n      }\n    \n      async function runSequence(card){\n        if (!card) return;\n    \n        // grab BOTH marquees explicitly\n        const artistEl = card.querySelector('.wm-artist-line.wm-title-marquee');\n        const titleEl = card.querySelector('.wm-release-title.wm-title-marquee');\n    \n        // don\u2019t rerun if we already ran while this card stayed in view\n        const key = 'wmMarqueeSeqPlayed';\n        if (card.dataset[key] === '1') return;\n        card.dataset[key] = '1';\n    \n        // artist first\n        const t1 = runOne(artistEl);\n    \n        // then title after artist finishes (+ a small gap so it feels intentional)\n        const gap = 250;\n        setTimeout(() => { runOne(titleEl); }, Math.max(0, t1) + gap);\n      }\n    \n      const io = new IntersectionObserver((entries) => {\n        entries.forEach(entry => {\n          const card = entry.target;\n    \n          if (entry.isIntersecting) {\n            // delay before starting the sequence\n            clearTimeout(card._wmMarqueeStartTimer);\n            card._wmMarqueeStartTimer = setTimeout(() => {\n              runSequence(card);\n            }, 900);\n          } else {\n            // leaving view: allow it to run again next time\n            clearTimeout(card._wmMarqueeStartTimer);\n            card.dataset.wmMarqueeSeqPlayed = '0';\n    \n            // reset both marquees cleanly\n            card.querySelectorAll('.wm-title-marquee').forEach(el => {\n              clearTimeout(el._wmMarqueeEndTimer);\n              clearTimeout(el._wmMarqueeReturnTimer);\n              el.classList.remove('wm-title--play', 'wm-title--at-end');\n              el.dataset.wmMarqueePlayed = '0';\n              el.dataset.wmMarqueeRunning = '0';\n            });\n          }\n        });\n      }, { root: container, threshold });\n    \n      container.querySelectorAll('.product-slide').forEach(card => io.observe(card));\n      container._wmTitleMarqueeObserver = io;\n    }\n    \n    \n    // 4) When you lazy-load more slides, observe them too\n    function wmObserveNewMarqueeCards(newSlides) {\n      if (!container?._wmTitleMarqueeObserver) return;\n      newSlides.forEach(slide => container._wmTitleMarqueeObserver.observe(slide));\n    }\n    /* ================================\n       Run title marquee ONCE (play \u2192 pause \u2192 reset)\n    ================================ */\n    function wmRunTitleMarqueeOnce(titleEl){\n      if (!titleEl) return;\n    \n      // Only if truncated\n      if (!titleEl.classList.contains('wm-title--truncated')) return;\n    \n      // Prevent repeat while card stays in view\n      if (titleEl.dataset.wmMarqueeRan === '1') return;\n      titleEl.dataset.wmMarqueeRan = '1';\n    \n      const inner = titleEl.querySelector('.wm-title-marquee__inner');\n      if (!inner) return;\n    \n      // Lock width during animation (prevents jitter)\n      inner.style.width = `${inner.scrollWidth}px`;\n    \n      // Start after a short delay so it feels intentional\n      const startDelay = 450;\n    \n      setTimeout(() => {\n        // Play marquee\n        titleEl.classList.add('wm-title--play');\n    \n        // Read duration from CSS variable\n        const durRaw = getComputedStyle(titleEl)\n          .getPropertyValue('--wm-marquee-duration')\n          .trim();\n        const durationMs = (parseFloat(durRaw) || 8) * 1000;\n    \n        const pauseAtEndMs = 650;\n    \n        // After reaching end \u2192 pause \u2192 reset cleanly\n        setTimeout(() => {\n          titleEl.classList.remove('wm-title--play');\n    \n          // Hard reset transform without animation\n          inner.style.animation = 'none';\n          inner.style.transform = 'translate3d(0,0,0)';\n          void inner.offsetHeight; // force reflow\n          inner.style.animation = '';\n    \n          // Unlock width\n          inner.style.width = '';\n        }, durationMs + pauseAtEndMs);\n    \n      }, startDelay);\n    }\n    \n    // 5) Recalc on resize\n    let wmTitleResizeTimer;\n    window.addEventListener('resize', () => {\n      clearTimeout(wmTitleResizeTimer);\n      wmTitleResizeTimer = setTimeout(() => wmInitTitleMarquees(container), 150);\n    }, { passive: true });\n    \n    \n      function initializeAudioControlsForSlide(slide) {\n        if (slideObservers.has(slide)) {\n          const { observer, cleanup } = slideObservers.get(slide);\n          observer.disconnect(); cleanup(); slideObservers.delete(slide);\n        }\n    \n        const button = slide.querySelector('.play-pause-button');\n        const filled = slide.querySelector('.progress-filled');\n        const dot = slide.querySelector('.progress-dot');\n        const bar = slide.querySelector('.progress-bar');\n        const barWrapper = slide.querySelector('.progress-bar-wrapper');\n        const cover = slide.querySelector('.clickable-cover');\n\n        setButtonToPlay(button);\n    \n        async function playAudio() {\n      wmAudioDebugEvent('manual-play-ui-start', {\n        slideHandle: slide.closest?.('.product-slide')?.dataset?.productHandle || '',\n        hiddenControls: !!slide.closest?.('.audio-player-carousel')?.classList?.contains('hide-controls')\n      });\n      wmSetProductButtonStarting(slide);\n    \n      wmSafePlaySlide(slide, { unmute: true, reason: 'manual' }).then((started) => {\n        wmAudioDebugEvent('manual-play-ui-result', { started });\n        // If play didn't actually start, revert icon\n        if (!started) {\n          setButtonToPlay(button);\n        } else {\n          WM_LISTENING_INTERACTION_STARTED = true;\n          WM_AUTOBOOT_ALLOWED = true;\n          try { sessionStorage.setItem(WM_OVERLAY_SEEN_KEY, '1'); } catch(e){}\n          try { localStorage.setItem(WM_ONBOARDING_DISMISSED_KEY, '1'); } catch(e){}\n          window.dispatchEvent(new Event('audioUnlocked'));\n          WM_PENDING_AUTOBOOT = false; // \u2705 success\n        }\n      });\n    }\n    \n    function pauseAudio() {\n      wmPauseSlide(slide, { reason: 'manual' });\n      setButtonToPlay(button);\n    }\n    \n    \n        function resetFade() { wmShowControlsForSlide(slide); }\n        // WM: tap-to-toggle controls (iOS-safe). Uses pointer events + movement threshold.\n    let wmTapStartX = 0;\n    let wmTapStartY = 0;\n    let wmTapMoved = false;\n    \n    function wmIsRealControlTarget(t){\n      return !!t.closest(\n        '.play-pause-button,' +\n        '.progress-bar-wrapper,' +\n        '.progress-bar,' +\n        '.swiper-button-next,' +\n        '.swiper-button-prev,' +\n        '.swiper-pagination'\n      );\n    }\n    \n    function wmOnPointerDownForToggle(e){\n      // only primary touch/pointer\n      if (e.isPrimary === false) return;\n    \n      wmTapMoved = false;\n      wmTapStartX = e.clientX || 0;\n      wmTapStartY = e.clientY || 0;\n    }\n    \n    function wmOnPointerMoveForToggle(e){\n      if (e.isPrimary === false) return;\n      const dx = Math.abs((e.clientX || 0) - wmTapStartX);\n      const dy = Math.abs((e.clientY || 0) - wmTapStartY);\n      if (dx > 8 || dy > 8) wmTapMoved = true; // movement threshold = not a tap\n    }\n    \n    function wmOnPointerUpForToggle(e){\n      if (e.isPrimary === false) return;\n    \n      // If user interacted with real controls (play/pause, scrub, arrows), don't toggle overlay\n      if (wmIsRealControlTarget(e.target)) return;\n    \n      // If finger moved, it's a scroll/drag, not a tap\n      if (wmTapMoved) return;\n    \n      wmToggleControlsForSlide(slide);\n    }\n    \n    \n    \n    let wmLastTouchToggleAt = 0;\n    const clickHandler = async (e) => {\n      wmAudioDebugEvent('play-button-event', {\n        type: e.type,\n        duplicateClickWindow: e.type === 'click' ? Date.now() - wmLastTouchToggleAt : null\n      });\n      if (e.type === 'click' && Date.now() - wmLastTouchToggleAt < 700) {\n        e.preventDefault();\n        e.stopPropagation();\n        return;\n      }\n      if (e.type === 'touchend') {\n        wmLastTouchToggleAt = Date.now();\n      }\n\n      e.preventDefault();\n      e.stopPropagation();\n    \n      // \u2705 NEW: if controls are hidden, first tap ONLY reveals controls (no play/pause)\n      const carousel = slide?.closest?.('.audio-player-carousel');\n      if (carousel && carousel.classList.contains('hide-controls')) {\n        wmShowControlsForSlide(slide);\n        return;\n      }\n    \n      if (carousel) {\n        clearTimeout(carousel.hideControlsTimer);\n      }\n\n      (WM_OWNER.slide !== slide || WM_PLAYER?.paused) ? playAudio() : pauseAudio();\n    };\n    \n    \n    if (slide.__wmBound) return;\n    slide.__wmBound = true;\n    \n    \n    button?.addEventListener('click', clickHandler);\n    button?.addEventListener('touchend', clickHandler);\n    \n    \n        // ---- Scrub with pointer events; lock Swiper while scrubbing ----\n    (function initScrub(){\n      if (!barWrapper || !bar) return;\n    \n      const carousel = slide.closest('.audio-player-carousel');\n      const swiper = carousel?.swiperInstance;\n      let scrubbing = false;\n      let hadCapture = false;\n    \n      // Convert clientX to percent on the bar\n      function posToPercent(clientX) {\n        const rect = bar.getBoundingClientRect();\n        const percent = Math.min(Math.max((clientX - rect.left) / rect.width, 0), 1);\n        return percent;\n      }\n    \n      // Ensure the singleton player is wired to THIS slide (without forcing play)\n      async function ensurePlayerForThisSlide() {\n        // If this slide doesn't own the player, load its source but don't autoplay.\n        if (WM_OWNER.slide !== slide) {\n          const player = wmCreateSingletonPlayer();\n          const srcHolder = slide.querySelector('.slide-audio');\n          if (!srcHolder) return player;\n    \n          const nextSrc = (srcHolder.dataset && srcHolder.dataset.src) ? srcHolder.dataset.src : srcHolder.src;\n          if (nextSrc && player.src !== nextSrc) {\n            try { player.pause(); } catch {}\n            player.src = nextSrc;\n            player.preload = 'auto';\n            await wmWhenCanPlay(player);\n          }\n          WM_OWNER.slide = slide;\n          // Update button state to \"pause\" only if player is actually playing later.\n          // No auto-play on scrub begin; we just prep the source so duration is known.\n        }\n        return WM_PLAYER || wmCreateSingletonPlayer();\n      }\n    \n      function setSwiperLocked(locked) {\n        if (swiper) swiper.allowTouchMove = !locked;\n      }\n    \n      async function onPointerDown(e) {\n        // Only react to primary pointer\n        if (e.pointerType && e.isPrimary === false) return;\n    \n        scrubbing = true;\n        setSwiperLocked(true);\n    \n        // Capture pointer so moves stay on this element\n        try { barWrapper.setPointerCapture(e.pointerId); hadCapture = true; } catch {}\n    \n        e.preventDefault();\n        e.stopPropagation();\n    \n        // Prepare player for this slide (so we can seek even if it wasn't the owner)\n        const player = await ensurePlayerForThisSlide();\n    \n        // Initial seek\n        const percent = posToPercent(e.clientX);\n        if (player?.duration) {\n          player.currentTime = percent * player.duration;\n        }\n    \n        // Update UI immediately\n        if (filled) filled.style.width = `${percent * 100}%`;\n        if (dot) dot.style.left = `${percent * 100}%`;\n      }\n    \n      function onPointerMove(e) {\n        if (!scrubbing) return;\n        e.preventDefault();\n        e.stopPropagation();\n    \n        const player = WM_PLAYER;\n        const percent = posToPercent(e.clientX);\n    \n        if (player?.duration) {\n          player.currentTime = percent * player.duration;\n        }\n        if (filled) filled.style.width = `${percent * 100}%`;\n        if (dot) dot.style.left = `${percent * 100}%`;\n      }\n    \n      function onPointerUp(e) {\n        if (!scrubbing) return;\n        scrubbing = false;\n    \n        if (hadCapture) {\n          try { barWrapper.releasePointerCapture(e.pointerId); } catch {}\n          hadCapture = false;\n        }\n    \n        // Re-enable Swiper after a tick so inertia on the scrub doesn't trigger a slide\n        setTimeout(() => setSwiperLocked(false), 30);\n    \n        e.preventDefault();\n        e.stopPropagation();\n    \n        // Optional: if the player was paused before scrubbing, keep it paused.\n        // If you prefer scrub-to-play, you can start playback here:\n        // if (WM_PLAYER?.paused) wmSafePlaySlide(slide, { unmute: true });\n      }\n    \n      barWrapper.addEventListener('pointerdown', onPointerDown);\n      window.addEventListener('pointermove', onPointerMove, { passive: false });\n      window.addEventListener('pointerup', onPointerUp, { passive: false });\n      window.addEventListener('pointercancel', onPointerUp, { passive: false });\n    \n      // Fallback for browsers without Pointer Events (very old Safari):\n      // Use touchstart/move/end to do the same thing.\n      function touchClientX(t) { return (t && (t.clientX || t.pageX)) || 0; }\n    \n      function onTouchStart(ev){\n        if (scrubbing) return;\n        scrubbing = true;\n        setSwiperLocked(true);\n        ev.preventDefault(); ev.stopPropagation();\n        ensurePlayerForThisSlide().then(player => {\n          const percent = posToPercent(touchClientX(ev.touches[0]));\n          if (player?.duration) player.currentTime = percent * player.duration;\n          if (filled) filled.style.width = `${percent * 100}%`;\n          if (dot) dot.style.left = `${percent * 100}%`;\n        });\n      }\n      function onTouchMove(ev){\n        if (!scrubbing) return;\n        ev.preventDefault(); ev.stopPropagation();\n        const player = WM_PLAYER;\n        const percent = posToPercent(touchClientX(ev.touches[0]));\n        if (player?.duration) player.currentTime = percent * player.duration;\n        if (filled) filled.style.width = `${percent * 100}%`;\n        if (dot) dot.style.left = `${percent * 100}%`;\n      }\n      function onTouchEnd(ev){\n        if (!scrubbing) return;\n        scrubbing = false;\n        setTimeout(() => setSwiperLocked(false), 30);\n        ev.preventDefault(); ev.stopPropagation();\n      }\n    \n      // Attach only if Pointer Events aren\u2019t supported\n      if (!('PointerEvent' in window)) {\n        barWrapper.addEventListener('touchstart', onTouchStart, { passive: false });\n        window.addEventListener('touchmove', onTouchMove, { passive: false });\n        window.addEventListener('touchend', onTouchEnd, { passive: false });\n        window.addEventListener('touchcancel', onTouchEnd, { passive: false });\n      }\n    })();\n    \n    \n      const manualResetFade = () => {\n      WM_MANUAL_INTERACTION = true;\n      resetFade();\n      setTimeout(() => { WM_MANUAL_INTERACTION = false; }, 0);\n    };\n    \n    // Tap = toggle controls\n    const toggleControls = () => {\n      wmToggleControlsForSlide(slide);\n    };\n    \n    // Movement = just show controls (existing behaviour)\n    const showControls = () => {\n      resetFade();\n    };\n    \n    // Desktop hover/move: show controls (unchanged)\n    slide.addEventListener('mousemove', resetFade);\n    \n    // Mobile + desktop tap: toggle controls (capture = reliable even when overlay children are clicked)\n    slide.addEventListener('pointerdown', wmOnPointerDownForToggle, { capture: true, passive: true });\n    slide.addEventListener('pointermove', wmOnPointerMoveForToggle, { capture: true, passive: true });\n    slide.addEventListener('pointerup', wmOnPointerUpForToggle, { capture: true, passive: true });\n    \n    // Fallback for very old Safari (no PointerEvent) \u2014 keep behaviour reasonable\n    if (!('PointerEvent' in window)) {\n      cover?.addEventListener('click', () => wmToggleControlsForSlide(slide));\n      cover?.addEventListener('touchend', () => wmToggleControlsForSlide(slide), { passive: true });\n    }\n    \n    \n    \n    \n        \n      }\n    \n      function initializeAudioControlsForProduct(productSlide) {\n        const carousel = productSlide.querySelector('.audio-player-carousel');\n        if (!carousel) return;\n    \n        const slides = carousel.querySelectorAll('.audio-player-slide');\n        slides.forEach(slide => initializeAudioControlsForSlide(slide));\n    \n        // --- Swiper awareness: ensure active track owns the player after a horizontal swipe\n        if (!carousel.swiperInstance) return;\n        const swiper = carousel.swiperInstance;\n        const getSlideEl = (idx) => swiper.slides[idx]?.querySelector('.audio-player-slide') || swiper.slides[idx];\n    \n        // initial prefetch neighbors\n        wmPrefetchSlideNeighbors(carousel, swiper.activeIndex);\n    \n        swiper.on('slideChangeTransitionStart', () => {\n          const current = WM_OWNER.slide;\n          const activeSlide = getSlideEl(swiper.activeIndex) || carousel.querySelector('.swiper-slide-active.audio-player-slide') || carousel.querySelector('.swiper-slide-active');\n          if (current && current === activeSlide && WM_PLAYER && !WM_PLAYER.paused) return;\n          // Pause only if the current owner is inside this carousel\n          if (current && current.closest('.audio-player-carousel') === carousel) wmPauseSlide(current, { reason: 'track-change' });\n        });\n    \n    swiper.on('slideChangeTransitionEnd', async () => {\n      const activeIdx = swiper.activeIndex;\n      const activeSlide = getSlideEl(activeIdx) || carousel.querySelector('.swiper-slide-active.audio-player-slide') || carousel.querySelector('.swiper-slide-active');\n     if (!activeSlide) return;\n\n    if (WM_OWNER.slide === activeSlide && WM_PLAYER && !WM_PLAYER.paused) {\n      wmPrefetchSlideNeighbors(carousel, activeIdx);\n      return;\n    }\n    \n    wmShowControlsForSlide(activeSlide, { autoHide: false });\n\n    const buttons = carousel.querySelectorAll('.play-pause-button');\n    buttons.forEach(btn => setButtonToPlay(btn));\n    const activeBtn = activeSlide.querySelector('.play-pause-button');\n\n    if (!WM_AUTOBOOT_ALLOWED && !overlay && WM_GESTURE_UNLOCK_PRIME) {\n      await wmStartListeningFromGesture({ autoplay: false, slide: activeSlide });\n    }\n\n    if (!WM_AUTOBOOT_ALLOWED) {\n      setButtonToPlay(activeBtn);\n      return;\n    }\n\n    if (!WM_MEDIA_UNLOCKED) {\n      setButtonToPlay(activeBtn);\n      return;\n    }\n\n    setButtonToStarting(activeBtn);\n\n    const started = await wmSafePlaySlide(activeSlide, { unmute: true, reason: 'track-change' });\n\n    if (!started) {\n      setButtonToPlay(activeBtn);\n    } else {\n      wmScheduleControlsHideForSlide(activeSlide);\n    }\n    \n    \n          // prefetch neighbours to avoid stalls\n          wmPrefetchSlideNeighbors(carousel, activeIdx);\n        });\n      }\n    \n      function initializeAudioControls() {\n        const productSlides = container.querySelectorAll('.product-slide');\n        productSlides.forEach(slide => initializeAudioControlsForProduct(slide));\n      }\n    \n      function initializeSwiperForSlides(slides) {\n      slides.forEach(productSlide => {\n        const carousel = productSlide.querySelector('.audio-player-carousel');\n        if (!carousel || carousel.swiperInstance) return;\n    \n        // Count slides robustly (works whether your snippet wraps with .swiper-slide or not)\n        const slideCount =\n          carousel.querySelectorAll('.swiper-wrapper > .swiper-slide').length ||\n          carousel.querySelectorAll('.audio-player-slide').length ||\n          0;\n    \n        const single = slideCount <= 1;\n        if (single) carousel.classList.add('single-track');\n    \n        const swiper = new Swiper(carousel, {\n          loop: false,\n          slidesPerView: 1,\n          spaceBetween: 0,\n    roundLengths: true,\n    \n          allowTouchMove: !single,   // no swiping when only one\n          // only wire nav/pagination when there\u2019s more than one\n          navigation: single ? {} : {\n            nextEl: carousel.querySelector('.swiper-button-next'),\n            prevEl: carousel.querySelector('.swiper-button-prev'),\n          },\n          pagination: single ? false : {\n            el: carousel.querySelector('.swiper-pagination'),\n            clickable: true\n          }\n        });\n    \n        carousel.swiperInstance = swiper;\n        requestAnimationFrame(() => swiper.update());\n\n        const getNavSlideEl = (idx) => swiper.slides[idx]?.querySelector('.audio-player-slide') || swiper.slides[idx];\n        const primeTrackNavUnlock = () => {\n          if (overlay || WM_FOR_YOU_GRID_VIEW || WM_IS_APP || WM_AUTOBOOT_ALLOWED) return;\n          const activeSlide = getNavSlideEl(swiper.activeIndex) || carousel.querySelector('.swiper-slide-active.audio-player-slide') || carousel.querySelector('.swiper-slide-active');\n          wmPrimeAudioUnlockForGesture(activeSlide);\n        };\n\n        const handleTrackNavClick = async (event, direction) => {\n          if (overlay || WM_FOR_YOU_GRID_VIEW || WM_IS_APP || WM_AUTOBOOT_ALLOWED) return;\n          event.preventDefault();\n          event.stopImmediatePropagation();\n\n          const maxIndex = Math.max(0, swiper.slides.length - 1);\n          const targetIndex = direction === 'next'\n            ? Math.min(maxIndex, swiper.activeIndex + 1)\n            : Math.max(0, swiper.activeIndex - 1);\n          const targetSlide = getNavSlideEl(targetIndex);\n          if (!targetSlide) return;\n\n          await wmStartListeningFromGesture({ autoplay: false, slide: targetSlide });\n          swiper.slideTo(targetIndex);\n\n          wmShowControlsForSlide(targetSlide, { autoHide: false });\n          carousel.querySelectorAll('.play-pause-button').forEach(btn => setButtonToPlay(btn));\n          const activeBtn = targetSlide.querySelector('.play-pause-button');\n          setButtonToStarting(activeBtn);\n\n          const started = await wmSafePlaySlide(targetSlide, { unmute: true, reason: 'track-nav' });\n\n          if (!started) {\n            setButtonToPlay(activeBtn);\n          } else {\n            wmScheduleControlsHideForSlide(targetSlide);\n          }\n        };\n\n        [\n          { button: carousel.querySelector('.swiper-button-next'), direction: 'next' },\n          { button: carousel.querySelector('.swiper-button-prev'), direction: 'prev' }\n        ].filter(item => item.button).forEach(({ button, direction }) => {\n          button.addEventListener('pointerdown', primeTrackNavUnlock, { passive: true });\n          button.addEventListener('mousedown', primeTrackNavUnlock, { passive: true });\n          button.addEventListener('touchstart', primeTrackNavUnlock, { passive: true });\n          button.addEventListener('click', event => handleTrackNavClick(event, direction), { capture: true, passive: false });\n        });\n    \n    \n    \n        // WM: returning users should see the first play prompt until they actually start listening.\n        // In the app, keep controls visible through autoplay boot; hide only after playback starts.\n        if (wmShouldPinPlayPrompt() || (WM_IS_APP && WM_AUTOBOOT_ALLOWED && !WM_FOR_YOU_GRID_VIEW)) {\n          carousel.classList.remove('hide-controls');\n        } else {\n          carousel.classList.add('hide-controls');\n        }\n      });\n    }\n    \n    \n    \n      // AJAX Add to Cart (unchanged)\n      document.addEventListener('submit', function(e) {\n        if (e.target.matches('.ajax-cart-form')) {\n          e.preventDefault();\n          const form = e.target;\n  const button = form.querySelector('.add-to-cart');\n  if (button && button.disabled) return;\n  \n  const formData = new FormData(form);\n          const cartText = button?.querySelector('.cart-text');\n          const loadingText = button?.querySelector('.cart-loading');\n          if (cartText && loadingText) { cartText.style.display = 'none'; loadingText.style.display = 'inline'; }\n    \n          fetch('/cart/add.js', { method: 'POST', headers: { 'Accept': 'application/json' }, body: formData })\n            .then(res => { if (!res.ok) throw new Error(`HTTP error! Status: ${res.status}`); return res.json(); })\n            .then(() => {\n              if (cartText && loadingText) { cartText.textContent = 'Added'; loadingText.style.display = 'none'; cartText.style.display = 'inline'; }\n              if (window.WM_FEED_SOURCE === 'wishlist') {\n                const productSlide = form.closest('.product-slide[data-product-handle]');\n                document.dispatchEvent(new CustomEvent('wm:wishlist-item-added-to-cart', {\n                  detail: {\n                    handle: productSlide?.dataset?.productHandle || '',\n                    productSlide\n                  }\n                }));\n              }\n              const carousel = form.closest('.audio-player-carousel');\n              if (carousel) {\n                carousel.querySelectorAll('.add-to-cart').forEach(btn => {\n                  const txt = btn.querySelector('.cart-text');\n                  const load = btn.querySelector('.cart-loading');\n                  if (txt) txt.textContent = 'Added';\n                  if (load) load.style.display = 'none';\n                  if (txt) txt.style.display = 'inline';\n                });\n              }\n              fetch('/cart.js').then(res => res.json()).then(cart => {\n                const count = cart.item_count;\n                const cartIcon = document.querySelector('#CartButton [x-text=\"$store.cart_count.count\"]');\n                if (cartIcon) {\n                  cartIcon.textContent = count;\n                  cartIcon.style.display = count > 0 ? 'flex' : 'none';\n                  cartIcon.classList.add('cart-updated');\n                  setTimeout(() => cartIcon.classList.remove('cart-updated'), 800);\n                }\n              });\n            })\n            .catch(err => {\n              if (cartText && loadingText) { cartText.textContent = 'Error'; loadingText.style.display = 'none'; cartText.style.display = 'inline'; }\n              console.error('Error adding to cart:', err);\n            });\n        }\n      });\n\n      document.addEventListener('click', function(e) {\n        const notifyButton = e.target.closest('.wm-notify-me-button');\n        if (!notifyButton) return;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        wmHandleNotifyMeClick(notifyButton);\n      }, true);\n\n      document.addEventListener('click', function(e) {\n        const wishlistButton = e.target.closest('#verticalSwipeContainer .wk-button');\n        if (!wishlistButton) return;\n\n        const wasActive = wmWishlistButtonIsActive(wishlistButton);\n        if (!wmCustomerIsLoggedIn() && !wasActive) {\n          e.preventDefault();\n          e.stopPropagation();\n          e.stopImmediatePropagation();\n\n          wmSavePendingWishlistAdd(wishlistButton);\n          wmPromptWishlistLoginIfNeeded({\n            title: 'Save your wishlist',\n            body: 'Sign in or create an account to save your wishlist and access it whenever you come back.'\n          });\n          return;\n        }\n\n        wmScheduleWishlistCounterRefresh();\n      }, true);\n    \n      // Mobile add-to-cart touch handler\n      document.addEventListener('touchend', function(e) {\n    const btn = e.target.closest('.add-to-cart');\n    if (!btn || btn.disabled) return;\n  \n    const form = btn.closest('.ajax-cart-form');\n    if (form) {\n      e.stopPropagation();\n      form.dispatchEvent(new Event('submit', { cancelable: true }));\n    }\n  }, { passive: true });\n    \n      // Pause when tab hidden (mobile)\n      document.addEventListener('visibilitychange', function () {\n        if (window.innerWidth <= 767 && document.hidden) {\n          if (WM_PLAYER && !WM_PLAYER.paused) {\n            try { WM_AUDIO_REQUEST_ID += 1; WM_PLAYER.pause(); } catch {}\n            if (WM_OWNER.slide) {\n              const btn = WM_OWNER.slide.querySelector('.play-pause-button');\n              setButtonToPlay(btn);\n            }\n          }\n        }\n      });\n    \n      async function loadNextPageNormal() {\n      if (isLoading) return;\n    \n      if (currentPage >= totalPages) {\n        if (endMessage) endMessage.style.display = 'block';\n        return;\n      }\n    \n    \n      isLoading = true;\n      loadingIndicator.style.display = 'block';\n    \n      const nextPage = currentPage + 1;\n    \n      // Preserve current filters (artist, label, sort_by, etc.)\n      const params = new URLSearchParams(window.location.search);\n      params.set('page', nextPage);\n      params.set('view', 'ajax');\n    \n      // If no sort_by in current URL, fall back to current sort\n      if (!params.has('sort_by') && sortBy) params.set('sort_by', sortBy);\n    \n      const url = `${window.location.pathname}?${params.toString()}`;\n    \n      try {\n        const response = await fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } });\n        if (!response.ok) throw new Error('Failed to load next page');\n    \n        const html = await response.text();\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = html;\n    \n        const newSlides = tempDiv.querySelectorAll('.product-slide');\n    newSlides.forEach(slide => {\n      container.appendChild(slide);\n      wmApplyWishlistStockState(slide);\n      if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide);\n    });\n    \n        // Title marquee for newly appended products\n        wmInitTitleMarquees(container);\n        wmObserveNewMarqueeCards(Array.from(newSlides));\n    \n        currentPage = nextPage;\n        container.dataset.currentPage = currentPage;\n    \n        initializeSwiperForSlides(Array.from(newSlides));\n        newSlides.forEach(slide => initializeAudioControlsForProduct(slide));\n        wmMaybeInsertSpecialCards(container);\n    \n    \n        // enhance appended covers + JIT audio to new slides\n        Array.from(newSlides).forEach((ps, idx) => {\n          const cover = ps.querySelector('.audio-cover');\n          wmEnhanceCoverImage(cover, idx);\n        });\n        wmHydrateSlidesNearViewport(container);\n        wmScheduleDormantTrim();\n        wmScheduleDormantRefresh();\n        \n        wmSafariLazyImageFix(container);\n    \n    \n        if (endMessage) endMessage.style.display = currentPage >= totalPages ? 'block' : 'none';\n      } catch (error) {\n        console.error('Error loading more products:', error);\n      } finally {\n        isLoading = false;\n        loadingIndicator.style.display = 'none';\n      }\n    }\n    async function wmRestoreReturnPositionIfNeeded() {\n      if (!WM_PENDING_RETURN || !container) {\n        await wmCompletePendingWishlistAdd();\n        return;\n      }\n    \n      WM_RETURN_RESTORE_ACTIVE = true;\n      try {\n        const saved = WM_PENDING_RETURN;\n        WM_PENDING_RETURN = null;\n        const activeSort = (() => {\n          try {\n            const params = new URLSearchParams(window.location.search);\n            return params.get('sort_by') || container?.dataset?.sortBy || 'created-descending';\n          } catch (e) {\n            return container?.dataset?.sortBy || 'created-descending';\n          }\n        })();\n        const isNewestReturn = activeSort === 'created-descending';\n\n        console.log('[WM RETURN] start', {\n          href: window.location.href,\n          activeSort,\n          isNewestReturn,\n          saved,\n          existingSlides: container.querySelectorAll('.product-slide[data-product-handle]').length,\n          existingScrollTop: container.scrollTop\n        });\n\n        await wmWaitForCollectionIndex();\n\n        const buildReturnActiveCollectionIndex = () => {\n          const full = Array.isArray(window.WM_COLLECTION_INDEX) ? window.WM_COLLECTION_INDEX : [];\n\n          let showPreorders = true;\n          try {\n            const savedPreorderSetting = localStorage.getItem('wm_show_preorders');\n            if (savedPreorderSetting === '0') showPreorders = false;\n          } catch (e) {}\n\n          const availablePool = window.WM_FEED_SOURCE === 'wishlist'\n            ? full.slice()\n            : full.filter((item) => !wmIsUnavailableIndexItem(item));\n\n          const filtered = showPreorders\n            ? availablePool.slice()\n            : availablePool.filter((item) => !wmIsPreorderIndexItem(item));\n\n          const parseIndexDate = (value) => {\n            if (!value) return 0;\n            if (typeof value === 'string' || value instanceof String) {\n              const parsed = new Date(value).getTime();\n              return Number.isFinite(parsed) ? parsed : 0;\n            }\n            if (Array.isArray(value) && value.length >= 6) {\n              const seconds = Number(value[0]) || 0;\n              const minutes = Number(value[1]) || 0;\n              const hours = Number(value[2]) || 0;\n              const day = Number(value[3]) || 1;\n              const month = (Number(value[4]) || 1) - 1;\n              const year = Number(value[5]) || 1970;\n              return Date.UTC(year, month, day, hours, minutes, seconds);\n            }\n            if (typeof value === 'number') {\n              return Number.isFinite(value) ? value : 0;\n            }\n            return 0;\n          };\n\n          if (activeSort === 'created-descending') {\n            filtered.sort((a, b) => {\n              const timeA = parseIndexDate(a?.stock_movement_at || a?.created_at || null);\n              const timeB = parseIndexDate(b?.stock_movement_at || b?.created_at || null);\n              return timeB - timeA;\n            });\n          } else if (activeSort === 'release-date-desc' || activeSort === 'release-date-asc') {\n            filtered.sort((a, b) => {\n              const timeA = parseIndexDate(a?.release_date || null);\n              const timeB = parseIndexDate(b?.release_date || null);\n              const missingA = timeA <= 0;\n              const missingB = timeB <= 0;\n\n              if (missingA && missingB) return 0;\n              if (missingA) return 1;\n              if (missingB) return -1;\n              return activeSort === 'release-date-asc' ? (timeA - timeB) : (timeB - timeA);\n            });\n          }\n\n          if (wmIsShuffleMode()) {\n            for (let i = filtered.length - 1; i > 0; i--) {\n              const j = Math.floor(Math.random() * (i + 1));\n              [filtered[i], filtered[j]] = [filtered[j], filtered[i]];\n            }\n          }\n\n          return filtered;\n        };\n\n        if (activeSort === 'wm-random') {\n          try {\n            const url = new URL(window.location.href);\n            url.searchParams.delete('wm_return');\n            history.replaceState({}, '', url.toString());\n          } catch (e) {}\n\n          window.WM_ACTIVE_COLLECTION_INDEX = buildReturnActiveCollectionIndex();\n          container.querySelectorAll('.product-slide').forEach((el) => el.remove());\n          window.WM_INDEX_CURSOR = 0;\n          container.scrollTop = 0;\n          if (endMessage) endMessage.style.display = 'none';\n\n          await loadNextPage();\n\n          requestAnimationFrame(() => {\n            container.scrollTop = 0;\n            setTimeout(() => { container.scrollTop = 0; }, 60);\n            setTimeout(() => { container.scrollTop = 0; }, 180);\n          });\n\n          sessionStorage.removeItem('wm_feed_return');\n          sessionStorage.removeItem('wm_auth_return_pending');\n          return;\n        }\n\n        try {\n          const url = new URL(window.location.href);\n          url.searchParams.delete('wm_return');\n          history.replaceState({}, '', url.toString());\n        } catch (e) {}\n\n        const scrollToTop = (top) => {\n          requestAnimationFrame(() => {\n            container.scrollTop = top;\n            setTimeout(() => { container.scrollTop = top; }, 60);\n            setTimeout(() => { container.scrollTop = top; }, 180);\n          });\n        };\n\n        if (!isNewestReturn) {\n          const tryFindExisting = () => {\n            if (!saved.productHandle) return null;\n            return container.querySelector(\n              `.product-slide[data-product-handle=\"${CSS.escape(saved.productHandle)}\"]`\n            );\n          };\n\n          let target = tryFindExisting();\n\n          console.log('[WM RETURN] non-newest initial', {\n            targetFound: !!target,\n            productHandle: saved.productHandle,\n            scrollTop: saved.scrollTop,\n            containerScrollHeight: container.scrollHeight,\n            clientHeight: container.clientHeight,\n            cursor: window.WM_INDEX_CURSOR\n          });\n\n          while (!target && saved.scrollTop != null && container.scrollHeight < (saved.scrollTop + container.clientHeight)) {\n            const beforeHeight = container.scrollHeight;\n            const beforeCursor = window.WM_INDEX_CURSOR;\n            await loadNextPage();\n            target = tryFindExisting();\n            console.log('[WM RETURN] non-newest loadNextPage', {\n              beforeHeight,\n              afterHeight: container.scrollHeight,\n              beforeCursor,\n              afterCursor: window.WM_INDEX_CURSOR,\n              targetFound: !!target\n            });\n            if (container.scrollHeight === beforeHeight && window.WM_INDEX_CURSOR === beforeCursor) break;\n          }\n\n          if (target) {\n            console.log('[WM RETURN] non-newest target', {\n              productHandle: saved.productHandle,\n              targetTop: target.offsetTop,\n              offsetInSlide: saved.offsetInSlide\n            });\n            scrollToTop(target.offsetTop + (saved.offsetInSlide || 0));\n            sessionStorage.removeItem('wm_feed_return');\n            sessionStorage.removeItem('wm_auth_return_pending');\n            return;\n          }\n\n          if (saved.scrollTop != null) {\n            console.log('[WM RETURN] non-newest fallback scrollTop', {\n              scrollTop: saved.scrollTop\n            });\n            scrollToTop(saved.scrollTop);\n            sessionStorage.removeItem('wm_feed_return');\n            sessionStorage.removeItem('wm_auth_return_pending');\n            return;\n          }\n        }\n\n        window.WM_ACTIVE_COLLECTION_INDEX = buildReturnActiveCollectionIndex();\n        console.log('[WM RETURN] newest source built', {\n          sourceLength: Array.isArray(window.WM_ACTIVE_COLLECTION_INDEX) ? window.WM_ACTIVE_COLLECTION_INDEX.length : 0\n        });\n        container.querySelectorAll('.product-slide').forEach((el) => el.remove());\n        window.WM_INDEX_CURSOR = 0;\n        if (endMessage) endMessage.style.display = 'none';\n        await loadNextPage();\n\n        const source = Array.isArray(window.WM_ACTIVE_COLLECTION_INDEX) ? window.WM_ACTIVE_COLLECTION_INDEX : [];\n        const indexedHandle =\n          saved.sourceIndex != null &&\n          saved.sourceIndex >= 0 &&\n          saved.sourceIndex < source.length\n            ? (source[saved.sourceIndex]?.handle || source[saved.sourceIndex]?.product_handle || null)\n            : null;\n        const targetHandle = saved.productHandle || indexedHandle;\n\n        console.log('[WM RETURN] newest rebuilt', {\n          sourceLength: source.length,\n          cursor: window.WM_INDEX_CURSOR,\n          savedSourceIndex: saved.sourceIndex,\n          indexedHandle,\n          targetHandle,\n          existingSlides: container.querySelectorAll('.product-slide[data-product-handle]').length\n        });\n\n        if (\n          saved.sourceIndex != null &&\n          saved.sourceIndex >= 0 &&\n          window.WM_INDEX_CURSOR <= saved.sourceIndex\n        ) {\n          while (\n            window.WM_INDEX_CURSOR <= saved.sourceIndex &&\n            window.WM_INDEX_CURSOR < source.length\n          ) {\n            await loadNextPage();\n            console.log('[WM RETURN] newest loadToIndex', {\n              cursor: window.WM_INDEX_CURSOR,\n              targetIndex: saved.sourceIndex\n            });\n          }\n        }\n\n        let target = targetHandle\n          ? container.querySelector(`.product-slide[data-product-handle=\"${CSS.escape(targetHandle)}\"]`)\n          : null;\n\n        while (!target && targetHandle && window.WM_INDEX_CURSOR < source.length) {\n          await loadNextPage();\n          target = container.querySelector(`.product-slide[data-product-handle=\"${CSS.escape(targetHandle)}\"]`);\n          console.log('[WM RETURN] newest loadToHandle', {\n            cursor: window.WM_INDEX_CURSOR,\n            targetHandle,\n            targetFound: !!target\n          });\n        }\n\n        if (!target && saved.sourceIndex != null && saved.sourceIndex >= 0) {\n          const productSlides = Array.from(\n            container.querySelectorAll('.product-slide[data-product-handle]')\n          ).filter((slide) => !wmIsSpecialCard(slide));\n          target = productSlides[saved.sourceIndex] || null;\n          console.log('[WM RETURN] newest fallback index', {\n            productSlides: productSlides.length,\n            savedSourceIndex: saved.sourceIndex,\n            targetFound: !!target\n          });\n        }\n\n        if (target) {\n          console.log('[WM RETURN] newest target', {\n            targetHandle,\n            targetTop: target.offsetTop,\n            offsetInSlide: saved.offsetInSlide,\n            finalCursor: window.WM_INDEX_CURSOR\n          });\n          scrollToTop(target.offsetTop + (saved.offsetInSlide || 0));\n          sessionStorage.removeItem('wm_feed_return');\n          sessionStorage.removeItem('wm_auth_return_pending');\n          return;\n        }\n\n        if (saved.scrollTop != null) {\n          while (\n            container.scrollHeight < (saved.scrollTop + container.clientHeight) &&\n            window.WM_INDEX_CURSOR < source.length\n          ) {\n            await loadNextPage();\n            console.log('[WM RETURN] newest fallback scrollTop load', {\n              cursor: window.WM_INDEX_CURSOR,\n              scrollHeight: container.scrollHeight,\n              requiredHeight: saved.scrollTop + container.clientHeight\n            });\n          }\n\n          console.log('[WM RETURN] newest fallback scrollTop', {\n            scrollTop: saved.scrollTop,\n            finalCursor: window.WM_INDEX_CURSOR\n          });\n          scrollToTop(saved.scrollTop);\n          sessionStorage.removeItem('wm_feed_return');\n          sessionStorage.removeItem('wm_auth_return_pending');\n        }\n      } catch (e) {\n        console.error('WM return restore failed', e);\n      } finally {\n        WM_RETURN_RESTORE_ACTIVE = false;\n        try {\n          await wmCompletePendingWishlistAdd();\n        } catch (e) {\n          console.warn('WM pending wishlist add failed', e);\n        }\n      }\n    }\n    \n    async function wmWaitForCollectionIndex(){\n    if (window.WM_COLLECTION_INDEX_READY) {\n      try {\n        await window.WM_COLLECTION_INDEX_READY;\n      } catch(e) {\n        console.error('WM_COLLECTION_INDEX_READY failed', e);\n      }\n    }\n  }\n  \n      // infinite scroll\n      let scrollThrottle = false;\n      container.addEventListener('scroll', () => {\n    if (scrollThrottle) return;\n    scrollThrottle = true;\n  \n    setTimeout(async () => {\n      scrollThrottle = false;\n      if (isLoading || currentPage >= totalPages) return;\n  \n      const scrollPos = container.scrollTop + container.clientHeight;\n      const triggerPoint = container.scrollHeight - 1400;\n  \n      if (scrollPos >= triggerPoint) {\n        wmQueueFeedBatchLoad();\n      }\n    }, 150);\n  });\n    \n      function initializeAllExistingSlides() {\n        const initialSlides = container.querySelectorAll('.product-slide');\n        initialSlides.forEach(slide => wmApplyWishlistStockState(slide));\n        initializeSwiperForSlides(Array.from(initialSlides));\n        initializeAudioControls();\n      }\n    \n    function mostVisibleProductSlide(){\n      const cont = document.getElementById('verticalSwipeContainer');\n      if (!cont) return null;\n    \n      const productSlides = Array.from(cont.querySelectorAll('.product-slide'));\n      if (!productSlides.length) return null;\n    \n      // Choose the product whose top is closest to the container's scrollTop\n      const y = cont.scrollTop + 8;\n      let best = productSlides[0];\n      let bestDist = Infinity;\n    \n      for (const ps of productSlides){\n        const d = Math.abs(ps.offsetTop - y);\n        if (d < bestDist){\n          bestDist = d;\n          best = ps;\n        }\n      }\n      return best;\n    }\n\n    function wmSnapFeedToNearestSlideIfDrifted(){\n      if (!container || isLoading || WM_FOR_YOU_GRID_VIEW) return;\n\n      const slides = Array.from(container.querySelectorAll('.product-slide'));\n      if (!slides.length) return;\n\n      const y = container.scrollTop;\n      let best = slides[0];\n      let bestDist = Infinity;\n\n      for (const slide of slides) {\n        const d = Math.abs((slide.offsetTop || 0) - y);\n        if (d < bestDist) {\n          bestDist = d;\n          best = slide;\n        }\n      }\n\n      const tolerance = Math.max(18, Math.min(90, Math.round(container.clientHeight * 0.1)));\n      if (!best || bestDist <= 2 || bestDist > tolerance) return;\n\n      container.scrollTo({ top: best.offsetTop, behavior: 'auto' });\n    }\n    \n    // WM: hard \u201Cstart playback NOW\u201D helper (used by overlay dismiss + audioUnlocked)\n    async function kickVisibleSlide(){\n      const ps = mostVisibleProductSlide();\n      if (!ps) return;\n    \n      const audioSlide =\n        (typeof wmGetActiveAudioSlideFromProduct === 'function' && wmGetActiveAudioSlideFromProduct(ps)) ||\n        ps.querySelector('.audio-player-slide');\n    \n      if (!audioSlide) return;\n    \n      // If still not unlocked, don't attempt (iOS will block)\n      if (!WM_MEDIA_UNLOCKED) return;\n    \n      // UI: reveal controls + set icons immediately\n      wmShowControlsForSlide(audioSlide, { autoHide: false });\n    \n      ps.querySelectorAll('.play-pause-button').forEach(b => setButtonToPlay(b));\n      const btn = audioSlide.querySelector('.play-pause-button');\n      setButtonToStarting(btn);\n    \n      const started = await wmSafePlaySlide(audioSlide, { unmute: true, reason: 'audio-unlocked' });\n    \n      // If play failed, revert icon\n      if (!started) {\n        setButtonToPlay(btn);\n        return;\n      }\n    \n      wmScheduleControlsHideForSlide(audioSlide);\n      WM_PENDING_AUTOBOOT = false;\n    }\n\n    async function wmKickVisibleSlideForAppBoot(){\n      const ps = mostVisibleProductSlide();\n      if (!ps || !WM_MEDIA_UNLOCKED) return;\n\n      const audioSlide =\n        (typeof wmGetActiveAudioSlideFromProduct === 'function' && wmGetActiveAudioSlideFromProduct(ps)) ||\n        ps.querySelector('.audio-player-slide');\n\n      if (!audioSlide) return;\n      document.documentElement.classList.add('wm-app-autoplay-booting');\n\n      const carousel = audioSlide.closest('.audio-player-carousel');\n      if (carousel) {\n        clearTimeout(carousel.hideControlsTimer);\n        carousel.classList.remove('hide-controls');\n      }\n\n      const btn = audioSlide.querySelector('.play-pause-button');\n      setButtonToStarting(btn);\n\n      const started = await wmSafePlaySlide(audioSlide, { unmute: true, reason: 'app-boot' });\n\n      if (!started) {\n        setButtonToPlay(btn);\n        if (carousel) clearTimeout(carousel.hideControlsTimer);\n        document.documentElement.classList.remove('wm-app-autoplay-booting');\n        return;\n      }\n\n      if (carousel) clearTimeout(carousel.hideControlsTimer);\n      WM_PENDING_AUTOBOOT = false;\n      setTimeout(() => {\n        document.documentElement.classList.remove('wm-app-autoplay-booting');\n        if (carousel && !wmShouldPinPlayPrompt()) {\n          clearTimeout(carousel.hideControlsTimer);\n          carousel.classList.add('hide-controls');\n        }\n      }, 1100);\n    }\n\n    let WM_APP_AUTOBOOT_STARTED = false;\n    let WM_APP_AUTOBOOT_DONE = false;\n    let WM_APP_AUTOBOOT_IN_PROGRESS = false;\n    let WM_APP_AUTOBOOT_TIMER = 0;\n\n    function wmStartAppAutoplayWhenFeedReady({ force = false } = {}) {\n      if (!WM_IS_APP || WM_FOR_YOU_GRID_VIEW || overlay || !WM_AUTOBOOT_ALLOWED) return;\n      if (WM_APP_AUTOBOOT_DONE) return;\n      if (WM_APP_AUTOBOOT_STARTED && !force) return;\n\n      WM_APP_AUTOBOOT_STARTED = true;\n      clearTimeout(WM_APP_AUTOBOOT_TIMER);\n\n      let attempts = 0;\n      const attempt = () => {\n        if (!WM_IS_APP || WM_FOR_YOU_GRID_VIEW || overlay || !WM_AUTOBOOT_ALLOWED) return;\n        if (WM_PLAYER && !WM_PLAYER.paused) return;\n\n        const slide = wmGetVisibleAudioSlideForUnlock();\n        if (!slide || !slide.querySelector('.slide-audio')) {\n          attempts += 1;\n          if (attempts < 12) {\n            WM_APP_AUTOBOOT_TIMER = setTimeout(attempt, 120);\n          }\n          return;\n        }\n\n        WM_APP_AUTOBOOT_IN_PROGRESS = true;\n        wmUnlockAudioOnce(slide, { keepPlaying: true })\n          .then(async () => {\n            if (WM_MEDIA_UNLOCKED) {\n              await wmKickVisibleSlideForAppBoot();\n              if (WM_PLAYER && !WM_PLAYER.paused) {\n                WM_APP_AUTOBOOT_DONE = true;\n              }\n              WM_APP_AUTOBOOT_IN_PROGRESS = false;\n              return;\n            }\n\n            WM_APP_AUTOBOOT_IN_PROGRESS = false;\n            attempts += 1;\n            if (attempts < 8) {\n              WM_APP_AUTOBOOT_TIMER = setTimeout(attempt, 160);\n            }\n          })\n          .catch(() => {\n            WM_APP_AUTOBOOT_IN_PROGRESS = false;\n            attempts += 1;\n            if (attempts < 8) {\n              WM_APP_AUTOBOOT_TIMER = setTimeout(attempt, 160);\n            }\n          });\n      };\n\n      requestAnimationFrame(attempt);\n    }\n    \n    function wmPromptPlayOnProduct(productSlide){\n      if (!productSlide) return;\n\n      const audioSlide =\n        (typeof wmGetActiveAudioSlideFromProduct === 'function' && wmGetActiveAudioSlideFromProduct(productSlide)) ||\n        productSlide.querySelector('.audio-player-slide');\n    \n      if (!audioSlide) return;\n    \n      const carousel = audioSlide.closest('.audio-player-carousel');\n      if (carousel){\n        // Ensure controls are visible and STAY visible\n        clearTimeout(carousel.hideControlsTimer);\n        carousel.classList.remove('hide-controls');\n      }\n    \n      // Force all buttons to Play, especially the active one\n      productSlide.querySelectorAll('.play-pause-button').forEach(b => setButtonToPlay(b));\n      setButtonToPlay(audioSlide.querySelector('.play-pause-button'));\n    }\n\n      // WM: When overlay is skipped, show Play button on the first visible product (no autoplay)\n    function wmPromptPlayOnFirstVisible(){\n      const container = document.getElementById('verticalSwipeContainer');\n      if (!container) return;\n    \n      const productSlides = Array.from(container.querySelectorAll('.product-slide'));\n      if (!productSlides.length) return;\n    \n      // Pick the product closest to the top of the feed container\n      const y = container.scrollTop;\n      let best = productSlides[0];\n      let bestDist = Infinity;\n    \n      for (const ps of productSlides){\n        const d = Math.abs(ps.offsetTop - y);\n        if (d < bestDist){\n          bestDist = d;\n          best = ps;\n        }\n      }\n\n      wmPromptPlayOnProduct(best);\n    }\n    \n    \n      /* ================================\n       WM: PRODUCT-level autoplay (iOS Safari safe)\n       - Observe .product-slide within #verticalSwipeContainer (rooted IO)\n       - Autoplay the active horizontal track inside the most-visible product\n    ================================ */\n    let WM_ACTIVE_PRODUCT = null;\n  let WM_MANUAL_INTERACTION = false;\n  let wmAutoTimer = null;\n  let wmAutoToken = 0;\n  let WM_PRODUCT_IO = null;\n  let WM_SUPPRESS_AUTOPLAY = false;\n  let WM_SUPPRESS_MOBILE_CHROME_AUTOPLAY_UNTIL = 0;\n  let WM_LAST_FEED_NAV_INTENT_AT = 0;\n\n  function wmIsMobileViewport(){\n    return window.innerWidth <= 767 || WM_IS_IOS;\n  }\n\n  function wmMarkFeedNavIntent(){\n    WM_LAST_FEED_NAV_INTENT_AT = Date.now();\n  }\n\n  function wmSuppressMobileChromeAutoplay(duration = 900){\n    if (!wmIsMobileViewport()) return;\n    if (Date.now() - WM_LAST_FEED_NAV_INTENT_AT < 350) return;\n    WM_SUPPRESS_MOBILE_CHROME_AUTOPLAY_UNTIL = Date.now() + duration;\n    wmAutoToken += 1;\n    clearTimeout(wmAutoTimer);\n  }\n\n  function wmIsMobileChromeAutoplaySuppressed(){\n    return wmIsMobileViewport() && Date.now() < WM_SUPPRESS_MOBILE_CHROME_AUTOPLAY_UNTIL;\n  }\n\n  function wmHasCollectionDefaultSort(pathname){\n    return pathname === '/collections/bestsellers' || pathname === '/collections/old-but-gold';\n  }\n\n  function wmRevealWeeklyDigsHeaderIfReady(root = container){\n    if (window.WM_FEED_SOURCE !== 'weekly_digs') return;\n    const scope = root || document;\n    const hasProductSlide = !!scope.querySelector?.('.product-slide[data-product-handle]');\n    if (!hasProductSlide) return;\n    document.documentElement.classList.remove('wm-weekly-digs-pending');\n    if (loadingIndicator) loadingIndicator.style.display = 'none';\n    if (typeof window.WM_syncHeaderWidth === 'function') window.WM_syncHeaderWidth();\n  }\n\n  window.addEventListener('resize', () => wmSuppressMobileChromeAutoplay(900), { passive: true });\n  window.addEventListener('blur', () => wmSuppressMobileChromeAutoplay(1400), { passive: true });\n  window.addEventListener('pagehide', () => wmSuppressMobileChromeAutoplay(1800), { passive: true });\n  window.addEventListener('pageshow', () => wmSuppressMobileChromeAutoplay(900), { passive: true });\n  document.addEventListener('visibilitychange', () => {\n    if (document.hidden) wmSuppressMobileChromeAutoplay(1800);\n    else wmSuppressMobileChromeAutoplay(900);\n  }, { passive: true });\n    \n    function wmGetActiveAudioSlideFromProduct(productSlide){\n      const carousel = productSlide?.querySelector('.audio-player-carousel');\n      if (!carousel) return null;\n    \n      const swiper = carousel.swiperInstance;\n      if (swiper && swiper.slides && swiper.slides.length){\n        const s = swiper.slides[swiper.activeIndex];\n        return s?.querySelector('.audio-player-slide') || s;\n      }\n    \n      // Fallback if swiper isn't ready for some reason\n      return carousel.querySelector('.audio-player-slide');\n    }\n    \n    function wmIsSpecialCard(productSlide){\n      return !!productSlide && (\n        productSlide.classList.contains('wm-special-card') ||\n        productSlide.dataset.wmSpecial === '1'\n      );\n    }\n    \n    // If the most-visible slide is a special card, stop audio immediately\n    function wmPauseIfSpecialIsMostVisible(){\n      const ps = mostVisibleProductSlide?.();\n      if (!ps) return false;\n    \n      if (wmIsSpecialCard(ps)) {\n        if (WM_OWNER.slide) {\n          wmPauseSlide(WM_OWNER.slide, { reason: 'special-card' });\n          const oldBtn = WM_OWNER.slide.querySelector('.play-pause-button');\n          setButtonToPlay(oldBtn);\n        }\n        WM_ACTIVE_PRODUCT = ps; // prevent re-autoplay loops on the previous slide\n        return true;\n      }\n      return false;\n    }\n    \n    \n    async function wmAutoplayProduct(productSlide){\n    if (!productSlide) return;\n    if (WM_SUPPRESS_AUTOPLAY) return;\n    if (wmIsMobileChromeAutoplaySuppressed()) return;\n    if (!WM_AUTOBOOT_ALLOWED) return;\n  \n    const container = document.getElementById('verticalSwipeContainer');\n    if (window.WM_FEED_SOURCE === 'wishlist' && container) {\n      const remainingSlides = container.querySelectorAll('.product-slide');\n      if (!remainingSlides.length) return;\n    }\n    \n      // If audio not unlocked yet, stop here (prevents \u201Cno pause\u201D behaviour)\n      if (!WM_MEDIA_UNLOCKED) return;\n    \n    \n      const token = ++wmAutoToken;\n    \n      // Coalesce app/iOS observer bursts until scroll snap has mostly settled.\n      clearTimeout(wmAutoTimer);\n      wmAutoTimer = setTimeout(async () => {\n        if (token !== wmAutoToken) return;\n        if (wmIsMobileChromeAutoplaySuppressed()) return;\n        if (mostVisibleProductSlide?.() !== productSlide) return;\n    \n        const audioSlide = wmGetActiveAudioSlideFromProduct(productSlide);\n        if (!audioSlide) return;\n    \n        // If already owning + playing, do nothing\n        if (WM_OWNER.slide === audioSlide && WM_PLAYER && !WM_PLAYER.paused) return;\n\n        // Show overlay immediately as a new card becomes active.\n        wmShowControlsForSlide(audioSlide, { autoHide: false });\n    \n        // If a different product currently owns playback, pause it\n        if (WM_OWNER.slide && WM_OWNER.slide.closest('.product-slide') !== productSlide){\n          wmPauseSlide(WM_OWNER.slide, { reason: 'scroll' });\n          const oldBtn = WM_OWNER.slide.querySelector('.play-pause-button');\n          setButtonToPlay(oldBtn);\n        }\n    \n        // Update button states inside this product immediately (prevents circle-before-icon lag on mobile)\n        productSlide.querySelectorAll('.play-pause-button').forEach(b => setButtonToPlay(b));\n        const activeBtn = audioSlide.querySelector('.play-pause-button');\n        setButtonToStarting(activeBtn);\n    \n        const started = await wmSafePlaySlide(audioSlide, { unmute: true, reason: 'scroll' });\n    \n        // If playback didn't actually start, revert the icon\n        if (!started) {\n          setButtonToPlay(activeBtn);\n        } else {\n          wmScheduleControlsHideForSlide(audioSlide);\n        }\n      }, wmIsMobileViewport() ? 90 : 25);\n    }\n    \n    \n    \n    function wmSetupProductAutoplayObserver(){\n      if (!container) return;\n      if (WM_PRODUCT_IO) return;\n    \n      WM_PRODUCT_IO = new IntersectionObserver(entries => {\n      let best = null;\n      let bestRatio = 0;\n    \n      for (const e of entries){\n        if (!e.isIntersecting) continue;\n        if (e.intersectionRatio > bestRatio){\n          bestRatio = e.intersectionRatio;\n          best = e.target;\n        }\n      }\n    \n      if (!best || bestRatio < 0.55) return;\n    \n      /* ===============================\n         SPECIAL CARD: pause immediately\n      =============================== */\n      if (best.classList.contains('wm-special-card') || best.dataset.wmSpecial === '1'){\n        if (WM_OWNER.slide){\n          wmPauseSlide(WM_OWNER.slide, { reason: 'special-card' });\n          const oldBtn = WM_OWNER.slide.querySelector('.play-pause-button');\n          setButtonToPlay(oldBtn);\n        }\n        WM_ACTIVE_PRODUCT = best;\n        return;\n      }\n    \n      /* ===============================\n      NORMAL PRODUCT: autoplay\n      =============================== */\n      if (best !== WM_ACTIVE_PRODUCT){\n        if (wmIsMobileChromeAutoplaySuppressed()) return;\n        WM_ACTIVE_PRODUCT = best;\n        if (wmShouldPinPlayPrompt()) {\n          wmPromptPlayOnProduct(best);\n          return;\n        }\n        wmAutoplayProduct(best);\n      }\n    \n    }, {\n      root: container,\n      threshold: [0.25, 0.55, 0.75]\n    });\n    \n    \n      container.querySelectorAll('.product-slide').forEach(ps => WM_PRODUCT_IO.observe(ps));\n    }\n    \n    \n      // Retry play after momentum scrolling settles (use the FEED container, not window)\n    let contScrollTimer;\n    if (!WM_FOR_YOU_GRID_VIEW) {\n      container.addEventListener('scroll', () => {\n        wmLastFeedScrollAt = Date.now();\n        wmScheduleDormantTrim();\n        clearTimeout(contScrollTimer);\n        contScrollTimer = setTimeout(() => {\n          wmScheduleDormantRefresh();\n          wmFlushDeferredSlideRuntime();\n          wmFlushPendingFeedBatch();\n          wmSnapFeedToNearestSlideIfDrifted();\n          if (!WM_AUTOBOOT_ALLOWED && !overlay && WM_GESTURE_UNLOCK_PRIME) {\n            wmStartListeningFromGesture({ autoplay: true, slide: wmGetVisibleAudioSlideForUnlock() });\n            return;\n          }\n          if (!WM_AUTOBOOT_ALLOWED) return;\n          if (wmIsMobileChromeAutoplaySuppressed()) return;\n          // 1) If special card is most visible, pause and bail\n          if (wmPauseIfSpecialIsMostVisible()) return;\n      \n          // 2) Otherwise continue normal behaviour\n          if (WM_ACTIVE_PRODUCT) wmAutoplayProduct(WM_ACTIVE_PRODUCT);\n        }, 140);\n      }, { passive:true });\n    }\n    \n    async function wmWaitForCollectionIndex(){\n    if (window.WM_COLLECTION_INDEX_READY) {\n      try {\n        await window.WM_COLLECTION_INDEX_READY;\n      } catch (e) {\n        console.error('WM_COLLECTION_INDEX_READY failed', e);\n      }\n    }\n  }\n    \n    if (!WM_FOR_YOU_GRID_VIEW) {\n      // IMPORTANT: create observer FIRST so shuffle-added slides can be observed immediately\n      wmSetupProductAutoplayObserver();\n      \n      if (wmIsShuffleMode() && !wmShouldPrioritizePinnedHandle()) {\n        wmInitShuffle(container); // can remain non-awaited\n      } else {\n        initializeAllExistingSlides();\n        wmSafariLazyImageFix(container);\n        wmRevealWeeklyDigsHeaderIfReady(container);\n\n        if (\n          (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') &&\n          !container.querySelector('.product-slide[data-product-handle]')\n        ) {\n          loadNextPage().then(() => {\n            wmRevealWeeklyDigsHeaderIfReady(container);\n            if (typeof window.WM_syncHeaderWidth === 'function') window.WM_syncHeaderWidth();\n            wmStartAppAutoplayWhenFeedReady({ force: true });\n            if (!WM_AUTOBOOT_ALLOWED && !overlay) {\n              wmPromptPlayOnFirstVisible();\n            }\n          }).catch(err => {\n            console.warn('[WM Recommendations] Initial batch load failed', err);\n          });\n        }\n      \n      \n        // If overlay is not present, show Play prompt on slide 1\n        if (!WM_AUTOBOOT_ALLOWED && !overlay) {\n          wmPromptPlayOnFirstVisible();\n        } else if (WM_IS_APP) {\n          wmStartAppAutoplayWhenFeedReady({ force: true });\n        }\n        wmMaybeInsertSpecialCards(container);\n      \n      }\n    } else {\n      wmDisableScrollFeedRuntimeForGridView();\n    }\n    \n    \n    \n    \n    \n    \n      \n    \n    if (!WM_FOR_YOU_GRID_VIEW) {\n      wmInitTitleMarquees(container);\n      wmSetupAutoTitleMarquee();\n    \n      // Wait for JSON index, then restore saved position if needed\n      (async function(){\n        await wmWaitForCollectionIndex();\n        await wmRestoreReturnPositionIfNeeded();\n      })();\n      \n      \n      \n        // enhance existing covers + JIT audio\n        (function enhanceExistingCovers(){\n          const covers = Array.from(document.querySelectorAll('.audio-cover'));\n          covers.forEach((img, i) => wmEnhanceCoverImage(img, i));\n        })();\n        wmHydrateSlidesNearViewport(container);\n      \n        // After unlock, immediately play visible slide\n         window.addEventListener('audioUnlocked', () => {\n          // Only autoboot when user explicitly allowed it (overlay click OR play press)\n          if (!WM_AUTOBOOT_ALLOWED) return;\n          if (WM_IS_APP && WM_APP_AUTOBOOT_IN_PROGRESS) return;\n          if (WM_PLAYER && !WM_PLAYER.paused) return;\n      \n          if (!wmIsShuffleMode() || !WM_SHUFFLE_BOOTING) kickVisibleSlide();\n        }, { once:true });\n      \n      \n      \n        // Keyboard nav (desktop)\n        if (window.innerWidth > 767) {\n          document.addEventListener('keydown', function (e) {\n            const slides = Array.from(document.querySelectorAll('.product-slide'));\n            if (!slides.length) return;\n            let activeSlide = slides[0], maxVisible = 0;\n            slides.forEach(slide => {\n              const rect = slide.getBoundingClientRect();\n              const visibleHeight = Math.min(window.innerHeight, rect.bottom) - Math.max(0, rect.top);\n              if (visibleHeight > maxVisible) { maxVisible = visibleHeight; activeSlide = slide; }\n            });\n            const carousel = activeSlide.querySelector('.audio-player-carousel');\n            const swiper = carousel?.swiperInstance;\n            const sortBarHeight = document.querySelector('.sorting-bar')?.offsetHeight || 0;\n            const headerHeight = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--header-height')) || 0;\n            const gapOffset = 10;\n            function scrollToSlideWithOffset(slide) {\n              const targetPos = slide.offsetTop - headerHeight - sortBarHeight - gapOffset;\n              const cont = document.getElementById('verticalSwipeContainer');\n              cont.scrollTo({ top: targetPos, behavior: 'smooth' });\n            }\n            if (e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n              wmMarkFeedNavIntent();\n              wmStartListeningFromGesture({\n                autoplay: true,\n                slide: (\n                  (typeof wmGetActiveAudioSlideFromProduct === 'function' && wmGetActiveAudioSlideFromProduct(activeSlide)) ||\n                  activeSlide.querySelector('.audio-player-slide')\n                )\n              }).catch(() => {});\n            }\n            switch (e.key) {\n              case 'ArrowLeft': swiper?.slidePrev(); break;\n              case 'ArrowRight': swiper?.slideNext(); break;\n              case 'ArrowUp': e.preventDefault(); { const prev = slides[slides.indexOf(activeSlide) - 1]; if (prev) scrollToSlideWithOffset(prev); } break;\n              case 'ArrowDown': e.preventDefault(); { const next = slides[slides.indexOf(activeSlide) + 1]; if (next) scrollToSlideWithOffset(next); } break;\n            }\n          });\n        }\n    }\n      // =======================================================\n  // WM JSON-backed feed loader\n  // keeps existing calls to loadNextPage() working\n  // =======================================================\n  window.WM_INDEX_CURSOR = window.WM_INDEX_CURSOR || 0;\n  const WM_BATCH_SIZE = 5;\n  const WM_BATCH_SIZE_IOS = 2;\n  const WM_WEEKLY_DIGS_INITIAL_BATCH_SIZE_IOS = WM_BATCH_SIZE_IOS;\n  \n  function wmGetCurrentIndexSource(){\n    return Array.isArray(window.WM_ACTIVE_COLLECTION_INDEX)\n      ? window.WM_ACTIVE_COLLECTION_INDEX\n      : (Array.isArray(window.WM_COLLECTION_INDEX) ? window.WM_COLLECTION_INDEX : []);\n  }\n  \n  function wmSyncIndexCursorToDom(){\n    const source = wmGetCurrentIndexSource();\n    if (!Array.isArray(source) || !source.length || !container) return;\n  \n    const sourceHandles = new Set(\n      source\n        .map(item => item && (item.handle || item.product_handle))\n        .filter(Boolean)\n    );\n  \n    const domHandles = Array.from(\n      container.querySelectorAll('.product-slide[data-product-handle]')\n    )\n      .map(el => el.dataset.productHandle)\n      .filter(handle => handle && sourceHandles.has(handle));\n  \n    // De-dupe in case the same handle somehow appears twice in DOM\n    const uniqueDomHandles = Array.from(new Set(domHandles));\n  \n    window.WM_INDEX_CURSOR = (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') ? 0 : uniqueDomHandles.length;\n  }\n\n  function wmRenderedIndexHandles(){\n    if (!container) return new Set();\n\n    return new Set(\n      Array.from(container.querySelectorAll('.product-slide[data-product-handle]'))\n        .map(el => el.dataset.productHandle)\n        .filter(Boolean)\n    );\n  }\n\n  function wmDedupeRenderedProductSlides(preferredHandle = '', preferredNode = null){\n    if (!container) return;\n\n    const byHandle = new Map();\n    const slides = Array.from(container.querySelectorAll('.product-slide[data-product-handle]'))\n      .filter(slide => !slide.classList.contains('wm-special-card') && slide.dataset.wmSpecial !== '1');\n\n    slides.forEach(slide => {\n      const handle = slide.getAttribute('data-product-handle') || '';\n      if (!handle) return;\n\n      if (!byHandle.has(handle)) byHandle.set(handle, []);\n      byHandle.get(handle).push(slide);\n    });\n\n    byHandle.forEach((dupes, handle) => {\n      if (dupes.length < 2) return;\n\n      const preferred =\n        (preferredHandle && handle === preferredHandle && preferredNode && dupes.includes(preferredNode))\n          ? preferredNode\n          : (dupes.find(slide => slide.getAttribute('data-wm-pinned') === '1') || dupes[0]);\n\n      dupes.forEach(slide => {\n        if (slide === preferred) return;\n\n        try { wmDestroyProductSlideRuntime(slide); } catch (e) {}\n        slide.remove();\n      });\n    });\n  }\n  \n  function wmIsUnavailableIndexItem(item){\n      return !!item &&\n        Object.prototype.hasOwnProperty.call(item, 'available') &&\n        item.available === false;\n    }\n\n  function wmIsPreorderIndexItem(item){\n      if (!item) return false;\n  \n      const tags = Array.isArray(item.tags) ? item.tags.map(t => String(t).toLowerCase()) : [];\n      const inventoryQty = Number(item.inventory_quantity ?? item.inventory ?? 0);\n      const inventoryPolicy = String(item.inventory_policy ?? '').toLowerCase();\n  \n      return (\n        item.is_preorder === true ||\n        tags.includes('preorder') ||\n        (inventoryPolicy === 'continue' && inventoryQty <= 0)\n      );\n    }\n\n  function wmSlideHasPreorderMarkup(slide){\n    if (!slide) return false;\n    if (slide.getAttribute('data-wm-preorder') === '1') return true;\n    if (slide.querySelector('.wm-feed-card[data-wm-preorder=\"1\"], .add-to-cart.wm-preorder-btn')) return true;\n\n    return Array.from(slide.querySelectorAll('.wm-condition-line')).some((line) => {\n      return /expected\\s+release/i.test(line.textContent || '');\n    });\n  }\n\n  async function wmLoadMoreFeedBatch(){\n    await wmWaitForCollectionIndex();\n\n    if (wmIsShuffleMode() && !wmShouldPrioritizePinnedHandle()) {\n      if (WM_HANDLES_DONE && WM_HANDLE_CURSOR >= WM_HANDLE_POOL.length) {\n        if (endMessage) endMessage.style.display = 'block';\n        return;\n      }\n      await wmLoadRandomBatch(container);\n      return;\n    }\n\n    await loadNextPage();\n  }\n\n  function wmFlushPendingFeedBatch(){\n    if (!wmPendingFeedBatch || isLoading) return;\n    if (WM_IS_IOS && wmIsFeedScrollHot()) {\n      clearTimeout(wmPendingFeedBatchTimer);\n      wmPendingFeedBatchTimer = setTimeout(wmFlushPendingFeedBatch, 180);\n      return;\n    }\n\n    wmPendingFeedBatch = false;\n    clearTimeout(wmPendingFeedBatchTimer);\n    wmPendingFeedBatchTimer = 0;\n    wmLoadMoreFeedBatch().catch((err) => {\n      console.error('WM deferred feed batch failed', err);\n    });\n  }\n\n  function wmQueueFeedBatchLoad(){\n    if (isLoading) return;\n    if (WM_IS_IOS && wmIsFeedScrollHot()) {\n      wmPendingFeedBatch = true;\n      clearTimeout(wmPendingFeedBatchTimer);\n      wmPendingFeedBatchTimer = setTimeout(wmFlushPendingFeedBatch, 180);\n      return;\n    }\n\n    wmPendingFeedBatch = false;\n    clearTimeout(wmPendingFeedBatchTimer);\n    wmPendingFeedBatchTimer = 0;\n    wmLoadMoreFeedBatch().catch((err) => {\n      console.error('WM feed batch failed', err);\n    });\n  }\n\n  function wmEnsureFilterPills(root = container){\n    if (!root) return;\n\n    const filterSource = root.dataset?.wmFilterSource || '';\n    const filterValue = root.dataset?.wmFilterValue || '';\n    if (!filterSource || !filterValue) return;\n\n    const current = new URL(window.location.href);\n    const clearSort = current.searchParams.get('sort_by') || container?.dataset?.sortBy || 'created-descending';\n    const clearUrl = `/collections/all-records?sort_by=${encodeURIComponent(clearSort)}&wm_return=1`;\n\n    root.querySelectorAll('.audio-content, .static-cover-wrapper').forEach((target) => {\n      if (target.querySelector('.wm-filter-sticker')) return;\n\n      const pill = document.createElement('a');\n      pill.className = 'wm-filter-sticker';\n      pill.href = clearUrl;\n      pill.append(\n        document.createTextNode(`${filterSource === 'artist' ? 'Artist:' : 'Label:'} ${filterValue} `)\n      );\n\n      const x = document.createElement('span');\n      x.className = 'wm-filter-sticker__x';\n      x.setAttribute('aria-hidden', 'true');\n      x.textContent = '\u00D7';\n      pill.appendChild(x);\n\n      target.appendChild(pill);\n    });\n  }\n  \n  async function wmLoadNextIndexBatch(){\n    await wmWaitForCollectionIndex();\n\n    if (\n      (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') &&\n      window.WM_RECOMMENDATIONS_READY &&\n      typeof window.WM_RECOMMENDATIONS_READY.then === 'function'\n    ) {\n      await window.WM_RECOMMENDATIONS_READY.catch((err) => {\n        console.warn('[WM Recommendations] Ready promise failed; continuing with available index.', err);\n      });\n\n      if (\n        window.WM_FEED_SOURCE === 'recommendations' &&\n        window.WM_RECOMMENDATIONS_STALE &&\n        typeof window.WM_refreshUnseenRecommendations === 'function'\n      ) {\n        await window.WM_refreshUnseenRecommendations();\n      }\n    }\n  \n    wmSyncIndexCursorToDom();\n    const source = wmGetCurrentIndexSource();\n  \n    if (!source.length) {\n      if (endMessage) endMessage.style.display = 'block';\n      return;\n    }\n  \n    if (window.WM_INDEX_CURSOR >= source.length) {\n      if (endMessage) endMessage.style.display = 'block';\n      return;\n    }\n  \n    if (isLoading) return;\n    isLoading = true;\n    if (loadingIndicator) loadingIndicator.style.display = 'block';\n  \n    try {\n      const renderedHandles = wmRenderedIndexHandles();\n      const slice = [];\n      let scanIndex = Math.max(0, Number(window.WM_INDEX_CURSOR || 0));\n      const isWeeklyDigsInitialAppBatch =\n        window.WM_FEED_SOURCE === 'weekly_digs' &&\n        WM_IS_APP &&\n        WM_IS_IOS &&\n        window.WM_INDEX_CURSOR === 0;\n      const batchSize = isWeeklyDigsInitialAppBatch\n        ? WM_WEEKLY_DIGS_INITIAL_BATCH_SIZE_IOS\n        : (WM_IS_IOS ? WM_BATCH_SIZE_IOS : WM_BATCH_SIZE);\n\n      while (scanIndex < source.length && slice.length < batchSize) {\n        const item = source[scanIndex];\n        const handle = item && (item.handle || item.product_handle);\n        scanIndex += 1;\n\n        if (!handle || renderedHandles.has(handle)) continue;\n        renderedHandles.add(handle);\n        slice.push(item);\n      }\n\n      window.WM_INDEX_CURSOR = scanIndex;\n\n      if (!slice.length) {\n        if (window.WM_INDEX_CURSOR >= source.length && endMessage) {\n          endMessage.style.display = 'block';\n        }\n        return;\n      }\n  \n      const pinnedHandle = wmShouldPrioritizePinnedHandle() ? wmGetPinnedHandleFromUrl() : '';\n      const newSlides = [];\n      let didPrimeInitialWeeklyDigsAppSlide = false;\n\n      const resolveBatchItem = async (item) => {\n        const handle = item && (item.handle || item.product_handle);\n        if (!handle) return { html: '', item };\n\n        let resolvedItem = item;\n        if (pinnedHandle && handle === pinnedHandle) {\n          try {\n            const pinnedItem = await wmFetchPinnedProductState(handle);\n            resolvedItem = pinnedItem || item;\n          } catch (err) {\n            console.warn('WM pinned product state fetch error:', handle, err);\n          }\n        }\n\n        return {\n          html: await wmFetchIndexCardHtml(resolvedItem),\n          item: resolvedItem\n        };\n      };\n\n      if (WM_IS_IOS) {\n        for (let idx = 0; idx < slice.length; idx += 1) {\n          const chunk = await resolveBatchItem(slice[idx]);\n          const html = chunk?.html || '';\n          const item = chunk?.item || slice[idx];\n          const slide = wmBuildSlideFromIndexHtml(html, item);\n          if (!slide) continue;\n\n          const handle = item && (item.handle || item.product_handle);\n          container.appendChild(slide);\n          if (pinnedHandle && handle === pinnedHandle) {\n            wmApplyPinnedStockState(slide, item);\n          } else {\n            wmApplyWishlistStockState(slide, item);\n          }\n\n          newSlides.push(slide);\n\n          if (isWeeklyDigsInitialAppBatch && !didPrimeInitialWeeklyDigsAppSlide) {\n            didPrimeInitialWeeklyDigsAppSlide = true;\n            slide.dataset.wmInitialAppPrimed = '1';\n            initializeSwiperForSlides([slide]);\n            initializeAudioControlsForProduct(slide);\n            if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide);\n            wmHydrateSlidesNearViewport(container);\n            wmRevealWeeklyDigsHeaderIfReady(container);\n            wmStartAppAutoplayWhenFeedReady({ force: true });\n          }\n\n          if ((idx + 1) < slice.length) {\n            await new Promise(resolve => setTimeout(resolve, 0));\n          }\n        }\n      } else {\n        const cardChunks = await Promise.all(slice.map(resolveBatchItem));\n\n        cardChunks.forEach((chunk, idx) => {\n          const html = chunk?.html || '';\n          const item = chunk?.item || slice[idx];\n          const slide = wmBuildSlideFromIndexHtml(html, item);\n          if (!slide) return;\n\n          const handle = item && (item.handle || item.product_handle);\n          container.appendChild(slide);\n          if (pinnedHandle && handle === pinnedHandle) {\n            wmApplyPinnedStockState(slide, item);\n          } else {\n            wmApplyWishlistStockState(slide, item);\n          }\n\n          newSlides.push(slide);\n        });\n      }\n  \n      if (newSlides.length) {\n        wmDedupeRenderedProductSlides(pinnedHandle);\n        const connectedSlides = newSlides.filter(slide => slide.isConnected);\n\n        initializeSwiperForSlides(connectedSlides);\n        connectedSlides.forEach(slide => {\n          if (slide.dataset.wmInitialAppPrimed === '1') return;\n          initializeAudioControlsForProduct(slide);\n        });\n  \n        wmInitTitleMarquees(container);\n        wmObserveNewMarqueeCards(connectedSlides);\n  \n        wmSafariLazyImageFix(container);\n        wmMaybeInsertSpecialCards(container);\n  \n        connectedSlides.forEach(slide => {\n          if (WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide);\n        });\n  \n        wmHydrateSlidesNearViewport(container);\n        wmEnsureFilterPills(container);\n        setTimeout(wmSnapPersonalizedFeedToNearestSlide, 80);\n        setTimeout(wmSnapPersonalizedFeedToNearestSlide, 350);\n        if (WM_IS_IOS) {\n          wmRefreshDormantSlides({ allowHydrate: false });\n        }\n        wmScheduleDormantTrim();\n        wmScheduleDormantRefresh();\n        wmRevealWeeklyDigsHeaderIfReady(container);\n        wmStartAppAutoplayWhenFeedReady({ force: true });\n      }\n  \n      if (window.WM_INDEX_CURSOR >= source.length && endMessage) {\n        endMessage.style.display = 'block';\n      }\n    } catch (e) {\n      console.error('wmLoadNextIndexBatch failed', e);\n    } finally {\n      isLoading = false;\n      if (loadingIndicator) loadingIndicator.style.display = 'none';\n      if (WM_IS_IOS) {\n        setTimeout(wmFlushPendingFeedBatch, 0);\n      }\n    }\n  }\n  \n\n  async function wmFetchIndexCardHtml(item){\n    const handle = item && (item.handle || item.product_handle);\n    if (!handle) return '';\n\n    try {\n      const pinnedHandle = wmShouldPrioritizePinnedHandle() ? wmGetPinnedHandleFromUrl() : '';\n      if (pinnedHandle && handle === pinnedHandle) {\n        const pinnedSlide = await wmFetchPinnedSlide(handle);\n        return pinnedSlide ? pinnedSlide.outerHTML : '';\n      }\n\n      const ajaxCardUrl = wmBuildAjaxCardUrl(handle);\n      const res = await fetch(ajaxCardUrl, {\n        headers: { 'X-Requested-With': 'XMLHttpRequest' }\n      });\n\n      if (!res.ok) {\n        console.warn('WM ajax-card fetch failed:', handle, res.status);\n        return '';\n      }\n\n      return await res.text();\n    } catch (err) {\n      console.warn('WM ajax-card fetch error:', handle, err);\n      return '';\n    }\n  }\n\n  function wmBuildSlideFromIndexHtml(html, item, parsedDoc){\n    if (!html) return null;\n\n    const doc = parsedDoc || new DOMParser().parseFromString(html, 'text/html');\n    let slide = doc.querySelector('.product-slide');\n\n    if (!slide) {\n      const bodyHtml = (doc.body && doc.body.innerHTML ? doc.body.innerHTML : html).trim();\n      if (!bodyHtml) return null;\n\n      const handle = item && (item.handle || item.product_handle);\n      const productId = item && (item.id || item.product_id || '');\n\n      const wrapper = document.createElement('section');\n      wrapper.className = 'product-slide';\n\n      if (handle) wrapper.setAttribute('data-product-handle', handle);\n      if (productId) wrapper.setAttribute('data-product-id', productId);\n      if (Object.prototype.hasOwnProperty.call(item || {}, 'available')) {\n        wrapper.setAttribute('data-wm-available', item.available ? '1' : '0');\n      }\n\n      wrapper.setAttribute('data-wm-preorder', wmIsPreorderIndexItem(item) ? '1' : '0');\n      wrapper.setAttribute('data-wm-dormant', '0');\n\n      const inner = document.createElement('div');\n      inner.className = 'product-slide-inner';\n      inner.innerHTML = bodyHtml;\n      wrapper.appendChild(inner);\n      slide = wrapper;\n    } else {\n      const handle = item && (item.handle || item.product_handle);\n      const productId = item && (item.id || item.product_id || '');\n\n      if (handle && !slide.getAttribute('data-product-handle')) {\n        slide.setAttribute('data-product-handle', handle);\n      }\n      if (productId && !slide.getAttribute('data-product-id')) {\n        slide.setAttribute('data-product-id', productId);\n      }\n      if (Object.prototype.hasOwnProperty.call(item || {}, 'available')) {\n        slide.setAttribute('data-wm-available', item.available ? '1' : '0');\n      }\n      if (!slide.getAttribute('data-wm-preorder')) {\n        slide.setAttribute('data-wm-preorder', (wmIsPreorderIndexItem(item) || wmSlideHasPreorderMarkup(slide)) ? '1' : '0');\n      }\n      slide.setAttribute('data-wm-dormant', '0');\n    }\n\n    const handle = item && (item.handle || item.product_handle);\n    const pinnedHandle = wmShouldPrioritizePinnedHandle() ? wmGetPinnedHandleFromUrl() : '';\n    if (pinnedHandle && handle === pinnedHandle) {\n      slide.setAttribute('data-wm-pinned', '1');\n    }\n\n    return slide;\n  }\n\n  function wmApplyWishlistStockState(slide, item){\n    if (!slide) return;\n  \n    const hasItemAvailability = Object.prototype.hasOwnProperty.call(item || {}, 'available');\n    const slideAvailability = slide.getAttribute('data-wm-available');\n    const isAvailable = hasItemAvailability\n      ? !!item.available\n      : !(slideAvailability === '0' || slideAvailability === 'false');\n    const isPreorder = wmIsPreorderIndexItem(item) || wmSlideHasPreorderMarkup(slide);\n\n    const form = slide.querySelector('.ajax-cart-form');\n    const btn = form ? form.querySelector('.add-to-cart') : null;\n    if (!btn) return;\n\n    if (isPreorder) {\n      slide.setAttribute('data-wm-preorder', '1');\n      btn.disabled = false;\n      btn.removeAttribute('aria-disabled');\n      btn.setAttribute('type', 'submit');\n      btn.classList.remove('wm-sold-out-btn');\n      btn.classList.add('wm-preorder-btn');\n\n      const cartText = btn.querySelector('.cart-text');\n      const loadingText = btn.querySelector('.cart-loading');\n\n      if (cartText) cartText.textContent = 'PRE-ORDER';\n      if (cartText) cartText.style.display = 'inline';\n      if (loadingText) loadingText.style.display = 'none';\n\n      if (form && !form.querySelector('input[name=\"properties[_wm_preorder]\"]')) {\n        const input = document.createElement('input');\n        input.type = 'hidden';\n        input.name = 'properties[_wm_preorder]';\n        input.value = 'Yes';\n        form.appendChild(input);\n      }\n\n      return;\n    }\n\n    if (isAvailable) return;\n  \n    btn.disabled = true;\n    btn.setAttribute('aria-disabled', 'true');\n    btn.setAttribute('type', 'button');\n    btn.classList.add('wm-sold-out-btn');\n  \n    const cartText = btn.querySelector('.cart-text');\n    const loadingText = btn.querySelector('.cart-loading');\n  \n    if (cartText) cartText.textContent = 'SOLD OUT';\n    if (cartText) cartText.style.display = 'inline';\n    if (loadingText) loadingText.style.display = 'none';\n\n    if (window.WM_FEED_SOURCE !== 'wishlist') {\n      const notifyButton = slide.querySelector('.view-product-button');\n      if (notifyButton) {\n        if (!notifyButton.dataset.wmOriginalHref) {\n          notifyButton.dataset.wmOriginalHref = notifyButton.getAttribute('href') || '';\n        }\n        notifyButton.textContent = 'NOTIFY ME';\n        notifyButton.setAttribute('role', 'button');\n        notifyButton.setAttribute('aria-label', 'Add to wishlist to be notified when back in stock');\n        notifyButton.classList.add('wm-notify-me-button');\n        wmScheduleSwishRefresh();\n      }\n    }\n  }\n\n  function wmApplyPinnedStockState(slide, item){\n    if (!slide) return;\n\n    slide.setAttribute('data-wm-pinned', '1');\n\n    const pinnedItem = item || {};\n    const hasAvailability = Object.prototype.hasOwnProperty.call(pinnedItem, 'available');\n\n    if (!hasAvailability || pinnedItem.available !== false) {\n      wmApplyWishlistStockState(slide, pinnedItem);\n      return;\n    }\n\n    slide.setAttribute('data-wm-available', '0');\n    slide.setAttribute('data-wm-preorder', (wmIsPreorderIndexItem(pinnedItem) || wmSlideHasPreorderMarkup(slide)) ? '1' : '0');\n    wmApplyWishlistStockState(slide, pinnedItem);\n\n    requestAnimationFrame(() => wmApplyWishlistStockState(slide, pinnedItem));\n    setTimeout(() => wmApplyWishlistStockState(slide, pinnedItem), 150);\n    setTimeout(() => wmApplyWishlistStockState(slide, pinnedItem), 600);\n  }\n\n  async function wmHandleNotifyMeClick(notifyButton){\n    if (!notifyButton || notifyButton.classList.contains('wm-notify-me-button--busy')) return;\n\n    const slide = notifyButton.closest('.product-slide');\n    notifyButton.classList.add('wm-notify-me-button--busy');\n    notifyButton.setAttribute('aria-busy', 'true');\n\n    if (!wmCustomerIsLoggedIn()) {\n      wmSavePendingWishlistAdd(notifyButton);\n      wmPromptWishlistLoginIfNeeded({\n        title: 'Notify me when back in stock',\n        body: 'Sign in or create an account to receive back in stock email notifications.'\n      });\n      notifyButton.classList.remove('wm-notify-me-button--busy');\n      notifyButton.removeAttribute('aria-busy');\n      return;\n    }\n\n    const wishlistButton = slide ? await wmWaitForWishlistButton(slide) : null;\n    if (!slide || !wishlistButton) {\n      console.warn('WM notify me could not find Swish wishlist button');\n      notifyButton.classList.remove('wm-notify-me-button--busy');\n      notifyButton.removeAttribute('aria-busy');\n      return;\n    }\n\n    const wasActive = wmWishlistButtonIsActive(wishlistButton);\n\n    if (!wasActive) {\n      wishlistButton.click();\n      wmIncrementWishlistCounterOptimistically();\n    }\n\n    notifyButton.textContent = 'SAVED';\n    notifyButton.classList.add('wm-notify-me-button--saved');\n    notifyButton.setAttribute('aria-label', 'Added to wishlist for back in stock notification');\n\n    setTimeout(() => {\n      wmRefreshWishlistCounter().catch(() => {});\n      notifyButton.classList.remove('wm-notify-me-button--busy');\n      notifyButton.removeAttribute('aria-busy');\n    }, 700);\n  }\n\n  function wmWaitForWishlistButton(slide, maxWaitMs = 1600){\n    if (!slide) return Promise.resolve(null);\n\n    const existing = slide.querySelector('.wk-button');\n    if (existing) return Promise.resolve(existing);\n\n    wmScheduleSwishRefresh();\n\n    const startedAt = Date.now();\n    return new Promise(resolve => {\n      (function check(){\n        const btn = slide.querySelector('.wk-button');\n        if (btn) {\n          resolve(btn);\n          return;\n        }\n\n        if (Date.now() - startedAt >= maxWaitMs) {\n          resolve(null);\n          return;\n        }\n\n        setTimeout(check, 100);\n      })();\n    });\n  }\n\n  function wmScheduleSwishRefresh(){\n    clearTimeout(window.__wmSwishRefreshTimer);\n    window.__wmSwishRefreshTimer = setTimeout(() => {\n      [\n        () => window.WishlistKing?.init?.(),\n        () => window.WishlistKing?.render?.(),\n        () => window.WishlistKing?.refresh?.(),\n        () => window.WishlistKing?.reload?.(),\n        () => window.WishlistKing?.scan?.(),\n        () => window.WishlistKing?.buttons?.init?.(),\n        () => window.WishlistKing?.buttons?.render?.(),\n        () => window.WishlistKing?.buttons?.refresh?.()\n      ].forEach(run => {\n        try {\n          const result = run();\n          if (result && typeof result.catch === 'function') result.catch(() => {});\n        } catch (e) {}\n      });\n    }, 100);\n  }\n\n  function wmWishlistButtonIsActive(button){\n    if (!button) return false;\n\n    const stateText = [\n      button.getAttribute('aria-label'),\n      button.getAttribute('title'),\n      button.textContent\n    ]\n      .filter(Boolean)\n      .join(' ')\n      .toLowerCase();\n\n    const classList = Array.from(button.classList || []).map(name => name.toLowerCase());\n\n    return (\n      button.getAttribute('aria-pressed') === 'true' ||\n      stateText.includes('remove') ||\n      stateText.includes('added') ||\n      stateText.includes('selected') ||\n      stateText.includes('in wishlist') ||\n      classList.some(name => (\n        name === 'active' ||\n        name === 'is-active' ||\n        name === 'selected' ||\n        name === 'is-selected' ||\n        name === 'wk-active' ||\n        name === 'wk-selected' ||\n        name === 'wk-added'\n      ))\n    );\n  }\n\n  function wmIncrementWishlistCounterOptimistically(){\n    const current = wmReadWishlistCounter();\n    wmSetWishlistCounter(current + 1);\n  }\n\n  function wmReadWishlistCounter(){\n    const counter = document.querySelector('.wk-counter');\n    const count = Number.parseInt((counter && counter.textContent) || '0', 10);\n    return Number.isFinite(count) ? count : 0;\n  }\n\n  function wmSetWishlistCounter(count){\n    document.querySelectorAll('.wk-counter').forEach(counter => {\n      counter.textContent = String(count);\n      counter.style.display = count > 0 ? '' : counter.style.display;\n    });\n  }\n\n  async function wmRefreshWishlistCounter(){\n    if (!(window.WishlistKing && window.WishlistKing._apis && window.WishlistKing._apis.wishlist)) return;\n\n    const result = await window.WishlistKing._apis.wishlist.loadWishlist({ wishlistId: 'mine' });\n    const rawItems =\n      result?.wishlist?.items ||\n      result?.items ||\n      result?.products ||\n      [];\n\n    wmSetWishlistCounter(rawItems.length);\n  }\n\n  function wmScheduleWishlistCounterRefresh(){\n    clearTimeout(window.__wmWishlistCounterRefreshTimer);\n    window.__wmWishlistCounterRefreshTimer = setTimeout(() => {\n      wmRefreshWishlistCounter().catch(() => {});\n    }, 700);\n  }\n\n  function wmSavePendingWishlistAdd(trigger){\n    const slide = trigger?.closest?.('.product-slide') || null;\n    const handle = slide?.getAttribute('data-product-handle') || '';\n    if (!handle) return;\n\n    try {\n      sessionStorage.setItem('wm_pending_wishlist_add', JSON.stringify({\n        productHandle: handle,\n        ts: Date.now()\n      }));\n    } catch (e) {}\n  }\n\n  function wmClearPendingWishlistAdd(){\n    try {\n      sessionStorage.removeItem('wm_pending_wishlist_add');\n    } catch (e) {}\n  }\n\n  function wmGetPendingWishlistAdd(){\n    try {\n      const pending = JSON.parse(sessionStorage.getItem('wm_pending_wishlist_add') || 'null');\n      if (!pending?.productHandle) return null;\n      if (pending.ts && Date.now() - pending.ts > 30 * 60 * 1000) {\n        wmClearPendingWishlistAdd();\n        return null;\n      }\n      return pending;\n    } catch (e) {\n      wmClearPendingWishlistAdd();\n      return null;\n    }\n  }\n\n  async function wmCompletePendingWishlistAdd(){\n    if (!wmCustomerIsLoggedIn()) return;\n\n    const pending = wmGetPendingWishlistAdd();\n    if (!pending?.productHandle || !container) return;\n\n    let slide = container.querySelector(\n      `.product-slide[data-product-handle=\"${CSS.escape(pending.productHandle)}\"]`\n    );\n\n    if (!slide) {\n      const source = wmGetCurrentIndexSource();\n      const targetIndex = source.findIndex((item) => (\n        item?.handle || item?.product_handle\n      ) === pending.productHandle);\n\n      while (!slide && targetIndex >= 0 && window.WM_INDEX_CURSOR <= targetIndex) {\n        const beforeCursor = window.WM_INDEX_CURSOR;\n        await loadNextPage();\n        slide = container.querySelector(\n          `.product-slide[data-product-handle=\"${CSS.escape(pending.productHandle)}\"]`\n        );\n        if (window.WM_INDEX_CURSOR === beforeCursor) break;\n      }\n    }\n\n    const wishlistButton = slide ? await wmWaitForWishlistButton(slide, 3000) : null;\n    if (!wishlistButton) return;\n\n    if (!wmWishlistButtonIsActive(wishlistButton)) {\n      wishlistButton.click();\n      wmIncrementWishlistCounterOptimistically();\n    }\n\n    wmClearPendingWishlistAdd();\n    setTimeout(() => {\n      wmRefreshWishlistCounter().catch(() => {});\n    }, 700);\n  }\n\n  function wmPromptWishlistLoginIfNeeded(options = {}){\n    if (wmCustomerIsLoggedIn()) return;\n    wmShowWishlistLoginModal(options);\n  }\n\n  function wmCustomerIsLoggedIn(){\n    if (window.WM_CUSTOMER_LOGGED_IN === true) return true;\n    if (window.WM_CUSTOMER_AUTH_STATUS && window.WM_CUSTOMER_AUTH_STATUS.authenticated === true) return true;\n    try {\n      return sessionStorage.getItem('wm_customer_auth_confirmed') === '1';\n    } catch(e) {\n      return false;\n    }\n  }\n\n  function wmShowWishlistLoginModal(options = {}){\n    const title = options.title || 'Save your wishlist';\n    const body = options.body || 'Sign in or create an account to save your wishlist and access it whenever you come back.';\n    let modal = document.getElementById('wmWishlistLoginModal');\n    if (!modal) {\n      modal = document.createElement('div');\n      modal.id = 'wmWishlistLoginModal';\n      modal.className = 'wm-wishlist-login-modal';\n      modal.setAttribute('role', 'dialog');\n      modal.setAttribute('aria-modal', 'true');\n      modal.setAttribute('aria-labelledby', 'wmWishlistLoginTitle');\n      modal.innerHTML = `\n        <div class=\"wm-wishlist-login-modal__panel\">\n          <h2 id=\"wmWishlistLoginTitle\">Saved to wishlist</h2>\n          <p>Sign in or create an account to receive back in stock email notifications.</p>\n          <div class=\"wm-wishlist-login-modal__actions\">\n            <button type=\"button\" class=\"wm-wishlist-login-modal__button wm-wishlist-login-modal__button--primary\" data-wm-login-action=\"login\">Log in</button>\n            <button type=\"button\" class=\"wm-wishlist-login-modal__button wm-wishlist-login-modal__button--secondary\" data-wm-login-action=\"signup\">Sign up</button>\n            <button type=\"button\" class=\"wm-wishlist-login-modal__button wm-wishlist-login-modal__button--ghost\" data-wm-login-action=\"close\">Dismiss</button>\n          </div>\n        </div>\n      `;\n      document.body.appendChild(modal);\n\n      modal.addEventListener('click', (event) => {\n        if (event.target === modal) {\n          wmClearPendingWishlistAdd();\n          wmHideWishlistLoginModal();\n          return;\n        }\n\n        const action = event.target.closest('[data-wm-login-action]')?.dataset?.wmLoginAction;\n        if (!action) return;\n\n        if (action === 'close') {\n          wmClearPendingWishlistAdd();\n          wmHideWishlistLoginModal();\n          return;\n        }\n\n        wmSaveFeedReturnState();\n        sessionStorage.setItem('wm_auth_return_pending', '1');\n\n        const returnUrl = new URL(window.location.href);\n        returnUrl.searchParams.set('wm_return', '1');\n        const returnTo = encodeURIComponent(returnUrl.pathname + returnUrl.search);\n\n        window.location.href = '/customer_authentication/login?return_to=' + returnTo;\n      });\n    }\n\n    const titleEl = modal.querySelector('#wmWishlistLoginTitle');\n    const bodyEl = modal.querySelector('.wm-wishlist-login-modal__panel p');\n    if (titleEl) titleEl.textContent = title;\n    if (bodyEl) bodyEl.textContent = body;\n\n    modal.hidden = false;\n    modal.classList.add('is-visible');\n  }\n\n  function wmHideWishlistLoginModal(){\n    const modal = document.getElementById('wmWishlistLoginModal');\n    if (!modal) return;\n    modal.classList.remove('is-visible');\n    modal.hidden = true;\n  }\n  \n  // WM: allow external pages (e.g. wishlist feed) to initialise injected ajax-card slides\n  window.wmInitInjectedSlides = function(root){\n    if (!root) return;\n  \n    const slides = Array.from(root.querySelectorAll('.product-slide'));\n    if (!slides.length) return;\n  \n    initializeSwiperForSlides(slides);\n    slides.forEach(slide => initializeAudioControlsForProduct(slide));\n  \n    wmInitTitleMarquees(root);\n    wmObserveNewMarqueeCards(slides);\n  \n    wmSafariLazyImageFix(root);\n  \n    slides.forEach(slide => {\n      if (window.WM_PRODUCT_IO) WM_PRODUCT_IO.observe(slide);\n    });\n  \n    if (typeof wmHydrateSlidesNearViewport === 'function') {\n      wmHydrateSlidesNearViewport(root);\n    }\n\n    slides.forEach(slide => wmApplyWishlistStockState(slide));\n    if (root === container && typeof wmScheduleDormantRefresh === 'function') {\n      wmScheduleDormantTrim();\n      wmScheduleDormantRefresh();\n    }\n  };\n  \n  async function loadNextPage(){\n    return wmLoadNextIndexBatch();\n  }\n    \n    (async function(){\n      async function wmMirrorWeeklyDigsFeedNavigation(){\n        if (window.WM_FEED_SOURCE !== 'weekly_digs') return;\n\n        const select = document.querySelector('#filterOptions');\n        if (!select || select.dataset.wmMirroredFeedNav === '1') return;\n\n        const sourcePath = String(\n          window.WM_WEEKLY_DIGS_NAV_SOURCE_PATH ||\n          window.WM_RECOMMENDATIONS_COLLECTION_PATH ||\n          '/collections/all-records'\n        ).trim();\n        if (!sourcePath) return;\n\n        function isForYouOption(option){\n          const value = String(option?.value || '').toLowerCase();\n          const label = String(option?.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();\n          return value.includes('recommendations') || label === 'for you';\n        }\n\n        function isWeeklyDigsOption(option){\n          const value = String(option?.value || '').toLowerCase();\n          const label = String(option?.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();\n          return value.includes('weekly-digs') || label === 'weekly digs';\n        }\n\n        function isWeeklyDigsIndexOption(option){\n          const value = String(option?.value || '').toLowerCase();\n          const label = String(option?.textContent || '').replace(/\\s+/g, ' ').trim().toLowerCase();\n          return value.includes('wm_records_index') ||\n            value.includes('wm-records-index') ||\n            label === 'wm_records_index' ||\n            label === 'wm records index';\n        }\n\n        function cloneOption(option){\n          const cloned = option.cloneNode(true);\n          cloned.selected = false;\n          cloned.removeAttribute('selected');\n          return cloned;\n        }\n\n        function appendMirroredOption(parent, option){\n          if (!option || isForYouOption(option) || isWeeklyDigsOption(option) || isWeeklyDigsIndexOption(option)) return;\n          parent.appendChild(cloneOption(option));\n        }\n\n        try {\n          const response = await fetch(sourcePath, { credentials: 'same-origin' });\n          if (!response.ok) return;\n\n          const html = await response.text();\n          const doc = new DOMParser().parseFromString(html, 'text/html');\n          const sourceSelect = doc.querySelector('#filterOptions, [data-wm-grid-feed-select]');\n          if (!sourceSelect) return;\n\n          const current = select.querySelector('option[selected], option');\n          const currentClone = current ? cloneOption(current) : document.createElement('option');\n          currentClone.value = window.location.pathname;\n          currentClone.textContent = 'Weekly Digs';\n          currentClone.dataset.wmPromoted = 'true';\n          currentClone.dataset.wmSubtitle = currentClone.dataset.wmSubtitle || '20 records picked around your taste';\n          currentClone.selected = true;\n          currentClone.setAttribute('selected', 'selected');\n\n          const fragment = document.createDocumentFragment();\n          fragment.appendChild(currentClone);\n\n          Array.from(sourceSelect.children).forEach(child => {\n            if (child.tagName === 'OPTGROUP') {\n              const group = document.createElement('optgroup');\n              group.label = child.label || '';\n              Array.from(child.querySelectorAll('option')).forEach(option => appendMirroredOption(group, option));\n              if (group.querySelector('option')) fragment.appendChild(group);\n              return;\n            }\n\n            if (child.tagName === 'OPTION') appendMirroredOption(fragment, child);\n          });\n\n          select.innerHTML = '';\n          select.appendChild(fragment);\n          select.dataset.wmMirroredFeedNav = '1';\n        } catch (err) {\n          console.warn('[WM] Weekly Digs feed navigation mirror failed', err);\n        }\n      }\n\n      await wmMirrorWeeklyDigsFeedNavigation();\n      const selects = Array.from(document.querySelectorAll('#filterOptions, #sortOptions'));\n      if (!selects.length) return;\n\n      const openControls = new Set();\n\n      function cleanText(value){\n        return String(value || '').replace(/\\s+/g, ' ').trim();\n      }\n\n      function normaliseLabel(value){\n        const text = cleanText(value);\n        return text || 'Select';\n      }\n\n      function getKind(select){\n        return select.id === 'sortOptions' ? 'sort' : 'feed';\n      }\n\n      function noteFor(kind){\n        if (kind === 'sort' && window.WM_FEED_SOURCE === 'recommendations') {\n          return \"Sort options are unavailable whilst browsing 'For You'.\";\n        }\n        if (kind === 'sort' && window.WM_FEED_SOURCE === 'weekly_digs') {\n          return \"20 records we've picked for you, based on your taste. Refreshed weekly.\";\n        }\n        return '';\n      }\n\n      function subtitleFor(kind, group, label, value, option){\n        const key = normaliseLabel(label).toLowerCase();\n        const isPromoted = option?.dataset?.wmPromoted === 'true' || key === 'for you';\n        const customSubtitle = cleanText(option?.dataset?.wmSubtitle || '');\n        if (customSubtitle && (kind !== 'feed' || isPromoted)) return customSubtitle;\n\n        if (kind === 'sort') return '';\n\n        if (key === 'for you') return 'Personalised selections based on your taste';\n        return '';\n      }\n\n      function optionLabel(option){\n        return normaliseLabel(option.textContent);\n      }\n\n      function selectedOption(select){\n        return select.options[select.selectedIndex] || select.querySelector('option');\n      }\n\n      function selectedGroup(select){\n        const option = selectedOption(select);\n        const parent = option?.parentElement;\n        return parent && parent.tagName === 'OPTGROUP' ? parent.label : '';\n      }\n\n      function setGlobalPlayerBehindDropdown(isOpen){\n        document.querySelectorAll('.wm-grid-global-player').forEach(player => {\n          if (isOpen) {\n            if (!player.dataset.wmSelectPreviousZIndex) {\n              player.dataset.wmSelectPreviousZIndex = player.style.zIndex || '__empty__';\n              player.dataset.wmSelectPreviousPointerEvents = player.style.pointerEvents || '__empty__';\n            }\n            player.style.setProperty('z-index', '1', 'important');\n            player.style.setProperty('pointer-events', 'none', 'important');\n            return;\n          }\n\n          const previousZIndex = player.dataset.wmSelectPreviousZIndex;\n          const previousPointerEvents = player.dataset.wmSelectPreviousPointerEvents;\n          if (previousZIndex) {\n            if (previousZIndex === '__empty__') {\n              player.style.removeProperty('z-index');\n            } else {\n              player.style.setProperty('z-index', previousZIndex);\n            }\n          }\n          if (previousPointerEvents) {\n            if (previousPointerEvents === '__empty__') {\n              player.style.removeProperty('pointer-events');\n            } else {\n              player.style.setProperty('pointer-events', previousPointerEvents);\n            }\n          }\n          delete player.dataset.wmSelectPreviousZIndex;\n          delete player.dataset.wmSelectPreviousPointerEvents;\n        });\n      }\n\n      function closeControl(control){\n        if (!control) return;\n        control.classList.remove('is-open');\n        const button = control.querySelector('.wm-select__button');\n        const panel = control.querySelector('.wm-select__panel');\n        if (button) button.setAttribute('aria-expanded', 'false');\n        if (panel) panel.hidden = true;\n        openControls.delete(control);\n        const bar = control.closest('.sorting-bar');\n        if (bar && !bar.querySelector('.wm-select.is-open')) {\n          bar.classList.remove('wm-select-menu-open');\n        }\n        if (!document.querySelector('.sorting-bar .wm-select.is-open')) {\n          setGlobalPlayerBehindDropdown(false);\n        }\n      }\n\n      function closeAll(except){\n        Array.from(openControls).forEach(control => {\n          if (control !== except) closeControl(control);\n        });\n      }\n\n      function openControl(control){\n        if (!control) return;\n        closeAll(control);\n        control.classList.add('is-open');\n        control.closest('.sorting-bar')?.classList.add('wm-select-menu-open');\n        setGlobalPlayerBehindDropdown(true);\n        const button = control.querySelector('.wm-select__button');\n        const panel = control.querySelector('.wm-select__panel');\n        if (button) button.setAttribute('aria-expanded', 'true');\n        if (panel) panel.hidden = false;\n        openControls.add(control);\n      }\n\n      function selectValue(select, value){\n        if (select.value === value) return;\n        select.value = value;\n        select.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n\n      function isPromotedFeedOption(option){\n        if (!option) return false;\n        return option.dataset.wmPromoted === 'true' || optionLabel(option).toLowerCase() === 'for you';\n      }\n\n      function buildSections(select){\n        const kind = getKind(select);\n        if (kind === 'sort' && window.WM_FEED_SOURCE === 'weekly_digs') return [];\n\n        const sections = [];\n        const promoted = [];\n        let looseSection = null;\n\n        function pushOption(section, option){\n          if (kind === 'feed' && isPromotedFeedOption(option)) {\n            promoted.push(option);\n          } else {\n            section.options.push(option);\n          }\n        }\n\n        Array.from(select.children).forEach(child => {\n          if (child.tagName === 'OPTGROUP') {\n            const section = { label: child.label || '', options: [] };\n            Array.from(child.querySelectorAll('option')).forEach(option => pushOption(section, option));\n            sections.push(section);\n            return;\n          }\n\n          if (child.tagName === 'OPTION') {\n            looseSection = looseSection || { label: '', options: [] };\n            pushOption(looseSection, child);\n          }\n        });\n\n        if (looseSection && looseSection.options.length) {\n          sections.unshift(looseSection);\n        }\n\n        const filteredSections = sections.filter(section => section.options.length);\n        if (promoted.length) {\n          filteredSections.unshift({ label: 'For You', options: promoted, promoted: true });\n        }\n\n        return filteredSections;\n      }\n\n      function refreshControl(select, control){\n        const kind = getKind(select);\n        const current = selectedOption(select);\n        const currentLabel = optionLabel(current);\n        const group = selectedGroup(select);\n        const subtitle = subtitleFor(kind, group, currentLabel, current?.value || '', current);\n\n        control.querySelector('.wm-select__value').textContent = currentLabel;\n        const currentValue = control.querySelector('.wm-select__current-value');\n        const currentSubtitle = control.querySelector('.wm-select__current-subtitle');\n        if (currentValue) currentValue.textContent = currentLabel;\n        if (currentSubtitle) currentSubtitle.textContent = subtitle;\n\n        control.querySelectorAll('.wm-select__option').forEach(button => {\n          const isSelected = button.dataset.value === select.value;\n          button.classList.toggle('is-selected', isSelected);\n          button.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n        });\n      }\n\n      function enhanceSelect(select){\n        if (!select || select.dataset.wmEnhanced === '1') return;\n\n        const kind = getKind(select);\n        const control = document.createElement('div');\n        control.className = 'wm-select';\n        control.dataset.wmSelectKind = kind;\n\n        const button = document.createElement('button');\n        button.className = 'wm-select__button';\n        button.type = 'button';\n        button.setAttribute('aria-haspopup', 'listbox');\n        button.setAttribute('aria-expanded', 'false');\n        button.innerHTML = '<span class=\"wm-select__button-main\"><span class=\"wm-select__value\"></span></span><svg class=\"wm-select__chevron\" viewBox=\"0 0 13 8\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M1 1l5.5 5L12 1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\n        const panel = document.createElement('div');\n        panel.className = 'wm-select__panel';\n        panel.hidden = true;\n        panel.setAttribute('role', 'listbox');\n\n        const panelNote = noteFor(kind);\n        if (panelNote) {\n          const note = document.createElement('div');\n          note.className = 'wm-select__note';\n          note.textContent = panelNote;\n          panel.appendChild(note);\n        }\n\n        buildSections(select).forEach(section => {\n          const sectionEl = document.createElement('div');\n          sectionEl.className = section.promoted ? 'wm-select__section wm-select__section--promoted' : 'wm-select__section';\n          if (section.label && !section.promoted) {\n            const sectionLabel = document.createElement('div');\n            sectionLabel.className = 'wm-select__section-label';\n            sectionLabel.textContent = section.label;\n            sectionEl.appendChild(sectionLabel);\n          }\n\n          section.options.forEach(option => {\n            const label = optionLabel(option);\n            const row = document.createElement('button');\n            row.className = section.promoted ? 'wm-select__option wm-select__option--promoted' : 'wm-select__option';\n            row.type = 'button';\n            row.dataset.value = option.value;\n            row.setAttribute('role', 'option');\n            row.innerHTML = '<span class=\"wm-select__check\" aria-hidden=\"true\">\u2713</span><span><span class=\"wm-select__option-title\"></span><span class=\"wm-select__option-subtitle\"></span></span>';\n            row.querySelector('.wm-select__option-title').textContent = label;\n            const subtitleEl = row.querySelector('.wm-select__option-subtitle');\n            const subtitle = subtitleFor(kind, section.label, label, option.value, option);\n            subtitleEl.textContent = subtitle;\n            subtitleEl.hidden = !subtitle;\n            row.addEventListener('click', () => {\n              selectValue(select, option.value);\n              refreshControl(select, control);\n              closeControl(control);\n            });\n            sectionEl.appendChild(row);\n          });\n\n          panel.appendChild(sectionEl);\n        });\n\n        let sheetTouchStartY = 0;\n        let sheetPullDistance = 0;\n        let sheetPullActive = false;\n\n        panel.addEventListener('touchstart', event => {\n          if (!window.matchMedia('(max-width: 767px)').matches) return;\n          sheetTouchStartY = event.touches && event.touches[0] ? event.touches[0].clientY : 0;\n          sheetPullDistance = 0;\n          sheetPullActive = panel.scrollTop <= 0;\n        }, { passive: true });\n\n        panel.addEventListener('touchmove', event => {\n          event.stopPropagation();\n          if (!window.matchMedia('(max-width: 767px)').matches || !sheetPullActive) return;\n          const currentY = event.touches && event.touches[0] ? event.touches[0].clientY : sheetTouchStartY;\n          sheetPullDistance = Math.max(0, currentY - sheetTouchStartY);\n          if (panel.scrollTop <= 0 && sheetPullDistance > 0) {\n            event.preventDefault();\n            panel.style.transform = `translateY(${Math.min(sheetPullDistance * 0.58, 86)}px)`;\n          }\n        }, { passive: false });\n\n        panel.addEventListener('touchend', () => {\n          if (sheetPullActive && panel.scrollTop <= 0 && sheetPullDistance > 76) {\n            panel.style.transform = 'translateY(110%)';\n            window.setTimeout(() => {\n              closeControl(control);\n              panel.style.transform = '';\n            }, 140);\n          } else {\n            panel.style.transform = '';\n          }\n          sheetTouchStartY = 0;\n          sheetPullDistance = 0;\n          sheetPullActive = false;\n        }, { passive: true });\n\n        panel.addEventListener('touchcancel', () => {\n          sheetTouchStartY = 0;\n          sheetPullDistance = 0;\n          sheetPullActive = false;\n          panel.style.transform = '';\n        }, { passive: true });\n\n        panel.addEventListener('wheel', event => event.stopPropagation(), { passive: true });\n\n        control.appendChild(button);\n        control.appendChild(panel);\n        select.insertAdjacentElement('afterend', control);\n        select.classList.add('wm-native-select-enhanced');\n        select.dataset.wmEnhanced = '1';\n\n        button.addEventListener('click', event => {\n          event.stopPropagation();\n          if (control.classList.contains('is-open')) {\n            closeControl(control);\n          } else {\n            openControl(control);\n          }\n        });\n\n        select.addEventListener('change', () => refreshControl(select, control));\n        refreshControl(select, control);\n      }\n\n      selects.forEach(enhanceSelect);\n\n      document.addEventListener('click', event => {\n        if (!event.target.closest('.wm-select')) closeAll();\n      });\n\n      document.addEventListener('keydown', event => {\n        if (event.key === 'Escape') closeAll();\n      });\n    })();\n\n    (function(){\n    const btn = document.querySelector('.wm-feed-menu-btn');\n    const menu = document.getElementById('wmFeedMenu');\n    const backdrop = document.getElementById('wmFeedMenuBackdrop');\n    const closeBtn = document.getElementById('wmFeedMenuClose');\n  \n    const wmTogglePreorders = document.getElementById('wmTogglePreorders');\n  \n    const gridUrlEl = document.getElementById('wmGridUrl');\n    const viewRadios = menu ? menu.querySelectorAll('input[name=\"wm_view\"]') : [];\n    const wmGridViewAction = document.getElementById('wmGridViewAction');\n    const wmGridUrl = document.getElementById('wmGridUrl');\n  \n    const hasMenuUi = !!(btn && menu && backdrop);\n  \n    const WM_PREORDER_STORAGE_KEY = 'wm_show_preorders';\n    let WM_SHOW_PREORDERS = true;\n  \n    function wmGetSavedPreorderSetting(){\n      try {\n        const saved = localStorage.getItem(WM_PREORDER_STORAGE_KEY);\n        if (saved === '0') return false;\n        if (saved === '1') return true;\n      } catch (e) {}\n      return true;\n    }\n  \n    function wmSavePreorderSetting(value){\n      try {\n        localStorage.setItem(WM_PREORDER_STORAGE_KEY, value ? '1' : '0');\n      } catch (e) {}\n    }\n  \n    \n  \n    function wmGetActiveSort(){\n      try {\n        const params = new URLSearchParams(window.location.search);\n        return params.get('sort_by') || container?.dataset?.sortBy || 'created-descending';\n      } catch (e) {\n        return container?.dataset?.sortBy || 'created-descending';\n      }\n    }\n\n    function wmParseIndexDate(value){\n      if (!value) return 0;\n\n      if (typeof value === 'string' || value instanceof String) {\n        const parsed = new Date(value).getTime();\n        return Number.isFinite(parsed) ? parsed : 0;\n      }\n\n      if (Array.isArray(value) && value.length >= 6) {\n        const seconds = Number(value[0]) || 0;\n        const minutes = Number(value[1]) || 0;\n        const hours = Number(value[2]) || 0;\n        const day = Number(value[3]) || 1;\n        const month = (Number(value[4]) || 1) - 1;\n        const year = Number(value[5]) || 1970;\n\n        return Date.UTC(year, month, day, hours, minutes, seconds);\n      }\n\n      if (typeof value === 'number') {\n        return Number.isFinite(value) ? value : 0;\n      }\n\n      return 0;\n    }\n\n    function wmBuildActiveCollectionIndex(){\n      const full = Array.isArray(window.WM_COLLECTION_INDEX) ? window.WM_COLLECTION_INDEX : [];\n      const availablePool = window.WM_FEED_SOURCE === 'wishlist'\n        ? full.slice()\n        : full.filter(item => !wmIsUnavailableIndexItem(item));\n      const filtered = WM_SHOW_PREORDERS ? availablePool.slice() : availablePool.filter(item => !wmIsPreorderIndexItem(item));\n      const activeSort = wmGetActiveSort();\n\n      if (activeSort === 'created-descending') {\n        filtered.sort((a, b) => {\n          const timeA = wmParseIndexDate(a?.stock_movement_at || a?.created_at || null);\n          const timeB = wmParseIndexDate(b?.stock_movement_at || b?.created_at || null);\n\n          return timeB - timeA;\n        });\n      } else if (activeSort === 'release-date-desc' || activeSort === 'release-date-asc') {\n        filtered.sort((a, b) => {\n          const timeA = wmParseIndexDate(a?.release_date || null);\n          const timeB = wmParseIndexDate(b?.release_date || null);\n          const missingA = timeA <= 0;\n          const missingB = timeB <= 0;\n\n          if (missingA && missingB) return 0;\n          if (missingA) return 1;\n          if (missingB) return -1;\n          return activeSort === 'release-date-asc' ? (timeA - timeB) : (timeB - timeA);\n        });\n      }\n\n      const pinnedHandle = wmShouldPrioritizePinnedHandle() ? wmGetPinnedHandleFromUrl() : '';\n\n      if (pinnedHandle) {\n        const pinnedIndex = filtered.findIndex(item => (item?.handle || item?.product_handle) === pinnedHandle);\n\n        if (pinnedIndex > 0) {\n          const [pinnedItem] = filtered.splice(pinnedIndex, 1);\n          filtered.unshift(pinnedItem);\n        } else if (pinnedIndex === -1 && window.WM_FEED_SOURCE !== 'wishlist') {\n          filtered.unshift(wmPinnedFallbackItem(pinnedHandle));\n        }\n      }\n\n      if (!wmIsShuffleMode()) return filtered;\n\n      for (let i = filtered.length - 1; i > 0; i--) {\n        const j = Math.floor(Math.random() * (i + 1));\n        [filtered[i], filtered[j]] = [filtered[j], filtered[i]];\n      }\n\n      if (pinnedHandle) {\n        const pinnedIndex = filtered.findIndex(item => (item?.handle || item?.product_handle) === pinnedHandle);\n\n        if (pinnedIndex > 0) {\n          const [pinnedItem] = filtered.splice(pinnedIndex, 1);\n          filtered.unshift(pinnedItem);\n        }\n      }\n\n      return filtered;\n    }\n\n    function wmCaptureFeedAnchor(){\n      if (!container) return null;\n\n      const anchorSlide = mostVisibleProductSlide();\n      const source = wmGetCurrentIndexSource();\n      const handle = anchorSlide?.dataset?.productHandle || null;\n      const anchorIndex = handle\n        ? source.findIndex(item => (item?.handle || item?.product_handle) === handle)\n        : -1;\n\n      return {\n        handle,\n        anchorIndex,\n        offsetInSlide: anchorSlide ? (container.scrollTop - anchorSlide.offsetTop) : 0\n      };\n    }\n\n    async function wmRestoreFeedAnchor(anchor){\n      if (!anchor || !container) return;\n\n      const source = wmGetCurrentIndexSource();\n      if (!source.length) {\n        container.scrollTop = 0;\n        return;\n      }\n\n      let targetHandle = anchor.handle;\n      const stillExists = targetHandle && source.some(item => (item?.handle || item?.product_handle) === targetHandle);\n\n      if (!stillExists) {\n        const fallbackIndex = Math.max(0, Math.min(anchor.anchorIndex, source.length - 1));\n        const fallbackItem = source[fallbackIndex];\n        targetHandle = fallbackItem && (fallbackItem.handle || fallbackItem.product_handle);\n      }\n\n      if (!targetHandle) {\n        container.scrollTop = 0;\n        return;\n      }\n\n      let target = container.querySelector(`.product-slide[data-product-handle=\"${CSS.escape(targetHandle)}\"]`);\n\n      while (!target && window.WM_INDEX_CURSOR < source.length) {\n        await loadNextPage();\n        target = container.querySelector(`.product-slide[data-product-handle=\"${CSS.escape(targetHandle)}\"]`);\n      }\n\n      if (target && target.dataset.wmDormant === '1') {\n        await wmHydrateDormantProductSlide(target);\n      }\n\n      const top = target ? (target.offsetTop + (anchor.offsetInSlide || 0)) : 0;\n\n      requestAnimationFrame(() => {\n        container.scrollTop = top;\n        setTimeout(() => { container.scrollTop = top; }, 60);\n        setTimeout(() => { container.scrollTop = top; }, 180);\n      });\n    }\n  \n    async function wmRebuildFeedFromIndex(options = {}){\n      const preserveAnchor = options.preserveAnchor !== false;\n      const resetToTop = options.resetToTop !== false;\n      await wmWaitForCollectionIndex();\n      if (\n        (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') &&\n        window.WM_RECOMMENDATIONS_READY &&\n        typeof window.WM_RECOMMENDATIONS_READY.then === 'function'\n      ) {\n        await window.WM_RECOMMENDATIONS_READY.catch(() => {});\n      }\n\n      if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n        const indexReady = Array.isArray(window.WM_COLLECTION_INDEX) && window.WM_COLLECTION_INDEX.length > 0;\n        const hasRenderedSlides = !!(container && container.querySelector('.product-slide[data-product-handle]'));\n\n        if (!indexReady && hasRenderedSlides) {\n          if (loadingIndicator) loadingIndicator.style.display = 'none';\n          console.warn('WM index rebuild skipped because collection index is empty; keeping server-rendered slides.');\n          document.documentElement.classList.remove('wm-prepinned');\n          return;\n        }\n      }\n\n      const anchor = preserveAnchor ? wmCaptureFeedAnchor() : null;\n  \n      if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n        window.WM_ACTIVE_COLLECTION_INDEX = wmBuildActiveCollectionIndex();\n      }\n      window.WM_INDEX_CURSOR = 0;\n  \n      try {\n        if (WM_PLAYER) {\n          WM_AUDIO_REQUEST_ID += 1;\n          WM_PLAYER.pause();\n          WM_PLAYER.currentTime = 0;\n        }\n      } catch (e) {}\n  \n      container.querySelectorAll('.product-slide').forEach(el => {\n        wmDestroyProductSlideRuntime(el);\n        el.remove();\n      });\n  \n      if (typeof WM_SPECIAL !== 'undefined') {\n        WM_SPECIAL.inserted = new Set();\n        WM_SPECIAL.productCount = 0;\n      }\n\n      if (endMessage) endMessage.style.display = 'none';\n      await loadNextPage();\n      wmDedupeRenderedProductSlides(wmGetPinnedHandleFromUrl());\n      wmEnsureFilterPills(container);\n      if (preserveAnchor) {\n        await wmRestoreFeedAnchor(anchor);\n      } else if (resetToTop) {\n        requestAnimationFrame(() => {\n          container.scrollTop = 0;\n          setTimeout(() => { container.scrollTop = 0; }, 60);\n          setTimeout(() => { container.scrollTop = 0; }, 180);\n        });\n      }\n      document.documentElement.classList.remove('wm-prepinned');\n    }\n  \n    async function wmSetPreorderVisibility(showPreorders){\n      WM_SHOW_PREORDERS = !!showPreorders;\n      wmSavePreorderSetting(WM_SHOW_PREORDERS);\n      await wmRebuildFeedFromIndex();\n    }\n  \n    function openMenu(){\n      if (!hasMenuUi) return;\n      menu.hidden = false;\n      backdrop.hidden = false;\n      btn.setAttribute('aria-expanded', 'true');\n    }\n  \n    function closeMenu(){\n      if (!hasMenuUi) return;\n      menu.hidden = true;\n      backdrop.hidden = true;\n      btn.setAttribute('aria-expanded', 'false');\n    }\n  \n    function currentIsGrid(){\n      try {\n        const u = new URL(window.location.href);\n        return u.searchParams.get('view') === 'grid' || u.searchParams.get('wm_view') === 'grid';\n      } catch(e){\n        return false;\n      }\n    }\n\n    function wmBuildGridUrlFromActiveState(){\n      const fallback = wmGridUrl?.href || gridUrlEl?.href || window.location.href;\n      const url = new URL(fallback, window.location.origin);\n      const current = new URL(window.location.href);\n      const filterSource = container?.dataset?.wmFilterSource || '';\n      const filterValue = container?.dataset?.wmFilterValue || '';\n\n      const sortBy = current.searchParams.get('sort_by') || container?.dataset?.sortBy || '';\n      const artist = current.searchParams.get('artist') || (filterSource === 'artist' ? filterValue : '');\n      const label = current.searchParams.get('label') || (filterSource === 'label' ? filterValue : '');\n\n      if (sortBy && window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n        url.searchParams.set('sort_by', sortBy);\n      }\n      if (artist) url.searchParams.set('artist', artist);\n      if (label) url.searchParams.set('label', label);\n\n      ['p', 'wm_return'].forEach((key) => {\n        const value = current.searchParams.get(key);\n        if (value) url.searchParams.set(key, value);\n      });\n\n      if (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') {\n        url.searchParams.delete('view');\n        url.searchParams.set('wm_view', 'grid');\n      } else {\n        url.searchParams.delete('wm_view');\n        url.searchParams.set('view', 'grid');\n      }\n\n      return url.toString();\n    }\n\n    function wmNavigateToGridView(){\n      window.location.href = wmBuildGridUrlFromActiveState();\n    }\n  \n    if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n      window.WM_ACTIVE_COLLECTION_INDEX = Array.isArray(window.WM_COLLECTION_INDEX) ? window.WM_COLLECTION_INDEX : [];\n    }\n  \n    WM_SHOW_PREORDERS = wmGetSavedPreorderSetting();\n    if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n      window.WM_ACTIVE_COLLECTION_INDEX = wmBuildActiveCollectionIndex();\n    }\n  \n    if (wmTogglePreorders) {\n      wmTogglePreorders.checked = WM_SHOW_PREORDERS;\n      wmTogglePreorders.addEventListener('change', async function () {\n        await wmSetPreorderVisibility(!!wmTogglePreorders.checked);\n      });\n    }\n  \n    (async function(){\n      await wmWaitForCollectionIndex();\n      if (window.WM_FEED_SOURCE !== 'recommendations' && window.WM_FEED_SOURCE !== 'weekly_digs') {\n        window.WM_ACTIVE_COLLECTION_INDEX = wmBuildActiveCollectionIndex();\n      }\n  \n      const isWishlistFeed = window.WM_FEED_SOURCE === 'wishlist';\n      const isRecommendationsFeed = window.WM_FEED_SOURCE === 'recommendations';\n      const isWeeklyDigsFeed = window.WM_FEED_SOURCE === 'weekly_digs';\n      const activeSort = wmGetActiveSort();\n      const needsNewestRebuild = activeSort === 'created-descending';\n      const needsReleaseDateRebuild = activeSort === 'release-date-desc' || activeSort === 'release-date-asc';\n      const hasPendingReturn = !!WM_PENDING_RETURN || WM_RETURN_RESTORE_ACTIVE;\n      const hasPinnedLink = wmShouldPrioritizePinnedHandle();\n  \n      if (hasPendingReturn) {\n        return;\n      }\n\n      if (!isRecommendationsFeed && !isWeeklyDigsFeed && hasPinnedLink) {\n        await wmRebuildFeedFromIndex({ preserveAnchor: false, resetToTop: true });\n      } else if (isWishlistFeed || (!isRecommendationsFeed && !isWeeklyDigsFeed && !WM_SHOW_PREORDERS)) {\n        await wmRebuildFeedFromIndex();\n      } else if (!isRecommendationsFeed && !isWeeklyDigsFeed && (needsNewestRebuild || needsReleaseDateRebuild)) {\n        await wmRebuildFeedFromIndex({ preserveAnchor: false, resetToTop: false });\n      }\n    })();\n  \n    if (hasMenuUi && wmGridViewAction && wmGridUrl) {\n      wmGridViewAction.addEventListener('click', function () {\n        wmNavigateToGridView();\n      });\n    }\n\n    document.querySelectorAll('.wm-view-toggle-btn').forEach((viewToggle) => {\n      viewToggle.addEventListener('click', function(event){\n        if (currentIsGrid()) return;\n        event.preventDefault();\n        wmNavigateToGridView();\n      });\n    });\n  \n    if (hasMenuUi) {\n      btn.addEventListener('click', openMenu);\n      backdrop.addEventListener('click', closeMenu);\n      if (closeBtn) closeBtn.addEventListener('click', closeMenu);\n  \n      const isGrid = currentIsGrid();\n      viewRadios.forEach((r) => {\n        r.checked = (r.value === (isGrid ? 'grid' : 'scroll'));\n      });\n  \n      viewRadios.forEach((radio) => {\n        radio.addEventListener('change', function(){\n          if (!radio.checked) return;\n  \n          try {\n            const u = new URL(window.location.href);\n  \n            if (radio.value === 'grid') {\n              if (gridUrlEl) {\n                wmNavigateToGridView();\n              } else if (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') {\n                u.searchParams.set('view', 'recommendations');\n                u.searchParams.set('wm_view', 'grid');\n                u.searchParams.delete('sort_by');\n                window.location.href = u.toString();\n              } else {\n                u.searchParams.set('view', 'grid');\n                window.location.href = u.toString();\n              }\n            } else {\n              u.searchParams.delete('wm_view');\n              if (window.WM_FEED_SOURCE === 'recommendations' || window.WM_FEED_SOURCE === 'weekly_digs') {\n                u.searchParams.set('view', 'recommendations');\n                u.searchParams.delete('sort_by');\n              } else {\n                u.searchParams.delete('view');\n              }\n              window.location.href = u.pathname + (u.searchParams.toString() ? '?' + u.searchParams.toString() : '');\n            }\n          } catch(e){}\n  \n          closeMenu();\n        });\n      });\n    }\n  })();\n    \n  \n  \n    });\n"],
  "mappings": "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",
  "names": ["btn", "io", "container", "WM_IS_APP", "WM_PRODUCT_IO", "WM_AUTOBOOT_ALLOWED", "totalPages", "initializeSwiperForSlides", "initializeAudioControlsForProduct", "wmInitTitleMarquees", "wmObserveNewMarqueeCards", "WM_IS_IOS", "wmGetCurrentIndexSource", "wmApplyPinnedStockState", "wmGetAnchorSlide", "sortBy", "mostVisibleProductSlide", "slideObservers", "wmApplyWishlistStockState", "target", "WM_ACTIVE_PRODUCT", "wmAutoplayProduct", "wmEnsureFilterPills", "pinnedHandle", "wmFetchIndexCardHtml", "wmBuildSlideFromIndexHtml", "handle", "cartText", "loadingText"]
}
