From 12cd23b85bc8d5ca0d52913903b1f8c53fe21181 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Wed, 18 Sep 2024 20:38:49 +0200 Subject: [PATCH 1/9] wip: create the documentation for the module 'forms' in flottform Signed-off-by: nidhal-labidi --- flottform/forms/docs/.nojekyll | 1 + flottform/forms/docs/assets/highlight.css | 57 + flottform/forms/docs/assets/icons.js | 18 + flottform/forms/docs/assets/icons.svg | 1 + flottform/forms/docs/assets/main.js | 60 + flottform/forms/docs/assets/navigation.js | 1 + flottform/forms/docs/assets/search.js | 1 + flottform/forms/docs/assets/style.css | 1448 +++++++++++++++++ ...channel_client.FlottformChannelClient.html | 32 + ...orm_channel_host.FlottformChannelHost.html | 25 + ...input_client.FlottformFileInputClient.html | 21 + ...ile_input_host.FlottformFileInputHost.html | 29 + ...input_client.FlottformTextInputClient.html | 24 + ...ext_input_host.FlottformTextInputHost.html | 25 + flottform/forms/docs/index.html | 70 + .../modules/flottform_channel_client.html | 2 + .../docs/modules/flottform_channel_host.html | 2 + .../modules/flottform_file_input_client.html | 2 + .../modules/flottform_file_input_host.html | 2 + .../modules/flottform_text_input_client.html | 2 + .../modules/flottform_text_input_host.html | 2 + flottform/forms/package.json | 5 +- .../forms/src/flottform-channel-client.ts | 104 +- flottform/forms/src/flottform-channel-host.ts | 117 +- .../forms/src/flottform-file-input-client.ts | 71 + .../forms/src/flottform-file-input-host.ts | 69 +- flottform/forms/src/flottform-styles.ts | 2 +- .../forms/src/flottform-text-input-client.ts | 38 + .../forms/src/flottform-text-input-host.ts | 50 +- flottform/forms/typedoc.json | 17 + pnpm-lock.yaml | 733 +++++---- 31 files changed, 2734 insertions(+), 297 deletions(-) create mode 100644 flottform/forms/docs/.nojekyll create mode 100644 flottform/forms/docs/assets/highlight.css create mode 100644 flottform/forms/docs/assets/icons.js create mode 100644 flottform/forms/docs/assets/icons.svg create mode 100644 flottform/forms/docs/assets/main.js create mode 100644 flottform/forms/docs/assets/navigation.js create mode 100644 flottform/forms/docs/assets/search.js create mode 100644 flottform/forms/docs/assets/style.css create mode 100644 flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html create mode 100644 flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html create mode 100644 flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html create mode 100644 flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html create mode 100644 flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html create mode 100644 flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html create mode 100644 flottform/forms/docs/index.html create mode 100644 flottform/forms/docs/modules/flottform_channel_client.html create mode 100644 flottform/forms/docs/modules/flottform_channel_host.html create mode 100644 flottform/forms/docs/modules/flottform_file_input_client.html create mode 100644 flottform/forms/docs/modules/flottform_file_input_host.html create mode 100644 flottform/forms/docs/modules/flottform_text_input_client.html create mode 100644 flottform/forms/docs/modules/flottform_text_input_host.html create mode 100644 flottform/forms/typedoc.json diff --git a/flottform/forms/docs/.nojekyll b/flottform/forms/docs/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/flottform/forms/docs/.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/flottform/forms/docs/assets/highlight.css b/flottform/forms/docs/assets/highlight.css new file mode 100644 index 0000000..0101a7c --- /dev/null +++ b/flottform/forms/docs/assets/highlight.css @@ -0,0 +1,57 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #0000FF; + --dark-hl-3: #569CD6; + --light-hl-4: #098658; + --dark-hl-4: #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); + --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); + --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); + --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); + --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); } +pre, code { background: var(--code-background); } diff --git a/flottform/forms/docs/assets/icons.js b/flottform/forms/docs/assets/icons.js new file mode 100644 index 0000000..e88e8ca --- /dev/null +++ b/flottform/forms/docs/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 = `""`; + 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/flottform/forms/docs/assets/icons.svg b/flottform/forms/docs/assets/icons.svg new file mode 100644 index 0000000..e371b8b --- /dev/null +++ b/flottform/forms/docs/assets/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/flottform/forms/docs/assets/main.js b/flottform/forms/docs/assets/main.js new file mode 100644 index 0000000..21a5d74 --- /dev/null +++ b/flottform/forms/docs/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 e.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/flottform/forms/docs/assets/navigation.js b/flottform/forms/docs/assets/navigation.js new file mode 100644 index 0000000..4628b11 --- /dev/null +++ b/flottform/forms/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE6WRvQqDMBhF3yWzttSpuArS7t1ERDSS0JiIiVAovnuNtuJPNDEdlXu/k8uJ3kDAlwA+KAgTomB16WYopRQSNyMYUgEcUKUCdYmS5Q2B/Dwmk28yGZInJErSxZ+Y5sD3HJAhTPIaUuBHIyb8lYOhGywgGUk534OoD8zZF+/axq2zsw0xbrRM5qx23WaA7VU9QFU2XVRgAl1Mq0YYCJPhpA9bOQu7+l229dbWpK0rFkN19ibw4wLH5+kULinqC6bz5A9jjzL8h8dH923ocU3aumIxVOdxAj/ucXyezuOSor6gmhd/APC1BKM/BQAA" \ No newline at end of file diff --git a/flottform/forms/docs/assets/search.js b/flottform/forms/docs/assets/search.js new file mode 100644 index 0000000..06257fd --- /dev/null +++ b/flottform/forms/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE72bXW/bNhSG/4t6q7g6h6Rs57ZDsQLbxbBhN0EQGLbSGPVHZivbgCD/fZREW6QPaX5I3k1VpTovX1KPzyvK6Xt22P9zzO4f3rMf690qu8c82y22VXafPW/2df28P2zvli+L3a7a3C0362pXZ3n2dtjIC7b71dumOn4+X/ikLnzqLpy81NuNvHq5WRyPlRwkyz7y0ziAs/NIX08CX7r6L+Y4qt49jr3eMnyevS4OjfSV2fUWBfSLsdzvjvXhbVnvD6P4+mQKxnl0CGvWseD98h7rxWGc1fx0krqp3+Vmf6xGWmUlddv1rXarnxb1YqQl7tVuu8qL3e9yqF/3h2o881T0pnPY78ax3er0Tuvj6m59vFvvXqrDuq5Wt3D+/DyS9Vbof/VebdcjtROldHP3VzLtZX8MSbTmsuQ8+1kfw71g7Ri22tgka+c0Ro5dd5SYYU7RofnlcRubXdE+Q3PLt6qRmRXtM6hrekwO6pjxjoO6pc/yoE4Z7TmwS3pMD+yQQa4t3fF5vankGK9vtf+hv7n2qb02+bn/q5T41ih4n/zpYC6R0KZJpzqkc0b6i2yhxKtTPbWXxvoPbarDnfu6a/TKB7bZEdZcPhE3lx7HXHdN8/YzuJoYsdaTomOEOVzNkOhJJIXJ8Fl4UiV2GonxkjaP6znjeRDXZpb2LH425nkavxzILpCQLoOfyiOcpefKFeURMsXrOyFPEhxHZIl/peNzJMHx96r+Zb37MZLnXu3mrn87fNmvxlprXe+2zkMTz2t5aNqleA9NOr/5oSmX4D484bz2h6dboH9LstXVv3XoDqq5duAO6g8pEbaDooO5REIzjk51SMpF+otMOuLVqZ6adrH+QxNvuHNf6kWvfGDyjbDmcrfTXDrmsveSt/d/NU1inSclyghzuJoq0ZNISpbhs/CkS+w0EhMmbR7XU8azf9JmlrZ/Ohvz7J8uB7ILJGTL4P1ThLP0VLmiPEKieH0npEmC44gk8a90fIokOPbvn2I8h++fBrv27p8ifQfvn4Y5D008r+WhaZfiPTTp/OaHplyC+/CE89ofnm5X/T/mmbRf/Zvdv2d/V4fjWt7r+wwnbDKXws/rarNqfjOtm5i0sd9uu63Nar98a//6qC77s2oadXNxd/XnIssfihz4pODzHHIsJsgwxxxmk0KIx8f84STXXtr+4KTa/6SVAnnGcl5MCmBGIZBCMApRnvEc2WQ240YhkkI0Cpk8E7ZCRgqZUcjlWWkr5KSQG4VCnk1tcxSkUBiFpTyb2QpLUlgahVN5NrdZnZLCqVE4k2dQ2CpnpHJmVM6bSrBVzknl3ETAjhNYeQIKFFwQ1XACdqYsUJlUgRMroFyBCRY4yQKKFphsgRMuoHSBiRcI190GChiYhEHpvOFAIQOTMpg67zlQ0MAkDWbdXYdJKaDpHXwynzaHHMrJdDrLQeTAJiVeCFMOwQQRWhJL6/2nKILJIhbOtkLBQxM8BNf9R8odXnQzdN1/tPQzkztsUAJrg0EKHprgIXfBgxQ8NMFD4YQHKXlokoelEx6k5KFJHk51eCCYHqRYooklth3Q2nSRoocmejh30kPJQ5M8VjhziZLHTPIYuOhhlDxmkscamGCeMz5h84tiih67yNIGJiysxZY4NdFjTvQYRY+Z6DE3eoyix0z0mBs9RtFjJnrMQK8n78RbjqAYNIUpecwkjzUsIdrIY5Q8ZpLHnOQxSh4zyeNO8jglj5vkcSd5nJLHTfJ4wxJag5pT8rhJHmcueDgFj188yHEnPNzyLGeSx4UTHk7J4yZ5vHT0LQ89nGLJTSx5A5Osty0mRY+b6PGZix5OyeMmeXzupIeSx03yROGiR1DyhEmeAGffEhQ9YaIn0Nm3BEVPmOgJJ3qCoidM9IQbPUHRExf7CDd6wrKV6H7UbgPl/k/uJ79120G5i1suds0b+u3+UK3a/0jwnj2pzeJ5q/uelfKPj49+ayjPtN1h82+the7XHnUN6DWKrgqKMC319VovhVRq1h1l+wyTbF+A9Yplr8iVojrK56pOGbojV0cRaF5/qdmPx/vxlD6oI6oZySeBblx15LOg8br3B9qqa8uulGCqRijVCOoo21I3MxE0UvOVrTGSNqfT7cCw23F+j6HrFQ5e8gv1002XEwhj8zyagpTyxbSZJEl2Xwxoa6MrRko269y+2aE+QcMW5omyxKv2Yccw6M6izWsoh1fUPrQsVfbSK2rM8TDWvlf1pn2PrM14rllTH0MRdpek2l+HZft2V3OloSsfbzs9DNIjN0NbtRP+GId7u3CGpnB9UKM/Su3LVk1Zm7gSBtVcUDUXpo5ctVfBwwba6eNo90v5BSWLSpapIz8tPwsapsm/y+yb9oOFNcZG5Ln7PWFtaTQZDDdTt1+Xa2hpjYSHIaW+nuo1tNuvVgfUEVW2MUUaPx3Degsxq2VPDFjy6eR1/VrJj6ksfXj8+PgPAwWJqDI9AAA="; \ No newline at end of file diff --git a/flottform/forms/docs/assets/style.css b/flottform/forms/docs/assets/style.css new file mode 100644 index 0000000..9d619a6 --- /dev/null +++ b/flottform/forms/docs/assets/style.css @@ -0,0 +1,1448 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --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: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --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: var(--light-color-ts-property); + --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-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --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: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --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: var(--dark-color-ts-property); + --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-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-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --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-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-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-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --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-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-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --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-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-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --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-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; + 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-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.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-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-literal { + color: var(--color-ts-type-literal); +} +.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 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html b/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html new file mode 100644 index 0000000..66390a9 --- /dev/null +++ b/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html @@ -0,0 +1,32 @@ +FlottformChannelClient | @flottform/forms - v0.0.1

A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). +It handles ICE candidate gathering and sending/receiving data. +The connection is initiated only when start method is called.

+

This class emits various events during the connection lifecycle, such as connected, disconnected, and error, allowing you to respond to changes in the connection state.

+

init - Emitted when the client is initialized.

+

retrieving-info-from-endpoint - Emitted when information is being retrieved from the endpoint.

+

sending-client-info - Emitted when client information is being sent to the host.

+

connecting-to-host - Emitted when attempting to connect to the host.

+

connected - Emitted when the connection is successfully established.

+

connection-impossible - Emitted if the connection to the host cannot be established.

+

done - Emitted when the all of the data is received.

+

disconnected - Emitted when the connection is closed.

+

error - Emitted when there is an error during the connection.

+

bufferedamountlow - Emitted when the buffered amount for data channels is low.

+

Hierarchy

  • EventEmitter<Listeners>
    • FlottformChannelClient

Constructors

  • Creates an instance of FlottformChannelClient

    +

    Parameters

    • __namedParameters: {
          endpointId: string;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }
      • endpointId: string
      • flottformApi: string
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration

    Returns FlottformChannelClient

Methods

  • Determines if more data can be sent based on the WebRTC data channel's buffered amount. This is useful when dealing with large amounts of data.

    +

    Returns null | boolean

    true if more data can be sent, otherwise false.

    +
  • Closes the WebRTC connection if it is currently established.

    +

    Returns void

    disconnected - Emitted when the connection is successfully closed.

    +
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Sends data to the connected peer via the WebRTC data channel.

    +

    Parameters

    • data: any

      The data to send to the peer.

      +

    Returns void

    error - Emits the state error if the connection is not established.

    +
  • Starts the WebRTC connection process. The connection is not established until this method is called.

    +

    Returns Promise<void>

diff --git a/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html b/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html new file mode 100644 index 0000000..5c7dad5 --- /dev/null +++ b/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html @@ -0,0 +1,25 @@ +FlottformChannelHost | @flottform/forms - v0.0.1

A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). +It handles ICE candidate gathering and sending/receiving data. +The connection is initiated only when start method is called.

+

This class emits various events throughout the connection lifecycle such as connected, disconnected, and error, allowing you to respond to the connection state changes.

+

new - Emitted when the host is created and ready to accept clients.

+

waiting-for-client - Emitted when waiting for a client to connect.

+

waiting-for-data - Emitted when the host is ready to receive data.

+

waiting-for-ice - Emitted when ICE candidates are being gathered.

+

receiving-data - Emitted when the host is receiving data from the client.

+

file-received - Emitted when a complete file has been received.

+

done - Emitted when the transfer is complete.

+

error - Emitted when an error occurs during connection or data transfer.

+

connected - Emitted when the host successfully connects to a client.

+

disconnected - Emitted when the connection is closed.

+

Hierarchy

  • EventEmitter<FlottformEventMap>
    • FlottformChannelHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformChannelHost

    +

    Parameters

    • __namedParameters: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          logger: Logger;
          pollTimeForIceInMs: number;
          rtcConfiguration: RTCConfiguration;
      }
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL
      • logger: Logger
      • pollTimeForIceInMs: number
      • rtcConfiguration: RTCConfiguration

    Returns FlottformChannelHost

Methods

  • Closes the WebRTC connection if it is currently established.

    +

    Returns void

    disconnected - Emitted when the connection is successfully closed.

    +
  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • Rest...args: FlottformEventMap[K]

    Returns void

  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • listener: Listener<FlottformEventMap[K]>

    Returns void

  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • listener: Listener<FlottformEventMap[K]>

    Returns void

  • Starts the WebRTC connection process for the host. The connection is not established until this method is called.

    +

    Returns Promise<void>

diff --git a/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html b/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html new file mode 100644 index 0000000..134cf7c --- /dev/null +++ b/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html @@ -0,0 +1,21 @@ +FlottformFileInputClient | @flottform/forms - v0.0.1

The FlottformFileInputClient uses the FlottformChannelClient to manage the WebRTC connection and handle the transfer of large files to a peer. +It listens to various events emitted by FlottformChannelClient to implement the file sending process.

+

connected - Emitted when the connection is successfully established.

+

webrtc:connection-impossible - Emitted if the connection to the host cannot be established.

+

done - Emitted when the all of the data is sent.

+

disconnected - Emitted when the connection is closed.

+

error - Emitted when there is an error during the connection.

+

Hierarchy

  • EventEmitter<Listeners>
    • FlottformFileInputClient

Constructors

Methods

Constructors

  • Creates an instance of FlottformFileInputClient.

    +

    Parameters

    • __namedParameters: {
          endpointId: string;
          fileInput: HTMLInputElement;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }
      • endpointId: string
      • fileInput: HTMLInputElement
      • flottformApi: string
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration

    Returns FlottformFileInputClient

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelClient.

    +

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the process of sending files over the WebRTC connection. +This method prepares the files, creates metadata, and begins the file transfer.

    +

    Returns Promise<void>

    Will throw an error if the metadata or file data is unavailable.

    +
  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelClient.

    +

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html b/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html new file mode 100644 index 0000000..abd0035 --- /dev/null +++ b/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html @@ -0,0 +1,29 @@ +FlottformFileInputHost | @flottform/forms - v0.0.1

The FlottformFileInputHost class uses the FlottformChannelHost to manage the WebRTC connection and handle the reception of large files from a peer.

+

It listens to various events emitted by FlottformChannelHost to implement the file transfer process.

+

new - Emitted when the host is created and ready to accept clients.

+

webrtc:waiting-for-client - Emitted when waiting for a client to connect.

+

webrtc:waiting-for-ice - Emitted when ICE candidates are being gathered.

+

webrtc:waiting-for-ice - Emitted when host is ready to receive the file(s).

+

done - Emitted when the transfer is complete.

+

error - Emitted when an error occurs during connection or data transfer.

+

connected - Emitted when the host successfully connects to a client.

+

disconnected - Emitted when the connection is closed.

+

receive - Emitted to signal the start of receiving the file(s).

+

progress - Emitted to signal the progress of receiving the file(s).

+

endpoint-created - Emitted when the endpoint for a new potential connection is created.

+

Hierarchy

  • EventEmitter<Listeners>
    • FlottformFileInputHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformFileInputHost.

    +

    Parameters

    • __namedParameters: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          inputField: HTMLInputElement;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
          styles?: Styles;
          theme?: ((myself: FlottformFileInputHost) => void);
      }
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL
      • inputField: HTMLInputElement
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration
      • Optionalstyles?: Styles
      • Optionaltheme?: ((myself: FlottformFileInputHost) => void)

    Returns FlottformFileInputHost

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelHost.

    +

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Retrieves the connection link (URL) used for establishing a peer connection.

    +

    Returns string

    The link for the peer connection.

    +
  • Retrieves the QR code used for establishing a peer connection.

    +

    Returns string

    The QR code for the peer connection.

    +
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelHost.

    +

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html b/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html new file mode 100644 index 0000000..0a6e47b --- /dev/null +++ b/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html @@ -0,0 +1,24 @@ +FlottformTextInputClient | @flottform/forms - v0.0.1

The FlottformTextInputClient uses the FlottformChannelClient to establish a WebRTC connection and send text data to a peer. +It listens to various events emitted by FlottformChannelClient to manage connection states and the sending process.

+

Hierarchy

  • EventEmitter<Listeners>
    • FlottformTextInputClient

Constructors

Methods

