@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.
@@ -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 y=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var N=(n,e)=>{for(var t in e)y(n,t,{get:e[t],enumerable:!0})},B=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of H(e))!_.call(n,s)&&s!==t&&y(n,s,{get:()=>e[s],enumerable:!(r=F(e,s))||r.enumerable});return n};var D=n=>B(y({},"__esModule",{value:!0}),n);var ne={};N(ne,{HyperframesSlideshow:()=>v,dropInvalidSlides:()=>L});var G="application/hyperframes-slideshow+json";function O(n="i"){let e=G.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`<script[^>]*type=["']${e}["'][^>]*>([\\s\\S]*?)<\\/script>`,n)}function I(n){let t=O("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 E(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(E)}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(E)||e.slideSequences!==void 0&&(!Array.isArray(e.slideSequences)||!e.slideSequences.every(j)))}function U(n,e){return`slide "${n}" sets ${e==="startTime"?"endTime":"startTime"} but ${e} cannot be resolved (no scene "${n}")`}function K(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 a=r===void 0?"startTime":"endTime";t.push(U(i,a));let l=r??s??0;return{start:l,end:l}}return{start:r??e.start,end:s??e.start+e.duration}}function Y(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}=K(n,r,t);n.startTime!==void 0&&n.endTime!==void 0&&i<=s&&t.push(`slide "${n.sceneId}" has endTime (${i}) <= startTime (${s})`);let a=[...new Set(n.fragments??[])].sort((l,o)=>l-o);return Y(n.sceneId,a,s,i,t),{...n,start:s,end:i,fragments:a,hotspots:n.hotspots??[]}}function M(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)),a=[...i,...Object.values(s).flatMap(o=>o.slides)];for(let o of a)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 l=[...i].sort((o,d)=>o.start-d.start);for(let o=1;o<l.length;o++){let d=l[o-1],u=l[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";var g=class{constructor(e,t){this.player=e;this.show=t;this.unsub=e.onTimeUpdate(r=>this.onTime(r)),this.enterSlide(0)}player;show;stack=[{sequenceId:f,slideIndex:0,fragmentIndex:-1}];holdAt=null;holdTarget=null;changeCbs=new Set;unsub;dispose(){this.unsub()}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()}enterSlide(e){this.frame.slideIndex=e,this.frame.fragmentIndex=-1,this.holdAt=null;let t=this.currentSlide;if(!t)return;let r=t.fragments.length>0?t.fragments[0]??t.end:this.restFrame(t);this.playTo(r),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.holdAt=null,this.playTo(s),this.emitChange()}nextStop(e,t){return e.fragments[t+1]??e.end}playTo(e){let t=this.currentSlide;this.holdTarget=e,this.holdAt=t?Math.min(e+.2,t.end):e+.2,this.player.seek(e),this.player.play()}onTime(e){if(this.holdAt!==null&&e>=this.holdAt-.001){let t=this.holdTarget;this.holdAt=null,this.holdTarget=null;let r=this.currentSlide;if(r&&t!==null){let s=r.fragments.indexOf(t);s!==-1&&(this.frame.fragmentIndex=s,this.emitChange())}this.player.pause()}}next(){let e=this.currentSlide;if(!e)return;if(this.frame.fragmentIndex+1<e.fragments.length){let s=this.nextStop(e,this.frame.fragmentIndex);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.stack.push({sequenceId:e,slideIndex:0,fragmentIndex:-1}),this.enterSlide(0))}back(){this.stack.length<=1||(this.stack.pop(),this.resumeSlide(this.frame.slideIndex,this.frame.fragmentIndex))}backToMain(){this.stack.length<=1||(this.stack=[this.stack[0]],this.resumeSlide(this.frame.slideIndex,this.frame.fragmentIndex))}syncTo(e,t,r){let s=this.stack[0];if(!s)return;if(this.frame.sequenceId!==e&&(this.stack=[s],e!==f)){let a=this.show.sequences[e];if(!a||a.slides.length===0)return;this.stack.push({sequenceId:e,slideIndex:0,fragmentIndex:-1})}let i=this.slidesOf(this.frame.sequenceId);t<0||t>=i.length||this.resumeSlide(t,r)}};function X(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=>{X(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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=i=>e(i).replace(/"/g,"&quot;"),r=n.notes?e(n.notes):'<span style="opacity:.4">No notes for this slide</span>',s=n.hotspots.length?`<div style="display:flex;flex-direction:column;gap:6px;">
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=i=>e(i).replace(/"/g,"&quot;"),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;">&#8627; ${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
- <div data-hf-presenter-notes style="flex:1;min-width:0;padding:24px 36px;overflow-y:auto;font-size:21px;line-height:1.55;">${r}</div>
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 J(){if(R)return;R=!0;let n=document.createElement("style");n.textContent=`
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 ee(t),e!==this.initGeneration))return;let r=this.innerHTML,s;try{s=I(r)}catch{return}if(!s)return;let i=await te(t,2500,()=>e!==this.initGeneration);if(e!==this.initGeneration)return;let{resolved:a,errors:l}=M(s,i);l.length>0&&console.warn("[hyperframes-slideshow] manifest errors:",l);let o=L(a);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:",l);let d={seek:u=>t.seek(u),play:()=>t.play(),pause:()=>t.pause(),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,a=s||!i&&(r===document.body||r===null);if(e.key==="ArrowRight"){if(!a)return;this.controller.next(),e.preventDefault()}else if(e.key==="ArrowLeft"){if(!a)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
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){J(),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,a=s.canNext!==!1,l=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=l?`<button
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}" >&#8249;</button>`:"",b=a?`<button
52
+ style="${o}" >&#8249;</button>`:"",b=l?`<button
53
53
  data-hf-next
54
54
  type="button"
55
55
  aria-label="Next slide"
56
- style="${o}" >&#8250;</button>`:"",x=document.fullscreenElement===this,k=`<button
56
+ style="${o}" >&#8250;</button>`:"",y=document.fullscreenElement===this,k=`<button
57
57
  data-hf-fullscreen
58
58
  type="button"
59
- aria-label="${x?"Exit full screen":"Full screen"}"
60
- aria-pressed="${x?"true":"false"}"
61
- style="${o}" >${x?C:q}</button>`;if(r==="fs-only")return`
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=a?"4px":"10px";return`
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
- ${l?'<span aria-hidden="true" style="width:1px;height:20px;background:rgba(255,255,255,0.12);margin:0 2px;flex-shrink:0;"></span>':""}
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 i=e.querySelector("[data-hf-fullscreen]");i&&i.addEventListener("click",()=>this.toggleFullscreen());for(let a of e.querySelectorAll("[data-hotspot-id]")){let l=a.getAttribute("data-hotspot-target")??"";a.addEventListener("click",()=>this.controller?.enterBranch?.(l))}}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.dispatchEvent(new CustomEvent("hf-sound",{detail:{muted:this._muted},bubbles:!0,composed:!0})),this.render()}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"),this.paintChrome($({notes:t.notes??"",nextText:Q(r),counterText:`${e.index} / ${e.total}`,elapsedText:S(s),hotspots:t.hotspots})+this.buildNavCluster(e,"calc(32% + 18px)"))}};function Q(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 Z=5e3;function ee(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()},Z)})}function te(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 a=!1,l=null,o=0,d=c=>{a||(a=!0,l!==null&&clearTimeout(l),n.removeEventListener("scenes",u),i(c))},u=()=>{if(t())return d([]);let c=w(n);c.length>0&&d(c)},h=()=>{if(a)return;if(t())return d([]);let c=w(n);if(c.length>0)return d(c);if(o+=1,o>=s)return d([]);l=setTimeout(h,100)};n.addEventListener("scenes",u),l=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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}customElements.get("hyperframes-slideshow")||customElements.define("hyperframes-slideshow",v);return D(ne);})();
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}customElements.get("hyperframes-slideshow")||customElements.define("hyperframes-slideshow",v);return D(re);})();
83
83
  //# sourceMappingURL=hyperframes-slideshow.global.js.map