@jokerized/decksmith 0.8.0 → 0.9.1

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.
Files changed (64) hide show
  1. package/README.md +333 -4
  2. package/dist/cli.js +14057 -4749
  3. package/dist/deck-player-element.js +1 -1
  4. package/dist/deck-player.js +1 -1
  5. package/dist/deck-runtime.js +70 -2
  6. package/dist/index.js +13309 -4178
  7. package/dist/mcp.js +5131 -765
  8. package/dist/types/bespoke/art.d.ts +173 -0
  9. package/dist/types/bespoke/cache.d.ts +69 -0
  10. package/dist/types/bespoke/callouts.d.ts +76 -0
  11. package/dist/types/bespoke/contract.d.ts +57 -0
  12. package/dist/types/bespoke/inspect.d.ts +69 -0
  13. package/dist/types/bespoke/pipeline.d.ts +207 -0
  14. package/dist/types/bespoke/probe.d.ts +34 -0
  15. package/dist/types/bespoke/prompt.d.ts +182 -0
  16. package/dist/types/bespoke/references.d.ts +73 -0
  17. package/dist/types/bespoke/repair.d.ts +121 -0
  18. package/dist/types/bespoke/scene.d.ts +97 -0
  19. package/dist/types/bespoke/select.d.ts +52 -0
  20. package/dist/types/bespoke/sheet.d.ts +26 -0
  21. package/dist/types/bespoke/shots.d.ts +128 -0
  22. package/dist/types/bespoke/untangle.d.ts +5 -0
  23. package/dist/types/build/files.d.ts +13 -1
  24. package/dist/types/deck/motion.d.ts +64 -0
  25. package/dist/types/deck/playback.d.ts +206 -0
  26. package/dist/types/deck/repack.d.ts +10 -0
  27. package/dist/types/deck/runtime.d.ts +96 -1
  28. package/dist/types/deck/subtitles.d.ts +29 -1
  29. package/dist/types/emit/archetypes/annotated-figure.d.ts +1 -1
  30. package/dist/types/emit/archetypes/bar-compare.d.ts +0 -28
  31. package/dist/types/emit/archetypes/callout.d.ts +0 -5
  32. package/dist/types/emit/archetypes/claim-figure.d.ts +15 -0
  33. package/dist/types/emit/archetypes/grid.d.ts +0 -14
  34. package/dist/types/emit/archetypes/index.d.ts +0 -7
  35. package/dist/types/emit/archetypes/line-chart.d.ts +0 -8
  36. package/dist/types/emit/archetypes/pipeline.d.ts +15 -1
  37. package/dist/types/emit/archetypes/stack.d.ts +1 -1
  38. package/dist/types/emit/composition.d.ts +83 -3
  39. package/dist/types/emit/faces.d.ts +22 -0
  40. package/dist/types/emit/fit.d.ts +127 -0
  41. package/dist/types/emit/kit.d.ts +121 -2
  42. package/dist/types/emit/look.d.ts +138 -0
  43. package/dist/types/emit/motion.d.ts +244 -0
  44. package/dist/types/emit/svg.d.ts +54 -16
  45. package/dist/types/emit/theme.d.ts +1 -1
  46. package/dist/types/emit/themes/index.d.ts +19 -1
  47. package/dist/types/emit/themes/packs.d.ts +15 -0
  48. package/dist/types/emit/themes/pick.d.ts +107 -0
  49. package/dist/types/emit/type.d.ts +111 -0
  50. package/dist/types/index.d.ts +52 -1
  51. package/dist/types/plan/codex.d.ts +36 -0
  52. package/dist/types/plan/direct.d.ts +66 -0
  53. package/dist/types/prefs.d.ts +25 -2
  54. package/dist/types/render/capture.d.ts +6 -0
  55. package/dist/types/render/timing.d.ts +3 -0
  56. package/dist/types/source/fonts.d.ts +11 -1
  57. package/dist/types/types.d.ts +109 -0
  58. package/dist/types/verify/check.d.ts +1 -1
  59. package/dist/types/verify/fidelity.d.ts +34 -0
  60. package/dist/types/verify/fill.d.ts +205 -0
  61. package/dist/types/verify/index.d.ts +14 -0
  62. package/dist/types/verify/motion.d.ts +33 -0
  63. package/dist/types/verify/scenes.d.ts +325 -0
  64. package/package.json +5 -1
