{"version":3,"file":"beefbar-media.js","names":["document","addEventListener","wrappers","querySelectorAll","isMobile","window","matchMedia","matches","isSafari","test","navigator","userAgent","length","usesSafariFallback","wrapper","hasAttribute","showFallback","fallback","querySelector","dataset","beefbarFallbackInitialised","activateFallback","classList","remove","add","complete","naturalWidth","once","loading","src","loadAnimation","video","source","playAnimation","play","then","catch","beefbarAnimationInitialised","readyState","HTMLMediaElement","HAVE_FUTURE_DATA","load","scheduleAnimation","callback","requestIdleCallback","timeout","setTimeout","deferredWrappers","forEach","immediate","Boolean","push","observer","IntersectionObserver","entries","entry","_entry$target$querySe","isIntersecting","target","unobserve","pause","rootMargin","observe","wrappers","isMobile","isSafari","usesSafariFallback","wrapper","showFallback","fallback","activateFallback","loadAnimation","video","source","playAnimation","scheduleAnimation","callback","deferredWrappers","immediate","observer","entries","_entry$target$querySe","entry"],"sources":["../resources/modern-javascript/beefbar-media.js"],"sourcesContent":["document.addEventListener('DOMContentLoaded', () => {\n    const wrappers = document.querySelectorAll(\n        '[data-beefbar-animation-wrapper]'\n    );\n    const isMobile = window.matchMedia('(max-width: 34.375em)').matches;\n    const isSafari =\n        /Safari/i.test(navigator.userAgent) &&\n        !/Chrome|Chromium|Android/i.test(navigator.userAgent);\n\n    if (\n        !wrappers.length ||\n        window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    ) {\n        return;\n    }\n\n    /**\n     * Use animated WebP when Safari cannot preserve transparent WebM video.\n     */\n    const usesSafariFallback = wrapper =>\n        isSafari && wrapper.hasAttribute('data-beefbar-transparent-animation');\n\n    /**\n     * Show the animated WebP when the preferred video cannot be played.\n     */\n    const showFallback = wrapper => {\n        const fallback = wrapper.querySelector(\n            '[data-beefbar-animation-fallback]'\n        );\n\n        if (!fallback || fallback.dataset.beefbarFallbackInitialised) {\n            return;\n        }\n\n        fallback.dataset.beefbarFallbackInitialised = 'true';\n\n        const activateFallback = () => {\n            wrapper.classList.remove('beefbar-media--motion-ready');\n            wrapper.classList.add('beefbar-media--motion-fallback');\n        };\n\n        if (fallback.complete && fallback.naturalWidth) {\n            activateFallback();\n            return;\n        }\n\n        fallback.addEventListener('load', activateFallback, { once: true });\n        fallback.addEventListener(\n            'error',\n            () => {\n                // Leave the static poster visible when the fallback cannot load.\n            },\n            { once: true }\n        );\n\n        fallback.loading = 'eager';\n\n        if (!fallback.src) {\n            fallback.src = fallback.dataset.src;\n        }\n    };\n\n    /**\n     * Add the deferred source and start an animation.\n     */\n    const loadAnimation = wrapper => {\n        const video = wrapper.querySelector('[data-beefbar-animation]');\n        const source = video?.querySelector('source[data-src]');\n\n        if (!video || !source) {\n            return;\n        }\n\n        const playAnimation = () => {\n            video\n                .play()\n                .then(() => {\n                    wrapper.classList.remove(\n                        'beefbar-media--motion-fallback'\n                    );\n                    wrapper.classList.add('beefbar-media--motion-ready');\n                })\n                .catch(() => showFallback(wrapper));\n        };\n\n        if (video.dataset.beefbarAnimationInitialised) {\n            if (video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA) {\n                playAnimation();\n            }\n            return;\n        }\n\n        video.dataset.beefbarAnimationInitialised = 'true';\n        video.addEventListener('canplay', playAnimation, { once: true });\n        video.addEventListener('error', () => showFallback(wrapper), {\n            once: true,\n        });\n        source.src = source.dataset.src;\n        video.load();\n    };\n\n    /**\n     * Start decorative motion when the browser has idle time after first paint.\n     */\n    const scheduleAnimation = callback => {\n        if (typeof window.requestIdleCallback === 'function') {\n            window.requestIdleCallback(callback, { timeout: 1200 });\n            return;\n        }\n\n        window.setTimeout(callback, 100);\n    };\n\n    const deferredWrappers = [];\n\n    wrappers.forEach(wrapper => {\n        if (isMobile && wrapper.hasAttribute('data-beefbar-desktop-only')) {\n            return;\n        }\n\n        const immediate = Boolean(\n            wrapper.querySelector('[data-beefbar-animation-immediate]')\n        );\n\n        if (usesSafariFallback(wrapper)) {\n            if (immediate) {\n                showFallback(wrapper);\n                return;\n            }\n\n            deferredWrappers.push(wrapper);\n            return;\n        }\n\n        if (immediate) {\n            scheduleAnimation(() => loadAnimation(wrapper));\n            return;\n        }\n\n        deferredWrappers.push(wrapper);\n    });\n\n    if (!deferredWrappers.length) {\n        return;\n    }\n\n    const observer = new IntersectionObserver(\n        entries => {\n            entries.forEach(entry => {\n                if (entry.isIntersecting) {\n                    if (usesSafariFallback(entry.target)) {\n                        showFallback(entry.target);\n                        observer.unobserve(entry.target);\n                        return;\n                    }\n\n                    loadAnimation(entry.target);\n                    return;\n                }\n\n                if (!usesSafariFallback(entry.target)) {\n                    entry.target\n                        .querySelector('[data-beefbar-animation]')\n                        ?.pause();\n                }\n            });\n        },\n        { rootMargin: isMobile ? '100px 0px' : '300px 0px' }\n    );\n\n    deferredWrappers.forEach(wrapper => observer.observe(wrapper));\n});\n"],"mappings":"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"}