UNPKG

@diamondkinetics/dk-video-player-ts

Version:
446 lines (432 loc) 32.8 kB
export class VideoPlayer extends HTMLElement { LONG_TOUCH_DURATION = 500; VIDEO_ACTIVE_CLASS = 'video--active'; INDICATORS_CONTAINER_CLASS = 'indicators-container'; INDICATOR_CLASS = 'indicator'; INDICATOR_ACTIVE_CLASS = 'indicator--active'; INDICATOR_FILL_CLASS = 'indicator-fill'; _config; muted = true; shadow; currentVideoIndex = 0; touchTimer; touchStartTime; constructor() { super(); } connectedCallback() { this.shadow = this.attachShadow({ mode: 'open' }); } disconnectedCallback() { this.shadow.innerHTML = ''; } render() { if (this.shadow) { this.reset(); this.appendStyles(); this.buildVideoIndicatorsHtml(); this.buildBannerAndVideoHtml(); } } reset() { if (!!this.shadow.querySelector(`.${this.INDICATORS_CONTAINER_CLASS}`)) { this.resetIndicators(); this.getVideoElements().forEach(video => this.resetAndRemoveVideo(video)); this.shadow.innerHTML = ''; this.currentVideoIndex = 0; } } buildVideoIndicatorsHtml() { const indicatorsContainer = document.createElement('div'); indicatorsContainer.classList.add(this.INDICATORS_CONTAINER_CLASS); this._config.videoUrls.forEach((_, i) => { const indicator = document.createElement('div'); indicator.classList.add(this.INDICATOR_CLASS); const indicatorFill = document.createElement('div'); indicatorFill.classList.add(this.INDICATOR_FILL_CLASS); indicator.appendChild(indicatorFill); indicatorsContainer.appendChild(indicator); }); this.shadow.appendChild(indicatorsContainer); } getInidicatorElements() { return this.shadow.querySelectorAll(`.${this.INDICATOR_CLASS}`); } updateIndicators() { this.getInidicatorElements().forEach((indicator, i) => { if (i === 0 && this.currentVideoIndex === 0) { indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS); } if (i <= this.currentVideoIndex) { indicator.classList.add(this.INDICATOR_ACTIVE_CLASS); } else { indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS); } }); } updateFillWidth(video) { const fill = this.getInidicatorElements()[this.currentVideoIndex]?.querySelector(`.${this.INDICATOR_FILL_CLASS}`); if (fill) { const currentTime = video.currentTime > 0 ? video.currentTime + 0.25 : video.currentTime; const width = currentTime < video.duration ? (currentTime / video.duration) * 100 : 100; fill.style.width = `${width}%`; } } resetIndicators() { this.getInidicatorElements().forEach(indicator => { indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS); const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`); this.applyFillWithoutTransition(fill, 0); }); } applyFillWithoutTransition(fill, percent) { fill.style.transition = 'none'; fill.style.width = `${percent}%`; // Force a reflow to apply the width change immediately fill.offsetHeight; fill.style.transition = ''; } resetFillWidthAfterCurrentVideoIndex() { this.getInidicatorElements().forEach((indicator, i) => { indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS); const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`); if (i >= this.currentVideoIndex) { this.applyFillWithoutTransition(fill, 0); } }); } applyFillWidthBeforeCurrentVideoIndex() { this.getInidicatorElements().forEach((indicator, i) => { indicator.classList.remove(this.INDICATOR_ACTIVE_CLASS); const fill = indicator.querySelector(`.${this.INDICATOR_FILL_CLASS}`); if (i <= this.currentVideoIndex) { this.applyFillWithoutTransition(fill, 100); } }); } buildBannerAndVideoHtml() { const videos = this.buildVideosHtml(); const banner = this.buildBannerHtml(); const content = document.createElement('div'); content.classList.add('content'); if (videos) { content.appendChild(videos); } content.appendChild(banner); this.shadow.appendChild(content); } buildBannerHtml() { const banner = document.createElement('div'); banner.classList.add('banner'); const bannerCopy = document.createElement('div'); bannerCopy.classList.add('banner-copy'); const title = document.createElement('h1'); title.textContent = this._config.title; bannerCopy.appendChild(title); const description = document.createElement('p'); description.textContent = this._config.description; bannerCopy.appendChild(description); banner.appendChild(bannerCopy); const button = document.createElement('button'); button.textContent = this._config.buttonText; button.onclick = this._config.buttonClick; banner.appendChild(button); return banner; } buildVideosHtml() { if (this._config.videoUrls.length > 0) { const videosContainer = document.createElement('div'); videosContainer.classList.add('videos-container'); this._config.videoUrls.forEach((url, i) => { const video = this.createVideoElement(url); this.initializeVideoEventHandlers(video); if (i === this.currentVideoIndex) { video.classList.add(this.VIDEO_ACTIVE_CLASS); video.play(); } videosContainer.appendChild(video); }); videosContainer.appendChild(this.createMuteToggle()); return videosContainer; } } createMuteToggle() { const button = document.createElement('button'); button.classList.add('mute-toggle'); button.onclick = this.toggleMute; button.appendChild(this.getMuteToggleSvg()); return button; } toggleMute = (event) => { const button = event.currentTarget; this.muted = !this.muted; this.getVideoElements().forEach(video => (video.muted = this.muted)); button.replaceChild(this.getMuteToggleSvg(), button.firstChild); }; getMuteToggleSvg() { return this.muted ? this.createMutedSvg() : this.createUnmutedSvg(); } createUnmutedSvg() { const svgNS = 'http://www.w3.org/2000/svg'; const svg = this.createBaseSvg(); const path = document.createElementNS(svgNS, 'path'); path.setAttribute('d', 'M744-480.66q0-78.34-43-142.84t-112.84-96.84Q574-727 567-740.5t-1-27.5q6-15 21.5-21t30.51.58Q709-748 762.5-664.5 816-581 816-479.87t-53.5 184Q709-213 618.01-172.58 603-166 587.5-172q-15.5-6-21.5-21-6-14 1-27.5t21.16-20.16Q658-273 701-337.66q43-64.65 43-143ZM288-384H180q-15.3 0-25.65-10.35Q144-404.7 144-420v-120q0-15.3 10.35-25.65Q164.7-576 180-576h108l131-131q17-17 39-7.55t22 33.76v401.48q0 24.31-22 33.81-22 9.5-39-7.5L288-384Zm360-96q0 37-18 76t-51 59q-9 5-18 .5t-9-15.97v-239.06q0-11.47 9-15.97t18 .5q33 19 51 58.5t18 76.5ZM408-594l-90 90H216v48h102l90 90v-228Zm-97 114Z'); svg.appendChild(path); return svg; } createMutedSvg() { const svgNS = 'http://www.w3.org/2000/svg'; const svg = this.createBaseSvg(); const path = document.createElementNS(svgNS, 'path'); path.setAttribute('d', 'M661-197q-11 7-23 13t-26 12q-14 6-28.5 0T564-192q-5-14 1.5-27.5T586-239l12-6q6-3 11-5L480-378v100q0 24-22 33.5t-39-7.5L288-383H180q-15 0-25.5-10.5T144-419v-120q0-15 10.5-25.5T180-575h102L115-743q-11-11-11-25.5t11-25.5q11-11 25.5-11t25.5 11l628 628q11 11 11 25t-11 25q-11 11-25.5 11T743-116l-82-81Zm83-282q0-79-43-143.5T588-719q-14-7-21-20.5t-1-27.5q6-15 21-21t30 1q90 40 144.5 122.5T816-480q0 32-6 63t-18 60q-8 20-22 25t-27 0q-13-5-20.5-17.5T722-376q11-24 16.5-50t5.5-53ZM579-614q32 20 50.5 59t18.5 76v12q0 6-1 11-2 11-13 14.5t-20-5.5l-51-51q-5-5-8-11.5t-3-14.5v-75q0-11 9-15.5t18 .5Zm-179-47q-5-5-5-13t5-13l19-19q17-17 39-7.5t22 33.5v56q0 12-11.5 16t-19.5-4l-49-49Zm8 296v-85l-72-72-18 19H216v48h102l90 90Zm-36-121Z'); svg.appendChild(path); return svg; } createBaseSvg() { const svgNS = 'http://www.w3.org/2000/svg'; const svg = document.createElementNS(svgNS, 'svg'); svg.setAttribute('xmlns', svgNS); svg.setAttribute('height', '20px'); svg.setAttribute('viewBox', '0 -960 960 960'); svg.setAttribute('width', '20px'); svg.setAttribute('fill', '#FFFFFF'); return svg; } createVideoElement(src) { const video = document.createElement('video'); video.src = src; video.muted = this.muted; video.preload = 'auto'; video.onended = this.onVideoEnded; video.playsInline = true; return video; } initializeVideoEventHandlers(video) { video.addEventListener('touchstart', this.onVideoTouchStart); video.addEventListener('touchend', this.onVideoTouchEnd); video.addEventListener('play', this.onVideoPlay); video.addEventListener('timeupdate', this.onVideoTimeUpdate); } onVideoTouchStart = (event) => { this.touchStartTime = Date.now(); this.touchTimer = setTimeout(this.onVideoLongTouch, this.LONG_TOUCH_DURATION); const video = event.currentTarget; if (video.paused) { video.play(); this.touchStartTime = 0; } }; onVideoTouchEnd = (event) => { if (this.touchTimer) { clearTimeout(this.touchTimer); } const touchDuration = Date.now() - this.touchStartTime; if (touchDuration < this.LONG_TOUCH_DURATION) { this.onVideoTap(event); } }; onVideoPlay = (event) => { const video = event.currentTarget; this.updateFillWidth(video); this.updateIndicators(); }; onVideoTimeUpdate = (event) => { const video = event.currentTarget; this.updateFillWidth(video); }; onVideoTap = (event) => { const videoElement = event.currentTarget; const rect = videoElement.getBoundingClientRect(); const x = event.changedTouches[0].clientX - rect.left; if (x < rect.width / 2) { this.playPreviousVideo(); } else { this.playNextVideo(); } }; onVideoLongTouch = () => { const currentVideo = this.getVideoElements()[this.currentVideoIndex]; if (currentVideo) { currentVideo.paused ? currentVideo.play() : currentVideo.pause(); } }; onVideoEnded = () => { if (this.currentVideoIndex === this._config.videoUrls.length - 1) { this.resetIndicators(); } this.playNextVideo(); }; playNextVideo() { const videos = this.getVideoElements(); this.resetAndRemoveVideo(videos[this.currentVideoIndex]); if (this.currentVideoIndex === this._config.videoUrls.length - 1) { this.resetIndicators(); } else { this.applyFillWidthBeforeCurrentVideoIndex(); } this.currentVideoIndex = this.currentVideoIndex === videos.length - 1 ? 0 : this.currentVideoIndex + 1; this.activateAndPlayVideo(videos[this.currentVideoIndex]); } playPreviousVideo() { const videos = this.getVideoElements(); this.resetAndRemoveVideo(videos[this.currentVideoIndex]); this.currentVideoIndex = this.currentVideoIndex > 0 ? this.currentVideoIndex - 1 : 0; if (this.currentVideoIndex === 0) { this.resetIndicators(); } else { this.resetFillWidthAfterCurrentVideoIndex(); } this.activateAndPlayVideo(videos[this.currentVideoIndex]); } getVideoElements() { return this.shadow.querySelectorAll('video'); } resetAndRemoveVideo(video) { if (video) { video.pause(); video.currentTime = 0; video.classList.remove(this.VIDEO_ACTIVE_CLASS); } } activateAndPlayVideo(video) { if (video) { video.classList.add(this.VIDEO_ACTIVE_CLASS); video.play(); } } appendStyles() { const style = document.createElement('style'); style.textContent = ` .indicators-container { box-sizing: border-box; position: absolute; top: 0; left: 0; z-index: 500; display: flex; justify-content: space-between; gap: 0 1rem; width: 100%; padding: 1rem 0.5rem; background: var(--indicators-background, linear-gradient(to bottom, rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0))); user-select: none; -webkit-user-select: none; .indicator { display: flex; width: 100%; height: 0.125rem; background-color: var(--unplayed-bar-color, rgba(255, 255, 255, 0.5)); .indicator-fill { width: 0%; transition: width 0s linear; background-color: var(--played-bar-color, #69ff5e); } } .${this.INDICATOR_ACTIVE_CLASS} { .indicator-fill { transition-duration: 250ms; } } } .content { display: flex; flex-direction: column; position: relative; z-index: 400; width: 100%; height: 100svh; .videos-container { position: relative; flex-grow: 1; width: 100%; min-height: 0; user-select: none; -webkit-user-select: none; video { display: none; width: 100%; height: 100%; object-fit: cover; object-position: center; &.${this.VIDEO_ACTIVE_CLASS} { display: block; } } .mute-toggle { all: unset; position: absolute; bottom: 16px; right: 16px; display: flex; justify-content: center; align-items: center; width: 32px; height: 32px; border-radius: 50%; padding: 0; background-color: rgba(0, 0, 0, 0.5); color: #fff; text-align: center; } } .banner { box-sizing: border-box; display: flex; justify-content: space-between; align-items: center; width: 100%; padding: 1rem; gap: 0 1rem; background: var(--banner-background, #1a1a1a); user-select: none; -webkit-user-select: none; .banner-copy { flex-shrink: 1; h1 { margin: 0 0 0.375rem; font-size: 1.125rem; text-transform: uppercase; font-family: var(--banner-title-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif); } p { margin: 0; font-size: 0.875rem; font-family: var(--banner-description-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif); } } button { flex-shrink: 0; padding: 0.75rem 1rem; border: none; border-radius: 20px; font-family: var(--banner-button-font, Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif); font-size: 0.875rem; line-height: 1; font-weight: bold; letter-spacing: 0.5px; color: #000; text-transform: uppercase; background-color: #69ff5e; &:active { background-color: #3cc732; } } } } `; this.shadow.appendChild(style); } get config() { return this._config; } set config(value) { this._config = value; this.muted = this._config.muted ?? this.muted; this.render(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpZGVvLXBsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sV0FBWSxTQUFRLFdBQVc7SUFDekIsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0lBQzFCLGtCQUFrQixHQUFHLGVBQWUsQ0FBQztJQUNyQywwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQztJQUNwRCxlQUFlLEdBQUcsV0FBVyxDQUFDO0lBQzlCLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0lBQzdDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0lBRWpELE9BQU8sQ0FBb0I7SUFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNiLE1BQU0sQ0FBYTtJQUNuQixpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDdEIsVUFBVSxDQUFTO0lBQ25CLGNBQWMsQ0FBUztJQUUvQjtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTTtRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJ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