Constructors

  • Creates an instance of FlottformTextInputClient.

    +

    Parameters

    • config: {
          endpointId: string;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }

      The configuration for setting up the text input client.

      +
      • endpointId: string

        The unique ID for the WebRTC endpoint.

        +
      • flottformApi: string

        The API URL for retrieving connection information.

        +
      • Optionallogger?: Logger

        Logger for capturing logs and errors.

        +
      • OptionalpollTimeForIceInMs?: number

        The polling time for ICE candidates in milliseconds.

        +
      • OptionalrtcConfiguration?: RTCConfiguration

        WebRTC configuration settings.

        +

    Returns FlottformTextInputClient

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelClient.

    +

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Sends the provided text over the WebRTC connection. +The text is sent as a single chunk since most texts will not exceed 16 KB in size.

    +

    Parameters

    • text: string

      The text data to be sent.

      +

    Returns void

    sending - Emitted when the text starts to be sent.

    +

    done - Emitted when the text sending process is completed.

    +
  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelClient.

    +

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html b/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html new file mode 100644 index 0000000..e4bfc25 --- /dev/null +++ b/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html @@ -0,0 +1,25 @@ +FlottformTextInputHost | @flottform/forms - v0.0.1

The FlottformTextInputHost manages the server side (host) of the WebRTC connection, listening for client connections and receiving text data +It uses the FlottformChannelHost to establish and maintain the WebRTC connection.

+

Hierarchy

  • EventEmitter<Listeners>
    • FlottformTextInputHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformTextInputHost.

    +

    Parameters

    • config: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
          theme?: ((myself: FlottformTextInputHost) => void);
      }

      The configuration for setting up the text input host.

      +
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)

        A function to create the client URL with an endpoint ID.

        +
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL

        The API URL for retrieving connection information.

        +
      • Optionallogger?: Logger

        Logger for capturing logs and errors.

        +
      • OptionalpollTimeForIceInMs?: number

        The polling time for ICE candidates in milliseconds.

        +
      • OptionalrtcConfiguration?: RTCConfiguration

        WebRTC configuration settings.

        +
      • Optionaltheme?: ((myself: FlottformTextInputHost) => void)

        Optional theme customization function.

        +

    Returns FlottformTextInputHost

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelHost.

    +

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Retrieves the link (URL) for the client to connect to the WebRTC host.

    +

    Returns string

    The link for the client to connect. If the link is unavailable, an error is logged.

    +
  • Retrieves the QR code data for the client to scan and connect to the WebRTC host.

    +

    Returns string

    The QR code data for client connection. If the QR code is unavailable, an error is logged.

    +
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelHost.

    +

    Returns void

diff --git a/flottform/forms/docs/index.html b/flottform/forms/docs/index.html new file mode 100644 index 0000000..1e91194 --- /dev/null +++ b/flottform/forms/docs/index.html @@ -0,0 +1,70 @@ +@flottform/forms - v0.0.1

@flottform/forms - v0.0.1

flottform

A better UX for file uploads #build-in-public

+

Why no license (yet)? We want to share our progress, but we are not sure about the business model. We allow you to see our theories and learn from how we build it, but it's not allowed to use the produced code (yet). Please wait for the next updates for more information about how we want to handle this. If you have questions or feedback, feel free to reach out to us through our GitHub discussions board.

+

We are about to explore ideas how we can solve the issue we described in detail about UX challenges in web forms if you have a file on another device.

+
    +
  • [x] Build a server that allows file uploads from a form +
      +
    • [x] Build a server that accepts files
    • +
    • [x] Build a web form with an input field for files
    • +
    +
  • +
  • [ ] Let device A create a URL that allows connecting another device through WebRTC +
      +
    • [ ] Allow only one connection per URL
    • +
    • [ ] Establish a WebRTC connection between devices
    • +
    • [ ] Have an upload field on that URL for device B
    • +
    • [ ] Uploading to that URL populates the file field on device A
    • +
    +
  • +
+
    +
  • [ ] Make it easier to use by creating QR codes
  • +
  • [ ] Make it possible for form developers to add our feature with a single script
  • +
  • [ ] Find a business model that works for everybody
  • +
  • [ ] Find a license that fits our needs
  • +
  • [ ] Create a logo
  • +
  • [ ] Build a website
  • +
+

These are the necessary steps to update the code on the remote server to the latest version.

+
    +
  1. Connect to the remote server:
  2. +
+
ssh <email@remote.server>
+
+ +
    +
  1. Navigate to the Target Repository:
  2. +
+
cd /path/to/your/repository/in/remote/server
+
+ +
    +
  1. Check the Current Branch Used for Production:
  2. +
+
git status
+
+ +

Ensure you are on the correct branch used for production. If not, switch to the appropriate branch:

+
git checkout <production-branch>
+
+ +
    +
  1. Fetch all of the new changes:
  2. +
+
git fetch --all
+
+ +
    +
  1. [Optional] Update the Environment Variables:
  2. +
+

If there are changes required in the environment variables, update the .env file accordingly.

+
nano .env
+
+ +
    +
  1. Stop & re-run the containers:
  2. +
