@shortkitsdk/web 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).ShortKit={})}(this,function(t){"use strict";class e{constructor({userId:t,onResolve:e}={}){this._onResolve=e||null;const i=localStorage.getItem("sk_anonymous_id");i?this._anonymousId=i:(this._anonymousId=s(),localStorage.setItem("sk_anonymous_id",this._anonymousId)),this._userId=localStorage.getItem("sk_user_id")||null,t&&this.setUserId(t)}get anonymousId(){return this._anonymousId}get userId(){return this._userId}get effectiveId(){return this._userId??this._anonymousId}setUserId(t){const e=this._anonymousId;this._userId=t,localStorage.setItem("sk_user_id",t),this._onResolve&&this._onResolve(t,e)}clearUserId(){this._userId=null,localStorage.removeItem("sk_user_id"),this._anonymousId=s(),localStorage.setItem("sk_anonymous_id",this._anonymousId)}}function s(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}const i=["feed","mute","article","none"],n=["algorithmic","custom"];function a(t={}){const e={feedHeight:"fullscreen",muteOnStart:!0,autoplay:!0,feedSource:"algorithmic",filter:null,overlay:null,preload:null,...t};if(e.feedSource&&!n.includes(e.feedSource))throw new Error(`Invalid feedSource: ${e.feedSource}`);if("fullscreen"!==e.feedHeight&&("percentage"!==e.feedHeight?.type||"number"!=typeof e.feedHeight?.value))throw new Error(`Invalid feedHeight: ${JSON.stringify(e.feedHeight)}`);return e}function o(t={}){const e={cornerRadius:12,clickAction:"feed",autoplay:!0,loop:!0,muteOnStart:!0,overlay:null,...t};if(!i.includes(e.clickAction))throw new Error(`Invalid clickAction: ${e.clickAction}`);return e}function r(t={}){const e={cardCount:3,cardSpacing:8,cornerRadius:12,autoplay:!0,muteOnStart:!0,loop:!0,rotationInterval:1e4,clickAction:"feed",overlay:null,...t};if(!i.includes(e.clickAction))throw new Error(`Invalid clickAction: ${e.clickAction}`);return e}function l(t={}){return{tags:t.tags||null,section:t.section||null,author:t.author||null,contentType:t.contentType||null,metadata:t.metadata||null,toQueryParams(){const t=[];if(this.tags?.length&&t.push(["tags",this.tags.join(",")]),this.section&&t.push(["section",this.section]),this.author&&t.push(["author",this.author]),this.contentType&&t.push(["content_type",this.contentType]),this.metadata)for(const[e,s]of Object.entries(this.metadata).sort(([t],[e])=>t.localeCompare(e)))t.push([`metadata.${e}`,s]);return t}}}class h{constructor({baseUrl:t,apiKey:e,getEffectiveId:s}){this._baseUrl=t,this._apiKey=e,this._getEffectiveId=s}_headers(){return{"X-API-Key":this._apiKey,"X-User-Id":this._getEffectiveId(),"Content-Type":"application/json"}}async fetchFeed({limit:t=10,cursor:e,filter:s}={}){let i;const n=new URLSearchParams({limit:String(t)});if(e&&n.set("cursor",e),s){const t=s.toQueryParams?s:l(s);for(const[e,s]of t.toQueryParams())n.set(e,s);i=`${this._baseUrl}/v1/feed/filter?${n}`}else i=`${this._baseUrl}/v1/feed?${n}`;const a=await fetch(i,{headers:this._headers()});if(!a.ok)throw new Error(`Feed API ${a.status}: ${a.statusText}`);const o=await a.json(),r=o.meta?.next_cursor||null;return{items:(o.data||[]).filter(t=>!t.type||"content"===t.type).map(t=>{return{id:(e=t).id,playbackId:e.playbackId||null,title:e.title||"",description:e.description||null,duration:e.duration||0,streamingUrl:e.streamingUrl||"",thumbnailUrl:e.thumbnailUrl||"",captionTracks:(e.captionTracks||[]).map(t=>({language:t.language,label:t.label||t.language,source:t.source||"external",url:t.url||null})),customMetadata:e.customMetadata||null,author:e.author||null,articleUrl:e.articleUrl||e.publisherUrl||null,commentCount:e.commentCount??null,fallbackUrl:e.fallbackUrl||null};var e}),nextCursor:r,hasMore:!!r}}async resolveIdentity(t,e){const s=await fetch(`${this._baseUrl}/v1/identity/resolve`,{method:"POST",headers:this._headers(),body:JSON.stringify({userId:t,anonymousId:e})});s.ok||console.warn(`Identity resolve failed: ${s.status}`)}async postEvents(t){const e=await fetch(`${this._baseUrl}/v1/events`,{method:"POST",headers:this._headers(),body:JSON.stringify({events:t})});if(!e.ok)throw new Error(`Events API ${e.status}`)}beaconEvents(t){const e=new Blob([JSON.stringify({events:t,apiKey:this._apiKey,userId:this._getEffectiveId()})],{type:"application/json"});navigator.sendBeacon(`${this._baseUrl}/v1/events`,e)}}class c{constructor(t){this.contentId=t,this.startTime=Date.now(),this.watchDuration=0,this.loopCount=0,this.completed=!1}addWatchTime(t){this.watchDuration+=t}recordLoop(){this.loopCount++}markCompleted(){this.completed=!0}toSummary(){return{contentId:this.contentId,startTime:this.startTime,watchDuration:this.watchDuration,loopCount:this.loopCount,completed:this.completed}}}class d{constructor({onEvent:t,sessionId:e}){this._onEvent=t,this._sessionId=e||crypto.randomUUID?.()||Math.random().toString(36).slice(2),this.activeSession=null}_emit(t,e,s={}){this._onEvent({type:t,contentId:e||null,timestamp:(new Date).toISOString(),sessionId:this._sessionId,data:s})}trackFeedEntry(){this._emit("feedEntry")}trackFeedExit(){this._emit("feedExit")}trackImpression(t){this._emit("impression",t)}trackPlayStart(t){this._emit("playStart",t)}trackFirstFrame(t){this._emit("firstFrame",t)}trackWatchProgress(t,e){this._emit("watchProgress",t,{seconds:e})}trackCompletion(t){this._emit("completion",t)}trackSwipe(t,e,s){this._emit("swipe",t,{toId:e,direction:s})}trackRebuffer(t){this._emit("rebuffer",t)}trackQualityChange(t,e){this._emit("qualityChange",t,e)}trackError(t,e){this._emit("error",t,{message:e})}trackInteraction(t,e){this._emit("interaction",t,{action:e})}trackContentSignal(t,e){this._emit("contentSignal",t,{signal:e})}trackPlaybackFallback(t){this._emit("playbackFallback",t)}trackViewEnd(t,e){this._emit("viewEnd",t,e)}activateContent(t){this.activeSession&&this.deactivateContent(),this.activeSession=new c(t),this.trackImpression(t)}deactivateContent(){this.activeSession&&(this.trackViewEnd(this.activeSession.contentId,this.activeSession.toSummary()),this.activeSession=null)}}class u{constructor({postEvents:t,beaconEvents:e,flushIntervalMs:s=3e4}){this._postEvents=t,this._beaconEvents=e,this._flushIntervalMs=s,this._queue=[],this._timerId=null,this._started=!1,this._visibilityHandler=null}get pending(){return this._queue.length}add(t){this._queue.push(t),this._started&&null===this._timerId&&this._scheduleFlush()}start(){this._started=!0,this._scheduleFlush(),this._visibilityHandler=()=>{document.hidden&&this.flushBeacon()},document.addEventListener("visibilitychange",this._visibilityHandler)}_scheduleFlush(){this._timerId=setTimeout(async()=>{this._timerId=null,await this.flush()},this._flushIntervalMs)}async flush(){if(0===this._queue.length)return;const t=this._queue.splice(0);for(let e=0;e<3;e++)try{return void(await this._postEvents(t))}catch{}console.warn(`ShortKit: dropped ${t.length} analytics events after 3 retries`)}flushBeacon(){if(0===this._queue.length)return;const t=this._queue.splice(0);this._beaconEvents(t)}destroy(){this._started=!1,this._timerId&&(clearTimeout(this._timerId),this._timerId=null),this._visibilityHandler&&(document.removeEventListener("visibilitychange",this._visibilityHandler),this._visibilityHandler=null),this.flushBeacon()}}class p{constructor(){this._listeners=new Map}on(t,e){this._listeners.has(t)||this._listeners.set(t,[]),this._listeners.get(t).push(e)}off(t,e){const s=this._listeners.get(t);if(!s)return;const i=s.indexOf(e);-1!==i&&s.splice(i,1)}emit(t,e){const s=this._listeners.get(t);if(!s)return;const i=[...s];for(const n of i)n(e)}removeAllListeners(){this._listeners.clear()}}const m={playerState:"stateChange",currentItem:"itemChange",isMuted:"mutedChange",playbackRate:"playbackRateChange",captionsEnabled:"captionsChange",activeCaptionTrack:"captionTrackChange",activeCue:"cueChange",feedScrollPhase:"feedScrollPhase",prefetchedAheadCount:"prefetchedAheadCountChange",remainingContentCount:"remainingContentCountChange"},_=["play","pause","seek","seekAndPlay","setMuted","skipToNext","skipToPrevious","setPlaybackRate","setCaptionsEnabled","selectCaptionTrack","sendContentSignal","setMaxBitrate","seekThumbnail"];class f{constructor(){this._emitter=new p,this._surface=null,this._state={playerState:"idle",currentItem:null,time:{current:0,duration:0,buffered:0},isMuted:!0,playbackRate:1,captionsEnabled:!1,activeCaptionTrack:null,activeCue:null,feedScrollPhase:null,prefetchedAheadCount:0,remainingContentCount:0};for(const t of _)this[t]=(...e)=>{if(this._surface&&"function"==typeof this._surface[t])return this._surface[t](...e)}}get playerState(){return this._state.playerState}get currentItem(){return this._state.currentItem}get time(){return this._state.time}get isMuted(){return this._state.isMuted}get playbackRate(){return this._state.playbackRate}get captionsEnabled(){return this._state.captionsEnabled}get activeCaptionTrack(){return this._state.activeCaptionTrack}get activeCue(){return this._state.activeCue}get feedScrollPhase(){return this._state.feedScrollPhase}get prefetchedAheadCount(){return this._state.prefetchedAheadCount}get remainingContentCount(){return this._state.remainingContentCount}on(t,e){this._emitter.on(t,e)}off(t,e){this._emitter.off(t,e)}registerSurface(t){this._surface=t}unregisterSurface(t){this._surface===t&&(this._surface=null)}_pushState(t){for(const[e,s]of Object.entries(t))if("time"===e)this._state.time=s,this._emitter.emit("timeUpdate",s);else if(this._state[e]!==s){this._state[e]=s;const t=m[e];t&&this._emitter.emit(t,s)}}emitEvent(t,e){this._emitter.emit(t,e)}destroy(){this._surface=null,this._emitter.removeAllListeners()}}class v{static PRELOAD_HLS_CONFIG={startLevel:0,capLevelToPlayerSize:!0,maxBufferLength:2,maxMaxBufferLength:4};static ACTIVE_HLS_CONFIG={startLevel:-1,capLevelToPlayerSize:!0,maxBufferLength:8,maxMaxBufferLength:15};constructor({poolSize:t=3,Hls:e}={}){this._Hls=e??("undefined"!=typeof Hls?Hls:null),this.players=Array.from({length:t},()=>this._createPlayer()),this.assignments=new Map,this.hlsInstances=new Map}_createPlayer(){const t=document.createElement("video");return t.playsInline=!0,t.preload="auto",t.loop=!0,t.muted=!0,t.setAttribute("webkit-playsinline",""),t}acquire(t){if(this.assignments.has(t))return this.assignments.get(t);const e=new Set(this.assignments.values());let s=this.players.find(t=>!e.has(t));if(!s){const t=this.assignments.keys().next().value;s=this.assignments.get(t),s.pause(),this._destroyHls(t),s.removeAttribute("src"),s.load(),s.parentNode&&s.parentNode.removeChild(s),this.assignments.delete(t)}return this.assignments.set(t,s),s}attachStream(t,e,{isActive:s=!1}={}){const i=this.assignments.get(t);if(!i)return;if(i._skCurrentUrl===e)return;this._destroyHls(t);const n=this._Hls;if(e.includes(".m3u8")&&n&&n.isSupported()){const a=new n(s?v.ACTIVE_HLS_CONFIG:v.PRELOAD_HLS_CONFIG);a.loadSource(e),a.attachMedia(i),a.on(n.Events.ERROR,(t,e)=>{if(e.fatal)switch(e.type){case n.ErrorTypes.MEDIA_ERROR:a.recoverMediaError();break;case n.ErrorTypes.NETWORK_ERROR:setTimeout(()=>{a.destroyed||a.startLoad()},2e3);break;default:a.destroy()}}),this.hlsInstances.set(t,a)}else i.src=e;i._skCurrentUrl=e}promoteToActive(t){const e=this.hlsInstances.get(t);e&&(e.config.maxBufferLength=v.ACTIVE_HLS_CONFIG.maxBufferLength,e.config.maxMaxBufferLength=v.ACTIVE_HLS_CONFIG.maxMaxBufferLength,e.autoLevelCapping=-1,e.nextAutoLevel=-1)}release(t){const e=this.assignments.get(t);e&&(e.pause(),this._destroyHls(t),e._skCurrentUrl=null,e.parentNode&&e.parentNode.removeChild(e),this.assignments.delete(t))}getPlayer(t){return this.assignments.get(t)||null}ejectPlayer(t){const e=this.assignments.get(t),s=this.hlsInstances.get(t);if(!e)return null;e.parentNode&&e.parentNode.removeChild(e),this.assignments.delete(t),this.hlsInstances.delete(t);const i=this.players.indexOf(e);return i>=0&&(this.players[i]=this._createPlayer()),{video:e,hls:s}}injectPlayer(t,e,s,i){this.assignments.has(t)&&this.release(t),this.assignments.set(t,e),s&&this.hlsInstances.set(t,s),e._skCurrentUrl=i||null,this.players.includes(e)||this.players.push(e)}destroyAll(){for(const t of[...this.assignments.keys()])this.release(t)}_destroyHls(t){const e=this.hlsInstances.get(t);e&&(e.destroy(),this.hlsInstances.delete(t))}}class y{constructor(){this._cache=new Map,this._fetching=new Map}static extractPlaybackId(t){try{const e=new URL(t);return"image.media.shortkit.dev"!==e.host&&"image.mux.com"!==e.host?null:e.pathname.split("/")[1]||null}catch{return null}}async get(t){if(this._cache.has(t))return this._cache.get(t);if(this._fetching.has(t))return this._fetching.get(t);const e=(async()=>{try{const e=await fetch(`https://image.media.shortkit.dev/${t}/storyboard.json`);if(!e.ok)return null;const s=await e.json();(new Image).src=s.url;let i=s.tile_width,n=s.tile_height;for(const t of s.tiles)i=Math.max(i,t.x+s.tile_width),n=Math.max(n,t.y+s.tile_height);const a={spriteSheetUrl:s.url,tileWidth:s.tile_width,tileHeight:s.tile_height,sheetWidth:i,sheetHeight:n,duration:s.duration,tiles:s.tiles};return this._cache.set(t,a),a}catch{return null}finally{this._fetching.delete(t)}})();return this._fetching.set(t,e),e}tileAt(t,e){const s=this._cache.get(t);if(!s||!s.tiles.length)return null;let i=s.tiles[0];for(const a of s.tiles){if(!(a.start<=e))break;i=a}const n=80/s.tileWidth;return{backgroundImage:`url(${s.spriteSheetUrl})`,backgroundPosition:`-${i.x*n}px -${i.y*n}px`,backgroundSize:`${s.sheetWidth*n}px ${s.sheetHeight*n}px`}}}function g(t){const e=[],s=t.split(/\n\n+/);for(const i of s){const t=i.split("\n").filter(t=>t.trim()),s=t.findIndex(t=>t.includes(" --\x3e "));if(s<0)continue;const[n,a]=t[s].split(" --\x3e "),o=I(n.trim()),r=I(a.trim());if(null==o||null==r)continue;const l=t.slice(s+1).join("\n").trim();l&&e.push({startTime:o,endTime:r,text:l})}return e}function I(t){const e=t.split(":");return 3===e.length?3600*+e[0]+60*+e[1]+parseFloat(e[2]):2===e.length?60*+e[0]+parseFloat(e[1]):null}function k(t){const e=document.createElement("div");e.className="sk-feed-item",e.dataset.itemId=t.id;const s=t.thumbnailUrl?`background-image: url('${t.thumbnailUrl}'); background-size: cover; background-position: center;`:"";return e.innerHTML=`\n <div class="sk-video-container" data-ref="videoContainer" style="${s}">\n <div class="sk-spinner" data-ref="spinner"></div>\n </div>\n <div class="sk-tap-zone" data-ref="tapZone"></div>\n <div class="sk-overlay" data-ref="overlay"></div>\n `,e}class b{constructor(t,e,s={}){this.container=t,this._sk=e,this._options=s,this._config=s.config||{},this.pool=e._playerPool,this.storyboardCache=e._storyboardCache,this.items=[],this._cursor=null,this._hasMore=!0,this.activeItemId=null,this.activeIndex=0,this.isMuted=!1!==this._config.muteOnStart,this.playbackRate=1,this.itemEls=new Map,this.rafIds=new Map,this._centerTimeout=null,this._loadingMore=!1,this._wasPlayingBeforeHidden=!1,this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1,this._captionsOn=!1,this._captionCues=new Map,this._captionFetches=new Map,this._prefetchedThumbs=new Set,this._destroyed=!1,this._overlayContainers=new Map,this.feedWrapper=t.parentElement}async init(){if(!("custom"===this._config.feedSource)){const t=await this._fetchFeed(10);this._appendItems(t.items),this._prefetchThumbnails(0),this._options.onDidFetchContentItems&&this._options.onDidFetchContentItems(t.items),this._sk._onDidFetchContentItems&&this._sk._onDidFetchContentItems(t.items)}this._setupObserver(),this._setupScrollEnd(),this._setupKeyboard(),this._setupVisibilityHandler(),this._setupCellHeightObserver(),this._sk.player.registerSurface(this),this._sk._tracker.trackFeedEntry(),this._pushPlayerState(),this._options.onFeedReady&&this._options.onFeedReady()}destroy(){if(!this._destroyed){this._destroyed=!0,this._sk._tracker.trackFeedExit(),this._sk._tracker.deactivateContent(),this._sk.player.unregisterSurface(this),this._sk._unregisterSurface(this);for(const[t]of this.rafIds)this._stopTimeLoop(t);this.activeItemId&&this._deactivateItem(this.activeItemId);for(const[t]of[...this.pool.assignments])this.pool.release(t);this.observer&&(this.observer.disconnect(),this.observer=null),this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),this.container.innerHTML="",this.itemEls.clear(),this.items=[],this.activeItemId=null,this.activeIndex=0,this._speculativeItemId=null,this._speculativePlayer=null}}play(){const t=this.pool.getPlayer(this.activeItemId);t&&(t.play().catch(()=>{}),this._pushPlayerState({playerState:"playing"}))}pause(){const t=this.pool.getPlayer(this.activeItemId);t&&(t.pause(),this._pushPlayerState({playerState:"paused"}))}seek(t){const e=this.pool.getPlayer(this.activeItemId);e&&e.duration&&(e.currentTime=t)}seekAndPlay(t){const e=this.pool.getPlayer(this.activeItemId);e&&e.duration&&(e.currentTime=t,e.play().catch(()=>{}),this._pushPlayerState({playerState:"playing"}))}setMuted(t){this.isMuted=t;for(const[,e]of this.pool._players)e.muted=t;this._pushPlayerState({isMuted:t})}skipToNext(){this.navigateDown()}skipToPrevious(){this.navigateUp()}setPlaybackRate(t){this.playbackRate=t;for(const[,e]of this.pool._players)e.playbackRate=t;this._pushPlayerState({playbackRate:t})}setCaptionsEnabled(t){if(this._captionsOn=t,this._pushPlayerState({captionsEnabled:t}),t){const t=this.items[this.activeIndex];t?.captionTracks?.length&&this._fetchCaptionVTT(t)}t||this._sk.player._pushState({activeCue:null})}selectCaptionTrack(t){this._pushPlayerState({activeCaptionTrack:t})}sendContentSignal(t){this.activeItemId&&this._sk._tracker.trackContentSignal(this.activeItemId,t)}setMaxBitrate(t){}seekThumbnail(t){if(!this.activeItemId)return null;const e=this.items[this.activeIndex];if(!e)return null;const s=y.extractPlaybackId(e.thumbnailUrl);return s?this.storyboardCache.tileAt(s,t):null}setFeedItems(t){if("custom"!==this._config.feedSource)return void console.warn("[ShortKit] setFeedItems() called on a non-custom feed — ignored");this.activeItemId&&(this._deactivateItem(this.activeItemId),this.activeItemId=null,this.activeIndex=0),this.observer&&this.observer.disconnect(),this.container.innerHTML="",this.itemEls.clear(),this.items=[];const e=this._resolveFeedInputs(t);this._appendItems(e),this._setupObserver()}appendFeedItems(t){if("custom"!==this._config.feedSource)return void console.warn("[ShortKit] appendFeedItems() called on a non-custom feed — ignored");const e=this._resolveFeedInputs(t);this._appendItems(e)}applyFilter(t){"custom"!==this._config.feedSource?(this._config.filter=t,this._cursor=null,this._hasMore=!0,this.activeItemId&&(this._deactivateItem(this.activeItemId),this.activeItemId=null,this.activeIndex=0),this.observer&&this.observer.disconnect(),this.container.innerHTML="",this.itemEls.clear(),this.items=[],this._fetchFeed(10).then(t=>{this._appendItems(t.items),this._setupObserver(),this._prefetchThumbnails(0),this._options.onDidFetchContentItems&&this._options.onDidFetchContentItems(t.items),this._sk._onDidFetchContentItems&&this._sk._onDidFetchContentItems(t.items)}).catch(()=>{})):console.warn("[ShortKit] applyFilter() is a no-op for custom feeds — use setFeedItems() to update content")}_resolveFeedInputs(t){return t.map(t=>t.streamingUrl?t:"video"===t.type&&t.playbackId?{id:t.playbackId,streamingUrl:`https://stream.mux.com/${t.playbackId}.m3u8`,thumbnailUrl:`https://image.mux.com/${t.playbackId}/thumbnail.jpg`,title:t.title||"",description:t.description||"",author:t.author||"",section:t.section||"",articleUrl:t.articleUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]}:t.fallbackUrl?{id:t.id||t.fallbackUrl,streamingUrl:t.fallbackUrl,thumbnailUrl:t.thumbnailUrl||"",title:t.title||"",description:t.description||"",author:t.author||"",section:t.section||"",articleUrl:t.articleUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]}:(console.warn("[ShortKit] Unresolvable FeedInput — skipping:",t),null)).filter(Boolean)}async _fetchFeed(t=10){const e=await this._sk._apiClient.fetchFeed({limit:t,cursor:this._cursor,filter:this._config.filter||void 0});this._cursor=e.nextCursor,this._hasMore=e.hasMore;return{items:e.items.map(t=>({id:t.id,streamingUrl:t.streamingUrl,thumbnailUrl:t.thumbnailUrl,title:t.title||"",description:t.description||"",author:t.author||"",section:t.customMetadata?.category?.toUpperCase()||t.customMetadata?.section?.toUpperCase()||"",articleUrl:t.articleUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]})),nextCursor:e.nextCursor,hasMore:e.hasMore}}_pushPlayerState(t={}){const e=this.pool.getPlayer(this.activeItemId),s={currentItem:this.items[this.activeIndex]||null,isMuted:this.isMuted,playbackRate:this.playbackRate,captionsEnabled:this._captionsOn,activeCaptionTrack:null,activeCue:null,prefetchedAheadCount:Math.max(0,this.items.length-this.activeIndex-1),remainingContentCount:this.items.length-this.activeIndex-1,...t};e&&(s.time={current:e.currentTime||0,duration:e.duration||0,buffered:e.buffered?.length>0?e.buffered.end(e.buffered.length-1):0},t.playerState||(s.playerState=e.paused?"paused":"playing")),this._sk.player._pushState(s)}_appendItems(t){for(const e of t){if(this.itemEls.has(e.id))continue;this.items.push(e);const t=k(e);this.container.appendChild(t),this.itemEls.set(e.id,t),this._bindControls(e,t),this._createOverlayContainer(e.id,t),this.observer?.observe(t)}this._pushPlayerState({remainingContentCount:this.items.length-this.activeIndex-1,prefetchedAheadCount:Math.max(0,this.items.length-this.activeIndex-1)}),this._options.onRemainingContentCountChange&&this._options.onRemainingContentCountChange(this.items.length-this.activeIndex-1)}async _loadMore(){if(!this._loadingMore&&this._hasMore){this._loadingMore=!0;try{const t=await this._fetchFeed(10);this._appendItems(t.items),this._options.onDidFetchContentItems&&this._options.onDidFetchContentItems(t.items),this._sk._onDidFetchContentItems&&this._sk._onDidFetchContentItems(t.items)}finally{this._loadingMore=!1}}}navigateTo(t){const e=Math.max(0,Math.min(this.items.length-1,t));this.itemEls.get(this.items[e].id).scrollIntoView({behavior:"smooth",block:"start"})}navigateUp(){this.navigateTo(this.activeIndex-1)}navigateDown(){this.navigateTo(this.activeIndex+1)}_setupKeyboard(){document.addEventListener("keydown",t=>{"ArrowUp"===t.key&&(t.preventDefault(),this.navigateUp()),"ArrowDown"===t.key&&(t.preventDefault(),this.navigateDown())})}_setupVisibilityHandler(){document.addEventListener("visibilitychange",()=>{document.hidden?this._handleTabHidden():this._handleTabVisible()})}_handleTabHidden(){if(this._cancelSpeculation(),!this.activeItemId)return;const t=this.pool.getPlayer(this.activeItemId);t&&!t.paused?(this._wasPlayingBeforeHidden=!0,t.pause()):this._wasPlayingBeforeHidden=!1,this._stopTimeLoop(this.activeItemId)}_handleTabVisible(){if(!this.activeItemId)return;if(this._wasPlayingBeforeHidden){const t=this.pool.getPlayer(this.activeItemId);t&&t.play().catch(()=>{}),this._wasPlayingBeforeHidden=!1}const t=this.itemEls.get(this.activeItemId),e=this.pool.getPlayer(this.activeItemId);t&&e&&this._startTimeLoop(this.activeItemId,t,e)}_setupObserver(){this.observer=new IntersectionObserver(t=>{for(const e of t){const t=e.target.dataset.itemId;e.isIntersecting&&e.intersectionRatio>.6&&this._activateItem(t)}},{root:this.container,threshold:[0,.6,1]});for(const t of this.itemEls.values())this.observer.observe(t)}_setupCellHeightObserver(){this._cellHeight=0;const t=()=>{const t=this.container.firstElementChild;t&&(this._cellHeight=t.offsetHeight+parseFloat(getComputedStyle(t).marginBottom||"0"))};t(),this._resizeObserver=new ResizeObserver(t),this._resizeObserver.observe(this.container)}_setupScrollEnd(){let t;this.container.addEventListener("scroll",()=>{this._predictAndSpeculate(),clearTimeout(t),t=setTimeout(()=>this._onScrollEnd(),100)},{passive:!0}),this.container.addEventListener("pointerdown",()=>{this._cancelSpeculation()},{passive:!0}),this.container.addEventListener("touchstart",()=>{this._cancelSpeculation()},{passive:!0})}_onScrollEnd(){const t=this.items.findIndex(t=>t.id===this.activeItemId);if(t<0)return;const e=[this.items[t-1],this.items[t+1]].filter(Boolean);for(const s of e){const t=this.pool.acquire(s.id);if(this.pool.attachStream(s.id,s.streamingUrl),t.currentTime=0,this._speculativeItemId!==s.id){t.muted=!0;const e=s.id,i=t.play();i&&i.then(()=>{this.activeItemId!==e&&t.pause()}).catch(()=>{})}}this._prefetchThumbnails(t);for(const s of e)s.captionTracks?.length&&this._fetchCaptionVTT(s);t>=this.items.length-3&&this._loadMore()}_predictAndSpeculate(){const t=this._cellHeight||this.container.clientHeight;if(t<=0||0===this.items.length)return;const e=this.container.scrollTop,s=Math.round(e/t),i=Math.max(0,Math.min(this.items.length-1,s));if(i===this._lastPredictedIndex)return;if(this._lastPredictedIndex=i,i===this.activeIndex)return void this._cancelSpeculation();if(Math.abs(i-this.activeIndex)>1)return;const n=this.items[i];if(!n)return;if(this._speculativeItemId===n.id)return;this._cancelSpeculation();const a=this.pool.acquire(n.id);this.pool.attachStream(n.id,n.streamingUrl),a.currentTime=0,a.muted=!0;const o=this.itemEls.get(n.id);if(o){const t=o.querySelector('[data-ref="videoContainer"]');a.style.opacity="0",t.contains(a)||t.insertBefore(a,t.firstChild)}const r=a.play();r&&r.catch(()=>{}),this._speculativeItemId=n.id,this._speculativePlayer=a,this._pushPlayerState({feedScrollPhase:"decelerating"})}_cancelSpeculation(){if(!this._speculativeItemId)return;const t=this.pool.getPlayer(this._speculativeItemId);t&&(t.pause(),t.style.opacity="0"),this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1}_activateItem(t){if(this.activeItemId===t)return;this._speculativeItemId&&this._speculativeItemId!==t&&this._cancelSpeculation(),this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1;const e=this.activeItemId,s=this.activeIndex;this.activeItemId&&this._deactivateItem(this.activeItemId),this.activeItemId=t,this.activeIndex=this.items.findIndex(e=>e.id===t);const i=this.items[this.activeIndex];if(e){const i=this.activeIndex>s?"down":"up";this._sk._tracker.trackSwipe(e,t,i)}this._sk._tracker.activateContent(t),this._options.onFeedTransition&&this._options.onFeedTransition({fromIndex:s,toIndex:this.activeIndex,item:i});const n=this.itemEls.get(t),a=this.pool.acquire(t);a.style.opacity="0";const o=n.querySelector('[data-ref="videoContainer"]');o.contains(a)||o.insertBefore(a,o.firstChild),this.pool.attachStream(t,i.streamingUrl,{isActive:!0}),this.pool.promoteToActive(t),a.muted=this.isMuted,a.playbackRate=this.playbackRate,a.currentTime=0;const r=n.querySelector('[data-ref="spinner"]'),l=["loadeddata","seeked","canplay","timeupdate"];let h=null;const c=()=>{a._skRevealedFor!==t&&(a.readyState<2||(a._skRevealedFor=t,a.style.opacity="1",clearTimeout(h),r.classList.remove("visible"),l.forEach(t=>a.removeEventListener(t,c)),this._sk._tracker.trackFirstFrame(t)))};a.readyState>=2&&!a.seeking?(a._skRevealedFor=t,a.style.opacity="1",this._sk._tracker.trackFirstFrame(t)):(h=setTimeout(()=>r.classList.add("visible"),1e3),l.forEach(t=>a.addEventListener(t,c)));const d=a.play();d&&d.catch(()=>{a.readyState>=2&&c()}),this._sk._tracker.trackPlayStart(t),this._startTimeLoop(t,n,a),this._invokeOverlay(t,i),this._prefetchThumbnails(this.activeIndex),i.captionTracks?.length&&this._fetchCaptionVTT(i);const u=y.extractPlaybackId(i.thumbnailUrl);u&&this.storyboardCache.get(u),this._pushPlayerState({playerState:"playing",currentItem:i,feedScrollPhase:"idle"})}_deactivateItem(t){const e=this.pool.getPlayer(t);e&&(e.pause(),e.style.opacity="0",e._skRevealedFor=null),this._stopTimeLoop(t),this._clearOverlay(t),this._sk._tracker.deactivateContent()}_startTimeLoop(t,e,s){this._stopTimeLoop(t);const i=()=>{if(this._destroyed)return;if(!s||s.paused)return void this.rafIds.set(t,requestAnimationFrame(i));const e=s.currentTime||0,n=s.duration||0,a=s.buffered?.length>0?s.buffered.end(s.buffered.length-1):0;if(this._sk.player._pushState({time:{current:e,duration:n,buffered:a},playerState:"playing"}),this._captionsOn){const s=this._captionCues.get(t);if(s){const t=s.find(t=>e>=t.startTime&&e<=t.endTime)||null;t!==this._sk.player.activeCue&&this._sk.player._pushState({activeCue:t})}}s.ended&&(s.currentTime=0,s.play().catch(()=>{})),this.rafIds.set(t,requestAnimationFrame(i))};this.rafIds.set(t,requestAnimationFrame(i))}_stopTimeLoop(t){const e=this.rafIds.get(t);e&&(cancelAnimationFrame(e),this.rafIds.delete(t))}_bindControls(t,e){const s=e.querySelector('[data-ref="tapZone"]');s&&s.addEventListener("click",()=>{const e=this.pool.getPlayer(t.id);e&&(e.paused?(e.play().catch(()=>{}),this._pushPlayerState({playerState:"playing"})):(e.pause(),this._pushPlayerState({playerState:"paused"})),this._sk._onContentTapped&&this._sk._onContentTapped(t))})}_fetchCaptionVTT(t){if(this._captionCues.has(t.id))return;if(this._captionFetches.has(t.id))return;const e=t.captionTracks[0];if(!e?.url)return;const s=fetch(e.url).then(t=>t.ok?t.text():null).then(e=>{e&&this._captionCues.set(t.id,g(e))}).catch(()=>{}).finally(()=>this._captionFetches.delete(t.id));this._captionFetches.set(t.id,s)}_prefetchThumbnails(t){const e=Math.max(0,t-3),s=Math.min(this.items.length,t+3+1);for(let i=e;i<s;i++){const t=this.items[i].thumbnailUrl;if(!t||this._prefetchedThumbs.has(t))continue;this._prefetchedThumbs.add(t);(new Image).src=t}}_createOverlayContainer(t,e){const s=e.querySelector('[data-ref="overlay"]');s&&this._overlayContainers.set(t,{el:s,unsub:null})}_invokeOverlay(t,e){if(!this._config.overlay)return;const s=this._overlayContainers.get(t);if(!s)return;const i=this._sk.player,n=this,a=[],o={get isMuted(){return i.isMuted},get playbackRate(){return i.playbackRate},get currentTime(){return i.time.current},get duration(){return i.time.duration},get captionsEnabled(){return i.captionsEnabled},on(t,e){i.on(t,e),a.push({event:t,fn:e})},off(t,e){i.off(t,e);const s=a.findIndex(s=>s.event===t&&s.fn===e);s>=0&&a.splice(s,1)},play(){n.play()},pause(){n.pause()},seek(t){n.seek(t)},setMuted(t){n.setMuted(t)},setPlaybackRate(t){n.setPlaybackRate(t)},setCaptionsEnabled(t){n.setCaptionsEnabled(t)},selectCaptionTrack(t){n.selectCaptionTrack(t)},sendContentSignal(t){n.sendContentSignal(t)},skipToNext(){n.skipToNext()},skipToPrevious(){n.skipToPrevious()},seekThumbnail:t=>n.seekThumbnail(t)},r={dismiss:()=>{n._feedDismiss&&n._feedDismiss()},navigateUp:()=>n.navigateUp(),navigateDown:()=>n.navigateDown()};s.unsub=()=>{for(const{event:t,fn:e}of a)i.off(t,e);a.length=0};try{this._config.overlay(s.el,{item:e,player:o,feed:r})}catch(l){}}_clearOverlay(t){const e=this._overlayContainers.get(t);e&&(e.unsub&&(e.unsub(),e.unsub=null),e.el.innerHTML="")}}class E{constructor(t,e,s={}){this.container=t,this._sk=e,this._options=s,this._idPrefix=s.idPrefix||"skp",this.pool=e._playerPool,this.storyboardCache=e._storyboardCache,this.items=[],this._cursor=null,this._hasMore=!0,this.activeItemId=null,this.activeIndex=0,this.isMuted=!0,this.playbackRate=1,this.itemEls=new Map,this.rafIds=new Map,this._loadingMore=!1,this._wasPlayingBeforeHidden=!1,this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1,this._captionsOn=!1,this._captionCues=new Map,this._captionFetches=new Map,this._prefetchedThumbs=new Set,this._destroyed=!1,this._overlayContainers=new Map,this._feedDismiss=null}_id(t){return`${this._idPrefix}${t}`}async initWithItems(t,e=0,{deferActivation:s=!1}={}){if(this._appendItems(t),this._prefetchThumbnails(0),s||this._setupObserver(),this._setupScrollEnd(),this._setupVisibilityHandler(),this._setupCellHeightObserver(),e>0&&e<t.length){const s=this.itemEls.get(t[e].id);s&&s.scrollIntoView({behavior:"instant",block:"start"})}}startObserver(){this.observer||this._setupObserver()}destroy(){this._destroyed=!0;for(const[t]of this.rafIds)this._stopTimeLoop(t);this.activeItemId&&this._deactivateItem(this.activeItemId);for(const[t]of[...this.pool.assignments])this.pool.release(t);this.observer&&(this.observer.disconnect(),this.observer=null),this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),this._visHandler&&document.removeEventListener("visibilitychange",this._visHandler),this.container.innerHTML="",this.itemEls.clear(),this.items=[],this.activeItemId=null,this.activeIndex=0,this._speculativeItemId=null,this._speculativePlayer=null}getActiveVideoElement(){return this.activeItemId?this.pool.getPlayer(this.activeItemId):null}getActiveItemRect(){if(!this.activeItemId)return null;const t=this.itemEls.get(this.activeItemId);if(!t)return null;const e=t.querySelector('[data-ref="videoContainer"]');return e?e.getBoundingClientRect():t.getBoundingClientRect()}play(){const t=this.pool.getPlayer(this.activeItemId);t&&(t.play().catch(()=>{}),this._pushPlayerState({playerState:"playing"}))}pause(){const t=this.pool.getPlayer(this.activeItemId);t&&(t.pause(),this._pushPlayerState({playerState:"paused"}))}seek(t){const e=this.pool.getPlayer(this.activeItemId);e&&e.duration&&(e.currentTime=t)}setMuted(t){this.isMuted=t;for(const[,e]of this.pool._players)e.muted=t;this._pushPlayerState({isMuted:t})}skipToNext(){this.navigateDown()}skipToPrevious(){this.navigateUp()}setPlaybackRate(t){this.playbackRate=t;for(const[,e]of this.pool._players)e.playbackRate=t;this._pushPlayerState({playbackRate:t})}setCaptionsEnabled(t){if(this._captionsOn=t,this._pushPlayerState({captionsEnabled:t}),t){const t=this.items[this.activeIndex];t?.captionTracks?.length&&this._fetchCaptionVTT(t)}t||this._sk.player._pushState({activeCue:null})}selectCaptionTrack(t){this._pushPlayerState({activeCaptionTrack:t})}sendContentSignal(t){this.activeItemId&&this._sk._tracker.trackContentSignal(this.activeItemId,t)}seekThumbnail(t){if(!this.activeItemId)return null;const e=this.items[this.activeIndex];if(!e)return null;const s=y.extractPlaybackId(e.thumbnailUrl);return s?this.storyboardCache.tileAt(s,t):null}async _fetchFeed(t=10){const e=await this._sk._apiClient.fetchFeed({limit:t,cursor:this._cursor});this._cursor=e.nextCursor,this._hasMore=e.hasMore;return{items:e.items.map(t=>({id:t.id,streamingUrl:t.streamingUrl,thumbnailUrl:t.thumbnailUrl,title:t.title||"",description:t.description||"",author:t.author||"",section:t.customMetadata?.category?.toUpperCase()||t.customMetadata?.section?.toUpperCase()||"",articleUrl:t.articleUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]})),nextCursor:e.nextCursor,hasMore:e.hasMore}}_appendItems(t){for(const e of t){if(this.itemEls.has(e.id))continue;this.items.push(e);const t=k(e);this.container.appendChild(t),this.itemEls.set(e.id,t),this._bindControls(e,t),this._createOverlayContainer(e.id,t),this.observer?.observe(t)}}async _loadMore(){if(!this._loadingMore&&this._hasMore){this._loadingMore=!0;try{const t=await this._fetchFeed(10);this._appendItems(t.items)}finally{this._loadingMore=!1}}}navigateTo(t){const e=Math.max(0,Math.min(this.items.length-1,t));this.itemEls.get(this.items[e].id).scrollIntoView({behavior:"smooth",block:"start"})}navigateUp(){this.navigateTo(this.activeIndex-1)}navigateDown(){this.navigateTo(this.activeIndex+1)}_setupVisibilityHandler(){this._visHandler=()=>{document.hidden?this._handleTabHidden():this._handleTabVisible()},document.addEventListener("visibilitychange",this._visHandler)}_handleTabHidden(){if(this._cancelSpeculation(),!this.activeItemId)return;const t=this.pool.getPlayer(this.activeItemId);t&&!t.paused?(this._wasPlayingBeforeHidden=!0,t.pause()):this._wasPlayingBeforeHidden=!1,this._stopTimeLoop(this.activeItemId)}_handleTabVisible(){if(!this.activeItemId)return;if(this._wasPlayingBeforeHidden){const t=this.pool.getPlayer(this.activeItemId);t&&t.play().catch(()=>{}),this._wasPlayingBeforeHidden=!1}const t=this.itemEls.get(this.activeItemId),e=this.pool.getPlayer(this.activeItemId);t&&e&&this._startTimeLoop(this.activeItemId,t,e)}_setupObserver(){this.observer=new IntersectionObserver(t=>{for(const e of t){const t=e.target.dataset.itemId;e.isIntersecting&&e.intersectionRatio>.6&&this._activateItem(t)}},{root:this.container,threshold:[0,.6,1]});for(const t of this.itemEls.values())this.observer.observe(t)}_setupCellHeightObserver(){this._cellHeight=0;const t=()=>{const t=this.container.firstElementChild;t&&(this._cellHeight=t.offsetHeight+parseFloat(getComputedStyle(t).marginBottom||"0"))};t(),this._resizeObserver=new ResizeObserver(t),this._resizeObserver.observe(this.container)}_setupScrollEnd(){let t;this.container.addEventListener("scroll",()=>{this._predictAndSpeculate(),clearTimeout(t),t=setTimeout(()=>this._onScrollEnd(),100)},{passive:!0}),this.container.addEventListener("pointerdown",()=>this._cancelSpeculation(),{passive:!0}),this.container.addEventListener("touchstart",()=>this._cancelSpeculation(),{passive:!0})}_onScrollEnd(){const t=this.items.findIndex(t=>t.id===this.activeItemId);if(t<0)return;const e=[this.items[t-1],this.items[t+1]].filter(Boolean);for(const s of e){const t=this.pool.acquire(s.id);if(this.pool.attachStream(s.id,s.streamingUrl),t.currentTime=0,this._speculativeItemId!==s.id){t.muted=!0;const e=s.id,i=t.play();i&&i.then(()=>{this.activeItemId!==e&&t.pause()}).catch(()=>{})}}this._prefetchThumbnails(t);for(const s of e)s.captionTracks?.length&&this._fetchCaptionVTT(s);t>=this.items.length-3&&this._loadMore()}_predictAndSpeculate(){const t=this._cellHeight||this.container.clientHeight;if(t<=0||0===this.items.length)return;const e=Math.round(this.container.scrollTop/t),s=Math.max(0,Math.min(this.items.length-1,e));if(s===this._lastPredictedIndex)return;if(this._lastPredictedIndex=s,s===this.activeIndex)return void this._cancelSpeculation();if(Math.abs(s-this.activeIndex)>1)return;const i=this.items[s];if(!i||this._speculativeItemId===i.id)return;this._cancelSpeculation();const n=this.pool.acquire(i.id);this.pool.attachStream(i.id,i.streamingUrl),n.currentTime=0,n.muted=!0;const a=this.itemEls.get(i.id);if(a){const t=a.querySelector('[data-ref="videoContainer"]');n.style.opacity="0",t.contains(n)||t.insertBefore(n,t.firstChild)}const o=n.play();o&&o.catch(()=>{}),this._speculativeItemId=i.id,this._speculativePlayer=n}_cancelSpeculation(){if(!this._speculativeItemId)return;const t=this.pool.getPlayer(this._speculativeItemId);t&&(t.pause(),t.style.opacity="0"),this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1}_activateItem(t){if(this.activeItemId===t)return;this._speculativeItemId&&this._speculativeItemId!==t&&this._cancelSpeculation(),this._speculativeItemId=null,this._speculativePlayer=null,this._lastPredictedIndex=-1,this.activeItemId&&this._deactivateItem(this.activeItemId),this.activeItemId=t,this.activeIndex=this.items.findIndex(e=>e.id===t);const e=this.items[this.activeIndex],s=this.itemEls.get(t),i=this.pool.acquire(t),n=!!i._skFeedTransfer;delete i._skFeedTransfer,n||(i.style.opacity="0");const a=s.querySelector('[data-ref="videoContainer"]');a.contains(i)||a.insertBefore(i,a.firstChild),this.pool.attachStream(t,e.streamingUrl,{isActive:!0}),this.pool.promoteToActive(t),i.muted=this.isMuted,i.playbackRate=this.playbackRate,n||(i.currentTime=0);const o=s.querySelector('[data-ref="spinner"]'),r=["loadeddata","seeked","canplay","timeupdate"];let l=null;const h=()=>{i._skRevealedFor!==t&&(i.readyState<2||(i._skRevealedFor=t,i.style.opacity="1",clearTimeout(l),o.classList.remove("visible"),r.forEach(t=>i.removeEventListener(t,h))))};n||i.readyState>=2&&!i.seeking?(i._skRevealedFor=t,i.style.opacity="1"):(l=setTimeout(()=>o.classList.add("visible"),1e3),r.forEach(t=>i.addEventListener(t,h)));const c=i.play();c&&c.catch(()=>{i.readyState>=2&&h()}),this._startTimeLoop(t,s,i),this._invokeOverlay(t,e),this._prefetchThumbnails(this.activeIndex),e.captionTracks?.length&&this._fetchCaptionVTT(e);const d=y.extractPlaybackId(e.thumbnailUrl);d&&this.storyboardCache.get(d)}_deactivateItem(t){const e=this.pool.getPlayer(t);e&&(e.pause(),e.style.opacity="0",e._skRevealedFor=null),this._stopTimeLoop(t),this._clearOverlay(t)}_startTimeLoop(t,e,s){this._stopTimeLoop(t);const i=()=>{if(this._destroyed)return;if(!s||s.paused)return void this.rafIds.set(t,requestAnimationFrame(i));const e=s.currentTime||0,n=s.duration||0,a=s.buffered?.length>0?s.buffered.end(s.buffered.length-1):0;if(this._sk.player._pushState({time:{current:e,duration:n,buffered:a},playerState:"playing"}),this._captionsOn){const s=this._captionCues.get(t);if(s){const t=s.find(t=>e>=t.startTime&&e<=t.endTime)||null;t!==this._sk.player.activeCue&&this._sk.player._pushState({activeCue:t})}}s.ended&&(s.currentTime=0,s.play().catch(()=>{})),this.rafIds.set(t,requestAnimationFrame(i))};this.rafIds.set(t,requestAnimationFrame(i))}_stopTimeLoop(t){const e=this.rafIds.get(t);e&&(cancelAnimationFrame(e),this.rafIds.delete(t))}_bindControls(t,e){const s=e.querySelector('[data-ref="tapZone"]');s&&s.addEventListener("click",()=>{const e=this.pool.getPlayer(t.id);e&&(e.paused?(e.play().catch(()=>{}),this._pushPlayerState({playerState:"playing"})):(e.pause(),this._pushPlayerState({playerState:"paused"})))})}_pushPlayerState(t={}){const e=this.pool.getPlayer(this.activeItemId),s={currentItem:this.items[this.activeIndex]||null,isMuted:this.isMuted,playbackRate:this.playbackRate,captionsEnabled:this._captionsOn,activeCaptionTrack:null,activeCue:null,prefetchedAheadCount:Math.max(0,this.items.length-this.activeIndex-1),remainingContentCount:this.items.length-this.activeIndex-1,...t};e&&(s.time={current:e.currentTime||0,duration:e.duration||0,buffered:e.buffered?.length>0?e.buffered.end(e.buffered.length-1):0},t.playerState||(s.playerState=e.paused?"paused":"playing")),this._sk.player._pushState(s)}_fetchCaptionVTT(t){if(this._captionCues.has(t.id)||this._captionFetches.has(t.id))return;const e=t.captionTracks[0];if(!e?.url)return;const s=fetch(e.url).then(t=>t.ok?t.text():null).then(e=>{e&&this._captionCues.set(t.id,g(e))}).catch(()=>{}).finally(()=>this._captionFetches.delete(t.id));this._captionFetches.set(t.id,s)}_prefetchThumbnails(t){const e=Math.max(0,t-3),s=Math.min(this.items.length,t+4);for(let i=e;i<s;i++){const t=this.items[i].thumbnailUrl;if(!t||this._prefetchedThumbs.has(t))continue;this._prefetchedThumbs.add(t);(new Image).src=t}}_createOverlayContainer(t,e){const s=e.querySelector('[data-ref="overlay"]');s&&this._overlayContainers.set(t,{el:s,unsub:null})}_invokeOverlay(t,e){if(!this._options?.config?.overlay)return;const s=this._overlayContainers.get(t);if(!s)return;const i=this._sk.player,n=this,a=[],o={get isMuted(){return i.isMuted},get playbackRate(){return i.playbackRate},get currentTime(){return i.time.current},get duration(){return i.time.duration},get captionsEnabled(){return i.captionsEnabled},on(t,e){i.on(t,e),a.push({event:t,fn:e})},off(t,e){i.off(t,e);const s=a.findIndex(s=>s.event===t&&s.fn===e);s>=0&&a.splice(s,1)},play(){n.play()},pause(){n.pause()},seek(t){n.seek(t)},setMuted(t){n.setMuted(t)},setPlaybackRate(t){n.setPlaybackRate(t)},setCaptionsEnabled(t){n.setCaptionsEnabled(t)},selectCaptionTrack(t){n.selectCaptionTrack(t)},sendContentSignal(t){n.sendContentSignal(t)},skipToNext(){n.skipToNext()},skipToPrevious(){n.skipToPrevious()},seekThumbnail:t=>n.seekThumbnail(t)},r={dismiss:()=>{n._feedDismiss&&n._feedDismiss()},navigateUp:()=>n.navigateUp(),navigateDown:()=>n.navigateDown()};s.unsub=()=>{for(const{event:t,fn:e}of a)i.off(t,e);a.length=0};try{this._options.config.overlay(s.el,{item:e,player:o,feed:r})}catch(l){}}_clearOverlay(t){const e=this._overlayContainers.get(t);e&&(e.unsub&&(e.unsub(),e.unsub=null),e.el.innerHTML="")}}const C='<svg viewBox="0 0 24 24"><path d="M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"/></svg>';class w{constructor(t,e,s={}){this.container=t,this._sk=e,this._options=s,this._config=s.config||{},this._scale=s.scale??1.4,this._padding=s.padding??0,this._cornerRadius=this._config.cornerRadius??12,this._clickAction=this._config.clickAction||"feed",this._autoplay=!1!==this._config.autoplay,this._loop=!1!==this._config.loop,this._overlayElId=s.overlayElId||"skpFeedOverlay",this.videoEl=null,this.hlsInstance=null,this.item=null,this.items=[],this._playOverlay=null,this._muteIconEl=null,this._muteFlashTimer=null,this._feedView=null,this._cursor=null,this._hasMore=!0,this._destroyed=!1,this._overlayEl=null,this._overlayUnsub=null}async init(){const t="feed"===this._clickAction?10:1,e=await this._sk._apiClient.fetchFeed({limit:t});e.items.length&&(this._cursor=e.nextCursor,this._hasMore=e.hasMore,this.items=e.items.map(t=>this._normaliseItem(t)),this.item=this.items[0],this._build())}initWithItems(t){this.items=t,this.item=t[0],this._build()}setScale(t){this._scale=t,this.container.style.maxWidth=`${Math.round(240*t)}px`}setPadding(t){this._padding=t,this.container.style.setProperty("--skp-padding",`${t}px`)}setCornerRadius(t){this._cornerRadius=t,this.container.style.setProperty("--skp-radius",`${t}px`),this.container.style.borderRadius=`${t}px`}setClickAction(t){this._clickAction=t}setLoop(t){this._loop=t,this.videoEl&&(this.videoEl.loop=t)}destroy(){this._destroyed=!0,clearTimeout(this._muteFlashTimer),this._clearOverlay(),this.hlsInstance&&(this.hlsInstance.destroy(),this.hlsInstance=null),this.container.innerHTML="",this.videoEl=null,this.item=null,this._playOverlay=null,this._muteIconEl=null,this._overlayEl=null,this._feedView&&(this._feedView=null),this._sk._unregisterSurface(this)}_normaliseItem(t){return{id:t.id,streamingUrl:t.streamingUrl,thumbnailUrl:t.thumbnailUrl,title:t.title||"",description:t.description||"",author:t.author||"",section:t.customMetadata?.category?.toUpperCase()||t.customMetadata?.section?.toUpperCase()||"",articleUrl:t.articleUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]}}_build(){this.container.innerHTML="",this.container.style.setProperty("--skp-radius",`${this._cornerRadius}px`),this.container.style.maxWidth=`${Math.round(240*this._scale)}px`,this.container.style.setProperty("--skp-padding",`${this._padding}px`),this.container.style.borderRadius=`${this._cornerRadius}px`,this.videoEl=document.createElement("video"),this.videoEl.setAttribute("playsinline",""),this.videoEl.setAttribute("webkit-playsinline",""),this.videoEl.muted=!0,this.videoEl.loop=this._loop,this.item.thumbnailUrl&&(this.videoEl.poster=this.item.thumbnailUrl),this.container.appendChild(this.videoEl);const t=document.createElement("div");if(t.className="skp-meta",t.innerHTML=`\n ${this.item.section?`<div class="skp-meta-section">${this.item.section}</div>`:""}\n <div class="skp-meta-title">${this.item.title}</div>\n `,this.container.appendChild(t),this._muteIconEl=document.createElement("div"),this._muteIconEl.className="skp-mute-icon",this._muteIconEl.innerHTML=C,this.container.appendChild(this._muteIconEl),this._playOverlay=document.createElement("div"),this._playOverlay.className="skp-play-overlay",this._autoplay&&this._playOverlay.classList.add("skp-hidden"),this._playOverlay.innerHTML='<svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>',this._playOverlay.addEventListener("click",t=>{t.stopPropagation(),this._playOverlay.classList.add("skp-hidden"),this.videoEl.play().catch(()=>{})}),this.container.appendChild(this._playOverlay),this._config.overlay&&(this._overlayEl=document.createElement("div"),this._overlayEl.style.cssText="position:absolute;inset:0;z-index:6;pointer-events:auto;",this._overlayEl.dataset.ref="customOverlay",this.container.appendChild(this._overlayEl)),this.container.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this._handleClick(t)}),this._attachStream(),this._config.overlay&&this._overlayEl&&this._invokeOverlay(),"feed"===this._clickAction){const t=document.getElementById(this._overlayElId);t&&(this._feedView=new S(t,this._sk,this._overlayElId))}}_invokeOverlay(){if(this._clearOverlay(),!this._overlayEl||!this._config.overlay||!this.item)return;const t=this._sk.player,e=[],s={on(s,i){t.on(s,i),e.push({event:s,fn:i})}};this._overlayUnsub=()=>{for(const{event:s,fn:i}of e)t.off(s,i);e.length=0};try{this._config.overlay(this._overlayEl,{item:this.item,player:s})}catch(i){}}_clearOverlay(){this._overlayUnsub&&(this._overlayUnsub(),this._overlayUnsub=null),this._overlayEl&&(this._overlayEl.innerHTML="")}_attachStream(){const t=this.item.streamingUrl;if(!t)return;const e="undefined"!=typeof window&&window.Hls;if(t.includes(".m3u8")&&e&&e.isSupported()){const s=new e({startLevel:-1,capLevelToPlayerSize:!0,maxBufferLength:8,maxMaxBufferLength:15});s.loadSource(t),s.attachMedia(this.videoEl),s.on(e.Events.MANIFEST_PARSED,()=>{this._autoplay&&this.videoEl.play().catch(()=>{})}),s.on(e.Events.ERROR,(t,i)=>{if(i.fatal)if(i.type===e.ErrorTypes.NETWORK_ERROR)s.startLoad();else s.destroy()}),this.hlsInstance=s}else this.videoEl.src=t,this._autoplay&&this.videoEl.play().catch(()=>{})}_handleClick(t){if(this._playOverlay&&!this._playOverlay.classList.contains("skp-hidden"))return;const e=this._clickAction;if("none"!==e){if("article"!==e)return"mute"===e?(this.videoEl.muted=!this.videoEl.muted,this._updateMuteIcon(),this.container.classList.add("skp-mute-visible"),clearTimeout(this._muteFlashTimer),void(this._muteFlashTimer=setTimeout(()=>{this.container.classList.remove("skp-mute-visible")},1500))):void("feed"!==e||this._openFeed());this.item?.articleUrl&&window.open(this.item.articleUrl,"_blank","noopener")}}_openFeed(){this._feedView&&!this._feedView._isOpen&&(this.videoEl&&this.videoEl.pause(),this._feedView.open({sourceEl:this.container,video:this.videoEl,hlsInstance:this.hlsInstance,item:this.item,startIndex:0,items:[...this.items],cursor:this._cursor,hasMore:this._hasMore,onClose:(t,e)=>{if("getSourceRect"===t)return this.container.getBoundingClientRect();if("closed"===t){let t=e?.transferVideo,s=e?.transferHls;if(!t&&this._feedView.feedManager){const e=this._feedView.feedManager.pool.ejectPlayer(this.item.id);e&&(t=e.video,s=e.hls)}t?(this.videoEl=t,this.hlsInstance=s,this.videoEl.loop=this._loop,this.videoEl.muted=!0,this.container.contains(this.videoEl)||this.container.insertBefore(this.videoEl,this.container.firstChild),this.videoEl.play().catch(()=>{})):this._rebuildVideo()}}}))}_rebuildVideo(){this.videoEl=document.createElement("video"),this.videoEl.setAttribute("playsinline",""),this.videoEl.setAttribute("webkit-playsinline",""),this.videoEl.muted=!0,this.videoEl.loop=this._loop,this.item.thumbnailUrl&&(this.videoEl.poster=this.item.thumbnailUrl),this.container.insertBefore(this.videoEl,this.container.firstChild),this.hlsInstance=null,this._attachStream()}_updateMuteIcon(){this._muteIconEl&&(this._muteIconEl.innerHTML=this.videoEl.muted?C:'<svg viewBox="0 0 24 24"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></svg>')}}class S{constructor(t,e,s="skp"){this.overlayEl=t,this._sk=e,this._prefix=s,this.backdropEl=t.querySelector(".skp-feed-backdrop"),this.closeBtnEl=document.getElementById(`${s}FeedCloseBtn`),this.feedEl=document.getElementById(`${s}Feed`),this.feedManager=null,this._isOpen=!1,this._onClose=null,this._escHandler=null,this._openItemId=null,this.closeBtnEl?.addEventListener("click",()=>this.close())}async open({sourceEl:t,video:e,hlsInstance:s,item:i,startIndex:n,items:a,cursor:o,hasMore:r,onClose:l}){if(this._isOpen)return;this._isOpen=!0,this._onClose=l,this._openItemId=i.id;const h=t.getBoundingClientRect(),c=parseFloat(getComputedStyle(t).borderRadius)||12;this.overlayEl.classList.add("skp-active");const d=new v,u=Object.create(this._sk);u._playerPool=d,u._storyboardCache=this._sk._storyboardCache,this.feedManager=new E(this.feedEl,u,{idPrefix:this._prefix}),o&&(this.feedManager._cursor=o),void 0!==r&&(this.feedManager._hasMore=r),await this.feedManager.initWithItems([...a],n,{deferActivation:!0}),e&&s&&(this.feedManager.pool.injectPlayer(i.id,e,s,i.streamingUrl),e._skFeedTransfer=!0,e.loop=!0);const p=this.feedManager.itemEls.get(i.id);if(p&&e){const t=p.querySelector('[data-ref="videoContainer"]');e.style.opacity="1",t.contains(e)||t.insertBefore(e,t.firstChild)}const m=this.feedEl;m.getBoundingClientRect();const _=m.getBoundingClientRect(),f=parseFloat(getComputedStyle(m).borderRadius)||16,y=h.width/_.width,g=h.height/_.height,I=h.left-_.left,k=h.top-_.top,b=c/Math.min(y,g);m.style.transformOrigin="0 0",m.style.overflow="hidden",m.style.scrollSnapType="none",m.style.borderRadius=`${b}px`,m.style.transform=`translate(${I}px, ${k}px) scale(${y}, ${g})`,m.getBoundingClientRect(),m.classList.add("skp-flip-animating"),requestAnimationFrame(()=>{m.style.transform="none",m.style.borderRadius=`${f}px`}),await this._waitForTransitionEnd(m,450),m.classList.remove("skp-flip-animating"),m.style.transformOrigin="",m.style.overflow="",m.style.scrollSnapType="",m.style.transform="",m.style.borderRadius="",this.feedManager.startObserver(),this.feedManager._activateItem(i.id),this.overlayEl.classList.add("skp-feed-ready"),this._escHandler=t=>{"Escape"===t.key&&this.close()},document.addEventListener("keydown",this._escHandler)}async close(){if(!this._isOpen)return;this._isOpen=!1;const t=this.feedEl,e=t.parentNode,s=t.getBoundingClientRect(),i=this.feedManager?.activeItemId;let n=!1,a=null,o=null;if(i===this._openItemId){const t=this.feedManager?.pool.ejectPlayer(i);t&&(n=!0,a=t.video,o=t.hls)}let r=null;if(this._onClose&&(r=this._onClose("getSourceRect")),s&&r){this.feedManager?.activeItemId&&!n&&this.feedManager._deactivateItem(this.feedManager.activeItemId),t.style.position="fixed",t.style.left=`${s.left}px`,t.style.top=`${s.top}px`,t.style.width=`${s.width}px`,t.style.height=`${s.height}px`,t.style.zIndex="9999",t.style.margin="0",t.style.flex="none",t.style.aspectRatio="unset",t.style.maxHeight="none",document.body.appendChild(t),this.overlayEl.classList.remove("skp-active","skp-feed-ready");const i=r.width/s.width,a=r.height/s.height,o=r.left-s.left,l=r.top-s.top,h=(parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--skp-radius").trim())||12)/Math.min(i,a);t.style.transformOrigin="0 0",t.style.overflow="hidden",t.style.scrollSnapType="none",t.getBoundingClientRect(),t.classList.add("skp-flip-animating"),requestAnimationFrame(()=>{t.style.transform=`translate(${o}px, ${l}px) scale(${i}, ${a})`,t.style.borderRadius=`${h}px`}),await this._waitForTransitionEnd(t,450),t.style.visibility="hidden",t.classList.remove("skp-flip-animating"),["position","left","top","width","height","zIndex","margin","flex","aspectRatio","maxHeight","transformOrigin","overflow","scrollSnapType","transform","borderRadius"].forEach(e=>t.style[e]="");const c=e.querySelector(".sk-sidebar");e.insertBefore(t,c),t.style.visibility=""}else this.overlayEl.classList.remove("skp-active","skp-feed-ready");this._onClose&&(this._onClose("closed",{transferVideo:n?a:null,transferHls:n?o:null,transferItemId:n?this._openItemId:null}),this._onClose=null),this.feedManager&&(this.feedManager.destroy(),this.feedManager=null),this._escHandler&&(document.removeEventListener("keydown",this._escHandler),this._escHandler=null),this.overlayEl.classList.remove("skp-active","skp-feed-ready","skp-closing")}_waitForTransitionEnd(t,e){return new Promise(s=>{const i=setTimeout(s,e);t.addEventListener("transitionend",function e(n){n.target===t&&(clearTimeout(i),t.removeEventListener("transitionend",e),s())})})}}const x="undefined"!=typeof window&&new URLSearchParams(window.location.search).has("preview");class T{constructor(t,e,s={}){this.overlayEl=t,this._sk=e,this.backdropEl=t.querySelector(".skw-feed-backdrop"),this.feedEl=t.querySelector(".sk-feed")||document.getElementById("skwFeed"),this.storyboardCache=s.storyboardCache||e._storyboardCache,this.feedManager=null,this._isOpen=!1,this._onClose=null,this._escHandler=null,this._openSlotIndex=-1,this._openItemId=null}async open({slotEl:t,video:e,hlsInstance:s,item:i,startIndex:n,items:a,cursor:o,hasMore:r,onClose:l,overlayConfig:h}){if(this._isOpen)return;this._isOpen=!0,this._onClose=l,this._openSlotIndex=n,this._openItemId=i.id;const c=t.getBoundingClientRect(),d=parseFloat(getComputedStyle(t).borderRadius)||12;if(x){const t=document.getElementById("widget");t&&(t.style.visibility="hidden")}this.overlayEl.classList.add("skw-active"),this.feedManager=new E(this.feedEl,this._sk,{idPrefix:"skw",config:h?{overlay:h}:void 0}),this.feedManager._feedDismiss=()=>this.close(),this.feedManager._cursor=o||null,this.feedManager._hasMore=!1!==r,await this.feedManager.initWithItems([...a],n,{deferActivation:!0}),e&&s&&(this.feedManager.pool.injectPlayer(i.id,e,s,i.streamingUrl),e._skFeedTransfer=!0,e.loop=!0);const u=this.feedManager.itemEls.get(i.id);if(u&&e){const t=u.querySelector('[data-ref="videoContainer"]');e.style.opacity="1",t.contains(e)||t.insertBefore(e,t.firstChild)}const p=this.feedEl;p.getBoundingClientRect();const m=p.getBoundingClientRect(),_=parseFloat(getComputedStyle(p).borderRadius)||16,f=c.width/m.width,v=c.height/m.height,y=c.left-m.left,g=c.top-m.top,I=d/Math.min(f,v);p.style.transformOrigin="0 0",p.style.overflow="hidden",p.style.scrollSnapType="none",p.style.borderRadius=`${I}px`,p.style.transform=`translate(${y}px, ${g}px) scale(${f}, ${v})`,p.getBoundingClientRect(),p.classList.add("skw-flip-animating"),requestAnimationFrame(()=>{p.style.transform="none",p.style.borderRadius=`${_}px`}),await this._waitForTransitionEnd(p,450),p.classList.remove("skw-flip-animating"),p.style.transformOrigin="",p.style.overflow="",p.style.scrollSnapType="",p.style.transform="",p.style.borderRadius="",this.feedManager.startObserver(),this.feedManager._activateItem(i.id),this.overlayEl.classList.add("skw-feed-ready"),this._escHandler=t=>{"Escape"===t.key&&this.close()},document.addEventListener("keydown",this._escHandler)}dismiss(){this.close()}async close(){if(!this._isOpen)return;if(this._isOpen=!1,x){const t=document.getElementById("widget");t&&(t.style.visibility="visible")}const t=this.feedEl,e=t.parentNode,s=t.getBoundingClientRect(),i=this.feedManager?.activeItemId,n=i===this._openItemId;let a=null;if(this._onClose&&(a=this._onClose("getSlotRect")),s&&a){this.feedManager?.activeItemId&&!n&&this.feedManager._deactivateItem(this.feedManager.activeItemId),t.style.position="fixed",t.style.left=`${s.left}px`,t.style.top=`${s.top}px`,t.style.width=`${s.width}px`,t.style.height=`${s.height}px`,t.style.zIndex=String(getComputedStyle(this.overlayEl).zIndex||9999),t.style.margin="0",t.style.flex="none",t.style.aspectRatio="unset",t.style.maxHeight="none",document.body.appendChild(t),this.overlayEl.classList.remove("skw-active","skw-feed-ready");const i=parseFloat(getComputedStyle(document.documentElement).getPropertyValue("--skw-radius").trim())||12,o=a.width/s.width,r=a.height/s.height,l=a.left-s.left,h=a.top-s.top,c=i/Math.min(o,r);t.style.transformOrigin="0 0",t.style.overflow="hidden",t.style.scrollSnapType="none",t.getBoundingClientRect(),t.classList.add("skw-flip-animating"),requestAnimationFrame(()=>{t.style.transform=`translate(${l}px, ${h}px) scale(${o}, ${r})`,t.style.borderRadius=`${c}px`}),await this._waitForTransitionEnd(t,450);let d=null,u=null;if(n){const t=this.feedManager?.pool.ejectPlayer(this._openItemId);t&&(d=t.video,u=t.hls)}t.style.visibility="hidden",t.classList.remove("skw-flip-animating"),t.style.position="",t.style.left="",t.style.top="",t.style.width="",t.style.height="",t.style.zIndex="",t.style.margin="",t.style.flex="",t.style.aspectRatio="",t.style.maxHeight="",t.style.transformOrigin="",t.style.overflow="",t.style.scrollSnapType="",t.style.transform="",t.style.borderRadius="",e.insertBefore(t,e.firstChild),t.style.visibility="",this._onClose&&(this._onClose("closed",{transferVideo:d,transferHls:u,transferItemId:d?this._openItemId:null}),this._onClose=null)}else if(this.overlayEl.classList.remove("skw-active","skw-feed-ready"),this._onClose){let t=null,e=null;if(n){const s=this.feedManager?.pool.ejectPlayer(this._openItemId);s&&(t=s.video,e=s.hls)}this._onClose("closed",{transferVideo:t,transferHls:e,transferItemId:t?this._openItemId:null}),this._onClose=null}this.feedManager&&(this.feedManager._keyHandler&&document.removeEventListener("keydown",this.feedManager._keyHandler),this.feedManager._speedCloseHandler&&document.removeEventListener("click",this.feedManager._speedCloseHandler),this.feedManager._visHandler&&document.removeEventListener("visibilitychange",this.feedManager._visHandler),this.feedManager.destroy(),this.feedManager=null),this._escHandler&&(document.removeEventListener("keydown",this._escHandler),this._escHandler=null),this.overlayEl.classList.remove("skw-active","skw-feed-ready","skw-closing")}_waitForTransitionEnd(t,e){return new Promise(s=>{const i=setTimeout(s,e);t.addEventListener("transitionend",function e(n){n.target===t&&(clearTimeout(i),t.removeEventListener("transitionend",e),s())})})}}const M="undefined"!=typeof navigator&&(/iPad|iPhone|iPod/.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1);class P{static PRELOAD_HLS_CONFIG={startLevel:0,capLevelToPlayerSize:!0,maxBufferLength:2,maxMaxBufferLength:4};static ACTIVE_HLS_CONFIG={startLevel:-1,capLevelToPlayerSize:!0,maxBufferLength:8,maxMaxBufferLength:15};constructor(t=2,{Hls:e}={}){this._Hls=e??("undefined"!=typeof Hls?Hls:null),this.players=Array.from({length:t},()=>this._createPlayer()),this.assignments=new Map,this.hlsInstances=new Map}_createPlayer(){const t=document.createElement("video");return t.playsInline=!0,t.preload=M?"metadata":"auto",t.loop=!1,t.muted=!0,t.setAttribute("webkit-playsinline",""),t}acquire(t){if(this.assignments.has(t))return this.assignments.get(t);const e=new Set(this.assignments.values());let s=this.players.find(t=>!e.has(t));if(!s){const t=this.assignments.keys().next().value;s=this.assignments.get(t),s.pause(),this._destroyHls(t),s.removeAttribute("src"),s.load(),s.parentNode&&s.parentNode.removeChild(s),this.assignments.delete(t)}return this.assignments.set(t,s),s}attachStream(t,e,{isActive:s=!1}={}){const i=this.assignments.get(t);if(!i)return;if(i._skCurrentUrl===e)return;this._destroyHls(t);const n=this._Hls;if(e.includes(".m3u8")&&n&&n.isSupported()){const a=new n(s?P.ACTIVE_HLS_CONFIG:P.PRELOAD_HLS_CONFIG);a.loadSource(e),a.attachMedia(i),a.on(n.Events.ERROR,(t,e)=>{if(e.fatal)switch(e.type){case n.ErrorTypes.MEDIA_ERROR:a.recoverMediaError();break;case n.ErrorTypes.NETWORK_ERROR:setTimeout(()=>{a.destroyed||a.startLoad()},2e3);break;default:a.destroy()}}),this.hlsInstances.set(t,a)}else i.src=e;i._skCurrentUrl=e}promoteToActive(t){const e=this.hlsInstances.get(t);e&&(e.config.maxBufferLength=P.ACTIVE_HLS_CONFIG.maxBufferLength,e.config.maxMaxBufferLength=P.ACTIVE_HLS_CONFIG.maxMaxBufferLength,e.autoLevelCapping=-1,e.nextAutoLevel=-1)}_destroyHls(t){const e=this.hlsInstances.get(t);e&&(e.destroy(),this.hlsInstances.delete(t))}release(t){const e=this.assignments.get(t);e&&(e.pause(),this._destroyHls(t),e._skCurrentUrl=null,e.parentNode&&e.parentNode.removeChild(e),this.assignments.delete(t))}getPlayer(t){return this.assignments.get(t)||null}ejectPlayer(t){const e=this.assignments.get(t),s=this.hlsInstances.get(t);if(!e)return null;e.parentNode&&e.parentNode.removeChild(e),this.assignments.delete(t),this.hlsInstances.delete(t);const i=this.players.indexOf(e);return i>=0&&(this.players[i]=this._createPlayer()),{video:e,hls:s}}injectPlayer(t,e,s,i){this.assignments.has(t)&&this.release(t),this.assignments.set(t,e),s&&this.hlsInstances.set(t,s),e._skCurrentUrl=i||null,this.players.includes(e)||this.players.push(e)}}class L{constructor(t,e,s={}){this._sk=e;const i=s.config||{};this.config={count:i.cardCount||3,visibleCount:i.visibleCount||i.cardCount||3,scrollable:i.scrollable||!1,autoRotate:void 0===i.autoRotate||i.autoRotate,rotationPause:i.rotationInterval||500,highlight:!0===i.highlight,slotScale:i.slotScale||1.4,slotGap:i.cardSpacing??10,slotRadius:i.cornerRadius??12,clickAction:i.clickAction||"feed",autoplay:!1!==i.autoplay,overlay:i.overlay||i.cardOverlay||null},this.container=t,this.trackEl=t.querySelector(".skw-track")||t.querySelector('[data-ref="track"]'),this.dotsEl=t.querySelector(".skw-dots")||t.querySelector('[data-ref="dots"]'),this.pool=new P(this.config.count+1),this.storyboardCache=e._storyboardCache,this.items=[],this.slotEls=[],this.activeIndex=-1,this.rotationTimer=null,this.isModalOpen=!1,this._slotWidth=200,this._hasActivated=!1,this._wasPlaying=!1,this._isHovering=!1,this._feedOverlayEl=null,this.feedView=null,this._slotOverlays=new Map}async init(){const t=this.config.scrollable?3*this.config.count:this.config.count,e=await this._sk._apiClient.fetchFeed({limit:Math.max(t,10)});this.items=this._mapItems(e.items),this._cursor=e.nextCursor,this._hasMore=e.hasMore,this._computeSlotWidth(),this._buildSlots(),this._buildDots(),this.container.style.setProperty("--skw-slot-gap",`${this.config.slotGap}px`),this.container.style.setProperty("--skw-radius",`${this.config.slotRadius}px`),this.container.style.setProperty("--skw-slot-scale",this.config.slotScale),this.config.highlight&&this.container.classList.add("skw-highlight");if((this.config.scrollable||this.config.count>this.config.visibleCount)&&(this.container.classList.add("skw-scrollable"),this._setupCarousel()),this._setupResize(),this._setupVisibility(),this._prewarmSlots(),this.items.length>0)if(this.config.autoplay)this._activateSlot(0);else{this.activeIndex=0,this._hasActivated=!0,this.slotEls[0]?.classList.add("skw-active");const t=this.dotsEl.querySelectorAll(".skw-dot");t[0]&&t[0].classList.add("skw-dot-active")}}_mapItems(t){return t.filter(t=>!t.type||"content"===t.type).map(t=>({id:t.id,streamingUrl:t.streamingUrl,thumbnailUrl:t.thumbnailUrl,title:t.title||"",description:t.description||"",author:t.author||"",section:t.customMetadata?.category?.toUpperCase()||t.customMetadata?.section?.toUpperCase()||"",articleUrl:t.articleUrl||t.publisherUrl||null,duration:t.duration||0,captionTracks:t.captionTracks||[]}))}_prewarmSlots(){const t=Math.min(this.slotEls.length,this.items.length),e=M?Math.min(t,2):t;for(let s=0;s<e;s++){const t=this.items[s],e=this.slotEls[s],i=this.pool.acquire(t.id);this.pool.attachStream(t.id,t.streamingUrl);const n=e.querySelector(".skw-slot-thumb");if(i.style.opacity="0",n.contains(i)||n.appendChild(i),i.muted=!0,i.currentTime=0,this.config.autoplay)if(M&&0!==s)i.preload="auto";else{const t=i.play();t&&t.then(()=>{0!==s&&i.pause()}).catch(()=>{})}}}_computeSlotWidth(){const t=this.trackEl.clientWidth||this.container.clientWidth,e=getComputedStyle(this.trackEl),s=parseFloat(e.paddingLeft||0)+parseFloat(e.paddingRight||0),i=this.config.slotGap,n=this.config.slotScale,a=this.config.count>1?(this.config.count-1)*i:0;this._slotWidth=Math.max(100,(t-s-a)/(this.config.count*n))}_buildSlots(){this.trackEl.innerHTML="",this.slotEls=[];const t=this.config.scrollable?this.items.length:Math.min(this.config.count,this.items.length);for(let e=0;e<t;e++){const t=this.items[e],s=this._createSlotEl(t,e);this.trackEl.appendChild(s),this.slotEls.push(s)}}_createSlotEl(t,e){const s=document.createElement("div");s.className="skw-slot",s.dataset.index=e,s.style.setProperty("--skw-slot-width",`${this._slotWidth}px`);const i=t.thumbnailUrl?`background-image: url('${t.thumbnailUrl}');`:"";s.innerHTML=`<div class="skw-slot-thumb" style="${i}"></div>`;const n=document.createElement("div");return n.className="skw-slot-overlay",n.dataset.ref="customOverlay",s.appendChild(n),this._slotOverlays.set(e,{el:n,unsub:null}),s.addEventListener("click",()=>this._handleSlotClick(e)),s.addEventListener("mouseenter",()=>{e!==this.activeIndex&&(this._isHovering=!0,clearTimeout(this.rotationTimer),this._activateSlot(e,{scroll:!1}))}),s.addEventListener("mouseleave",()=>{if(this._isHovering=!1,this.config.autoRotate&&!this.isModalOpen){const t=this.pool.getPlayer(this.items[this.activeIndex]?.id);t&&t.ended&&this._onPreviewEnded()}}),s}_buildDots(){this.dotsEl.innerHTML="";const t=this.config.scrollable?this.items.length:Math.min(this.config.count,this.items.length);for(let e=0;e<t;e++){const t=document.createElement("button");t.className="skw-dot",t.setAttribute("aria-label",`Go to video ${e+1}`),t.addEventListener("click",t=>{t.stopPropagation(),clearTimeout(this.rotationTimer),this._activateSlot(e)}),this.dotsEl.appendChild(t)}}_activateSlot(t,{scroll:e=!0}={}){if(t===this.activeIndex&&this._hasActivated)return;this._hasActivated&&this._deactivateSlot(this.activeIndex),this.activeIndex=t,this._hasActivated=!0;const s=this.items[t],i=this.slotEls[t];this.slotEls.forEach((e,s)=>e.classList.toggle("skw-active",s===t));this.dotsEl.querySelectorAll(".skw-dot").forEach((e,s)=>e.classList.toggle("skw-dot-active",s===t));const n=this.pool.acquire(s.id),a=!!n._skFeedTransfer;delete n._skFeedTransfer,n.loop=!1,n.muted=!0,a||!n.ended&&0!==n.currentTime||(n.currentTime=0),a||(n.style.opacity="0");const o=i.querySelector(".skw-slot-thumb");o.contains(n)||o.appendChild(n),this.pool.attachStream(s.id,s.streamingUrl,{isActive:!0});const r=["loadeddata","seeked","canplay","timeupdate"],l=()=>{n._skwRevealed!==s.id&&(n.readyState<2||(n._skwRevealed=s.id,n.style.opacity="1",r.forEach(t=>n.removeEventListener(t,l))))};a||n.readyState>=2&&!n.seeking&&n._skCurrentUrl===s.streamingUrl?(n._skwRevealed=s.id,n.style.opacity="1"):r.forEach(t=>n.addEventListener(t,l)),n.onended=()=>this._onPreviewEnded(),n.play().catch(()=>{}),this.config.scrollable&&e&&i.scrollIntoView({behavior:"smooth",inline:"center",block:"nearest"}),this.config.overlay&&this._invokeSlotOverlay(t,s)}_deactivateSlot(t){const e=this.items[t];if(!e)return;const s=this.pool.getPlayer(e.id);s&&(s.pause(),s.onended=null,s.style.opacity="0",s._skwRevealed=null),this._clearSlotOverlay(t)}_invokeSlotOverlay(t,e){const s=this._slotOverlays.get(t);if(!s)return;if(!this.config.overlay)return;this._clearSlotOverlay(t);const i=this._sk.player,n=[],a={get isMuted(){return i.isMuted},get playbackRate(){return i.playbackRate},get currentTime(){return i.time.current},get duration(){return i.time.duration},get captionsEnabled(){return i.captionsEnabled},on(t,e){i.on(t,e),n.push({event:t,fn:e})},off(t,e){i.off(t,e);const s=n.findIndex(s=>s.event===t&&s.fn===e);s>=0&&n.splice(s,1)}};s.unsub=()=>{for(const{event:t,fn:e}of n)i.off(t,e);n.length=0};try{this.config.overlay(s.el,{item:e,player:a})}catch(o){}}_clearSlotOverlay(t){const e=this._slotOverlays.get(t);e&&(e.unsub&&(e.unsub(),e.unsub=null),e.el.innerHTML="")}_onPreviewEnded(){!this.config.autoRotate||this.isModalOpen||this._isHovering||(this.rotationTimer=setTimeout(()=>{this._advanceRotation()},this.config.rotationPause))}_advanceRotation(){const t=(this.activeIndex+1)%this.slotEls.length;this._activateSlot(t)}_setupCarousel(){let t;this.trackEl.addEventListener("scroll",()=>{clearTimeout(t),t=setTimeout(()=>this._onCarouselScrollEnd(),100)},{passive:!0})}_onCarouselScrollEnd(){if(this._isHovering)return;const t=this.trackEl.getBoundingClientRect(),e=t.left+t.width/2;let s=0,i=1/0;this.slotEls.forEach((t,n)=>{const a=t.getBoundingClientRect(),o=a.left+a.width/2,r=Math.abs(o-e);r<i&&(i=r,s=n)}),s!==this.activeIndex&&(clearTimeout(this.rotationTimer),this._activateSlot(s)),s>=this.items.length-3&&this._loadMore()}async _loadMore(){if(!this._loadingMore&&this._hasMore){this._loadingMore=!0;try{const t=await this._sk._apiClient.fetchFeed({limit:10,cursor:this._cursor});this._cursor=t.nextCursor,this._hasMore=t.hasMore;const e=this._mapItems(t.items);for(const s of e){if(this.items.some(t=>t.id===s.id))continue;this.items.push(s);const t=this.items.length-1,e=this._createSlotEl(s,t);this.trackEl.appendChild(e),this.slotEls.push(e);const i=document.createElement("button");i.className="skw-dot",i.setAttribute("aria-label",`Go to video ${t+1}`),i.addEventListener("click",e=>{e.stopPropagation(),clearTimeout(this.rotationTimer),this._activateSlot(t)}),this.dotsEl.appendChild(i)}}finally{this._loadingMore=!1}}}_setupResize(){this._resizeObserver=new ResizeObserver(()=>{this._computeSlotWidth(),this.slotEls.forEach(t=>{t.style.setProperty("--skw-slot-width",`${this._slotWidth}px`)})}),this._resizeObserver.observe(this.container)}_setupVisibility(){this._visHandler=()=>{if(document.hidden){clearTimeout(this.rotationTimer);const t=this.items[this.activeIndex];if(t){const e=this.pool.getPlayer(t.id);e&&!e.paused&&(this._wasPlaying=!0,e.pause())}}else if(this._wasPlaying&&!this.isModalOpen){const t=this.items[this.activeIndex];if(t){const e=this.pool.getPlayer(t.id);e&&e.play().catch(()=>{})}this._wasPlaying=!1}},document.addEventListener("visibilitychange",this._visHandler)}destroy(){clearTimeout(this.rotationTimer),this._hasActivated&&this._deactivateSlot(this.activeIndex);for(const[t]of this.pool.assignments)this.pool.release(t);this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null),this._visHandler&&(document.removeEventListener("visibilitychange",this._visHandler),this._visHandler=null),this._feedOverlayEl&&this._feedOverlayEl.parentNode&&(this._feedOverlayEl.parentNode.removeChild(this._feedOverlayEl),this._feedOverlayEl=null),this.trackEl.innerHTML="",this.dotsEl.innerHTML="",this.container.classList.remove("skw-scrollable","skw-highlight"),this.container.removeAttribute("style"),this.items=[],this.slotEls=[],this.activeIndex=-1,this._hasActivated=!1}_handleSlotClick(t){const e=this.config.clickAction;if("none"!==e){if("article"===e){const e=this.items[t];return void(e?.articleUrl&&window.open(e.articleUrl,"_blank","noopener"))}if("mute"===e){const e=this.items[t],s=this.pool.getPlayer(e?.id);return void(s&&(s.muted=!s.muted))}this._openFeedOverlay(t)}}_ensureFeedView(){if(this.feedView)return;const t=document.createElement("div");t.className="skw-feed-overlay",t.innerHTML='\n <div class="skw-feed-backdrop"></div>\n <div class="sk-page">\n <div class="sk-feed-wrapper">\n <div class="sk-feed"></div>\n </div>\n </div>\n ',document.body.appendChild(t),this._feedOverlayEl=t,this.feedView=new T(this._feedOverlayEl,this._sk,{storyboardCache:this.storyboardCache})}_openFeedOverlay(t){if(this._ensureFeedView(),!this.feedView)return;clearTimeout(this.rotationTimer),this.isModalOpen=!0;const e=this.items[t],s=this.items[this.activeIndex];if(s&&s.id!==e.id){const t=this.pool.getPlayer(s.id);t&&(t.pause(),t.onended=null)}const i=this.pool.getPlayer(e.id);i&&(i.onended=null);const n=this.slotEls[t],a=this.pool.ejectPlayer(e.id);this.feedView.open({slotEl:n,video:a?.video||null,hlsInstance:a?.hls||null,item:e,overlayConfig:this.config.overlay||null,startIndex:t,items:[...this.items],cursor:this._cursor,hasMore:this._hasMore,onClose:(s,i)=>{if("getSlotRect"===s){if(this.activeIndex!==t){this._deactivateSlot(this.activeIndex),this.slotEls.forEach((e,s)=>e.classList.toggle("skw-active",s===t));this.dotsEl.querySelectorAll(".skw-dot").forEach((e,s)=>e.classList.toggle("skw-dot-active",s===t)),this.activeIndex=t}const e=this.slotEls[t];return e?(e.scrollIntoView({behavior:"instant",inline:"center",block:"nearest"}),e.getBoundingClientRect()):null}if("closed"===s){this.isModalOpen=!1;let s=i?.transferVideo,n=i?.transferHls;if(!s&&this.feedView.feedManager){const t=this.feedView.feedManager.pool.ejectPlayer(e.id);t&&(s=t.video,n=t.hls)}if(s){s.loop=!1,s.muted=!0,s._skFeedTransfer=!0,this.pool.injectPlayer(e.id,s,n,e.streamingUrl);const i=this.slotEls[t]?.querySelector(".skw-slot-thumb");i&&s&&(s.style.opacity="1",i.contains(s)||i.appendChild(s))}this._hasActivated=!1,this._activateSlot(this.activeIndex)}}})}}let O=!1;t.EmbeddedFeedManager=E,t.FeedManager=b,t.FeedView=T,t.ShortKit=class{constructor(t={}){if(function(){if(O)return;O=!0;const t=document.createElement("style");t.setAttribute("data-shortkit",""),t.textContent="\n/* ShortKit SDK — functional layout CSS (injected at runtime) */\n\n/* Feed page layout */\n.sk-page{display:flex;justify-content:center;align-items:center;height:100%;background:#000;padding:12px 16px;overflow:hidden}\n.sk-feed-wrapper{display:flex;align-items:center;gap:12px;height:100%;max-height:100%}\n\n/* Feed container */\n.sk-feed{position:relative;height:100%;aspect-ratio:9/16;overflow-y:scroll;scroll-snap-type:y mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;background:#000;border-radius:16px}\n.sk-feed::-webkit-scrollbar{display:none}\n\n/* Feed item */\n.sk-feed-item{position:relative;height:calc(100% - 6px);width:100%;scroll-snap-align:start;scroll-snap-stop:always;overflow:hidden;background:#0a0a0a;border-radius:16px;margin-bottom:6px}\n\n/* Video container */\n.sk-video-container{position:absolute;inset:0;width:100%;height:100%;overflow:hidden;background-size:cover;background-position:center}\n.sk-video-container video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .15s ease}\n\n/* Tap zone */\n.sk-tap-zone{position:absolute;inset:0;z-index:3;cursor:pointer}\n\n/* Overlay container */\n.sk-overlay{position:absolute;inset:0;z-index:4;pointer-events:none}\n.sk-overlay>*{pointer-events:auto}\n\n/* Spinner */\n.sk-spinner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:32px;height:32px;border:3px solid rgba(255,255,255,.2);border-top-color:#fff;border-radius:50%;opacity:0;pointer-events:none;z-index:2}\n.sk-spinner.visible{opacity:1;animation:sk-spin .8s linear infinite}\n@keyframes sk-spin{to{transform:translate(-50%,-50%) rotate(360deg)}}\n\n/* Widget slot */\n.skw-slot{position:relative;overflow:hidden;cursor:pointer}\n.skw-slot video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .2s ease}\n.skw-slot-thumb{position:absolute;inset:0;background-size:cover;background-position:center}\n.skw-slot-overlay{position:absolute;inset:0;z-index:4;pointer-events:none}\n.skw-slot-overlay>*{pointer-events:auto}\n\n/* FLIP animation */\n.sk-feed.skw-flip-animating{transition:transform .4s cubic-bezier(.32,.72,0,1),border-radius .4s cubic-bezier(.32,.72,0,1);will-change:transform}\n\n/* Feed overlay states */\n.skw-feed-overlay{position:fixed;inset:0;z-index:9999;display:none;flex-direction:column}\n.skw-feed-overlay.skw-active{display:flex}\n.skw-feed-overlay .skw-feed-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.5);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);opacity:0;transition:opacity .35s ease;pointer-events:none}\n.skw-feed-overlay.skw-active .skw-feed-backdrop{opacity:1}\n.skw-feed-overlay .sk-page{position:relative;z-index:1;flex:1;pointer-events:none}\n.skw-feed-overlay.skw-feed-ready .sk-page{pointer-events:auto}\n.skw-feed-overlay.skw-closing .skw-feed-backdrop{opacity:0;transition:none}\n",(document.head||document.documentElement).appendChild(t)}(),!t.apiKey)throw new Error("ShortKit: apiKey is required");this._destroyed=!1,this._options=t,this._surfaces=new Set,this._loadingView=t.loadingView||null,this._clientAppName=t.clientAppName||null,this._clientAppVersion=t.clientAppVersion||null,this._customDimensions=t.customDimensions||null,this._onContentTapped=t.onContentTapped||null,this._onRefreshRequested=t.onRefreshRequested||null,this._onDidFetchContentItems=t.onDidFetchContentItems||null,this._identity=new e({userId:t.userId,onResolve:(t,e)=>{this._apiClient.resolveIdentity(t,e)}}),this._apiClient=new h({baseUrl:t.apiBase||"https://api.shortkit.dev",apiKey:t.apiKey,getEffectiveId:()=>this._identity.effectiveId}),this.player=new f,this._playerPool=new v,this._storyboardCache=new y,this._batcher=new u({postEvents:t=>this._apiClient.postEvents(t),beaconEvents:t=>this._apiClient.beaconEvents(t)}),this._tracker=new d({onEvent:t=>this._batcher.add(t)}),this._batcher.start()}setUserId(t){this._identity.setUserId(t)}clearUserId(){this._identity.clearUserId()}async fetchContent({limit:t=10,filter:e}={}){return(await this._apiClient.fetchFeed({limit:t,filter:e})).items}async preloadFeed({filter:t,limit:e=10}={}){const s=await this._apiClient.fetchFeed({limit:e,filter:t});if(s.items.length>0){const t=s.items[0];t.thumbnailUrl&&((new Image).src=t.thumbnailUrl),t.streamingUrl&&fetch(t.streamingUrl).catch(()=>{})}return s}createFeed(t,e={}){const s=a(e.config),i=new b(t,this,{...e,config:s});return this._registerSurface(i),i.init(),i}createPlayer(t,e={}){const s=o(e.config),i=new w(t,this,{...e,config:s});return this._registerSurface(i),i}createWidget(t,e={}){const s=r(e.config),i=new L(t,this,{...e,config:s});return this._registerSurface(i),i}destroy(){if(!this._destroyed){this._destroyed=!0;for(const t of this._surfaces)"function"==typeof t.destroy&&t.destroy();this._surfaces.clear(),this._batcher.destroy(),this._playerPool.destroyAll&&this._playerPool.destroyAll(),this.player.destroy()}}_registerSurface(t){this._surfaces.add(t)}_unregisterSurface(t){this._surfaces.delete(t)}},t.ShortKitVersion="0.3.0",t.SinglePlayer=w,t.WidgetManager=L,t.createFeedConfig=a,t.createFeedFilter=l,t.createFeedItem=k,t.createPlayerConfig=o,t.createWidgetConfig=r,Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})});