UNPKG

@diamondkinetics/dk-video-player-ts

Version:
450 lines (436 loc) 32.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VideoPlayer = void 0; 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(); } } exports.VideoPlayer = VideoPlayer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpZGVvLXBsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLFdBQVksU0FBUSxXQUFXO0lBQ3pCLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztJQUMxQixrQkFBa0IsR0FBRyxlQUFlLENBQUM7SUFDckMsMEJBQTBCLEdBQUcsc0JBQXNCLENBQUM7SUFDcEQsZUFBZSxHQUFHLFdBQVcsQ0FBQztJQUM5QixzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztJQUM3QyxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUVqRCxPQUFPLENBQW9CO0lBQzNCLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDYixNQUFNLENBQWE7SUFDbkIsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLFVBQVUsQ0FBUztJQUNuQixjQUFjLENBQVM7SUFFL0I7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLE1BQU07UUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFB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