+
docker compose down && git pull && docker compose build && docker compose up -d && docker volume prune —-filter all=1 —-force && docker compose logs -f
+
+ +
diff --git a/flottform/forms/docs/modules/flottform_channel_client.html b/flottform/forms/docs/modules/flottform_channel_client.html new file mode 100644 index 0000000..ff28c58 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_channel_client.html @@ -0,0 +1,2 @@ +flottform-channel-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_channel_host.html b/flottform/forms/docs/modules/flottform_channel_host.html new file mode 100644 index 0000000..a27dc26 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_channel_host.html @@ -0,0 +1,2 @@ +flottform-channel-host | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_file_input_client.html b/flottform/forms/docs/modules/flottform_file_input_client.html new file mode 100644 index 0000000..9c08173 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_file_input_client.html @@ -0,0 +1,2 @@ +flottform-file-input-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_file_input_host.html b/flottform/forms/docs/modules/flottform_file_input_host.html new file mode 100644 index 0000000..1cca652 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_file_input_host.html @@ -0,0 +1,2 @@ +flottform-file-input-host | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_text_input_client.html b/flottform/forms/docs/modules/flottform_text_input_client.html new file mode 100644 index 0000000..921be71 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_text_input_client.html @@ -0,0 +1,2 @@ +flottform-text-input-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_text_input_host.html b/flottform/forms/docs/modules/flottform_text_input_host.html new file mode 100644 index 0000000..04f04e2 --- /dev/null +++ b/flottform/forms/docs/modules/flottform_text_input_host.html @@ -0,0 +1,2 @@ +flottform-text-input-host | @flottform/forms - v0.0.1
diff --git a/flottform/forms/package.json b/flottform/forms/package.json index 9bd99c8..e155b91 100644 --- a/flottform/forms/package.json +++ b/flottform/forms/package.json @@ -31,12 +31,15 @@ "lint": "prettier --check . && eslint .", "format": "prettier --write .", "test": "pnpm run test:unit", - "test:unit": "vitest" + "test:unit": "vitest", + "docs": "typedoc --options typedoc.json" }, "devDependencies": { "@types/qrcode": "^1.5.5", "@vitest/browser": "^1.3.1", + "eslint-plugin-tsdoc": "^0.3.0", "qrcode": "^1.5.3", + "typedoc": "^0.26.7", "vite": "^5.0.3", "vite-plugin-dts": "^3.7.3", "vitest": "^1.3.1", diff --git a/flottform/forms/src/flottform-channel-client.ts b/flottform/forms/src/flottform-channel-client.ts index 0c53a13..08b7f86 100644 --- a/flottform/forms/src/flottform-channel-client.ts +++ b/flottform/forms/src/flottform-channel-client.ts @@ -21,7 +21,26 @@ type Listeners = { error: [e: string]; bufferedamountlow: []; }; - +/** + * A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). + * It handles ICE candidate gathering and sending/receiving data. + * The connection is initiated only when `start` method is called. + * + * This class emits various events during the connection lifecycle, such as `connected`, `disconnected`, and `error`, allowing you to respond to changes in the connection state. + * + * @fires init - Emitted when the client is initialized. + * @fires retrieving-info-from-endpoint - Emitted when information is being retrieved from the endpoint. + * @fires sending-client-info - Emitted when client information is being sent to the host. + * @fires connecting-to-host - Emitted when attempting to connect to the host. + * @fires connected - Emitted when the connection is successfully established. + * @fires connection-impossible - Emitted if the connection to the host cannot be established. + * @fires done - Emitted when the all of the data is received. + * @fires disconnected - Emitted when the connection is closed. + * @fires error - Emitted when there is an error during the connection. + * @fires bufferedamountlow - Emitted when the buffered amount for data channels is low. + * + * @extends EventEmitter + */ export class FlottformChannelClient extends EventEmitter { private flottformApi: string; private endpointId: string; @@ -34,7 +53,17 @@ export class FlottformChannelClient extends EventEmitter { private dataChannel: RTCDataChannel | null = null; private pollForIceTimer: NodeJS.Timeout | number | null = null; private BUFFER_THRESHOLD = 128 * 1024; // 128KB buffer threshold (maximum of 4 chunks in the buffer waiting to be sent over the network) - + /** + * Creates an instance of FlottformChannelClient + * + * @param {Object} config - The configuration for setting up the channel for the host. + * + * @param {endpointId} - The unique identifier of the endpoint to connect to. + * @param {flottformApi} - The API endpoint for retrieving connection information. + * @param {rtcConfiguration} - Optional RTC configuration for WebRTC connection. + * @param {pollTimeForIceInMs} - Optional time in milliseconds for polling ICE candidates. + * @param {logger} - Optional logger for logging connection events (default: `console`). + */ constructor({ endpointId, flottformApi, @@ -55,13 +84,22 @@ export class FlottformChannelClient extends EventEmitter { this.pollTimeForIceInMs = pollTimeForIceInMs; this.logger = logger; } + /** + * Changes the state of the client and emits the corresponding event. + * + * @param newState - The new state to transition to. + * @param details - Optional additional details to emit with the event. + */ private changeState = (newState: ClientState, details?: any) => { this.state = newState; this.emit(newState, details); this.logger.info(`**Client State changed to: ${newState}`, details == undefined ? '' : details); }; - + /** + * Starts the WebRTC connection process. The connection is not established until this method is called. + * + */ start = async () => { if (this.openPeerConnection) { this.close(); @@ -102,6 +140,11 @@ export class FlottformChannelClient extends EventEmitter { this.startPollingForIceCandidates(getEndpointInfoUrl); }; + /** + * Closes the WebRTC connection if it is currently established. + * + * @fires disconnected - Emitted when the connection is successfully closed. + */ close = () => { if (this.openPeerConnection) { this.openPeerConnection.close(); @@ -109,7 +152,12 @@ export class FlottformChannelClient extends EventEmitter { } this.changeState('disconnected'); }; - + /** + * Sends data to the connected peer via the WebRTC data channel. + * + * @param data - The data to send to the peer. + * @fires error - Emits the state error if the connection is not established. + */ sendData = (data: any) => { if (this.dataChannel == null) { this.changeState('error', 'dataChannel is null. Unable to send the file to the Host!'); @@ -120,14 +168,25 @@ export class FlottformChannelClient extends EventEmitter { } this.dataChannel.send(data); }; - + /** + * Determines if more data can be sent based on the WebRTC data channel's buffered amount. This is useful when dealing with large amounts of data. + * + * @returns `true` if more data can be sent, otherwise `false`. + */ canSendMoreData = () => { return ( this.dataChannel && this.dataChannel.bufferedAmount < this.dataChannel.bufferedAmountLowThreshold ); }; - + /** + * Sets up event listeners for ICE candidate gathering and sends the gathered candidates to the peer. + * + * @param putClientInfoUrl - The URL where client information should be sent. + * @param clientKey - The client's unique key used for identification. + * @param clientIceCandidates - A set of ICE candidates gathered by the client. + * @param session - The RTC session description used for connection setup. + */ private setUpClientIceGathering = ( putClientInfoUrl: string, clientKey: string, @@ -154,6 +213,7 @@ export class FlottformChannelClient extends EventEmitter { } } }; + // @ts-ignore: Unused variable this.openPeerConnection.onicegatheringstatechange = async (e) => { this.logger.info(`onicegatheringstatechange - ${this.openPeerConnection!.iceGatheringState}`); }; @@ -161,6 +221,11 @@ export class FlottformChannelClient extends EventEmitter { this.logger.error(`onicecandidateerror - ${this.openPeerConnection!.connectionState}`, e); }; }; + /** + * Periodically retrieves ICE candidates from the host to complete the WebRTC connection. + * + * @param getEndpointInfoUrl - The URL for retrieving host's ICE candidate information. + */ private setUpConnectionStateGathering = (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState( @@ -187,7 +252,7 @@ export class FlottformChannelClient extends EventEmitter { } } }; - + // @ts-ignore: Unused variable this.openPeerConnection.oniceconnectionstatechange = (e) => { this.logger.info( `oniceconnectionstatechange - ${this.openPeerConnection!.iceConnectionState}` @@ -198,12 +263,21 @@ export class FlottformChannelClient extends EventEmitter { } }; }; + /** + * Stops polling for ICE candidates. + */ private stopPollingForIceCandidates = async () => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); } this.pollForIceTimer = null; }; + + /** + * Starts polling for ICE candidates from the host. + * + * @param getEndpointInfoUrl - The URL to use for polling the ICE candidates. + */ private startPollingForIceCandidates = async (getEndpointInfoUrl: string) => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -213,6 +287,12 @@ export class FlottformChannelClient extends EventEmitter { this.pollForIceTimer = setTimeout(this.startPollingForIceCandidates, this.pollTimeForIceInMs); }; + + /** + * Polls for the WebRTC connection state and ICE candidates from the host. + * + * @param getEndpointInfoUrl - The URL for retrieving connection and candidate information. + */ private pollForConnection = async (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState('error', "openPeerConnection is null. Unable to retrieve Host's details"); @@ -225,6 +305,16 @@ export class FlottformChannelClient extends EventEmitter { await this.openPeerConnection.addIceCandidate(iceCandidate); } }; + + /** + * Sends client information, including ICE candidates, to a remote server where the host can retrieve it. + * + * + * @param putClientInfoUrl - The URL where client information should be sent. + * @param clientKey - The client's unique key for identification. + * @param clientIceCandidates - A set of ICE candidates gathered by the client. + * @param session - The RTC session description used for connection setup. + */ private putClientInfo = async ( putClientInfoUrl: string, clientKey: string, diff --git a/flottform/forms/src/flottform-channel-host.ts b/flottform/forms/src/flottform-channel-host.ts index 4f5179c..583a0e6 100644 --- a/flottform/forms/src/flottform-channel-host.ts +++ b/flottform/forms/src/flottform-channel-host.ts @@ -7,7 +7,26 @@ import { retrieveEndpointInfo, setIncludes } from './internal'; - +/** + * A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). + * It handles ICE candidate gathering and sending/receiving data. + * The connection is initiated only when `start` method is called. + * + * This class emits various events throughout the connection lifecycle such as `connected`, `disconnected`, and `error`, allowing you to respond to the connection state changes. + * + * @fires new - Emitted when the host is created and ready to accept clients. + * @fires waiting-for-client - Emitted when waiting for a client to connect. + * @fires waiting-for-data - Emitted when the host is ready to receive data. + * @fires waiting-for-ice - Emitted when ICE candidates are being gathered. + * @fires receiving-data - Emitted when the host is receiving data from the client. + * @fires file-received - Emitted when a complete file has been received. + * @fires done - Emitted when the transfer is complete. + * @fires error - Emitted when an error occurs during connection or data transfer. + * @fires connected - Emitted when the host successfully connects to a client. + * @fires disconnected - Emitted when the connection is closed. + * + * @extends EventEmitter + */ export class FlottformChannelHost extends EventEmitter { private flottformApi: string | URL; private createClientUrl: (params: { endpointId: string }) => Promise; @@ -21,6 +40,16 @@ export class FlottformChannelHost extends EventEmitter { private dataChannel: RTCDataChannel | null = null; private pollForIceTimer: NodeJS.Timeout | number | null = null; + /** + * Creates an instance of FlottformChannelHost + * + * @param {Object} config - The configuration for setting up the channel for the host. + * @param {flottformApi} - The API endpoint for retrieving connection information. + * @param {createClientUrl} - A function that generates the client URL given an endpoint ID. + * @param {rtcConfiguration} - The RTC configuration for the WebRTC connection. + * @param {pollTimeForIceInMs} - The time interval (in ms) for polling ICE candidates. + * @param {logger} - Optional logger for logging connection events. + */ constructor({ flottformApi, createClientUrl, @@ -44,13 +73,21 @@ export class FlottformChannelHost extends EventEmitter { this.changeState('new', { channel: this }); }); } - + /** + * Changes the state of the host and emits the corresponding event. + * + * @param newState - The new state to transition to. + * @param details - Optional additional details to emit with the event. + */ private changeState = (newState: FlottformState | 'disconnected', details?: any) => { this.state = newState; this.emit(newState, details); this.logger.info(`State changed to: ${newState}`, details == undefined ? '' : details); }; + /** + * Starts the WebRTC connection process for the host. The connection is not established until this method is called. + */ start = async () => { if (this.openPeerConnection) { this.close(); @@ -92,6 +129,11 @@ export class FlottformChannelHost extends EventEmitter { this.setupDataChannelListener(); }; + /** + * Closes the WebRTC connection if it is currently established. + * + * @fires disconnected - Emitted when the connection is successfully closed. + */ close = () => { if (this.openPeerConnection) { this.openPeerConnection.close(); @@ -100,6 +142,12 @@ export class FlottformChannelHost extends EventEmitter { this.changeState('disconnected'); }; + /** + * Sets up the WebRTC data channel listener to handle incoming data from the client. + * + * @fires error - Emitted when the data channel is not set up yet. + * @fires receiving-data - Emitted when data is received from the client. + */ private setupDataChannelListener = () => { if (this.dataChannel == null) { this.changeState( @@ -115,6 +163,16 @@ export class FlottformChannelHost extends EventEmitter { }; }; + /** + * Sets up the ICE candidate gathering process and sends the gathered candidates to the client peer. + * + * @param putHostInfoUrl - The URL where the host's information should be sent. + * @param hostKey - The host's unique key used for identification. + * @param hostIceCandidates - A set of ICE candidates gathered by the host. + * @param session - The RTC session description used for connection setup. + * + * @fires error - Emitted when the connection channel is not setup yet. + */ private setupHostIceGathering = ( putHostInfoUrl: string, hostKey: string, @@ -150,6 +208,13 @@ export class FlottformChannelHost extends EventEmitter { }; }; + /** + * Sets up a process to periodically retrieve the connection state and ICE candidates from the client. + * + * @param getEndpointInfoUrl - The URL for retrieving ICE candidate information from the client. + * + * @fires error - Emitted when the connection channel is: not setup yet, connection establishment failed or impossible. + */ private setUpConnectionStateGathering = (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState( @@ -186,6 +251,9 @@ export class FlottformChannelHost extends EventEmitter { }; }; + /** + * Stops polling for a connection or ICE candidates. + */ private stopPollingForConnection = async () => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -193,6 +261,11 @@ export class FlottformChannelHost extends EventEmitter { this.pollForIceTimer = null; }; + /** + * Starts polling for a connection and ICE candidates from the client. + * + * @param getEndpointInfoUrl - The URL to use for polling the ICE candidates. + */ private startPollingForConnection = async (getEndpointInfoUrl: string) => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -205,6 +278,12 @@ export class FlottformChannelHost extends EventEmitter { }, this.pollTimeForIceInMs); }; + /** + * Creates an endpoint on the server where the client can retrieve the host's connection information. + * + * @param baseApi - The base API URL for the host's information. + * @param session - The RTC session description used for connection setup. + */ private createEndpoint = async (baseApi: string, session: RTCSessionDescriptionInit) => { const response = await fetch(`${baseApi}/create`, { method: 'POST', @@ -218,6 +297,14 @@ export class FlottformChannelHost extends EventEmitter { return response.json(); }; + /** + * Polls the client for connection state and ICE candidates to complete the WebRTC connection. + * + * @param getEndpointInfoUrl - The URL for retrieving connection and candidate information. + * + * @fires error - Emitted when the connection channel is not setup yet. + * @fires waiting-for-ice - Emitted when the host finds a client to connect to. + */ private pollForConnection = async (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState('error', "openPeerConnection is null. Unable to retrieve Client's details"); @@ -238,17 +325,23 @@ export class FlottformChannelHost extends EventEmitter { } }; + /** + * Sets up the data channel for transferring files and other large data types. + * + * @fires error - Emitted when the data channel is not setup yet. + * @fires waiting-for-data - Emitted when the data channel is opened. + */ private setupDataChannelForTransfer = () => { if (this.dataChannel === null) { this.changeState('error', 'dataChannel is null. Unable to setup a Data Channel'); return; } - + // @ts-ignore: Unused variable this.dataChannel.onopen = (e) => { this.logger.log('data channel opened'); this.changeState('waiting-for-data'); }; - + // @ts-ignore: Unused variable this.dataChannel.onclose = (e) => { this.logger.log('data channel closed'); }; @@ -259,6 +352,11 @@ export class FlottformChannelHost extends EventEmitter { }; }; + /** + * Creates the WebRTC data channel for communication with the client peer. + * + * @fires error - Emitted when the data channel is not setup yet. + */ private createDataChannel = () => { if (this.openPeerConnection === null) { this.changeState('error', 'openPeerConnection is null. Unable to create a new Data Channel'); @@ -270,6 +368,17 @@ export class FlottformChannelHost extends EventEmitter { return this.openPeerConnection.createDataChannel(channelName); }; + /** + * Sends host information, including ICE candidates, to a remote server where the client can access it. + * + * @param putHostInfoUrl - The URL where the host's information should be sent. + * @param hostKey - The host's unique key for identification. + * @param hostIceCandidates - A set of ICE candidates gathered by the host. + * @param session - The RTC session description used for connection setup. + * + * @throws Will throw an error if it wasn't able to update the host's info + * @fires error if some error happens during the process of saving the host's info to the server. + */ private putHostInfo = async ( putHostInfoUrl: string, hostKey: string, diff --git a/flottform/forms/src/flottform-file-input-client.ts b/flottform/forms/src/flottform-file-input-client.ts index 4db14ff..7731035 100644 --- a/flottform/forms/src/flottform-file-input-client.ts +++ b/flottform/forms/src/flottform-file-input-client.ts @@ -17,6 +17,18 @@ type MetaData = { totalSize: number; }; +/** + * The `FlottformFileInputClient` uses the `FlottformChannelClient` to manage the WebRTC connection and handle the transfer of large files to a peer. + * It listens to various events emitted by `FlottformChannelClient` to implement the file sending process. + * + * @fires connected - Emitted when the connection is successfully established. + * @fires webrtc:connection-impossible - Emitted if the connection to the host cannot be established. + * @fires done - Emitted when the all of the data is sent. + * @fires disconnected - Emitted when the connection is closed. + * @fires error - Emitted when there is an error during the connection. + * + * @extends EventEmitter + */ export class FlottformFileInputClient extends EventEmitter { private channel: FlottformChannelClient | null = null; private inputField: HTMLInputElement; @@ -26,8 +38,20 @@ export class FlottformFileInputClient extends EventEmitter { private currentFileIndex = 0; private currentChunkIndex = 0; private allFilesSent = false; + // @ts-ignore: Unused variable private logger: Logger; + /** + * Creates an instance of FlottformFileInputClient. + * + * @param {Object} config - The configuration for setting up the file input client. + * @param {string} - The unique ID for the WebRTC endpoint. + * @param {HTMLInputElement} - The input field element where files are selected for transfer. + * @param {string} - The API URL for retrieving connection information. + * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. + * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. + * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. + */ constructor({ endpointId, fileInput, @@ -55,14 +79,28 @@ export class FlottformFileInputClient extends EventEmitter { this.logger = logger; this.registerListeners(); } + + /** + * Starts the WebRTC connection by invoking the `start` method of the underlying `FlottformChannelClient`. + */ start = () => { this.channel?.start(); }; + /** + * Closes the WebRTC connection by invoking the `close` method of the underlying `FlottformChannelClient`. + */ close = () => { this.channel?.close(); }; + /** + * Creates the metadata for the selected files. + * This metadata includes information about each file such as name, type, and size. + * + * @param {HTMLInputElement} inputElement - The input field containing the selected files. + * @returns {MetaData | null} The metadata object or `null` if no files are found. + */ private createMetaData = (inputElement: HTMLInputElement): MetaData | null => { if (!inputElement.files) return null; @@ -80,6 +118,14 @@ export class FlottformFileInputClient extends EventEmitter { }; }; + /** + * Converts the files selected in the input field into an array of ArrayBuffers. + * These ArrayBuffers will be used to send file data over the WebRTC connection. + * + * @private + * @param {HTMLInputElement} inputElement - The input field containing the selected files. + * @returns {Promise} A promise that resolves to an array of file data as ArrayBuffers. + */ private createArrayBuffers = async (inputElement: HTMLInputElement) => { if (!inputElement.files) return null; @@ -88,6 +134,12 @@ export class FlottformFileInputClient extends EventEmitter { return await Promise.all(files.map(async (file) => await file.arrayBuffer())); }; + /** + * Starts the process of sending files over the WebRTC connection. + * This method prepares the files, creates metadata, and begins the file transfer. + * + * @throws Will throw an error if the metadata or file data is unavailable. + */ sendFiles = async () => { const metaData = this.createMetaData(this.inputField); const filesArrayBuffer = await this.createArrayBuffers(this.inputField); @@ -103,10 +155,23 @@ export class FlottformFileInputClient extends EventEmitter { this.startSendingFiles(); }; + /** + * Starts sending the files by sending the first chunk. + * This method initiates the recursive process of sending chunks of data. + * + * @private + */ private startSendingFiles = () => { this.sendNextChunk(); }; + /** + * Sends the next chunk of the current file over the WebRTC connection. + * If the buffer is full, the sending is paused until there is more space. + * If the current file is completely sent, it moves to the next file in the queue. + * + * @private + */ private sendNextChunk = async () => { const totalNumberOfFiles = this.filesMetaData.length; if (this.allFilesSent || this.currentFileIndex >= totalNumberOfFiles) { @@ -157,6 +222,12 @@ export class FlottformFileInputClient extends EventEmitter { } }; + /** + * Registers event listeners for various events emitted by the `FlottformChannelClient`. + * These events include WebRTC connection status and errors. + * + * @private + */ private registerListeners = () => { this.channel?.on('init', () => { // TODO: Implement Default UI. diff --git a/flottform/forms/src/flottform-file-input-host.ts b/flottform/forms/src/flottform-file-input-host.ts index e882d34..b07c691 100644 --- a/flottform/forms/src/flottform-file-input-host.ts +++ b/flottform/forms/src/flottform-file-input-host.ts @@ -23,9 +23,29 @@ type Listeners = { 'webrtc:waiting-for-ice': []; 'webrtc:waiting-for-file': []; }; - +// @ts-ignore: Unused variable const noop = () => {}; +/** + * The `FlottformFileInputHost` class uses the `FlottformChannelHost` to manage the WebRTC connection and handle the reception of large files from a peer. + * + * It listens to various events emitted by `FlottformChannelHost` to implement the file transfer process. + * + * @fires new - Emitted when the host is created and ready to accept clients. + * @fires webrtc:waiting-for-client - Emitted when waiting for a client to connect. + * @fires webrtc:waiting-for-ice - Emitted when ICE candidates are being gathered. + * @fires webrtc:waiting-for-ice - Emitted when host is ready to receive the file(s). + * @fires done - Emitted when the transfer is complete. + * @fires error - Emitted when an error occurs during connection or data transfer. + * @fires connected - Emitted when the host successfully connects to a client. + * @fires disconnected - Emitted when the connection is closed. + * @fires receive - Emitted to signal the start of receiving the file(s). + * @fires progress - Emitted to signal the progress of receiving the file(s). + * @fires endpoint-created - Emitted when the endpoint for a new potential connection is created. + * + * + * @extends EventEmitter + */ export class FlottformFileInputHost extends EventEmitter { private channel: FlottformChannelHost | null = null; private inputField: HTMLInputElement; @@ -41,6 +61,19 @@ export class FlottformFileInputHost extends EventEmitter { private link: string = ''; private qrCode: string = ''; + /** + * Creates an instance of FlottformFileInputHost. + * + * @param {Object} config - The configuration for setting up the file input host. + * @param {string | URL} - The API URL for retrieving connection information. + * @param {(params: { endpointId: string }) => Promise} - A function to generate the client URL given an endpoint ID. + * @param {HTMLInputElement} - The input field element where files will be added. + * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. + * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. + * @param {(host: FlottformFileInputHost) => void} [config.theme] - A function to apply themes or styles. + * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. + * @param {Styles} [config.styles] - Optional styles to be applied. + */ constructor({ flottformApi, createClientUrl, @@ -74,14 +107,25 @@ export class FlottformFileInputHost extends EventEmitter { theme && theme(this); } + /** + * Starts the WebRTC connection by invoking the `start` method of the underlying `FlottformChannelHost`. + */ start = () => { this.channel?.start(); }; + /** + * Closes the WebRTC connection by invoking the `close` method of the underlying `FlottformChannelHost`. + */ close = () => { this.channel?.close(); }; + /** + * Retrieves the connection link (URL) used for establishing a peer connection. + * + * @returns {string} The link for the peer connection. + */ getLink = () => { if (this.link === '') { this.logger.error( @@ -91,6 +135,11 @@ export class FlottformFileInputHost extends EventEmitter { return this.link; }; + /** + * Retrieves the QR code used for establishing a peer connection. + * + * @returns {string} The QR code for the peer connection. + */ getQrCode = () => { if (this.qrCode === '') { this.logger.error( @@ -100,6 +149,12 @@ export class FlottformFileInputHost extends EventEmitter { return this.qrCode; }; + /** + * Handles incoming data from the WebRTC data channel. + * This method processes the `MessageEvent` received when data is transferred from the peer. + * + * @param {MessageEvent} e - The event containing the incoming data. + */ private handleIncomingData = (e: MessageEvent) => { if (typeof e.data === 'string') { // string can be either metadata or end transfer marker. @@ -153,6 +208,12 @@ export class FlottformFileInputHost extends EventEmitter { } }; + /** + * Appends the received file to the input field. + * This method is triggered when a file is completely received and needs to be attached to the HTML input field. + * + * @param {number} fileIndex - The index of the file being appended. + */ private appendFileToInputField = (fileIndex: number) => { if (!this.inputField) { this.logger.warn('No input field provided!!'); @@ -183,7 +244,13 @@ export class FlottformFileInputHost extends EventEmitter { this.inputField.files = dt.files; }; + /** + * Registers event listeners for various events emitted by the `FlottformChannelHost`. + * These events include the WebRTC connection state, client readiness, ICE gathering... + * + */ private registerListeners = () => { + // @ts-ignore: Unused variable this.channel?.on('new', ({ channel }) => { this.emit('new'); }); diff --git a/flottform/forms/src/flottform-styles.ts b/flottform/forms/src/flottform-styles.ts index cecc1fd..3f48230 100644 --- a/flottform/forms/src/flottform-styles.ts +++ b/flottform/forms/src/flottform-styles.ts @@ -95,7 +95,7 @@ padding-bottom: 4rem; box-sizing: border-box; font-size: ${styles?.fontSize || defaultFonts.fontSize}; line-height: 1.75rem;`; - +// @ts-ignore: Unused variable export const createChannelQrCodeCss = (styles?: Styles) => `max-wigth: 100%; width: 350px`; diff --git a/flottform/forms/src/flottform-text-input-client.ts b/flottform/forms/src/flottform-text-input-client.ts index c0e11ce..db007b4 100644 --- a/flottform/forms/src/flottform-text-input-client.ts +++ b/flottform/forms/src/flottform-text-input-client.ts @@ -10,10 +10,27 @@ type Listeners = { error: [e: string]; }; +/** + * The `FlottformTextInputClient` uses the `FlottformChannelClient` to establish a WebRTC connection and send text data to a peer. + * It listens to various events emitted by `FlottformChannelClient` to manage connection states and the sending process. + * + * @extends EventEmitter + */ export class FlottformTextInputClient extends EventEmitter { private channel: FlottformChannelClient | null = null; + // @ts-ignore: Unused variable private logger: Logger; + /** + * Creates an instance of FlottformTextInputClient. + * + * @param {Object} config - The configuration for setting up the text input client. + * @param {string} config.endpointId - The unique ID for the WebRTC endpoint. + * @param {string} config.flottformApi - The API URL for retrieving connection information. + * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. + * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. + * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. + */ constructor({ endpointId, flottformApi, @@ -38,15 +55,30 @@ export class FlottformTextInputClient extends EventEmitter { this.logger = logger; this.registerListeners(); } + + /** + * Starts the WebRTC connection by invoking the `start` method of the underlying `FlottformChannelClient`. + */ start = () => { this.channel?.start(); }; + /** + * Closes the WebRTC connection by invoking the `close` method of the underlying `FlottformChannelClient`. + */ close = () => { // Should be called once all the text has been sent. this.channel?.close(); }; + /** + * Sends the provided text over the WebRTC connection. + * The text is sent as a single chunk since most texts will not exceed 16 KB in size. + * + * @param {string} text - The text data to be sent. + * @emits sending - Emitted when the text starts to be sent. + * @emits done - Emitted when the text sending process is completed. + */ sendText = (text: string) => { // For now, I didn't handle very large texts since for most use cases the text won't exceed the size of 1 chunk ( 16KB ) this.emit('sending'); @@ -54,6 +86,12 @@ export class FlottformTextInputClient extends EventEmitter { this.emit('done'); }; + /** + * Registers event listeners for various events emitted by the `FlottformChannelClient`. + * These events include WebRTC connection status, completion of text sending, and errors. + * + * @private + */ private registerListeners = () => { this.channel?.on('init', () => {}); this.channel?.on('retrieving-info-from-endpoint', () => {}); diff --git a/flottform/forms/src/flottform-text-input-host.ts b/flottform/forms/src/flottform-text-input-host.ts index 8e3d65b..c02c436 100644 --- a/flottform/forms/src/flottform-text-input-host.ts +++ b/flottform/forms/src/flottform-text-input-host.ts @@ -1,4 +1,5 @@ import { FlottformChannelHost } from './flottform-channel-host'; +// @ts-ignore: Unused variable import { Styles } from './flottform-styles'; import { DEFAULT_WEBRTC_CONFIG, EventEmitter, Logger, POLL_TIME_IN_MS } from './internal'; @@ -16,15 +17,32 @@ type Listeners = { 'webrtc:waiting-for-ice': []; 'webrtc:waiting-for-data': []; }; - +// @ts-ignore: Unused variable const noop = () => {}; +/** + * The `FlottformTextInputHost` manages the server side (host) of the WebRTC connection, listening for client connections and receiving text data + * It uses the `FlottformChannelHost` to establish and maintain the WebRTC connection. + * + * @extends EventEmitter + */ export class FlottformTextInputHost extends EventEmitter { private channel: FlottformChannelHost | null = null; private logger: Logger; private link: string = ''; private qrCode: string = ''; + /** + * Creates an instance of FlottformTextInputHost. + * + * @param {Object} config - The configuration for setting up the text input host. + * @param {string | URL} config.flottformApi - The API URL for retrieving connection information. + * @param {Function} config.createClientUrl - A function to create the client URL with an endpoint ID. + * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. + * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. + * @param {Function} [config.theme] - Optional theme customization function. + * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. + */ constructor({ flottformApi, createClientUrl, @@ -54,14 +72,25 @@ export class FlottformTextInputHost extends EventEmitter { theme && theme(this); } + /** + * Starts the WebRTC connection by invoking the `start` method of the underlying `FlottformChannelHost`. + */ start = () => { this.channel?.start(); }; + /** + * Closes the WebRTC connection by invoking the `close` method of the underlying `FlottformChannelHost`. + */ close = () => { this.channel?.close(); }; + /** + * Retrieves the link (URL) for the client to connect to the WebRTC host. + * + * @returns {string} The link for the client to connect. If the link is unavailable, an error is logged. + */ getLink = () => { if (this.link === '') { this.logger.error( @@ -71,6 +100,11 @@ export class FlottformTextInputHost extends EventEmitter { return this.link; }; + /** + * Retrieves the QR code data for the client to scan and connect to the WebRTC host. + * + * @returns {string} The QR code data for client connection. If the QR code is unavailable, an error is logged. + */ getQrCode = () => { if (this.qrCode === '') { this.logger.error( @@ -80,13 +114,27 @@ export class FlottformTextInputHost extends EventEmitter { return this.qrCode; }; + /** + * Handles incoming text data from the client. + * Emits the `receive` event when data is received, and the `done` event when all data has been fully received. + * + * @private + * @param {MessageEvent} e - The message event containing the incoming text data. + */ private handleIncomingData = (e: MessageEvent) => { this.emit('receive'); // We suppose that the data received is small enough to be all included in 1 message this.emit('done', e.data); }; + /** + * Registers event listeners for various events emitted by the `FlottformChannelHost`. + * These events include WebRTC connection states, data reception, and error handling. + * + * @private + */ private registerListeners = () => { + // @ts-ignore: Unused variable this.channel?.on('new', ({ channel }) => { this.emit('new'); }); diff --git a/flottform/forms/typedoc.json b/flottform/forms/typedoc.json new file mode 100644 index 0000000..d796bb9 --- /dev/null +++ b/flottform/forms/typedoc.json @@ -0,0 +1,17 @@ +{ + "entryPoints": [ + "src/flottform-channel-client.ts", + "src/flottform-channel-host.ts", + "src/flottform-file-input-client.ts", + "src/flottform-file-input-host.ts", + "src/flottform-text-input-client.ts", + "src/flottform-text-input-host.ts", + "src/file4.ts" + ], + "out": "docs", + "tsconfig": "./tsconfig.json", + "includeVersion": true, + "excludePrivate": true, + "excludeProtected": true, + "excludeInternal": true +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7df2cc9..50ee3a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,7 +85,7 @@ importers: version: 5.0.0-next.136 svelte-check: specifier: ^3.7.1 - version: 3.8.4(postcss@8.4.39)(svelte@5.0.0-next.136) + version: 3.7.1(postcss@8.4.39)(svelte@5.0.0-next.136) tailwindcss: specifier: ^3.4.3 version: 3.4.6 @@ -110,9 +110,15 @@ importers: '@vitest/browser': specifier: ^1.3.1 version: 1.3.1(vitest@1.3.1)(webdriverio@8.32.3) + eslint-plugin-tsdoc: + specifier: ^0.3.0 + version: 0.3.0 qrcode: specifier: ^1.5.3 version: 1.5.3 + typedoc: + specifier: ^0.26.7 + version: 0.26.7(typescript@5.5.3) vite: specifier: ^5.0.3 version: 5.1.2 @@ -247,7 +253,7 @@ importers: version: 1.1.0(vite@5.1.2) autoprefixer: specifier: ^10.4.17 - version: 10.4.19(postcss@8.4.38) + version: 10.4.19(postcss@8.4.39) eslint: specifier: ^8.56.0 version: 8.56.0 @@ -262,7 +268,7 @@ importers: version: 1.9.4 postcss: specifier: ^8.4.35 - version: 8.4.38 + version: 8.4.39 prettier: specifier: ^3.1.1 version: 3.2.5 @@ -274,10 +280,10 @@ importers: version: 5.0.0-next.54 svelte-check: specifier: ^3.6.0 - version: 3.7.1(postcss@8.4.38)(svelte@5.0.0-next.54) + version: 3.7.1(postcss@8.4.39)(svelte@5.0.0-next.54) tailwindcss: specifier: ^3.4.1 - version: 3.4.3 + version: 3.4.6 tslib: specifier: ^2.4.1 version: 2.6.2 @@ -967,10 +973,23 @@ packages: resolve: 1.19.0 dev: true + /@microsoft/tsdoc-config@0.17.0: + resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} + dependencies: + '@microsoft/tsdoc': 0.15.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.8 + dev: true + /@microsoft/tsdoc@0.14.2: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true + /@microsoft/tsdoc@0.15.0: + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1124,24 +1143,6 @@ packages: rollup: 4.10.0 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.17.2): - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.17.2) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.8 - rollup: 4.17.2 - dev: true - /@rollup/pluginutils@5.1.0(rollup@4.10.0): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -1422,6 +1423,43 @@ packages: string-argv: 0.3.2 dev: true + /@shikijs/core@1.17.7: + resolution: {integrity: sha512-ZnIDxFu/yvje3Q8owSHaEHd+bu/jdWhHAaJ17ggjXofHx5rc4bhpCSW+OjC6smUBi5s5dd023jWtZ1gzMu/yrw==} + dependencies: + '@shikijs/engine-javascript': 1.17.7 + '@shikijs/engine-oniguruma': 1.17.7 + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + dev: true + + /@shikijs/engine-javascript@1.17.7: + resolution: {integrity: sha512-wwSf7lKPsm+hiYQdX+1WfOXujtnUG6fnN4rCmExxa4vo+OTmvZ9B1eKauilvol/LHUPrQgW12G3gzem7pY5ckw==} + dependencies: + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + oniguruma-to-js: 0.4.3 + dev: true + + /@shikijs/engine-oniguruma@1.17.7: + resolution: {integrity: sha512-pvSYGnVeEIconU28NEzBXqSQC/GILbuNbAHwMoSfdTBrobKAsV1vq2K4cAgiaW1TJceLV9QMGGh18hi7cCzbVQ==} + dependencies: + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + dev: true + + /@shikijs/types@1.17.7: + resolution: {integrity: sha512-+qA4UyhWLH2q4EFd+0z4K7GpERDU+c+CN2XYD3sC+zjvAr5iuwD1nToXZMt1YODshjkEGEDV86G7j66bKjqDdg==} + dependencies: + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + dev: true + + /@shikijs/vscode-textmate@9.2.2: + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} + dev: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -1631,6 +1669,12 @@ packages: resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} dev: true @@ -1645,6 +1689,12 @@ packages: '@types/geojson': 7946.0.14 dev: true + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/node@20.11.20: resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} dependencies: @@ -1669,6 +1719,10 @@ packages: resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} dev: true + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: true + /@types/which@2.0.2: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true @@ -1716,8 +1770,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + /@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.10.0)(eslint@9.7.0)(typescript@5.5.3): + resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1728,22 +1782,22 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.9.0 - eslint: 8.56.0 + '@typescript-eslint/parser': 7.10.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/type-utils': 7.10.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.10.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.10.0 + eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@9.2.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -1755,11 +1809,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.10.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/type-utils': 7.10.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 7.10.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.9.0 eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -1770,33 +1824,6 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.10.0)(eslint@9.7.0)(typescript@5.5.3): - resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.10.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/type-utils': 7.10.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.10.0(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.10.0 - eslint: 9.7.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1818,29 +1845,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@7.9.0(eslint@9.2.0)(typescript@5.4.5): - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + /@typescript-eslint/parser@7.10.0(eslint@9.7.0)(typescript@5.5.3): + resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1851,17 +1857,17 @@ packages: dependencies: '@typescript-eslint/scope-manager': 7.10.0 '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.5.3) '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 + eslint: 9.7.0 + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.10.0(eslint@9.7.0)(typescript@5.5.3): - resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} + /@typescript-eslint/parser@7.9.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1870,13 +1876,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.10.0 + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 - eslint: 9.7.0 - typescript: 5.5.3 + eslint: 8.56.0 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -1897,6 +1903,14 @@ packages: '@typescript-eslint/visitor-keys': 7.10.0 dev: true + /@typescript-eslint/scope-manager@7.9.0: + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + dev: true + /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1917,8 +1931,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + /@typescript-eslint/type-utils@7.10.0(eslint@9.7.0)(typescript@5.5.3): + resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1927,17 +1941,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) - '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.5.3) + '@typescript-eslint/utils': 7.10.0(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 + eslint: 9.7.0 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@7.9.0(eslint@9.2.0)(typescript@5.4.5): + /@typescript-eslint/type-utils@7.9.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -1947,12 +1961,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@9.2.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) + '@typescript-eslint/utils': 7.9.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 9.2.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + eslint: 8.56.0 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -1967,6 +1981,11 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true + /@typescript-eslint/types@7.9.0: + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1989,8 +2008,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.9.0(typescript@5.3.3): - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + /@typescript-eslint/typescript-estree@7.10.0(typescript@5.5.3): + resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1998,20 +2017,20 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5): + /@typescript-eslint/typescript-estree@7.9.0(typescript@5.3.3): resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -2026,9 +2045,9 @@ packages: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true @@ -2052,54 +2071,38 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + /@typescript-eslint/utils@7.10.0(eslint@9.7.0)(typescript@5.5.3): + resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) - eslint: 8.56.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.9.0(eslint@9.2.0)(typescript@5.4.5): + /@typescript-eslint/utils@7.9.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.3.3) eslint: 8.56.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.10.0(eslint@9.7.0)(typescript@5.5.3): - resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.5.3) - eslint: 9.7.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/visitor-keys@6.21.0: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2116,6 +2119,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.9.0: + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.9.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true @@ -2303,7 +2314,7 @@ packages: '@vue/shared': 3.4.20 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /@vue/compiler-dom@3.4.20: @@ -2326,7 +2337,7 @@ packages: '@vue/compiler-dom': 3.4.20 '@vue/shared': 3.4.20 computeds: 0.0.1 - minimatch: 9.0.3 + minimatch: 9.0.4 muggle-string: 0.3.1 path-browserify: 1.0.1 typescript: 5.5.3 @@ -2460,6 +2471,15 @@ packages: uri-js: 4.4.1 dev: true + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2564,22 +2584,6 @@ packages: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true - /autoprefixer@10.4.17(postcss@8.4.35): - resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001591 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - dev: true - /autoprefixer@10.4.19(postcss@8.4.39): resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} @@ -2774,6 +2778,10 @@ packages: resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} dev: true + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -2806,6 +2814,14 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -2869,6 +2885,10 @@ packages: engines: {node: '>=0.1.90'} dev: true + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: true + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -3051,6 +3071,12 @@ packages: resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} dev: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: true + /devtools-protocol@0.0.1147663: resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==} dev: true @@ -3330,6 +3356,13 @@ packages: - ts-node dev: true + /eslint-plugin-tsdoc@0.3.0: + resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} + dependencies: + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + dev: true + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3930,11 +3963,37 @@ packages: function-bind: 1.1.2 dev: true + /hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + dev: true + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: true + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true @@ -4161,6 +4220,10 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -4244,6 +4307,12 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: true + /listenercount@1.0.1: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} dev: true @@ -4343,6 +4412,10 @@ packages: engines: {node: '>=12'} dev: true + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true + /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: @@ -4356,6 +4429,36 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: true + + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: true + + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4365,6 +4468,33 @@ packages: engines: {node: '>= 8'} dev: true + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: true + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: true + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: true + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: true + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4420,6 +4550,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -4578,6 +4715,12 @@ packages: mimic-fn: 4.0.0 dev: true + /oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + dependencies: + regex: 4.3.2 + dev: true + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -4799,18 +4942,6 @@ packages: engines: {node: '>=10.13.0'} dev: true - /postcss-import@15.1.0(postcss@8.4.35): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.35 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - dev: true - /postcss-import@15.1.0(postcss@8.4.39): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -4823,16 +4954,6 @@ packages: resolve: 1.22.8 dev: true - /postcss-js@4.0.1(postcss@8.4.35): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.35 - dev: true - /postcss-js@4.0.1(postcss@8.4.39): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -4877,23 +4998,6 @@ packages: yaml: 1.10.2 dev: true - /postcss-load-config@4.0.2(postcss@8.4.35): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.1.1 - postcss: 8.4.35 - yaml: 2.4.0 - dev: true - /postcss-load-config@4.0.2(postcss@8.4.39): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -4911,16 +5015,6 @@ packages: yaml: 2.4.0 dev: true - /postcss-nested@6.0.1(postcss@8.4.35): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 - dev: true - /postcss-nested@6.0.1(postcss@8.4.39): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -4983,8 +5077,8 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + picocolors: 1.0.1 + source-map-js: 1.2.0 dev: true /postcss@8.4.39: @@ -5108,6 +5202,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + dev: true + /proxy-agent@6.3.0: resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==} engines: {node: '>= 14'} @@ -5151,6 +5249,11 @@ packages: once: 1.4.0 dev: true + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + dev: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -5252,11 +5355,20 @@ packages: picomatch: 2.3.1 dev: true + /regex@4.3.2: + resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + dev: true + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true @@ -5458,6 +5570,17 @@ packages: engines: {node: '>=8'} dev: true + /shiki@1.17.7: + resolution: {integrity: sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==} + dependencies: + '@shikijs/core': 1.17.7 + '@shikijs/engine-javascript': 1.17.7 + '@shikijs/engine-oniguruma': 1.17.7 + '@shikijs/types': 1.17.7 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + dev: true + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -5515,11 +5638,6 @@ packages: sander: 0.5.1 dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -5531,6 +5649,10 @@ packages: requiresBuild: true dev: true + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: true + /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -5596,6 +5718,13 @@ packages: safe-buffer: 5.2.1 dev: true + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: true + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5692,21 +5821,21 @@ packages: - sugarss dev: true - /svelte-check@3.7.1(postcss@8.4.38)(svelte@5.0.0-next.136): + /svelte-check@3.7.1(postcss@8.4.39)(svelte@5.0.0-next.136): resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.22 chokidar: 3.6.0 fast-glob: 3.3.2 import-fresh: 3.3.0 picocolors: 1.0.1 sade: 1.8.1 svelte: 5.0.0-next.136 - svelte-preprocess: 5.1.4(postcss@8.4.38)(svelte@5.0.0-next.136)(typescript@5.4.5) - typescript: 5.4.5 + svelte-preprocess: 5.1.4(postcss@8.4.39)(svelte@5.0.0-next.136)(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -5719,21 +5848,21 @@ packages: - sugarss dev: true - /svelte-check@3.7.1(postcss@8.4.38)(svelte@5.0.0-next.54): + /svelte-check@3.7.1(postcss@8.4.39)(svelte@5.0.0-next.54): resolution: {integrity: sha512-U4uJoLCzmz2o2U33c7mPDJNhRYX/DNFV11XTUDlFxaKLsO7P+40gvJHMPpoRfa24jqZfST4/G9fGNcUGMO8NAQ==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.22 chokidar: 3.6.0 fast-glob: 3.3.2 import-fresh: 3.3.0 picocolors: 1.0.1 sade: 1.8.1 svelte: 5.0.0-next.54 - svelte-preprocess: 5.1.4(postcss@8.4.38)(svelte@5.0.0-next.54)(typescript@5.4.5) - typescript: 5.4.5 + svelte-preprocess: 5.1.4(postcss@8.4.39)(svelte@5.0.0-next.54)(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -5846,9 +5975,9 @@ packages: typescript: 5.3.3 dev: true - /svelte-preprocess@5.1.3(postcss@8.4.39)(svelte@5.0.0-next.136)(typescript@5.5.3): - resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} - engines: {node: '>= 16.0.0', pnpm: ^8.0.0} + /svelte-preprocess@5.1.4(postcss@8.4.39)(svelte@5.0.0-next.136)(typescript@5.5.3): + resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} + engines: {node: '>= 16.0.0'} requiresBuild: true peerDependencies: '@babel/core': ^7.10.2 @@ -5886,15 +6015,15 @@ packages: dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 - magic-string: 0.30.7 + magic-string: 0.30.10 postcss: 8.4.39 sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 5.0.0-next.136 - typescript: 5.4.5 + typescript: 5.5.3 dev: true - /svelte-preprocess@5.1.4(postcss@8.4.38)(svelte@5.0.0-next.54)(typescript@5.4.5): + /svelte-preprocess@5.1.4(postcss@8.4.39)(svelte@5.0.0-next.54)(typescript@5.5.3): resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} requiresBuild: true @@ -5935,11 +6064,11 @@ packages: '@types/pug': 2.0.10 detect-indent: 6.1.0 magic-string: 0.30.10 - postcss: 8.4.38 + postcss: 8.4.39 sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 5.0.0-next.54 - typescript: 5.4.5 + typescript: 5.5.3 dev: true /svelte@5.0.0-next.136: @@ -5980,37 +6109,6 @@ packages: zimmerframe: 1.1.2 dev: true - /tailwindcss@3.4.1: - resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.35 - postcss-import: 15.1.0(postcss@8.4.35) - postcss-js: 4.0.1(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35) - postcss-nested: 6.0.1(postcss@8.4.35) - postcss-selector-parser: 6.0.15 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - dev: true - /tailwindcss@3.4.6: resolution: {integrity: sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==} engines: {node: '>=14.0.0'} @@ -6140,6 +6238,10 @@ packages: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + /ts-api-utils@1.2.1(typescript@5.3.3): resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} engines: {node: '>=16'} @@ -6158,15 +6260,6 @@ packages: typescript: 5.3.3 dev: true - /ts-api-utils@1.3.0(typescript@5.4.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: true - /ts-api-utils@1.3.0(typescript@5.5.3): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -6211,6 +6304,21 @@ packages: engines: {node: '>=12.20'} dev: true + /typedoc@0.26.7(typescript@5.5.3): + resolution: {integrity: sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + dependencies: + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + shiki: 1.17.7 + typescript: 5.5.3 + yaml: 2.5.1 + dev: true + /typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} @@ -6223,6 +6331,10 @@ packages: hasBin: true dev: true + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: true + /ufo@1.4.0: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true @@ -6238,6 +6350,39 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + dev: true + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: true + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -6294,6 +6439,20 @@ packages: engines: {node: '>= 0.10'} dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + dev: true + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + dev: true + /vite-node@1.2.2: resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6369,7 +6528,7 @@ packages: dependencies: '@microsoft/api-extractor': 7.39.0 '@rollup/pluginutils': 5.1.0(rollup@4.10.0) - '@vue/language-core': 1.8.27(typescript@5.4.5) + '@vue/language-core': 1.8.27(typescript@5.5.3) debug: 4.3.4 kolorist: 1.8.0 typescript: 5.5.3 @@ -6859,6 +7018,12 @@ packages: hasBin: true dev: true + /yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + dev: true + /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -6960,3 +7125,7 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: true + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true From 5b7e18ff8df4413d8cbe7f06fdc24e84f06f7499 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Mon, 23 Sep 2024 17:16:50 +0200 Subject: [PATCH 2/9] wip: remove documentation from private methods Signed-off-by: nidhal-labidi --- .../forms/src/flottform-channel-client.ts | 47 ++---------- flottform/forms/src/flottform-channel-host.ts | 74 +------------------ .../forms/src/flottform-file-input-client.ts | 34 --------- .../forms/src/flottform-file-input-host.ts | 17 ----- .../forms/src/flottform-text-input-client.ts | 6 -- .../forms/src/flottform-text-input-host.ts | 13 ---- 6 files changed, 7 insertions(+), 184 deletions(-) diff --git a/flottform/forms/src/flottform-channel-client.ts b/flottform/forms/src/flottform-channel-client.ts index 08b7f86..22e5807 100644 --- a/flottform/forms/src/flottform-channel-client.ts +++ b/flottform/forms/src/flottform-channel-client.ts @@ -84,18 +84,13 @@ export class FlottformChannelClient extends EventEmitter { this.pollTimeForIceInMs = pollTimeForIceInMs; this.logger = logger; } - /** - * Changes the state of the client and emits the corresponding event. - * - * @param newState - The new state to transition to. - * @param details - Optional additional details to emit with the event. - */ private changeState = (newState: ClientState, details?: any) => { this.state = newState; this.emit(newState, details); this.logger.info(`**Client State changed to: ${newState}`, details == undefined ? '' : details); }; + /** * Starts the WebRTC connection process. The connection is not established until this method is called. * @@ -152,6 +147,7 @@ export class FlottformChannelClient extends EventEmitter { } this.changeState('disconnected'); }; + /** * Sends data to the connected peer via the WebRTC data channel. * @@ -168,6 +164,7 @@ export class FlottformChannelClient extends EventEmitter { } this.dataChannel.send(data); }; + /** * Determines if more data can be sent based on the WebRTC data channel's buffered amount. This is useful when dealing with large amounts of data. * @@ -179,14 +176,7 @@ export class FlottformChannelClient extends EventEmitter { this.dataChannel.bufferedAmount < this.dataChannel.bufferedAmountLowThreshold ); }; - /** - * Sets up event listeners for ICE candidate gathering and sends the gathered candidates to the peer. - * - * @param putClientInfoUrl - The URL where client information should be sent. - * @param clientKey - The client's unique key used for identification. - * @param clientIceCandidates - A set of ICE candidates gathered by the client. - * @param session - The RTC session description used for connection setup. - */ + private setUpClientIceGathering = ( putClientInfoUrl: string, clientKey: string, @@ -221,11 +211,7 @@ export class FlottformChannelClient extends EventEmitter { this.logger.error(`onicecandidateerror - ${this.openPeerConnection!.connectionState}`, e); }; }; - /** - * Periodically retrieves ICE candidates from the host to complete the WebRTC connection. - * - * @param getEndpointInfoUrl - The URL for retrieving host's ICE candidate information. - */ + private setUpConnectionStateGathering = (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState( @@ -263,9 +249,7 @@ export class FlottformChannelClient extends EventEmitter { } }; }; - /** - * Stops polling for ICE candidates. - */ + private stopPollingForIceCandidates = async () => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -273,11 +257,6 @@ export class FlottformChannelClient extends EventEmitter { this.pollForIceTimer = null; }; - /** - * Starts polling for ICE candidates from the host. - * - * @param getEndpointInfoUrl - The URL to use for polling the ICE candidates. - */ private startPollingForIceCandidates = async (getEndpointInfoUrl: string) => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -288,11 +267,6 @@ export class FlottformChannelClient extends EventEmitter { this.pollForIceTimer = setTimeout(this.startPollingForIceCandidates, this.pollTimeForIceInMs); }; - /** - * Polls for the WebRTC connection state and ICE candidates from the host. - * - * @param getEndpointInfoUrl - The URL for retrieving connection and candidate information. - */ private pollForConnection = async (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState('error', "openPeerConnection is null. Unable to retrieve Host's details"); @@ -306,15 +280,6 @@ export class FlottformChannelClient extends EventEmitter { } }; - /** - * Sends client information, including ICE candidates, to a remote server where the host can retrieve it. - * - * - * @param putClientInfoUrl - The URL where client information should be sent. - * @param clientKey - The client's unique key for identification. - * @param clientIceCandidates - A set of ICE candidates gathered by the client. - * @param session - The RTC session description used for connection setup. - */ private putClientInfo = async ( putClientInfoUrl: string, clientKey: string, diff --git a/flottform/forms/src/flottform-channel-host.ts b/flottform/forms/src/flottform-channel-host.ts index 583a0e6..eba9543 100644 --- a/flottform/forms/src/flottform-channel-host.ts +++ b/flottform/forms/src/flottform-channel-host.ts @@ -73,12 +73,7 @@ export class FlottformChannelHost extends EventEmitter { this.changeState('new', { channel: this }); }); } - /** - * Changes the state of the host and emits the corresponding event. - * - * @param newState - The new state to transition to. - * @param details - Optional additional details to emit with the event. - */ + private changeState = (newState: FlottformState | 'disconnected', details?: any) => { this.state = newState; this.emit(newState, details); @@ -142,12 +137,6 @@ export class FlottformChannelHost extends EventEmitter { this.changeState('disconnected'); }; - /** - * Sets up the WebRTC data channel listener to handle incoming data from the client. - * - * @fires error - Emitted when the data channel is not set up yet. - * @fires receiving-data - Emitted when data is received from the client. - */ private setupDataChannelListener = () => { if (this.dataChannel == null) { this.changeState( @@ -163,16 +152,6 @@ export class FlottformChannelHost extends EventEmitter { }; }; - /** - * Sets up the ICE candidate gathering process and sends the gathered candidates to the client peer. - * - * @param putHostInfoUrl - The URL where the host's information should be sent. - * @param hostKey - The host's unique key used for identification. - * @param hostIceCandidates - A set of ICE candidates gathered by the host. - * @param session - The RTC session description used for connection setup. - * - * @fires error - Emitted when the connection channel is not setup yet. - */ private setupHostIceGathering = ( putHostInfoUrl: string, hostKey: string, @@ -208,13 +187,6 @@ export class FlottformChannelHost extends EventEmitter { }; }; - /** - * Sets up a process to periodically retrieve the connection state and ICE candidates from the client. - * - * @param getEndpointInfoUrl - The URL for retrieving ICE candidate information from the client. - * - * @fires error - Emitted when the connection channel is: not setup yet, connection establishment failed or impossible. - */ private setUpConnectionStateGathering = (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState( @@ -251,9 +223,6 @@ export class FlottformChannelHost extends EventEmitter { }; }; - /** - * Stops polling for a connection or ICE candidates. - */ private stopPollingForConnection = async () => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -261,11 +230,6 @@ export class FlottformChannelHost extends EventEmitter { this.pollForIceTimer = null; }; - /** - * Starts polling for a connection and ICE candidates from the client. - * - * @param getEndpointInfoUrl - The URL to use for polling the ICE candidates. - */ private startPollingForConnection = async (getEndpointInfoUrl: string) => { if (this.pollForIceTimer) { clearTimeout(this.pollForIceTimer); @@ -278,12 +242,6 @@ export class FlottformChannelHost extends EventEmitter { }, this.pollTimeForIceInMs); }; - /** - * Creates an endpoint on the server where the client can retrieve the host's connection information. - * - * @param baseApi - The base API URL for the host's information. - * @param session - The RTC session description used for connection setup. - */ private createEndpoint = async (baseApi: string, session: RTCSessionDescriptionInit) => { const response = await fetch(`${baseApi}/create`, { method: 'POST', @@ -297,14 +255,6 @@ export class FlottformChannelHost extends EventEmitter { return response.json(); }; - /** - * Polls the client for connection state and ICE candidates to complete the WebRTC connection. - * - * @param getEndpointInfoUrl - The URL for retrieving connection and candidate information. - * - * @fires error - Emitted when the connection channel is not setup yet. - * @fires waiting-for-ice - Emitted when the host finds a client to connect to. - */ private pollForConnection = async (getEndpointInfoUrl: string) => { if (this.openPeerConnection === null) { this.changeState('error', "openPeerConnection is null. Unable to retrieve Client's details"); @@ -325,12 +275,6 @@ export class FlottformChannelHost extends EventEmitter { } }; - /** - * Sets up the data channel for transferring files and other large data types. - * - * @fires error - Emitted when the data channel is not setup yet. - * @fires waiting-for-data - Emitted when the data channel is opened. - */ private setupDataChannelForTransfer = () => { if (this.dataChannel === null) { this.changeState('error', 'dataChannel is null. Unable to setup a Data Channel'); @@ -352,11 +296,6 @@ export class FlottformChannelHost extends EventEmitter { }; }; - /** - * Creates the WebRTC data channel for communication with the client peer. - * - * @fires error - Emitted when the data channel is not setup yet. - */ private createDataChannel = () => { if (this.openPeerConnection === null) { this.changeState('error', 'openPeerConnection is null. Unable to create a new Data Channel'); @@ -368,17 +307,6 @@ export class FlottformChannelHost extends EventEmitter { return this.openPeerConnection.createDataChannel(channelName); }; - /** - * Sends host information, including ICE candidates, to a remote server where the client can access it. - * - * @param putHostInfoUrl - The URL where the host's information should be sent. - * @param hostKey - The host's unique key for identification. - * @param hostIceCandidates - A set of ICE candidates gathered by the host. - * @param session - The RTC session description used for connection setup. - * - * @throws Will throw an error if it wasn't able to update the host's info - * @fires error if some error happens during the process of saving the host's info to the server. - */ private putHostInfo = async ( putHostInfoUrl: string, hostKey: string, diff --git a/flottform/forms/src/flottform-file-input-client.ts b/flottform/forms/src/flottform-file-input-client.ts index 7731035..79668e8 100644 --- a/flottform/forms/src/flottform-file-input-client.ts +++ b/flottform/forms/src/flottform-file-input-client.ts @@ -94,13 +94,6 @@ export class FlottformFileInputClient extends EventEmitter { this.channel?.close(); }; - /** - * Creates the metadata for the selected files. - * This metadata includes information about each file such as name, type, and size. - * - * @param {HTMLInputElement} inputElement - The input field containing the selected files. - * @returns {MetaData | null} The metadata object or `null` if no files are found. - */ private createMetaData = (inputElement: HTMLInputElement): MetaData | null => { if (!inputElement.files) return null; @@ -118,14 +111,6 @@ export class FlottformFileInputClient extends EventEmitter { }; }; - /** - * Converts the files selected in the input field into an array of ArrayBuffers. - * These ArrayBuffers will be used to send file data over the WebRTC connection. - * - * @private - * @param {HTMLInputElement} inputElement - The input field containing the selected files. - * @returns {Promise} A promise that resolves to an array of file data as ArrayBuffers. - */ private createArrayBuffers = async (inputElement: HTMLInputElement) => { if (!inputElement.files) return null; @@ -155,23 +140,10 @@ export class FlottformFileInputClient extends EventEmitter { this.startSendingFiles(); }; - /** - * Starts sending the files by sending the first chunk. - * This method initiates the recursive process of sending chunks of data. - * - * @private - */ private startSendingFiles = () => { this.sendNextChunk(); }; - /** - * Sends the next chunk of the current file over the WebRTC connection. - * If the buffer is full, the sending is paused until there is more space. - * If the current file is completely sent, it moves to the next file in the queue. - * - * @private - */ private sendNextChunk = async () => { const totalNumberOfFiles = this.filesMetaData.length; if (this.allFilesSent || this.currentFileIndex >= totalNumberOfFiles) { @@ -222,12 +194,6 @@ export class FlottformFileInputClient extends EventEmitter { } }; - /** - * Registers event listeners for various events emitted by the `FlottformChannelClient`. - * These events include WebRTC connection status and errors. - * - * @private - */ private registerListeners = () => { this.channel?.on('init', () => { // TODO: Implement Default UI. diff --git a/flottform/forms/src/flottform-file-input-host.ts b/flottform/forms/src/flottform-file-input-host.ts index b07c691..3296270 100644 --- a/flottform/forms/src/flottform-file-input-host.ts +++ b/flottform/forms/src/flottform-file-input-host.ts @@ -149,12 +149,6 @@ export class FlottformFileInputHost extends EventEmitter { return this.qrCode; }; - /** - * Handles incoming data from the WebRTC data channel. - * This method processes the `MessageEvent` received when data is transferred from the peer. - * - * @param {MessageEvent} e - The event containing the incoming data. - */ private handleIncomingData = (e: MessageEvent) => { if (typeof e.data === 'string') { // string can be either metadata or end transfer marker. @@ -208,12 +202,6 @@ export class FlottformFileInputHost extends EventEmitter { } }; - /** - * Appends the received file to the input field. - * This method is triggered when a file is completely received and needs to be attached to the HTML input field. - * - * @param {number} fileIndex - The index of the file being appended. - */ private appendFileToInputField = (fileIndex: number) => { if (!this.inputField) { this.logger.warn('No input field provided!!'); @@ -244,11 +232,6 @@ export class FlottformFileInputHost extends EventEmitter { this.inputField.files = dt.files; }; - /** - * Registers event listeners for various events emitted by the `FlottformChannelHost`. - * These events include the WebRTC connection state, client readiness, ICE gathering... - * - */ private registerListeners = () => { // @ts-ignore: Unused variable this.channel?.on('new', ({ channel }) => { diff --git a/flottform/forms/src/flottform-text-input-client.ts b/flottform/forms/src/flottform-text-input-client.ts index db007b4..5ba4095 100644 --- a/flottform/forms/src/flottform-text-input-client.ts +++ b/flottform/forms/src/flottform-text-input-client.ts @@ -86,12 +86,6 @@ export class FlottformTextInputClient extends EventEmitter { this.emit('done'); }; - /** - * Registers event listeners for various events emitted by the `FlottformChannelClient`. - * These events include WebRTC connection status, completion of text sending, and errors. - * - * @private - */ private registerListeners = () => { this.channel?.on('init', () => {}); this.channel?.on('retrieving-info-from-endpoint', () => {}); diff --git a/flottform/forms/src/flottform-text-input-host.ts b/flottform/forms/src/flottform-text-input-host.ts index c02c436..218ecb3 100644 --- a/flottform/forms/src/flottform-text-input-host.ts +++ b/flottform/forms/src/flottform-text-input-host.ts @@ -114,25 +114,12 @@ export class FlottformTextInputHost extends EventEmitter { return this.qrCode; }; - /** - * Handles incoming text data from the client. - * Emits the `receive` event when data is received, and the `done` event when all data has been fully received. - * - * @private - * @param {MessageEvent} e - The message event containing the incoming text data. - */ private handleIncomingData = (e: MessageEvent) => { this.emit('receive'); // We suppose that the data received is small enough to be all included in 1 message this.emit('done', e.data); }; - /** - * Registers event listeners for various events emitted by the `FlottformChannelHost`. - * These events include WebRTC connection states, data reception, and error handling. - * - * @private - */ private registerListeners = () => { // @ts-ignore: Unused variable this.channel?.on('new', ({ channel }) => { From 6dc8c83e3df0e517a44da9a96b0a60c252ab6248 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Mon, 23 Sep 2024 17:18:31 +0200 Subject: [PATCH 3/9] fix: remove the output of the script 'docs' Signed-off-by: nidhal-labidi --- flottform/forms/docs/.nojekyll | 1 - flottform/forms/docs/assets/highlight.css | 57 - flottform/forms/docs/assets/icons.js | 18 - flottform/forms/docs/assets/icons.svg | 1 - flottform/forms/docs/assets/main.js | 60 - flottform/forms/docs/assets/navigation.js | 1 - flottform/forms/docs/assets/search.js | 1 - flottform/forms/docs/assets/style.css | 1448 ----------------- ...channel_client.FlottformChannelClient.html | 32 - ...orm_channel_host.FlottformChannelHost.html | 25 - ...input_client.FlottformFileInputClient.html | 21 - ...ile_input_host.FlottformFileInputHost.html | 29 - ...input_client.FlottformTextInputClient.html | 24 - ...ext_input_host.FlottformTextInputHost.html | 25 - flottform/forms/docs/index.html | 70 - .../modules/flottform_channel_client.html | 2 - .../docs/modules/flottform_channel_host.html | 2 - .../modules/flottform_file_input_client.html | 2 - .../modules/flottform_file_input_host.html | 2 - .../modules/flottform_text_input_client.html | 2 - .../modules/flottform_text_input_host.html | 2 - 21 files changed, 1825 deletions(-) delete mode 100644 flottform/forms/docs/.nojekyll delete mode 100644 flottform/forms/docs/assets/highlight.css delete mode 100644 flottform/forms/docs/assets/icons.js delete mode 100644 flottform/forms/docs/assets/icons.svg delete mode 100644 flottform/forms/docs/assets/main.js delete mode 100644 flottform/forms/docs/assets/navigation.js delete mode 100644 flottform/forms/docs/assets/search.js delete mode 100644 flottform/forms/docs/assets/style.css delete mode 100644 flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html delete mode 100644 flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html delete mode 100644 flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html delete mode 100644 flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html delete mode 100644 flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html delete mode 100644 flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html delete mode 100644 flottform/forms/docs/index.html delete mode 100644 flottform/forms/docs/modules/flottform_channel_client.html delete mode 100644 flottform/forms/docs/modules/flottform_channel_host.html delete mode 100644 flottform/forms/docs/modules/flottform_file_input_client.html delete mode 100644 flottform/forms/docs/modules/flottform_file_input_host.html delete mode 100644 flottform/forms/docs/modules/flottform_text_input_client.html delete mode 100644 flottform/forms/docs/modules/flottform_text_input_host.html diff --git a/flottform/forms/docs/.nojekyll b/flottform/forms/docs/.nojekyll deleted file mode 100644 index e2ac661..0000000 --- a/flottform/forms/docs/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -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/flottform/forms/docs/assets/highlight.css b/flottform/forms/docs/assets/highlight.css deleted file mode 100644 index 0101a7c..0000000 --- a/flottform/forms/docs/assets/highlight.css +++ /dev/null @@ -1,57 +0,0 @@ -:root { - --light-hl-0: #795E26; - --dark-hl-0: #DCDCAA; - --light-hl-1: #000000; - --dark-hl-1: #D4D4D4; - --light-hl-2: #A31515; - --dark-hl-2: #CE9178; - --light-hl-3: #0000FF; - --dark-hl-3: #569CD6; - --light-hl-4: #098658; - --dark-hl-4: #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); - --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); - --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); - --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); - --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); } -pre, code { background: var(--code-background); } diff --git a/flottform/forms/docs/assets/icons.js b/flottform/forms/docs/assets/icons.js deleted file mode 100644 index e88e8ca..0000000 --- a/flottform/forms/docs/assets/icons.js +++ /dev/null @@ -1,18 +0,0 @@ -(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 = `""`; - 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/flottform/forms/docs/assets/icons.svg b/flottform/forms/docs/assets/icons.svg deleted file mode 100644 index e371b8b..0000000 --- a/flottform/forms/docs/assets/icons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/flottform/forms/docs/assets/main.js b/flottform/forms/docs/assets/main.js deleted file mode 100644 index 21a5d74..0000000 --- a/flottform/forms/docs/assets/main.js +++ /dev/null @@ -1,60 +0,0 @@ -"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 e.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/flottform/forms/docs/assets/navigation.js b/flottform/forms/docs/assets/navigation.js deleted file mode 100644 index 4628b11..0000000 --- a/flottform/forms/docs/assets/navigation.js +++ /dev/null @@ -1 +0,0 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE6WRvQqDMBhF3yWzttSpuArS7t1ERDSS0JiIiVAovnuNtuJPNDEdlXu/k8uJ3kDAlwA+KAgTomB16WYopRQSNyMYUgEcUKUCdYmS5Q2B/Dwmk28yGZInJErSxZ+Y5sD3HJAhTPIaUuBHIyb8lYOhGywgGUk534OoD8zZF+/axq2zsw0xbrRM5qx23WaA7VU9QFU2XVRgAl1Mq0YYCJPhpA9bOQu7+l229dbWpK0rFkN19ibw4wLH5+kULinqC6bz5A9jjzL8h8dH923ocU3aumIxVOdxAj/ucXyezuOSor6gmhd/APC1BKM/BQAA" \ No newline at end of file diff --git a/flottform/forms/docs/assets/search.js b/flottform/forms/docs/assets/search.js deleted file mode 100644 index 06257fd..0000000 --- a/flottform/forms/docs/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE72bXW/bNhSG/4t6q7g6h6Rs57ZDsQLbxbBhN0EQGLbSGPVHZivbgCD/fZREW6QPaX5I3k1VpTovX1KPzyvK6Xt22P9zzO4f3rMf690qu8c82y22VXafPW/2df28P2zvli+L3a7a3C0362pXZ3n2dtjIC7b71dumOn4+X/ikLnzqLpy81NuNvHq5WRyPlRwkyz7y0ziAs/NIX08CX7r6L+Y4qt49jr3eMnyevS4OjfSV2fUWBfSLsdzvjvXhbVnvD6P4+mQKxnl0CGvWseD98h7rxWGc1fx0krqp3+Vmf6xGWmUlddv1rXarnxb1YqQl7tVuu8qL3e9yqF/3h2o881T0pnPY78ax3er0Tuvj6m59vFvvXqrDuq5Wt3D+/DyS9Vbof/VebdcjtROldHP3VzLtZX8MSbTmsuQ8+1kfw71g7Ri22tgka+c0Ro5dd5SYYU7RofnlcRubXdE+Q3PLt6qRmRXtM6hrekwO6pjxjoO6pc/yoE4Z7TmwS3pMD+yQQa4t3fF5vankGK9vtf+hv7n2qb02+bn/q5T41ih4n/zpYC6R0KZJpzqkc0b6i2yhxKtTPbWXxvoPbarDnfu6a/TKB7bZEdZcPhE3lx7HXHdN8/YzuJoYsdaTomOEOVzNkOhJJIXJ8Fl4UiV2GonxkjaP6znjeRDXZpb2LH425nkavxzILpCQLoOfyiOcpefKFeURMsXrOyFPEhxHZIl/peNzJMHx96r+Zb37MZLnXu3mrn87fNmvxlprXe+2zkMTz2t5aNqleA9NOr/5oSmX4D484bz2h6dboH9LstXVv3XoDqq5duAO6g8pEbaDooO5REIzjk51SMpF+otMOuLVqZ6adrH+QxNvuHNf6kWvfGDyjbDmcrfTXDrmsveSt/d/NU1inSclyghzuJoq0ZNISpbhs/CkS+w0EhMmbR7XU8azf9JmlrZ/Ohvz7J8uB7ILJGTL4P1ThLP0VLmiPEKieH0npEmC44gk8a90fIokOPbvn2I8h++fBrv27p8ifQfvn4Y5D008r+WhaZfiPTTp/OaHplyC+/CE89ofnm5X/T/mmbRf/Zvdv2d/V4fjWt7r+wwnbDKXws/rarNqfjOtm5i0sd9uu63Nar98a//6qC77s2oadXNxd/XnIssfihz4pODzHHIsJsgwxxxmk0KIx8f84STXXtr+4KTa/6SVAnnGcl5MCmBGIZBCMApRnvEc2WQ240YhkkI0Cpk8E7ZCRgqZUcjlWWkr5KSQG4VCnk1tcxSkUBiFpTyb2QpLUlgahVN5NrdZnZLCqVE4k2dQ2CpnpHJmVM6bSrBVzknl3ETAjhNYeQIKFFwQ1XACdqYsUJlUgRMroFyBCRY4yQKKFphsgRMuoHSBiRcI190GChiYhEHpvOFAIQOTMpg67zlQ0MAkDWbdXYdJKaDpHXwynzaHHMrJdDrLQeTAJiVeCFMOwQQRWhJL6/2nKILJIhbOtkLBQxM8BNf9R8odXnQzdN1/tPQzkztsUAJrg0EKHprgIXfBgxQ8NMFD4YQHKXlokoelEx6k5KFJHk51eCCYHqRYooklth3Q2nSRoocmejh30kPJQ5M8VjhziZLHTPIYuOhhlDxmkscamGCeMz5h84tiih67yNIGJiysxZY4NdFjTvQYRY+Z6DE3eoyix0z0mBs9RtFjJnrMQK8n78RbjqAYNIUpecwkjzUsIdrIY5Q8ZpLHnOQxSh4zyeNO8jglj5vkcSd5nJLHTfJ4wxJag5pT8rhJHmcueDgFj188yHEnPNzyLGeSx4UTHk7J4yZ5vHT0LQ89nGLJTSx5A5Osty0mRY+b6PGZix5OyeMmeXzupIeSx03yROGiR1DyhEmeAGffEhQ9YaIn0Nm3BEVPmOgJJ3qCoidM9IQbPUHRExf7CDd6wrKV6H7UbgPl/k/uJ79120G5i1suds0b+u3+UK3a/0jwnj2pzeJ5q/uelfKPj49+ayjPtN1h82+the7XHnUN6DWKrgqKMC319VovhVRq1h1l+wyTbF+A9Yplr8iVojrK56pOGbojV0cRaF5/qdmPx/vxlD6oI6oZySeBblx15LOg8br3B9qqa8uulGCqRijVCOoo21I3MxE0UvOVrTGSNqfT7cCw23F+j6HrFQ5e8gv1002XEwhj8zyagpTyxbSZJEl2Xwxoa6MrRko269y+2aE+QcMW5omyxKv2Yccw6M6izWsoh1fUPrQsVfbSK2rM8TDWvlf1pn2PrM14rllTH0MRdpek2l+HZft2V3OloSsfbzs9DNIjN0NbtRP+GId7u3CGpnB9UKM/Su3LVk1Zm7gSBtVcUDUXpo5ctVfBwwba6eNo90v5BSWLSpapIz8tPwsapsm/y+yb9oOFNcZG5Ln7PWFtaTQZDDdTt1+Xa2hpjYSHIaW+nuo1tNuvVgfUEVW2MUUaPx3Degsxq2VPDFjy6eR1/VrJj6ksfXj8+PgPAwWJqDI9AAA="; \ No newline at end of file diff --git a/flottform/forms/docs/assets/style.css b/flottform/forms/docs/assets/style.css deleted file mode 100644 index 9d619a6..0000000 --- a/flottform/forms/docs/assets/style.css +++ /dev/null @@ -1,1448 +0,0 @@ -:root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; - --light-color-background-warning: #e6e600; - --light-color-icon-background: var(--light-color-background); - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-accent); - --light-color-text: #222; - --light-color-text-aside: #6e6e6e; - --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: var(--light-color-ts-class); - --light-color-ts-property: var(--light-color-ts-variable); - --light-color-ts-method: var(--light-color-ts-function); - --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: var(--light-color-ts-property); - --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-icon-background: var(--dark-color-background-secondary); - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: #5d5d6a; - --dark-color-text: #f5f5f5; - --dark-color-text-aside: #dddddd; - --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: var(--dark-color-ts-class); - --dark-color-ts-property: var(--dark-color-ts-variable); - --dark-color-ts-method: var(--dark-color-ts-function); - --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: var(--dark-color-ts-property); - --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-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-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --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-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-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-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --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-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-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --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-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-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --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-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; - 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-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; -} -.tsd-kind-icon path { - transform-origin: center; - transform: scale(1.1); -} -.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-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-literal { - color: var(--color-ts-type-literal); -} -.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 0; - } - - .page-menu, - .site-menu { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - } -} diff --git a/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html b/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html deleted file mode 100644 index 66390a9..0000000 --- a/flottform/forms/docs/classes/flottform_channel_client.FlottformChannelClient.html +++ /dev/null @@ -1,32 +0,0 @@ -FlottformChannelClient | @flottform/forms - v0.0.1

A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). -It handles ICE candidate gathering and sending/receiving data. -The connection is initiated only when start method is called.

-

This class emits various events during the connection lifecycle, such as connected, disconnected, and error, allowing you to respond to changes in the connection state.

-

init - Emitted when the client is initialized.

-

retrieving-info-from-endpoint - Emitted when information is being retrieved from the endpoint.

-

sending-client-info - Emitted when client information is being sent to the host.

-

connecting-to-host - Emitted when attempting to connect to the host.

-

connected - Emitted when the connection is successfully established.

-

connection-impossible - Emitted if the connection to the host cannot be established.

-

done - Emitted when the all of the data is received.

-

disconnected - Emitted when the connection is closed.

-

error - Emitted when there is an error during the connection.

-

bufferedamountlow - Emitted when the buffered amount for data channels is low.

-

Hierarchy

  • EventEmitter<Listeners>
    • FlottformChannelClient

Constructors

  • Creates an instance of FlottformChannelClient

    -

    Parameters

    • __namedParameters: {
          endpointId: string;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }
      • endpointId: string
      • flottformApi: string
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration

    Returns FlottformChannelClient

Methods

  • Determines if more data can be sent based on the WebRTC data channel's buffered amount. This is useful when dealing with large amounts of data.

    -

    Returns null | boolean

    true if more data can be sent, otherwise false.

    -
  • Closes the WebRTC connection if it is currently established.

    -

    Returns void

    disconnected - Emitted when the connection is successfully closed.

    -
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Sends data to the connected peer via the WebRTC data channel.

    -

    Parameters

    • data: any

      The data to send to the peer.

      -

    Returns void

    error - Emits the state error if the connection is not established.

    -
  • Starts the WebRTC connection process. The connection is not established until this method is called.

    -

    Returns Promise<void>

diff --git a/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html b/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html deleted file mode 100644 index 5c7dad5..0000000 --- a/flottform/forms/docs/classes/flottform_channel_host.FlottformChannelHost.html +++ /dev/null @@ -1,25 +0,0 @@ -FlottformChannelHost | @flottform/forms - v0.0.1

A class used to represent one peer (called client) to establish a WebRTC connection with another peer (called host). -It handles ICE candidate gathering and sending/receiving data. -The connection is initiated only when start method is called.

-

This class emits various events throughout the connection lifecycle such as connected, disconnected, and error, allowing you to respond to the connection state changes.

-

new - Emitted when the host is created and ready to accept clients.

-

waiting-for-client - Emitted when waiting for a client to connect.

-

waiting-for-data - Emitted when the host is ready to receive data.

-

waiting-for-ice - Emitted when ICE candidates are being gathered.

-

receiving-data - Emitted when the host is receiving data from the client.

-

file-received - Emitted when a complete file has been received.

-

done - Emitted when the transfer is complete.

-

error - Emitted when an error occurs during connection or data transfer.

-

connected - Emitted when the host successfully connects to a client.

-

disconnected - Emitted when the connection is closed.

-

Hierarchy

  • EventEmitter<FlottformEventMap>
    • FlottformChannelHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformChannelHost

    -

    Parameters

    • __namedParameters: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          logger: Logger;
          pollTimeForIceInMs: number;
          rtcConfiguration: RTCConfiguration;
      }
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL
      • logger: Logger
      • pollTimeForIceInMs: number
      • rtcConfiguration: RTCConfiguration

    Returns FlottformChannelHost

Methods

  • Closes the WebRTC connection if it is currently established.

    -

    Returns void

    disconnected - Emitted when the connection is successfully closed.

    -
  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • Rest...args: FlottformEventMap[K]

    Returns void

  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • listener: Listener<FlottformEventMap[K]>

    Returns void

  • Type Parameters

    • K extends keyof FlottformEventMap

    Parameters

    • eventName: K
    • listener: Listener<FlottformEventMap[K]>

    Returns void

  • Starts the WebRTC connection process for the host. The connection is not established until this method is called.

    -

    Returns Promise<void>

diff --git a/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html b/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html deleted file mode 100644 index 134cf7c..0000000 --- a/flottform/forms/docs/classes/flottform_file_input_client.FlottformFileInputClient.html +++ /dev/null @@ -1,21 +0,0 @@ -FlottformFileInputClient | @flottform/forms - v0.0.1

The FlottformFileInputClient uses the FlottformChannelClient to manage the WebRTC connection and handle the transfer of large files to a peer. -It listens to various events emitted by FlottformChannelClient to implement the file sending process.

-

connected - Emitted when the connection is successfully established.

-

webrtc:connection-impossible - Emitted if the connection to the host cannot be established.

-

done - Emitted when the all of the data is sent.

-

disconnected - Emitted when the connection is closed.

-

error - Emitted when there is an error during the connection.

-

Hierarchy

  • EventEmitter<Listeners>
    • FlottformFileInputClient

Constructors

Methods

Constructors

  • Creates an instance of FlottformFileInputClient.

    -

    Parameters

    • __namedParameters: {
          endpointId: string;
          fileInput: HTMLInputElement;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }
      • endpointId: string
      • fileInput: HTMLInputElement
      • flottformApi: string
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration

    Returns FlottformFileInputClient

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelClient.

    -

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the process of sending files over the WebRTC connection. -This method prepares the files, creates metadata, and begins the file transfer.

    -

    Returns Promise<void>

    Will throw an error if the metadata or file data is unavailable.

    -
  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelClient.

    -

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html b/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html deleted file mode 100644 index abd0035..0000000 --- a/flottform/forms/docs/classes/flottform_file_input_host.FlottformFileInputHost.html +++ /dev/null @@ -1,29 +0,0 @@ -FlottformFileInputHost | @flottform/forms - v0.0.1

The FlottformFileInputHost class uses the FlottformChannelHost to manage the WebRTC connection and handle the reception of large files from a peer.

-

It listens to various events emitted by FlottformChannelHost to implement the file transfer process.

-

new - Emitted when the host is created and ready to accept clients.

-

webrtc:waiting-for-client - Emitted when waiting for a client to connect.

-

webrtc:waiting-for-ice - Emitted when ICE candidates are being gathered.

-

webrtc:waiting-for-ice - Emitted when host is ready to receive the file(s).

-

done - Emitted when the transfer is complete.

-

error - Emitted when an error occurs during connection or data transfer.

-

connected - Emitted when the host successfully connects to a client.

-

disconnected - Emitted when the connection is closed.

-

receive - Emitted to signal the start of receiving the file(s).

-

progress - Emitted to signal the progress of receiving the file(s).

-

endpoint-created - Emitted when the endpoint for a new potential connection is created.

-

Hierarchy

  • EventEmitter<Listeners>
    • FlottformFileInputHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformFileInputHost.

    -

    Parameters

    • __namedParameters: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          inputField: HTMLInputElement;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
          styles?: Styles;
          theme?: ((myself: FlottformFileInputHost) => void);
      }
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL
      • inputField: HTMLInputElement
      • Optionallogger?: Logger
      • OptionalpollTimeForIceInMs?: number
      • OptionalrtcConfiguration?: RTCConfiguration
      • Optionalstyles?: Styles
      • Optionaltheme?: ((myself: FlottformFileInputHost) => void)

    Returns FlottformFileInputHost

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelHost.

    -

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Retrieves the connection link (URL) used for establishing a peer connection.

    -

    Returns string

    The link for the peer connection.

    -
  • Retrieves the QR code used for establishing a peer connection.

    -

    Returns string

    The QR code for the peer connection.

    -
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelHost.

    -

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html b/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html deleted file mode 100644 index 0a6e47b..0000000 --- a/flottform/forms/docs/classes/flottform_text_input_client.FlottformTextInputClient.html +++ /dev/null @@ -1,24 +0,0 @@ -FlottformTextInputClient | @flottform/forms - v0.0.1