@@ -1 +1 @@
1
- var o="decksmith-deck";function d(n){return typeof n=="object"&&n!==null&&n.channel===o&&typeof n.type=="string"}var p=5e3,a=class extends HTMLElement{static observedAttributes=["deck"];#t=null;#n=null;#e=0;#r=[];#s=0;#o=!1;get stops(){return this.#r}get at(){return this.#s}get connected(){return this.#o}connectedCallback(){this.#t||this.#a()}disconnectedCallback(){this.#l()}attributeChangedCallback(t,i,e){t==="deck"&&i!==e&&this.isConnected&&(this.#l(),this.#a())}next(){this.#i({channel:o,type:"next"})}prev(){this.#i({channel:o,type:"prev"})}go(t){this.#i({channel:o,type:"go",at:t})}play(t=!0){this.#i({channel:o,type:"play",on:t})}#i(t){this.#t?.contentWindow?.postMessage(t,"*")}#a(){let t=this.getAttribute("deck");if(!t)return;let i;try{i=new URL("deck.html",new URL(t,location.href)).href}catch{this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"bad-deck-url",message:`"${t}" is not a URL a deck can be loaded from.`}}));return}let e=document.createElement("iframe");e.src=i,e.setAttribute("allow","fullscreen; autoplay"),e.setAttribute("allowfullscreen",""),e.title=this.getAttribute("label")??"Deck",e.style.cssText="display:block;width:100%;height:100%;border:0",this.#t=e;let l=r=>{if(r.source!==e.contentWindow||!d(r.data))return;let s=r.data;s.type==="ready"?(this.#e&&clearTimeout(this.#e),this.#e=0,this.#o=!0,this.#r=s.stops,this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-ready",{detail:{stops:s.stops,at:s.at}}))):s.type==="stop"&&(this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-stop",{detail:s})))};this.#n=l,addEventListener("message",l),e.addEventListener("load",()=>{e.contentWindow?.postMessage({channel:o,type:"hello"},"*"),this.#e=setTimeout(()=>{this.#o||this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"no-bridge",message:"The deck did not answer. It was probably built before this element existed \u2014 it still plays, and its own keyboard still works."}}))},p)}),this.style.display||(this.style.display="block"),this.appendChild(e)}#l(){this.#n&&removeEventListener("message",this.#n),this.#e&&clearTimeout(this.#e),this.#n=null,this.#e=0,this.#t?.remove(),this.#t=null,this.#o=!1,this.#r=[],this.#s=0}};function c(n="decksmith-player"){typeof customElements>"u"||customElements.get(n)||customElements.define(n,a)}c();
1
+ var o="decksmith-deck";function d(n){return typeof n=="object"&&n!==null&&n.channel===o&&typeof n.type=="string"}var p=5e3,a=class extends HTMLElement{static observedAttributes=["deck"];#t=null;#n=null;#e=0;#r=[];#s=0;#o=!1;get stops(){return this.#r}get at(){return this.#s}get connected(){return this.#o}connectedCallback(){this.#t||this.#a()}disconnectedCallback(){this.#l()}attributeChangedCallback(t,i,e){t==="deck"&&i!==e&&this.isConnected&&(this.#l(),this.#a())}next(){this.#i({channel:o,type:"next"})}prev(){this.#i({channel:o,type:"prev"})}go(t){this.#i({channel:o,type:"go",at:t})}play(t=!0){this.#i({channel:o,type:"play",on:t})}#i(t){this.#t?.contentWindow?.postMessage(t,"*")}#a(){let t=this.getAttribute("deck");if(!t)return;let i;try{i=new URL("deck.html",new URL(t,location.href)).href}catch{this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"bad-deck-url",message:`"${t}" is not a URL a deck can be loaded from.`}}));return}let e=document.createElement("iframe");e.src=i,e.setAttribute("allow","fullscreen; autoplay"),e.setAttribute("allowfullscreen",""),e.setAttribute("sandbox","allow-scripts allow-same-origin allow-downloads"),e.title=this.getAttribute("label")??"Deck",e.style.cssText="display:block;width:100%;height:100%;border:0",this.#t=e;let l=r=>{if(r.source!==e.contentWindow||!d(r.data))return;let s=r.data;s.type==="ready"?(this.#e&&clearTimeout(this.#e),this.#e=0,this.#o=!0,this.#r=s.stops,this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-ready",{detail:{stops:s.stops,at:s.at}}))):s.type==="stop"&&(this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-stop",{detail:s})))};this.#n=l,addEventListener("message",l),e.addEventListener("load",()=>{e.contentWindow?.postMessage({channel:o,type:"hello"},"*"),this.#e=setTimeout(()=>{this.#o||this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"no-bridge",message:"The deck did not answer. It was probably built before this element existed \u2014 it still plays, and its own keyboard still works."}}))},p)}),this.style.display||(this.style.display="block"),this.appendChild(e)}#l(){this.#n&&removeEventListener("message",this.#n),this.#e&&clearTimeout(this.#e),this.#n=null,this.#e=0,this.#t?.remove(),this.#t=null,this.#o=!1,this.#r=[],this.#s=0}};function c(n="decksmith-player"){typeof customElements>"u"||customElements.get(n)||customElements.define(n,a)}c();
@@ -1 +1 @@
1
- var o="decksmith-deck";function d(n){return typeof n=="object"&&n!==null&&n.channel===o&&typeof n.type=="string"}var c=5e3,a=class extends HTMLElement{static observedAttributes=["deck"];#t=null;#n=null;#e=0;#r=[];#s=0;#o=!1;get stops(){return this.#r}get at(){return this.#s}get connected(){return this.#o}connectedCallback(){this.#t||this.#a()}disconnectedCallback(){this.#l()}attributeChangedCallback(t,i,e){t==="deck"&&i!==e&&this.isConnected&&(this.#l(),this.#a())}next(){this.#i({channel:o,type:"next"})}prev(){this.#i({channel:o,type:"prev"})}go(t){this.#i({channel:o,type:"go",at:t})}play(t=!0){this.#i({channel:o,type:"play",on:t})}#i(t){this.#t?.contentWindow?.postMessage(t,"*")}#a(){let t=this.getAttribute("deck");if(!t)return;let i;try{i=new URL("deck.html",new URL(t,location.href)).href}catch{this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"bad-deck-url",message:`"${t}" is not a URL a deck can be loaded from.`}}));return}let e=document.createElement("iframe");e.src=i,e.setAttribute("allow","fullscreen; autoplay"),e.setAttribute("allowfullscreen",""),e.title=this.getAttribute("label")??"Deck",e.style.cssText="display:block;width:100%;height:100%;border:0",this.#t=e;let l=r=>{if(r.source!==e.contentWindow||!d(r.data))return;let s=r.data;s.type==="ready"?(this.#e&&clearTimeout(this.#e),this.#e=0,this.#o=!0,this.#r=s.stops,this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-ready",{detail:{stops:s.stops,at:s.at}}))):s.type==="stop"&&(this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-stop",{detail:s})))};this.#n=l,addEventListener("message",l),e.addEventListener("load",()=>{e.contentWindow?.postMessage({channel:o,type:"hello"},"*"),this.#e=setTimeout(()=>{this.#o||this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"no-bridge",message:"The deck did not answer. It was probably built before this element existed \u2014 it still plays, and its own keyboard still works."}}))},c)}),this.style.display||(this.style.display="block"),this.appendChild(e)}#l(){this.#n&&removeEventListener("message",this.#n),this.#e&&clearTimeout(this.#e),this.#n=null,this.#e=0,this.#t?.remove(),this.#t=null,this.#o=!1,this.#r=[],this.#s=0}};function u(n="decksmith-player"){typeof customElements>"u"||customElements.get(n)||customElements.define(n,a)}export{a as DecksmithPlayer,u as define};
1
+ var o="decksmith-deck";function d(n){return typeof n=="object"&&n!==null&&n.channel===o&&typeof n.type=="string"}var c=5e3,r=class extends HTMLElement{static observedAttributes=["deck"];#t=null;#n=null;#e=0;#a=[];#s=0;#o=!1;get stops(){return this.#a}get at(){return this.#s}get connected(){return this.#o}connectedCallback(){this.#t||this.#r()}disconnectedCallback(){this.#l()}attributeChangedCallback(t,i,e){t==="deck"&&i!==e&&this.isConnected&&(this.#l(),this.#r())}next(){this.#i({channel:o,type:"next"})}prev(){this.#i({channel:o,type:"prev"})}go(t){this.#i({channel:o,type:"go",at:t})}play(t=!0){this.#i({channel:o,type:"play",on:t})}#i(t){this.#t?.contentWindow?.postMessage(t,"*")}#r(){let t=this.getAttribute("deck");if(!t)return;let i;try{i=new URL("deck.html",new URL(t,location.href)).href}catch{this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"bad-deck-url",message:`"${t}" is not a URL a deck can be loaded from.`}}));return}let e=document.createElement("iframe");e.src=i,e.setAttribute("allow","fullscreen; autoplay"),e.setAttribute("allowfullscreen",""),e.setAttribute("sandbox","allow-scripts allow-same-origin allow-downloads"),e.title=this.getAttribute("label")??"Deck",e.style.cssText="display:block;width:100%;height:100%;border:0",this.#t=e;let l=a=>{if(a.source!==e.contentWindow||!d(a.data))return;let s=a.data;s.type==="ready"?(this.#e&&clearTimeout(this.#e),this.#e=0,this.#o=!0,this.#a=s.stops,this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-ready",{detail:{stops:s.stops,at:s.at}}))):s.type==="stop"&&(this.#s=s.at,this.dispatchEvent(new CustomEvent("ds-stop",{detail:s})))};this.#n=l,addEventListener("message",l),e.addEventListener("load",()=>{e.contentWindow?.postMessage({channel:o,type:"hello"},"*"),this.#e=setTimeout(()=>{this.#o||this.dispatchEvent(new CustomEvent("ds-error",{detail:{reason:"no-bridge",message:"The deck did not answer. It was probably built before this element existed \u2014 it still plays, and its own keyboard still works."}}))},c)}),this.style.display||(this.style.display="block"),this.appendChild(e)}#l(){this.#n&&removeEventListener("message",this.#n),this.#e&&clearTimeout(this.#e),this.#n=null,this.#e=0,this.#t?.remove(),this.#t=null,this.#o=!1,this.#a=[],this.#s=0}};function u(n="decksmith-player"){typeof customElements>"u"||customElements.get(n)||customElements.define(n,r)}export{r as DecksmithPlayer,u as define};
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var H="decksmith-deck";function q(e){return typeof e=="object"&&e!==null&&e.channel===H&&typeof e.type=="string"}var $='script[type="application/decksmith-narration+json"]';function R(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function J(e){let n=e,r=R(n?.start),t=R(n?.end);return r===void 0||t===void 0||t<r?null:{start:r,end:t,text:typeof n?.text=="string"?n.text:""}}var U=84;function P(e,n){let r=[],t="";for(let o of e)t===""?t=o:t.length+1+o.length<=n?t+=` ${o}`:(r.push(t),t=o);return t!==""&&r.push(t),r}function K(e,n=U){if(e.text.length<=n)return[e];let r=e.text.split(/\s+/).filter(Boolean),t=P(r,n).length,o=n;for(let s=Math.ceil(e.text.length/t);s<n;s++)if(P(r,s).length<=t){o=s;break}let a=P(r,o);if(a.length<2)return[e];let u=a.reduce((s,c)=>s+c.length,0),f=e.end-e.start,h=e.start;return a.map((s,c)=>{let l=c===a.length-1?e.end:h+f*s.length/u,b={start:h,end:l,text:s};return h=l,b})}function Q(e){let n=e,r=R(n?.stop);if(r===void 0||r<0||!n?.audio||typeof n.audio!="string")return null;let t=Array.isArray(n.cues)?n.cues.map(J).filter(o=>o!==null):[];return t.sort((o,a)=>o.start-a.start),{stop:r,audio:n.audio,cues:t.flatMap(o=>K(o))}}function _(e){if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}let r=n,t=r?.scenes;if(!t||typeof t!="object"||Array.isArray(t))return null;let o={};for(let[a,u]of Object.entries(t)){if(!Array.isArray(u))continue;let f=u.map(Q).filter(h=>h!==null);f.length>0&&(o[a]=f)}return Object.keys(o).length===0?null:{voice:typeof r?.voice=="string"?r.voice:"",dir:typeof r?.dir=="string"?r.dir:"",scenes:o}}function V(e,n){for(let r of e){if(n<r.start)return null;if(n<r.end)return r}return null}function j(e,n,r){return e?.scenes[n]?.find(t=>t.stop===r)??null}function z(e,n){let r=e.dir.replace(/\/+$/,"");return r===""||/^[a-z][a-z0-9+.-]*:|^\.{0,2}\//i.test(n.audio)?n.audio:`${r}/${n.audio}`}function B(...e){for(let n of e)if(typeof n=="number"&&Number.isFinite(n))return n}function Z(e){let n=[];for(let r of e){let t=B(r.startTime);if(t===void 0)continue;let o=B(r.endTime)??Number.POSITIVE_INFINITY,a=n.length===0?0:n[n.length-1].slide+1,u=r.notes??"",f=[...new Set(r.fragments??[])].filter(l=>Number.isFinite(l)&&l>t&&l<=o).sort((l,b)=>l-b),[h,...s]=f,c=r.sceneId;n.push({t:h??t,slide:a,fragment:0,notes:u,sceneId:c});for(let[l,b]of s.entries())n.push({t:b,slide:a,fragment:l+1,notes:u,sceneId:c})}return n}var ee=2.5;function te(e,n,r={}){let t=n-e;return r.reducedMotion===!0||t<=0||t>ee?{animate:!1,durationMs:0}:{animate:!0,durationMs:t*1e3}}var ne=1500,re=8e3;function oe(e){return!e.playing||e.heard?null:Math.min(re,Math.max(ne,e.gapMs))}function se(e){return e.fragment>0?`#${e.slide+1}.${e.fragment}`:`#${e.slide+1}`}function X(e){let n=/^#?(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!n)return null;let r=Number(n[1]);return r<1?null:{slide:r-1,fragment:n[2]===void 0?0:Number(n[2])}}function W(e,n){let r=e.findIndex(t=>t.slide===n.slide&&t.fragment===n.fragment);return r>=0?r:e.findIndex(t=>t.slide===n.slide)}var ie='script[type="application/hyperframes-slideshow+json"]';function ae(e){let n=e.shadowRoot?.querySelector("iframe")??e.querySelector("iframe")??null;try{let r=n?.contentDocument,t=n?.contentWindow;return r&&t?{doc:r,get timelines(){return t.__timelines??{}}}:null}catch{return null}}function le(e,n,r){let t=e.startTime??0,o=Number.isFinite(n)&&n>0?t+n:e.endTime??Number.POSITIVE_INFINITY;return r>=t&&r<o}function G(e,n,r){for(let t of n){let o=e.doc.getElementById(t.sceneId),a=Number(o?.getAttribute?.("data-duration")??Number.NaN),u=le(t,a,r);o?.style&&(o.style.display=u?"":"none"),u&&e.timelines[t.sceneId]?.seek(Math.max(0,r-(t.startTime??0)))}}function ce(e){let n=e.querySelector(ie);if(!n?.textContent)return[];try{let t=JSON.parse(n.textContent)?.slides;return Array.isArray(t)?t.filter(o=>typeof o?.sceneId=="string"):[]}catch{return[]}}function ue(e){return e.ready===!0?Promise.resolve():new Promise(n=>{let r=()=>{clearTimeout(t),n()},t=setTimeout(()=>{e.removeEventListener("ready",r),n()},5e3);e.addEventListener("ready",r,{once:!0})})}var de=`
1
+ "use strict";(()=>{var Ee='script[type="application/decksmith-motion+json"]';function Se(e){if(!e)return null;try{let t=JSON.parse(e),n={};if(t.holds&&typeof t.holds=="object")for(let[r,o]of Object.entries(t.holds)){if(!Array.isArray(o))continue;let i=o.filter(a=>typeof a=="object"&&a!==null&&[a.at,a.from,a.to].every(y=>typeof y=="number"&&Number.isFinite(y))&&a.to>a.at);i.length&&(n[r]=i)}return{seams:t.seams===!0,holds:n}}catch{return null}}function ke(e,t){return e.holds[t.sceneId]?.find(n=>Math.abs(n.at-t.t)<.002)}function Me(e,t){let n=e.from+Math.max(0,t);return Math.min(e.to,Math.max(e.at,n))}var pt=4;function Te(e,t,n,r,o){if(!t||n.fragment!==0||n.slide!==t.slide+1||n.t-e<=o)return null;let i=r.find(a=>a.sceneId===n.sceneId)?.startTime;return typeof i!="number"||!Number.isFinite(i)||i<=e||n.t-i>pt||n.t<=i?null:i}function ft(e){return Math.round(1920**.5*e.width**(1-.5))}function Ae(e){return Math.round(e.height*ft(e)/e.width)}var le="decksmith-player",fn=`<meta name="${le}" content="2" />`;var j=[.75,1,1.25,1.5,1.75,2],W=["s","m","l","xl"],ht={s:.8,m:1,l:1.3,xl:1.6},bt={speed:1,cc:!0,ccsize:"m"},ce="decksmith.prefs.v1",ue="decksmith:prefs";function He(e){let t=typeof e=="string"&&e.trim()!==""?Number(e):e;if(typeof t!="number"||!Number.isFinite(t)||t<=0)return;let n=j[0];for(let r of j)Math.abs(r-t)<Math.abs(n-t)&&(n=r);return n}function gt(e){if(typeof e=="boolean")return e;if(typeof e=="number")return e===1?!0:e===0?!1:void 0;if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="1"||t==="on"||t==="true"||t==="yes")return!0;if(t==="0"||t==="off"||t==="false"||t==="no")return!1}function yt(e){let t=typeof e=="string"?e.trim().toLowerCase():"";return W.includes(t)?t:void 0}function Q(e){if(typeof e!="object"||e===null)return{};let t=e,n={},r=He(t.speed);r!==void 0&&(n.speed=r);let o=gt(t.cc);o!==void 0&&(n.cc=o);let i=yt(t.ccsize);return i!==void 0&&(n.ccsize=i),n}function Fe(e){let t=new URLSearchParams(e);return Q({speed:t.get("speed")??void 0,cc:t.get("cc")??void 0,ccsize:t.get("ccsize")??void 0})}function Re(e){if(!e)return{};try{return Q(JSON.parse(e))}catch{return{}}}function de(e,t){return{...bt,...e,...t}}function _e(e,t){let n=j.indexOf(He(e)??1);return j[Math.max(0,Math.min(j.length-1,n+t))]}function ee(e){return`${e}\xD7`}var xt=.03,Le=13,wt=56,vt={s:Le,m:Le,l:16,xl:19},Ce=3,Ie=1.25,Y=40,Pe=52,X=8,ie=12,ae=4.6,Et=1.2,St=24,kt=.88,Ne=44;function $e(e,t,n,r,o={}){let i=n>0&&Number.isFinite(n)?n:1.7777777777777777,a=Math.max(0,e),y=Math.max(0,t),d=Math.min(i,1),c=Math.max(0,Math.min(.25,o.safeBottom??0)),b=0,f=0;if(r.on){let E=xt*ht[r.size]*d,P=Math.min(a/i,y/(1+Ce*E));b=Math.min(wt,Math.max(vt[r.size],E*P)),f=Ce*b}let v=Math.max(ie,.04*a),S=E=>b>0?Math.min(Ne,2*kt*Math.max(0,E)/b):Ne,m=Math.max(0,Math.min(a/i,y-f)),M=y-m-f;if(M>=Y+X){let E=m*i,P=Math.min(Pe,Math.max(Y,E/10),M-X),N=P+X,I=(a-E)/2,H=Math.max(0,(y-m-f-N)/2);return{slideW:E,slideH:m,slideX:I,slideY:H,capFont:b,capH:f,dock:"letterbox",bar:{x:I,y:H+m+f,w:E,h:N},btn:P,compact:E<2*ae*P,barInset:6,strip:{x:0,y:H+m,w:a,h:f},stripPad:v,cueEm:S(a-2*v)}}let k=Math.min(Pe+X,c*m);if(k>=Y+X){let E=m*i,P=(a-E)/2,N=Math.max(0,(y-m-f)/2);return{slideW:E,slideH:m,slideX:P,slideY:N,capFont:b,capH:f,dock:"pad",bar:{x:P,y:N+m-k,w:E,h:k},btn:k-X,compact:E<2*ae*Y,barInset:6,strip:{x:0,y:N+m,w:a,h:f},stripPad:v,cueEm:S(a-2*v)}}let x=Y,F=(E,P)=>{let N=Math.max(f,x),I=Math.max(0,Math.min(a/i,y-N)),H=I*i,p=P?4:Math.max(4,(a-H)/2),$=p+E*x+ie/2;return{bandH:N,slideH:I,slideW:H,inset:p,pad:$,measure:a-2*$}},A=!1,w=F(ae,!1);(r.on?w.measure<St*b:w.measure<ie*2)&&(A=!0,w=F(Et,!0));let T=(a-w.slideW)/2,_=Math.max(0,(y-w.slideH-w.bandH)/2),B=_+w.slideH;return{slideW:w.slideW,slideH:w.slideH,slideX:T,slideY:_,capFont:b,capH:r.on?w.bandH:0,dock:"band",bar:{x:0,y:B,w:a,h:w.bandH},btn:x,compact:A,barInset:w.inset,strip:{x:0,y:B,w:a,h:r.on?w.bandH:0},stripPad:w.pad,cueEm:S(w.measure)}}function ze(e,t){if(!(e>0&&t>0))return 0;let n=Ae({width:e,height:t});return Math.max(0,(84-Mt)/n)}var Mt=16;function Oe(e){if(e.metaKey||e.ctrlKey||e.altKey)return null;let t=Tt(e),n=At[t];return n||(e.repeat?null:Lt[t]??null)}function Tt(e){if(!(e.key==="Process"||e.isComposing===!0||[...e.key].some(r=>r.charCodeAt(0)>127)))return e.key;let n=/^Key([A-Z])$/.exec(e.code??"");return n?n[1].toLowerCase():e.key}var At={ArrowRight:"next",PageDown:"next"," ":"next",ArrowLeft:"prev",PageUp:"prev"},Lt={Home:"first",End:"last",Enter:"play",p:"play",k:"play",c:"captions",s:"captions",">":"faster","<":"slower","+":"bigger","=":"bigger","-":"smaller",m:"mute",n:"notes",v:"video",Escape:"escape",f:"fullscreen"};function De(e,t){let n=W.indexOf(e);return W[Math.max(0,Math.min(W.length-1,n+t))]}var te="decksmith-deck";function Be(e){return typeof e=="object"&&e!==null&&e.channel===te&&typeof e.type=="string"}var Ve='script[type="application/decksmith-narration+json"]';function me(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Ct(e){let t=e,n=me(t?.start),r=me(t?.end);return n===void 0||r===void 0||r<n?null:{start:n,end:r,text:typeof t?.text=="string"?t.text:""}}var Pt=84;function pe(e,t){let n=[],r="";for(let o of e)r===""?r=o:r.length+1+o.length<=t?r+=` ${o}`:(n.push(r),r=o);return r!==""&&n.push(r),n}function Nt(e,t=Pt){if(e.text.length<=t)return[e];let n=e.text.split(/\s+/).filter(Boolean),r=pe(n,t).length,o=t;for(let c=Math.ceil(e.text.length/r);c<t;c++)if(pe(n,c).length<=r){o=c;break}let i=pe(n,o);if(i.length<2)return[e];let a=i.reduce((c,b)=>c+b.length,0),y=e.end-e.start,d=e.start;return i.map((c,b)=>{let f=b===i.length-1?e.end:d+y*c.length/a,v={start:d,end:f,text:c};return d=f,v})}var je=/[\u2E80-\u2FFF\u3000-\u30FF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFF60\uFFE0-\uFFE6]/u,Ht=/[\u1100-\u11FF\u3130-\u318F\uAC00-\uD7AF]/u,Ft=/^[、。,.,.!?!?:;:;))」』】〕〉》・ーぁぃぅぇぉっゃゅょァィゥェォッャュョ]/u;function Rt(e){return je.test(e)?1:Ht.test(e)?.92:.56}var _t=.28,be=44;function It(e){let t=[],n="",r=!1,o=()=>{n!==""&&(t.push({text:n,spaced:r,em:[...n].reduce((i,a)=>i+Rt(a),0)}),n="",r=!1)};for(let i of e)/\s/.test(i)?(o(),r=t.length>0):je.test(i)?(o(),t.push({text:i,spaced:r,em:1}),r=!1):n+=i;return o(),t}function he(e){return e.reduce((t,n,r)=>t+n.em+(r>0&&n.spaced?_t:0),0)}function $t(e){return e.map((t,n)=>n>0&&t.spaced?` ${t.text}`:t.text).join("")}function fe(e,t){let n=[],r=[];for(let o of e){let i=he([...r,o])<=t;r.length===0||i||Ft.test(o.text)?r.push(o):(n.push(r),r=[o])}return r.length>0&&n.push(r),n}function qe(e,t=be){let n=It(e.text),r=he(n);if(r<=t||n.length<2)return[e];let o=fe(n,t).length,i=t;for(let f=Math.ceil(r/o*2)/2;f<t;f+=.5)if(fe(n,f).length<=o){i=f;break}let a=fe(n,i);if(a.length<2)return[e];let y=a.map(he),d=y.reduce((f,v)=>f+v,0),c=e.end-e.start,b=e.start;return a.map((f,v)=>{let S=v===a.length-1?e.end:b+c*y[v]/d,m={start:b,end:S,text:$t(f)};return b=S,m})}function zt(e,t=n=>Nt(n)){let n=e,r=me(n?.stop);if(r===void 0||r<0||!n?.audio||typeof n.audio!="string")return null;let o=Array.isArray(n.cues)?n.cues.map(Ct).filter(i=>i!==null):[];return o.sort((i,a)=>i.start-a.start),{stop:r,audio:n.audio,cues:o.flatMap(t)}}function Ke(e,t={}){if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}let r=n,o=r?.scenes;if(!o||typeof o!="object"||Array.isArray(o))return null;let i={};for(let[a,y]of Object.entries(o)){if(!Array.isArray(y))continue;let d=y.map(c=>zt(c,t.split)).filter(c=>c!==null);d.length>0&&(i[a]=d)}return Object.keys(i).length===0?null:{voice:typeof r?.voice=="string"?r.voice:"",dir:typeof r?.dir=="string"?r.dir:"",scenes:i}}function Xe(e,t){for(let n of e){if(t<n.start)return null;if(t<n.end)return n}return null}function ne(e,t,n){return e?.scenes[t]?.find(r=>r.stop===n)??null}function We(e,t){let n=e.dir.replace(/\/+$/,"");return n===""||/^[a-z][a-z0-9+.-]*:|^\.{0,2}\//i.test(t.audio)?t.audio:`${n}/${t.audio}`}function Ue(...e){for(let t of e)if(typeof t=="number"&&Number.isFinite(t))return t}function Ot(e){let t=[];for(let n of e){let r=Ue(n.startTime);if(r===void 0)continue;let o=Ue(n.endTime)??Number.POSITIVE_INFINITY,i=t.length===0?0:t[t.length-1].slide+1,a=n.notes??"",y=[...new Set(n.fragments??[])].filter(f=>Number.isFinite(f)&&f>r&&f<=o).sort((f,v)=>f-v),[d,...c]=y,b=n.sceneId;t.push({t:d??r,slide:i,fragment:0,notes:a,sceneId:b});for(let[f,v]of c.entries())t.push({t:v,slide:i,fragment:f+1,notes:a,sceneId:b})}return t}var et=2.5;function Dt(e,t,n={}){let r=t-e;return n.reducedMotion===!0||r<=0||r>et?{animate:!1,durationMs:0}:{animate:!0,durationMs:r*1e3/tt(n.rate)}}function tt(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:1}var Bt=1500,Vt=8e3;function jt(e){if(!e.playing||e.heard)return null;let t=tt(e.rate);if(e.silent===!0){let n=Math.max(0,e.revealMs??0);return Math.min(Ye(e.gapMs)/t,n+qt/t)}return Ye(e.gapMs)/t}function Ye(e){return Math.min(Vt,Math.max(Bt,e))}var qt=1500;function Kt(e){return e.fragment>0?`#${e.slide+1}.${e.fragment}`:`#${e.slide+1}`}function Ge(e){let t=/^#?(\d+)(?:\.(\d+))?$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return n<1?null:{slide:n-1,fragment:t[2]===void 0?0:Number(t[2])}}function Je(e,t){let n=e.findIndex(r=>r.slide===t.slide&&r.fragment===t.fragment);return n>=0?n:e.findIndex(r=>r.slide===t.slide)}var Xt='script[type="application/hyperframes-slideshow+json"]';function Wt(e){let t=e.shadowRoot?.querySelector("iframe")??e.querySelector("iframe")??null;try{let n=t?.contentDocument,r=t?.contentWindow;return n&&r?{doc:n,get timelines(){return r.__timelines??{}}}:null}catch{return null}}function Ut(e,t,n){let r=e.startTime??0,o=Number.isFinite(t)&&t>0?r+t:e.endTime??Number.POSITIVE_INFINITY;return n>=r&&n<o}function ge(e,t,n){for(let r of t){let o=e.doc.getElementById(r.sceneId),i=Number(o?.getAttribute?.("data-duration")??Number.NaN),a=Ut(r,i,n);o?.style&&(o.style.display=a?"":"none"),a&&e.timelines[r.sceneId]?.seek(Math.max(0,n-(r.startTime??0)))}}function Yt(e){let t=e.querySelector(Xt);if(!t?.textContent)return[];try{let r=JSON.parse(t.textContent)?.slides;return Array.isArray(r)?r.filter(o=>typeof o?.sceneId=="string"):[]}catch{return[]}}function Gt(e){return e.ready===!0?Promise.resolve():new Promise(t=>{let n=()=>{clearTimeout(r),t()},r=setTimeout(()=>{e.removeEventListener("ready",n),t()},5e3);e.addEventListener("ready",n,{once:!0})})}var Jt=`
2
2
  .ds-chrome{position:fixed;inset:auto 0 0 0;z-index:2147483000;pointer-events:none;
3
3
  font:500 13px/1.5 ui-sans-serif,system-ui,sans-serif;color:#fff}
4
4
  .ds-bar{height:3px;background:rgba(255,255,255,.14)}
@@ -80,4 +80,72 @@
80
80
  text-align:center;color:#fff;font-weight:600;font-size:var(--ds-cap-font);
81
81
  line-height:1.35;text-wrap:pretty}
82
82
  .ds-subs[hidden]{visibility:hidden}
83
- `;function pe(e){let n=e.createElement("style");n.textContent=de,e.head.append(n);let r=e.createElement("div");return r.className="ds-chrome",r.innerHTML='<div class="ds-bar"><i></i></div><button class="ds-play" type="button" aria-label="Play the deck"></button><button class="ds-video" type="button" hidden>Video</button><div class="ds-count"></div><div class="ds-flags"></div><div class="ds-subs" hidden></div><div class="ds-notes" hidden></div>',e.body.append(r),{chrome:r,fill:r.querySelector("i"),play:r.querySelector(".ds-play"),video:r.querySelector(".ds-video"),count:r.querySelector(".ds-count"),notes:r.querySelector(".ds-notes"),flags:r.querySelector(".ds-flags"),subs:r.querySelector(".ds-subs")}}var fe={at:()=>!1,hush:()=>{},toggleMute:()=>{},toggleSubtitles:()=>{},onEnded:()=>{},onSettled:()=>{},unlock:()=>{}};function he(e){return e?.name!=="NotSupportedError"}function me(e,n,r){let t=e.createElement("audio");t.preload="auto",e.body.append(t);let o=!1,a=!0,u=()=>e.documentElement.classList.toggle("ds-cap",a);u();let f=!1,h=!1,s=!1,c=[],l=0,b=null,w=null,E=0,x=()=>{let d=[];f&&s?d.push("press any key for sound"):h?d.push("narration unavailable"):o&&d.push("muted"),a||d.push("subtitles off"),r.flags.textContent=d.join(" \xB7 ")},y=()=>{let d=a?V(c,t.currentTime):null;d!==b&&(b=d,r.subs.textContent=d?.text??"",r.subs.hidden=d===null)},S=()=>{y(),l=t.ended||t.paused&&t.currentTime>0?0:requestAnimationFrame(S)},C=()=>{l&&cancelAnimationFrame(l),l=0,t.pause(),t.removeAttribute("src"),t.load(),c=[],y()},L=()=>{};t.addEventListener("ended",()=>{f||L()});let N=()=>{},k=d=>{let A=++E;w=d,C(),h=!1,x();let g=j(n,d.sceneId,d.fragment);return g?(c=g.cues,t.muted=o,t.src=z(n,g),Promise.resolve(t.play()).then(()=>{A===E&&(f=!1,h=!1,x(),N(!0))},I=>{A===E&&(f=he(I),h=!f,f&&(s=!0),l&&cancelAnimationFrame(l),l=0,c=[],y(),x(),N(!1))}),l===0&&(l=requestAnimationFrame(S)),!0):!1};return{at:k,hush:C,onEnded:d=>{L=d},onSettled:d=>{N=d},toggleMute:()=>{o=!o,t.muted=o,x()},toggleSubtitles:()=>{a=!a,u(),y(),x()},unlock:()=>{!w||!(f||h)||(f=!1,x(),k(w))}}}var ge='script[type="application/decksmith-video+json"]';function be(e){if(!e)return{};let n={};try{let r=JSON.parse(e);for(let[t,o]of Object.entries(r?.scenes??{}))typeof o?.url=="string"&&/^https:\/\//i.test(o.url)&&(n[t]={url:o.url,title:typeof o.title=="string"?o.title:"Video"})}catch{return{}}return n}var ye={at:()=>{},toggle:()=>{},close:()=>!1};function ve(e,n,r,t){let o=null,a=null,u=()=>o?(o.remove(),o=null,!0):!1,f=()=>{if(!a||o)return;t(),o=e.createElement("div"),o.className="ds-film";let s=e.createElement("iframe");s.src=a.url,s.title=a.title,s.allow="fullscreen",s.setAttribute("referrerpolicy","strict-origin-when-cross-origin");let c=e.createElement("button");c.type="button",c.className="ds-shut",c.textContent="\u2715",c.setAttribute("aria-label","Close the video"),c.addEventListener("click",l=>{l.stopPropagation(),u()}),o.append(s,c),r.chrome.append(o),c.focus()},h=()=>{u()||f()};return r.video.addEventListener("click",s=>{s.stopPropagation(),h()}),{at:s=>{u(),a=n[s.sceneId]??null,r.video.hidden=a===null,a&&r.video.setAttribute("aria-label",`Play the video: ${a.title}`)},toggle:h,close:u}}function xe(e){let n=e;return!!n&&(n.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(n.tagName??""))}async function Y(e){let n=ce(e),r=e.querySelector("hyperframes-player");if(n.length===0||!r)return;let t=Z(n);if(t.length===0)return;let o=pe(e),a=_(e.querySelector($)?.textContent),u=a?me(e,a,o):fe,f=be(e.querySelector(ge)?.textContent),h=Object.keys(f).length===0?ye:ve(e,f,o,()=>{u.hush(),k(!1)}),s=0,c=null,l=0,b=0,w=-1,E=i=>{r.seek(i),c&&G(c,n,i),l=i},x=(i,p,m)=>{let v=l,T=0,M=O=>{T===0&&(T=O);let F=Math.min(1,(O-T)/m);if(F<1){l=v+(p-v)*F,G(i,n,l),b=requestAnimationFrame(M);return}b=0,E(p)};b=requestAnimationFrame(M)},y=!1,S=0,C=()=>{S&&clearTimeout(S),S=0},L=()=>{y&&(s+1<t.length?g(s+1):k(!1))},N=i=>{C();let p=t[s],m=t[s+1],v=oe({playing:y,heard:i,gapMs:m?(m.t-p.t)*1e3:0});v!==null&&(S=setTimeout(L,v))},k=i=>{y=i,C(),o.play.dataset.on=i?"1":"0",o.play.setAttribute("aria-label",i?"Pause the deck":"Play the deck"),i&&(w=-1,g(s,!0))},d=null,A=i=>{d===null||parent===window||parent.postMessage(i,d)};addEventListener("message",i=>{if(i.source!==parent||parent===window||!q(i.data))return;let p=i.data;if(p.type==="hello"){d=i.origin,A({channel:H,type:"ready",stops:t.map((m,v)=>({i:v,label:`${m.slide+1} / ${t[t.length-1].slide+1}`,notes:m.notes})),at:s});return}d===i.origin&&(p.type==="next"?g(s+1):p.type==="prev"?g(s-1):p.type==="go"?g(p.at,!0):p.type==="play"&&k(p.on))});let g=(i,p=!1)=>{s=Math.max(0,Math.min(t.length-1,i));let m=t[s];b&&cancelAnimationFrame(b),b=0;let v=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,T=te(l,m.t,{reducedMotion:v});T.animate&&!p&&c?x(c,m.t,T.durationMs):E(m.t);let M=!1;s!==w&&(w=s,M=u.at(m)),h.at(m),N(M),history.replaceState(null,"",se(m)),A({channel:H,type:"stop",at:s,total:t.length,label:`${m.slide+1} / ${t[t.length-1].slide+1}`,notes:m.notes,playing:y}),o.fill.style.transform=`scaleX(${(s+1)/t.length})`,o.count.textContent=`${m.slide+1} / ${t[t.length-1].slide+1}`,o.notes.textContent=m.notes};u.onEnded(L),u.onSettled(N),o.play.addEventListener("click",i=>{i.stopPropagation(),k(!y)}),addEventListener("hashchange",()=>{let i=X(location.hash);if(!i)return;let p=W(t,i);p>=0&&p!==s&&g(p,!0)}),e.addEventListener("keydown",i=>{if(!(i.defaultPrevented||xe(i.target))){switch(i.key){case"ArrowRight":case"PageDown":case" ":g(s+1);break;case"ArrowLeft":case"PageUp":g(s-1);break;case"Home":g(0,!0);break;case"End":g(t.length-1,!0);break;case"n":o.notes.hidden=!o.notes.hidden;break;case"m":u.toggleMute();break;case"s":u.toggleSubtitles();break;case"p":k(!y);break;case"v":h.toggle();break;case"Escape":if(!h.close())return;break;case"f":{(e.fullscreenElement?e.exitFullscreen():e.documentElement.requestFullscreen()).catch(()=>{});break}default:return}i.preventDefault()}}),e.addEventListener("click",i=>{if(o.chrome.contains(i.target))return;let p=(e.documentElement.clientWidth||1)/3;i.clientX>p*2?g(s+1):i.clientX<p&&g(s-1)});let I=()=>u.unlock();if(e.addEventListener("keydown",I),e.addEventListener("click",I),await ue(r),typeof r.seek!="function")return;r.pause?.(),c=ae(r),c?.doc.documentElement.classList.add("ds-live"),c||console.warn("[decksmith] composition unreachable; serve the deck over http, not file://");let D=X(location.hash);g(D?Math.max(0,W(t,D)):0,!0)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>void Y(document),{once:!0}):Y(document));})();
83
+ `,Zt=`
84
+ html.ds-v2 hyperframes-player{position:fixed;left:var(--ds-sx,0);top:var(--ds-sy,0);
85
+ width:var(--ds-sw,100vw);height:var(--ds-sh,100vh)}
86
+ .ds-chrome{position:fixed;inset:0;z-index:2147483000;pointer-events:none;
87
+ font:500 14px/1.4 ui-sans-serif,system-ui,sans-serif;color:#fff}
88
+ .ds-bar{position:fixed;left:var(--ds-sx);width:var(--ds-sw);height:3px;
89
+ top:calc(var(--ds-sy) + var(--ds-sh) - 3px);background:rgba(255,255,255,.16)}
90
+ .ds-bar>i{display:block;height:100%;background:currentColor;transform-origin:0 50%;
91
+ transform:scaleX(0);transition:transform .18s ease-out}
92
+ .ds-controls{position:fixed;left:var(--ds-bx);top:var(--ds-by);width:var(--ds-bw);height:var(--ds-bh);
93
+ box-sizing:border-box;padding:0 var(--ds-bi,6px);display:flex;align-items:center;gap:2px;
94
+ font-size:clamp(13px,calc(var(--ds-btn,40px) * .36),18px);pointer-events:auto;
95
+ transition:opacity .2s ease-out}
96
+ html[data-dock="pad"] .ds-controls{padding-bottom:4px;align-items:flex-end;
97
+ background:linear-gradient(to top,rgba(0,0,0,.72),rgba(0,0,0,0))}
98
+ .ds-controls[data-shown="0"]{opacity:0;pointer-events:none}
99
+ .ds-controls button{min-width:var(--ds-btn,40px);height:var(--ds-btn,40px);padding:0 8px;border:0;border-radius:8px;
100
+ background:transparent;color:#fff;font:inherit;line-height:1;cursor:pointer;
101
+ display:inline-grid;place-items:center;white-space:nowrap}
102
+ .ds-controls button:hover{background:rgba(255,255,255,.16)}
103
+ .ds-controls button:focus-visible{outline:2px solid #fff;outline-offset:-2px}
104
+ .ds-controls button[hidden],.ds-controls .ds-wrap[hidden]{display:none}
105
+ .ds-play::before{content:"";display:block;width:0;height:0;margin-left:3px;
106
+ border-left:12px solid currentColor;border-top:8px solid transparent;border-bottom:8px solid transparent}
107
+ .ds-play[data-on="1"]::before{margin-left:0;width:12px;height:14px;border:0;
108
+ background:linear-gradient(to right,currentColor 0 4px,transparent 4px 8px,currentColor 8px 12px)}
109
+ .ds-count{padding:0 6px;opacity:.8;font-variant-numeric:tabular-nums;white-space:nowrap}
110
+ .ds-gap{flex:1}
111
+ .ds-cc{font-weight:700;letter-spacing:.04em}
112
+ .ds-cc[aria-pressed="true"]{box-shadow:inset 0 -3px 0 #fff}
113
+ .ds-cc[aria-pressed="false"]{opacity:.6}
114
+ .ds-fs::before{content:"";width:14px;height:14px;box-sizing:border-box;
115
+ border:2px solid currentColor;border-radius:2px}
116
+ .ds-more{font-size:22px;letter-spacing:.06em}
117
+ html.ds-compact .ds-count,html.ds-compact .ds-full{display:none}
118
+ html:not(.ds-compact) .ds-morewrap{display:none}
119
+ /* Menus hang off the BAR, not their button, and open upward over the slide:
120
+ a menu is a viewer's explicit, momentary choice, and it closes on the next
121
+ click. Right-aligned and wrapping, so it never leaves the window. */
122
+ .ds-wrap{display:inline-flex}
123
+ .ds-menu{position:absolute;right:6px;bottom:calc(100% + 2px);display:flex;flex-wrap:wrap;
124
+ justify-content:flex-end;align-items:center;gap:2px;max-width:calc(100vw - 12px);box-sizing:border-box;
125
+ padding:4px;border-radius:10px;background:rgba(20,20,20,.94);box-shadow:0 4px 18px rgba(0,0,0,.5)}
126
+ .ds-menu[hidden]{display:none}
127
+ .ds-menu button[aria-checked="true"]{background:#fff;color:#000}
128
+ .ds-mlabel{flex-basis:100%;padding:2px 6px 0;font-size:12px;opacity:.7}
129
+ .ds-flags{position:fixed;left:calc(var(--ds-sx) + 10px);top:calc(var(--ds-sy) + 8px);
130
+ max-width:calc(var(--ds-sw) - 20px);padding:2px 8px;border-radius:6px;
131
+ background:rgba(0,0,0,.6);font-size:13px}
132
+ .ds-flags:empty{display:none}
133
+ .ds-video[hidden]{display:none}
134
+ .ds-film{position:fixed;inset:0;display:grid;place-items:center;
135
+ background:rgba(0,0,0,.88);pointer-events:auto}
136
+ .ds-film iframe{width:min(92vw,158vh);aspect-ratio:16/9;border:0;background:#000}
137
+ .ds-shut{position:absolute;top:16px;right:16px;width:40px;height:40px;padding:0;border:0;
138
+ border-radius:50%;background:rgba(255,255,255,.14);color:#fff;cursor:pointer;
139
+ font:inherit;line-height:40px}
140
+ .ds-notes{position:fixed;left:0;right:0;bottom:0;max-height:38vh;overflow:auto;
141
+ padding:20px 24px;background:rgba(10,10,10,.92);font-size:19px;line-height:1.6;
142
+ white-space:pre-wrap;pointer-events:auto}
143
+ .ds-notes[hidden]{display:none}
144
+ .ds-subs{position:fixed;left:var(--ds-tx,0);top:var(--ds-ty);width:var(--ds-tw,100vw);
145
+ height:var(--ds-th,0px);box-sizing:border-box;overflow:hidden;
146
+ display:flex;align-items:center;justify-content:center;padding:0 var(--ds-tp,12px);
147
+ text-align:center;color:#fff;font-weight:600;font-size:var(--ds-cap-font,13px);
148
+ line-height:${Ie};text-wrap:pretty}
149
+ .ds-subs[hidden]{visibility:hidden}
150
+ .ds-say{position:fixed;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
151
+ `;function Qt(e){let t=e.createElement("style");t.textContent=Zt,e.head.append(t),e.documentElement.classList.add("ds-v2");let n=(d,c,b)=>`<button class="${d}" type="button" role="menuitemradio" data-value="${c}" aria-checked="false">${b}</button>`,r=j.map(d=>n("ds-rate",String(d),ee(d))).join(""),o=W.map(d=>n("ds-sz",d,d.toUpperCase())).join(""),i=e.createElement("div");i.className="ds-chrome",i.innerHTML=`<div class="ds-subs" hidden></div><div class="ds-bar"><i></i></div><div class="ds-flags"></div><div class="ds-controls" role="toolbar" aria-label="Deck controls" data-shown="1"><button class="ds-play" type="button" aria-label="Play the deck" aria-keyshortcuts="Enter"></button><span class="ds-count"></span><span class="ds-gap"></span><button class="ds-video" type="button" hidden>Video</button><span class="ds-wrap ds-full"><button class="ds-speed" type="button" aria-haspopup="menu" aria-expanded="false" aria-label="Narration speed" aria-keyshortcuts="Shift+. Shift+,">1\xD7</button><span class="ds-menu" role="menu" aria-label="Narration speed" hidden>${r}</span></span><button class="ds-cc ds-full" type="button" aria-pressed="true" aria-label="Captions" aria-keyshortcuts="C">CC</button><span class="ds-wrap ds-full ds-sizewrap"><button class="ds-size" type="button" aria-haspopup="menu" aria-expanded="false" aria-label="Caption size">Aa</button><span class="ds-menu" role="menu" aria-label="Caption size" hidden>${o}</span></span><button class="ds-fs ds-full" type="button" aria-label="Full screen" aria-keyshortcuts="F"></button><span class="ds-wrap ds-morewrap"><button class="ds-more" type="button" aria-haspopup="menu" aria-expanded="false" aria-label="Settings">\u22EF</button><span class="ds-menu" role="menu" aria-label="Settings" hidden><span class="ds-mlabel">Speed</span>${r}<span class="ds-mlabel">Captions</span><button class="ds-cc2" type="button" role="menuitemcheckbox" aria-checked="true">CC</button>${o}<button class="ds-fs2" type="button" role="menuitem">Full screen</button></span></span></div><div class="ds-notes" hidden></div><div class="ds-say" aria-live="polite"></div>`,e.body.append(i);let a=d=>i.querySelector(d),y=i.querySelectorAll(".ds-menu");return{chrome:i,fill:a(".ds-bar>i"),play:a(".ds-play"),video:a(".ds-video"),count:a(".ds-count"),notes:a(".ds-notes"),flags:a(".ds-flags"),subs:a(".ds-subs"),controls:a(".ds-controls"),speed:a(".ds-speed"),speedMenu:y[0],cc:a(".ds-cc"),size:a(".ds-size"),sizeMenu:y[1],fs:a(".ds-fs"),more:a(".ds-more"),moreMenu:y[2],say:a(".ds-say")}}function en(e){return e.querySelector(`meta[name="${le}"]`)?.getAttribute("content")==="2"}function tn(e){let t=e.createElement("style");t.textContent=Jt,e.head.append(t);let n=e.createElement("div");return n.className="ds-chrome",n.innerHTML='<div class="ds-bar"><i></i></div><button class="ds-play" type="button" aria-label="Play the deck"></button><button class="ds-video" type="button" hidden>Video</button><div class="ds-count"></div><div class="ds-flags"></div><div class="ds-subs" hidden></div><div class="ds-notes" hidden></div>',e.body.append(n),{chrome:n,fill:n.querySelector("i"),play:n.querySelector(".ds-play"),video:n.querySelector(".ds-video"),count:n.querySelector(".ds-count"),notes:n.querySelector(".ds-notes"),flags:n.querySelector(".ds-flags"),subs:n.querySelector(".ds-subs")}}var nn={at:()=>!1,hush:()=>{},toggleMute:()=>{},toggleSubtitles:()=>{},setSubtitles:()=>{},setRate:()=>{},onEnded:()=>{},onSettled:()=>{},unlock:()=>{},onProgress:()=>{},pause:()=>{},resume:()=>!1,refit:()=>{}};function rn(e){return e?.name!=="NotSupportedError"}function sn(e,t,n,r={}){let o=e.createElement("audio");o.preload="auto",e.body.append(o);let i=r.v2===!0,a=r.cut??(p=>p),y=1,d=()=>{i&&(o.defaultPlaybackRate=y,o.playbackRate=y,o.preservesPitch=!0)};d();let c=!1,b=!1,f=!0,v=()=>e.documentElement.classList.toggle("ds-cap",f);v();let S=!1,m=!1,M=!1,k=[],x=0,F=null,A=null,w=0,R=()=>{let p=[];S&&M?p.push("press any key for sound"):m?p.push("narration unavailable"):b&&p.push("muted"),!f&&r.flagSubtitles!==!1&&p.push("subtitles off"),n.flags.textContent=p.join(" \xB7 ")},T=()=>{let p=f?Xe(k,o.currentTime):null;p!==F&&(F=p,n.subs.textContent=p?.text??"",n.subs.hidden=p===null)},_=()=>{},B=()=>{T(),i&&_(o.currentTime),x=o.ended||o.paused&&o.currentTime>0?0:requestAnimationFrame(B)},E=()=>{x&&cancelAnimationFrame(x),x=0,c=!1,o.pause(),o.removeAttribute("src"),o.load(),k=[],T()},P=()=>{};o.addEventListener("ended",()=>{S||P()});let N=()=>{},I=p=>{let $=++w;A=p,E(),m=!1,R();let q=ne(t,p.sceneId,p.fragment);return q?(k=a(q.cues),o.muted=b,o.src=We(t,q),d(),H($),x===0&&(x=requestAnimationFrame(B)),!0):!1};function H(p){Promise.resolve(o.play()).then(()=>{p===w&&(S=!1,m=!1,R(),N(!0))},$=>{p===w&&(S=rn($),m=!S,S&&(M=!0),x&&cancelAnimationFrame(x),x=0,k=[],T(),R(),N(!1))})}return{at:I,hush:E,onEnded:p=>{P=p},onSettled:p=>{N=p},onProgress:p=>{_=p},pause:()=>{!A||!o.getAttribute("src")||o.ended||(c=!0,o.pause(),x&&cancelAnimationFrame(x),x=0)},resume:()=>!c||!A||!o.getAttribute("src")||o.ended?!1:(c=!1,d(),H(w),x===0&&(x=requestAnimationFrame(B)),!0),refit:()=>{if(!A||k.length===0)return;let p=ne(t,A.sceneId,A.fragment);p&&(k=a(p.cues),F=null,T())},toggleMute:()=>{b=!b,o.muted=b,R()},toggleSubtitles:()=>{f=!f,v(),T(),R()},setSubtitles:p=>{p!==f&&(f=p,v(),T(),R())},setRate:p=>{y=p>0&&Number.isFinite(p)?p:1,d()},unlock:()=>{!A||!(S||m)||(S=!1,R(),I(A))}}}var on='script[type="application/decksmith-video+json"]';function an(e){if(!e)return{};let t={};try{let n=JSON.parse(e);for(let[r,o]of Object.entries(n?.scenes??{}))typeof o?.url=="string"&&/^https:\/\//i.test(o.url)&&(t[r]={url:o.url,title:typeof o.title=="string"?o.title:"Video"})}catch{return{}}return t}var ln={at:()=>{},toggle:()=>{},close:()=>!1};function cn(e,t,n,r){let o=null,i=null,a=()=>o?(o.remove(),o=null,!0):!1,y=()=>{if(!i||o)return;r(),o=e.createElement("div"),o.className="ds-film";let c=e.createElement("iframe");c.src=i.url,c.title=i.title,c.allow="fullscreen",c.setAttribute("referrerpolicy","strict-origin-when-cross-origin");let b=e.createElement("button");b.type="button",b.className="ds-shut",b.textContent="\u2715",b.setAttribute("aria-label","Close the video"),b.addEventListener("click",f=>{f.stopPropagation(),a()}),o.append(c,b),n.chrome.append(o),b.focus()},d=()=>{a()||y()};return n.video.addEventListener("click",c=>{c.stopPropagation(),d()}),{at:c=>{a(),i=t[c.sceneId]??null,n.video.hidden=i===null,i&&n.video.setAttribute("aria-label",`Play the video: ${i.title}`)},toggle:d,close:a}}function Ze(e){let t=e;return!!t&&(t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName??""))}async function Qe(e){let t=Yt(e),n=e.querySelector("hyperframes-player");if(t.length===0||!n)return;let r=Ot(t);if(r.length===0)return;let o=en(e),i=o?Qt(e):tn(e),a=be,y=Ke(e.querySelector(Ve)?.textContent,o?{split:s=>[s]}:{}),d=y?sn(e,y,i,{flagSubtitles:!o,v2:o,...o?{cut:s=>s.flatMap(l=>qe(l,a))}:{}}):nn,c=de({},{}),b=()=>o?c.speed:1,f=an(e.querySelector(on)?.textContent),v=Se(e.querySelector(Ee)?.textContent),S=Object.keys(f).length===0?ln:cn(e,f,i,()=>{d.hush(),p(!1)}),m=0,M=null,k=0,x=0,F=-1,A=null,w=s=>{n.seek(s),M&&ge(M,t,s),k=s},R=(s,l,g)=>{let u=k;A=l;let C=0,O=V=>{C===0&&(C=V);let U=Math.min(1,(V-C)/g);if(U<1){k=u+(l-u)*U,ge(s,t,k),x=requestAnimationFrame(O);return}x=0,A=null,w(l)};x=requestAnimationFrame(O)},T=!1,_=0,B=()=>{_&&clearTimeout(_),_=0},E=()=>{T&&(m+1<r.length?L(m+1):p(!1))},P=!1,N=s=>!!ne(y,s.sceneId,s.fragment),I=0,H=s=>{B(),P=s;let l=r[m],g=r[m+1],u=o&&!N(l),C=jt({playing:T,heard:s,gapMs:g?(g.t-l.t)*1e3:0,rate:b(),silent:u,revealMs:I});C!==null&&(_=setTimeout(E,C))},p=s=>{if(T=s,B(),i.play.dataset.on=s?"1":"0",i.play.setAttribute("aria-label",s?"Pause the deck":"Play the deck"),o){if(!s){d.pause();return}if(d.resume()){H(!0);return}}s&&(F=-1,L(m,!0))},$=null,q=s=>{$===null||parent===window||parent.postMessage(s,$)};addEventListener("message",s=>{if(o&&s.source===parent&&parent!==window&&s.data?.type===ue){z(Q(s.data),"host");return}if(s.source!==parent||parent===window||!Be(s.data))return;let l=s.data;if(l.type==="hello"){$=s.origin,q({channel:te,type:"ready",stops:r.map((g,u)=>({i:u,label:`${g.slide+1} / ${r[r.length-1].slide+1}`,notes:g.notes})),at:m});return}$===s.origin&&(l.type==="next"?L(m+1):l.type==="prev"?L(m-1):l.type==="go"?L(l.at,!0):l.type==="play"&&p(l.on))});let L=(s,l=!1)=>{let g=r[m];m=Math.max(0,Math.min(r.length-1,s));let u=r[m];x&&cancelAnimationFrame(x),x=0,A=null;let C=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,O=v?.seams&&M&&!l&&!C?Te(k,g,u,t,et):null;O!==null&&w(O);let V=O!==null?{animate:!0,durationMs:(u.t-O)*1e3/b()}:Dt(k,u.t,{reducedMotion:C,rate:b()});I=V.animate&&!l&&M?V.durationMs:0,V.animate&&!l&&M?R(M,u.t,V.durationMs):w(u.t);let U=!1;m!==F&&(F=m,o&&!T?(d.hush(),F=-1):U=d.at(u)),S.at(u),H(U),history.replaceState(null,"",Kt(u)),q({channel:te,type:"stop",at:m,total:r.length,label:`${u.slide+1} / ${r[r.length-1].slide+1}`,notes:u.notes,playing:T}),i.fill.style.transform=`scaleX(${(m+1)/r.length})`,i.count.textContent=`${u.slide+1} / ${r[r.length-1].slide+1}`,i.notes.textContent=u.notes};d.onEnded(E),d.onSettled(H),d.onProgress(s=>{if(!v||x!==0||!M||typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches)return;let l=r[m],g=ke(v,l);if(!g)return;let u=Me(g,s);Math.abs(u-k)<1e-4||(ge(M,t,u),k=u)}),i.play.addEventListener("click",s=>{s.stopPropagation(),p(!T)}),addEventListener("hashchange",()=>{let s=Ge(location.hash);if(!s)return;let l=Je(r,s);l>=0&&l!==m&&L(l,!0)});let G=()=>{(e.fullscreenElement?e.exitFullscreen():e.documentElement.requestFullscreen()).catch(()=>{})},h=o?i:null,J=y!==null,nt=(Number(n.getAttribute("width"))||16)/(Number(n.getAttribute("height"))||9),rt=ze(Number(n.getAttribute("width"))||0,Number(n.getAttribute("height"))||0),re="band",ye=()=>{if(!o)return;let s=$e(innerWidth,innerHeight,nt,{on:c.cc&&J,size:c.ccsize},{safeBottom:rt}),l=e.documentElement,g=l.style,u=(O,V)=>g.setProperty(O,`${V}px`);u("--ds-sx",s.slideX),u("--ds-sy",s.slideY),u("--ds-sw",s.slideW),u("--ds-sh",s.slideH),u("--ds-bx",s.bar.x),u("--ds-by",s.bar.y),u("--ds-bw",s.bar.w),u("--ds-bh",s.bar.h),u("--ds-bi",s.barInset),u("--ds-btn",s.btn),u("--ds-tx",s.strip.x),u("--ds-ty",s.strip.y),u("--ds-tw",s.strip.w),u("--ds-th",s.strip.h),u("--ds-tp",s.stripPad),u("--ds-cap-font",s.capFont),l.dataset.dock=s.dock,l.classList.toggle("ds-compact",s.compact),re=s.dock;let C=Math.round(s.cueEm*10)/10;l.dataset.dsCueEm=String(C),C!==a&&(a=C,d.refit()),h&&re!=="pad"&&(h.controls.dataset.shown="1")},st=()=>{try{localStorage.setItem(ce,JSON.stringify(c))}catch{}},ot=()=>{try{return Re(localStorage.getItem(ce))}catch{return{}}},it=()=>{if(parent===window)return;let s={type:ue,...c};parent.postMessage(s,"*")},at=()=>{if(h){h.speed.textContent=ee(c.speed);for(let s of i.chrome.querySelectorAll(".ds-rate"))s.setAttribute("aria-checked",String(Number(s.dataset.value)===c.speed));h.cc.setAttribute("aria-pressed",String(c.cc)),h.cc.hidden=!J,h.size.hidden=!J;for(let s of i.chrome.querySelectorAll(".ds-sz, .ds-cc2, .ds-mlabel:nth-of-type(2)"))s.hidden=!J;for(let s of i.chrome.querySelectorAll(".ds-sz"))s.setAttribute("aria-checked",String(s.dataset.value===c.ccsize));i.chrome.querySelector(".ds-cc2")?.setAttribute("aria-checked",String(c.cc))}},lt=()=>{if(x&&M&&A!==null){let s=A;cancelAnimationFrame(x),x=0,R(M,s,Math.max(1,(s-k)*1e3/b()))}_&&H(P)},z=(s,l)=>{if(!o)return;let g=c;c={...c,...s},d.setRate(c.speed),d.setSubtitles(c.cc),ye(),at(),c.speed!==g.speed&&lt(),l!=="boot"&&st(),l==="user"&&it(),h&&l!=="boot"&&(h.say.textContent=`Speed ${ee(c.speed)}, captions ${c.cc?"on":"off"}, size ${c.ccsize.toUpperCase()}`)},ct=2500,Z=0,se=()=>!!h&&(!h.speedMenu.hidden||!h.sizeMenu.hidden||!h.moreMenu.hidden),ut=()=>!!h&&(se()||h.controls.matches(":hover")||h.controls.contains(e.activeElement)),xe=()=>{Z&&clearTimeout(Z),Z=setTimeout(()=>{Z=0,h&&(re!=="pad"||!T||(ut()?xe():h.controls.dataset.shown="0"))},ct)},D=()=>{h&&(h.controls.dataset.shown="1",xe())},K=()=>{if(h)for(let[s,l]of[[h.speed,h.speedMenu],[h.size,h.sizeMenu],[h.more,h.moreMenu]])l.hidden=!0,s.setAttribute("aria-expanded","false")},oe=(s,l,g)=>{let u=l.hidden;K(),u&&(l.hidden=!1,s.setAttribute("aria-expanded","true"),g&&l.querySelector('[aria-checked="true"]')?.focus()),D()};if(h){z(de(ot(),Fe(location.search)),"boot"),addEventListener("resize",ye),i.chrome.addEventListener("click",l=>{l.detail>0&&l.target?.closest?.("button")?.blur()},!0);let s=(l,g)=>l.addEventListener("click",u=>{u.stopPropagation(),g(u),D()});s(h.speed,l=>oe(h.speed,h.speedMenu,l.detail===0)),s(h.size,l=>oe(h.size,h.sizeMenu,l.detail===0)),s(h.speedMenu,l=>{let g=l.target?.closest?.("button")?.dataset.value;g!==void 0&&(z({speed:Number(g)},"user"),K())}),s(h.sizeMenu,l=>{let g=l.target?.closest?.("button")?.dataset.value;g!==void 0&&(z({ccsize:g},"user"),K())}),s(h.cc,()=>z({cc:!c.cc},"user")),s(h.fs,G),s(h.more,l=>oe(h.more,h.moreMenu,l.detail===0)),s(h.moreMenu,l=>{let g=l.target?.closest?.("button");if(g){if(g.classList.contains("ds-rate"))z({speed:Number(g.dataset.value)},"user");else if(g.classList.contains("ds-sz"))z({ccsize:g.dataset.value},"user");else if(g.classList.contains("ds-cc2"))z({cc:!c.cc},"user");else if(g.classList.contains("ds-fs2"))G();else return;K()}}),h.controls.addEventListener("focusin",D),e.addEventListener("pointermove",D,{passive:!0}),e.addEventListener("pointerdown",D,{passive:!0}),D()}let dt=s=>{if(s.defaultPrevented||Ze(s.target))return;let l=Oe(s);if(!l)return;let g=s.target;if((s.key===" "||s.key==="Enter")&&g?.closest?.("button"))return;let u=g?.closest?.(".ds-menu");if(u&&(l==="next"||l==="prev")){let C=[...u.querySelectorAll("button")],O=C.indexOf(g);C[Math.max(0,Math.min(C.length-1,O+(l==="next"?1:-1)))]?.focus(),s.preventDefault();return}switch(l){case"next":L(m+1);break;case"prev":L(m-1);break;case"first":L(0,!0);break;case"last":L(r.length-1,!0);break;case"play":p(!T),D();break;case"captions":z({cc:!c.cc},"user"),D();break;case"faster":case"slower":z({speed:_e(c.speed,l==="faster"?1:-1)},"user"),D();break;case"bigger":case"smaller":z({ccsize:De(c.ccsize,l==="bigger"?1:-1)},"user"),D();break;case"mute":d.toggleMute();break;case"notes":i.notes.hidden=!i.notes.hidden;break;case"video":S.toggle();break;case"escape":if(se())K();else if(!S.close())return;break;case"fullscreen":G();break}s.preventDefault()};o?e.addEventListener("keydown",dt):e.addEventListener("keydown",s=>{if(!(s.defaultPrevented||Ze(s.target))){switch(s.key){case"ArrowRight":case"PageDown":case" ":L(m+1);break;case"ArrowLeft":case"PageUp":L(m-1);break;case"Home":L(0,!0);break;case"End":L(r.length-1,!0);break;case"n":i.notes.hidden=!i.notes.hidden;break;case"m":d.toggleMute();break;case"s":d.toggleSubtitles();break;case"p":p(!T);break;case"v":S.toggle();break;case"Escape":if(!S.close())return;break;case"f":G();break;default:return}s.preventDefault()}}),e.addEventListener("click",s=>{if(i.chrome.contains(s.target))return;if(se()){K();return}let l=(e.documentElement.clientWidth||1)/3;s.clientX>l*2?L(m+1):s.clientX<l&&L(m-1)});let we=()=>d.unlock();if(e.addEventListener("keydown",we),e.addEventListener("click",we),await Gt(n),typeof n.seek!="function")return;n.pause?.(),M=Wt(n),M?.doc.documentElement.classList.add("ds-live"),M||console.warn("[decksmith] composition unreachable; serve the deck over http, not file://");let ve=Ge(location.hash);L(ve?Math.max(0,Je(r,ve)):0,!0)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>void Qe(document),{once:!0}):Qe(document));})();