@hyperframes/player 0.6.114 → 0.6.116
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.
- package/dist/hyperframes-player.cjs +9 -2
- package/dist/hyperframes-player.cjs.map +1 -1
- package/dist/hyperframes-player.d.cts +9 -0
- package/dist/hyperframes-player.d.ts +9 -0
- package/dist/hyperframes-player.global.js +9 -2
- package/dist/hyperframes-player.global.js.map +1 -1
- package/dist/hyperframes-player.js +9 -2
- package/dist/hyperframes-player.js.map +1 -1
- package/dist/slideshow/hyperframes-slideshow.cjs +14 -14
- package/dist/slideshow/hyperframes-slideshow.cjs.map +1 -1
- package/dist/slideshow/hyperframes-slideshow.d.cts +6 -0
- package/dist/slideshow/hyperframes-slideshow.d.ts +6 -0
- package/dist/slideshow/hyperframes-slideshow.global.js +14 -14
- package/dist/slideshow/hyperframes-slideshow.global.js.map +1 -1
- package/dist/slideshow/hyperframes-slideshow.js +10 -10
- package/dist/slideshow/hyperframes-slideshow.js.map +1 -1
- package/package.json +2 -2
|
@@ -97,6 +97,12 @@ declare class HyperframesSlideshow extends HTMLElement {
|
|
|
97
97
|
private onFsChange;
|
|
98
98
|
private toggleFullscreen;
|
|
99
99
|
private toggleMute;
|
|
100
|
+
private applyGlobalMute;
|
|
101
|
+
private stopDocumentMedia;
|
|
102
|
+
private presenterNotesDeckKey;
|
|
103
|
+
private presenterNotesStorageKey;
|
|
104
|
+
private readPresenterNotes;
|
|
105
|
+
private writePresenterNotes;
|
|
100
106
|
private renderPresenter;
|
|
101
107
|
}
|
|
102
108
|
/**
|
|
@@ -97,6 +97,12 @@ declare class HyperframesSlideshow extends HTMLElement {
|
|
|
97
97
|
private onFsChange;
|
|
98
98
|
private toggleFullscreen;
|
|
99
99
|
private toggleMute;
|
|
100
|
+
private applyGlobalMute;
|
|
101
|
+
private stopDocumentMedia;
|
|
102
|
+
private presenterNotesDeckKey;
|
|
103
|
+
private presenterNotesStorageKey;
|
|
104
|
+
private readPresenterNotes;
|
|
105
|
+
private writePresenterNotes;
|
|
100
106
|
private renderPresenter;
|
|
101
107
|
}
|
|
102
108
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var HyperframesPlayer=(()=>{var
|
|
1
|
+
"use strict";var HyperframesPlayer=(()=>{var x=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var _=(n,e)=>{for(var t in e)x(n,t,{get:e[t],enumerable:!0})},B=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of F(e))!N.call(n,s)&&s!==t&&x(n,s,{get:()=>e[s],enumerable:!(r=H(e,s))||r.enumerable});return n};var D=n=>B(x({},"__esModule",{value:!0}),n);var re={};_(re,{HyperframesSlideshow:()=>v,dropInvalidSlides:()=>L});var O="application/hyperframes-slideshow+json";function G(n="i"){let e=O.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`<script[^>]*type=["']${e}["'][^>]*>([\\s\\S]*?)<\\/script>`,n)}function I(n){let t=G("i").exec(n);if(!t||t[1]===void 0)return null;let r=t[1].trim();if(r.length===0)return null;let s=JSON.parse(r);if(!z(s))throw new Error("slideshow island is not a valid SlideshowManifest");return s}function M(n){if(typeof n!="object"||n===null)return!1;let e=n;return!(typeof e.sceneId!="string"||e.fragments!==void 0&&!(Array.isArray(e.fragments)&&e.fragments.every(t=>typeof t=="number"))||e.hotspots!==void 0&&!Array.isArray(e.hotspots))}function j(n){if(typeof n!="object"||n===null)return!1;let e=n;return typeof e.id=="string"&&typeof e.label=="string"&&Array.isArray(e.slides)&&e.slides.every(M)}function z(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let e=n;return!(!Array.isArray(e.slides)||!e.slides.every(M)||e.slideSequences!==void 0&&(!Array.isArray(e.slideSequences)||!e.slideSequences.every(j)))}function K(n,e){return`slide "${n}" sets ${e==="startTime"?"endTime":"startTime"} but ${e} cannot be resolved (no scene "${n}")`}function U(n,e,t){let{startTime:r,endTime:s,sceneId:i}=n;if(r!==void 0&&s!==void 0)return{start:r,end:s};if(r===void 0&&s===void 0)return e?{start:e.start,end:e.start+e.duration}:(t.push(`slide references unresolved sceneId "${i}"`),{start:0,end:0});if(!e){let l=r===void 0?"startTime":"endTime";t.push(K(i,l));let a=r??s??0;return{start:a,end:a}}return{start:r??e.start,end:s??e.start+e.duration}}function X(n,e,t,r,s){for(let i of e)(i<t||i>r)&&s.push(`slide "${n}" fragment ${i} is outside range [${t}, ${r}]`)}function T(n,e,t){let r=e.get(n.sceneId),{start:s,end:i}=U(n,r,t);n.startTime!==void 0&&n.endTime!==void 0&&i<=s&&t.push(`slide "${n.sceneId}" has endTime (${i}) <= startTime (${s})`);let l=[...new Set(n.fragments??[])].sort((a,o)=>a-o);return X(n.sceneId,l,s,i,t),{...n,start:s,end:i,fragments:l,hotspots:n.hotspots??[]}}function E(n,e){let t=[],r=new Map(e.map(o=>[o.id,o])),s={};for(let o of n.slideSequences??[])Object.prototype.hasOwnProperty.call(s,o.id)&&t.push(`duplicate slideSequence id "${o.id}" \u2014 only the last definition is kept`),s[o.id]={id:o.id,label:o.label,slides:o.slides.map(d=>T(d,r,t))};let i=n.slides.map(o=>T(o,r,t)),l=[...i,...Object.values(s).flatMap(o=>o.slides)];for(let o of l)for(let d of o.hotspots){let u=s[d.target];u?u.slides.length===0&&t.push(`hotspot "${d.id}" targets empty sequence "${d.target}"`):t.push(`hotspot "${d.id}" targets unknown sequence "${d.target}"`)}let a=[...i].sort((o,d)=>o.start-d.start);for(let o=1;o<a.length;o++){let d=a[o-1],u=a[o];d!==void 0&&u!==void 0&&u.start<d.end&&t.push(`main-line slides "${d.sceneId}" and "${u.sceneId}" overlap`)}return{resolved:{slides:i,sequences:s},errors:t}}var f="main",g=class{constructor(e,t){this.player=e;this.show=t;this.enterSlide(0)}player;show;stack=[{sequenceId:f,slideIndex:0,fragmentIndex:-1}];changeCbs=new Set;dispose(){}slidesOf(e){return e===f?this.show.slides:this.show.sequences[e]?.slides??[]}get frame(){return this.stack[this.stack.length-1]}get currentSlide(){return this.slidesOf(this.frame.sequenceId)[this.frame.slideIndex]}get nextSlide(){return this.slidesOf(this.frame.sequenceId)[this.frame.slideIndex+1]??null}get position(){return{...this.frame}}get counter(){return{index:this.frame.slideIndex+1,total:this.slidesOf(this.frame.sequenceId).length}}get canPrev(){return this.frame.slideIndex>0||this.stack.length>1}get canNext(){let e=this.slidesOf(this.frame.sequenceId);return this.frame.slideIndex+1<e.length||this.stack.length>1}get breadcrumb(){return this.stack.map(e=>e.sequenceId===f?{id:f,label:"Main deck"}:{id:e.sequenceId,label:this.show.sequences[e.sequenceId]?.label??e.sequenceId})}onChange(e){return this.changeCbs.add(e),()=>this.changeCbs.delete(e)}emitChange(){for(let e of this.changeCbs)e()}stopSlideMedia(){this.player.stopMedia?.()}enterSlide(e){e!==this.frame.slideIndex&&this.stopSlideMedia(),this.frame.slideIndex=e;let t=this.currentSlide;if(!t){this.frame.fragmentIndex=-1;return}t.fragments.length>0?(this.frame.fragmentIndex=0,this.playTo(t.fragments[0]??t.end)):(this.frame.fragmentIndex=-1,this.playTo(this.restFrame(t))),this.emitChange()}restFrame(e){return e.start+(e.end-e.start)*.5}resumeSlide(e,t){this.frame.slideIndex=e,this.frame.fragmentIndex=t;let r=this.currentSlide;if(!r)return;let s=t>=0&&t<r.fragments.length?r.fragments[t]??r.start:r.fragments.length>0?r.start:this.restFrame(r);this.playTo(s),this.emitChange()}playTo(e){this.player.seek(e)}next(){let e=this.currentSlide;if(!e)return;if(this.frame.fragmentIndex+1<e.fragments.length){this.frame.fragmentIndex+=1;let s=e.fragments[this.frame.fragmentIndex]??e.end;this.playTo(s),this.emitChange();return}let r=this.slidesOf(this.frame.sequenceId);this.frame.slideIndex+1<r.length?this.enterSlide(this.frame.slideIndex+1):this.stack.length>1&&this.back()}prev(){if(this.frame.slideIndex>0){this.enterSlide(this.frame.slideIndex-1);return}this.stack.length>1&&this.back()}goToSlide(e){let t=this.slidesOf(this.frame.sequenceId);e>=0&&e<t.length&&this.enterSlide(e)}enterBranch(e){let t=this.show.sequences[e];!t||t.slides.length===0||(this.stopSlideMedia(),this.stack.push({sequenceId:e,slideIndex:0,fragmentIndex:-1}),this.enterSlide(0))}back(){this.stack.length<=1||(this.stopSlideMedia(),this.stack.pop(),this.resumeSlide(this.frame.slideIndex,this.frame.fragmentIndex))}backToMain(){this.stack.length<=1||(this.stopSlideMedia(),this.stack=[this.stack[0]],this.resumeSlide(this.frame.slideIndex,this.frame.fragmentIndex))}syncTo(e,t,r){this.isValidSyncTarget(e,t)&&(this.isCrossSlide(e,t)&&this.stopSlideMedia(),this.rerootStackTo(e)&&this.resumeSlide(t,r))}isValidSyncTarget(e,t){if(!this.stack[0])return!1;let r=e===f?this.show.slides:this.show.sequences[e]?.slides??null;return r?t>=0&&t<r.length:!1}isCrossSlide(e,t){return this.frame.sequenceId!==e||this.frame.slideIndex!==t}rerootStackTo(e){if(this.frame.sequenceId===e)return!0;let t=this.stack[0];if(!t)return!1;if(this.stack=[t],e===f)return!0;let r=this.show.sequences[e];return!r||r.slides.length===0?!1:(this.stack.push({sequenceId:e,slideIndex:0,fragmentIndex:-1}),!0)}};function Y(n){if(typeof n!="object"||n===null)return!1;let e=n;return e.type==="goto"&&typeof e.sequenceId=="string"&&typeof e.slideIndex=="number"&&typeof e.fragmentIndex=="number"}function V(){return`hf-slideshow:${typeof location<"u"?location.pathname:""}`}var m=class{constructor(e,t){this.mode=e;this.onGoto=t;try{this.channel=new BroadcastChannel(V())}catch{return}e==="audience"&&(this.channel.onmessage=r=>{Y(r.data)&&this.onGoto(r.data)})}mode;onGoto;channel=null;postPosition(e){if(this.mode!=="presenter"||!this.channel)return;let t={type:"goto",...e};this.channel.postMessage(t)}destroy(){this.channel&&(this.channel.onmessage=null,this.channel.close(),this.channel=null)}};function $(n){let e=i=>i.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),t=i=>e(i).replace(/"/g,"""),r=e(n.notes),s=n.hotspots.length?`<div style="display:flex;flex-direction:column;gap:6px;">
|
|
2
2
|
<div style="font-size:12px;text-transform:uppercase;letter-spacing:.12em;opacity:.55;">Branches</div>
|
|
3
3
|
${n.hotspots.map(i=>`<button data-hotspot-id="${t(i.id)}" data-hotspot-target="${t(i.target)}" type="button" style="text-align:left;background:rgba(244,183,64,0.14);color:#f4b740;border:1px solid rgba(244,183,64,0.4);border-radius:8px;padding:8px 12px;font-size:15px;cursor:pointer;pointer-events:auto;font-family:inherit;">↳ ${e(i.label)}</button>`).join("")}
|
|
4
4
|
</div>`:"";return`
|
|
5
5
|
<div data-hf-presenter style="position:absolute;left:0;right:0;bottom:0;height:32%;display:flex;background:#11151f;color:#fff;border-top:2px solid rgba(255,255,255,0.12);box-sizing:border-box;font-family:sans-serif;pointer-events:auto;">
|
|
6
|
-
<
|
|
6
|
+
<textarea data-hf-presenter-notes data-hf-presenter-notes-key="${t(n.notesStorageKey??"")}" aria-label="Speaker notes" placeholder="No notes for this slide" spellcheck="true" style="flex:1;min-width:0;padding:24px 36px;overflow:auto;font:inherit;font-size:21px;line-height:1.55;color:#fff;background:transparent;border:0;outline:none;resize:none;white-space:pre-wrap;pointer-events:auto;">${r}</textarea>
|
|
7
7
|
<div style="width:380px;flex-shrink:0;border-left:1px solid rgba(255,255,255,0.12);padding:24px 28px;display:flex;flex-direction:column;gap:10px;">
|
|
8
8
|
<div style="font-size:12px;text-transform:uppercase;letter-spacing:.12em;opacity:.55;">Up next</div>
|
|
9
9
|
<div data-hf-presenter-next style="font-size:17px;opacity:.9;line-height:1.4;">${e(n.nextText)}</div>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<div><div style="font-size:11px;text-transform:uppercase;letter-spacing:.1em;opacity:.5;margin-bottom:3px;">Elapsed</div><div data-hf-presenter-elapsed style="font-size:23px;font-variant-numeric:tabular-nums;">${e(n.elapsedText)}</div></div>
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
|
-
</div>`.trim()}function S(n){let e=Math.floor(n/60),t=Math.floor(n%60);return`${String(e).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function W(n){return typeof n.seek=="function"&&typeof n.play=="function"&&typeof n.pause=="function"}var R=!1;function
|
|
16
|
+
</div>`.trim()}function S(n){let e=Math.floor(n/60),t=Math.floor(n%60);return`${String(e).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function W(n){return typeof n.seek=="function"&&typeof n.play=="function"&&typeof n.pause=="function"}var J="hf-slideshow:presenter-notes:v1:",R=!1;function Q(){if(R)return;R=!0;let n=document.createElement("style");n.textContent=`
|
|
17
17
|
@keyframes hf-hotspot-pulse {
|
|
18
18
|
0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0.35), 0 4px 16px rgba(0,0,0,0.35); }
|
|
19
19
|
50% { box-shadow: 0 0 0 8px rgba(255,255,255,0), 0 4px 20px rgba(0,0,0,0.45); }
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
[data-hf-muted] [data-hf-mute]:hover {
|
|
33
33
|
color: rgba(255,255,255,0.6) !important;
|
|
34
34
|
}
|
|
35
|
-
`,document.head.appendChild(n)}var q='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3"/></svg>',C='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3"/></svg>',v=class extends HTMLElement{controller=null;offChange=null;chrome=null;touchStartX=0;touchStartY=0;channel=null;presenterStartMs=null;presenterInterval=null;disconnected=!1;initTimer=null;initInFlight=!1;initGeneration=0;_muted=!1;get muted(){return this._muted}resolveMode(){let e=this.getAttribute("mode");if(e)return e;try{return new URLSearchParams(location.search).get("mode")}catch{return null}}static get observedAttributes(){return["sound","mode"]}attributeChangedCallback(){this.controller&&this.render()}connectedCallback(){this.disconnected=!1,this.initInFlight=!1,this.initGeneration+=1,this.tabIndex=0,window.addEventListener("keydown",this.onKey),this.addEventListener("touchstart",this.onTouchStart,{passive:!0}),this.addEventListener("touchend",this.onTouchEnd),window.addEventListener("message",this.onMessage),document.addEventListener("fullscreenchange",this.onFsChange),this.initChannel(),this.initTimer=setTimeout(()=>{this.initTimer=null,this.isConnected&&!this.disconnected&&this.init()},0)}disconnectedCallback(){this.disconnected=!0,this.initGeneration+=1,this.initTimer!==null&&(clearTimeout(this.initTimer),this.initTimer=null),window.removeEventListener("keydown",this.onKey),this.removeEventListener("touchstart",this.onTouchStart),this.removeEventListener("touchend",this.onTouchEnd),window.removeEventListener("message",this.onMessage),document.removeEventListener("fullscreenchange",this.onFsChange),this.offChange?.(),this.offChange=null,this.controller?.dispose?.(),this.controller=null,this.chrome=null,this.channel?.destroy(),this.channel=null,this.presenterInterval!==null&&(clearInterval(this.presenterInterval),this.presenterInterval=null)}__setControllerForTest(e){this.bindController(e)}present(){let e=location.search?"&":"?";window.open(location.href+e+"mode=audience","_blank","noopener,noreferrer"),this.setAttribute("data-hf-presenting","true"),this.presenterStartMs=Date.now(),this.presenterInterval===null&&(this.presenterInterval=setInterval(()=>this.updateElapsed(),1e3)),this.render()}updateElapsed(){if(this.presenterStartMs===null)return;let e=this.chrome?.querySelector("[data-hf-presenter-elapsed]");e&&(e.textContent=S(Math.floor((Date.now()-this.presenterStartMs)/1e3)))}initChannel(){this.resolveMode()==="audience"?this.channel=new m("audience",t=>{this.controller&&this.controller.syncTo?.(t.sequenceId,t.slideIndex,t.fragmentIndex)}):this.channel=new m("presenter",()=>{})}async init(){if(this.initInFlight)return;this.initInFlight=!0;let e=this.initGeneration;try{let t=this.querySelector("hyperframes-player");if(!t||!(t instanceof HTMLElement)||!W(t)||(await
|
|
35
|
+
`,document.head.appendChild(n)}var q='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3"/></svg>',C='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3"/></svg>',v=class extends HTMLElement{controller=null;offChange=null;chrome=null;touchStartX=0;touchStartY=0;channel=null;presenterStartMs=null;presenterInterval=null;disconnected=!1;initTimer=null;initInFlight=!1;initGeneration=0;_muted=!1;get muted(){return this._muted}resolveMode(){let e=this.getAttribute("mode");if(e)return e;try{return new URLSearchParams(location.search).get("mode")}catch{return null}}static get observedAttributes(){return["sound","mode"]}attributeChangedCallback(){this.controller&&this.render()}connectedCallback(){this.disconnected=!1,this.initInFlight=!1,this.initGeneration+=1,this.tabIndex=0,window.addEventListener("keydown",this.onKey),this.addEventListener("touchstart",this.onTouchStart,{passive:!0}),this.addEventListener("touchend",this.onTouchEnd),window.addEventListener("message",this.onMessage),document.addEventListener("fullscreenchange",this.onFsChange),this.initChannel(),this.initTimer=setTimeout(()=>{this.initTimer=null,this.isConnected&&!this.disconnected&&this.init()},0)}disconnectedCallback(){this.disconnected=!0,this.initGeneration+=1,this.initTimer!==null&&(clearTimeout(this.initTimer),this.initTimer=null),window.removeEventListener("keydown",this.onKey),this.removeEventListener("touchstart",this.onTouchStart),this.removeEventListener("touchend",this.onTouchEnd),window.removeEventListener("message",this.onMessage),document.removeEventListener("fullscreenchange",this.onFsChange),this.offChange?.(),this.offChange=null,this.controller?.dispose?.(),this.controller=null,this.chrome=null,this.channel?.destroy(),this.channel=null,this.presenterInterval!==null&&(clearInterval(this.presenterInterval),this.presenterInterval=null)}__setControllerForTest(e){this.bindController(e)}present(){let e=location.search?"&":"?";window.open(location.href+e+"mode=audience","_blank","noopener,noreferrer"),this.setAttribute("data-hf-presenting","true"),this.presenterStartMs=Date.now(),this.presenterInterval===null&&(this.presenterInterval=setInterval(()=>this.updateElapsed(),1e3)),this.render()}updateElapsed(){if(this.presenterStartMs===null)return;let e=this.chrome?.querySelector("[data-hf-presenter-elapsed]");e&&(e.textContent=S(Math.floor((Date.now()-this.presenterStartMs)/1e3)))}initChannel(){this.resolveMode()==="audience"?this.channel=new m("audience",t=>{this.controller&&this.controller.syncTo?.(t.sequenceId,t.slideIndex,t.fragmentIndex)}):this.channel=new m("presenter",()=>{})}async init(){if(this.initInFlight)return;this.initInFlight=!0;let e=this.initGeneration;try{let t=this.querySelector("hyperframes-player");if(!t||!(t instanceof HTMLElement)||!W(t)||(await te(t),e!==this.initGeneration))return;let r=this.innerHTML,s;try{s=I(r)}catch{return}if(!s)return;let i=await ne(t,2500,()=>e!==this.initGeneration);if(e!==this.initGeneration)return;let{resolved:l,errors:a}=E(s,i);a.length>0&&console.warn("[hyperframes-slideshow] manifest errors:",a);let o=L(l);o.slides.length===0&&s.slides.length>0&&console.error("[hyperframes-slideshow] no main-line slides resolved \u2014 the scene timeline may not have loaded in time, or sceneIds/timing are invalid:",a);let d={seek:u=>t.seek(u),play:()=>t.play(),pause:()=>t.pause(),stopMedia:()=>{t.stopMedia?.(),this.stopDocumentMedia()},get currentTime(){return t.currentTime},onTimeUpdate:u=>{let h=c=>{let b=c.detail;u(b.currentTime)};return t.addEventListener("timeupdate",h),()=>t.removeEventListener("timeupdate",h)}};this.bindController(new g(d,o)),i.length===0&&s.slides.length>0&&t.addEventListener("scenes",()=>{e===this.initGeneration&&this.init()},{once:!0})}finally{this.initInFlight=!1}}bindController(e){this.offChange?.(),this.controller?.dispose?.(),this.controller=e,this.offChange=e.onChange(()=>{this.resolveMode()!=="audience"&&this.channel&&this.channel.postPosition(e.position),this.render()}),this.resolveMode()!=="audience"&&this.channel&&this.channel.postPosition(e.position),this.render()}onKey=e=>{if(!this.controller)return;let t=e.target;if(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement||t instanceof HTMLElement&&t.isContentEditable)return;let r=document.activeElement,s=r===this||this.contains(r),i=document.querySelectorAll("hyperframes-slideshow").length>1,l=s||!i&&(r===document.body||r===null);if(e.key==="ArrowRight"){if(!l)return;this.controller.next(),e.preventDefault()}else if(e.key==="ArrowLeft"){if(!l)return;this.controller.prev(),e.preventDefault()}else if(e.key===" "){if(!s)return;this.controller.next(),e.preventDefault()}else if(e.key==="Backspace"){if(!s)return;this.controller.prev(),e.preventDefault()}else if((e.key==="f"||e.key==="F")&&!e.metaKey&&!e.ctrlKey&&!e.altKey){if(!s)return;this.toggleFullscreen(),e.preventDefault()}};onMessage=e=>{if(this.resolveMode()==="audience")return;let t=e.data;!t||!this.controller||(t.type==="next"?this.controller.next():t.type==="prev"?this.controller.prev():t.type==="goto"&&typeof t.slideIndex=="number"?this.controller.goToSlide?.(t.slideIndex):t.type==="back"&&this.controller.back?.())};onTouchStart=e=>{let t=e.touches[0];t&&(this.touchStartX=t.clientX,this.touchStartY=t.clientY)};onTouchEnd=e=>{if(!this.controller)return;let t=e.changedTouches[0];if(!t)return;let r=t.clientX-this.touchStartX,s=t.clientY-this.touchStartY;Math.abs(r)<=40||Math.abs(r)<=Math.abs(s)||(r<0?this.controller.next():this.controller.prev())};render(){if(!this.controller)return;if(this.resolveMode()==="audience"){let{counter:s}=this.controller;this.paintChrome(this.buildNavCluster(s,"28px","fs-only"));return}if(this.getAttribute("data-hf-presenting")==="true"){this.renderPresenter();return}let{counter:e,currentSlide:t}=this.controller;if(!t)return;let r=t.hotspots.map(s=>{let i=s.region?`left:${s.region.x}%;top:${s.region.y}%;`:"right:5%;bottom:18%;";return`<button
|
|
36
36
|
class="hf-hotspot-pill"
|
|
37
37
|
data-hotspot-id="${p(s.id)}"
|
|
38
38
|
data-hotspot-target="${p(s.target)}"
|
|
39
39
|
type="button"
|
|
40
40
|
style="position:absolute;${i}display:inline-flex;align-items:center;gap:6px;padding:8px 14px;background:var(--hf-slideshow-accent,rgba(255,255,255,0.92));color:#111;border:none;border-radius:999px;font-size:13px;font-weight:600;letter-spacing:0.01em;cursor:pointer;pointer-events:auto;box-shadow:0 4px 16px rgba(0,0,0,0.35);animation:hf-hotspot-pulse 1.8s ease-in-out infinite;white-space:nowrap;"
|
|
41
41
|
aria-label="${p(s.label)}"
|
|
42
|
-
><span aria-hidden="true" style="font-size:14px;line-height:1;">\u2295</span>${p(s.label)}</button>`}).join("");this.paintChrome(r+this.buildNavCluster(e,"28px"))}paintChrome(e){
|
|
42
|
+
><span aria-hidden="true" style="font-size:14px;line-height:1;">\u2295</span>${p(s.label)}</button>`}).join("");this.paintChrome(r+this.buildNavCluster(e,"28px"))}paintChrome(e){Q(),this.chrome||(this.chrome=document.createElement("div"),this.chrome.setAttribute("data-hf-chrome",""),this.appendChild(this.chrome)),this.chrome.style.cssText="position:absolute;inset:0;pointer-events:none;z-index:10;",this.chrome.innerHTML=e,this.wireChromeButtons()}buildNavCluster(e,t,r="full"){let s=this.controller;if(!s)return"";let i=s.canPrev!==!1,l=s.canNext!==!1,a=this.hasAttribute("sound"),o="display:flex;align-items:center;justify-content:center;width:34px;height:34px;background:transparent;border:none;border-radius:999px;color:rgba(255,255,255,0.85);font-size:16px;cursor:pointer;transition:background 0.15s,color 0.15s;padding:0;",h=a?`<button
|
|
43
43
|
data-hf-mute
|
|
44
44
|
type="button"
|
|
45
45
|
aria-label="${this._muted?"Unmute":"Mute"}"
|
|
@@ -49,26 +49,26 @@
|
|
|
49
49
|
data-hf-prev
|
|
50
50
|
type="button"
|
|
51
51
|
aria-label="Previous slide"
|
|
52
|
-
style="${o}" >‹</button>`:"",b=
|
|
52
|
+
style="${o}" >‹</button>`:"",b=l?`<button
|
|
53
53
|
data-hf-next
|
|
54
54
|
type="button"
|
|
55
55
|
aria-label="Next slide"
|
|
56
|
-
style="${o}" >›</button>`:"",
|
|
56
|
+
style="${o}" >›</button>`:"",y=document.fullscreenElement===this,k=`<button
|
|
57
57
|
data-hf-fullscreen
|
|
58
58
|
type="button"
|
|
59
|
-
aria-label="${
|
|
60
|
-
aria-pressed="${
|
|
61
|
-
style="${o}" >${
|
|
59
|
+
aria-label="${y?"Exit full screen":"Full screen"}"
|
|
60
|
+
aria-pressed="${y?"true":"false"}"
|
|
61
|
+
style="${o}" >${y?C:q}</button>`;if(r==="fs-only")return`
|
|
62
62
|
<div
|
|
63
63
|
data-hf-nav-cluster
|
|
64
64
|
style="position:absolute;bottom:${t};right:32px;display:inline-flex;align-items:center;background:rgba(20,20,22,0.55);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,0.12);border-radius:999px;box-shadow:0 4px 24px rgba(0,0,0,0.45);padding:4px;pointer-events:auto;"
|
|
65
|
-
>${k}</div>`;let P=i?"4px":"10px",A=
|
|
65
|
+
>${k}</div>`;let P=i?"4px":"10px",A=l?"4px":"10px";return`
|
|
66
66
|
<div
|
|
67
67
|
data-hf-nav-cluster
|
|
68
68
|
style="position:absolute;bottom:${t};right:32px;display:inline-flex;align-items:center;gap:2px;background:rgba(20,20,22,0.55);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,0.12);border-radius:999px;box-shadow:0 4px 24px rgba(0,0,0,0.45);padding:4px;pointer-events:auto;"
|
|
69
69
|
>
|
|
70
70
|
${h}
|
|
71
|
-
${
|
|
71
|
+
${a?'<span aria-hidden="true" style="width:1px;height:20px;background:rgba(255,255,255,0.12);margin:0 2px;flex-shrink:0;"></span>':""}
|
|
72
72
|
${c}
|
|
73
73
|
<span
|
|
74
74
|
data-hf-counter
|
|
@@ -78,6 +78,6 @@
|
|
|
78
78
|
${b}
|
|
79
79
|
<span aria-hidden="true" style="width:1px;height:20px;background:rgba(255,255,255,0.12);margin:0 2px;flex-shrink:0;"></span>
|
|
80
80
|
${k}
|
|
81
|
-
</div>`}wireChromeButtons(){let e=this.chrome;if(!e)return;let t=e.querySelector("[data-hf-mute]"),r=e.querySelector("[data-hf-prev]"),s=e.querySelector("[data-hf-next]");t&&t.addEventListener("click",()=>this.toggleMute()),r&&r.addEventListener("click",()=>this.controller?.prev()),s&&s.addEventListener("click",()=>this.controller?.next());let
|
|
82
|
-
`)[0]??"":"";return e.length>0?`${p(n.sceneId)}: ${p(e)}`:p(n.sceneId)}function w(n){return"scenes"in n&&Array.isArray(n.scenes)?n.scenes:[]}var
|
|
81
|
+
</div>`}wireChromeButtons(){let e=this.chrome;if(!e)return;let t=e.querySelector("[data-hf-mute]"),r=e.querySelector("[data-hf-prev]"),s=e.querySelector("[data-hf-next]"),i=e.querySelector("[data-hf-presenter-notes]");if(t&&t.addEventListener("click",()=>this.toggleMute()),r&&r.addEventListener("click",()=>this.controller?.prev()),s&&s.addEventListener("click",()=>this.controller?.next()),i instanceof HTMLTextAreaElement){let a=i.getAttribute("data-hf-presenter-notes-key");i.addEventListener("input",()=>this.writePresenterNotes(a,i.value))}let l=e.querySelector("[data-hf-fullscreen]");l&&l.addEventListener("click",()=>this.toggleFullscreen());for(let a of e.querySelectorAll("[data-hotspot-id]")){let o=a.getAttribute("data-hotspot-target")??"";a.addEventListener("click",()=>this.controller?.enterBranch?.(o))}}onFsChange=()=>{let e=this.chrome?.querySelector("[data-hf-fullscreen]");if(!e)return;let t=document.fullscreenElement===this;e.innerHTML=t?C:q,e.setAttribute("aria-label",t?"Exit full screen":"Full screen"),e.setAttribute("aria-pressed",t?"true":"false")};toggleFullscreen(){document.fullscreenElement===this?document.exitFullscreen().catch(()=>{}):this.requestFullscreen().catch(()=>{})}toggleMute(){this._muted=!this._muted,this._muted?this.setAttribute("data-hf-muted",""):this.removeAttribute("data-hf-muted"),this.applyGlobalMute(this._muted),this.dispatchEvent(new CustomEvent("hf-sound",{detail:{muted:this._muted},bubbles:!0,composed:!0})),this.render()}applyGlobalMute(e){for(let r of this.querySelectorAll("hyperframes-player")){if(!(r instanceof HTMLElement))continue;let s=r;"muted"in s?s.muted=e:e?s.setAttribute("muted",""):s.removeAttribute("muted")}let t=this.ownerDocument;for(let r of t.querySelectorAll("video, audio"))r instanceof HTMLMediaElement&&(r.muted=e||r.defaultMuted)}stopDocumentMedia(){let e=this.ownerDocument;for(let t of e.querySelectorAll("video, audio"))t instanceof HTMLMediaElement&&t.pause()}presenterNotesDeckKey(){let e=this.getAttribute("notes-storage-key")?.trim();if(e)return e;let t=this.querySelector("hyperframes-player")?.getAttribute("src")??"",r=t;try{let l=typeof location<"u"?location.href:"http://localhost/";r=new URL(t,l).href}catch{}let s=typeof location<"u"?`${location.origin}${location.pathname}`:"",i=this.ownerDocument.title;return`${s}|${i}|${r}`}presenterNotesStorageKey(e){let t=this.controller?.position;return t?`${J}${JSON.stringify([this.presenterNotesDeckKey(),t.sequenceId,t.slideIndex,e.sceneId??""])}`:null}readPresenterNotes(e){if(!e||typeof window>"u")return null;try{return window.localStorage.getItem(e)}catch{return null}}writePresenterNotes(e,t){if(e&&!(typeof window>"u"))try{window.localStorage.setItem(e,t)}catch{}}renderPresenter(){if(!this.controller)return;let{counter:e,currentSlide:t,nextSlide:r}=this.controller;if(!t)return;let s=this.presenterStartMs!==null?Math.floor((Date.now()-this.presenterStartMs)/1e3):0,i=this.querySelector("hyperframes-player");i instanceof HTMLElement&&(i.style.top="0",i.style.bottom="32%",i.style.height="auto");let l=this.presenterNotesStorageKey(t),a=this.readPresenterNotes(l)??t.notes??"";this.paintChrome($({notes:a,notesStorageKey:l,nextText:Z(r),counterText:`${e.index} / ${e.total}`,elapsedText:S(s),hotspots:t.hotspots})+this.buildNavCluster(e,"calc(32% + 18px)"))}};function Z(n){if(n===null)return"End of sequence";let e=n.notes!=null?n.notes.split(`
|
|
82
|
+
`)[0]??"":"";return e.length>0?`${p(n.sceneId)}: ${p(e)}`:p(n.sceneId)}function w(n){return"scenes"in n&&Array.isArray(n.scenes)?n.scenes:[]}var ee=5e3;function te(n){return n.ready===!0?Promise.resolve():new Promise(e=>{let t=null,r=()=>{t!==null&&(clearTimeout(t),t=null),e()};n.addEventListener("ready",r,{once:!0}),t=setTimeout(()=>{n.removeEventListener("ready",r),e()},ee)})}function ne(n,e,t=()=>!1){let r=w(n);if(r.length>0)return Promise.resolve(r);let s=Math.ceil(e/100);return new Promise(i=>{let l=!1,a=null,o=0,d=c=>{l||(l=!0,a!==null&&clearTimeout(a),n.removeEventListener("scenes",u),i(c))},u=()=>{if(t())return d([]);let c=w(n);c.length>0&&d(c)},h=()=>{if(l)return;if(t())return d([]);let c=w(n);if(c.length>0)return d(c);if(o+=1,o>=s)return d([]);a=setTimeout(h,100)};n.addEventListener("scenes",u),a=setTimeout(h,100)})}function L(n){let e=s=>s.end>s.start,t=n.slides.filter(e),r={};for(let[s,i]of Object.entries(n.sequences))r[s]={...i,slides:i.slides.filter(e)};return{slides:t,sequences:r}}function p(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}customElements.get("hyperframes-slideshow")||customElements.define("hyperframes-slideshow",v);return D(re);})();
|
|
83
83
|
//# sourceMappingURL=hyperframes-slideshow.global.js.map
|