The FlottformTextInputClient uses the FlottformChannelClient to establish a WebRTC connection and send text data to a peer. -It listens to various events emitted by FlottformChannelClient to manage connection states and the sending process.

-

Hierarchy

  • EventEmitter<Listeners>
    • FlottformTextInputClient

Constructors

Methods

Constructors

  • Creates an instance of FlottformTextInputClient.

    -

    Parameters

    • config: {
          endpointId: string;
          flottformApi: string;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
      }

      The configuration for setting up the text input client.

      -
      • endpointId: string

        The unique ID for the WebRTC endpoint.

        -
      • flottformApi: string

        The API URL for retrieving connection information.

        -
      • Optionallogger?: Logger

        Logger for capturing logs and errors.

        -
      • OptionalpollTimeForIceInMs?: number

        The polling time for ICE candidates in milliseconds.

        -
      • OptionalrtcConfiguration?: RTCConfiguration

        WebRTC configuration settings.

        -

    Returns FlottformTextInputClient

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelClient.

    -

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Sends the provided text over the WebRTC connection. -The text is sent as a single chunk since most texts will not exceed 16 KB in size.

    -

    Parameters

    • text: string

      The text data to be sent.

      -

    Returns void

    sending - Emitted when the text starts to be sent.

    -

    done - Emitted when the text sending process is completed.

    -
  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelClient.

    -

    Returns void

