UNPKG

natura11y

Version:

Natura11y is an open-source design system for creating beautiful web interfaces with a focus on accessible interaction design and front-end development.

72 lines (60 loc) 2.4 kB
export default class Backdrop { // Private properties #backdropVideoList = document.querySelectorAll('.backdrop:has(video)'); #reducedMotionMediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)'); // Private methods #togglePlayPause(videoElement, controlButton) { const icon = controlButton.querySelector('.icon'); if (videoElement.paused) { videoElement.play(); this.#updateControlState(icon, controlButton, 'pause'); } else { videoElement.pause(); this.#updateControlState(icon, controlButton, 'play'); } } #applyReducedMotionPreference(videoElement, controlButton) { if (controlButton.hasAttribute('data-check-reduced-motion')) { const icon = controlButton.querySelector('.icon'); if (this.#reducedMotionMediaQuery.matches) { videoElement.pause(); this.#updateControlState(icon, controlButton, 'play'); } else { videoElement.play(); this.#updateControlState(icon, controlButton, 'pause'); } this.#reducedMotionMediaQuery.addEventListener('change', () => { if (this.#reducedMotionMediaQuery.matches) { videoElement.pause(); this.#updateControlState(icon, controlButton, 'play'); } else { videoElement.play(); this.#updateControlState(icon, controlButton, 'pause'); } }); } } // Update button state (ARIA and icon) #updateControlState(icon, controlButton, state) { const isPlaying = (state === 'pause'); icon.classList.toggle('icon-play', !isPlaying); icon.classList.toggle('icon-pause', isPlaying); controlButton.setAttribute('aria-label', isPlaying ? 'Pause video' : 'Play video'); controlButton.setAttribute('aria-pressed', String(isPlaying)); } // Initialize media controls for each backdrop #initializeBackdrop(backdrop) { const videoElement = backdrop.querySelector('video'); const controlButton = backdrop.querySelector('.backdrop__media__control .button'); if (videoElement && controlButton) { this.#applyReducedMotionPreference(videoElement, controlButton); controlButton.addEventListener('click', () => { this.#togglePlayPause(videoElement, controlButton); }); } } // Public methods init = () => { this.#backdropVideoList.forEach((backdrop) => this.#initializeBackdrop(backdrop)); }; }