From 1f863607c3f166791f8d925075a3869a41a2145d Mon Sep 17 00:00:00 2001 From: Ben Schmidt Date: Wed, 8 Feb 2023 13:16:39 -0500 Subject: [PATCH] Add docs --- docs/.nojekyll | 1 + docs/assets/highlight.css | 127 ++++ docs/assets/main.js | 58 ++ docs/assets/search.js | 1 + docs/assets/style.css | 1280 +++++++++++++++++++++++++++++++++++++ docs/classes/default.html | 675 +++++++++++++++++++ docs/index.html | 209 ++++++ docs/modules.html | 48 ++ package-lock.json | 163 +++++ package.json | 10 +- release_notes.md | 9 +- src/deepscatter.ts | 23 +- src/label_rendering.ts | 42 +- src/types.ts | 3 + 14 files changed, 2630 insertions(+), 19 deletions(-) create mode 100644 docs/.nojekyll create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/main.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css create mode 100644 docs/classes/default.html create mode 100644 docs/index.html create mode 100644 docs/modules.html diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/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/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 000000000..92dcc74e9 --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,127 @@ +:root { + --light-hl-0: #000000; + --dark-hl-0: #D4D4D4; + --light-hl-1: #A31515; + --dark-hl-1: #CE9178; + --light-hl-2: #008000; + --dark-hl-2: #6A9955; + --light-hl-3: #795E26; + --dark-hl-3: #DCDCAA; + --light-hl-4: #098658; + --dark-hl-4: #B5CEA8; + --light-hl-5: #800000; + --dark-hl-5: #808080; + --light-hl-6: #800000; + --dark-hl-6: #569CD6; + --light-hl-7: #E50000; + --dark-hl-7: #9CDCFE; + --light-hl-8: #0000FF; + --dark-hl-8: #CE9178; + --light-hl-9: #000000FF; + --dark-hl-9: #D4D4D4; + --light-hl-10: #AF00DB; + --dark-hl-10: #C586C0; + --light-hl-11: #001080; + --dark-hl-11: #9CDCFE; + --light-hl-12: #0000FF; + --dark-hl-12: #569CD6; + --light-hl-13: #000000; + --dark-hl-13: #C8C8C8; + --light-hl-14: #0070C1; + --dark-hl-14: #4FC1FF; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --hl-14: var(--light-hl-14); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --hl-14: var(--dark-hl-14); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --hl-14: var(--light-hl-14); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --hl-14: var(--dark-hl-14); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +.hl-13 { color: var(--hl-13); } +.hl-14 { color: var(--hl-14); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 000000000..d55df0323 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,58 @@ +"use strict"; +"use strict";(()=>{var Qe=Object.create;var ae=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var _e=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Me=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ce(e))!Re.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Pe(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Qe(Oe(t)):{},Me(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var de=_e((ce,he)=>{(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 h=t.utils.clone(n)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(r.slice(a,o),h))}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(ou?h+=2:a==u&&(n+=r[l+1]*i[h+1],l+=2,h+=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 u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,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 l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),m=s.str.charAt(1),v;m in s.node.edges?v=s.node.edges[m]:(v=new t.TokenSet,s.node.edges[m]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+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),u=0;u1?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 ce=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});var le=[];function B(t,e){le.push({selector:e,constructor:t})}var Y=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureFocusedElementVisible(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible())}createComponents(e){le.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()}ensureFocusedElementVisible(){this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null);let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n.tagName!=="SECTION";)n=n.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}};var I=class{constructor(e){this.el=e.el,this.app=e.app}};var J=class{constructor(){this.listeners={}}addEventListener(e,n){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(n)}removeEventListener(e,n){if(!(e in this.listeners))return;let r=this.listeners[e];for(let i=0,s=r.length;i{let n=Date.now();return(...r)=>{n+e-Date.now()<0&&(t(...r),n=Date.now())}};var re=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.navigation=document.querySelector(".col-menu"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.searchInput=document.querySelector("#tsd-search input"),this.searchInput&&this.searchInput.addEventListener("focus",()=>{this.hideShowToolbar()}),this.onResize(),this.onScroll()}triggerResize(){let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let n=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(n)}onScroll(){this.scrollTop=window.scrollY||0;let n=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(n),this.hideShowToolbar()}hideShowToolbar(){let n=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0||!!this.searchInput&&this.searchInput===document.activeElement,n!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.navigation?.classList.toggle("col-menu--hide")),this.lastY=this.scrollTop}},R=re;R.instance=new re;var X=class extends I{constructor(n){super(n);this.anchors=[];this.index=-1;R.instance.addEventListener("resize",()=>this.onResize()),R.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substring(0,n.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let i=r.href;if(i.indexOf("#")==-1||i.substring(0,n.length)!=n)return;let s=i.substring(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=r.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let n;for(let i=0,s=this.anchors.length;ii.position-s.position);let r=new CustomEvent("scroll",{detail:{scrollTop:R.instance.scrollTop}});this.onScroll(r)}onScroll(n){let r=n.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>r;)o-=1;for(;o-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var me=De(de());function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let n=document.querySelector("#tsd-search input"),r=document.querySelector("#tsd-search .results");if(!n||!r)throw new Error("The input field or the result list wrapper was not found");let i=!1;r.addEventListener("mousedown",()=>i=!0),r.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),n.addEventListener("focus",()=>t.classList.add("has-focus")),n.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Fe(t,r,n,s)}function Fe(t,e,n,r){n.addEventListener("input",ue(()=>{He(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?pe(e,-1):s.key==="ArrowDown"?pe(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ae(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=me.Index.load(window.searchData.index))}function He(t,e,n,r){if(Ae(r,t),!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s=i?r.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${fe(u.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=u.classes??"";let m=document.createElement("a");m.href=r.base+u.url,m.innerHTML=l,h.append(m),e.appendChild(h)}}function pe(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(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),e.blur()}}function fe(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(ie(t.substring(s,o)),`${ie(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ie(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function ie(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var F="mousedown",ye="mousemove",j="mouseup",Z={x:0,y:0},ge=!1,se=!1,Be=!1,A=!1,xe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(xe?"is-mobile":"not-mobile");xe&&"ontouchstart"in document.documentElement&&(Be=!0,F="touchstart",ye="touchmove",j="touchend");document.addEventListener(F,t=>{se=!0,A=!1;let e=F=="touchstart"?t.targetTouches[0]:t;Z.y=e.pageY||0,Z.x=e.pageX||0});document.addEventListener(ye,t=>{if(se&&!A){let e=F=="touchstart"?t.targetTouches[0]:t,n=Z.x-(e.pageX||0),r=Z.y-(e.pageY||0);A=Math.sqrt(n*n+r*r)>10}});document.addEventListener(j,()=>{se=!1});document.addEventListener("click",t=>{ge&&(t.preventDefault(),t.stopImmediatePropagation(),ge=!1)});var K=class extends I{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(j,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(j,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){A||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!A&&this.active&&n.target.closest(".col-menu")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var oe;try{oe=localStorage}catch{oe={getItem(){return null},setItem(){}}}var Q=oe;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var ee=class extends I{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var te=class extends I{constructor(n){super(n);this.calculateHeights(),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.textContent.replace(/\s+/g,"-").toLowerCase()}`,this.setLocalStorage(this.fromLocalStorage(),!0),this.summary.addEventListener("click",r=>this.toggleVisibility(r)),this.icon.style.transform=this.getIconRotation()}getIconRotation(n=this.el.open){return`rotate(${n?0:-90}deg)`}calculateHeights(){let n=this.el.open,{position:r,left:i}=this.el.style;this.el.style.position="fixed",this.el.style.left="-9999px",this.el.open=!0,this.expandedHeight=this.el.offsetHeight+"px",this.el.open=!1,this.collapsedHeight=this.el.offsetHeight+"px",this.el.open=n,this.el.style.height=n?this.expandedHeight:this.collapsedHeight,this.el.style.position=r,this.el.style.left=i}toggleVisibility(n){n.preventDefault(),this.el.style.overflow="hidden",this.el.open?this.collapse():this.expand()}expand(n=!0){this.el.open=!0,this.animate(this.collapsedHeight,this.expandedHeight,{opening:!0,duration:n?300:0})}collapse(n=!0){this.animate(this.expandedHeight,this.collapsedHeight,{opening:!1,duration:n?300:0})}animate(n,r,{opening:i,duration:s=300}){if(this.animation)return;let o={duration:s,easing:"ease"};this.animation=this.el.animate({height:[n,r]},o),this.icon.animate({transform:[this.icon.style.transform||this.getIconRotation(!i),this.getIconRotation(i)]},o).addEventListener("finish",()=>{this.icon.style.transform=this.getIconRotation(i)}),this.animation.addEventListener("finish",()=>this.animationEnd(i))}animationEnd(n){this.el.open=n,this.animation=void 0,this.el.style.height="auto",this.el.style.overflow="visible",this.setLocalStorage(n)}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.open}setLocalStorage(n,r=!1){this.fromLocalStorage()===n&&!r||(Q.setItem(this.key,n.toString()),this.el.open=n,this.handleValueChange(r))}handleValueChange(n=!1){this.fromLocalStorage()===this.el.open&&!n||(this.fromLocalStorage()?this.expand(!1):this.collapse(!1))}};function be(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,Ee(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),Ee(t.value)})}function Ee(t){document.documentElement.dataset.theme=t}ve();B(X,".menu-highlight");B(K,"a[data-toggle]");B(te,".tsd-index-accordion");B(ee,".tsd-filter-item input[type=checkbox]");var we=document.getElementById("theme");we&&be(we);var je=new Y;Object.defineProperty(window,"app",{value:je});})(); +/*! 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/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 000000000..339dbbad4 --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = JSON.parse("{\"kinds\":{\"128\":\"Class\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"262144\":\"Accessor\"},\"rows\":[{\"kind\":128,\"name\":\"default\",\"url\":\"classes/default.html\",\"classes\":\"tsd-kind-class\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"_renderer\",\"url\":\"classes/default.html#_renderer\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"width\",\"url\":\"classes/default.html#width\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"height\",\"url\":\"classes/default.html#height\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"_root\",\"url\":\"classes/default.html#_root\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"elements\",\"url\":\"classes/default.html#elements\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"secondary_renderers\",\"url\":\"classes/default.html#secondary_renderers\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"div\",\"url\":\"classes/default.html#div\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"bound\",\"url\":\"classes/default.html#bound\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"_zoom\",\"url\":\"classes/default.html#_zoom\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"plot_queue\",\"url\":\"classes/default.html#plot_queue\",\"classes\":\"tsd-kind-property tsd-parent-kind-class tsd-is-private\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"prefs\",\"url\":\"classes/default.html#prefs\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"ready\",\"url\":\"classes/default.html#ready\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"click_handler\",\"url\":\"classes/default.html#click_handler\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"tooltip_handler\",\"url\":\"classes/default.html#tooltip_handler\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"label_click_handler\",\"url\":\"classes/default.html#label_click_handler\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"on_zoom\",\"url\":\"classes/default.html#on_zoom\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":1024,\"name\":\"mark_ready\",\"url\":\"classes/default.html#mark_ready\",\"classes\":\"tsd-kind-property tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/default.html#mark_ready.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-property\",\"parent\":\"default.mark_ready\"},{\"kind\":2048,\"name\":\"bind\",\"url\":\"classes/default.html#bind\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"add_identifier_column\",\"url\":\"classes/default.html#add_identifier_column\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"add_labels_from_url\",\"url\":\"classes/default.html#add_labels_from_url\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"add_labels\",\"url\":\"classes/default.html#add_labels\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"reinitialize\",\"url\":\"classes/default.html#reinitialize\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"visualize_tiles\",\"url\":\"classes/default.html#visualize_tiles\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"make_big_png\",\"url\":\"classes/default.html#make_big_png\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"destroy\",\"url\":\"classes/default.html#destroy\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"update_prefs\",\"url\":\"classes/default.html#update_prefs\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"stop_labellers\",\"url\":\"classes/default.html#stop_labellers\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"dim\",\"url\":\"classes/default.html#dim\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":262144,\"name\":\"tooltip_html\",\"url\":\"classes/default.html#tooltip_html\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/default.html#tooltip_html.tooltip_html-1.__type-6\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"default.tooltip_html.tooltip_html\"},{\"kind\":262144,\"name\":\"label_click\",\"url\":\"classes/default.html#label_click\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/default.html#label_click.label_click-1.__type-4\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"default.label_click.label_click\"},{\"kind\":262144,\"name\":\"click_function\",\"url\":\"classes/default.html#click_function\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"classes/default.html#click_function.click_function-1.__type-2\",\"classes\":\"tsd-kind-type-literal\",\"parent\":\"default.click_function.click_function\"},{\"kind\":2048,\"name\":\"plotAPI\",\"url\":\"classes/default.html#plotAPI\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"unsafe_plotAPI\",\"url\":\"classes/default.html#unsafe_plotAPI\",\"classes\":\"tsd-kind-method tsd-parent-kind-class tsd-is-private\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"root_table\",\"url\":\"classes/default.html#root_table\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":262144,\"name\":\"query\",\"url\":\"classes/default.html#query\",\"classes\":\"tsd-kind-accessor tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"drawContours\",\"url\":\"classes/default.html#drawContours\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"sample_points\",\"url\":\"classes/default.html#sample_points\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"},{\"kind\":2048,\"name\":\"contours\",\"url\":\"classes/default.html#contours\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"default\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"comment\"],\"fieldVectors\":[[\"name/0\",[0,34.012]],[\"comment/0\",[]],[\"name/1\",[1,34.012]],[\"comment/1\",[]],[\"name/2\",[2,34.012]],[\"comment/2\",[]],[\"name/3\",[3,34.012]],[\"comment/3\",[]],[\"name/4\",[4,34.012]],[\"comment/4\",[]],[\"name/5\",[5,34.012]],[\"comment/5\",[]],[\"name/6\",[6,34.012]],[\"comment/6\",[]],[\"name/7\",[7,34.012]],[\"comment/7\",[]],[\"name/8\",[8,34.012]],[\"comment/8\",[]],[\"name/9\",[9,34.012]],[\"comment/9\",[]],[\"name/10\",[10,34.012]],[\"comment/10\",[]],[\"name/11\",[11,34.012]],[\"comment/11\",[]],[\"name/12\",[12,34.012]],[\"comment/12\",[]],[\"name/13\",[13,34.012]],[\"comment/13\",[]],[\"name/14\",[14,34.012]],[\"comment/14\",[]],[\"name/15\",[15,34.012]],[\"comment/15\",[]],[\"name/16\",[16,34.012]],[\"comment/16\",[]],[\"name/17\",[17,34.012]],[\"comment/17\",[]],[\"name/18\",[18,34.012]],[\"comment/18\",[]],[\"name/19\",[19,23.026]],[\"comment/19\",[]],[\"name/20\",[20,34.012]],[\"comment/20\",[]],[\"name/21\",[21,34.012]],[\"comment/21\",[]],[\"name/22\",[22,34.012]],[\"comment/22\",[]],[\"name/23\",[23,34.012]],[\"comment/23\",[]],[\"name/24\",[24,34.012]],[\"comment/24\",[]],[\"name/25\",[25,34.012]],[\"comment/25\",[]],[\"name/26\",[26,34.012]],[\"comment/26\",[]],[\"name/27\",[27,34.012]],[\"comment/27\",[]],[\"name/28\",[28,34.012]],[\"comment/28\",[]],[\"name/29\",[29,34.012]],[\"comment/29\",[]],[\"name/30\",[30,34.012]],[\"comment/30\",[]],[\"name/31\",[31,34.012]],[\"comment/31\",[]],[\"name/32\",[19,23.026]],[\"comment/32\",[]],[\"name/33\",[32,34.012]],[\"comment/33\",[]],[\"name/34\",[19,23.026]],[\"comment/34\",[]],[\"name/35\",[33,34.012]],[\"comment/35\",[]],[\"name/36\",[19,23.026]],[\"comment/36\",[]],[\"name/37\",[34,34.012]],[\"comment/37\",[]],[\"name/38\",[35,34.012]],[\"comment/38\",[]],[\"name/39\",[36,34.012]],[\"comment/39\",[]],[\"name/40\",[37,34.012]],[\"comment/40\",[]],[\"name/41\",[38,34.012]],[\"comment/41\",[]],[\"name/42\",[39,34.012]],[\"comment/42\",[]],[\"name/43\",[40,34.012]],[\"comment/43\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":19,\"name\":{\"19\":{},\"32\":{},\"34\":{},\"36\":{}},\"comment\":{}}],[\"_renderer\",{\"_index\":2,\"name\":{\"2\":{}},\"comment\":{}}],[\"_root\",{\"_index\":5,\"name\":{\"5\":{}},\"comment\":{}}],[\"_zoom\",{\"_index\":10,\"name\":{\"10\":{}},\"comment\":{}}],[\"add_identifier_column\",{\"_index\":21,\"name\":{\"21\":{}},\"comment\":{}}],[\"add_labels\",{\"_index\":23,\"name\":{\"23\":{}},\"comment\":{}}],[\"add_labels_from_url\",{\"_index\":22,\"name\":{\"22\":{}},\"comment\":{}}],[\"bind\",{\"_index\":20,\"name\":{\"20\":{}},\"comment\":{}}],[\"bound\",{\"_index\":9,\"name\":{\"9\":{}},\"comment\":{}}],[\"click_function\",{\"_index\":33,\"name\":{\"35\":{}},\"comment\":{}}],[\"click_handler\",{\"_index\":14,\"name\":{\"14\":{}},\"comment\":{}}],[\"constructor\",{\"_index\":1,\"name\":{\"1\":{}},\"comment\":{}}],[\"contours\",{\"_index\":40,\"name\":{\"43\":{}},\"comment\":{}}],[\"default\",{\"_index\":0,\"name\":{\"0\":{}},\"comment\":{}}],[\"destroy\",{\"_index\":27,\"name\":{\"27\":{}},\"comment\":{}}],[\"dim\",{\"_index\":30,\"name\":{\"30\":{}},\"comment\":{}}],[\"div\",{\"_index\":8,\"name\":{\"8\":{}},\"comment\":{}}],[\"drawcontours\",{\"_index\":38,\"name\":{\"41\":{}},\"comment\":{}}],[\"elements\",{\"_index\":6,\"name\":{\"6\":{}},\"comment\":{}}],[\"height\",{\"_index\":4,\"name\":{\"4\":{}},\"comment\":{}}],[\"label_click\",{\"_index\":32,\"name\":{\"33\":{}},\"comment\":{}}],[\"label_click_handler\",{\"_index\":16,\"name\":{\"16\":{}},\"comment\":{}}],[\"make_big_png\",{\"_index\":26,\"name\":{\"26\":{}},\"comment\":{}}],[\"mark_ready\",{\"_index\":18,\"name\":{\"18\":{}},\"comment\":{}}],[\"on_zoom\",{\"_index\":17,\"name\":{\"17\":{}},\"comment\":{}}],[\"plot_queue\",{\"_index\":11,\"name\":{\"11\":{}},\"comment\":{}}],[\"plotapi\",{\"_index\":34,\"name\":{\"37\":{}},\"comment\":{}}],[\"prefs\",{\"_index\":12,\"name\":{\"12\":{}},\"comment\":{}}],[\"query\",{\"_index\":37,\"name\":{\"40\":{}},\"comment\":{}}],[\"ready\",{\"_index\":13,\"name\":{\"13\":{}},\"comment\":{}}],[\"reinitialize\",{\"_index\":24,\"name\":{\"24\":{}},\"comment\":{}}],[\"root_table\",{\"_index\":36,\"name\":{\"39\":{}},\"comment\":{}}],[\"sample_points\",{\"_index\":39,\"name\":{\"42\":{}},\"comment\":{}}],[\"secondary_renderers\",{\"_index\":7,\"name\":{\"7\":{}},\"comment\":{}}],[\"stop_labellers\",{\"_index\":29,\"name\":{\"29\":{}},\"comment\":{}}],[\"tooltip_handler\",{\"_index\":15,\"name\":{\"15\":{}},\"comment\":{}}],[\"tooltip_html\",{\"_index\":31,\"name\":{\"31\":{}},\"comment\":{}}],[\"unsafe_plotapi\",{\"_index\":35,\"name\":{\"38\":{}},\"comment\":{}}],[\"update_prefs\",{\"_index\":28,\"name\":{\"28\":{}},\"comment\":{}}],[\"visualize_tiles\",{\"_index\":25,\"name\":{\"25\":{}},\"comment\":{}}],[\"width\",{\"_index\":3,\"name\":{\"3\":{}},\"comment\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..2d02570d0 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1280 @@ +: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-text: #222; + --light-color-text-aside: #707070; + --light-color-link: #4da6ff; + --light-color-ts: #db1373; + --light-color-ts-interface: #139d2c; + --light-color-ts-enum: #9c891a; + --light-color-ts-class: #2484e5; + --light-color-ts-function: #572be7; + --light-color-ts-namespace: #b111c9; + --light-color-ts-private: #707070; + --light-color-ts-variable: #4d68ff; + --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-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + --dark-color-ts: #ff6492; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-class: #61b0ff; + --dark-color-ts-function: #9772ff; + --dark-color-ts-namespace: #e14dff; + --dark-color-ts-private: #e2e2e2; + --dark-color-ts-variable: #4d68ff; + --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-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --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-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --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-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-function: var(--light-color-ts-function); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-private: var(--light-color-ts-private); + --color-ts-variable: var(--light-color-ts-variable); + --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-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-private: var(--dark-color-ts-private); + --color-ts-variable: var(--dark-color-ts-variable); + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +.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; +} + +.uppercase { + text-transform: uppercase; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1600px; + padding: 0 2rem; +} + +@media (min-width: 640px) { + .container { + padding: 0 4rem; + } +} +@media (min-width: 1200px) { + .container { + padding: 0 8rem; + } +} +@media (min-width: 1600px) { + .container { + padding: 0 12rem; + } +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + display: flex; + justify-content: space-between; + position: relative; + margin: 0 auto; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 2rem 1rem; +} + +.col-4 { + flex: 0 0 25%; +} +.col-8 { + flex: 1 0; + flex-wrap: wrap; + padding-left: 0; +} + +@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 shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 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: "Segoe UI", sans-serif; + 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; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + padding: 10px; + border: 0.1em solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} + +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 h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +@media (max-width: 1024px) { + html .col-content { + float: none; + max-width: 100%; + width: 100%; + padding-top: 3rem; + } + html .col-menu { + 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; + max-width: 25rem; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-menu > *: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 :is(header, footer, .col-content) { + animation: shift-to-left 0.4s; + } + + .to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu :is(header, footer, .col-content) { + animation: unshift-to-left 0.4s; + } + + .from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu :is(header, footer, .col-content) { + transform: translate(-25%, 0); + } + .has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + display: grid; + align-items: center; + grid-template-rows: auto 1fr; + grid-gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +.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: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-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 + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.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); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.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-index-panel a, +.tsd-index-panel a.tsd-parent-kind-module { + color: var(--color-ts); +} +.tsd-index-panel a.tsd-parent-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-parent-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-parent-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-module { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-index-panel a.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-index-panel a.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-index-panel a.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-index-panel a.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-index-panel a.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-index-panel a.tsd-is-private { + color: var(--color-ts-private); +} + +.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: absolute; + 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-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation a { + display: block; + margin: 0.4rem 0; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary .tsd-accordion-details > ul { + margin-top: 0.75rem; +} +.tsd-navigation.primary a { + padding: 0.75rem 0.5rem; + margin: 0; +} +.tsd-navigation.primary ul li a { + margin-left: 0.5rem; +} +.tsd-navigation.primary ul li li a { + margin-left: 1.5rem; +} +.tsd-navigation.primary ul li li li a { + margin-left: 2.5rem; +} +.tsd-navigation.primary ul li li li li a { + margin-left: 3.5rem; +} +.tsd-navigation.primary ul li li li li li a { + margin-left: 4.5rem; +} +.tsd-navigation.primary ul li li li li li li a { + margin-left: 5.5rem; +} +.tsd-navigation.primary li.current > a { + border-left: 0.15rem var(--color-text) solid; +} +.tsd-navigation.primary li.selected > a { + font-weight: bold; + border-left: 0.2rem var(--color-text) solid; +} +.tsd-navigation.primary ul li a:hover { + border-left: 0.2rem var(--color-text-aside) solid; +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary > ul { + display: inline; + padding-right: 0.5rem; + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 0; +} +.tsd-navigation.secondary ul li li a { + padding-left: 1.1rem; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 2.2rem; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 3.3rem; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 4.4rem; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 5.5rem; +} + +#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 { + margin: 0.25rem 0; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; +} +.tsd-accordion-summary > h1, +.tsd-accordion-summary > h2, +.tsd-accordion-summary > h3, +.tsd-accordion-summary > h4, +.tsd-accordion-summary > h5 { + display: inline-flex; + align-items: center; + vertical-align: middle; + margin-bottom: 0; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +.tsd-accordion-summary { + display: block; + cursor: pointer; +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; +} +.tsd-index-accordion .tsd-accordion-summary svg { + margin-right: 0.25rem; +} +.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; +} + +@media (min-width: 1024px) { + .col-content { + margin: 2rem auto; + } + + .menu-sticky-wrap { + position: sticky; + height: calc(100vh - 2rem); + top: 4rem; + right: 0; + padding: 0 1.5rem; + padding-top: 1rem; + margin-top: 3rem; + transition: 0.3s ease-in-out; + transition-property: top, padding-top, padding, height; + overflow-y: auto; + } + .col-menu { + border-left: 1px solid var(--color-accent); + } + .col-menu--hide { + top: 1rem; + } + .col-menu .tsd-navigation:not(:last-child) { + padding-bottom: 1.75rem; + } +} + +.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: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#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 { + padding: 0 10px; + background-color: var(--color-background); +} +#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, +#tsd-search .results li:hover { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: block; +} +#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-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-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: fixed; + 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-page-toolbar--hide { + transform: translateY(-100%); +} + +.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; +} +@media (max-width: 1024px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +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; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +* { + 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); +} diff --git a/docs/classes/default.html b/docs/classes/default.html new file mode 100644 index 000000000..15adc40cf --- /dev/null +++ b/docs/classes/default.html @@ -0,0 +1,675 @@ +default | deepscatter
+
+ +
+
+
+
+ +

Class default

+
+

Hierarchy

+
    +
  • default
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      selector: string
    • +
    • +
      width: number
    • +
    • +
      height: number
    +

    Returns default

+
+

Properties

+
+ +
_renderer: any
+
+ +
_root: Dataset<any>
+
+ +
_zoom: default
+
+ +
bound: boolean
+
+ +
click_handler: ClickFunction
+
+ +
div: Selection<any, any, any, any>
+
+ +
elements?: Selection<SVGElement, any, any, any>[]
+
+ +
height: number
+
+ +
label_click_handler: LabelClick
+
+ +
mark_ready: (() => void) = ...
+
+

Type declaration

+
    +
  • +
      +
    • (): void
    • +
    • +

      Returns void

+
+ +
on_zoom?: onZoomCallback
+
+ +
plot_queue: Promise<void> = ...
+
+ +
prefs: APICall
+
+ +
ready: Promise<void>
+
+ +
secondary_renderers: Record<string, Renderer> = {}
+
+ +
tooltip_handler: TooltipHTML
+
+ +
width: number
+
+

Accessors

+
+ +
    +
  • get click_function(): ((datum: StructRowProxy<any>, plot: default) => void)
  • +
  • +

    Returns ((datum: StructRowProxy<any>, plot: default) => void)

    +
      +
    • +
        +
      • (datum: StructRowProxy<any>, plot: default): void
      • +
      • +
        +

        Parameters

        +
          +
        • +
          datum: StructRowProxy<any>
        • +
        • +
          plot: default
        +

        Returns void

  • +
  • set click_function(func: ((datum: StructRowProxy<any>, plot: default) => void)): void
  • +
  • +
    +

    Parameters

    +
      +
    • +
      func: ((datum: StructRowProxy<any>, plot: default) => void)
      +
        +
      • +
          +
        • (datum: StructRowProxy<any>, plot: default): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            datum: StructRowProxy<any>
          • +
          • +
            plot: default
          +

          Returns void

    +

    Returns void

+
+ +
    +
  • get label_click(): ((datum: GeoJsonProperties, plot: default) => void)
  • +
  • +

    Returns ((datum: GeoJsonProperties, plot: default) => void)

    +
      +
    • +
        +
      • (datum: GeoJsonProperties, plot: default): void
      • +
      • +
        +

        Parameters

        +
          +
        • +
          datum: GeoJsonProperties
        • +
        • +
          plot: default
        +

        Returns void

  • +
  • set label_click(func: ((datum: GeoJsonProperties, plot: default) => void)): void
  • +
  • +
    +

    Parameters

    +
      +
    • +
      func: ((datum: GeoJsonProperties, plot: default) => void)
      +
        +
      • +
          +
        • (datum: GeoJsonProperties, plot: default): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            datum: GeoJsonProperties
          • +
          • +
            plot: default
          +

          Returns void

    +

    Returns void

+
+ +
    +
  • get query(): any
  • +
  • +

    Return the current state of the query. Can be used to save an API +call for use programatically.

    +
    +

    Returns any

+
+ +
    +
  • get tooltip_html(): ((datum: StructRowProxy<any>, plot: default) => string)
  • +
  • +

    Returns ((datum: StructRowProxy<any>, plot: default) => string)

    +
      +
    • +
        +
      • (datum: StructRowProxy<any>, plot: default): string
      • +
      • +
        +

        Parameters

        +
          +
        • +
          datum: StructRowProxy<any>
        • +
        • +
          plot: default
        +

        Returns string

  • +
  • set tooltip_html(func: ((datum: StructRowProxy<any>, plot: default) => string)): void
  • +
  • +
    +

    Parameters

    +
      +
    • +
      func: ((datum: StructRowProxy<any>, plot: default) => string)
      +
        +
      • +
          +
        • (datum: StructRowProxy<any>, plot: default): string
        • +
        • +
          +

          Parameters

          +
            +
          • +
            datum: StructRowProxy<any>
          • +
          • +
            plot: default
          +

          Returns string

    +

    Returns void

+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      name: string
      +

      The name of the new column to be created. If it already exists, this will throw an error in invocation

      +
    • +
    • +
      codes: string[] | Record<string, number>
      +

      The codes to be assigned labels. This can be either a list of ids (in which case all ids will have the value 1.0 assigned) + or a keyed of values like {'Rome': 3, 'Vienna': 13} in which case the numeric values will be used.

      +
    • +
    • +
      key_field: string
      +

      The field in which to look for the identifiers.

      +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      features: FeatureCollection<Geometry, GeoJsonProperties>
      +

      A geojson feature collection containing point labels

      +
    • +
    • +
      name: string
      +

      A unique key to associate with this labelset. Labels can be enabled or disabled using this key.

      +
    • +
    • +
      label_key: string
      +

      The text field in which the labels are stored in the geojson object.

      +
    • +
    • +
      size_key: undefined | string
      +

      A field in the dataset to associate with the size of the labels.

      +

      Usage:

      +

      To add a set of labels to your map, create a geojson array of points where +the 'properties' field contains a column to use for labels. E.g., each entry might look like +this. Each feature will be inserted into a label hierarchy to attempt to avoid inclusion. +If the label_key corresponds to the currently active color dimension on your map, +the labels will be drawn with appropriately colored outlines: otherwise, they will +all have a black outline. +Currently it is necessary that labels be inserted in order.

      +
    • +
    • +
      options: LabelOptions
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      url: string
    • +
    • +
      name: string
    • +
    • +
      label_key: string
    • +
    • +
      size_key: undefined | string
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      selector: string
      +

      A selector for the root element of the deepscatter; must already exist.

      +
    • +
    • +
      width: number
      +

      Width of the plot, in pixels.

      +
    • +
    • +
      height: number
      +

      Height of the plot, in pixels.

      +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      aes: any
    +

    Returns void

+
+ +
    + +
  • +

    Destroy the scatterplot and release all associated resources. +This is necessary because removing a deepscatter instance +will not de-allocate tables from GPU memory.

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Returns

    +
    +

    Parameters

    +
      +
    • +
      dimension: string
      +

      The name of the encoding dimension to access +information about

      +
    +

    Returns any

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      contours: any
    • +
    • +
      drawTo: any
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      xtimes: number = 3
    • +
    • +
      points: number = 1e7
    • +
    • +
      timeper: number = 100
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      prefs: APICall
    +

    Returns Promise<void>

+
+ +
+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      n: number = 10
    +

    Returns Record<string, string | number>[]

+
+ +
+
+ +
    + +
  • +

    This is the main plot entry point: it's unsafe to fire multiple +times in parallel because the transition state can get all borked up. +plotAPI wraps it in an await wrapper.

    +
    +
    +

    Parameters

    +
      +
    • +
      prefs: APICall
      +

      The preferences

      +
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      prefs: APICall
    +

    Returns void

+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..74d1b5974 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,209 @@ +deepscatter
+
+ +
+
+
+
+

deepscatter

+
+ +

Deep Scatterplots for the Web

+
+

This is an evolving library for displaying more points than are ordinarily possible over the web.

+

It's fast for three reasons:

+
    +
  1. All data is sent in the Apache Arrow feather format, in a +custom quadtree format that makes it possible to only load +data as needed on zoom. Feather takes no time to parse in the browser +once transferred, compresses pretty well, and can be directly copied to the GPU without +transformation in JS. This is the way of the future.
  2. +
  3. Most rendering is done in custom layers using WebGL, with a +buffer management strategy handled by REGL. This means that +there are no unnecessary abstractions around points or separate draw calls +for different objects; a minimum number of buffers are attached for the +needed points.
  4. +
  5. Almost all grammar-of-graphics transforms such are handled on the GPU, +which allows for interpolated transitions with calculations +done in parallel.
  6. +
+

It also runs in completely static settings, so you can host a million-point scatterplot over something like Github Pages.

+ + +

Examples

+
+ + + +

Get help

+
+

Github issues, even low quality ones, are welcom here. There is also a dedicated Deepscatter Slack which you are welcome to join. +I came into doing this stuff from a very non-technical background and welcome people to join with naive questions.

+ + +

Quick start

+
+ + +

Importing the module.

+
+

See the arxiv example above to see some basic examples.

+ + +

Running locally.

+
+

First, install the companion tiling library, which is written in python, +and generate a million points of test data in tiles of 50000 apiece.

+
python3 -V # requires Python 3.9.x or 3.10.x
python3 -m pip install git+https://github.com/bmschmidt/quadfeather
quadfeather-test-data 1_000_000
quadfeather --files tmp.csv --tile_size 50_000 --destination tiles +
+

Then setup this library to run. It will start a local dev server.

+
npm i
npm run dev +
+

If you go to localhost:3344, you should see an interactive scatterplot. To dig into what you're seeing, open index.html. +(In 2021, this development site works in Chrome, not Safari or Firefox, because it uses ES6 module syntax inside the webworker. The distributed version of +the module should work in all browsers.)

+ + +

Your own data.

+
+
    +
  1. Create a CSV, parquet, or feather file that has columns called 'x' and 'y'. (Or a feather file that has columns x, y). Any other columns (categorical information, etc.) can be included as additional columns.

    +
  2. +
  3. Tile it:

    +
  4. +
+
cd deepscatter # if you're not already there
quadfeather --files ../some-path-to/your-data.csv --tile_size 50000 --destination tiles +
+
    +
  1. Assuming your dataset has an x and y column and the tiles folder is in the root directory of this project, you can see the data visualized by running
  2. +
+
npm run dev
+
+

and opening http://localhost:3345/index-simplest-way-to-start.html in your browser.

+

To edit the visualization, or to troubleshoot, look at the file index-simplest-way-to-start.html, where you should find a bare-bones implementation of deepscatter.

+

Explore index.html, and render it at http://localhost:3345/index.html, for a more advanced example.

+

Note: Ideally, in a future release you'll be able to create these specs in away that doesn't require coding JSON directly.

+ + +

Build the module

+
+
npm run build
+
+

will create an ES module at dist/deepscatter.es.js The mechanics of +importing this are very slightly different than index.html.

+

Note that this is an ESM module and so requires you to use <script type="module"> in your code. +Don't worry! We're allowed to +do this now! But do be aware that this will not work on computers running very old browsers.

+

Snippet:

+
<div id="my-div"></div>
<script type="module">
import Scatterplot from './dist/deepscatter.umd.js';
f = new Scatterplot('#my-div');
</script> +
+

See index_prod.html for an example

+

This is currently bundled with vite and rollup. There is/will be a further interaction layer on +top of it, but the core plotting components are separate and should work as a standalone layer that supports +plot requests via an API.

+ + +

Code strategy

+
+

Any interaction logic that changes the API call directly does not belong in this library. The only +interaction code here is for zooming and interacting with points.

+ + +

Future codebase splits.

+
+

The plotting components and the tiling components are logically quite separate; I may break +the tiling strategy into a separate JS library called 'quadfeather'.

+

Apache Arrow would still be a necessary intermediate format, but it could be generated from CSV files +using, say, arquero or a WASM port of DuckDB.

+ + +

API

+
+

This is still subject to change and is not fully documented. The encoding portion of the API mimics Vega-Lite with some minor distinctions to avoid deeply-nested queries and to add animation and jitter parameters.

+
{
encoding: {
"x": {
"field": "x",
"transform": "literal"
},
"color": {
"field": "year",
"range": "viridis",
"domain": [1970, 2020]
}
}
+
+ + +

Implemented aesthetics.

+
+
    +
  1. x
  2. +
  3. y
  4. +
  5. size
  6. +
  7. jitter_radius: size of jitter. API subject to change.
  8. +
  9. jitter_speed: speed of jitter. API subject to change.
  10. +
  11. color (categorical or linear: range can call color scales explicitly, or accepting any d3-color name.)
  12. +
  13. x0 (for animations; transitions between x0 and x)
  14. +
  15. y0 (for animations; transitions between y0 and y)
  16. +
  17. filter. (Filtering is treated as an aesthetic operation by this library.)
  18. +
+ + +

Planned

+
+
    +
  1. Symbol (Mapping of categorical variables to single unicode points in a single font; probably 255 max.)
  2. +
  3. Label (Full-text label)
  4. +
  5. Image (Like PixPlot)
  6. +
+ + +

Jitter

+
+

Jitter is a little overloaded with features right now, but some are quite fun.

+

jitter method is set on 'method' key of the 'jitter_radius' field. Possible values are:

+
    +
  1. circle
  2. +
  3. spiral
  4. +
  5. time
  6. +
  7. normal
  8. +
+ + +

Principles

+
+
    +
  1. This is a 2d library. No fake 3d.
  2. +
  3. The central zoom state is handled by d3-zoom.
  4. +
  5. Use the zoom state to render other layers on top of Deepscatter by hooking in (note on_zoom is directly set, not passed in via prefs):
  6. +
+
const scatterplot = new Scatterplot('#deepscatter');
scatterplot.on_zoom = (transform) => {...} +
+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 000000000..bd0533063 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,48 @@ +deepscatter
+
+ +
+
+
+
+

deepscatter

+
+
+

Index

+
+

Classes

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 16739de6b..2b3d4b99e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "glslify-loader": "^2.0.0", "rollup-plugin-glslify": "^1.3.1", "terser": "^5.16.0", + "typedoc": "^0.23.24", "vite": "^3.2.4" } }, @@ -3508,6 +3509,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -3633,6 +3640,12 @@ "node": ">=10" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/map-limit": { "version": "0.0.1", "dev": true, @@ -3658,6 +3671,18 @@ "node": ">=0.10.0" } }, + "node_modules/marked": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", + "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -4663,6 +4688,17 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.12.1.tgz", + "integrity": "sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5040,6 +5076,48 @@ "dev": true, "license": "MIT" }, + "node_modules/typedoc": { + "version": "0.23.24", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.24.tgz", + "integrity": "sha512-bfmy8lNQh+WrPYcJbtjQ6JEEsVl/ce1ZIXyXhyW+a1vFrjO39t6J8sL/d6FfAGrJTc7McCXgk9AanYBSNvLdIA==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.2.5", + "minimatch": "^5.1.2", + "shiki": "^0.12.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -5149,6 +5227,18 @@ } } }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -7599,6 +7689,12 @@ "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "levn": { "version": "0.4.1", "dev": true, @@ -7695,6 +7791,12 @@ "yallist": "^4.0.0" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "map-limit": { "version": "0.0.1", "dev": true, @@ -7717,6 +7819,12 @@ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true }, + "marked": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", + "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", + "dev": true + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -8397,6 +8505,17 @@ "version": "3.0.0", "dev": true }, + "shiki": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.12.1.tgz", + "integrity": "sha512-aieaV1m349rZINEBkjxh2QbBvFFQOlgqYTNtCal82hHj4dDZ76oMlQIX+C7ryerBTDiga3e5NfH6smjdJ02BbQ==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8679,6 +8798,38 @@ "version": "0.0.6", "dev": true }, + "typedoc": { + "version": "0.23.24", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.24.tgz", + "integrity": "sha512-bfmy8lNQh+WrPYcJbtjQ6JEEsVl/ce1ZIXyXhyW+a1vFrjO39t6J8sL/d6FfAGrJTc7McCXgk9AanYBSNvLdIA==", + "dev": true, + "requires": { + "lunr": "^2.3.9", + "marked": "^4.2.5", + "minimatch": "^5.1.2", + "shiki": "^0.12.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -8737,6 +8888,18 @@ "rollup": "^2.79.1" } }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, "which": { "version": "2.0.2", "dev": true, diff --git a/package.json b/package.json index 17731d568..6e6968ec8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "deepscatter", "type": "module", - "version": "2.6.1", + "version": "2.7.0", "description": "Fast, animated zoomable scatterplots scaling to billions of points", "files": [ "dist" @@ -17,12 +17,13 @@ "scripts": { "dev": "vite --port 3344 --host", "build": "vite build", + "prepublish": "vite build && npx typedoc --ignoreCompilerErrors src/deepscatter.ts", "test": "playwright test", "lint": "eslint src" }, "repository": { "type": "git", - "url": "git+https://github.com/CreatingData/deepscatter.git" + "url": "git+https://github.com/nomic-ai/deepscatter.git" }, "keywords": [ "Data", @@ -33,9 +34,9 @@ "author": "Ben Schmidt", "license": "MIT", "bugs": { - "url": "https://github.com/CreaacktingData/deepscatter/issues" + "url": "https://github.com/nomic-ai/deepscatter/issues" }, - "homepage": "https://github.com/CreatingData/deepscatter#readme", + "homepage": "https://github.com/nomic-ai/deepscatter#readme", "dependencies": { "apache-arrow": "^10.0.1", "d3-array": "^3.2.0", @@ -80,6 +81,7 @@ "glslify-loader": "^2.0.0", "rollup-plugin-glslify": "^1.3.1", "terser": "^5.16.0", + "typedoc": "^0.23.24", "vite": "^3.2.4" } } diff --git a/release_notes.md b/release_notes.md index 1f63b1148..f383888b6 100644 --- a/release_notes.md +++ b/release_notes.md @@ -1,8 +1,13 @@ -# 2.6.2 +# 2.7.0 + +- Revamp a number of bad choices in the 'point_size' and 'alpha' parameters so that the units better correspond to screen pixels (for size) and alpha (on a scale of 1 to 100.) This unfortunately will requiring tweaking existing maps. +- Add auto-generated documentation. +- Allow dragging of labels around the screen for editing label collections. +- Make labels by default filter the underlying data if the geojson property name is in the # 2.6.1 -- Fix bug cuasing multiple positions to sometimes place points in their previous location during mouseover events. +- Fix bug causing multiple positions to sometimes place points in their previous location during mouseover events. # 2.6.0 diff --git a/src/deepscatter.ts b/src/deepscatter.ts index 1608e2d83..8b2716794 100644 --- a/src/deepscatter.ts +++ b/src/deepscatter.ts @@ -15,6 +15,7 @@ import type { StructRowProxy } from 'apache-arrow'; import type { FeatureCollection } from 'geojson'; import { LabelMaker, LabelOptions } from './label_rendering'; import { Renderer } from './rendering'; +import type { Tile } from './tile'; // DOM elements that deepscatter uses. const base_elements = [ @@ -36,8 +37,8 @@ const base_elements = [ }, ]; -export default class Scatterplot { - public _renderer: ReglRenderer; +export default class Scatterplot { + public _renderer: ReglRenderer; public width: number; public height: number; public _root: Dataset; @@ -60,6 +61,11 @@ export default class Scatterplot { /*pass*/ }; constructor(selector: string, width: number, height: number) { + /** + * @param selector A DOM selector for the div in which the scatterplot will live. + * @param width The width of the scatterplot (in pixels) + * @param height The height of the scatterplot (in pixels) + */ this.bound = false; if (selector !== undefined) { this.bind(selector, width, height); @@ -273,6 +279,10 @@ export default class Scatterplot { */ visualize_tiles() { + /** + * Draws a set of rectangles to the screen to illustrate the currently + * loaded tiles. Useful for debugging and illustration. + */ const map = this; const ctx = map.elements[2].selectAll('canvas').node().getContext('2d'); @@ -428,15 +438,17 @@ export default class Scatterplot { } } } + /** + * * * @param dimension The name of the encoding dimension to access - * information about + * information about. E.g. ("color", "x", etc.) * @returns */ - public dim(dimension: string) { - return this._renderer.aes.dim(dimension).current; + public dim(dimension: string) : { + return this._renderer.aes.dim(dimension).current as T; } set tooltip_html(func) { @@ -681,6 +693,7 @@ abstract class SettableFunction { } import type { GeoJsonProperties } from 'geojson'; +import { Aesthetic } from './Aesthetic'; class LabelClick extends SettableFunction { default( diff --git a/src/label_rendering.ts b/src/label_rendering.ts index ceadcd4e5..167a27ae6 100644 --- a/src/label_rendering.ts +++ b/src/label_rendering.ts @@ -5,6 +5,7 @@ import Scatterplot from './deepscatter'; import { Timer, timer } from 'd3-timer'; import { select } from 'd3-selection'; import { drag } from 'd3-drag'; +import type { Tile } from './tile'; const handler = drag(); @@ -16,27 +17,36 @@ export type LabelOptions = { function pixel_ratio(scatterplot: Scatterplot): number { // pixelspace - const [px1, px2] = scatterplot._zoom.scales().x.range(); + const [px1, px2] = scatterplot._zoom.scales().x.range() as [number, number]; // dataspace - const [dx1, dx2] = scatterplot._zoom.scales().x.domain(); - + const [dx1, dx2] = scatterplot._zoom.scales().x.domain() as [number, number]; const ratio = (px2 - px1) / (dx2 - dx1); return ratio; } // Should be 0 except in testing. const RECT_DEFAULT_OPACITY = 0; +import { TileType } from './types'; export class LabelMaker extends Renderer { + /** + * A LabelMaker + */ public layers: GeoJsonObject[] = []; public ctx: CanvasRenderingContext2D; public tree: DepthTree; public timer?: Timer; - public label_key: string; + public label_key?: string; // public svg: SVGElement; public labelgroup: SVGGElement; private hovered: undefined | string; public options: LabelOptions = {}; + /** + * + * @param scatterplot + * @param id_raw + * @param options + */ constructor( - scatterplot: Scatterplot, + scatterplot: Scatterplot, id_raw: string, options: LabelOptions = {} ) { @@ -77,7 +87,12 @@ export class LabelMaker extends Renderer { this.bind_zoom(scatterplot._renderer.zoom); } - start(ticks: number = 1e6) { + /** + * Start rendering a set of labels. + * + * @param ticks How many milliseconds until the renderer should be stopped. + */ + start(ticks = 1e9) { // Render for a set number of ticks. Probably overkill. if (this.timer) { this.timer.stop(); @@ -98,6 +113,9 @@ export class LabelMaker extends Renderer { select(this.labelgroup).remove(); } + /** + * Stop the rendering of this set. + */ stop() { if (this.timer) { this.timer.stop(); @@ -106,7 +124,12 @@ export class LabelMaker extends Renderer { this.timer = undefined; } } - + /** + * + * @param featureset A feature collection of labels to display. Currently each feature must be a Point. + * @param label_key The field in each geojson feature that includes the label for the object. + * @param size_key The field in each geojson feature that includes the size + */ public update( featureset: GeoJSON.FeatureCollection, label_key: string, @@ -117,9 +140,12 @@ export class LabelMaker extends Renderer { this.label_key = label_key; for (const feature of featureset.features) { const { properties, geometry } = feature; + if (properties === null) { + continue; + } if (geometry.type === 'Point') { // The size can be specified; if not, it defaults to 16pt. - const size = (properties![size_key] as number) ?? 16; + const size = (properties[size_key] as number) ?? 16; let label = ''; if ( properties[label_key] !== undefined && diff --git a/src/types.ts b/src/types.ts index 120d514bb..665c810bd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,5 @@ import { Table } from 'apache-arrow'; +import { QuadTile } from './tile'; /** * Operations to be performed on the GPU taking a single argument. @@ -203,3 +204,5 @@ export function isConstantChannel( ): input is ConstantChannel { return (input as ConstantChannel).constant !== undefined; } + +export type TileType = QuadTile | ArrowTile;