diff --git a/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html b/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html deleted file mode 100644 index e4bfc25..0000000 --- a/flottform/forms/docs/classes/flottform_text_input_host.FlottformTextInputHost.html +++ /dev/null @@ -1,25 +0,0 @@ -FlottformTextInputHost | @flottform/forms - v0.0.1

The FlottformTextInputHost manages the server side (host) of the WebRTC connection, listening for client connections and receiving text data -It uses the FlottformChannelHost to establish and maintain the WebRTC connection.

-

Hierarchy

  • EventEmitter<Listeners>
    • FlottformTextInputHost

Constructors

Methods

Constructors

  • Creates an instance of FlottformTextInputHost.

    -

    Parameters

    • config: {
          createClientUrl: ((params: {
              endpointId: string;
          }) => Promise<string>);
          flottformApi: string | URL;
          logger?: Logger;
          pollTimeForIceInMs?: number;
          rtcConfiguration?: RTCConfiguration;
          theme?: ((myself: FlottformTextInputHost) => void);
      }

      The configuration for setting up the text input host.

      -
      • createClientUrl: ((params: {
            endpointId: string;
        }) => Promise<string>)

        A function to create the client URL with an endpoint ID.

        -
          • (params): Promise<string>
          • Parameters

            • params: {
                  endpointId: string;
              }
              • endpointId: string

            Returns Promise<string>

      • flottformApi: string | URL

        The API URL for retrieving connection information.

        -
      • Optionallogger?: Logger

        Logger for capturing logs and errors.

        -
      • OptionalpollTimeForIceInMs?: number

        The polling time for ICE candidates in milliseconds.

        -
      • OptionalrtcConfiguration?: RTCConfiguration

        WebRTC configuration settings.

        -
      • Optionaltheme?: ((myself: FlottformTextInputHost) => void)

        Optional theme customization function.

        -

    Returns FlottformTextInputHost

