diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/master/.nojekyll b/master/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/master/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/master/assets/highlight.css b/master/assets/highlight.css new file mode 100644 index 00000000..9ca4e01a --- /dev/null +++ b/master/assets/highlight.css @@ -0,0 +1,99 @@ +:root { + --light-hl-0: #800000; + --dark-hl-0: #808080; + --light-hl-1: #800000; + --dark-hl-1: #569CD6; + --light-hl-2: #000000FF; + --dark-hl-2: #D4D4D4; + --light-hl-3: #E50000; + --dark-hl-3: #9CDCFE; + --light-hl-4: #0000FF; + --dark-hl-4: #CE9178; + --light-hl-5: #001080; + --dark-hl-5: #9CDCFE; + --light-hl-6: #000000; + --dark-hl-6: #D4D4D4; + --light-hl-7: #795E26; + --dark-hl-7: #DCDCAA; + --light-hl-8: #A31515; + --dark-hl-8: #CE9178; + --light-hl-9: #0000FF; + --dark-hl-9: #569CD6; + --light-hl-10: #098658; + --dark-hl-10: #B5CEA8; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +pre, code { background: var(--code-background); } diff --git a/master/assets/icons.js b/master/assets/icons.js new file mode 100644 index 00000000..3dfbd322 --- /dev/null +++ b/master/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/master/assets/icons.svg b/master/assets/icons.svg new file mode 100644 index 00000000..a19417dc --- /dev/null +++ b/master/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/master/assets/main.js b/master/assets/main.js new file mode 100644 index 00000000..99097a05 --- /dev/null +++ b/master/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings."}; +"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){se.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!Ve(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.appendChild(document.createElement("span")).textContent=t.text}}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/master/assets/navigation.js b/master/assets/navigation.js new file mode 100644 index 00000000..611294fc --- /dev/null +++ b/master/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA42VXW/aMBSG/4uv0dayttu4o7RUSKGgMLSLqpoc+wQsHBs5xxQ07b9PfCU2wW7uIvvJo9c+9vHbX4KwRdIjM0C7Jh2yprgkPVJobiWUXw/DX5ZYSNIhK6E46d11CFsKyQ0o0nurBFObScH601EiVlCLhEIwOWWVy+N8c/f+4V+nKaxlTNKybJp8y233h2OZaWsYeJZGpIqJxRGqRCplavNcOuvLrWIotDq7PMz3Pdw5utGRo/t/J+uDIZLwCt3M+u7oB1rlYtGs53G8VUGfnof9efLrz2DyOhy91KoNNYJmjswHffe3rhOqb1FPJd3VLlC2qDznad/gFjMBRDCZ3gYM1XxYMVeFRZhswISDeEwkjV4ksAEZCnOaDgt+C8X1x1hzCChqICxJQXEwj5StQPGAx2PCqoFW+68xKBsQOURYs68hmNQqFEVoZR4TVs2AlU/WHM59bcLduj59LnJxJ25+fr+9dw/gJCu1BISm0rlxJ+8lG+sNn0RsHW8Nap4mkQPhEOFNewX80GYl1KLPGJRlxHcNjVRDsxXg1OjtLrZzDhbdNMiplTjUCq+3vvPuOVzM90hLSDTlsW56Ul6gMes8TVpKfTK6coq0pfQCjTf946VqNv3jeKumP5S0XIZey5PnzEQf7wP6LKEAhTGZB8aMY70RMAaknCKNGT0wZkxgQdnu+FJ/suQLNF6GzArJRyrX197MarLxTr7/B8oNL6GNCQAA" \ No newline at end of file diff --git a/master/assets/search.js b/master/assets/search.js new file mode 100644 index 00000000..6a9f2e5e --- /dev/null +++ b/master/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/master/assets/style.css b/master/assets/style.css new file mode 100644 index 00000000..178bfb02 --- /dev/null +++ b/master/assets/style.css @@ -0,0 +1,1493 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: #4d7fff; + --light-color-ts-property: #ff984d; + --light-color-ts-method: #ff4db8; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #ff4d4d; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: #4d7fff; + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff4d4d; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +*:focus-visible, +.tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} +footer > p { + margin: 0 1em; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} +a.tsd-anchor-link { + color: var(--color-text); +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; +} + +.tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; +} + +.tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); +} +.tsd-full-hierarchy, +.tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; +} +.tsd-full-hierarchy ul { + padding-left: 1.5rem; +} +.tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-navigation .tsd-nav-link { + display: none; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-page-navigation-section { + margin-left: 10px; +} +.tsd-page-navigation-section > summary { + padding: 0.25rem; +} +.tsd-page-navigation-section > div { + margin-left: 20px; +} +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; + vertical-align: text-top; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} +.tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; +} +.tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-reference { + color: var(--color-ts-reference); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + #tsd-toolbar-links { + display: none; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/master/classes/Setup.PublicAPI.html b/master/classes/Setup.PublicAPI.html new file mode 100644 index 00000000..b5502534 --- /dev/null +++ b/master/classes/Setup.PublicAPI.html @@ -0,0 +1,67 @@ +PublicAPI | ruffle-core

Represents the Ruffle public API.

+

The public API exists primarily to allow multiple installations of Ruffle on a +page (e.g. an extension install and a local one) to cooperate. In an ideal +situation, all Ruffle sources on the page install themselves into a single +public API, and then the public API picks the newest version by default.

+

This API is versioned, in case we need to upgrade it. However, it must be +backwards- and forwards-compatible with all known sources.

+

Implements

Constructors

  • Construct the Ruffle public API.

    +

    Do not use this function to negotiate a public API. Instead, use +public_api to register your Ruffle source with an existing public API +if it exists.

    +

    Constructing a Public API will also trigger it to initialize Ruffle once +the page loads, if the API has not already been superseded.

    +

    Parameters

    • Optionalprev: null | PublicAPILike

      What used to be in the public API slot.

      +

      This is used to upgrade from a prior version of the public API, or from +a user-defined configuration object placed in the public API slot.

      +

    Returns PublicAPI

Properties

config: object | URLLoadOptions | DataLoadOptions

The configuration object used when Ruffle is instantiated.

+
sources: Record<string, SourceAPI>
invoked: boolean
newestName: null | string

Accessors

  • get version(): string
  • The version of the public API.

    +

    This is not the version of Ruffle itself.

    +

    This allows a page with an old version of the Public API to be upgraded +to a new version of the API. The public API is intended to be changed +very infrequently, if at all, but this provides an escape mechanism for +newer Ruffle sources to upgrade older installations.

    +

    Returns string

    The version of this public API.

    +

Methods

  • Determine the name of the newest registered source in the Public API.

    +

    Returns null | string

    The name of the source, or null if no source +has yet to be registered.

    +
  • Negotiate and start Ruffle.

    +

    This function reads the config parameter to determine which polyfills +should be enabled. If the configuration parameter is missing, then we +use a built-in set of defaults sufficient to fool sites with static +content and weak plugin detection.

    +

    Returns void

  • Look up a specific Ruffle version (or any version satisfying a given set +of requirements) and return it's API.

    +

    Parameters

    • requirementString: string

      A set of semantic version requirement +strings that the player version must satisfy.

      +

    Returns null | SourceAPI

    An instance of the Source API, if one or more +sources satisfied the requirement.

    +
  • Look up the newest Ruffle version compatible with the local source, if +it's installed. Otherwise, use the latest version.

    +

    Returns null | SourceAPI

    An instance of the Source API

    +
  • Look up the newest Ruffle version with the exact same version as the +local source, if it's installed. Otherwise, use the latest version.

    +

    Returns null | SourceAPI

    An instance of the Source API

    +
  • Indicates that this version of the public API has been superseded by a +newer version.

    +

    This should only be called by a newer version of the Public API. +Identical versions of the Public API should not supersede older versions +of that same API.

    +

    Unfortunately, we can't disable polyfills after-the-fact, so this +only lets you disable the init event...

    +

    Returns void

diff --git a/master/enums/Config.AutoPlay.html b/master/enums/Config.AutoPlay.html new file mode 100644 index 00000000..da2b5397 --- /dev/null +++ b/master/enums/Config.AutoPlay.html @@ -0,0 +1,15 @@ +AutoPlay | ruffle-core

Enumeration AutoPlay

Represents the various types of auto-play behaviours that are supported.

+

Enumeration Members

On +Off +Auto +

Enumeration Members

On

The player should automatically play the movie as soon as it is loaded.

+

If the browser does not support automatic audio, the movie will begin +muted.

+
Off

The player should not attempt to automatically play the movie.

+

This will leave it to the user or API to actually play when appropriate.

+
Auto

The player should automatically play the movie as soon as it is deemed +"appropriate" to do so.

+

The exact behaviour depends on the browser, but commonly requires some +form of user interaction on the page in order to allow auto playing videos +with sound.

+
diff --git a/master/enums/Config.ContextMenu.html b/master/enums/Config.ContextMenu.html new file mode 100644 index 00000000..5805ba97 --- /dev/null +++ b/master/enums/Config.ContextMenu.html @@ -0,0 +1,11 @@ +ContextMenu | ruffle-core

Enumeration ContextMenu

Represents the various context menu options that are supported.

+

Enumeration Members

Enumeration Members

On

The context menu should appear when right-clicking or long-pressing +the Ruffle instance.

+
RightClickOnly

The context menu should only appear when right-clicking +the Ruffle instance.

+
Off

The context menu should not appear when right-clicking or long-pressing +the Ruffle instance.

+
diff --git a/master/enums/Config.Letterbox.html b/master/enums/Config.Letterbox.html new file mode 100644 index 00000000..3649ece7 --- /dev/null +++ b/master/enums/Config.Letterbox.html @@ -0,0 +1,11 @@ +Letterbox | ruffle-core

Enumeration Letterbox

Controls whether the content is letterboxed or pillarboxed when the +player's aspect ratio does not match the movie's aspect ratio.

+

When letterboxed, black bars will be rendered around the exterior +margins of the content.

+

Enumeration Members

Enumeration Members

Off

The content will never be letterboxed.

+
Fullscreen

The content will only be letterboxed if the content is running fullscreen.

+
On

The content will always be letterboxed.

+
diff --git a/master/enums/Config.LogLevel.html b/master/enums/Config.LogLevel.html new file mode 100644 index 00000000..16362547 --- /dev/null +++ b/master/enums/Config.LogLevel.html @@ -0,0 +1,7 @@ +LogLevel | ruffle-core

Enumeration LogLevel

Console logging level.

+

Enumeration Members

Enumeration Members

Error
Warn
Info
Debug
Trace
diff --git a/master/enums/Config.NetworkingAccessMode.html b/master/enums/Config.NetworkingAccessMode.html new file mode 100644 index 00000000..0e070ee8 --- /dev/null +++ b/master/enums/Config.NetworkingAccessMode.html @@ -0,0 +1,18 @@ +NetworkingAccessMode | ruffle-core

Enumeration NetworkingAccessMode

The networking API access mode of the Ruffle player.

+

Enumeration Members

Enumeration Members

All

All networking APIs are permitted in the SWF file.

+
Internal

The SWF file may not call browser navigation or browser interaction APIs.

+

The APIs navigateToURL(), fscommand() and ExternalInterface.call() are +prevented in this mode.

+
None

The SWF file may not call browser navigation or browser interaction APIs +and it cannot use any SWF-to-SWF communication APIs.

+

Additionally to the ones in internal mode, the APIs sendToURL(), +FileReference.download(), FileReference.upload(), Loader.load(), +LocalConnection.connect(), LocalConnection.send(), NetConnection.connect(), +NetStream.play(), Security.loadPolicyFile(), SharedObject.getLocal(), +SharedObject.getRemote(), Socket.connect(), Sound.load(), URLLoader.load(), +URLStream.load() and XMLSocket.connect() are prevented in this mode.

+

This mode is not implemented yet.

+
diff --git a/master/enums/Config.OpenURLMode.html b/master/enums/Config.OpenURLMode.html new file mode 100644 index 00000000..2ec8a497 --- /dev/null +++ b/master/enums/Config.OpenURLMode.html @@ -0,0 +1,8 @@ +OpenURLMode | ruffle-core

Enumeration OpenURLMode

The handling mode of links opening a new website.

+

Enumeration Members

Enumeration Members

Allow

Allow all links to open a new website.

+
Confirm

A confirmation dialog opens with every link trying to open a new website.

+
Deny

Deny all links to open a new website.

+
diff --git a/master/enums/Config.PlayerRuntime.html b/master/enums/Config.PlayerRuntime.html new file mode 100644 index 00000000..9b92dbd5 --- /dev/null +++ b/master/enums/Config.PlayerRuntime.html @@ -0,0 +1,6 @@ +PlayerRuntime | ruffle-core

Enumeration PlayerRuntime

Represents the player runtime to emulate.

+

Enumeration Members

Enumeration Members

AIR

Emulate Adobe AIR.

+
FlashPlayer

Emulate Adobe Flash Player.

+
diff --git a/master/enums/Config.RenderBackend.html b/master/enums/Config.RenderBackend.html new file mode 100644 index 00000000..8d2fe7b0 --- /dev/null +++ b/master/enums/Config.RenderBackend.html @@ -0,0 +1,19 @@ +RenderBackend | ruffle-core

Enumeration RenderBackend

The render backend of a Ruffle player.

+

The available backends may change in future releases.

+

Enumeration Members

Enumeration Members

WebGpu

An in-development API that will be preferred if available in the future. +Should behave the same as wgpu-webgl, except with lower overhead and thus better performance.

+
WgpuWebgl

The most featureful and currently preferred backend. +Rendering is done the same way as in the desktop app, then translated to WebGL on-the-fly.

+
Webgl

A vanilla WebGL backend. Was the default backend until the start of 2023, +but is now used as a fallback for devices that do not support WebGL 2. +Supports fewer features and has a faster initialization time; +may be useful for content that does not need advanced features like bitmap drawing or blend modes.

+
Canvas

The slowest and most basic backend, used as a fallback when all else fails. +However, this is currently the only backend that accurately scales hairline strokes. +If you notice excessively thick strokes in specific content, +you may want to use the canvas renderer for that content until the issue is resolved.

+
diff --git a/master/enums/Config.UnmuteOverlay.html b/master/enums/Config.UnmuteOverlay.html new file mode 100644 index 00000000..e5cf4cb1 --- /dev/null +++ b/master/enums/Config.UnmuteOverlay.html @@ -0,0 +1,7 @@ +UnmuteOverlay | ruffle-core

Enumeration UnmuteOverlay

When the player is muted, this controls whether or not Ruffle will show a +"click to unmute" overlay on top of the movie.

+

Enumeration Members

Enumeration Members

Visible

Show an overlay explaining that the movie is muted.

+
Hidden

Don't show an overlay and pretend that everything is fine.

+
diff --git a/master/enums/Config.WindowMode.html b/master/enums/Config.WindowMode.html new file mode 100644 index 00000000..5d576a43 --- /dev/null +++ b/master/enums/Config.WindowMode.html @@ -0,0 +1,19 @@ +WindowMode | ruffle-core

Enumeration WindowMode

The window mode of a Ruffle player.

+

Enumeration Members

Enumeration Members

Window

The Flash content is rendered in its own window and layering is done with the browser's +default behavior.

+

In Ruffle, this mode functions like WindowMode::Opaque and will layer the Flash content +together with other HTML elements.

+
Opaque

The Flash content is layered together with other HTML elements, and the stage color is +opaque. Content can render above or below Ruffle based on CSS rendering order.

+
Transparent

The Flash content is layered together with other HTML elements, and the SWF stage color is +transparent. Content beneath Ruffle will be visible through transparent areas.

+
Direct

Request compositing with hardware acceleration when possible. +This mode has no effect in Ruffle and will function like WindowMode.Opaque.

+
Gpu

Request a direct rendering path, bypassing browser compositing when possible. +This mode has no effect in Ruffle and will function like WindowMode::Opaque.

+
diff --git a/master/functions/Setup.installRuffle.html b/master/functions/Setup.installRuffle.html new file mode 100644 index 00000000..ace1c20a --- /dev/null +++ b/master/functions/Setup.installRuffle.html @@ -0,0 +1,11 @@ +installRuffle | ruffle-core

Function installRuffle

  • Install this version of Ruffle into the current page.

    +

    Multiple (or zero) versions of Ruffle may be installed at the same time, +and you should use window.RufflePlayer.newest() or similar to access the appropriate +installation at time of use.

    +

    Parameters

    • sourceName: string

      The name of this particular +Ruffle source. Common convention is "local" for websites that bundle their own Ruffle, +"extension" for browser extensions, and something else for other use cases. +Names are unique, and last-installed will replace earlier installations with the same name, +regardless of what those installations are or which version they represent.

      +
    • options: InstallationOptions = {}

      Any options used to configure this specific installation of Ruffle.

      +

    Returns void

diff --git a/master/hierarchy.html b/master/hierarchy.html new file mode 100644 index 00000000..916f376e --- /dev/null +++ b/master/hierarchy.html @@ -0,0 +1 @@ +ruffle-core
diff --git a/master/index.html b/master/index.html new file mode 100644 index 00000000..dc614939 --- /dev/null +++ b/master/index.html @@ -0,0 +1,23 @@ +ruffle-core

ruffle-core

ruffle-core

ruffle-core is the core javascript bindings to the Wasm ruffle-web binary, +and contains the actual public API.

+

For more examples and in-depth documentation on how to use Ruffle on your website, please +check out our wiki.

+

The core package is configured for websites that build and bundle their files themselves. +Simply add ruffle to an npm package, and use something like Webpack to actually bundle and serve +the files.

+

If you wish to use Ruffle on a website that doesn't use npm, we have a pre-bundled version which +we call 'selfhosted'. Please refer to its documentation.

+

Please note that the .wasm file must be served properly, and some web servers may not do that +correctly out of the box. Please see our wiki +for instructions on how to configure this, if you encounter a Incorrect response MIME type error.

+

If you have an existing website with flash content, you can simply include Ruffle as a script and +our polyfill magic will replace everything for you. No fuss, no mess.

+
<script src="path/to/ruffle/ruffle.js"></script>
+
+ +

If you want to control the Ruffle player, you may use our Javascript API.

+
<script>
window.RufflePlayer = window.RufflePlayer || {};

window.addEventListener("DOMContentLoaded", () => {
let ruffle = window.RufflePlayer.newest();
let player = ruffle.createPlayer();
let container = document.getElementById("container");
container.appendChild(player);
player.load("movie.swf");
});
</script>
<script src="path/to/ruffle/ruffle.js"></script> +
+ +

Please see the ruffle-web README.

+
diff --git a/master/interfaces/Config.BaseLoadOptions.html b/master/interfaces/Config.BaseLoadOptions.html new file mode 100644 index 00000000..8c19340d --- /dev/null +++ b/master/interfaces/Config.BaseLoadOptions.html @@ -0,0 +1,247 @@ +BaseLoadOptions | ruffle-core

Interface BaseLoadOptions

Any options used for loading a movie.

+
interface BaseLoadOptions {
    allowScriptAccess?: boolean;
    parameters?:
        | null
        | string
        | URLSearchParams
        | Record<string, string>;
    autoplay?: AutoPlay;
    backgroundColor?: null | string;
    letterbox?: Letterbox;
    unmuteOverlay?: UnmuteOverlay;
    upgradeToHttps?: boolean;
    compatibilityRules?: boolean;
    favorFlash?: boolean;
    warnOnUnsupportedContent?: boolean;
    logLevel?: LogLevel;
    showSwfDownload?: boolean;
    contextMenu?: boolean | ContextMenu;
    preloader?: boolean;
    splashScreen?: boolean;
    maxExecutionDuration?: Duration;
    base?: null | string;
    menu?: boolean;
    salign?: string;
    forceAlign?: boolean;
    quality?: string;
    scale?: string;
    forceScale?: boolean;
    allowFullscreen?: boolean;
    frameRate?: null | number;
    wmode?: WindowMode;
    playerVersion?: null | number;
    preferredRenderer?: null | RenderBackend;
    publicPath?: null | string;
    polyfills?: boolean;
    openUrlMode?: OpenURLMode;
    allowNetworking?: NetworkingAccessMode;
    openInNewTab?: null | ((swf: URL) => void);
    socketProxy?: SocketProxy[];
    fontSources?: string[];
    defaultFonts?: DefaultFonts;
    credentialAllowList?: string[];
    playerRuntime?: PlayerRuntime;
}

Hierarchy (view full)

Properties

allowScriptAccess?: boolean

If set to true, the movie is allowed to interact with the page through +JavaScript, using a flash concept called ExternalInterface.

+

This should only be enabled for movies you trust.

+
false
+
+ +
parameters?:
    | null
    | string
    | URLSearchParams
    | Record<string, string>

Also known as "flashvars" - these are values that may be passed to +and loaded by the movie.

+

If a URL if specified when loading the movie, some parameters will +be extracted by the query portion of that URL and then overwritten +by any explicitly set here.

+
{}
+
+ +
autoplay?: AutoPlay

Controls the auto-play behaviour of Ruffle.

+
AutoPlay.Auto
+
+ +
backgroundColor?: null | string

Controls the background color of the player. +Must be an HTML color (e.g. "#FFFFFF"). CSS colors are not allowed. +null uses the background color of the SWF file.

+
null
+
+ +
letterbox?: Letterbox

Controls letterbox behavior when the Flash container size does not +match the movie size.

+
Letterbox.Fullscreen
+
+ +
unmuteOverlay?: UnmuteOverlay

Controls the visibility of the unmute overlay when the player +is started muted.

+
UnmuteOverlay.Visible
+
+ +
upgradeToHttps?: boolean

Whether or not to auto-upgrade all embedded URLs to https.

+

Flash content that embeds http urls will be blocked from +accessing those urls by the browser when Ruffle is loaded +in a https context. Set to true to automatically change +http:// to https:// for all embedded URLs when Ruffle is +loaded in an https context.

+
true
+
+ +
compatibilityRules?: boolean

Enable (true) or disable (false) Ruffle's built in compatibility rules.

+

These are rules that may make some content work by deliberately changing +behaviour, for example by rewriting requests or spoofing SWF urls if they +rely on websites that no longer exist.

+
true
+
+ +
favorFlash?: boolean

Favor using the real Adobe Flash Player over Ruffle if the browser supports it.

+
true
+
+ +
warnOnUnsupportedContent?: boolean

This is no longer used and does not affect anything. +It is only kept for backwards compatibility.

+

Previously: +"Whether or not to display an overlay with a warning when +loading a movie with unsupported content."

+
true
+
+ +
logLevel?: LogLevel

Console logging level.

+
LogLevel.Error
+
+ +
showSwfDownload?: boolean

If set to true, the context menu has an option to download +the SWF.

+
false
+
+ +
contextMenu?: boolean | ContextMenu

Whether or not to show a context menu when right-clicking +a Ruffle instance.

+
ContextMenu.On
+
+ +
preloader?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle (backwards-compatibility).

+
true
+
+ +
splashScreen?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle.

+
true
+
+ +
maxExecutionDuration?: Duration

Maximum amount of time a script can take before scripting +is disabled.

+
15
+
+ +
base?: null | string

Specifies the base directory or URL used to resolve all relative path statements in the SWF file. +null means the current directory.

+
null
+
+ +
menu?: boolean

If set to true, the built-in context menu items are visible

+

This is equivalent to Stage.showMenu.

+
true
+
+ +
salign?: string

This is equivalent to Stage.align.

+
""
+
+ +
forceAlign?: boolean

If set to true, movies are prevented from changing the stage alignment.

+
false
+
+ +
quality?: string

This is equivalent to Stage.quality.

+
"high"
+
+ +
scale?: string

This is equivalent to Stage.scaleMode.

+
"showAll"
+
+ +
forceScale?: boolean

If set to true, movies are prevented from changing the stage scale mode.

+
false
+
+ +
allowFullscreen?: boolean

If set to true, the Stage's displayState can be changed

+
false
+
+ +
frameRate?: null | number

Sets and locks the player's frame rate, overriding the movie's frame rate.

+
null
+
+ +
wmode?: WindowMode

The window mode of the Ruffle player.

+

This setting controls how the Ruffle container is layered and rendered with other content on the page.

+
WindowMode.Window
+
+ +
playerVersion?: null | number

The emulated version of the player.

+

This controls the version that is reported to the movie. +null means latest version.

+
null
+
+ +
preferredRenderer?: null | RenderBackend

The preferred render backend of the Ruffle player.

+

This option should only be used for testing; +the available backends may change in future releases. +By default, Ruffle chooses the most featureful backend supported by the user's system, +falling back to more basic backends if necessary. +The available values in order of default preference are: +"webgpu", "wgpu-webgl", "webgl", "canvas".

+
null
+
+ +
publicPath?: null | string

The URL at which Ruffle can load its extra files (i.e. .wasm).

+
null
+
+ +
polyfills?: boolean

Whether or not to enable polyfills on the page.

+

Polyfills will look for "legacy" flash content like <object> +and <embed> elements, and replace them with compatible +Ruffle elements.

+
true
+
+ +
openUrlMode?: OpenURLMode

The handling mode of links opening a new website.

+
OpenURLMode.Allow
+
+ +
allowNetworking?: NetworkingAccessMode

Which flash networking APIs may be accessed.

+
NetworkingAccessMode.All
+
+ +
openInNewTab?: null | ((swf: URL) => void)

A function to call for opening content in a new tab.

+

This is only used if the content cannot be loaded due to CORS, +and the Extension version of Ruffle will override this to provide a local player.

+
null
+
+ +
socketProxy?: SocketProxy[]

An array of SocketProxy objects.

+

When a SWF tries to establish a Socket connection, Ruffle will search for +a matching SocketProxy object in this array and use it to establish a WebSocket connection, +through which all communication is tunneled through.

+

When none are found, Ruffle will fail the connection gracefully. +When multiple matching SocketProxy objects exist, the first one is used.

+
[]
+
+ +
fontSources?: string[]

An array of font URLs to eagerly load and provide to Ruffle.

+

These will be fetched by the browser as part of the loading of Flash content, which may slow down load times.

+

Currently only SWFs are supported, and each font embedded within that SWF will be used as device font by Flash content.

+

If any URL fails to load (either it's an invalid file, or a network error occurs), Ruffle will log an error but continue without it.

+
[]
+
+ +
defaultFonts?: DefaultFonts

The font names to use for each "default" Flash device font.

+
{}
+
+ +
credentialAllowList?: string[]

An array of origins that credentials may be sent to. +Credentials are cookies, authorization headers, or TLS client certificates.

+

Entries should include the protocol and host, for example https://example.org or http://subdomain.example.org.

+

Cookies will always be sent to the same origin as the page the content was loaded on. +If you configure this to send cookies to an origin but that origin does not configure CORS to allow it, +then requests will start failing due to CORS. +See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials.

+

This directly corresponds to https://developer.mozilla.org/en-US/docs/Web/API/fetch#credentials +Every request will be same-origin unless specified here, in which case it will be include.

+
[]
+
+ +
playerRuntime?: PlayerRuntime

The player runtime to emulate

+

This allows you to emulate Adobe AIR or Adobe Flash Player.

+
diff --git a/master/interfaces/Config.DataLoadOptions.html b/master/interfaces/Config.DataLoadOptions.html new file mode 100644 index 00000000..e0185b86 --- /dev/null +++ b/master/interfaces/Config.DataLoadOptions.html @@ -0,0 +1,254 @@ +DataLoadOptions | ruffle-core

Interface DataLoadOptions

Options to load a movie by a data stream.

+
interface DataLoadOptions {
    data: ArrayLike<number> | ArrayBufferLike;
    swfFileName?: string;
    allowScriptAccess?: boolean;
    parameters?:
        | null
        | string
        | URLSearchParams
        | Record<string, string>;
    autoplay?: AutoPlay;
    backgroundColor?: null | string;
    letterbox?: Letterbox;
    unmuteOverlay?: UnmuteOverlay;
    upgradeToHttps?: boolean;
    compatibilityRules?: boolean;
    favorFlash?: boolean;
    warnOnUnsupportedContent?: boolean;
    logLevel?: LogLevel;
    showSwfDownload?: boolean;
    contextMenu?: boolean | ContextMenu;
    preloader?: boolean;
    splashScreen?: boolean;
    maxExecutionDuration?: Duration;
    base?: null | string;
    menu?: boolean;
    salign?: string;
    forceAlign?: boolean;
    quality?: string;
    scale?: string;
    forceScale?: boolean;
    allowFullscreen?: boolean;
    frameRate?: null | number;
    wmode?: WindowMode;
    playerVersion?: null | number;
    preferredRenderer?: null | RenderBackend;
    publicPath?: null | string;
    polyfills?: boolean;
    openUrlMode?: OpenURLMode;
    allowNetworking?: NetworkingAccessMode;
    openInNewTab?: null | ((swf: URL) => void);
    socketProxy?: SocketProxy[];
    fontSources?: string[];
    defaultFonts?: DefaultFonts;
    credentialAllowList?: string[];
    playerRuntime?: PlayerRuntime;
}

Hierarchy (view full)

Properties

data: ArrayLike<number> | ArrayBufferLike

The data to load a movie from.

+
swfFileName?: string

The filename of the SWF movie to provide to ActionScript.

+
"movie.swf"
+
+ +
allowScriptAccess?: boolean

If set to true, the movie is allowed to interact with the page through +JavaScript, using a flash concept called ExternalInterface.

+

This should only be enabled for movies you trust.

+
false
+
+ +
parameters?:
    | null
    | string
    | URLSearchParams
    | Record<string, string>

Also known as "flashvars" - these are values that may be passed to +and loaded by the movie.

+

If a URL if specified when loading the movie, some parameters will +be extracted by the query portion of that URL and then overwritten +by any explicitly set here.

+
{}
+
+ +
autoplay?: AutoPlay

Controls the auto-play behaviour of Ruffle.

+
AutoPlay.Auto
+
+ +
backgroundColor?: null | string

Controls the background color of the player. +Must be an HTML color (e.g. "#FFFFFF"). CSS colors are not allowed. +null uses the background color of the SWF file.

+
null
+
+ +
letterbox?: Letterbox

Controls letterbox behavior when the Flash container size does not +match the movie size.

+
Letterbox.Fullscreen
+
+ +
unmuteOverlay?: UnmuteOverlay

Controls the visibility of the unmute overlay when the player +is started muted.

+
UnmuteOverlay.Visible
+
+ +
upgradeToHttps?: boolean

Whether or not to auto-upgrade all embedded URLs to https.

+

Flash content that embeds http urls will be blocked from +accessing those urls by the browser when Ruffle is loaded +in a https context. Set to true to automatically change +http:// to https:// for all embedded URLs when Ruffle is +loaded in an https context.

+
true
+
+ +
compatibilityRules?: boolean

Enable (true) or disable (false) Ruffle's built in compatibility rules.

+

These are rules that may make some content work by deliberately changing +behaviour, for example by rewriting requests or spoofing SWF urls if they +rely on websites that no longer exist.

+
true
+
+ +
favorFlash?: boolean

Favor using the real Adobe Flash Player over Ruffle if the browser supports it.

+
true
+
+ +
warnOnUnsupportedContent?: boolean

This is no longer used and does not affect anything. +It is only kept for backwards compatibility.

+

Previously: +"Whether or not to display an overlay with a warning when +loading a movie with unsupported content."

+
true
+
+ +
logLevel?: LogLevel

Console logging level.

+
LogLevel.Error
+
+ +
showSwfDownload?: boolean

If set to true, the context menu has an option to download +the SWF.

+
false
+
+ +
contextMenu?: boolean | ContextMenu

Whether or not to show a context menu when right-clicking +a Ruffle instance.

+
ContextMenu.On
+
+ +
preloader?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle (backwards-compatibility).

+
true
+
+ +
splashScreen?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle.

+
true
+
+ +
maxExecutionDuration?: Duration

Maximum amount of time a script can take before scripting +is disabled.

+
15
+
+ +
base?: null | string

Specifies the base directory or URL used to resolve all relative path statements in the SWF file. +null means the current directory.

+
null
+
+ +
menu?: boolean

If set to true, the built-in context menu items are visible

+

This is equivalent to Stage.showMenu.

+
true
+
+ +
salign?: string

This is equivalent to Stage.align.

+
""
+
+ +
forceAlign?: boolean

If set to true, movies are prevented from changing the stage alignment.

+
false
+
+ +
quality?: string

This is equivalent to Stage.quality.

+
"high"
+
+ +
scale?: string

This is equivalent to Stage.scaleMode.

+
"showAll"
+
+ +
forceScale?: boolean

If set to true, movies are prevented from changing the stage scale mode.

+
false
+
+ +
allowFullscreen?: boolean

If set to true, the Stage's displayState can be changed

+
false
+
+ +
frameRate?: null | number

Sets and locks the player's frame rate, overriding the movie's frame rate.

+
null
+
+ +
wmode?: WindowMode

The window mode of the Ruffle player.

+

This setting controls how the Ruffle container is layered and rendered with other content on the page.

+
WindowMode.Window
+
+ +
playerVersion?: null | number

The emulated version of the player.

+

This controls the version that is reported to the movie. +null means latest version.

+
null
+
+ +
preferredRenderer?: null | RenderBackend

The preferred render backend of the Ruffle player.

+

This option should only be used for testing; +the available backends may change in future releases. +By default, Ruffle chooses the most featureful backend supported by the user's system, +falling back to more basic backends if necessary. +The available values in order of default preference are: +"webgpu", "wgpu-webgl", "webgl", "canvas".

+
null
+
+ +
publicPath?: null | string

The URL at which Ruffle can load its extra files (i.e. .wasm).

+
null
+
+ +
polyfills?: boolean

Whether or not to enable polyfills on the page.

+

Polyfills will look for "legacy" flash content like <object> +and <embed> elements, and replace them with compatible +Ruffle elements.

+
true
+
+ +
openUrlMode?: OpenURLMode

The handling mode of links opening a new website.

+
OpenURLMode.Allow
+
+ +
allowNetworking?: NetworkingAccessMode

Which flash networking APIs may be accessed.

+
NetworkingAccessMode.All
+
+ +
openInNewTab?: null | ((swf: URL) => void)

A function to call for opening content in a new tab.

+

This is only used if the content cannot be loaded due to CORS, +and the Extension version of Ruffle will override this to provide a local player.

+
null
+
+ +
socketProxy?: SocketProxy[]

An array of SocketProxy objects.

+

When a SWF tries to establish a Socket connection, Ruffle will search for +a matching SocketProxy object in this array and use it to establish a WebSocket connection, +through which all communication is tunneled through.

+

When none are found, Ruffle will fail the connection gracefully. +When multiple matching SocketProxy objects exist, the first one is used.

+
[]
+
+ +
fontSources?: string[]

An array of font URLs to eagerly load and provide to Ruffle.

+

These will be fetched by the browser as part of the loading of Flash content, which may slow down load times.

+

Currently only SWFs are supported, and each font embedded within that SWF will be used as device font by Flash content.

+

If any URL fails to load (either it's an invalid file, or a network error occurs), Ruffle will log an error but continue without it.

+
[]
+
+ +
defaultFonts?: DefaultFonts

The font names to use for each "default" Flash device font.

+
{}
+
+ +
credentialAllowList?: string[]

An array of origins that credentials may be sent to. +Credentials are cookies, authorization headers, or TLS client certificates.

+

Entries should include the protocol and host, for example https://example.org or http://subdomain.example.org.

+

Cookies will always be sent to the same origin as the page the content was loaded on. +If you configure this to send cookies to an origin but that origin does not configure CORS to allow it, +then requests will start failing due to CORS. +See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials.

+

This directly corresponds to https://developer.mozilla.org/en-US/docs/Web/API/fetch#credentials +Every request will be same-origin unless specified here, in which case it will be include.

+
[]
+
+ +
playerRuntime?: PlayerRuntime

The player runtime to emulate

+

This allows you to emulate Adobe AIR or Adobe Flash Player.

+
diff --git a/master/interfaces/Config.DefaultFonts.html b/master/interfaces/Config.DefaultFonts.html new file mode 100644 index 00000000..9a73dfbb --- /dev/null +++ b/master/interfaces/Config.DefaultFonts.html @@ -0,0 +1,16 @@ +DefaultFonts | ruffle-core

Interface DefaultFonts

Defines the names of the fonts to use for each "default" Flash device font.

+

The name of each font provided will be used, in priority order.

+

For example, defining sans: ["Helvetica", "Arial"] would use Helvetica if present, before trying Arial.

+
interface DefaultFonts {
    sans?: string[];
    serif?: string[];
    typewriter?: string[];
    japaneseGothic?: string[];
    japaneseGothicMono?: string[];
    japaneseMincho?: string[];
}

Properties

sans?: string[]

_sans, a Sans-Serif font (similar to Helvetica or Arial)

+
serif?: string[]

_serif, a Serif font (similar to Times Roman)

+
typewriter?: string[]

_typewriter, a Monospace font (similar to Courier)

+
japaneseGothic?: string[]

_ゴシック, a Japanese Gothic font

+
japaneseGothicMono?: string[]

_等幅, a Japanese Gothic Mono font

+
japaneseMincho?: string[]

_明朝, a Japanese Mincho font

+
diff --git a/master/interfaces/Config.ObsoleteDuration.html b/master/interfaces/Config.ObsoleteDuration.html new file mode 100644 index 00000000..e5611174 --- /dev/null +++ b/master/interfaces/Config.ObsoleteDuration.html @@ -0,0 +1,5 @@ +ObsoleteDuration | ruffle-core

Interface ObsoleteDuration

Deprecated duration type, use SecsDuration instead. +Based on https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.new .

+
interface ObsoleteDuration {
    secs: number;
    nanos: number;
}

Properties

Properties

secs: number
nanos: number
diff --git a/master/interfaces/Config.SocketProxy.html b/master/interfaces/Config.SocketProxy.html new file mode 100644 index 00000000..1eae7bdd --- /dev/null +++ b/master/interfaces/Config.SocketProxy.html @@ -0,0 +1,8 @@ +SocketProxy | ruffle-core

Interface SocketProxy

Represents a host, port and proxyUrl. Used when a SWF file tries to use a Socket.

+
interface SocketProxy {
    host: string;
    port: number;
    proxyUrl: string;
}

Properties

Properties

host: string

Host used by the SWF.

+
port: number

Port used by the SWF.

+
proxyUrl: string

The proxy URL to use when SWF file tries to connect to the specified host and port.

+
diff --git a/master/interfaces/Config.URLLoadOptions.html b/master/interfaces/Config.URLLoadOptions.html new file mode 100644 index 00000000..1f3f4a86 --- /dev/null +++ b/master/interfaces/Config.URLLoadOptions.html @@ -0,0 +1,251 @@ +URLLoadOptions | ruffle-core

Interface URLLoadOptions

Options to load a movie by URL.

+
interface URLLoadOptions {
    url: string;
    allowScriptAccess?: boolean;
    parameters?:
        | null
        | string
        | URLSearchParams
        | Record<string, string>;
    autoplay?: AutoPlay;
    backgroundColor?: null | string;
    letterbox?: Letterbox;
    unmuteOverlay?: UnmuteOverlay;
    upgradeToHttps?: boolean;
    compatibilityRules?: boolean;
    favorFlash?: boolean;
    warnOnUnsupportedContent?: boolean;
    logLevel?: LogLevel;
    showSwfDownload?: boolean;
    contextMenu?: boolean | ContextMenu;
    preloader?: boolean;
    splashScreen?: boolean;
    maxExecutionDuration?: Duration;
    base?: null | string;
    menu?: boolean;
    salign?: string;
    forceAlign?: boolean;
    quality?: string;
    scale?: string;
    forceScale?: boolean;
    allowFullscreen?: boolean;
    frameRate?: null | number;
    wmode?: WindowMode;
    playerVersion?: null | number;
    preferredRenderer?: null | RenderBackend;
    publicPath?: null | string;
    polyfills?: boolean;
    openUrlMode?: OpenURLMode;
    allowNetworking?: NetworkingAccessMode;
    openInNewTab?: null | ((swf: URL) => void);
    socketProxy?: SocketProxy[];
    fontSources?: string[];
    defaultFonts?: DefaultFonts;
    credentialAllowList?: string[];
    playerRuntime?: PlayerRuntime;
}

Hierarchy (view full)

Properties

url: string

The URL to load a movie from.

+

If there is a query portion of this URL, then default parameters +will be extracted from that.

+
allowScriptAccess?: boolean

If set to true, the movie is allowed to interact with the page through +JavaScript, using a flash concept called ExternalInterface.

+

This should only be enabled for movies you trust.

+
false
+
+ +
parameters?:
    | null
    | string
    | URLSearchParams
    | Record<string, string>

Also known as "flashvars" - these are values that may be passed to +and loaded by the movie.

+

If a URL if specified when loading the movie, some parameters will +be extracted by the query portion of that URL and then overwritten +by any explicitly set here.

+
{}
+
+ +
autoplay?: AutoPlay

Controls the auto-play behaviour of Ruffle.

+
AutoPlay.Auto
+
+ +
backgroundColor?: null | string

Controls the background color of the player. +Must be an HTML color (e.g. "#FFFFFF"). CSS colors are not allowed. +null uses the background color of the SWF file.

+
null
+
+ +
letterbox?: Letterbox

Controls letterbox behavior when the Flash container size does not +match the movie size.

+
Letterbox.Fullscreen
+
+ +
unmuteOverlay?: UnmuteOverlay

Controls the visibility of the unmute overlay when the player +is started muted.

+
UnmuteOverlay.Visible
+
+ +
upgradeToHttps?: boolean

Whether or not to auto-upgrade all embedded URLs to https.

+

Flash content that embeds http urls will be blocked from +accessing those urls by the browser when Ruffle is loaded +in a https context. Set to true to automatically change +http:// to https:// for all embedded URLs when Ruffle is +loaded in an https context.

+
true
+
+ +
compatibilityRules?: boolean

Enable (true) or disable (false) Ruffle's built in compatibility rules.

+

These are rules that may make some content work by deliberately changing +behaviour, for example by rewriting requests or spoofing SWF urls if they +rely on websites that no longer exist.

+
true
+
+ +
favorFlash?: boolean

Favor using the real Adobe Flash Player over Ruffle if the browser supports it.

+
true
+
+ +
warnOnUnsupportedContent?: boolean

This is no longer used and does not affect anything. +It is only kept for backwards compatibility.

+

Previously: +"Whether or not to display an overlay with a warning when +loading a movie with unsupported content."

+
true
+
+ +
logLevel?: LogLevel

Console logging level.

+
LogLevel.Error
+
+ +
showSwfDownload?: boolean

If set to true, the context menu has an option to download +the SWF.

+
false
+
+ +
contextMenu?: boolean | ContextMenu

Whether or not to show a context menu when right-clicking +a Ruffle instance.

+
ContextMenu.On
+
+ +
preloader?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle (backwards-compatibility).

+
true
+
+ +
splashScreen?: boolean

Whether or not to show a splash screen before the SWF has loaded with Ruffle.

+
true
+
+ +
maxExecutionDuration?: Duration

Maximum amount of time a script can take before scripting +is disabled.

+
15
+
+ +
base?: null | string

Specifies the base directory or URL used to resolve all relative path statements in the SWF file. +null means the current directory.

+
null
+
+ +
menu?: boolean

If set to true, the built-in context menu items are visible

+

This is equivalent to Stage.showMenu.

+
true
+
+ +
salign?: string

This is equivalent to Stage.align.

+
""
+
+ +
forceAlign?: boolean

If set to true, movies are prevented from changing the stage alignment.

+
false
+
+ +
quality?: string

This is equivalent to Stage.quality.

+
"high"
+
+ +
scale?: string

This is equivalent to Stage.scaleMode.

+
"showAll"
+
+ +
forceScale?: boolean

If set to true, movies are prevented from changing the stage scale mode.

+
false
+
+ +
allowFullscreen?: boolean

If set to true, the Stage's displayState can be changed

+
false
+
+ +
frameRate?: null | number

Sets and locks the player's frame rate, overriding the movie's frame rate.

+
null
+
+ +
wmode?: WindowMode

The window mode of the Ruffle player.

+

This setting controls how the Ruffle container is layered and rendered with other content on the page.

+
WindowMode.Window
+
+ +
playerVersion?: null | number

The emulated version of the player.

+

This controls the version that is reported to the movie. +null means latest version.

+
null
+
+ +
preferredRenderer?: null | RenderBackend

The preferred render backend of the Ruffle player.

+

This option should only be used for testing; +the available backends may change in future releases. +By default, Ruffle chooses the most featureful backend supported by the user's system, +falling back to more basic backends if necessary. +The available values in order of default preference are: +"webgpu", "wgpu-webgl", "webgl", "canvas".

+
null
+
+ +
publicPath?: null | string

The URL at which Ruffle can load its extra files (i.e. .wasm).

+
null
+
+ +
polyfills?: boolean

Whether or not to enable polyfills on the page.

+

Polyfills will look for "legacy" flash content like <object> +and <embed> elements, and replace them with compatible +Ruffle elements.

+
true
+
+ +
openUrlMode?: OpenURLMode

The handling mode of links opening a new website.

+
OpenURLMode.Allow
+
+ +
allowNetworking?: NetworkingAccessMode

Which flash networking APIs may be accessed.

+
NetworkingAccessMode.All
+
+ +
openInNewTab?: null | ((swf: URL) => void)

A function to call for opening content in a new tab.

+

This is only used if the content cannot be loaded due to CORS, +and the Extension version of Ruffle will override this to provide a local player.

+
null
+
+ +
socketProxy?: SocketProxy[]

An array of SocketProxy objects.

+

When a SWF tries to establish a Socket connection, Ruffle will search for +a matching SocketProxy object in this array and use it to establish a WebSocket connection, +through which all communication is tunneled through.

+

When none are found, Ruffle will fail the connection gracefully. +When multiple matching SocketProxy objects exist, the first one is used.

+
[]
+
+ +
fontSources?: string[]

An array of font URLs to eagerly load and provide to Ruffle.

+

These will be fetched by the browser as part of the loading of Flash content, which may slow down load times.

+

Currently only SWFs are supported, and each font embedded within that SWF will be used as device font by Flash content.

+

If any URL fails to load (either it's an invalid file, or a network error occurs), Ruffle will log an error but continue without it.

+
[]
+
+ +
defaultFonts?: DefaultFonts

The font names to use for each "default" Flash device font.

+
{}
+
+ +
credentialAllowList?: string[]

An array of origins that credentials may be sent to. +Credentials are cookies, authorization headers, or TLS client certificates.

+

Entries should include the protocol and host, for example https://example.org or http://subdomain.example.org.

+

Cookies will always be sent to the same origin as the page the content was loaded on. +If you configure this to send cookies to an origin but that origin does not configure CORS to allow it, +then requests will start failing due to CORS. +See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials.

+

This directly corresponds to https://developer.mozilla.org/en-US/docs/Web/API/fetch#credentials +Every request will be same-origin unless specified here, in which case it will be include.

+
[]
+
+ +
playerRuntime?: PlayerRuntime

The player runtime to emulate

+

This allows you to emulate Adobe AIR or Adobe Flash Player.

+
diff --git a/master/interfaces/Player.FlashAPI.html b/master/interfaces/Player.FlashAPI.html new file mode 100644 index 00000000..56ae415d --- /dev/null +++ b/master/interfaces/Player.FlashAPI.html @@ -0,0 +1,10 @@ +FlashAPI | ruffle-core

Interface FlashAPI

These are properties and methods that Flash added to its <embed>/<object> tags. +These don't seem to be documented in full anywhere, and Ruffle adds them as we encounter some. +You are discouraged from using these, and they exist only to support legacy websites from decades ago.

+

Extra methods or properties may appear at any time, due to ExternalInterface.addCallback(). +It may even overwrite existing methods or properties.

+
interface FlashAPI {
    PercentLoaded(): number;
}

Hierarchy (view full)

Methods

Methods

  • Returns the movies loaded process, in a percent from 0 to 100. +Ruffle may just return 0 or 100.

    +

    Returns number

    a value from 0 to 100, inclusive.

    +
diff --git a/master/interfaces/Player.LegacyRuffleAPI.html b/master/interfaces/Player.LegacyRuffleAPI.html new file mode 100644 index 00000000..26b93d14 --- /dev/null +++ b/master/interfaces/Player.LegacyRuffleAPI.html @@ -0,0 +1,81 @@ +LegacyRuffleAPI | ruffle-core

Interface LegacyRuffleAPI

Legacy interface to the Ruffle API.

+

These methods are deprecated and only exist for backwards compatibility. +Due to the nature of Flash, they may be replaced at any time via ActionScript's ExternalInterface class.

+
interface LegacyRuffleAPI {
    onFSCommand: null | ((command: string, args: string) => boolean);
    config: object | URLLoadOptions | DataLoadOptions;
    loadedConfig: null | URLLoadOptions | DataLoadOptions;
    get readyState(): ReadyState;
    get metadata(): null | MovieMetadata;
    reload(): Promise<void>;
    load(options: string | URLLoadOptions | DataLoadOptions): Promise<void>;
    play(): void;
    get isPlaying(): boolean;
    volume: number;
    get fullscreenEnabled(): boolean;
    get isFullscreen(): boolean;
    setFullscreen(isFull: boolean): void;
    enterFullscreen(): void;
    exitFullscreen(): void;
    pause(): void;
    set traceObserver(observer: null | ((message: string) => void));
    downloadSwf(): Promise<void>;
    displayMessage(message: string): void;
}

Hierarchy (view full)

Properties

onFSCommand: null | ((command: string, args: string) => boolean)

A movie can communicate with the hosting page using fscommand +as long as script access is allowed.

+

A string passed to the host application for any use.

+

A string passed to the host application for any use.

+

True if the command was handled.

+
config: object | URLLoadOptions | DataLoadOptions

Any configuration that should apply to this specific player. +This will be defaulted with any global configuration.

+
loadedConfig: null | URLLoadOptions | DataLoadOptions

The effective config loaded with the last call to load(). +If no such call has been made, this will be null.

+

Accessors

  • get readyState(): ReadyState
  • Indicates the readiness of the playing movie.

    +

    Returns ReadyState

    The ReadyState of the player.

    +
  • get metadata(): null | MovieMetadata
  • The metadata of the playing movie (such as movie width and height). +These are inherent properties stored in the SWF file and are not affected by runtime changes. +For example, metadata.width is the width of the SWF file, and not the width of the Ruffle player.

    +

    Returns null | MovieMetadata

    The metadata of the movie, or null if the movie metadata has not yet loaded.

    +
  • get isPlaying(): boolean
  • Whether this player is currently playing.

    +

    Returns boolean

    True if this player is playing, false if it's paused or hasn't started yet.

    +
  • get volume(): number
  • Returns the master volume of the player.

    +

    The volume is linear and not adapted for logarithmic hearing.

    +

    Returns number

    The volume. 1.0 is 100% volume.

    +
  • set volume(value): void
  • Sets the master volume of the player.

    +

    The volume should be linear and not adapted for logarithmic hearing.

    +

    Parameters

    • value: number

      The volume. 1.0 is 100% volume.

      +

    Returns void

  • get isFullscreen(): boolean
  • Checks if this player is currently fullscreen inside the browser.

    +

    Returns boolean

    True if it is fullscreen.

    +
  • set traceObserver(observer): void
  • Sets a trace observer on this flash player.

    +

    The observer will be called, as a function, for each message that the playing movie will "trace" (output).

    +

    Parameters

    • observer: null | ((message: string) => void)

      The observer that will be called for each trace.

      +

    Returns void

Methods

  • Reloads the player, as if you called load with the same config as the last time it was called.

    +

    If this player has never been loaded, this method will return an error.

    +

    Returns Promise<void>

  • Loads a specified movie into this player.

    +

    This will replace any existing movie that may be playing.

    +

    Parameters

    • options: string | URLLoadOptions | DataLoadOptions

      One of the following:

      +
        +
      • A URL, passed as a string, which will load a URL with default options.
      • +
      • A URLLoadOptions object, to load a URL with options.
      • +
      • A DataLoadOptions object, to load data with options. +The options, if provided, must only contain values provided for this specific movie. +They must not contain any default values, since those would overwrite other configuration +settings with a lower priority (e.g. the general RufflePlayer config).
      • +
      +

      The options will be defaulted by the config field, which itself +is defaulted by a global window.RufflePlayer.config.

      +

    Returns Promise<void>

  • Exported function that requests the browser to change the fullscreen state if +it is allowed.

    +

    Parameters

    • isFull: boolean

      Whether to set to fullscreen or return to normal.

      +

    Returns void

  • Requests the browser to no longer make this player fullscreen.

    +

    Returns void

  • Pauses this player.

    +

    No more frames, scripts or sounds will be executed. +This movie will be considered inactive and will not wake up until resumed.

    +

    Returns void

  • Show a dismissible message in front of the player.

    +

    Parameters

    • message: string

      The message shown to the user.

      +

    Returns void

diff --git a/master/interfaces/Player.MovieMetadata.html b/master/interfaces/Player.MovieMetadata.html new file mode 100644 index 00000000..8adf1d3f --- /dev/null +++ b/master/interfaces/Player.MovieMetadata.html @@ -0,0 +1,19 @@ +MovieMetadata | ruffle-core

Interface MovieMetadata

Metadata about a loaded SWF file.

+
interface MovieMetadata {
    width: number;
    height: number;
    frameRate: number;
    numFrames: number;
    swfVersion: number;
    backgroundColor: null | string;
    isActionScript3: boolean;
    uncompressedLength: number;
}

Properties

width: number

The width of the movie in pixels.

+
height: number

The height of the movie in pixels.

+
frameRate: number

The frame rate of the movie in frames per second.

+
numFrames: number

The number of frames on the root timeline of the movie.

+
swfVersion: number

The SWF version of the movie.

+
backgroundColor: null | string

The background color of the movie as a hex string, such as "#FFFFFF". +May be null if the background color is unavailable.

+
isActionScript3: boolean

Whether this movie is an ActionScript 3.0 movie.

+
uncompressedLength: number

Uncompressed length in bytes.

+
diff --git a/master/interfaces/Player.PlayerElement.html b/master/interfaces/Player.PlayerElement.html new file mode 100644 index 00000000..879f3098 --- /dev/null +++ b/master/interfaces/Player.PlayerElement.html @@ -0,0 +1,86 @@ +PlayerElement | ruffle-core

Interface PlayerElement

A Ruffle player's HTML element.

+

This is either created through window.RufflePlayer.latest().createPlayer(), or polyfilled from a <embed>/<object> tag.

+

In addition to usual HTML attributes, this player contains methods and properties that belong to both +the Flash JS API and legacy Ruffle APIs.

+
interface PlayerElement {
    onFSCommand: null | ((command: string, args: string) => boolean);
    config: object | URLLoadOptions | DataLoadOptions;
    loadedConfig: null | URLLoadOptions | DataLoadOptions;
    get readyState(): ReadyState;
    get metadata(): null | MovieMetadata;
    reload(): Promise<void>;
    load(options: string | URLLoadOptions | DataLoadOptions): Promise<void>;
    play(): void;
    get isPlaying(): boolean;
    volume: number;
    get fullscreenEnabled(): boolean;
    get isFullscreen(): boolean;
    setFullscreen(isFull: boolean): void;
    enterFullscreen(): void;
    exitFullscreen(): void;
    pause(): void;
    set traceObserver(observer: null | ((message: string) => void));
    downloadSwf(): Promise<void>;
    displayMessage(message: string): void;
    PercentLoaded(): number;
}

Hierarchy (view full)

Properties

onFSCommand: null | ((command: string, args: string) => boolean)

A movie can communicate with the hosting page using fscommand +as long as script access is allowed.

+

A string passed to the host application for any use.

+

A string passed to the host application for any use.

+

True if the command was handled.

+
config: object | URLLoadOptions | DataLoadOptions

Any configuration that should apply to this specific player. +This will be defaulted with any global configuration.

+
loadedConfig: null | URLLoadOptions | DataLoadOptions

The effective config loaded with the last call to load(). +If no such call has been made, this will be null.

+

Accessors

  • get readyState(): ReadyState
  • Indicates the readiness of the playing movie.

    +

    Returns ReadyState

    The ReadyState of the player.

    +
  • get metadata(): null | MovieMetadata
  • The metadata of the playing movie (such as movie width and height). +These are inherent properties stored in the SWF file and are not affected by runtime changes. +For example, metadata.width is the width of the SWF file, and not the width of the Ruffle player.

    +

    Returns null | MovieMetadata

    The metadata of the movie, or null if the movie metadata has not yet loaded.

    +
  • get isPlaying(): boolean
  • Whether this player is currently playing.

    +

    Returns boolean

    True if this player is playing, false if it's paused or hasn't started yet.

    +
  • get volume(): number
  • Returns the master volume of the player.

    +

    The volume is linear and not adapted for logarithmic hearing.

    +

    Returns number

    The volume. 1.0 is 100% volume.

    +
  • set volume(value): void
  • Sets the master volume of the player.

    +

    The volume should be linear and not adapted for logarithmic hearing.

    +

    Parameters

    • value: number

      The volume. 1.0 is 100% volume.

      +

    Returns void

  • get fullscreenEnabled(): boolean
  • Checks if this player is allowed to be fullscreen by the browser.

    +

    Returns boolean

    True if you may call enterFullscreen.

    +
  • get isFullscreen(): boolean
  • Checks if this player is currently fullscreen inside the browser.

    +

    Returns boolean

    True if it is fullscreen.

    +
  • set traceObserver(observer): void
  • Sets a trace observer on this flash player.

    +

    The observer will be called, as a function, for each message that the playing movie will "trace" (output).

    +

    Parameters

    • observer: null | ((message: string) => void)

      The observer that will be called for each trace.

      +

    Returns void

Methods

  • Loads a specified movie into this player.

    +

    This will replace any existing movie that may be playing.

    +

    Parameters

    • options: string | URLLoadOptions | DataLoadOptions

      One of the following:

      +
        +
      • A URL, passed as a string, which will load a URL with default options.
      • +
      • A URLLoadOptions object, to load a URL with options.
      • +
      • A DataLoadOptions object, to load data with options. +The options, if provided, must only contain values provided for this specific movie. +They must not contain any default values, since those would overwrite other configuration +settings with a lower priority (e.g. the general RufflePlayer config).
      • +
      +

      The options will be defaulted by the config field, which itself +is defaulted by a global window.RufflePlayer.config.

      +

    Returns Promise<void>

  • Exported function that requests the browser to change the fullscreen state if +it is allowed.

    +

    Parameters

    • isFull: boolean

      Whether to set to fullscreen or return to normal.

      +

    Returns void

  • Pauses this player.

    +

    No more frames, scripts or sounds will be executed. +This movie will be considered inactive and will not wake up until resumed.

    +

    Returns void

  • Returns the movies loaded process, in a percent from 0 to 100. +Ruffle may just return 0 or 100.

    +

    Returns number

    a value from 0 to 100, inclusive.

    +
diff --git a/master/interfaces/Setup.InstallationOptions.html b/master/interfaces/Setup.InstallationOptions.html new file mode 100644 index 00000000..0e4423d2 --- /dev/null +++ b/master/interfaces/Setup.InstallationOptions.html @@ -0,0 +1,7 @@ +InstallationOptions | ruffle-core

Interface InstallationOptions

Options to use with this specific installation of Ruffle.

+

This is mostly to provide a way to configure environmental settings, like using +onFirstLoad to potentially configure webpack prior to loading wasm files.

+
interface InstallationOptions {
    onFirstLoad?: (() => void);
}

Properties

Properties

onFirstLoad?: (() => void)

A callback to be run before the very first time Ruffle is loaded. +This may be used to configure a bundler prior to asset loading.

+
diff --git a/master/interfaces/Setup.PublicAPILike.html b/master/interfaces/Setup.PublicAPILike.html new file mode 100644 index 00000000..5c762fe9 --- /dev/null +++ b/master/interfaces/Setup.PublicAPILike.html @@ -0,0 +1,9 @@ +PublicAPILike | ruffle-core

Interface PublicAPILike

Represents a potential installation of a Ruffle public API.

+

Unlike PublicAPI, this may come from any source, past or future. +It needs to be forwards compatible and convertible into a modern day PublicAPI.

+
interface PublicAPILike {
    config?: object | URLLoadOptions | DataLoadOptions;
    sources?: Record<string, SourceAPI>;
    invoked?: boolean;
    newestName?: null | string;
    superseded?(): void;
}

Implemented by

Properties

config?: object | URLLoadOptions | DataLoadOptions
sources?: Record<string, SourceAPI>
invoked?: boolean
newestName?: null | string

Methods

diff --git a/master/interfaces/Setup.SourceAPI.html b/master/interfaces/Setup.SourceAPI.html new file mode 100644 index 00000000..ea73415d --- /dev/null +++ b/master/interfaces/Setup.SourceAPI.html @@ -0,0 +1,18 @@ +SourceAPI | ruffle-core

Interface SourceAPI

Represents this particular version of Ruffle.

+

Multiple APIs can be instantiated from different sources; e.g. an "extension" +version, versus a "local" version. This expresses to the Public API +negotiator (see PublicAPI) what this particular version of Ruffle is and +how to control it.

+
interface SourceAPI {
    version: string;
    polyfill(): void;
    pluginPolyfill(): void;
    createPlayer(): PlayerElement;
}

Properties

version: string

The version of this particular API, as a string in a semver compatible format.

+

Methods

  • Start up the polyfills.

    +

    Do not run polyfills for more than one Ruffle source at a time.

    +

    Returns void

  • Polyfill the plugin detection.

    +

    This needs to run before any plugin detection script does.

    +

    Returns void

diff --git a/master/media/README.md b/master/media/README.md new file mode 100644 index 00000000..9494d087 --- /dev/null +++ b/master/media/README.md @@ -0,0 +1,165 @@ +# ruffle-web + +![Test Web](https://github.com/ruffle-rs/ruffle/workflows/Test%20Web/badge.svg) + +ruffle-web is a Wasm version of Ruffle, intended for use by either +using the `ruffle-selfhosted` or `ruffle-extension` NPM packages. + +This project is split into two parts: The actual Flash player written in Rust, +and a javascript interface to it. Most of the time, you will be building the +actual rust part through the npm build scripts. + +## Using ruffle-web + +Please refer to our wiki for instructions on how to use Ruffle either +[on your own website](https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#web), +or as a [browser extension](https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#browser-extension). + +## How it works + +We compile Ruffle down to a Wasm ([WebAssembly](https://webassembly.org/)) binary, which will be loaded +into web pages either deliberately (installing the selfhosted package onto the website), or injected +by users as a browser extension. + +By default we will detect and replace any embedded Flash content on websites with the Ruffle player +(we call this "polyfilling"), but this can be configured by the website. This means that Ruffle is an +"out of the box" solution for getting Flash to work again; include Ruffle and it should just work™. + +For rendering the content, we prefer to use [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API). +WebGL is very accurate, hardware-accelerated and very fast, but is not universally supported. +Additionally, many privacy related browsers or extensions will disable WebGL by default. +For this reason, we include a fallback using [the canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API). + +## Building from source + +### Requirements + +Before you are able to build this project, you must first install a few dependencies: + +#### Rust + +Follow the instructions [to install rust](https://www.rust-lang.org/tools/install) on your machine. + +We do not have a Minimum Supported Rust Version policy. If it fails to build, it's likely you may need +to update to the latest stable version of rust. You may run `rustup update` to do this (if you installed +rust using the above instructions). + +For the compiler to be able to output WebAssembly, an additional target has to be added to it: `rustup target add wasm32-unknown-unknown` + +#### Java + +Follow the instructions [to install OpenJDK](https://openjdk.org/projects/jdk/20/) on your machine. + +We do not have a specific Java support policy. Any Java version that supports running the AS3 compiler +should work. Additionally, headless JREs should also work. + +#### Node.js + +Follow the instructions to [install Node.js](https://nodejs.org/) on your machine. + +We recommend using the currently active LTS 20, but we do also run tests with current Node.js 22. + +Note that npm 7 or newer is required. It should come bundled with Node.js 15 or newer, but can be upgraded with older Node.js versions using `npm install -g npm` as root/Administrator. + +#### wasm-bindgen + + + +This can be installed with `cargo install wasm-bindgen-cli --version 0.2.95`. Be sure to install this specific version of `wasm-bindgen-cli` to match the version used by Ruffle. + +#### Binaryen + +This is optional, used to further optimize the built WebAssembly module. +Some ways to install Binaryen: + +- download one of the [prebuilt releases](https://github.com/WebAssembly/binaryen/releases/) +- using your Linux distribution's package manager (`sudo apt install binaryen`, `sudo dnf install binaryen`) +- from [Homebrew](https://formulae.brew.sh/formula/binaryen) +- from [Anaconda](https://anaconda.org/conda-forge/binaryen) +- [compile it yourself](https://github.com/WebAssembly/binaryen#building) + +Just make sure the `wasm-opt` program is in `$PATH`, and that it works. + +#### Optional features + +##### `jpegxr` + +The release version of the extension is compiled with `jpegxr`. +To enable it, set the env `CARGO_FEATURES="jpegxr"`. + +Windows dependencies: + +- Install LLVM and add the full path of its `bin` folder (example: `C:\Program Files\LLVM-18.1.6\bin`) to your env `PATH`. +- Set env `LIBCLANG_PATH` with the same `bin` folder. + +### Building + +In this project, you may run the following commands to build all packages: + +- `npm install` + - This will install every dependency for every package. + - Run this every time you pull in new changes, otherwise you may be missing a package and the build will fail. +- `npm run build` + - This will build the wasm binary and every node package (notably selfhosted and extension). + - Output will be available in the `dist/` folder of each package (for example, `./packages/selfhosted/dist`). + - You may also use `npm run build:debug` to disable Webpack optimizations and activate the (extremely verbose) ActionScript debugging output. + - There is `npm run build:dual-wasm` as well, to build a second WebAssembly module that makes use of some WebAssembly extensions, + potentially resulting in better performance in browsers that support them, at the expense of longer build time. + - `npm run build:repro` enables reproducible builds. Note that this also requires a `version_seal.json`, which is not provided in the normal Git repository - only specially-marked reproducible source archives. Running this without a version seal will generate one based on the current state of your environment. + +From here, you may follow the instructions to [use Ruffle on your website](packages/selfhosted/README.md), +run a demo locally with `npm run demo`, or [install the extension in your browser](https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#browser-extension). + +### Testing + +There are two parts of tests to this project: +- Regular node tests, ran through `npm run test`. You must have built everything first as above. These have no special requirements. +- Browser based tests, ran through `npm run wdio` with extra arguments as below. These take longer to run and require some setup. + +## Browser Based Tests +There are full integration tests that require a browser to run. We don't make any assumptions about your environment, and so you must specify it yourself. + +To run these tests, first build the project as above, then use `npm run wdio -- --arg1 --arg2` etc. + +### Local Browsers +These are additive - you can specify multiple at the same time. You must have the given browsers installed locally though, or it will fail. + +- `--chrome` for Chrome +- `--firefox` for Firefox +- `--edge` for Edge + +### BrowserStack (Mobile Browsers) +To run tests on mobile devices on BrowserStack, pass the `--browserstack` argument. +We also have our "minimum supported desktop browsers" available too, by additionally passing `--oldVersions`. + +You will need a BrowserStack account (Maintainers may contact @Dinnerbone on Discord for an invite to the Ruffle team), +and set the appropriate values to `BROWSERSTACK_USERNAME` and `BROWSERSTACK_ACCESS_KEY` environment variables. + +### Other Options +Pass `--headless` to hide the browser windows. This is useful and recommended in almost every case, but if you want to debug why a test fails then it's very useful to not pass this. + +Pass `--spec ` to filter a test based on name. For example, `--spec external_interface` to tests with `external_interface` in the path. + + +### Testing tips! +If debugging a failing test, use `await browser.pause(100000);` in the test file to pause it, and don't start the test with `--headless`. +That way you can actually see what's happening, and manually get involved to debug it. + +## Structure + +- This directory is a cargo crate which is the actual Flash player, and also a root node package. +- [packages/core](packages/core) is a node package which contains the core ruffle web API & wasm bindings. +- [packages/selfhosted](packages/selfhosted) is a node package intended for consumption by websites to include Ruffle on their site. +- [packages/extension](packages/extension) is a node package that turns Ruffle into a browser extension. +- [packages/demo](packages/demo) is an example node package of how to use self-hosted ruffle on your site, and testing it locally. + +## Contributing + +Please follow the [general contribution guidelines for Ruffle](../CONTRIBUTING.md). + +In addition to those, we ask that you ensure that you pass all tests with `npm run test`, and check the automatic code +linting & styler by running `npm run format` before you commit. + +Where possible, please add tests to all new functionality or bug fixes that you contribute. + +Thank you! diff --git a/master/modules.html b/master/modules.html new file mode 100644 index 00000000..93b00f03 --- /dev/null +++ b/master/modules.html @@ -0,0 +1,5 @@ +ruffle-core

ruffle-core

Index

Namespaces

Variables

diff --git a/master/modules/Config.html b/master/modules/Config.html new file mode 100644 index 00000000..216651a6 --- /dev/null +++ b/master/modules/Config.html @@ -0,0 +1,23 @@ +Config | ruffle-core

Namespace Config

The Config module contains all the types that Ruffle uses for movie configs.

+

The main interface of interest here is BaseLoadOptions, which you can apply to window.RufflePlayer.config +to set the default configuration of all players.

+

Index

Enumerations

Interfaces

Type Aliases

Variables

diff --git a/master/modules/Player.html b/master/modules/Player.html new file mode 100644 index 00000000..c4a1d588 --- /dev/null +++ b/master/modules/Player.html @@ -0,0 +1,6 @@ +Player | ruffle-core

Namespace Player

The Player module contains the actual PlayerElement and the various interfaces that exist to interact with the player.

+

Index

Interfaces

diff --git a/master/modules/Setup.html b/master/modules/Setup.html new file mode 100644 index 00000000..cc2dffcb --- /dev/null +++ b/master/modules/Setup.html @@ -0,0 +1,15 @@ +Setup | ruffle-core

Namespace Setup

The Setup module contains the interfaces and methods needed to install Ruffle onto a page, +and create a PlayerElement with the latest version of Ruffle available.

+

This is primarily relevant to users of ruffle-core as a npm module, as the "selfhosted" version of Ruffle preinstalls itself, +and without type checking the interfaces here are of limited use.

+

For users of ruffle-core as a npm module, you are encouraged to call installRuffle once during page load to +make the ruffle-core library register itself as a version of Ruffle on the page.

+

Multiple sources of Ruffle may exist - for example, the Ruffle browser extension also installs itself on page load. +For this reason, you are required to call window.RufflePlayer.latest() (for example) to grab the latest SourceAPI, +from which you can create a PlayerElement via SourceAPI.createPlayer.

+

Index

Classes

Interfaces

Functions

diff --git a/master/types/Config.Duration.html b/master/types/Config.Duration.html new file mode 100644 index 00000000..5e725d66 --- /dev/null +++ b/master/types/Config.Duration.html @@ -0,0 +1,3 @@ +Duration | ruffle-core

Type Alias Duration

Any new duration-based setting should use 'number' or 'SecsDuration' for its type, +instead of this type.

+
diff --git a/master/types/Config.SecsDuration.html b/master/types/Config.SecsDuration.html new file mode 100644 index 00000000..0c05d837 --- /dev/null +++ b/master/types/Config.SecsDuration.html @@ -0,0 +1,2 @@ +SecsDuration | ruffle-core

Type Alias SecsDuration

SecsDuration: number

Non-negative duration in seconds.

+
diff --git a/master/variables/Config.DEFAULT_CONFIG.html b/master/variables/Config.DEFAULT_CONFIG.html new file mode 100644 index 00000000..97cb2558 --- /dev/null +++ b/master/variables/Config.DEFAULT_CONFIG.html @@ -0,0 +1 @@ +DEFAULT_CONFIG | ruffle-core

Variable DEFAULT_CONFIGConst

DEFAULT_CONFIG: Required<BaseLoadOptions> = ...
diff --git a/master/variables/buildInfo.html b/master/variables/buildInfo.html new file mode 100644 index 00000000..4ff7eee0 --- /dev/null +++ b/master/variables/buildInfo.html @@ -0,0 +1,3 @@ +buildInfo | ruffle-core

Variable buildInfoConst

buildInfo: {
    versionNumber: string;
    versionName: string;
    versionChannel: string;
    buildDate: string;
    commitHash: string;
} = ...

Stores build information about this specific version of the ruffle-core library.

+

It does not represent the version of Ruffle that may be in use by the page (for example, if a browser extension overrides it).

+