Methods

  • Closes the WebRTC connection by invoking the close method of the underlying FlottformChannelHost.

    -

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • Rest...args: Listeners[K]

    Returns void

  • Retrieves the link (URL) for the client to connect to the WebRTC host.

    -

    Returns string

    The link for the client to connect. If the link is unavailable, an error is logged.

    -
  • Retrieves the QR code data for the client to scan and connect to the WebRTC host.

    -

    Returns string

    The QR code data for client connection. If the QR code is unavailable, an error is logged.

    -
  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Type Parameters

    • K extends keyof Listeners

    Parameters

    • eventName: K
    • listener: Listener<Listeners[K]>

    Returns void

  • Starts the WebRTC connection by invoking the start method of the underlying FlottformChannelHost.

    -

    Returns void

diff --git a/flottform/forms/docs/index.html b/flottform/forms/docs/index.html deleted file mode 100644 index 1e91194..0000000 --- a/flottform/forms/docs/index.html +++ /dev/null @@ -1,70 +0,0 @@ -@flottform/forms - v0.0.1

@flottform/forms - v0.0.1

flottform

A better UX for file uploads #build-in-public

-

Why no license (yet)? We want to share our progress, but we are not sure about the business model. We allow you to see our theories and learn from how we build it, but it's not allowed to use the produced code (yet). Please wait for the next updates for more information about how we want to handle this. If you have questions or feedback, feel free to reach out to us through our GitHub discussions board.

-

We are about to explore ideas how we can solve the issue we described in detail about UX challenges in web forms if you have a file on another device.

-
    -
  • [x] Build a server that allows file uploads from a form -
      -
    • [x] Build a server that accepts files
    • -
    • [x] Build a web form with an input field for files
    • -
    -
  • -
  • [ ] Let device A create a URL that allows connecting another device through WebRTC -
      -
    • [ ] Allow only one connection per URL
    • -
    • [ ] Establish a WebRTC connection between devices
    • -
    • [ ] Have an upload field on that URL for device B
    • -
    • [ ] Uploading to that URL populates the file field on device A
    • -
    -
  • -
-
    -
  • [ ] Make it easier to use by creating QR codes
  • -
  • [ ] Make it possible for form developers to add our feature with a single script
  • -
  • [ ] Find a business model that works for everybody
  • -
  • [ ] Find a license that fits our needs
  • -
  • [ ] Create a logo
  • -
  • [ ] Build a website
  • -
-

These are the necessary steps to update the code on the remote server to the latest version.

-
    -
  1. Connect to the remote server:
  2. -
-
ssh <email@remote.server>
-
- -
    -
  1. Navigate to the Target Repository:
  2. -
-
cd /path/to/your/repository/in/remote/server
-
- -
    -
  1. Check the Current Branch Used for Production:
  2. -
-
git status
-
- -

Ensure you are on the correct branch used for production. If not, switch to the appropriate branch:

-
git checkout <production-branch>
-
- -
    -
  1. Fetch all of the new changes:
  2. -
-
git fetch --all
-
- -
    -
  1. [Optional] Update the Environment Variables:
  2. -
-

If there are changes required in the environment variables, update the .env file accordingly.

-
nano .env
-
- -
    -
  1. Stop & re-run the containers:
  2. -
-
docker compose down && git pull && docker compose build && docker compose up -d && docker volume prune —-filter all=1 —-force && docker compose logs -f
-
- -
diff --git a/flottform/forms/docs/modules/flottform_channel_client.html b/flottform/forms/docs/modules/flottform_channel_client.html deleted file mode 100644 index ff28c58..0000000 --- a/flottform/forms/docs/modules/flottform_channel_client.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-channel-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_channel_host.html b/flottform/forms/docs/modules/flottform_channel_host.html deleted file mode 100644 index a27dc26..0000000 --- a/flottform/forms/docs/modules/flottform_channel_host.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-channel-host | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_file_input_client.html b/flottform/forms/docs/modules/flottform_file_input_client.html deleted file mode 100644 index 9c08173..0000000 --- a/flottform/forms/docs/modules/flottform_file_input_client.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-file-input-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_file_input_host.html b/flottform/forms/docs/modules/flottform_file_input_host.html deleted file mode 100644 index 1cca652..0000000 --- a/flottform/forms/docs/modules/flottform_file_input_host.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-file-input-host | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_text_input_client.html b/flottform/forms/docs/modules/flottform_text_input_client.html deleted file mode 100644 index 921be71..0000000 --- a/flottform/forms/docs/modules/flottform_text_input_client.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-text-input-client | @flottform/forms - v0.0.1
diff --git a/flottform/forms/docs/modules/flottform_text_input_host.html b/flottform/forms/docs/modules/flottform_text_input_host.html deleted file mode 100644 index 04f04e2..0000000 --- a/flottform/forms/docs/modules/flottform_text_input_host.html +++ /dev/null @@ -1,2 +0,0 @@ -flottform-text-input-host | @flottform/forms - v0.0.1
From 92c7c623beee109f55a1217737d0f9d9a92895bd Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Tue, 24 Sep 2024 09:47:38 +0200 Subject: [PATCH 4/9] Add .gitignore file to the module 'forms' Signed-off-by: nidhal-labidi --- flottform/forms/.gitignore | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 flottform/forms/.gitignore diff --git a/flottform/forms/.gitignore b/flottform/forms/.gitignore new file mode 100644 index 0000000..c4f456b --- /dev/null +++ b/flottform/forms/.gitignore @@ -0,0 +1,14 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +.vercel +.output +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +/test-results +/docs From b7b84e0535c19bf6f8652f1108d2832ff7cd7e13 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Tue, 24 Sep 2024 16:56:33 +0200 Subject: [PATCH 5/9] fix: remove theme function since we have a new default ui Signed-off-by: nidhal-labidi --- flottform/forms/src/flottform-file-input-host.ts | 4 ---- flottform/forms/src/flottform-text-input-host.ts | 1 - 2 files changed, 5 deletions(-) diff --git a/flottform/forms/src/flottform-file-input-host.ts b/flottform/forms/src/flottform-file-input-host.ts index e8545c1..524a0b1 100644 --- a/flottform/forms/src/flottform-file-input-host.ts +++ b/flottform/forms/src/flottform-file-input-host.ts @@ -66,7 +66,6 @@ export class FlottformFileInputHost extends BaseInputHost { * @param {HTMLInputElement} - The input field element where files will be added. * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. - * @param {(host: FlottformFileInputHost) => void} [config.theme] - A function to apply themes or styles. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. * @param {Styles} [config.styles] - Optional styles to be applied. */ @@ -76,7 +75,6 @@ export class FlottformFileInputHost extends BaseInputHost { inputField, rtcConfiguration = DEFAULT_WEBRTC_CONFIG, pollTimeForIceInMs = POLL_TIME_IN_MS, - theme, logger = console }: { flottformApi: string | URL; @@ -84,7 +82,6 @@ export class FlottformFileInputHost extends BaseInputHost { inputField: HTMLInputElement; rtcConfiguration?: RTCConfiguration; pollTimeForIceInMs?: number; - theme?: (myself: FlottformFileInputHost) => void; logger?: Logger; }) { super(); @@ -99,7 +96,6 @@ export class FlottformFileInputHost extends BaseInputHost { this.logger = logger; this.registerListeners(); - theme && theme(this); } /** diff --git a/flottform/forms/src/flottform-text-input-host.ts b/flottform/forms/src/flottform-text-input-host.ts index bd4a302..fee978d 100644 --- a/flottform/forms/src/flottform-text-input-host.ts +++ b/flottform/forms/src/flottform-text-input-host.ts @@ -30,7 +30,6 @@ export class FlottformTextInputHost extends BaseInputHost { * @param {Function} config.createClientUrl - A function to create the client URL with an endpoint ID. * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. - * @param {Function} [config.theme] - Optional theme customization function. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. */ constructor({ From 55520df5220c377f7a3ffa353cd5541800541a6e Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Wed, 25 Sep 2024 13:54:19 +0200 Subject: [PATCH 6/9] Add documentation for default-component Signed-off-by: nidhal-labidi --- flottform/forms/src/default-component.ts | 98 +++++++++++++++++++++++- flottform/forms/typedoc.json | 2 +- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/flottform/forms/src/default-component.ts b/flottform/forms/src/default-component.ts index b1fc184..61408c0 100644 --- a/flottform/forms/src/default-component.ts +++ b/flottform/forms/src/default-component.ts @@ -40,8 +40,66 @@ const createLinkAndQrCode = (qrCode: string, link: string) => { createChannelLinkWithOffer }; }; + +/** + * Creates and attaches a default Flottform UI component to the specified anchor element. This UI acts as an intermediary to facilitate WebRTC-based peer-to-peer connections between two devices, allowing one peer to send data (files or text) to the other. + * + * Developers can customize aspects of the UI, such as the button text, descriptions, and CSS classes, while using the default behavior provided by the function to quickly set up the peer-to-peer data transfer mechanism. + * + * The generated UI component will be attached as a child to `flottformAnchorElement`. The UI includes a dialog with a QR code or link that the second peer can use to connect and upload files/text to the main form. + * + * The dialog also shows the progress of receiving the file or text from the other device or any errors that can happen. + * + * The returned object allows for further interactions, such as adding the UI necessary to handle receiving a file or text, and retrieving all existing Flottform items within the UI. + * + * @param {Object} params - Configuration options for setting up the Flottform component. + * @param {HTMLElement} params.flottformAnchorElement - The HTML element to which the Flottform component will be attached. It determines where the UI will be built on the page. + * @param {string} [params.id] - Optional ID for the UI used for File of Text element. + * @param {HTMLElement} [params.flottformRootElement] - An optional root element to use. If not provided, a new default root element (a `div` with the class `flottform-root`) will be created. + * @param {string} [params.additionalComponentClass] - Optional additional class to add for custom styling of the component. + * @param {string} [params.flottformRootTitle] - Optional title to set for the Flottform root element This is the text displayed on the button that opens the dialog (with the class `flottform-root-opener-button`). + * @param {string} [params.flottformRootDescription] - Optional description text shown inside the dialog when it is opened. It provides context for the user about what the Flottform component does (e.g., "Receive files from other devices"). + * + * @returns {Object} - Returns an object with methods to interact with the Flottform component. + * @returns {HTMLElement} returns.flottformRoot - The root element of the Flottform UI. + * @returns {Function} returns.createFileItem - Function to create an entry in the UI for receiving files from another peer. The entry will show the QR code/link, progress of the file transfer, and handle any errors. + * @returns {Function} returns.createTextItem - Function to create an entry in the UI for receiving text from another peer. Similar to `createFileItem`, it handles text input, progress tracking, and error handling. + * @returns {Function} returns.getAllFlottformItems - Function to retrieve all current Flottform items (file and text entries) in the dialog. + * + * @example + * + * + * const flottformComponent = createDefaultFlottformComponent({ + * flottformAnchorElement: document.getElementById('form-anchor'), + * flottformRootTitle: 'Share Data via Flottform', + * flottformRootDescription: 'This form is powered by Flottform. Upload files or send text from another device using the provided QR code.' + *}); + * + * // Create an entry to receive files + * flottformComponent.createFileItem({ + * flottformApi, // URL of the WebRTC signaling server + * createClientUrl: ({ endpointId }) => `/upload/${endpointId}`, // URL of the client page for file uploads + * inputField: document.querySelector('#fileInput'), // The file input field in the main form + * label: 'Upload Resume', // Label for the file input + * buttonLabel:'Submit File', // Button text for the file input + * onSuccessText: 'File received successfully!' // Success message displayed after the file is received + * }); + * + * // Create an entry to receive text + * flottformComponent.createTextItem({ + * flottformApi, // URL of the WebRTC signaling server + * createClientUrl: ({ endpointId }) => `/text/${endpointId}`, // URL of the client page for sending text + * label: 'Enter your message', // Label for the text input + * buttonLabel: 'Send Message', // Button text for the text input + * onErrorText: (error) => `Failed to receive text: ${error.message}` // Error message if text transfer fails + * }); + * + * // Retrieve all Flottform items in the UI (file and text entries) + * const allItems = flottformComponent.getAllFlottformItems(); + */ export const createDefaultFlottformComponent = ({ flottformAnchorElement, + // @ts-ignore: Unused variable id, flottformRootElement, additionalComponentClass, @@ -74,6 +132,11 @@ export const createDefaultFlottformComponent = ({ flottformAnchorElement.appendChild(flottformRoot); return { flottformRoot, + /** + * Retrieves all existing Flottform items (both file and text entries) in the UI. + * + * @returns {NodeListOf | null} - A NodeList of Flottform input items (file and text entries), or `null` if no items are found. + */ getAllFlottformItems: () => { const flottformInputsList = flottformRoot.querySelector('.flottform-inputs-list'); if (!flottformInputsList) { @@ -82,6 +145,22 @@ export const createDefaultFlottformComponent = ({ } return flottformInputsList.childNodes as NodeListOf; }, + /** + * Creates a UI entry for receiving a file via WebRTC. + * + * @param {Object} params - Configuration options for the file input entry. + * @param {string} params.flottformApi - URL of the WebRTC signaling server. + * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can upload the file. + * @param {HTMLInputElement} params.inputField - The file input field in the main form where the received file will be displayed or processed. + * @param {string} [params.id] - Optional ID for the file input entry. + * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the file input entry. + * @param {string} [params.label] - Optional label text for the file input entry. + * @param {string} [params.buttonLabel] - Optional text for the button that triggers the file reception. + * @param {string | Function} [params.onErrorText] - Optional error message displayed if the file transfer fails. + * @param {string} [params.onSuccessText] - Optional success message displayed after the file is successfully received. + * + * @returns {void} + */ createFileItem: ({ flottformApi, createClientUrl, @@ -137,6 +216,21 @@ export const createDefaultFlottformComponent = ({ onSuccessText }); }, + /** + * Creates a UI entry for receiving text via WebRTC. + * + * @param {Object} params - Configuration options for the text input entry. + * @param {string} params.flottformApi - URL of the WebRTC signaling server. + * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can send the text. + * @param {string} [params.id] - Optional ID for the text input entry. + * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the text input entry. + * @param {string} [params.label] - Optional label text for the text input entry. + * @param {string} [params.buttonLabel] - Optional text for the button that triggers the text reception. + * @param {string | Function} [params.onErrorText] - Optional error message displayed if the text transfer fails. + * @param {string} [params.onSuccessText] - Optional success message displayed after the text is successfully received. + * + * @returns {void} + */ createTextItem: ({ flottformApi, createClientUrl, @@ -227,7 +321,9 @@ const createBaseFlottformItems = ({ }); flottformBaseInputHost.on('error', (error) => { statusInformation.innerHTML = - typeof onErrorText === "function" ? onErrorText(error) : (onErrorText ?? `🚨 An error occured (${error.message}). Please try again`); + typeof onErrorText === 'function' + ? onErrorText(error) + : onErrorText ?? `🚨 An error occured (${error.message}). Please try again`; createChannelButton.innerText = 'Retry'; flottformStateItemsContainer.replaceChildren(statusInformation); flottformStateItemsContainer.appendChild(createChannelButton); diff --git a/flottform/forms/typedoc.json b/flottform/forms/typedoc.json index d796bb9..05989c0 100644 --- a/flottform/forms/typedoc.json +++ b/flottform/forms/typedoc.json @@ -6,7 +6,7 @@ "src/flottform-file-input-host.ts", "src/flottform-text-input-client.ts", "src/flottform-text-input-host.ts", - "src/file4.ts" + "src/default-component.ts" ], "out": "docs", "tsconfig": "./tsconfig.json", From 8eaab45d604c614b557489b66abe283d5c61fd69 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Mon, 21 Oct 2024 16:24:34 +0200 Subject: [PATCH 7/9] update documentation Signed-off-by: nidhal-labidi --- flottform/forms/package.json | 1 + flottform/forms/src/default-component.ts | 92 ++--- .../forms/src/flottform-channel-client.ts | 2 - flottform/forms/src/flottform-channel-host.ts | 1 - .../forms/src/flottform-file-input-client.ts | 1 - .../forms/src/flottform-file-input-host.ts | 1 - .../forms/src/flottform-text-input-client.ts | 1 - .../forms/src/flottform-text-input-host.ts | 1 - pnpm-lock.yaml | 342 +++++++++++++----- 9 files changed, 309 insertions(+), 133 deletions(-) diff --git a/flottform/forms/package.json b/flottform/forms/package.json index ad0cbc7..5d826f3 100644 --- a/flottform/forms/package.json +++ b/flottform/forms/package.json @@ -49,6 +49,7 @@ "@vitest/browser": "^2.1.2", "globals": "^15.10.0", "qrcode": "^1.5.4", + "typedoc": "^0.26.10", "vite": "^5.4.8", "vite-plugin-dts": "^4.2.3", "vitest": "^2.1.2", diff --git a/flottform/forms/src/default-component.ts b/flottform/forms/src/default-component.ts index 2e7c9f4..528d1f5 100644 --- a/flottform/forms/src/default-component.ts +++ b/flottform/forms/src/default-component.ts @@ -3,6 +3,54 @@ import { FlottformTextInputHost } from './flottform-text-input-host'; import { BaseInputHost, BaseListeners } from './internal'; import { FlottformCreateFileParams, FlottformCreateTextParams } from './types'; +/** + * The result object returned when creating a Flottform component. + * Contains the root element and methods to interact with the component. + */ +export type DefaultFlottformComponentResult = { + /** The root HTML element of the Flottform component */ + flottformRoot: HTMLElement; + /** + * Retrieves all existing Flottform items (both file and text entries) in the UI. + * + * @returns {NodeListOf | null} - A NodeList of Flottform input items (file and text entries), or `null` if no items are found. + */ + getAllFlottformItems: () => NodeListOf | null; + /** + * Creates a UI entry for receiving a file via WebRTC. + * + * @param {Object} params - Configuration options for the file input entry. + * @param {string} params.flottformApi - URL of the WebRTC signaling server. + * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can upload the file. + * @param {HTMLInputElement} params.inputField - The file input field in the main form where the received file will be displayed or processed. + * @param {string} [params.id] - Optional ID for the file input entry. + * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the file input entry. + * @param {string} [params.label] - Optional label text for the file input entry. + * @param {string} [params.buttonLabel] - Optional text for the button that triggers the file reception. + * @param {string | Function} [params.onErrorText] - Optional error message displayed if the file transfer fails. + * @param {string} [params.onSuccessText] - Optional success message displayed after the file is successfully received. + * + * @returns {void} + */ + createFileItem: (params: FlottformCreateFileParams) => void; + /** + * Creates a UI entry for receiving text via WebRTC. + * + * @param {Object} params - Configuration options for the text input entry. + * @param {string} params.flottformApi - URL of the WebRTC signaling server. + * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can send the text. + * @param {string} [params.id] - Optional ID for the text input entry. + * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the text input entry. + * @param {string} [params.label] - Optional label text for the text input entry. + * @param {string} [params.buttonLabel] - Optional text for the button that triggers the text reception. + * @param {string | Function} [params.onErrorText] - Optional error message displayed if the text transfer fails. + * @param {string} [params.onSuccessText] - Optional success message displayed after the text is successfully received. + * + * @returns {void} + */ + createTextItem: (params: FlottformCreateTextParams) => void; +}; + const openInputsList = () => { const flottformElementsContainerWrapper: HTMLDivElement = document.querySelector( '.flottform-elements-container-wrapper' @@ -54,7 +102,6 @@ const createLinkAndQrCode = (qrCode: string, link: string) => { * * @param {Object} params - Configuration options for setting up the Flottform component. * @param {HTMLElement} params.flottformAnchorElement - The HTML element to which the Flottform component will be attached. It determines where the UI will be built on the page. - * @param {string} [params.id] - Optional ID for the UI used for File of Text element. * @param {HTMLElement} [params.flottformRootElement] - An optional root element to use. If not provided, a new default root element (a `div` with the class `flottform-root`) will be created. * @param {string} [params.additionalComponentClass] - Optional additional class to add for custom styling of the component. * @param {string} [params.flottformRootTitle] - Optional title to set for the Flottform root element This is the text displayed on the button that opens the dialog (with the class `flottform-root-opener-button`). @@ -109,12 +156,7 @@ export const createDefaultFlottformComponent = ({ additionalComponentClass?: string; flottformRootTitle?: string; flottformRootDescription?: string; -}): { - flottformRoot: HTMLElement; - createFileItem: (params: FlottformCreateFileParams) => void; - createTextItem: (params: FlottformCreateTextParams) => void; - getAllFlottformItems: () => NodeListOf | null; -} => { +}): DefaultFlottformComponentResult => { const flottformRoot: HTMLElement = flottformRootElement ?? document.querySelector('.flottform-root') ?? @@ -129,11 +171,6 @@ export const createDefaultFlottformComponent = ({ flottformAnchorElement.appendChild(flottformRoot); return { flottformRoot, - /** - * Retrieves all existing Flottform items (both file and text entries) in the UI. - * - * @returns {NodeListOf | null} - A NodeList of Flottform input items (file and text entries), or `null` if no items are found. - */ getAllFlottformItems: () => { const flottformInputsList = flottformRoot.querySelector('.flottform-inputs-list'); if (!flottformInputsList) { @@ -142,22 +179,6 @@ export const createDefaultFlottformComponent = ({ } return flottformInputsList.childNodes as NodeListOf; }, - /** - * Creates a UI entry for receiving a file via WebRTC. - * - * @param {Object} params - Configuration options for the file input entry. - * @param {string} params.flottformApi - URL of the WebRTC signaling server. - * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can upload the file. - * @param {HTMLInputElement} params.inputField - The file input field in the main form where the received file will be displayed or processed. - * @param {string} [params.id] - Optional ID for the file input entry. - * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the file input entry. - * @param {string} [params.label] - Optional label text for the file input entry. - * @param {string} [params.buttonLabel] - Optional text for the button that triggers the file reception. - * @param {string | Function} [params.onErrorText] - Optional error message displayed if the file transfer fails. - * @param {string} [params.onSuccessText] - Optional success message displayed after the file is successfully received. - * - * @returns {void} - */ createFileItem: ({ flottformApi, createClientUrl, @@ -213,21 +234,6 @@ export const createDefaultFlottformComponent = ({ onSuccessText }); }, - /** - * Creates a UI entry for receiving text via WebRTC. - * - * @param {Object} params - Configuration options for the text input entry. - * @param {string} params.flottformApi - URL of the WebRTC signaling server. - * @param {Function} params.createClientUrl - A function that returns the URL where the second peer can send the text. - * @param {string} [params.id] - Optional ID for the text input entry. - * @param {string} [params.additionalItemClasses] - Optional additional CSS classes for styling the text input entry. - * @param {string} [params.label] - Optional label text for the text input entry. - * @param {string} [params.buttonLabel] - Optional text for the button that triggers the text reception. - * @param {string | Function} [params.onErrorText] - Optional error message displayed if the text transfer fails. - * @param {string} [params.onSuccessText] - Optional success message displayed after the text is successfully received. - * - * @returns {void} - */ createTextItem: ({ flottformApi, createClientUrl, diff --git a/flottform/forms/src/flottform-channel-client.ts b/flottform/forms/src/flottform-channel-client.ts index 1122b34..c775e90 100644 --- a/flottform/forms/src/flottform-channel-client.ts +++ b/flottform/forms/src/flottform-channel-client.ts @@ -60,7 +60,6 @@ export class FlottformChannelClient extends EventEmitter { * * @param {endpointId} - The unique identifier of the endpoint to connect to. * @param {flottformApi} - The API endpoint for retrieving connection information. - * @param {rtcConfiguration} - Optional RTC configuration for WebRTC connection. * @param {pollTimeForIceInMs} - Optional time in milliseconds for polling ICE candidates. * @param {logger} - Optional logger for logging connection events (default: `console`). */ @@ -92,7 +91,6 @@ export class FlottformChannelClient extends EventEmitter { /** * Starts the WebRTC connection process. The connection is not established until this method is called. - * */ start = async () => { if (this.openPeerConnection) { diff --git a/flottform/forms/src/flottform-channel-host.ts b/flottform/forms/src/flottform-channel-host.ts index a000a7c..c5e776c 100644 --- a/flottform/forms/src/flottform-channel-host.ts +++ b/flottform/forms/src/flottform-channel-host.ts @@ -47,7 +47,6 @@ export class FlottformChannelHost extends EventEmitter { * @param {Object} config - The configuration for setting up the channel for the host. * @param {flottformApi} - The API endpoint for retrieving connection information. * @param {createClientUrl} - A function that generates the client URL given an endpoint ID. - * @param {rtcConfiguration} - The RTC configuration for the WebRTC connection. * @param {pollTimeForIceInMs} - The time interval (in ms) for polling ICE candidates. * @param {logger} - Optional logger for logging connection events. */ diff --git a/flottform/forms/src/flottform-file-input-client.ts b/flottform/forms/src/flottform-file-input-client.ts index 37be1bd..1580d25 100644 --- a/flottform/forms/src/flottform-file-input-client.ts +++ b/flottform/forms/src/flottform-file-input-client.ts @@ -48,7 +48,6 @@ export class FlottformFileInputClient extends EventEmitter { * @param {string} - The unique ID for the WebRTC endpoint. * @param {HTMLInputElement} - The input field element where files are selected for transfer. * @param {string} - The API URL for retrieving connection information. - * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. */ diff --git a/flottform/forms/src/flottform-file-input-host.ts b/flottform/forms/src/flottform-file-input-host.ts index c06a65c..eac8f65 100644 --- a/flottform/forms/src/flottform-file-input-host.ts +++ b/flottform/forms/src/flottform-file-input-host.ts @@ -56,7 +56,6 @@ export class FlottformFileInputHost extends BaseInputHost { * @param {string | URL} - The API URL for retrieving connection information. * @param {(params: { endpointId: string }) => Promise} - A function to generate the client URL given an endpoint ID. * @param {HTMLInputElement} - The input field element where files will be added. - * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. * @param {Styles} [config.styles] - Optional styles to be applied. diff --git a/flottform/forms/src/flottform-text-input-client.ts b/flottform/forms/src/flottform-text-input-client.ts index c0d2df9..cf0c8dd 100644 --- a/flottform/forms/src/flottform-text-input-client.ts +++ b/flottform/forms/src/flottform-text-input-client.ts @@ -27,7 +27,6 @@ export class FlottformTextInputClient extends EventEmitter { * @param {Object} config - The configuration for setting up the text input client. * @param {string} config.endpointId - The unique ID for the WebRTC endpoint. * @param {string} config.flottformApi - The API URL for retrieving connection information. - * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. */ diff --git a/flottform/forms/src/flottform-text-input-host.ts b/flottform/forms/src/flottform-text-input-host.ts index c4ecc6f..85934b1 100644 --- a/flottform/forms/src/flottform-text-input-host.ts +++ b/flottform/forms/src/flottform-text-input-host.ts @@ -20,7 +20,6 @@ export class FlottformTextInputHost extends BaseInputHost { * @param {Object} config - The configuration for setting up the text input host. * @param {string | URL} config.flottformApi - The API URL for retrieving connection information. * @param {Function} config.createClientUrl - A function to create the client URL with an endpoint ID. - * @param {RTCConfiguration} [config.rtcConfiguration=DEFAULT_WEBRTC_CONFIG] - WebRTC configuration settings. * @param {number} [config.pollTimeForIceInMs=POLL_TIME_IN_MS] - The polling time for ICE candidates in milliseconds. * @param {Logger} [config.logger=console] - Logger for capturing logs and errors. */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45c1c8e..86562e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.7 - version: 3.2.7(prettier@3.3.3)(svelte@4.2.19) + version: 3.2.7(prettier@3.3.3)(svelte@5.0.0-next.262) prettier-plugin-tailwindcss: specifier: ^0.6.8 version: 0.6.8(prettier-plugin-svelte@3.2.7)(prettier@3.3.3) @@ -134,6 +134,9 @@ importers: qrcode: specifier: ^1.5.4 version: 1.5.4 + typedoc: + specifier: ^0.26.10 + version: 0.26.10(typescript@5.6.2) vite: specifier: ^5.4.8 version: 5.4.8 @@ -702,14 +705,14 @@ packages: resolution: {integrity: sha512-g97nQtuEMVlW95xKCZuDun4gSxmBOxf+7yfValqOwATvJL/98RkCacEsBgJlFNtWxO0+FkmoMl3b9kvZpyQ6VA==} dev: true - /@fontsource/unbounded@5.0.21: - resolution: {integrity: sha512-XrmmnUI13/ZBNcylDrILo5LZzGpKjMBTOSk4JIi9lhX2Q58aJDL7typQrOSKYLXSHZjwBFrtK4asnuwRfCt3eA==} - dev: true - /@fontsource/roboto@5.1.0: resolution: {integrity: sha512-cFRRC1s6RqPygeZ8Uw/acwVHqih8Czjt6Q0MwoUoDe9U3m4dH1HmNDRBZyqlMSFwgNAUKgFImncKdmDHyKpwdg==} dev: true + /@fontsource/unbounded@5.0.21: + resolution: {integrity: sha512-XrmmnUI13/ZBNcylDrILo5LZzGpKjMBTOSk4JIi9lhX2Q58aJDL7typQrOSKYLXSHZjwBFrtK4asnuwRfCt3eA==} + dev: true + /@humanfs/core@0.19.0: resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} engines: {node: '>=18.18.0'} @@ -876,10 +879,6 @@ packages: strict-event-emitter: 0.5.1 dev: true - /@microsoft/tsdoc@0.15.0: - resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - dev: true - /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1198,6 +1197,43 @@ packages: - '@types/node' dev: true + /@shikijs/core@1.22.0: + resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} + dependencies: + '@shikijs/engine-javascript': 1.22.0 + '@shikijs/engine-oniguruma': 1.22.0 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + dev: true + + /@shikijs/engine-javascript@1.22.0: + resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} + dependencies: + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 + dev: true + + /@shikijs/engine-oniguruma@1.22.0: + resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} + dependencies: + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + dev: true + + /@shikijs/types@1.22.0: + resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + dev: true + + /@shikijs/vscode-textmate@9.3.0: + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + dev: true + /@sveltejs/adapter-node@5.2.5(@sveltejs/kit@2.6.2): resolution: {integrity: sha512-FVeysFqeIlKFpDF1Oj38gby34f6uA9FuXnV330Z0RHmSyOR9JzJs70/nFKy1Ue3fWtf7S0RemOrP66Vr9Jcmew==} peerDependencies: @@ -1206,7 +1242,7 @@ packages: '@rollup/plugin-commonjs': 28.0.0(rollup@4.24.0) '@rollup/plugin-json': 6.1.0(rollup@4.24.0) '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.0) - '@sveltejs/kit': 2.6.2(@sveltejs/vite-plugin-svelte@3.1.2)(svelte@5.0.0-next.262)(vite@5.4.8) + '@sveltejs/kit': 2.6.2(@sveltejs/vite-plugin-svelte@3.1.2)(svelte@5.0.0-next.136)(vite@5.4.8) rollup: 4.24.0 dev: true @@ -1390,6 +1426,12 @@ packages: resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -1400,6 +1442,12 @@ packages: '@types/geojson': 7946.0.14 dev: true + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/mute-stream@0.0.4: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: @@ -1440,6 +1488,10 @@ packages: resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} dev: true + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: true + /@types/which@2.0.2: resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} dev: true @@ -1460,6 +1512,7 @@ packages: dependencies: '@types/node': 20.16.10 dev: true + optional: true /@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0)(eslint@9.12.0)(typescript@5.6.2): resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==} @@ -1587,6 +1640,10 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.8): resolution: {integrity: sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==} engines: {node: '>=14.6.0'} @@ -2208,6 +2265,10 @@ packages: resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} dev: true + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + /chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -2241,6 +2302,14 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + /check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -2318,16 +2387,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.12.1 - estree-walker: 3.0.3 - periscopic: 3.1.0 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2349,6 +2408,10 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: true + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2441,14 +2504,6 @@ packages: resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} dev: true - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - dev: true - /css-value@0.0.1: resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} dev: true @@ -2537,6 +2592,12 @@ packages: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} dev: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: true + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true @@ -2767,13 +2828,6 @@ packages: - ts-node dev: true - /eslint-plugin-tsdoc@0.3.0: - resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} - dependencies: - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - dev: true - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3270,6 +3324,10 @@ packages: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} dev: true + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: true + /htmlfy@0.2.1: resolution: {integrity: sha512-HoomFHQ3av1uhq+7FxJTq4Ns0clAD+tGbQNrSd0WFY3UAjjUk6G3LaWEqdgmIXYkY4pexZiyZ3ykZJhQlM0J5A==} dev: true @@ -3565,6 +3623,12 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + dependencies: + uc.micro: 2.1.0 + dev: true + /local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -3646,6 +3710,10 @@ packages: engines: {node: '>=12'} dev: true + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true + /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -3657,8 +3725,34 @@ packages: '@jridgewell/sourcemap-codec': 1.5.0 dev: true - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + /markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + dev: true + + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: true + + /mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} dev: true /merge2@1.4.1: @@ -3666,6 +3760,33 @@ packages: engines: {node: '>= 8'} dev: true + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: true + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: true + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: true + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: true + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: true + /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3841,6 +3962,12 @@ packages: wrappy: 1.0.2 dev: true + /oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + dependencies: + regex: 4.3.3 + dev: true + /optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3991,14 +4118,6 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 - dev: true - /picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} dev: true @@ -4157,16 +4276,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@4.2.19): - resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} - peerDependencies: - prettier: ^3.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - dependencies: - prettier: 3.3.3 - svelte: 4.2.19 - dev: true - /prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.0.0-next.136): resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} peerDependencies: @@ -4243,7 +4352,7 @@ packages: optional: true dependencies: prettier: 3.3.3 - prettier-plugin-svelte: 3.2.7(prettier@3.3.3)(svelte@4.2.19) + prettier-plugin-svelte: 3.2.7(prettier@3.3.3)(svelte@5.0.0-next.262) dev: true /prettier@3.3.3: @@ -4275,6 +4384,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + dev: true + /proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -4398,6 +4511,10 @@ packages: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: true + /regex@4.3.3: + resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + dev: true + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4545,14 +4662,14 @@ packages: engines: {node: '>=8'} dev: true - /shiki@1.17.7: - resolution: {integrity: sha512-Zf6hNtWhFyF4XP5OOsXkBTEx9JFPiN0TQx4wSe+Vqeuczewgk2vT4IZhF4gka55uelm052BD5BaHavNqUNZd+A==} + /shiki@1.22.0: + resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==} dependencies: - '@shikijs/core': 1.17.7 - '@shikijs/engine-javascript': 1.17.7 - '@shikijs/engine-oniguruma': 1.17.7 - '@shikijs/types': 1.17.7 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/core': 1.22.0 + '@shikijs/engine-javascript': 1.22.0 + '@shikijs/engine-oniguruma': 1.22.0 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 dev: true @@ -4609,6 +4726,10 @@ packages: requiresBuild: true dev: true + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: true + /spacetrim@0.11.39: resolution: {integrity: sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==} dev: true @@ -4848,26 +4969,6 @@ packages: svelte: 5.0.0-next.262 dev: true - /svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 - acorn: 8.12.1 - aria-query: 5.3.2 - axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 - locate-character: 3.0.0 - magic-string: 0.30.11 - periscopic: 3.1.0 - dev: true - /svelte@5.0.0-next.136: resolution: {integrity: sha512-M3jHAIfWZ7K+hjZdvu2p53ZtWE843yubxJfjxeQw9XiwMYG5z6quCA5u8r23GrxAp20JBl36B6ucbZvLUf0Z/g==} engines: {node: '>=18'} @@ -5039,6 +5140,10 @@ packages: url-parse: 1.5.10 dev: true + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + /ts-api-utils@1.3.0(typescript@5.6.2): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -5083,6 +5188,21 @@ packages: engines: {node: '>=16'} dev: true + /typedoc@0.26.10(typescript@5.6.2): + resolution: {integrity: sha512-xLmVKJ8S21t+JeuQLNueebEuTVphx6IrP06CdV7+0WVflUSW3SPmR+h1fnWVdAR/FQePEgsSWCUHXqKKjzuUAw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + dependencies: + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + shiki: 1.22.0 + typescript: 5.6.2 + yaml: 2.5.1 + dev: true + /typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} @@ -5095,6 +5215,10 @@ packages: hasBin: true dev: true + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + dev: true + /ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} dev: true @@ -5115,6 +5239,39 @@ packages: engines: {node: '>=18.17'} dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + dev: true + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: true + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -5167,6 +5324,20 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + dev: true + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + dev: true + /vite-node@2.1.2: resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5513,6 +5684,7 @@ packages: /yaml@2.5.1: resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} hasBin: true dev: true @@ -5592,3 +5764,7 @@ packages: /zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} dev: true + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true From 0090a4dfe46bbd5656599073c0a68862c953b005 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Mon, 21 Oct 2024 18:53:59 +0200 Subject: [PATCH 8/9] wip: update the sytles of the docs Signed-off-by: nidhal-labidi --- flottform/forms/package.json | 1 + flottform/forms/theme/docs-style.css | 27 +++++++++++++++++++++++++++ flottform/forms/typedoc.json | 4 +++- pnpm-lock.yaml | 17 +++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 flottform/forms/theme/docs-style.css diff --git a/flottform/forms/package.json b/flottform/forms/package.json index 5d826f3..0c48f27 100644 --- a/flottform/forms/package.json +++ b/flottform/forms/package.json @@ -50,6 +50,7 @@ "globals": "^15.10.0", "qrcode": "^1.5.4", "typedoc": "^0.26.10", + "typedoc-material-theme": "^1.1.0", "vite": "^5.4.8", "vite-plugin-dts": "^4.2.3", "vitest": "^2.1.2", diff --git a/flottform/forms/theme/docs-style.css b/flottform/forms/theme/docs-style.css new file mode 100644 index 0000000..348ebb3 --- /dev/null +++ b/flottform/forms/theme/docs-style.css @@ -0,0 +1,27 @@ +/* Dark Theme (manual) */ +:root[data-theme='dark'] { + --color-background: #1a2238 !important; + --md-sys-color-surface: #273c75 !important; +} + +/* Light Theme (manual) */ +:root[data-theme='light'] { + --color-background: #bbdefb !important; + --md-sys-color-surface: #e3f2fd !important; +} + +/* OS Preference: Dark */ +@media (prefers-color-scheme: dark) { + :root { + --color-background: #1a2238 !important; + --md-sys-color-surface: #273c75 !important; + } +} + +/* OS Preference: Light */ +@media (prefers-color-scheme: light) { + :root { + --color-background: #bbdefb !important; + --md-sys-color-surface: #e3f2fd !important; + } +} diff --git a/flottform/forms/typedoc.json b/flottform/forms/typedoc.json index 05989c0..139a8c9 100644 --- a/flottform/forms/typedoc.json +++ b/flottform/forms/typedoc.json @@ -13,5 +13,7 @@ "includeVersion": true, "excludePrivate": true, "excludeProtected": true, - "excludeInternal": true + "excludeInternal": true, + "plugin": ["typedoc-material-theme"], + "customCss": "./theme/docs-style.css" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86562e3..d02a092 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -137,6 +137,9 @@ importers: typedoc: specifier: ^0.26.10 version: 0.26.10(typescript@5.6.2) + typedoc-material-theme: + specifier: ^1.1.0 + version: 1.1.0(typedoc@0.26.10) vite: specifier: ^5.4.8 version: 5.4.8 @@ -823,6 +826,10 @@ packages: '@jridgewell/sourcemap-codec': 1.5.0 dev: true + /@material/material-color-utilities@0.2.7: + resolution: {integrity: sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==} + dev: true + /@microsoft/api-extractor-model@7.29.6: resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} dependencies: @@ -5188,6 +5195,16 @@ packages: engines: {node: '>=16'} dev: true + /typedoc-material-theme@1.1.0(typedoc@0.26.10): + resolution: {integrity: sha512-LLWGVb8w+i+QGnsu/a0JKjcuzndFQt/UeGVOQz0HFFGGocROEHv5QYudIACrj+phL2LDwH05tJx0Ob3pYYH2UA==} + engines: {node: '>=18.0.0', npm: '>=8.6.0'} + peerDependencies: + typedoc: ^0.25.13 || ^0.26.3 + dependencies: + '@material/material-color-utilities': 0.2.7 + typedoc: 0.26.10(typescript@5.6.2) + dev: true + /typedoc@0.26.10(typescript@5.6.2): resolution: {integrity: sha512-xLmVKJ8S21t+JeuQLNueebEuTVphx6IrP06CdV7+0WVflUSW3SPmR+h1fnWVdAR/FQePEgsSWCUHXqKKjzuUAw==} engines: {node: '>= 18'} From ada649521d6d34b9dcb3a07462476a4afef9ae57 Mon Sep 17 00:00:00 2001 From: nidhal-labidi Date: Tue, 22 Oct 2024 12:03:30 +0200 Subject: [PATCH 9/9] fix: change the colors and the font Signed-off-by: nidhal-labidi --- flottform/forms/package.json | 1 + flottform/forms/theme/docs-style.css | 18 ++++++++++++++---- pnpm-lock.yaml | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/flottform/forms/package.json b/flottform/forms/package.json index 0c48f27..335c01a 100644 --- a/flottform/forms/package.json +++ b/flottform/forms/package.json @@ -45,6 +45,7 @@ "devDependencies": { "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.12.0", + "@fontsource/roboto": "^5.1.0", "@types/qrcode": "^1.5.5", "@vitest/browser": "^2.1.2", "globals": "^15.10.0", diff --git a/flottform/forms/theme/docs-style.css b/flottform/forms/theme/docs-style.css index 348ebb3..e4a3dd5 100644 --- a/flottform/forms/theme/docs-style.css +++ b/flottform/forms/theme/docs-style.css @@ -1,13 +1,21 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap'); + +:root { + --font-sans: 'Roboto', 'Space Grotesk', sans-serif !important; +} + /* Dark Theme (manual) */ :root[data-theme='dark'] { --color-background: #1a2238 !important; --md-sys-color-surface: #273c75 !important; + --color-text: white !important; } /* Light Theme (manual) */ :root[data-theme='light'] { - --color-background: #bbdefb !important; - --md-sys-color-surface: #e3f2fd !important; + --color-background: #e1e1e1 !important; + --md-sys-color-surface: #fafafa !important; + --color-text: black !important; } /* OS Preference: Dark */ @@ -15,13 +23,15 @@ :root { --color-background: #1a2238 !important; --md-sys-color-surface: #273c75 !important; + --color-text: white !important; } } /* OS Preference: Light */ @media (prefers-color-scheme: light) { :root { - --color-background: #bbdefb !important; - --md-sys-color-surface: #e3f2fd !important; + --color-background: #e1e1e1 !important; + --md-sys-color-surface: #fafafa !important; + --color-text: black !important; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d02a092..ac6f189 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,6 +122,9 @@ importers: '@eslint/js': specifier: ^9.12.0 version: 9.12.0 + '@fontsource/roboto': + specifier: ^5.1.0 + version: 5.1.0 '@types/qrcode': specifier: ^1.5.5 version: 1.5.5