diff --git a/playground/assets/index-CLPuIZl5.js b/playground/assets/index-B-N43nsC.js similarity index 99% rename from playground/assets/index-CLPuIZl5.js rename to playground/assets/index-B-N43nsC.js index 2831710..57bea4c 100644 --- a/playground/assets/index-CLPuIZl5.js +++ b/playground/assets/index-B-N43nsC.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-D1-7ym7j.js","./_commonjsHelpers-C932wzq6.js","./index-ClfaVKLN.js","./index-DUK954OB.js","./__vite-browser-external-D80GqXp3.js","./long-CAmP1QdM.js","./index-DVUJOETl.js","./remoteFile-Bm2xbUQM.js","./index-HK_S63t8.js","./index-MItgq5d9.js","./index-DNrKPIXU.js","./index--JaoS6-4.js","./index-bYVaIEc7.js","./index-BR8RN3QU.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-D1-7ym7j.js","./_commonjsHelpers-C932wzq6.js","./index-ClfaVKLN.js","./index-DUK954OB.js","./__vite-browser-external-D80GqXp3.js","./long-CAmP1QdM.js","./index-DVUJOETl.js","./remoteFile-Bm2xbUQM.js","./index-HK_S63t8.js","./index-MItgq5d9.js","./index-DNrKPIXU.js","./index--JaoS6-4.js","./index-Ct7_ui2i.js","./index-BR8RN3QU.js"])))=>i.map(i=>d[i]); var eZ=Object.defineProperty;var oP=n=>{throw TypeError(n)};var tZ=(n,e,t)=>e in n?eZ(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var Ei=(n,e,t)=>tZ(n,typeof e!="symbol"?e+"":e,t),rD=(n,e,t)=>e.has(n)||oP("Cannot "+t);var Z=(n,e,t)=>(rD(n,e,"read from private field"),t?t.call(n):e.get(n)),Me=(n,e,t)=>e.has(n)?oP("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),at=(n,e,t,i)=>(rD(n,e,"write to private field"),i?i.call(n,t):e.set(n,t),t),xe=(n,e,t)=>(rD(n,e,"access private method"),t);var rP=(n,e,t,i)=>({set _(s){at(n,e,s,t)},get _(){return Z(n,e,i)}});(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))i(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&i(r)}).observe(document,{childList:!0,subtree:!0});function t(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(s){if(s.ep)return;s.ep=!0;const o=t(s);fetch(s.href,o)}})();const iZ="modulepreload",nZ=function(n,e){return new URL(n,e).href},aP={},Zn=function(e,t,i){let s=Promise.resolve();if(t&&t.length>0){const r=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),l=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));s=Promise.allSettled(t.map(c=>{if(c=nZ(c,i),c in aP)return;aP[c]=!0;const d=c.endsWith(".css"),u=d?'[rel="stylesheet"]':"";if(!!i)for(let g=r.length-1;g>=0;g--){const p=r[g];if(p.href===c&&(!d||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${u}`))return;const f=document.createElement("link");if(f.rel=d?"stylesheet":iZ,d||(f.as="script"),f.crossOrigin="",f.href=c,l&&f.setAttribute("nonce",l),document.head.appendChild(f),d)return new Promise((g,p)=>{f.addEventListener("load",g),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(r){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=r,window.dispatchEvent(a),!a.defaultPrevented)throw r}return s.then(r=>{for(const a of r||[])a.status==="rejected"&&o(a.reason);return e().catch(o)})};/** * @license * Copyright 2019 Google LLC @@ -2556,7 +2556,7 @@ chrM 16299`,hF={dm6:ede,hg18:tde,hg19:ide,hg38:nde,mm9:sde,mm10:ode};function rd };`)(),g=e.map(b=>{const y=b.type,w=JSON.stringify(b.name);if(["ubyte","int","uint"].includes(y))return`d[${w}] = parseInt();`;if(b.isNumeric)return`d[${w}] = Number(parseString());`;if(["char","string","lstring"].includes(y))return`d[${w}] = parseString();`;throw new Error("Unsupported type: "+y)}),p=Sue(g,50).map((b,y)=>Function("parseInt","parseString",`return function parseFieldChunk${y}(d) { ${b.join(` `)} - }`)(u,d));function _(b){i=b,s=b.length,t=0}function v(b,y,w,S){_(S),o=f(b,y,w);for(const L of p)L(o);return o}return v}function Sue(n,e){return Array.from({length:Math.ceil(n.length/e)},(t,i)=>n.slice(i*e,i*e+e))}var Fh;class xue extends H1{constructor(t,i){const s={channel:"x",windowSize:2e4,debounce:200,debounceMode:"domain",...t};super(i,s.channel);Me(this,Fh);Ei(this,"chrPrefixFixer",t=>t);if(this.params=s,!this.params.url)throw new Error("No URL provided for BamSource");this.setupDebouncing(this.params),this.initializedPromise=new Promise(o=>{Promise.all([Zn(()=>import("./index--JaoS6-4.js"),__vite__mapDeps([11,5,0,1,2,4,7,9]),import.meta.url),Zn(()=>import("./index-DVUJOETl.js"),__vite__mapDeps([6,4,7,0,1,2]),import.meta.url)]).then(([{BamFile:r},{RemoteFile:a}])=>{const l=c=>new a(z1(c,this.view.getBaseUrl()));at(this,Fh,new r({bamFilehandle:l(this.params.url),baiFilehandle:l(this.params.indexUrl??this.params.url+".bai")})),Z(this,Fh).getHeader().then(c=>{var h,f;const d=this.genome.hasChrPrefix(),u=(f=(h=Z(this,Fh).indexToChr)==null?void 0:h[0])==null?void 0:f.refName.startsWith("chr");d&&!u?this.chrPrefixFixer=g=>g.replace("chr",""):!d&&u&&(this.chrPrefixFixer=g=>"chr"+g),o()})})})}get label(){return"bamSource"}async loadInterval(t){const i=await this.discretizeAndLoad(t,async(s,o)=>Z(this,Fh).getRecordsForRange(this.chrPrefixFixer(s.chrom),s.startPos,s.endPos,{signal:o}).then(r=>r.map(a=>({chrom:s.chrom,start:a.start,end:a.end,name:a.name,cigar:a.CIGAR,mapq:a.mq,strand:a.strand===1?"+":"-"}))));i&&this.publishData(i)}}Fh=new WeakMap;var Gp;class E$ extends H1{constructor(t,i){const s={channel:"x",windowSize:3e6,debounce:200,debounceMode:"domain",addChrPrefix:!1,...t};super(i,s.channel);Me(this,Gp);if(this.params=s,!this.params.url)throw new Error("No URL provided for TabixSource");this.setupDebouncing(this.params),this.initializedPromise=new Promise(o=>{Promise.all([Zn(()=>import("./index-bYVaIEc7.js"),__vite__mapDeps([12,9,1,0,2,4,7,5]),import.meta.url),Zn(()=>import("./index-DVUJOETl.js"),__vite__mapDeps([6,4,7,0,1,2]),import.meta.url)]).then(async([{TabixIndexedFile:r},{RemoteFile:a}])=>{const l=d=>new a(z1(d,this.view.getBaseUrl()));at(this,Gp,new r({filehandle:l(this.params.url),tbiFilehandle:l(this.params.indexUrl??this.params.url+".tbi"),renameRefSeqs:this.params.addChrPrefix===!0?d=>"chr"+d:this.params.addChrPrefix?d=>this.params.addChrPrefix+d:void 0}));const c=await Z(this,Gp).getHeader();await this._handleHeader(c),o()})})}async loadInterval(t){await this.initializedPromise;const i=await this.discretizeAndLoad(t,async(s,o)=>{const r=[];return await Z(this,Gp).getLines(s.chrom,s.startPos,s.endPos,{lineCallback:a=>{r.push(a)},signal:o}),this._parseFeatures(r)});i&&this.publishData(i)}async _handleHeader(t){}_parseFeatures(t){return[]}}Gp=new WeakMap;var c1;class Lue extends E${constructor(){super(...arguments);Me(this,c1)}get label(){return"gff3Source"}async _handleHeader(t){at(this,c1,(await Zn(async()=>{const{default:i}=await import("./index-BR8RN3QU.js");return{default:i}},__vite__mapDeps([13,2,4,1]),import.meta.url)).default)}_parseFeatures(t){var s;return(s=Z(this,c1))==null?void 0:s.parseStringSync(t.join(` + }`)(u,d));function _(b){i=b,s=b.length,t=0}function v(b,y,w,S){_(S),o=f(b,y,w);for(const L of p)L(o);return o}return v}function Sue(n,e){return Array.from({length:Math.ceil(n.length/e)},(t,i)=>n.slice(i*e,i*e+e))}var Fh;class xue extends H1{constructor(t,i){const s={channel:"x",windowSize:2e4,debounce:200,debounceMode:"domain",...t};super(i,s.channel);Me(this,Fh);Ei(this,"chrPrefixFixer",t=>t);if(this.params=s,!this.params.url)throw new Error("No URL provided for BamSource");this.setupDebouncing(this.params),this.initializedPromise=new Promise(o=>{Promise.all([Zn(()=>import("./index--JaoS6-4.js"),__vite__mapDeps([11,5,0,1,2,4,7,9]),import.meta.url),Zn(()=>import("./index-DVUJOETl.js"),__vite__mapDeps([6,4,7,0,1,2]),import.meta.url)]).then(([{BamFile:r},{RemoteFile:a}])=>{const l=c=>new a(z1(c,this.view.getBaseUrl()));at(this,Fh,new r({bamFilehandle:l(this.params.url),baiFilehandle:l(this.params.indexUrl??this.params.url+".bai")})),Z(this,Fh).getHeader().then(c=>{var h,f;const d=this.genome.hasChrPrefix(),u=(f=(h=Z(this,Fh).indexToChr)==null?void 0:h[0])==null?void 0:f.refName.startsWith("chr");d&&!u?this.chrPrefixFixer=g=>g.replace("chr",""):!d&&u&&(this.chrPrefixFixer=g=>"chr"+g),o()})})})}get label(){return"bamSource"}async loadInterval(t){const i=await this.discretizeAndLoad(t,async(s,o)=>Z(this,Fh).getRecordsForRange(this.chrPrefixFixer(s.chrom),s.startPos,s.endPos,{signal:o}).then(r=>r.map(a=>({chrom:s.chrom,start:a.start,end:a.end,name:a.name,cigar:a.CIGAR,mapq:a.mq,strand:a.strand===1?"+":"-"}))));i&&this.publishData(i)}}Fh=new WeakMap;var Gp;class E$ extends H1{constructor(t,i){const s={channel:"x",windowSize:3e6,debounce:200,debounceMode:"domain",addChrPrefix:!1,...t};super(i,s.channel);Me(this,Gp);if(this.params=s,!this.params.url)throw new Error("No URL provided for TabixSource");this.setupDebouncing(this.params),this.initializedPromise=new Promise(o=>{Promise.all([Zn(()=>import("./index-Ct7_ui2i.js"),__vite__mapDeps([12,9,1,0,2,4,7,5]),import.meta.url),Zn(()=>import("./index-DVUJOETl.js"),__vite__mapDeps([6,4,7,0,1,2]),import.meta.url)]).then(async([{TabixIndexedFile:r},{RemoteFile:a}])=>{const l=d=>new a(z1(d,this.view.getBaseUrl()));at(this,Gp,new r({filehandle:l(this.params.url),tbiFilehandle:l(this.params.indexUrl??this.params.url+".tbi"),renameRefSeqs:this.params.addChrPrefix===!0?d=>"chr"+d:this.params.addChrPrefix?d=>this.params.addChrPrefix+d:void 0}));const c=await Z(this,Gp).getHeader();await this._handleHeader(c),o()})})}async loadInterval(t){await this.initializedPromise;const i=await this.discretizeAndLoad(t,async(s,o)=>{const r=[];return await Z(this,Gp).getLines(s.chrom,s.startPos,s.endPos,{lineCallback:a=>{r.push(a)},signal:o}),this._parseFeatures(r)});i&&this.publishData(i)}async _handleHeader(t){}_parseFeatures(t){return[]}}Gp=new WeakMap;var c1;class Lue extends E${constructor(){super(...arguments);Me(this,c1)}get label(){return"gff3Source"}async _handleHeader(t){at(this,c1,(await Zn(async()=>{const{default:i}=await import("./index-BR8RN3QU.js");return{default:i}},__vite__mapDeps([13,2,4,1]),import.meta.url)).default)}_parseFeatures(t){var s;return(s=Z(this,c1))==null?void 0:s.parseStringSync(t.join(` `),{parseSequences:!1})}}c1=new WeakMap;var d1;class Due extends E${constructor(){super(...arguments);Me(this,d1)}get label(){return"vcfSource"}async _handleHeader(t){const i=(await Zn(async()=>{const{default:s}=await import("./index-C2RWthb7.js");return{default:s}},[],import.meta.url)).default;at(this,d1,new i({header:t}))}_parseFeatures(t){return t.map(i=>{const s=Z(this,d1).parseLine(i);return delete s.GENOTYPES,s.SAMPLES=s.SAMPLES(),s})}}d1=new WeakMap;function kue(n,e){if(k$(n))return new uue(n,e);if(hue(n))return new fue(n,e);if(gue(n))return new pue(n,e);if(Eue(n))return Fue(n.lazy,e);throw new Error("Cannot figure out the data source type: "+JSON.stringify(n))}function Eue(n){return"lazy"in n}function Aue(n){return(n==null?void 0:n.type)=="axisTicks"}function Iue(n){return(n==null?void 0:n.type)=="axisGenome"}function Tue(n){return(n==null?void 0:n.type)=="indexedFasta"}function Nue(n){return(n==null?void 0:n.type)=="bigwig"}function Rue(n){return(n==null?void 0:n.type)=="bigbed"}function Mue(n){return(n==null?void 0:n.type)=="bam"}function Pue(n){return(n==null?void 0:n.type)=="gff3"}function Oue(n){return(n==null?void 0:n.type)=="vcf"}function Fue(n,e){if(Aue(n))return new mue(n,e);if(Iue(n))return new _ue(n,e);if(Tue(n))return new bue(n,e);if(Nue(n))return new vue(n,e);if(Rue(n))return new wue(n,e);if(Mue(n))return new xue(n,e);if(Pue(n))return new Lue(n,e);if(Oue(n))return new Due(n,e);throw new Error("Cannot figure out the data source type: "+JSON.stringify(n))}function Bue(n){const e=A$(n).filter(i=>typeof i=="string"),t=new Function("source","return { "+e.map(i=>JSON.stringify(i)).map(i=>`${i}: source[${i}]`).join(`, `)+" };");return t.properties=e,t}function A$(n){let e=[];do e=e.concat(Object.keys(n)),n=Object.getPrototypeOf(n);while(n&&n!==Object.prototype);return Array.from(new Set(e))}var Kp,u1;class dS extends Wn{constructor(){super({type:"clone"});Me(this,Kp);Me(this,u1,t=>t);const t=i=>{const s=A$(i);(!Z(this,Kp)||!ZC(s,Z(this,Kp)))&&(at(this,Kp,s),at(this,u1,Bue(i)));const o=Z(this,u1);this.handle=r=>this._propagate(o(r)),this.handle(i)};this.handle=t,this.beginBatch=i=>{wH(i)&&(this.handle=t),super.beginBatch(i)}}get behavior(){return gl}}Kp=new WeakMap,u1=new WeakMap;function Wue(n){return"name"in n}var h1;class I$ extends i0{constructor(t,i,s){super(i);Me(this,h1);this.provider=s,this.params=t}get identifier(){return this.params.name}get label(){return"namedSource"}updateDynamicData(t){at(this,h1,t),this.loadSynchronously()}loadSynchronously(){const t=Z(this,h1)??this.provider(this.params.name)??[];let i=s=>s;if(Array.isArray(t))t.length>0&&(i=D$(t[0]));else throw new Error(`Named data "${this.params.name}" is not an array!`);this.reset(),this.beginBatch({type:"file"});for(const s of t)this._propagate(i(s));this.complete()}async load(){this.loadSynchronously()}}h1=new WeakMap;class T${constructor(){this._dataSourcesByHost=new Map,this._collectorsByHost=new Map,this._observers=new Map}get dataSources(){return[...new Set(this._dataSourcesByHost.values()).values()]}get collectors(){return[...this._collectorsByHost.values()]}addObserver(e,t){let i=this._observers.get(t);i||(i=[],this._observers.set(t,i)),i.push(e)}_relayObserverCallback(e,t){const i=this._observers.get(t);if(i)for(const s of i)s(e)}addDataSource(e,t){this._dataSourcesByHost.set(t,e)}findDataSourceByKey(e){return this._dataSourcesByHost.get(e)}findNamedDataSource(e){let t,i=[];for(const[s,o]of this._dataSourcesByHost.entries())if(o instanceof I$&&e==o.identifier){if(t&&t!==o)throw new Error(`Found multiple instances of named data: ${e}. Data flow optimization is broken (it's a bug).`);t=o,i.push(s)}if(t)return{dataSource:t,hosts:i}}addCollector(e,t){this._collectorsByHost.set(t,e),e.observers.push(i=>this._relayObserverCallback(i,t))}findCollectorByKey(e){return this._collectorsByHost.get(e)}initialize(){for(const e of this.dataSources)e.visit(t=>t.initialize())}}function Vue(n,e){const t=new Map,i=[];for(const s of n)t.set(s,{ref:s,children:[]});for(const s of t.values()){const o=t.get(e(s.ref));o?o.children.push(s):i.push(s)}return i}function N$(n,e,t){var s,o;const i=(s=e.preOrder)==null?void 0:s.call(e,n);if(i)return i;for(const r of t(n)){const a=N$(r,e,t);if(a==="stop")return a}return(o=e.postOrder)==null?void 0:o.call(e,n)}function zue(n,e){return N$(n,e,t=>t.children)}function Hue(n,e){const t=[],i=[];let s;const o=e??new T$,r=[];function a(f,g=()=>{}){if(!s)throw g()||new Error("Cannot append data flow node, no parent exist!");return s.addChild(f),s=f,t.push(f),f}function l(f,g){return a(f,()=>new Error("Cannot append a transform because no (inherited) data are available! "))}function c(f,g){for(const p of f){let _;try{_=rue(p,g)}catch(v){throw console.warn(v),new Error(`Cannot initialize "${p.type}" transform: ${v}`)}_.behavior&wu&&l(new dS),l(_)}}function d(){return t.findLastIndex(f=>f instanceof yA)>t.findLastIndex(f=>f instanceof i0)}const u=f=>{if(f.spec.data){const g=Wue(f.spec.data)?new I$(f.spec.data,f,f.context.getNamedDataFromProvider):kue(f.spec.data,f);s=g,t.push(g),o.addDataSource(g,f)}if(f.spec.transform&&c(f.spec.transform,f),f instanceof Po){if(!s)throw new Error(`A unit view (${f.getPathString()}) has no (inherited) data source`);const g=$ue(f);if(g){r.push(g.rewrite);for(const _ of g.transforms)l(_)}f.mark.isPickingParticipant()&&!d()&&(l(new dS),l(new yA({type:"identifier"})));const p=new w$({type:"collect",groupby:f.getFacetFields(),sort:Uue(f,g==null?void 0:g.rewrittenEncoding)});a(p),o.addCollector(p,f)}},h=Vue(n.getDescendants(),f=>f.dataParent);for(const f of h)zue(f,{preOrder:g=>{i.push({view:g.ref,nodeStackDepth:t.length}),u(g.ref)},postOrder:()=>{const{nodeStackDepth:g}=i.pop();t.length=g,s=t.at(-1)}});return r.forEach(f=>f()),o}function $ue(n){var o;const e=[],t={},i=[];for(const[r,a]of Object.entries(n.getEncoding())){const l=r;Nb(l)&&EH(a)&&i.push({channel:l,chromPosDef:a})}const s=Qx(i,r=>bf(r.channel),r=>r.chromPosDef.chrom);for(const[r,a]of s.entries())for(const[l,c]of a.entries()){const d=[],u=[],h=[];for(const{channel:f,chromPosDef:g}of c){const p=b=>b.replace(/[^A-Za-z0-9_]/g,""),_=["_linearized_",p(g.chrom),"_",p(g.pos)].join(""),v={...((o=n.spec.encoding)==null?void 0:o[f])??n.getEncoding()[f]??{},field:_};delete v.chrom,delete v.pos,!v.type&&g.type&&(v.type=g.type),t[f]=v,d.push(g.pos),h.push(g.offset??0),u.push(_)}e.push(new dS),e.push(new S$({type:"linearizeGenomicCoordinate",channel:r,chrom:l,pos:d,offset:h,as:u},n))}return e.length?{transforms:e,rewrittenEncoding:t,rewrite:()=>{n.spec.encoding={...n.spec.encoding,...t},Yle(n.mark,"encoding")}}:void 0}function Uue(n,e){var i;const t={...n.getEncoding(),...e}.x;if(Vo(t)&&(i=n.getScaleResolution("x"))!=null&&i.isZoomable()){if(Cu(t))return"buildIndex"in t&&t.buildIndex?{field:t.field}:null;if(!R1(t)){if(M1(t))throw new Error("A zoomable x channel must be mapped to a field.")}}}function R$(n,e=void 0){if(n.parent!==e)return!1;for(const t of n.children)if(!R$(t,n))return!1;return!0}function GA(n,e=!1){if(n.behavior&f4&&(e=!0),n instanceof dS)if(e)e=!1;else{const t=n.children[0];n.excise(),t&&GA(t,e);return}n.behavior&gl&&(e=!1);for(let t=0,i=n.children.length;t1)}function jue(n){const e=[...n._dataSourcesByHost.entries()],t=new Map;for(const i of e){const s=i[1];s.identifier&&!t.has(s.identifier)&&t.set(s.identifier,s)}n._dataSourcesByHost.clear();for(let[i,s]of e){const o=t.get(s.identifier);o&&(o.adoptChildrenOf(s),s=o),n.addDataSource(s,i)}}function que(n){if(GA(n),!R$(n))throw new Error("Encountered a bug! There's a problem in the data flow structure.")}function Gue(n){jue(n);for(const e of n.dataSources)que(e)}function Kue(n){const e=new Set;n.visit(t=>{for(const i of Object.values(t.resolutions.scale)){const s=i.name;if(s&&e.has(s))throw new Error(`The same scale name "${s}" occurs in multiple scale resolutions!`);e.add(s)}})}function Yue(n){for(const e of t0){const t=n.getScaleResolution(e);t&&!t.name&&t.isZoomable()&&(t.name=`${e}_at_root`)}}async function Zue(n,e,t){const i=n.import;if(!("url"in i))throw new Error("Not an url import: "+JSON.stringify(i));const s=Pb(e,i.url);let o;try{const r=await fetch(s);if(!r.ok)throw new Error(`${r.status} ${r.statusText}`);o=await r.json()}catch(r){throw new Error(`Could not load imported view spec: ${s}. Reason: ${r.message}`)}if(t.isViewSpec(o))return o.baseUrl=Pb(n$(i.url),o.baseUrl),o;throw new Error(`The imported spec "${s}" is not a view spec: ${JSON.stringify(n)}`)}function Xue(n){const e=n.getSize(),t=n.getPadding(),i=(s,o)=>s.grow>0?void 0:s.px+o;return{width:i(e.width,t.horizontalTotal),height:i(e.height,t.verticalTotal)}}function bl(n){return()=>n}const Hr=class Hr{static create(e,t,i,s){return new Hr(bl(e),bl(t),bl(i),bl(s))}_offset(e,t){const i=this["_"+e];if(t===0)return i;switch(typeof t){case"number":return()=>i()+t;case"function":return()=>i()+t();default:throw new Error("Not a number of function")}}_passThrough(e){return this._offset(e,0)}constructor(e,t,i,s){this._x=e,this._y=t,this._width=i,this._height=s}get x(){return this._x()}get y(){return this._y()}get width(){return this._width()}get height(){return this._height()}get x2(){return this._x()+this._width()}get y2(){return this._y()+this._height()}equals(e){return e?this===e||this.x===e.x&&this.y===e.y&&this.width===e.width&&this.height===e.height:!1}modify(e){if(!Object.keys(e).length)return this;const t=i=>{const s=e[i];return typeof s=="number"?bl(s):typeof s=="function"?s:this._passThrough(i)};return new Hr(t("x"),t("y"),t("width"),t("height"))}translate(e,t){return e===0&&t===0?this:new Hr(this._offset("x",e),this._offset("y",t),this._passThrough("width"),this._passThrough("height"))}translateBy(e){return this.translate(e.x,e.y)}expand(e,t=1){return e.left==0&&e.top==0&&e.right==0&&e.bottom==0?this:new Hr(e.left?this._offset("x",-e.left*t):this._passThrough("x"),e.top?this._offset("y",-e.top*t):this._passThrough("y"),e.width?this._offset("width",e.width*t):this._passThrough("width"),e.height?this._offset("height",e.height*t):this._passThrough("height"))}shrink(e){return this.expand(e,-1)}intersect(e){return this===e||e==null?this:new Hr(()=>Math.max(this.x,e.x),()=>Math.max(this.y,e.y),()=>Math.min(this.x2,e.x2)-Math.max(this.x,e.x),()=>Math.min(this.y2,e.y2)-Math.max(this.y,e.y))}union(e){return this===e||e==null?this:new Hr(()=>Math.min(this.x,e.x),()=>Math.min(this.y,e.y),()=>Math.max(this.x2,e.x2)-Math.min(this.x,e.x),()=>Math.max(this.y2,e.y2)-Math.min(this.y,e.y))}isDefined(){return this.width>=0&&this.height>=0}flatten(){return new Hr(bl(this.x),bl(this.y),bl(this.width),bl(this.height))}containsPoint(e,t){return e>=this.x&&e=this.y&&t()=>{e&&r()},s=r=>()=>{e&&t&&r()},o=Qx(this.buffer.reverse(),r=>r.mark);for(const[r,a]of[...o.entries()].reverse()){if(!r.isReady())continue;this.batch.push(()=>{e=r.unitView.getEffectiveOpacity()>0}),this.batch.push(...r.prepareRender(this.globalOptions).map(c=>i(c)));let l;for(const c of a){const d=c.coords;d.equals(l)||this.batch.push(i(()=>{t=r.setViewport(d,c.clipRect)})),this.batch.push(s(c.callback)),l=c.coords}}}}class Que extends M${constructor(...e){super({}),this.contexts=e}pushView(e,t){for(const i of this.contexts)i.pushView(e,t)}popView(e){for(const t of this.contexts)t.popView(e)}renderMark(e,t){for(const i of this.contexts)i.renderMark(e,t)}}class Jue{constructor(e,t){this.point=e,this.uiEvent=t,this.stopped=!1,this.target=void 0}stopPropagation(){this.stopped=!0}get type(){return this.uiEvent.type}}class Fa{static fromMouseEvent(e){return new Fa(e.clientX,e.clientY)}constructor(e,t){this.x=e,this.y=t}subtract(e){return new Fa(this.x-e.x,this.y-e.y)}add(e){return new Fa(this.x-e.x,this.y-e.y)}multiply(e){return new Fa(this.x*e,this.y*e)}get length(){return Math.sqrt(this.x**2+this.y**2)}equals(e){return e?e===this||e.x===this.x&&e.y===this.y:!1}}const ehe=n=>new Promise(e=>setTimeout(e,n));function the(n){const e=n.requestAnimationFrame||window.requestAnimationFrame,t=n.signal,i=()=>new Promise((s,o)=>{if(t!=null&&t.aborted)return o("aborted");const r=performance.now(),a=r+(n.duration||1e3),l=typeof n.from=="number"?n.from:0,c=typeof n.to=="number"?n.to:1,d=n.easingFunction||(p=>p),u=p=>(p-r)/(a-r),h=p=>p*(c-l)+l,f=p=>Math.max(0,Math.min(1,p)),g=p=>{t!=null&&t.aborted?o("aborted"):(n.onUpdate(h(d(f(u(p))))),p=0&&this.transitions.splice(t,1)}requestRender(){this._renderRequested?this._warn&&console.warn("Render already requested!"):(this._renderRequested=!0,window.requestAnimationFrame(e=>{this._renderRequested=!1;const t=this.transitions;this.transitions=[];let i;for(;i=t.shift();)i(e);this._renderCallback(e)}))}transition(e){return the({requestAnimationFrame:t=>this.requestTransition(t),...e})}}function S4(n,e,t,i,s){let o=0,r=!0,a=structuredClone(s),l=a;function c(h,f,g,p){return f+(h-f)*Math.pow(2,-g/p)}function d(h){if(r)return;const f=h-o;o=h;for(const p of Object.keys(l))a[p]=c(a[p],l[p],f,t);e(a);let g=-1/0;for(const p of Object.keys(l))g=Math.max(g,Math.abs(l[p]-a[p]));gd(p))}function u(h){l=h,r&&(r=!1,o=+document.timeline.currentTime,d(o))}return u.stop=()=>{r=!0},u}class nhe{constructor(e){this.genomes=new Map,this.baseUrl=e}async initialize(e){const t=new lde(e);return this.genomes.set(t.name,t),Promise.all([...this.genomes.values()].map(i=>i.load(this.baseUrl)))}getGenome(e){if(!this.genomes.size)throw new Error("No genomes have been configured!");if(e){const t=this.genomes.get(e);if(!t)throw new Error(`No genome with the name ${e} has been configured!`);return t}else{if(this.genomes.size>1)throw new Error("Cannot pick a default genome! More than one have been configured!");return this.genomes.values().next().value}}}const she=""+new URL("Lato-Regular-BEY4SZ9T.png",import.meta.url).href,ohe={thin:100,light:300,regular:400,normal:400,medium:500,bold:700,black:900};class rhe{constructor(e){this._webGLHelper=e,this.fontRepository="https://raw.githubusercontent.com/etiennepinchon/aframe-fonts/master/fonts/",this._fonts=new gc([],JSON.stringify),this._metadataPromises=new Map,this._fontPromises=new Map,this._promises=[],this._defaultFontEntry={metrics:xA(x$),texture:e?this._createTextureNow(she):void 0}}async waitUntilReady(){await Promise.all(this._promises)}getFont(e,t="normal",i="regular"){if(Ti(i)&&(i=ohe[i.toLowerCase()],!i))throw new Error("Unknown font weight: "+i);const s={family:e,style:t,weight:i};let o=this._fonts.get(s);return o||(o={metrics:void 0,texture:void 0},this._fonts.set(s,o),this._promises.push(this._loadFontEntry(o,s))),o}async _loadFontEntry(e,t){try{const i=await this._loadMetadata(t.family),s=lhe(i,t),o=this.fontRepository+wF(t.family)+"/"+s.replace(/\.\w+/,""),r=this._createTexture(o+".png"),a=this._loadFont(o+".json");e.texture=await r,e.metrics=await a}catch{console.warn(`Cannot load font: "${t.family}". Using the embedded default font.`),e.metrics=this._defaultFontEntry.metrics,e.texture=this._defaultFontEntry.texture}}_loadFont(e){let t=this._fontPromises.get(e);return t||(t=fetch(e).then(i=>{if(!i.ok)throw new Error("Could not load font: "+i.status);return i}).then(i=>i.json()).then(i=>xA(i)),this._fontPromises.set(e,t)),t}_loadMetadata(e){const t=wF(e);let i=this._metadataPromises.get(t);if(!i){const s=this.fontRepository+t+"/METADATA.pb";i=fetch(s).then(o=>{if(!o.ok)throw new Error("Could not load font metadata. Response status: "+o.status+", url: "+s);return o}).then(o=>o.text()).then(o=>ahe(o)).catch(o=>{console.warn(o.message)}),this._metadataPromises.set(t,i)}return i}getDefaultFont(){return this._defaultFontEntry}_createTexture(e){const t=this._webGLHelper.gl;return new Promise((i,s)=>{Db(t,{src:e,min:t.LINEAR},(o,r,a)=>{o?s(o):i(r)})})}_createTextureNow(e){const t=this._webGLHelper.gl;let i;const s=new Promise((o,r)=>{i=Db(t,{src:e,min:t.LINEAR},(a,l,c)=>{a?r(a):o(l)})});return this._promises.push(s),i}}function wF(n){return n.toLowerCase().replaceAll(/[^\w]/g,"")}function ahe(n){const e=n.split(` `),t=[];let i;for(const s of e)if(s.startsWith("fonts {")&&(i={name:void 0,style:void 0,weight:void 0,filename:void 0,post_script_name:void 0,full_name:void 0,copyright:void 0}),s.startsWith("}")&&(t.push(i),i=void 0),i){let o=s.match(/^\s*([A-Za-z_]+):[ ]?"(.*)"$/);if(o){const r=o[1];i[r]=o[2]}if(o=s.match(/^\s*([A-Za-z_]+):[ ]?(\d+)$/),o){const r=o[1];i[r]=+o[2]}}return t}function lhe(n,e){let t,i=Number.POSITIVE_INFINITY;for(const s of n)if(e.family.localeCompare(s.name,void 0,{sensitivity:"accent"})==0&&e.style==s.style){const o=Math.abs(e.weight-s.weight);o - `}return""},s=(c,d)=>{const u=c.filter(([h,f])=>!h.startsWith("_"));if(u.length!==0)return u.map(([h,f])=>typeof f=="object"&&!Array.isArray(f)?St`${s(Object.entries(f),(d||"")+h+".")}`:St` + `}return""},s=(c,d)=>{const u=c.filter(([h,f])=>!h.startsWith("_"));if(u.length!==0)return u.map(([h,f])=>f!==null&&typeof f=="object"&&!Array.isArray(f)?St`${s(Object.entries(f),(d||"")+h+".")}`:St` ${d}${h} ${P$(f)} ${i(h,n)} @@ -3305,7 +3305,7 @@ ${e.toString()}`}}class Lx{constructor(e=new yL,t=!1,i,s=_Ae){var o;this._servic `:`\r `),yield this._clipboardService.writeText(w)}))),i.getOption(90)||v.push(new So("diff.inline.revertChange",m("diff.inline.revertChange.label","Revert this change"),void 0,!0,()=>gE(this,void 0,void 0,function*(){this._editor.revert(this._diff)}))),v},autoSelectFirstItem:!0})};this._register(Ui(this._diffActions,"mousedown",g=>{const{top:p,height:_}=Tn(this._diffActions),v=Math.floor(d/3);g.preventDefault(),f(g.posx,p+_+v)})),this._register(i.onMouseMove(g=>{(g.target.type===8||g.target.type===5)&&g.target.detail.viewZoneId===this._getViewZoneId()?(u=this._updateLightBulbPosition(this._marginDomNode,g.event.browserEvent.y,d),this.visibility=!0):this.visibility=!1})),this._register(i.onMouseDown(g=>{g.event.rightButton&&(g.target.type===8||g.target.type===5)&&g.target.detail.viewZoneId===this._getViewZoneId()&&(g.event.preventDefault(),u=this._updateLightBulbPosition(this._marginDomNode,g.event.browserEvent.y,d),f(g.event.posx,g.event.posy+d))}))}_updateLightBulbPosition(e,t,i){const{top:s}=Tn(e),o=t-s,r=Math.floor(o/i),a=r*i;if(this._diffActions.style.top=`${a}px`,this._viewLineCounts){let l=0;for(let c=0;cn});function IIe(n,e,t,i){Nn(i,e.fontInfo);const s=t.length>0,o=new tL(1e4);let r=0,a=0;const l=[];for(let h=0;h');const l=e.getLineContent(),c=Lo.isBasicASCII(l,s),d=Lo.containsRTL(l,c,o),u=c3(new c0(r.fontInfo.isMonospace&&!r.disableMonospaceOptimizations,r.fontInfo.canUseHalfwidthRightwardsArrow,l,!1,c,d,0,e,t,r.tabSize,0,r.fontInfo.spaceWidth,r.fontInfo.middotWidth,r.fontInfo.wsmiddotWidth,r.stopRenderingLineAfter,r.renderWhitespace,r.renderControlCharacters,r.fontLigatures!==To.OFF,null),a);return a.appendString(""),u.characterMapping.getHorizontalOffset(u.characterMapping.length)}var NIe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},X8=function(n,e){return function(t,i){e(t,i,n)}};let gR=class extends Y{constructor(e,t,i,s,o,r,a){super(),this._editors=e,this._diffModel=t,this._options=i,this._diffEditorWidget=s,this._canIgnoreViewZoneUpdateEvent=o,this._clipboardService=r,this._contextMenuService=a,this._originalTopPadding=ai(this,0),this._originalScrollOffset=ai(this,0),this._originalScrollOffsetAnimated=B8(this._originalScrollOffset,this._store),this._modifiedTopPadding=ai(this,0),this._modifiedScrollOffset=ai(this,0),this._modifiedScrollOffsetAnimated=B8(this._modifiedScrollOffset,this._store);let l=!1;const c=ai("state",0),d=this._register(new Li(()=>{c.set(c.get()+1,void 0)},0));this._register(this._editors.original.onDidChangeViewZones(w=>{!l&&!this._canIgnoreViewZoneUpdateEvent()&&d.schedule()})),this._register(this._editors.modified.onDidChangeViewZones(w=>{!l&&!this._canIgnoreViewZoneUpdateEvent()&&d.schedule()})),this._register(this._editors.original.onDidChangeConfiguration(w=>{(w.hasChanged(144)||w.hasChanged(66))&&d.schedule()})),this._register(this._editors.modified.onDidChangeConfiguration(w=>{(w.hasChanged(144)||w.hasChanged(66))&&d.schedule()}));const u=this._diffModel.map(w=>w?As(w.model.original.onDidChangeTokens,()=>w.model.original.tokenization.backgroundTokenizationState===2):void 0).map((w,S)=>w==null?void 0:w.read(S)),h=new Set,f=new Set,g=_t(w=>{const S=this._diffModel.read(w),L=S==null?void 0:S.diff.read(w);if(!S||!L)return null;c.read(w);const D=this._options.renderSideBySide.read(w);return Q8(this._editors.original,this._editors.modified,L.mappings,h,f,D)}),p=_t(w=>{var S;const L=(S=this._diffModel.read(w))===null||S===void 0?void 0:S.movedTextToCompare.read(w);if(!L)return null;c.read(w);const x=L.changes.map(D=>new MK(D));return Q8(this._editors.original,this._editors.modified,x,h,f,!0)});function _(){const w=document.createElement("div");return w.className="diagonal-fill",w}const v=this._register(new pe),b=_t(w=>{var S,L,x,D,k,P,O,M;v.clear();const R=g.read(w)||[],z=[],G=[],te=this._modifiedTopPadding.read(w);te>0&&G.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:te,showInHiddenAreas:!0,suppressMouseDown:!0});const ae=this._originalTopPadding.read(w);ae>0&&z.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:ae,showInHiddenAreas:!0,suppressMouseDown:!0});const fe=this._options.renderSideBySide.read(w),oe=fe||(S=this._editors.modified._getViewModel())===null||S===void 0?void 0:S.createLineBreaksComputer();if(oe){for(const qe of R)if(qe.diff)for(let ni=qe.originalRange.startLineNumber;nithis._editors.original.getModel().tokenization.getLineTokens(It)),qe.originalRange.mapToLineArray(It=>Se[Ie++]),Zt,Dt),ge=[];for(const It of qe.diff.innerChanges||[])ge.push(new V_(It.originalRange.delta(-(qe.diff.original.startLineNumber-1)),cR.className,0));const he=IIe(Ve,Tt,ge,ke),ki=document.createElement("div");if(ki.className="inline-deleted-margin-view-zone",Nn(ki,Tt.fontInfo),this._options.renderIndicators.read(w))for(let It=0;ItiI(kt),ki,this._editors.modified,qe.diff,this._diffEditorWidget,he.viewLineCounts,this._editors.original.getModel(),this._contextMenuService,this._clipboardService));for(let It=0;It1&&z.push({afterLineNumber:qe.originalRange.startLineNumber+It,domNode:_(),heightInPx:(vi-1)*me,showInHiddenAreas:!0,suppressMouseDown:!0})}G.push({afterLineNumber:qe.modifiedRange.startLineNumber-1,domNode:ke,heightInPx:he.heightInLines*me,minWidthInPx:he.minWidthInPx,marginDomNode:ki,setZoneId(It){kt=It},showInHiddenAreas:!0,suppressMouseDown:!0})}const ni=document.createElement("div");ni.className="gutter-delete",z.push({afterLineNumber:qe.originalRange.endLineNumberExclusive-1,domNode:_(),heightInPx:qe.modifiedHeightInPx,marginDomNode:ni,showInHiddenAreas:!0,suppressMouseDown:!0})}else{const ni=qe.modifiedHeightInPx-qe.originalHeightInPx;if(ni>0){if(ie!=null&&ie.lineRangeMapping.original.delta(-1).deltaLength(2).contains(qe.originalRange.endLineNumberExclusive-1))continue;z.push({afterLineNumber:qe.originalRange.endLineNumberExclusive-1,domNode:_(),heightInPx:ni,showInHiddenAreas:!0,suppressMouseDown:!0})}else{let ke=function(){const ge=document.createElement("div");return ge.className="arrow-revert-change "+Te.asClassName(se.arrowRight),ye("div",{},ge)};if(ie!=null&&ie.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(qe.modifiedRange.endLineNumberExclusive-1))continue;let Ve;qe.diff&&qe.diff.modified.isEmpty&&this._options.shouldRenderRevertArrows.read(w)&&(Ve=ke()),G.push({afterLineNumber:qe.modifiedRange.endLineNumberExclusive-1,domNode:_(),heightInPx:-ni,marginDomNode:Ve,showInHiddenAreas:!0,suppressMouseDown:!0})}}for(const qe of(M=p.read(w))!==null&&M!==void 0?M:[]){if(!(ie!=null&&ie.lineRangeMapping.original.intersect(qe.originalRange))||!(ie!=null&&ie.lineRangeMapping.modified.intersect(qe.modifiedRange)))continue;const ni=qe.modifiedHeightInPx-qe.originalHeightInPx;ni>0?z.push({afterLineNumber:qe.originalRange.endLineNumberExclusive-1,domNode:_(),heightInPx:ni,showInHiddenAreas:!0,suppressMouseDown:!0}):G.push({afterLineNumber:qe.modifiedRange.endLineNumberExclusive-1,domNode:_(),heightInPx:-ni,showInHiddenAreas:!0,suppressMouseDown:!0})}return{orig:z,mod:G}});this._register($s(w=>{const S=Ov.capture(this._editors.modified),L=b.read(w);l=!0,this._editors.original.changeViewZones(x=>{for(const D of h)x.removeZone(D);h.clear();for(const D of L.orig){const k=x.addZone(D);D.setZoneId&&D.setZoneId(k),h.add(k)}}),this._editors.modified.changeViewZones(x=>{for(const D of f)x.removeZone(D);f.clear();for(const D of L.mod){const k=x.addZone(D);D.setZoneId&&D.setZoneId(k),f.add(k)}}),l=!1,S.restore(this._editors.modified)})),this._register(Ye(()=>{this._editors.original.changeViewZones(w=>{for(const S of h)w.removeZone(S);h.clear()}),this._editors.modified.changeViewZones(w=>{for(const S of f)w.removeZone(S);f.clear()})}));let y=!1;this._register(this._editors.original.onDidScrollChange(w=>{w.scrollLeftChanged&&!y&&(y=!0,this._editors.modified.setScrollLeft(w.scrollLeft),y=!1)})),this._register(this._editors.modified.onDidScrollChange(w=>{w.scrollLeftChanged&&!y&&(y=!0,this._editors.original.setScrollLeft(w.scrollLeft),y=!1)})),this._originalScrollTop=As(this._editors.original.onDidScrollChange,()=>this._editors.original.getScrollTop()),this._modifiedScrollTop=As(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),this._register(di(w=>{const S=this._originalScrollTop.read(w)-(this._originalScrollOffsetAnimated.get()-this._modifiedScrollOffsetAnimated.read(w))-(this._originalTopPadding.get()-this._modifiedTopPadding.read(w));S!==this._editors.modified.getScrollTop()&&this._editors.modified.setScrollTop(S,1)})),this._register(di(w=>{const S=this._modifiedScrollTop.read(w)-(this._modifiedScrollOffsetAnimated.get()-this._originalScrollOffsetAnimated.read(w))-(this._modifiedTopPadding.get()-this._originalTopPadding.read(w));S!==this._editors.original.getScrollTop()&&this._editors.original.setScrollTop(S,1)})),this._register(di(w=>{var S;const L=(S=this._diffModel.read(w))===null||S===void 0?void 0:S.movedTextToCompare.read(w);let x=0;if(L){const D=this._editors.original.getTopForLineNumber(L.lineRangeMapping.original.startLineNumber,!0)-this._originalTopPadding.get();x=this._editors.modified.getTopForLineNumber(L.lineRangeMapping.modified.startLineNumber,!0)-this._modifiedTopPadding.get()-D}x>0?(this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(x,void 0)):x<0?(this._modifiedTopPadding.set(-x,void 0),this._originalTopPadding.set(0,void 0)):setTimeout(()=>{this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(0,void 0)},400),this._editors.modified.hasTextFocus()?this._originalScrollOffset.set(this._modifiedScrollOffset.get()-x,void 0,!0):this._modifiedScrollOffset.set(this._originalScrollOffset.get()+x,void 0,!0)}))}};gR=NIe([X8(5,py),X8(6,Nu)],gR);function Q8(n,e,t,i,s,o){const r=new _c(J8(n,i)),a=new _c(J8(e,s)),l=n.getOption(66),c=e.getOption(66),d=[];let u=0,h=0;function f(g,p){for(;;){let _=r.peek(),v=a.peek();if(_&&_.lineNumber>=g&&(_=void 0),v&&v.lineNumber>=p&&(v=void 0),!_&&!v)break;const b=_?_.lineNumber-u:Number.MAX_VALUE,y=v?v.lineNumber-h:Number.MAX_VALUE;by?(a.dequeue(),_={lineNumber:v.lineNumber-h+u,heightInPx:0}):(r.dequeue(),a.dequeue()),d.push({originalRange:Xe.ofLength(_.lineNumber,1),modifiedRange:Xe.ofLength(v.lineNumber,1),originalHeightInPx:l+_.heightInPx,modifiedHeightInPx:c+v.heightInPx,diff:void 0})}}for(const g of t){let y=function(w,S){var L,x,D,k;if(wz.lineNumberz+G.heightInPx,0))!==null&&x!==void 0?x:0,R=(k=(D=a.takeWhile(z=>z.lineNumberz+G.heightInPx,0))!==null&&k!==void 0?k:0;d.push({originalRange:P,modifiedRange:O,originalHeightInPx:P.length*l+M,modifiedHeightInPx:O.length*c+R,diff:g.lineRangeMapping}),b=w,v=S};const p=g.lineRangeMapping;f(p.original.startLineNumber,p.modified.startLineNumber);let _=!0,v=p.modified.startLineNumber,b=p.original.startLineNumber;if(o)for(const w of p.innerChanges||[])w.originalRange.startColumn>1&&w.modifiedRange.startColumn>1&&y(w.originalRange.startLineNumber,w.modifiedRange.startLineNumber),w.originalRange.endColumn1&&i.push({lineNumber:l,heightInPx:r*(c-1)})}for(const l of n.getWhitespaces()){if(e.has(l.id))continue;const c=l.afterLineNumber===0?0:o.convertViewPositionToModelPosition(new V(l.afterLineNumber,1)).lineNumber;t.push({lineNumber:c,heightInPx:l.height})}return ZAe(t,i,l=>l.lineNumber,(l,c)=>({lineNumber:l.lineNumber,heightInPx:l.heightInPx+c.heightInPx}))}var RIe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},MIe=function(n,e){return function(t,i){e(t,i,n)}},zr;let dc=zr=class extends Y{constructor(e,t,i,s,o,r,a,l){super(),this._editors=e,this._rootElement=t,this._diffModel=i,this._rootWidth=s,this._rootHeight=o,this._modifiedEditorLayoutInfo=r,this._options=a,this._themeService=l;const c=As(this._themeService.onDidColorThemeChange,()=>this._themeService.getColorTheme()),d=_t(f=>{const g=c.read(f),p=g.getColor(zve)||(g.getColor(Wve)||ET).transparent(2),_=g.getColor(Hve)||(g.getColor(Vve)||AT).transparent(2);return{insertColor:p,removeColor:_}}),u=As(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),h=As(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollHeight());this._register($s((f,g)=>{if(!this._options.renderOverviewRuler.read(f))return;const p=bt(document.createElement("div"));p.setClassName("diffViewport"),p.setPosition("absolute");const _=dn("div.diffOverview",{style:{position:"absolute",top:"0px",width:zr.ENTIRE_DIFF_OVERVIEW_WIDTH+"px"}}).root;g.add(Lw(_,p.domNode)),g.add(Ui(_,de.POINTER_DOWN,v=>{this._editors.modified.delegateVerticalScrollbarPointerDown(v)})),g.add(K(_,de.MOUSE_WHEEL,v=>{this._editors.modified.delegateScrollFromMouseWheelEvent(v)},{passive:!1})),g.add(Lw(this._rootElement,_)),g.add($s((v,b)=>{const y=this._diffModel.read(v),w=this._editors.original.createOverviewRuler("original diffOverviewRuler");w&&(b.add(w),b.add(Lw(_,w.getDomNode())));const S=this._editors.modified.createOverviewRuler("modified diffOverviewRuler");if(S&&(b.add(S),b.add(Lw(_,S.getDomNode()))),!w||!S)return;const L=Ro("viewZoneChanged",this._editors.original.onDidChangeViewZones),x=Ro("viewZoneChanged",this._editors.modified.onDidChangeViewZones),D=Ro("hiddenRangesChanged",this._editors.original.onDidChangeHiddenAreas),k=Ro("hiddenRangesChanged",this._editors.modified.onDidChangeHiddenAreas);b.add(di(P=>{var O;L.read(P),x.read(P),D.read(P),k.read(P);const M=d.read(P),R=(O=y==null?void 0:y.diff.read(P))===null||O===void 0?void 0:O.mappings;function z(ae,fe,oe){const Se=oe._getViewModel();return Se?ae.filter(Ie=>Ie.length>0).map(Ie=>{const me=Se.coordinatesConverter.convertModelPositionToViewPosition(new V(Ie.startLineNumber,1)),ie=Se.coordinatesConverter.convertModelPositionToViewPosition(new V(Ie.endLineNumberExclusive,1)),Zt=ie.lineNumber-me.lineNumber;return new Aq(me.lineNumber,ie.lineNumber,Zt,fe.toString())}):[]}const G=z((R||[]).map(ae=>ae.lineRangeMapping.original),M.removeColor,this._editors.original),te=z((R||[]).map(ae=>ae.lineRangeMapping.modified),M.insertColor,this._editors.modified);w==null||w.setZones(G),S==null||S.setZones(te)})),b.add(di(P=>{const O=this._rootHeight.read(P),M=this._rootWidth.read(P),R=this._modifiedEditorLayoutInfo.read(P);if(R){const z=zr.ENTIRE_DIFF_OVERVIEW_WIDTH-2*zr.ONE_OVERVIEW_WIDTH;w.setLayout({top:0,height:O,right:z+zr.ONE_OVERVIEW_WIDTH,width:zr.ONE_OVERVIEW_WIDTH}),S.setLayout({top:0,height:O,right:0,width:zr.ONE_OVERVIEW_WIDTH});const G=u.read(P),te=h.read(P),ae=this._editors.modified.getOption(102),fe=new Nm(ae.verticalHasArrows?ae.arrowSize:0,ae.verticalScrollbarSize,0,R.height,te,G);p.setTop(fe.getSliderPosition()),p.setHeight(fe.getSliderSize())}else p.setTop(0),p.setHeight(0);_.style.height=O+"px",_.style.left=M-zr.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",p.setWidth(zr.ENTIRE_DIFF_OVERVIEW_WIDTH)}))}))}))}};dc.ONE_OVERVIEW_WIDTH=15;dc.ENTIRE_DIFF_OVERVIEW_WIDTH=zr.ONE_OVERVIEW_WIDTH*2;dc=zr=RIe([MIe(7,ro)],dc);E("diffEditor.move.border",{dark:"#8b8b8b9c",light:"#8b8b8b9c",hcDark:"#8b8b8b9c",hcLight:"#8b8b8b9c"},m("diffEditor.move.border","The border color for text that got moved in the diff editor."));E("diffEditor.moveActive.border",{dark:"#FFA500",light:"#FFA500",hcDark:"#FFA500",hcLight:"#FFA500"},m("diffEditor.moveActive.border","The active border color for text that got moved in the diff editor."));class jL extends Y{constructor(){super(...arguments),this._id=++jL.idCounter,this._onDidDispose=this._register(new B),this.onDidDispose=this._onDidDispose.event}getId(){return this.getEditorType()+":v2:"+this._id}getVisibleColumnFromPosition(e){return this._targetEditor.getVisibleColumnFromPosition(e)}getPosition(){return this._targetEditor.getPosition()}setPosition(e,t="api"){this._targetEditor.setPosition(e,t)}revealLine(e,t=0){this._targetEditor.revealLine(e,t)}revealLineInCenter(e,t=0){this._targetEditor.revealLineInCenter(e,t)}revealLineInCenterIfOutsideViewport(e,t=0){this._targetEditor.revealLineInCenterIfOutsideViewport(e,t)}revealLineNearTop(e,t=0){this._targetEditor.revealLineNearTop(e,t)}revealPosition(e,t=0){this._targetEditor.revealPosition(e,t)}revealPositionInCenter(e,t=0){this._targetEditor.revealPositionInCenter(e,t)}revealPositionInCenterIfOutsideViewport(e,t=0){this._targetEditor.revealPositionInCenterIfOutsideViewport(e,t)}revealPositionNearTop(e,t=0){this._targetEditor.revealPositionNearTop(e,t)}getSelection(){return this._targetEditor.getSelection()}getSelections(){return this._targetEditor.getSelections()}setSelection(e,t="api"){this._targetEditor.setSelection(e,t)}setSelections(e,t="api"){this._targetEditor.setSelections(e,t)}revealLines(e,t,i=0){this._targetEditor.revealLines(e,t,i)}revealLinesInCenter(e,t,i=0){this._targetEditor.revealLinesInCenter(e,t,i)}revealLinesInCenterIfOutsideViewport(e,t,i=0){this._targetEditor.revealLinesInCenterIfOutsideViewport(e,t,i)}revealLinesNearTop(e,t,i=0){this._targetEditor.revealLinesNearTop(e,t,i)}revealRange(e,t=0,i=!1,s=!0){this._targetEditor.revealRange(e,t,i,s)}revealRangeInCenter(e,t=0){this._targetEditor.revealRangeInCenter(e,t)}revealRangeInCenterIfOutsideViewport(e,t=0){this._targetEditor.revealRangeInCenterIfOutsideViewport(e,t)}revealRangeNearTop(e,t=0){this._targetEditor.revealRangeNearTop(e,t)}revealRangeNearTopIfOutsideViewport(e,t=0){this._targetEditor.revealRangeNearTopIfOutsideViewport(e,t)}revealRangeAtTop(e,t=0){this._targetEditor.revealRangeAtTop(e,t)}getSupportedActions(){return this._targetEditor.getSupportedActions()}focus(){this._targetEditor.focus()}trigger(e,t,i){this._targetEditor.trigger(e,t,i)}createDecorationsCollection(e){return this._targetEditor.createDecorationsCollection(e)}changeDecorations(e){return this._targetEditor.changeDecorations(e)}}jL.idCounter=0;var PIe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},eB=function(n,e){return function(t,i){e(t,i,n)}};let pR=class extends Y{constructor(e,t,i,s,o,r,a){super(),this.originalEditorElement=e,this.modifiedEditorElement=t,this._options=i,this._createInnerEditor=o,this._instantiationService=r,this._keybindingService=a,this._onDidContentSizeChange=this._register(new B),this.original=this._register(this._createLeftHandSideEditor(i.editorOptions.get(),s.originalEditor||{})),this.modified=this._register(this._createRightHandSideEditor(i.editorOptions.get(),s.modifiedEditor||{})),this.modifiedModel=As(this.modified.onDidChangeModel,()=>this.modified.getModel()),this._register(HL({createEmptyChangeSummary:()=>({}),handleChange:(l,c)=>(l.didChange(i.editorOptions)&&Object.assign(c,l.change.changedOptions),!0)},(l,c)=>{i.editorOptions.read(l),this._options.renderSideBySide.read(l),this.modified.updateOptions(this._adjustOptionsForRightHandSide(l,c)),this.original.updateOptions(this._adjustOptionsForLeftHandSide(l,c))}))}_createLeftHandSideEditor(e,t){const i=this._adjustOptionsForLeftHandSide(void 0,e),s=this._constructInnerEditor(this._instantiationService,this.originalEditorElement,i,t);return s.setContextValue("isInDiffLeftEditor",!0),s}_createRightHandSideEditor(e,t){const i=this._adjustOptionsForRightHandSide(void 0,e),s=this._constructInnerEditor(this._instantiationService,this.modifiedEditorElement,i,t);return s.setContextValue("isInDiffRightEditor",!0),s}_constructInnerEditor(e,t,i,s){const o=this._createInnerEditor(e,t,i,s);return this._register(o.onDidContentSizeChange(r=>{const a=this.original.getContentWidth()+this.modified.getContentWidth()+dc.ENTIRE_DIFF_OVERVIEW_WIDTH,l=Math.max(this.modified.getContentHeight(),this.original.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:l,contentWidth:a,contentHeightChanged:r.contentHeightChanged,contentWidthChanged:r.contentWidthChanged})})),o}_adjustOptionsForLeftHandSide(e,t){const i=this._adjustOptionsForSubEditor(t);return this._options.renderSideBySide.get()?(i.unicodeHighlight=this._options.editorOptions.get().unicodeHighlight||{},i.wordWrapOverride1=this._options.diffWordWrap.get()):(i.wordWrapOverride1="off",i.wordWrapOverride2="off",i.stickyScroll={enabled:!1},i.unicodeHighlight={nonBasicASCII:!1,ambiguousCharacters:!1,invisibleCharacters:!1}),t.originalAriaLabel&&(i.ariaLabel=t.originalAriaLabel),i.ariaLabel=this._updateAriaLabel(i.ariaLabel),i.readOnly=!this._options.originalEditable.get(),i.dropIntoEditor={enabled:!i.readOnly},i.extraEditorClassName="original-in-monaco-diff-editor",i}_adjustOptionsForRightHandSide(e,t){const i=this._adjustOptionsForSubEditor(t);return t.modifiedAriaLabel&&(i.ariaLabel=t.modifiedAriaLabel),i.ariaLabel=this._updateAriaLabel(i.ariaLabel),i.wordWrapOverride1=this._options.diffWordWrap.get(),i.revealHorizontalRightPadding=Vf.revealHorizontalRightPadding.defaultValue+dc.ENTIRE_DIFF_OVERVIEW_WIDTH,i.scrollbar.verticalHasArrows=!1,i.extraEditorClassName="modified-in-monaco-diff-editor",i}_adjustOptionsForSubEditor(e){const t=Object.assign(Object.assign({},e),{dimension:{height:0,width:0}});return t.inDiffEditor=!0,t.automaticLayout=!1,t.scrollbar=Object.assign({},t.scrollbar||{}),t.scrollbar.vertical="visible",t.folding=!1,t.codeLens=this._options.diffCodeLens.get(),t.fixedOverflowWidgets=!0,t.minimap=Object.assign({},t.minimap||{}),t.minimap.enabled=!1,this._options.hideUnchangedRegions.get()?t.stickyScroll={enabled:!1}:t.stickyScroll=this._options.editorOptions.get().stickyScroll,t}_updateAriaLabel(e){var t;e||(e="");const i=m("diff-aria-navigation-tip"," use {0} to open the accessibility help.",(t=this._keybindingService.lookupKeybinding("editor.action.accessibilityHelp"))===null||t===void 0?void 0:t.getAriaLabel());return this._options.accessibilityVerbose.get()?e+i:e?e.replaceAll(i,""):""}};pR=PIe([eB(5,vt),eB(6,bi)],pR);class OIe{get editorOptions(){return this._options}constructor(e,t){this.diffEditorWidth=t,this.couldShowInlineViewBecauseOfSize=_t(this,s=>this._options.read(s).renderSideBySide&&this.diffEditorWidth.read(s)<=this._options.read(s).renderSideBySideInlineBreakpoint),this.renderOverviewRuler=_t(this,s=>this._options.read(s).renderOverviewRuler),this.renderSideBySide=_t(this,s=>this._options.read(s).renderSideBySide&&!(this._options.read(s).useInlineViewWhenSpaceIsLimited&&this.couldShowInlineViewBecauseOfSize.read(s))),this.readOnly=_t(this,s=>this._options.read(s).readOnly),this.shouldRenderRevertArrows=_t(this,s=>!(!this._options.read(s).renderMarginRevertIcon||!this.renderSideBySide.read(s)||this.readOnly.read(s))),this.renderIndicators=_t(this,s=>this._options.read(s).renderIndicators),this.enableSplitViewResizing=_t(this,s=>this._options.read(s).enableSplitViewResizing),this.splitViewDefaultRatio=_t(this,s=>this._options.read(s).splitViewDefaultRatio),this.ignoreTrimWhitespace=_t(this,s=>this._options.read(s).ignoreTrimWhitespace),this.maxComputationTimeMs=_t(this,s=>this._options.read(s).maxComputationTime),this.showMoves=_t(this,s=>this._options.read(s).experimental.showMoves&&this.renderSideBySide.read(s)),this.isInEmbeddedEditor=_t(this,s=>this._options.read(s).isInEmbeddedEditor),this.diffWordWrap=_t(this,s=>this._options.read(s).diffWordWrap),this.originalEditable=_t(this,s=>this._options.read(s).originalEditable),this.diffCodeLens=_t(this,s=>this._options.read(s).diffCodeLens),this.accessibilityVerbose=_t(this,s=>this._options.read(s).accessibilityVerbose),this.diffAlgorithm=_t(this,s=>this._options.read(s).diffAlgorithm),this.showEmptyDecorations=_t(this,s=>this._options.read(s).experimental.showEmptyDecorations),this.onlyShowAccessibleDiffViewer=_t(this,s=>this._options.read(s).onlyShowAccessibleDiffViewer),this.hideUnchangedRegions=_t(this,s=>this._options.read(s).hideUnchangedRegions.enabled),this.hideUnchangedRegionsRevealLineCount=_t(this,s=>this._options.read(s).hideUnchangedRegions.revealLineCount),this.hideUnchangedRegionsContextLineCount=_t(this,s=>this._options.read(s).hideUnchangedRegions.contextLineCount),this.hideUnchangedRegionsMinimumLineCount=_t(this,s=>this._options.read(s).hideUnchangedRegions.minimumLineCount);const i=Object.assign(Object.assign({},e),tB(e,$n));this._options=ai(this,i)}updateOptions(e){const t=tB(e,this._options.get()),i=Object.assign(Object.assign(Object.assign({},this._options.get()),e),t);this._options.set(i,void 0,{changedOptions:e})}}function tB(n,e){var t,i,s,o,r,a,l,c;return{enableSplitViewResizing:ve(n.enableSplitViewResizing,e.enableSplitViewResizing),splitViewDefaultRatio:Ife(n.splitViewDefaultRatio,.5,.1,.9),renderSideBySide:ve(n.renderSideBySide,e.renderSideBySide),renderMarginRevertIcon:ve(n.renderMarginRevertIcon,e.renderMarginRevertIcon),maxComputationTime:th(n.maxComputationTime,e.maxComputationTime,0,1073741824),maxFileSize:th(n.maxFileSize,e.maxFileSize,0,1073741824),ignoreTrimWhitespace:ve(n.ignoreTrimWhitespace,e.ignoreTrimWhitespace),renderIndicators:ve(n.renderIndicators,e.renderIndicators),originalEditable:ve(n.originalEditable,e.originalEditable),diffCodeLens:ve(n.diffCodeLens,e.diffCodeLens),renderOverviewRuler:ve(n.renderOverviewRuler,e.renderOverviewRuler),diffWordWrap:xi(n.diffWordWrap,e.diffWordWrap,["off","on","inherit"]),diffAlgorithm:xi(n.diffAlgorithm,e.diffAlgorithm,["legacy","advanced"],{smart:"legacy",experimental:"advanced"}),accessibilityVerbose:ve(n.accessibilityVerbose,e.accessibilityVerbose),experimental:{showMoves:ve((t=n.experimental)===null||t===void 0?void 0:t.showMoves,e.experimental.showMoves),showEmptyDecorations:ve((i=n.experimental)===null||i===void 0?void 0:i.showEmptyDecorations,e.experimental.showEmptyDecorations)},hideUnchangedRegions:{enabled:ve((o=(s=n.hideUnchangedRegions)===null||s===void 0?void 0:s.enabled)!==null&&o!==void 0?o:(r=n.experimental)===null||r===void 0?void 0:r.collapseUnchangedRegions,e.hideUnchangedRegions.enabled),contextLineCount:th((a=n.hideUnchangedRegions)===null||a===void 0?void 0:a.contextLineCount,e.hideUnchangedRegions.contextLineCount,0,1073741824),minimumLineCount:th((l=n.hideUnchangedRegions)===null||l===void 0?void 0:l.minimumLineCount,e.hideUnchangedRegions.minimumLineCount,0,1073741824),revealLineCount:th((c=n.hideUnchangedRegions)===null||c===void 0?void 0:c.revealLineCount,e.hideUnchangedRegions.revealLineCount,0,1073741824)},isInEmbeddedEditor:ve(n.isInEmbeddedEditor,e.isInEmbeddedEditor),onlyShowAccessibleDiffViewer:ve(n.onlyShowAccessibleDiffViewer,e.onlyShowAccessibleDiffViewer),renderSideBySideInlineBreakpoint:th(n.renderSideBySideInlineBreakpoint,e.renderSideBySideInlineBreakpoint,0,1073741824),useInlineViewWhenSpaceIsLimited:ve(n.useInlineViewWhenSpaceIsLimited,e.useInlineViewWhenSpaceIsLimited)}}var FIe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},U0=function(n,e){return function(t,i){e(t,i,n)}};let mR=class extends jL{constructor(e,t,i,s,o,r,a,l){var c;super(),this._domElement=e,this._parentContextKeyService=s,this._parentInstantiationService=o,this._audioCueService=a,this._editorProgressService=l,this.elements=dn("div.monaco-diff-editor.side-by-side",{style:{position:"relative",height:"100%"}},[dn("div.noModificationsOverlay@overlay",{style:{position:"absolute",height:"100%",visibility:"hidden"}},[ye("span",{},"No Changes")]),dn("div.editor.original@original",{style:{position:"absolute",height:"100%"}}),dn("div.editor.modified@modified",{style:{position:"absolute",height:"100%"}}),dn("div.accessibleDiffViewer@accessibleDiffViewer",{style:{position:"absolute",height:"100%"}})]),this._diffModel=this._register(VAe("diffModel",void 0)),this.onDidChangeModel=ue.fromObservableLight(this._diffModel),this._contextKeyService=this._register(this._parentContextKeyService.createScoped(this._domElement)),this._instantiationService=this._parentInstantiationService.createChild(new yL([et,this._contextKeyService])),this._boundarySashes=ai(this,void 0),this._accessibleDiffViewerShouldBeVisible=ai(this,!1),this._accessibleDiffViewerVisible=_t(this,p=>this._options.onlyShowAccessibleDiffViewer.read(p)?!0:this._accessibleDiffViewerShouldBeVisible.read(p)),this.movedBlocksLinesPart=ai(this,void 0),this._layoutInfo=_t(this,p=>{var _,v,b;const y=this._rootSizeObserver.width.read(p),w=this._rootSizeObserver.height.read(p),S=(_=this._sash.read(p))===null||_===void 0?void 0:_.sashLeft.read(p),L=S??Math.max(5,this._editors.original.getLayoutInfo().decorationsLeft),x=y-L-(this._options.renderOverviewRuler.read(p)?dc.ENTIRE_DIFF_OVERVIEW_WIDTH:0),D=(b=(v=this.movedBlocksLinesPart.read(p))===null||v===void 0?void 0:v.width.read(p))!==null&&b!==void 0?b:0,k=L-D;return this.elements.original.style.width=k+"px",this.elements.original.style.left="0px",this.elements.modified.style.width=x+"px",this.elements.modified.style.left=L+"px",this._editors.original.layout({width:k,height:w}),this._editors.modified.layout({width:x,height:w}),{modifiedEditor:this._editors.modified.getLayoutInfo(),originalEditor:this._editors.original.getLayoutInfo()}}),this._diffValue=this._diffModel.map((p,_)=>p==null?void 0:p.diff.read(_)),this.onDidUpdateDiff=ue.fromObservableLight(this._diffValue),r.willCreateDiffEditor(),this._contextKeyService.createKey("isInDiffEditor",!0),this._domElement.appendChild(this.elements.root),this._register(Ye(()=>this._domElement.removeChild(this.elements.root))),this._rootSizeObserver=this._register(new XAe(this.elements.root,t.dimension)),this._rootSizeObserver.setAutomaticLayout((c=t.automaticLayout)!==null&&c!==void 0?c:!1),this._options=new OIe(t,this._rootSizeObserver.width),this._contextKeyService.createKey($.isEmbeddedDiffEditor.key,!1);const d=$.isEmbeddedDiffEditor.bindTo(this._contextKeyService);this._register(di(p=>{d.set(this._options.isInEmbeddedEditor.read(p))}));const u=$.comparingMovedCode.bindTo(this._contextKeyService);this._register(di(p=>{var _;u.set(!!(!((_=this._diffModel.read(p))===null||_===void 0)&&_.movedTextToCompare.read(p)))}));const h=$.diffEditorRenderSideBySideInlineBreakpointReached.bindTo(this._contextKeyService);this._register(di(p=>{h.set(this._options.couldShowInlineViewBecauseOfSize.read(p))})),this._editors=this._register(this._instantiationService.createInstance(pR,this.elements.original,this.elements.modified,this._options,i,(p,_,v,b)=>this._createInnerEditor(p,_,v,b))),this._sash=Pv(this,(p,_)=>{const v=this._options.renderSideBySide.read(p);if(this.elements.root.classList.toggle("side-by-side",v),!v)return;const b=_.add(new bIe(this._options,this.elements.root,{height:this._rootSizeObserver.height,width:this._rootSizeObserver.width.map((y,w)=>y-(this._options.renderOverviewRuler.read(w)?dc.ENTIRE_DIFF_OVERVIEW_WIDTH:0))}));return _.add(di(y=>{const w=this._boundarySashes.read(y);w&&b.setBoundarySashes(w)})),b}),this._register(kx(this._sash)),this._register($s((p,_)=>{this.unchangedRangesFeature=_.add(this._instantiationService.createInstance(Kc(dR,p),this._editors,this._diffModel,this._options))})),this._register($s((p,_)=>{_.add(new(Kc(_Ie,p))(this._editors,this._diffModel,this._options))})),this._register($s((p,_)=>{_.add(this._instantiationService.createInstance(Kc(gR,p),this._editors,this._diffModel,this._options,this,()=>this.unchangedRangesFeature.isUpdatingViewZones))})),this._register($s((p,_)=>{_.add(this._instantiationService.createInstance(Kc(dc,p),this._editors,this.elements.root,this._diffModel,this._rootSizeObserver.width,this._rootSizeObserver.height,this._layoutInfo.map(v=>v.modifiedEditor),this._options))})),this._register($s((p,_)=>{this._accessibleDiffViewer=_.add(this._register(this._instantiationService.createInstance(Kc(wd,p),this.elements.accessibleDiffViewer,this._accessibleDiffViewerVisible,(v,b)=>this._accessibleDiffViewerShouldBeVisible.set(v,b),this._options.onlyShowAccessibleDiffViewer.map(v=>!v),this._rootSizeObserver.width,this._rootSizeObserver.height,this._diffModel.map((v,b)=>{var y;return(y=v==null?void 0:v.diff.read(b))===null||y===void 0?void 0:y.mappings.map(w=>w.lineRangeMapping)}),this._editors)))}));const f=this._accessibleDiffViewerVisible.map(p=>p?"hidden":"visible");this._register(Fd(this.elements.modified,{visibility:f})),this._register(Fd(this.elements.original,{visibility:f})),this._createDiffEditorContributions(),r.addDiffEditor(this),this._register(kx(this._layoutInfo)),this._register($s((p,_)=>{this.movedBlocksLinesPart.set(_.add(new(Kc(Bd,p))(this.elements.root,this._diffModel,this._layoutInfo.map(v=>v.originalEditor),this._layoutInfo.map(v=>v.modifiedEditor),this._editors)),void 0)})),this._register(Fd(this.elements.overlay,{width:this._layoutInfo.map((p,_)=>p.originalEditor.width+(this._options.renderSideBySide.read(_)?0:p.modifiedEditor.width)),visibility:_t(p=>{var _,v;return this._options.hideUnchangedRegions.read(p)&&((v=(_=this._diffModel.read(p))===null||_===void 0?void 0:_.diff.read(p))===null||v===void 0?void 0:v.mappings.length)===0?"visible":"hidden"})})),this._register(this._editors.modified.onMouseDown(p=>{var _,v;if(!p.event.rightButton&&p.target.position&&(!((_=p.target.element)===null||_===void 0)&&_.className.includes("arrow-revert-change"))){const b=p.target.position.lineNumber,y=p.target,w=this._diffModel.get();if(!w)return;const S=(v=w.diff.get())===null||v===void 0?void 0:v.mappings;if(!S)return;const L=S.find(x=>(y==null?void 0:y.detail.afterLineNumber)===x.lineRangeMapping.modified.startLineNumber-1||x.lineRangeMapping.modified.startLineNumber===b);if(!L)return;this.revert(L.lineRangeMapping),p.event.stopPropagation()}})),this._register(ue.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition,p=>{var _,v;if((p==null?void 0:p.reason)===3){const b=(v=(_=this._diffModel.get())===null||_===void 0?void 0:_.diff.get())===null||v===void 0?void 0:v.mappings.find(y=>y.lineRangeMapping.modified.contains(p.position.lineNumber));b!=null&&b.lineRangeMapping.modified.isEmpty?this._audioCueService.playAudioCue(dt.diffLineDeleted,{source:"diffEditor.cursorPositionChanged"}):b!=null&&b.lineRangeMapping.original.isEmpty?this._audioCueService.playAudioCue(dt.diffLineInserted,{source:"diffEditor.cursorPositionChanged"}):b&&this._audioCueService.playAudioCue(dt.diffLineModified,{source:"diffEditor.cursorPositionChanged"})}}));const g=this._diffModel.map((p,_)=>p==null?void 0:p.isDiffUpToDate.read(_));this._register($s((p,_)=>{if(g.read(p)===!1){const v=this._editorProgressService.show(!0,1e3);_.add(Ye(()=>v.done()))}}))}_createInnerEditor(e,t,i,s){return e.createInstance(Pm,t,i,s)}_createDiffEditorContributions(){const e=mp.getDiffEditorContributions();for(const t of e)try{this._register(this._instantiationService.createInstance(t.ctor,this))}catch(i){mt(i)}}get _targetEditor(){return this._editors.modified}getEditorType(){return aL.IDiffEditor}layout(e){this._rootSizeObserver.observe(e)}hasTextFocus(){return this._editors.original.hasTextFocus()||this._editors.modified.hasTextFocus()}saveViewState(){var e;const t=this._editors.original.saveViewState(),i=this._editors.modified.saveViewState();return{original:t,modified:i,modelState:(e=this._diffModel.get())===null||e===void 0?void 0:e.serializeState()}}restoreViewState(e){var t;if(e&&e.original&&e.modified){const i=e;this._editors.original.restoreViewState(i.original),this._editors.modified.restoreViewState(i.modified),i.modelState&&((t=this._diffModel.get())===null||t===void 0||t.restoreSerializedState(i.modelState))}}createViewModel(e){return this._instantiationService.createInstance(fR,e,this._options,this)}getModel(){var e,t;return(t=(e=this._diffModel.get())===null||e===void 0?void 0:e.model)!==null&&t!==void 0?t:null}setModel(e){!e&&this._diffModel.get()&&this._accessibleDiffViewer.close();const t=e?"model"in e?e:this.createViewModel(e):void 0;this._editors.original.setModel(t?t.model.original:null),this._editors.modified.setModel(t?t.model.modified:null),Mn(i=>{this._diffModel.set(t,i)})}updateOptions(e){this._options.updateOptions(e)}getContainerDomNode(){return this._domElement}getOriginalEditor(){return this._editors.original}getModifiedEditor(){return this._editors.modified}getLineChanges(){var e;const t=(e=this._diffModel.get())===null||e===void 0?void 0:e.diff.get();return t?VIe(t):null}revert(e){var t;const i=(t=this._diffModel.get())===null||t===void 0?void 0:t.model;if(!i)return;const s=e.innerChanges?e.innerChanges.map(o=>({range:o.modifiedRange,text:i.original.getValueInRange(o.originalRange)})):[{range:e.modified.toExclusiveRange(),text:i.original.getValueInRange(e.original.toExclusiveRange())}];this._editors.modified.executeEdits("diffEditor",s)}accessibleDiffViewerNext(){this._accessibleDiffViewer.next()}accessibleDiffViewerPrev(){this._accessibleDiffViewer.prev()}mapToOtherSide(){var e,t;const i=this._editors.modified.hasWidgetFocus(),s=i?this._editors.modified:this._editors.original,o=i?this._editors.original:this._editors.modified;let r;const a=s.getSelection();if(a){const l=(t=(e=this._diffModel.get())===null||e===void 0?void 0:e.diff.get())===null||t===void 0?void 0:t.mappings.map(c=>i?c.lineRangeMapping.flip():c.lineRangeMapping);if(l){const c=iB(a.getStartPosition(),l),d=iB(a.getEndPosition(),l);r=N.plusRange(c,d)}}return{destination:o,destinationSelection:r}}switchSide(){const{destination:e,destinationSelection:t}=this.mapToOtherSide();e.focus(),t&&e.setSelection(t)}exitCompareMove(){const e=this._diffModel.get();e&&e.movedTextToCompare.set(void 0,void 0)}collapseAllUnchangedRegions(){var e;const t=(e=this._diffModel.get())===null||e===void 0?void 0:e.unchangedRegions.get();t&&Mn(i=>{for(const s of t)s.collapseAll(i)})}showAllUnchangedRegions(){var e;const t=(e=this._diffModel.get())===null||e===void 0?void 0:e.unchangedRegions.get();t&&Mn(i=>{for(const s of t)s.showAll(i)})}};mR=FIe([U0(3,et),U0(4,vt),U0(5,jt),U0(6,VL),U0(7,ry)],mR);function iB(n,e){const t=mT(e,s=>s.original.startLineNumber<=n.lineNumber);if(!t)return N.fromPositions(n);if(t.original.endLineNumberExclusive<=n.lineNumber){const s=n.lineNumber-t.original.endLineNumberExclusive+t.modified.endLineNumberExclusive;return N.fromPositions(new V(s,n.column))}if(!t.innerChanges)return N.fromPositions(new V(t.modified.startLineNumber,1));const i=mT(t.innerChanges,s=>s.originalRange.getStartPosition().isBeforeOrEqual(n));if(!i){const s=n.lineNumber-t.original.startLineNumber+t.modified.startLineNumber;return N.fromPositions(new V(s,n.column))}if(i.originalRange.containsPosition(n))return i.modifiedRange;{const s=BIe(i.originalRange.getEndPosition(),n);return N.fromPositions(WIe(i.modifiedRange.getEndPosition(),s))}}function BIe(n,e){return n.lineNumber===e.lineNumber?new pv(0,e.column-n.column):new pv(e.lineNumber-n.lineNumber,e.column-1)}function WIe(n,e){return e.lineCount===0?new V(n.lineNumber,n.column+e.columnCount):new V(n.lineNumber+e.lineCount,e.columnCount+1)}function VIe(n){return n.mappings.map(e=>{const t=e.lineRangeMapping;let i,s,o,r,a=t.innerChanges;return t.original.isEmpty?(i=t.original.startLineNumber-1,s=0,a=void 0):(i=t.original.startLineNumber,s=t.original.endLineNumberExclusive-1),t.modified.isEmpty?(o=t.modified.startLineNumber-1,r=0,a=void 0):(o=t.modified.startLineNumber,r=t.modified.endLineNumberExclusive-1),{originalStartLineNumber:i,originalEndLineNumber:s,modifiedStartLineNumber:o,modifiedEndLineNumber:r,charChanges:a==null?void 0:a.map(l=>({originalStartLineNumber:l.originalRange.startLineNumber,originalStartColumn:l.originalRange.startColumn,originalEndLineNumber:l.originalRange.endLineNumber,originalEndColumn:l.originalRange.endColumn,modifiedStartLineNumber:l.modifiedRange.startLineNumber,modifiedStartColumn:l.modifiedRange.startColumn,modifiedEndLineNumber:l.modifiedRange.endLineNumber,modifiedEndColumn:l.modifiedRange.endColumn}))}})}var M5=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},$t=function(n,e){return function(t,i){e(t,i,n)}};let zIe=0,nB=!1;function HIe(n){if(!n){if(nB)return;nB=!0}Bbe(n||document.body)}let Rx=class extends Pm{constructor(e,t,i,s,o,r,a,l,c,d,u,h){const f=Object.assign({},t);f.ariaLabel=f.ariaLabel||ax.editorViewAccessibleLabel,f.ariaLabel=f.ariaLabel+";"+ax.accessibilityHelpMessage,super(e,f,{},i,s,o,r,l,c,d,u,h),a instanceof Hm?this._standaloneKeybindingService=a:this._standaloneKeybindingService=null,HIe(f.ariaContainerElement)}addCommand(e,t,i){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;const s="DYNAMIC_"+ ++zIe,o=Le.deserialize(i);return this._standaloneKeybindingService.addDynamicKeybinding(s,e,t,o),s}createContextKey(e,t){return this._contextKeyService.createKey(e,t)}addAction(e){if(typeof e.id!="string"||typeof e.label!="string"||typeof e.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),Y.None;const t=e.id,i=e.label,s=Le.and(Le.equals("editorId",this.getId()),Le.deserialize(e.precondition)),o=e.keybindings,r=Le.and(s,Le.deserialize(e.keybindingContext)),a=e.contextMenuGroupId||null,l=e.contextMenuOrder||0,c=(f,...g)=>Promise.resolve(e.run(this,...g)),d=new pe,u=this.getId()+":"+t;if(d.add(Yt.registerCommand(u,c)),a){const f={command:{id:u,title:i},when:s,group:a,order:l};d.add(cr.appendMenuItem(I.EditorContext,f))}if(Array.isArray(o))for(const f of o)d.add(this._standaloneKeybindingService.addDynamicKeybinding(u,f,c,r));const h=new Iq(u,i,i,s,(...f)=>Promise.resolve(e.run(this,...f)),this._contextKeyService);return this._actions.set(t,h),d.add(Ye(()=>{this._actions.delete(t)})),d}_triggerCommand(e,t){if(this._codeEditorService instanceof ix)try{this._codeEditorService.setActiveCodeEditor(this),super._triggerCommand(e,t)}finally{this._codeEditorService.setActiveCodeEditor(null)}else super._triggerCommand(e,t)}};Rx=M5([$t(2,vt),$t(3,jt),$t(4,fs),$t(5,et),$t(6,bi),$t(7,ro),$t(8,xn),$t(9,Au),$t(10,so),$t(11,it)],Rx);let _R=class extends Rx{constructor(e,t,i,s,o,r,a,l,c,d,u,h,f,g,p){const _=Object.assign({},t);Dx(d,_,!1);const v=l.registerEditorContainer(e);typeof _.theme=="string"&&l.setTheme(_.theme),typeof _.autoDetectHighContrast<"u"&&l.setAutoDetectHighContrast(!!_.autoDetectHighContrast);const b=_.model;delete _.model,super(e,_,i,s,o,r,a,l,c,u,g,p),this._configurationService=d,this._standaloneThemeService=l,this._register(v);let y;if(typeof b>"u"){const w=f.getLanguageIdByMimeType(_.language)||_.language||Ho;y=PK(h,f,_.value||"",w,void 0),this._ownsModel=!0}else y=b,this._ownsModel=!1;if(this._attachModel(y),y){const w={oldModelUrl:null,newModelUrl:y.uri};this._onDidChangeModel.fire(w)}}dispose(){super.dispose()}updateOptions(e){Dx(this._configurationService,e,!1),typeof e.theme=="string"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast),super.updateOptions(e)}_postDetachModelCleanup(e){super._postDetachModelCleanup(e),e&&this._ownsModel&&(e.dispose(),this._ownsModel=!1)}};_R=M5([$t(2,vt),$t(3,jt),$t(4,fs),$t(5,et),$t(6,bi),$t(7,Nr),$t(8,xn),$t(9,ii),$t(10,Au),$t(11,hs),$t(12,Ni),$t(13,so),$t(14,it)],_R);let bR=class extends mR{constructor(e,t,i,s,o,r,a,l,c,d,u,h){const f=Object.assign({},t);Dx(l,f,!0);const g=r.registerEditorContainer(e);typeof f.theme=="string"&&r.setTheme(f.theme),typeof f.autoDetectHighContrast<"u"&&r.setAutoDetectHighContrast(!!f.autoDetectHighContrast),super(e,f,{},s,i,o,h,d),this._configurationService=l,this._standaloneThemeService=r,this._register(g)}dispose(){super.dispose()}updateOptions(e){Dx(this._configurationService,e,!0),typeof e.theme=="string"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast),super.updateOptions(e)}_createInnerEditor(e,t,i){return e.createInstance(Rx,t,i)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(e,t,i){return this.getModifiedEditor().addCommand(e,t,i)}createContextKey(e,t){return this.getModifiedEditor().createContextKey(e,t)}addAction(e){return this.getModifiedEditor().addAction(e)}};bR=M5([$t(2,vt),$t(3,et),$t(4,jt),$t(5,Nr),$t(6,xn),$t(7,ii),$t(8,Nu),$t(9,ry),$t(10,py),$t(11,VL)],bR);function PK(n,e,t,i,s){if(t=t||"",!i){const o=t.indexOf(` `);let r=t;return o!==-1&&(r=t.substring(0,o)),sB(n,t,e.createByFilepathOrFirstLine(s||null,r),s)}return sB(n,t,e.createById(i),s)}function sB(n,e,t,i){return n.createModel(e,t,i)}var OK=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})};function $Ie(n,e,t){return Ae.initialize(t||{}).createInstance(_R,n,e)}function UIe(n){return Ae.get(jt).onCodeEditorAdd(t=>{n(t)})}function jIe(n){return Ae.get(jt).onDiffEditorAdd(t=>{n(t)})}function qIe(){return Ae.get(jt).listCodeEditors()}function GIe(){return Ae.get(jt).listDiffEditors()}function KIe(n,e,t){return Ae.initialize(t||{}).createInstance(bR,n,e)}function YIe(n){if(typeof n.id!="string"||typeof n.run!="function")throw new Error("Invalid command descriptor, `id` and `run` are required properties!");return Yt.registerCommand(n.id,n.run)}function ZIe(n){if(typeof n.id!="string"||typeof n.label!="string"||typeof n.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");const e=Le.deserialize(n.precondition),t=(s,...o)=>kr.runEditorCommand(s,o,e,(r,a,l)=>Promise.resolve(n.run(a,...l))),i=new pe;if(i.add(Yt.registerCommand(n.id,t)),n.contextMenuGroupId){const s={command:{id:n.id,title:n.label},when:e,group:n.contextMenuGroupId,order:n.contextMenuOrder||0};i.add(cr.appendMenuItem(I.EditorContext,s))}if(Array.isArray(n.keybindings)){const s=Ae.get(bi);if(!(s instanceof Hm))console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService");else{const o=Le.and(e,Le.deserialize(n.keybindingContext));i.add(s.addDynamicKeybindings(n.keybindings.map(r=>({keybinding:r,command:n.id,when:o}))))}}return i}function XIe(n){return FK([n])}function FK(n){const e=Ae.get(bi);return e instanceof Hm?e.addDynamicKeybindings(n.map(t=>({keybinding:t.keybinding,command:t.command,commandArgs:t.commandArgs,when:Le.deserialize(t.when)}))):(console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),Y.None)}function QIe(n,e,t){const i=Ae.get(Ni),s=i.getLanguageIdByMimeType(e)||e;return PK(Ae.get(hs),i,n,s,t)}function JIe(n,e){const t=Ae.get(Ni),i=t.getLanguageIdByMimeType(e)||e||Ho;n.setLanguage(t.createById(i))}function eTe(n,e,t){n&&Ae.get(ml).changeOne(e,n.uri,t)}function tTe(n){Ae.get(ml).changeAll(n,[])}function iTe(n){return Ae.get(ml).read(n)}function nTe(n){return Ae.get(ml).onMarkerChanged(n)}function sTe(n){return Ae.get(hs).getModel(n)}function oTe(){return Ae.get(hs).getModels()}function rTe(n){return Ae.get(hs).onModelAdded(n)}function aTe(n){return Ae.get(hs).onModelRemoved(n)}function lTe(n){return Ae.get(hs).onModelLanguageChanged(t=>{n({model:t.model,oldLanguage:t.oldLanguageId})})}function cTe(n){return ube(Ae.get(hs),Ae.get(so),n)}function dTe(n,e){const t=Ae.get(Ni),i=Ae.get(Nr);return u3.colorizeElement(i,t,n,e).then(()=>{i.registerEditorContainer(n)})}function uTe(n,e,t){const i=Ae.get(Ni);return Ae.get(Nr).registerEditorContainer(document.body),u3.colorize(i,n,e,t)}function hTe(n,e,t=4){return Ae.get(Nr).registerEditorContainer(document.body),u3.colorizeModelLine(n,e,t)}function fTe(n){const e=Si.get(n);return e||{getInitialState:()=>ev,tokenize:(t,i,s)=>Bj(n,s)}}function gTe(n,e){Si.getOrCreate(e);const t=fTe(e),i=$f(n),s=[];let o=t.getInitialState();for(let r=0,a=i.length;rOK(this,void 0,void 0,function*(){var o;if(!i)return null;const r=(o=t.options)===null||o===void 0?void 0:o.selection;let a;return r&&typeof r.endLineNumber=="number"&&typeof r.endColumn=="number"?a=r:r&&(a={lineNumber:r.startLineNumber,column:r.startColumn}),(yield n.openCodeEditor(i,t.resource,a))?i:null}))}function wTe(){return{create:$Ie,getEditors:qIe,getDiffEditors:GIe,onDidCreateEditor:UIe,onDidCreateDiffEditor:jIe,createDiffEditor:KIe,addCommand:YIe,addEditorAction:ZIe,addKeybindingRule:XIe,addKeybindingRules:FK,createModel:QIe,setModelLanguage:JIe,setModelMarkers:eTe,getModelMarkers:iTe,removeAllMarkers:tTe,onDidChangeMarkers:nTe,getModels:oTe,getModel:sTe,onDidCreateModel:rTe,onWillDisposeModel:aTe,onDidChangeModelLanguage:lTe,createWebWorker:cTe,colorizeElement:dTe,colorize:uTe,colorizeModelLine:hTe,tokenize:gTe,defineTheme:pTe,setTheme:mTe,remeasureFonts:_Te,registerCommand:bTe,registerLinkOpener:vTe,registerEditorOpener:yTe,AccessibilitySupport:fI,ContentWidgetPositionPreference:vI,CursorChangeReason:yI,DefaultEndOfLine:wI,EditorAutoIndentStrategy:SI,EditorOption:xI,EndOfLinePreference:LI,EndOfLineSequence:DI,MinimapPosition:PI,MouseTargetType:OI,OverlayWidgetPositionPreference:FI,OverviewRulerLane:BI,GlyphMarginLane:kI,RenderLineNumbersType:VI,RenderMinimap:zI,ScrollbarVisibility:$I,ScrollType:HI,TextEditorCursorBlinkingStyle:KI,TextEditorCursorStyle:YI,TrackedRangeStickiness:ZI,WrappingIndent:XI,InjectedTextCursorStops:AI,PositionAffinity:WI,ConfigurationChangedEvent:fU,BareFontInfo:Zh,FontInfo:eT,TextModelResolvedOptions:uC,FindMatch:Yb,ApplyUpdateResult:O_,EditorZoom:Xc,EditorType:aL,EditorOptions:Vf}}function CTe(n,e){if(!e||!Array.isArray(e))return!1;for(const t of e)if(!n(t))return!1;return!0}function Dw(n,e){return typeof n=="boolean"?n:e}function oB(n,e){return typeof n=="string"?n:e}function STe(n){const e={};for(const t of n)e[t]=!0;return e}function rB(n,e=!1){e&&(n=n.map(function(i){return i.toLowerCase()}));const t=STe(n);return e?function(i){return t[i.toLowerCase()]!==void 0&&t.hasOwnProperty(i.toLowerCase())}:function(i){return t[i]!==void 0&&t.hasOwnProperty(i)}}function vR(n,e){e=e.replace(/@@/g,"");let t=0,i;do i=!1,e=e.replace(/@(\w+)/g,function(o,r){i=!0;let a="";if(typeof n[r]=="string")a=n[r];else if(n[r]&&n[r]instanceof RegExp)a=n[r].source;else throw n[r]===void 0?Vt(n,"language definition does not contain attribute '"+r+"', used at: "+e):Vt(n,"attribute reference '"+r+"' must be a string, used at: "+e);return Ig(a)?"":"(?:"+a+")"}),t++;while(i&&t<5);e=e.replace(/\x01/g,"@");const s=(n.ignoreCase?"i":"")+(n.unicode?"u":"");return new RegExp(e,s)}function xTe(n,e,t,i){if(i<0)return n;if(i=100){i=i-100;const s=t.split(".");if(s.unshift(t),i=0&&(i.tokenSubst=!0),typeof t.bracket=="string")if(t.bracket==="@open")i.bracket=1;else if(t.bracket==="@close")i.bracket=-1;else throw Vt(n,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+e);if(t.next){if(typeof t.next!="string")throw Vt(n,"the next state must be a string value in rule: "+e);{let s=t.next;if(!/^(@pop|@push|@popall)$/.test(s)&&(s[0]==="@"&&(s=s.substr(1)),s.indexOf("$")<0&&!Ibe(n,Qc(n,s,"",[],""))))throw Vt(n,"the next state '"+t.next+"' is not defined in rule: "+e);i.next=s}}return typeof t.goBack=="number"&&(i.goBack=t.goBack),typeof t.switchTo=="string"&&(i.switchTo=t.switchTo),typeof t.log=="string"&&(i.log=t.log),typeof t.nextEmbedded=="string"&&(i.nextEmbedded=t.nextEmbedded,n.usesEmbedded=!0),i}}else if(Array.isArray(t)){const i=[];for(let s=0,o=t.length;s0&&i[0]==="^",this.name=this.name+": "+i,this.regex=vR(e,"^(?:"+(this.matchOnlyAtLineStart?i.substr(1):i)+")")}setAction(e,t){this.action=yR(e,this.name,t)}}function BK(n,e){if(!e||typeof e!="object")throw new Error("Monarch: expecting a language definition object");const t={};t.languageId=n,t.includeLF=Dw(e.includeLF,!1),t.noThrow=!1,t.maxStack=100,t.start=typeof e.start=="string"?e.start:null,t.ignoreCase=Dw(e.ignoreCase,!1),t.unicode=Dw(e.unicode,!1),t.tokenPostfix=oB(e.tokenPostfix,"."+t.languageId),t.defaultToken=oB(e.defaultToken,"source"),t.usesEmbedded=!1;const i=e;i.languageId=n,i.includeLF=t.includeLF,i.ignoreCase=t.ignoreCase,i.unicode=t.unicode,i.noThrow=t.noThrow,i.usesEmbedded=t.usesEmbedded,i.stateNames=e.tokenizer,i.defaultToken=t.defaultToken;function s(r,a,l){for(const c of l){let d=c.include;if(d){if(typeof d!="string")throw Vt(t,"an 'include' attribute must be a string at: "+r);if(d[0]==="@"&&(d=d.substr(1)),!e.tokenizer[d])throw Vt(t,"include target '"+d+"' is not defined at: "+r);s(r+"."+d,a,e.tokenizer[d])}else{const u=new DTe(r);if(Array.isArray(c)&&c.length>=1&&c.length<=3)if(u.setRegex(i,c[0]),c.length>=3)if(typeof c[1]=="string")u.setAction(i,{token:c[1],next:c[2]});else if(typeof c[1]=="object"){const h=c[1];h.next=c[2],u.setAction(i,h)}else throw Vt(t,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+r);else u.setAction(i,c[1]);else{if(!c.regex)throw Vt(t,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+r);c.name&&typeof c.name=="string"&&(u.name=c.name),c.matchOnlyAtStart&&(u.matchOnlyAtLineStart=Dw(c.matchOnlyAtLineStart,!1)),u.setRegex(i,c.regex),u.setAction(i,c.action)}a.push(u)}}}if(!e.tokenizer||typeof e.tokenizer!="object")throw Vt(t,"a language definition must define the 'tokenizer' attribute as an object");t.tokenizer=[];for(const r in e.tokenizer)if(e.tokenizer.hasOwnProperty(r)){t.start||(t.start=r);const a=e.tokenizer[r];t.tokenizer[r]=new Array,s("tokenizer."+r,t.tokenizer[r],a)}if(t.usesEmbedded=i.usesEmbedded,e.brackets){if(!Array.isArray(e.brackets))throw Vt(t,"the 'brackets' attribute must be defined as an array")}else e.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];const o=[];for(const r of e.brackets){let a=r;if(a&&Array.isArray(a)&&a.length===3&&(a={token:a[2],open:a[0],close:a[1]}),a.open===a.close)throw Vt(t,"open and close brackets in a 'brackets' attribute must be different: "+a.open+` - hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof a.open=="string"&&typeof a.token=="string"&&typeof a.close=="string")o.push({token:a.token+t.tokenPostfix,open:Nd(t,a.open),close:Nd(t,a.close)});else throw Vt(t,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return t.brackets=o,t.noThrow=!0,t}var kTe=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})};function ETe(n){xm.registerLanguage(n)}function ATe(){let n=[];return n=n.concat(xm.getLanguages()),n}function ITe(n){return Ae.get(Ni).languageIdCodec.encodeLanguageId(n)}function TTe(n,e){return Ae.withServices(()=>{const i=Ae.get(Ni).onDidRequestRichLanguageFeatures(s=>{s===n&&(i.dispose(),e())});return i})}function NTe(n,e){return Ae.withServices(()=>{const i=Ae.get(Ni).onDidRequestBasicLanguageFeatures(s=>{s===n&&(i.dispose(),e())});return i})}function RTe(n,e){if(!Ae.get(Ni).isRegisteredLanguageId(n))throw new Error(`Cannot set configuration for unknown language ${n}`);return Ae.get(so).register(n,e,100)}class MTe{constructor(e,t){this._languageId=e,this._actual=t}dispose(){}getInitialState(){return this._actual.getInitialState()}tokenize(e,t,i){if(typeof this._actual.tokenize=="function")return Fv.adaptTokenize(this._languageId,this._actual,e,i);throw new Error("Not supported!")}tokenizeEncoded(e,t,i){const s=this._actual.tokenizeEncoded(e,i);return new B2(s.tokens,s.endState)}}class Fv{constructor(e,t,i,s){this._languageId=e,this._actual=t,this._languageService=i,this._standaloneThemeService=s}dispose(){}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(e,t){const i=[];let s=0;for(let o=0,r=e.length;o0&&o[r-1]===h)continue;let f=u.startIndex;c===0?f=0:fkTe(this,void 0,void 0,function*(){const i=yield Promise.resolve(e.create());return i?PTe(i)?VK(n,i):new nv(Ae.get(Ni),Ae.get(Nr),n,BK(n,i),Ae.get(ii)):null}));return Si.registerFactory(n,t)}function BTe(n,e){if(!Ae.get(Ni).isRegisteredLanguageId(n))throw new Error(`Cannot set tokens provider for unknown language ${n}`);return WK(e)?P5(n,{create:()=>e}):Si.register(n,VK(n,e))}function WTe(n,e){const t=i=>new nv(Ae.get(Ni),Ae.get(Nr),n,BK(n,i),Ae.get(ii));return WK(e)?P5(n,{create:()=>e}):Si.register(n,t(e))}function VTe(n,e){return Ae.get(it).referenceProvider.register(n,e)}function zTe(n,e){return Ae.get(it).renameProvider.register(n,e)}function HTe(n,e){return Ae.get(it).signatureHelpProvider.register(n,e)}function $Te(n,e){return Ae.get(it).hoverProvider.register(n,{provideHover:(i,s,o)=>{const r=i.getWordAtPosition(s);return Promise.resolve(e.provideHover(i,s,o)).then(a=>{if(a)return!a.range&&r&&(a.range=new N(s.lineNumber,r.startColumn,s.lineNumber,r.endColumn)),a.range||(a.range=new N(s.lineNumber,s.column,s.lineNumber,s.column)),a})}})}function UTe(n,e){return Ae.get(it).documentSymbolProvider.register(n,e)}function jTe(n,e){return Ae.get(it).documentHighlightProvider.register(n,e)}function qTe(n,e){return Ae.get(it).linkedEditingRangeProvider.register(n,e)}function GTe(n,e){return Ae.get(it).definitionProvider.register(n,e)}function KTe(n,e){return Ae.get(it).implementationProvider.register(n,e)}function YTe(n,e){return Ae.get(it).typeDefinitionProvider.register(n,e)}function ZTe(n,e){return Ae.get(it).codeLensProvider.register(n,e)}function XTe(n,e,t){return Ae.get(it).codeActionProvider.register(n,{providedCodeActionKinds:t==null?void 0:t.providedCodeActionKinds,documentation:t==null?void 0:t.documentation,provideCodeActions:(s,o,r,a)=>{const c=Ae.get(ml).read({resource:s.uri}).filter(d=>N.areIntersectingOrTouching(d,o));return e.provideCodeActions(s,o,{markers:c,only:r.only,trigger:r.trigger},a)},resolveCodeAction:e.resolveCodeAction})}function QTe(n,e){return Ae.get(it).documentFormattingEditProvider.register(n,e)}function JTe(n,e){return Ae.get(it).documentRangeFormattingEditProvider.register(n,e)}function eNe(n,e){return Ae.get(it).onTypeFormattingEditProvider.register(n,e)}function tNe(n,e){return Ae.get(it).linkProvider.register(n,e)}function iNe(n,e){return Ae.get(it).completionProvider.register(n,e)}function nNe(n,e){return Ae.get(it).colorProvider.register(n,e)}function sNe(n,e){return Ae.get(it).foldingRangeProvider.register(n,e)}function oNe(n,e){return Ae.get(it).declarationProvider.register(n,e)}function rNe(n,e){return Ae.get(it).selectionRangeProvider.register(n,e)}function aNe(n,e){return Ae.get(it).documentSemanticTokensProvider.register(n,e)}function lNe(n,e){return Ae.get(it).documentRangeSemanticTokensProvider.register(n,e)}function cNe(n,e){return Ae.get(it).inlineCompletionsProvider.register(n,e)}function dNe(n,e){return Ae.get(it).inlayHintsProvider.register(n,e)}function uNe(){return{register:ETe,getLanguages:ATe,onLanguage:TTe,onLanguageEncountered:NTe,getEncodedLanguageId:ITe,setLanguageConfiguration:RTe,setColorMap:FTe,registerTokensProviderFactory:P5,setTokensProvider:BTe,setMonarchTokensProvider:WTe,registerReferenceProvider:VTe,registerRenameProvider:zTe,registerCompletionItemProvider:iNe,registerSignatureHelpProvider:HTe,registerHoverProvider:$Te,registerDocumentSymbolProvider:UTe,registerDocumentHighlightProvider:jTe,registerLinkedEditingRangeProvider:qTe,registerDefinitionProvider:GTe,registerImplementationProvider:KTe,registerTypeDefinitionProvider:YTe,registerCodeLensProvider:ZTe,registerCodeActionProvider:XTe,registerDocumentFormattingEditProvider:QTe,registerDocumentRangeFormattingEditProvider:JTe,registerOnTypeFormattingEditProvider:eNe,registerLinkProvider:tNe,registerColorProvider:nNe,registerFoldingRangeProvider:sNe,registerDeclarationProvider:oNe,registerSelectionRangeProvider:rNe,registerDocumentSemanticTokensProvider:aNe,registerDocumentRangeSemanticTokensProvider:lNe,registerInlineCompletionsProvider:cNe,registerInlayHintsProvider:dNe,DocumentHighlightKind:CI,CompletionItemKind:mI,CompletionItemTag:_I,CompletionItemInsertTextRule:pI,SymbolKind:qI,SymbolTag:GI,IndentAction:EI,CompletionTriggerKind:bI,SignatureHelpTriggerKind:jI,InlayHintKind:II,InlineCompletionTriggerKind:TI,CodeActionTriggerType:gI,FoldingRangeKind:as,SelectedSuggestionInfo:epe}}const O5=rt("IEditorCancelService"),zK=new _e("cancellableOperation",!1,m("cancellableOperation","Whether the editor runs a cancellable operation, e.g. like 'Peek References'"));ft(O5,class{constructor(){this._tokens=new WeakMap}add(n,e){let t=this._tokens.get(n);t||(t=n.invokeWithinContext(s=>{const o=zK.bindTo(s.get(et)),r=new Ds;return{key:o,tokens:r}}),this._tokens.set(n,t));let i;return t.key.set(!0),i=t.tokens.push(e),()=>{i&&(i(),t.key.set(!t.tokens.isEmpty()),i=void 0)}}cancel(n){const e=this._tokens.get(n);if(!e)return;const t=e.tokens.pop();t&&(t.cancel(),e.key.set(!e.tokens.isEmpty()))}},1);class hNe extends Ar{constructor(e,t){super(t),this.editor=e,this._unregister=e.invokeWithinContext(i=>i.get(O5).add(e,this))}dispose(){this._unregister(),super.dispose()}}Ee(new class extends kr{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:zK})}runEditorCommand(n,e){n.get(O5).cancel(e)}});let fNe=class wR{constructor(e,t){if(this.flags=t,this.flags&1){const i=e.getModel();this.modelVersionId=i?zb("{0}#{1}",i.uri.toString(),i.getVersionId()):null}else this.modelVersionId=null;this.flags&4?this.position=e.getPosition():this.position=null,this.flags&2?this.selection=e.getSelection():this.selection=null,this.flags&8?(this.scrollLeft=e.getScrollLeft(),this.scrollTop=e.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(e){if(!(e instanceof wR))return!1;const t=e;return!(this.modelVersionId!==t.modelVersionId||this.scrollLeft!==t.scrollLeft||this.scrollTop!==t.scrollTop||!this.position&&t.position||this.position&&!t.position||this.position&&t.position&&!this.position.equals(t.position)||!this.selection&&t.selection||this.selection&&!t.selection||this.selection&&t.selection&&!this.selection.equalsRange(t.selection))}validate(e){return this._equals(new wR(e,this.flags))}};class gNe extends hNe{constructor(e,t,i,s){super(e,s),this._listener=new pe,t&4&&this._listener.add(e.onDidChangeCursorPosition(o=>{(!i||!N.containsPosition(i,o.position))&&this.cancel()})),t&2&&this._listener.add(e.onDidChangeCursorSelection(o=>{(!i||!N.containsRange(i,o.selection))&&this.cancel()})),t&8&&this._listener.add(e.onDidScrollChange(o=>this.cancel())),t&1&&(this._listener.add(e.onDidChangeModel(o=>this.cancel())),this._listener.add(e.onDidChangeModelContent(o=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}class pNe extends Ar{constructor(e,t){super(t),this._listener=e.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}function HK(n){return n&&typeof n.getEditorType=="function"?n.getEditorType()===aL.ICodeEditor:!1}class aB{constructor(e){this.value=e,this._lower=e.toLowerCase()}static toKey(e){return typeof e=="string"?e.toLowerCase():e._lower}}class mNe{constructor(e){if(this._set=new Set,e)for(const t of e)this.add(t)}add(e){this._set.add(aB.toKey(e))}has(e){return this._set.has(aB.toKey(e))}}var g0=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})};function _Ne(n,e,t){const i=[],s=new mNe,o=n.ordered(t);for(const a of o)i.push(a),a.extensionId&&s.add(a.extensionId);const r=e.ordered(t);for(const a of r){if(a.extensionId){if(s.has(a.extensionId))continue;s.add(a.extensionId)}i.push({displayName:a.displayName,extensionId:a.extensionId,provideDocumentFormattingEdits(l,c,d){return a.provideDocumentRangeFormattingEdits(l,l.getFullModelRange(),c,d)}})}return i}class Bv{static setFormatterSelector(e){return{dispose:Bv._selectors.unshift(e)}}static select(e,t,i){return g0(this,void 0,void 0,function*(){if(e.length===0)return;const s=ut.first(Bv._selectors);if(s)return yield s(e,t,i)})}}Bv._selectors=new Ds;function bNe(n,e,t,i,s,o){return g0(this,void 0,void 0,function*(){const r=e.documentRangeFormattingEditProvider.ordered(t);for(const a of r){const l=yield Promise.resolve(a.provideDocumentRangeFormattingEdits(t,i,s,o)).catch(wc);if(oc(l))return yield n.computeMoreMinimalEdits(t.uri,l)}})}function vNe(n,e,t,i,s){return g0(this,void 0,void 0,function*(){const o=_Ne(e.documentFormattingEditProvider,e.documentRangeFormattingEditProvider,t);for(const r of o){const a=yield Promise.resolve(r.provideDocumentFormattingEdits(t,i,s)).catch(wc);if(oc(a))return yield n.computeMoreMinimalEdits(t.uri,a)}})}function yNe(n,e,t,i,s,o,r){const a=e.onTypeFormattingEditProvider.ordered(t);return a.length===0||a[0].autoFormatTriggerCharacters.indexOf(s)<0?Promise.resolve(void 0):Promise.resolve(a[0].provideOnTypeFormattingEdits(t,i,s,o,r)).catch(wc).then(l=>n.computeMoreMinimalEdits(t.uri,l))}Yt.registerCommand("_executeFormatRangeProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i,s]=e;xs(Ue.isUri(t)),xs(N.isIRange(i));const o=n.get(Lu),r=n.get(cy),a=n.get(it),l=yield o.createModelReference(t);try{return bNe(r,a,l.object.textEditorModel,N.lift(i),s,rn.None)}finally{l.dispose()}})});Yt.registerCommand("_executeFormatDocumentProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i]=e;xs(Ue.isUri(t));const s=n.get(Lu),o=n.get(cy),r=n.get(it),a=yield s.createModelReference(t);try{return vNe(o,r,a.object.textEditorModel,i,rn.None)}finally{a.dispose()}})});Yt.registerCommand("_executeFormatOnTypeProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i,s,o]=e;xs(Ue.isUri(t)),xs(V.isIPosition(i)),xs(typeof s=="string");const r=n.get(Lu),a=n.get(cy),l=n.get(it),c=yield r.createModelReference(t);try{return yNe(a,l,c.object.textEditorModel,V.lift(i),s,o,rn.None)}finally{c.dispose()}})});Vf.wrappingIndent.defaultValue=0;Vf.glyphMargin.defaultValue=!1;Vf.autoIndent.defaultValue=3;Vf.overviewRulerLanes.defaultValue=2;Bv.setFormatterSelector((n,e,t)=>Promise.resolve(n[0]));const ps=AU();ps.editor=wTe();ps.languages=uNe();const wNe=ps.CancellationTokenSource,CNe=ps.Emitter,SNe=ps.KeyCode,xNe=ps.KeyMod,LNe=ps.Position,DNe=ps.Range,kNe=ps.Selection,ENe=ps.SelectionDirection,ANe=ps.MarkerSeverity,INe=ps.MarkerTag,TNe=ps.Uri,NNe=ps.Token,$K=ps.editor,UK=ps.languages,pE=globalThis.MonacoEnvironment;(pE!=null&&pE.globalAPI||typeof define=="function"&&define.amd)&&(globalThis.monaco=ps);typeof globalThis.require<"u"&&typeof globalThis.require.config=="function"&&globalThis.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]});const RNe=Object.freeze(Object.defineProperty({__proto__:null,CancellationTokenSource:wNe,Emitter:CNe,KeyCode:SNe,KeyMod:xNe,MarkerSeverity:ANe,MarkerTag:INe,Position:LNe,Range:DNe,Selection:kNe,SelectionDirection:ENe,Token:NNe,Uri:TNe,editor:$K,languages:UK},Symbol.toStringTag,{value:"Module"})),MNe="#/definitions/RootSpec",PNe="http://json-schema.org/draft-07/schema#",ONe=JSON.parse('{"AggregateOp":{"enum":["count","valid","sum","min","max","mean","median","variance"],"type":"string"},"AggregateParams":{"additionalProperties":false,"properties":{"as":{"description":"The names for the output fields corresponding to each aggregated field. If not provided, names will be automatically created using the operation and field names (e.g., `sum_field`, `average_field`).","items":{"type":"string"},"type":"array"},"fields":{"description":"The data fields to apply aggregate functions to. This array should correspond with the `ops` and `as` arrays. If no fields or operations are specified, a count aggregation will be applied by default.","items":{"$ref":"#/definitions/Field"},"type":"array"},"groupby":{"description":"The fields by which to group the data. If these are not defined, all data objects will be grouped into a single category.","items":{"$ref":"#/definitions/Field"},"type":"array"},"ops":{"description":"The aggregation operations to be performed on the fields, such as `\\"sum\\"`, `\\"average\\"`, or `\\"count\\"`.","items":{"$ref":"#/definitions/AggregateOp"},"type":"array"},"type":{"const":"aggregate","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"Align":{"enum":["left","center","right"],"type":"string"},"Axis":{"additionalProperties":false,"properties":{"domain":{"description":"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`","type":"boolean"},"domainCap":{"description":"The stroke cap for the domain line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"domainColor":{"description":"Color of axis domain line.\\n\\n__Default value:__ `\\"gray\\"`.","type":"string"},"domainDash":{"description":"An array of alternating [stroke, space] lengths for dashed domain lines.","items":{"type":"number"},"type":"array"},"domainDashOffset":{"description":"The pixel offset at which to start drawing with the domain dash array.","type":"number"},"domainWidth":{"description":"Stroke width of axis domain line\\n\\n__Default value:__ `1`","type":"number"},"format":{"description":"The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.","type":"string"},"grid":{"description":"A boolean flag indicating if grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"gridCap":{"description":"The stroke cap for the grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"gridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"gridDash":{"description":"An array of alternating [stroke, space] lengths for dashed grid mark lines.","items":{"type":"number"},"type":"array"},"gridDashOffset":{"description":"The pixel offset at which to start drawing with the grid mark dash array.","type":"number"},"gridOpacity":{"description":"The opacity of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"gridWidth":{"description":"Width of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"labelAlign":{"$ref":"#/definitions/Align","description":"Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."},"labelAngle":{"description":"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.","maximum":360,"minimum":-360,"type":"number"},"labelBaseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`."},"labelColor":{"description":"The color of the tick label, can be in hex color code or regular color name.","type":"string"},"labelFont":{"description":"The font of the tick label.","type":"string"},"labelFontSize":{"description":"The font size of the label, in pixels.","minimum":0,"type":"number"},"labelFontStyle":{"description":"Font style of the title.","type":"string"},"labelFontWeight":{"description":"Font weight of axis tick labels.","type":"string"},"labelLimit":{"description":"Maximum allowed pixel width of axis tick labels.\\n\\n__Default value:__ `180`","type":"number"},"labelPadding":{"description":"The padding, in pixels, between axis and text labels.\\n\\n__Default value:__ `2`","type":"number"},"labels":{"description":"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.","type":"boolean"},"maxExtent":{"description":"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.","type":"number"},"minExtent":{"description":"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.","type":"number"},"offset":{"description":"The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/AxisOrient","description":"The orientation of the axis. One of `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"` or `\\"right\\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\\n\\n__Default value:__ `\\"bottom\\"` for x-axes and `\\"left\\"` for y-axes."},"tickCap":{"description":"The stroke cap for the tick lines\' ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"tickColor":{"description":"The color of the axis\'s tick.\\n\\n__Default value:__ `\\"gray\\"`","type":"string"},"tickCount":{"description":"A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \\"nice\\" (multiples of `2`, `5`, `10`) and lie within the underlying scale\'s range.","minimum":0,"type":"number"},"tickDash":{"description":"An array of alternating [stroke, space] lengths for dashed tick mark lines.","items":{"type":"number"},"type":"array"},"tickDashOffset":{"description":"The pixel offset at which to start drawing with the tick mark dash array.","type":"number"},"tickMinStep":{"description":"The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.","type":"number"},"tickSize":{"description":"The size in pixels of axis ticks.\\n\\n__Default value:__ `5`","minimum":0,"type":"number"},"tickWidth":{"description":"The width, in pixels, of ticks.\\n\\n__Default value:__ `1`","minimum":0,"type":"number"},"ticks":{"description":"Boolean value that determines whether the axis should include ticks.\\n\\n__Default value:__ `true`","type":"boolean"},"title":{"description":"A title for the axis (none by default).","type":"string"},"titleColor":{"description":"Color of the title, can be in hex color code or regular color name.","type":"string"},"titleFont":{"description":"Font of the title. (e.g., `\\"Helvetica Neue\\"`).","type":"string"},"titleFontSize":{"description":"Font size of the title.","minimum":0,"type":"number"},"titleFontStyle":{"description":"Font style of the title.","type":"string"},"titleFontWeight":{"description":"Font weight of the title. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`).","type":"string"},"titleOpacity":{"description":"Opacity of the axis title.","type":"number"},"titlePadding":{"description":"The padding, in pixels, between title and axis.","type":"number"},"values":{"description":"Explicitly set the visible axis tick and label values.","items":{},"type":"array"}},"type":"object"},"AxisGenomeData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to use"},"type":{"const":"axisGenome","type":"string"}},"required":["type","channel"],"type":"object"},"AxisOrient":{"enum":["top","bottom","left","right"],"type":"string"},"AxisTicksData":{"additionalProperties":false,"properties":{"axis":{"$ref":"#/definitions/Axis","description":"Optional axis properties"},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to listen to"},"type":{"const":"axisTicks","type":"string"}},"required":["type","channel"],"type":"object"},"BamData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"URL of the index file.\\n\\n__Default value:__ `url` + `\\".bai\\"`.","type":"string"},"type":{"const":"bam","type":"string"},"url":{"description":"URL of the BigBed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `10000`","type":"number"}},"required":["type","url"],"type":"object"},"Baseline":{"enum":["top","middle","bottom","alphabetic"],"type":"string"},"BigBedData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"type":{"const":"bigbed","type":"string"},"url":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"URL of the BigBed file."},"windowSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `1000000`"}},"required":["type","url"],"type":"object"},"BigWigData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"pixelsPerBin":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The approximate minimum width of each data bin, in pixels.\\n\\n__Default value:__ `2`"},"type":{"const":"bigwig","type":"string"},"url":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"URL of the BigWig file."}},"required":["type","url"],"type":"object"},"BindCheckbox":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"const":"checkbox","type":"string"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"}},"required":["input"],"type":"object"},"BindInput":{"additionalProperties":false,"properties":{"autocomplete":{"description":"A hint for form autofill. See the [HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for additional information.","type":"string"},"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"description":"The type of input element to use. The valid values are `\\"checkbox\\"`, `\\"radio\\"`, `\\"range\\"`, `\\"select\\"`, `\\"text\\"`, `\\"number\\"`, and `\\"color\\"`.","enum":["text","number","color"],"type":"string"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"placeholder":{"description":"Text that appears in the form control when it has no value set.","type":"string"}},"type":"object"},"BindRadioSelect":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"enum":["radio","select"],"type":"string"},"labels":{"description":"An array of label strings to represent the `options` values. If unspecified, the `options` value will be coerced to a string and used as the label.","items":{"type":"string"},"type":"array"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"options":{"description":"An array of options to select from.","items":{},"type":"array"}},"required":["input","options"],"type":"object"},"BindRange":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"const":"range","type":"string"},"max":{"description":"Sets the maximum slider value. Defaults to the larger of the signal value and `100`.","type":"number"},"min":{"description":"Sets the minimum slider value. Defaults to the smaller of the signal value and `0`.","type":"number"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"step":{"description":"Sets the minimum slider increment. If undefined, the step size will be automatically determined based on the `min` and `max` values.","type":"number"}},"required":["input"],"type":"object"},"Binding":{"anyOf":[{"$ref":"#/definitions/BindCheckbox"},{"$ref":"#/definitions/BindRadioSelect"},{"$ref":"#/definitions/BindRange"},{"$ref":"#/definitions/BindInput"}]},"ChannelWithScale":{"anyOf":[{"$ref":"#/definitions/PositionalChannel"},{"const":"color","type":"string"},{"const":"fill","type":"string"},{"const":"stroke","type":"string"},{"const":"opacity","type":"string"},{"const":"fillOpacity","type":"string"},{"const":"strokeOpacity","type":"string"},{"const":"strokeWidth","type":"string"},{"const":"size","type":"string"},{"const":"shape","type":"string"},{"const":"angle","type":"string"},{"const":"dx","type":"string"},{"const":"dy","type":"string"}]},"ChromPosDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"const":"locus","type":"string"}},"required":["chrom","type"],"type":"object"},"ChromosomalLocus":{"additionalProperties":false,"properties":{"chrom":{"description":"The name of the chromosome. For example: `\\"chr1\\"`, `\\"CHR1\\"`, or `\\"1\\"`.","type":"string"},"pos":{"description":"The zero-based position inside the chromosome or contig.","type":"number"}},"required":["chrom"],"type":"object"},"CollectParams":{"additionalProperties":false,"properties":{"groupby":{"description":"Arranges the data into consecutive batches based on the groups. This is mainly intended for internal use so that faceted data can be handled as batches.","items":{"$ref":"#/definitions/Field"},"type":"array"},"sort":{"$ref":"#/definitions/CompareParams","description":"The sort order."},"type":{"const":"collect","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"ColorDef":{"$ref":"#/definitions/MarkPropDef%3C(string%7Cnull)%3E"},"CompareParams":{"additionalProperties":false,"properties":{"field":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to sort by"},"order":{"anyOf":[{"items":{"$ref":"#/definitions/SortOrder"},"type":"array"},{"$ref":"#/definitions/SortOrder"}],"description":"The order(s) to use: `\\"ascending\\"` (default), `\\"descending\\"`."}},"required":["field"],"type":"object"},"ComplexDomain":{"description":"A complex domain that needs to be converted into a scalar domain before it is assigned to a scale.","items":{"$ref":"#/definitions/ChromosomalLocus"},"type":"array"},"ConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"columns":{"description":"The number of columns in the grid.","type":"number"},"concat":{"description":"Specifies views that will be concatenated into a grid that wraps when the specified number of columns are used.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["concat","columns"],"type":"object"},"Conditional":{"$ref":"#/definitions/ConditionalParameter%3CDatumDef%3E"},"Conditional":{"$ref":"#/definitions/ConditionalParameter%3CFieldDef%3E"},"Conditional>":{"$ref":"#/definitions/ConditionalParameter%3CValueDef%3C(number%7CExprRef)%3E%3E"},"Conditional>":{"$ref":"#/definitions/ConditionalParameter%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"ConditionalParameter":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["param"],"type":"object"},"ConditionalParameter":{"anyOf":[{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"required":["param"],"type":"object"},{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["param","type"],"type":"object"}]},"ConditionalParameter>":{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["param","value"],"type":"object"},"ConditionalParameter>":{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"string"},{"type":"null"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["param","value"],"type":"object"},"Contig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"size":{"type":"number"}},"required":["name","size"],"type":"object"},"CoverageParams":{"additionalProperties":false,"properties":{"as":{"description":"The output field for the computed coverage.","type":"string"},"asChrom":{"description":"The output field for the chromosome.\\n\\n**Default:** Same as `chrom`","type":"string"},"asEnd":{"description":"The output field for the end coordinate.\\n\\n**Default:** Same as `end`","type":"string"},"asStart":{"description":"The output field for the start coordinate.\\n\\n**Default:** Same as `start`","type":"string"},"chrom":{"$ref":"#/definitions/Field","description":"An optional chromosome field that is passed through. TODO: groupby"},"end":{"$ref":"#/definitions/Field","description":"The field representing the end coordinate of the segment (exclusive)."},"start":{"$ref":"#/definitions/Field","description":"The field representing the start coordinate of the segment (inclusive)."},"type":{"const":"coverage","description":"The type of the transform to be applied","type":"string"},"weight":{"$ref":"#/definitions/Field","description":"A field representing an optional weight for the segment. Can be used with copy ratios, for example."}},"required":["end","start","type"],"type":"object"},"CsvDataFormat":{"additionalProperties":false,"properties":{"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"type":{"description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","enum":["csv","tsv"],"type":"string"}},"type":"object"},"Data":{"anyOf":[{"$ref":"#/definitions/DataSource"},{"$ref":"#/definitions/Generator"}]},"DataFormat":{"anyOf":[{"$ref":"#/definitions/CsvDataFormat"},{"$ref":"#/definitions/DsvDataFormat"},{"$ref":"#/definitions/JsonDataFormat"},{"$ref":"#/definitions/OtherDataFormat"}]},"DataSource":{"anyOf":[{"$ref":"#/definitions/UrlData"},{"$ref":"#/definitions/InlineData"},{"$ref":"#/definitions/NamedData"},{"$ref":"#/definitions/DynamicCallbackData"},{"$ref":"#/definitions/LazyData"}]},"DsvDataFormat":{"additionalProperties":false,"properties":{"delimiter":{"description":"The delimiter between records. The delimiter must be a single character (i.e., a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not.","maxLength":1,"minLength":1,"type":"string"},"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"type":{"const":"dsv","description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","type":"string"}},"required":["delimiter"],"type":"object"},"DynamicCallbackData":{"additionalProperties":false,"properties":{"dynamicCallbackSource":{"description":"The View class has `getDynamicData()` methods that provides the data. This is intended for internal use.","type":"boolean"},"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"}},"required":["dynamicCallbackSource"],"type":"object"},"DynamicOpacity":{"additionalProperties":false,"description":"DynamicOpacity specifies a zoom-dependent behavior for view opacity. The opacity is interpolated between the specified stops.","properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel"},"unitsPerPixel":{"description":"Stops expressed as units (base pairs, for example) per pixel.","items":{"type":"number"},"type":"array"},"values":{"description":"Opacity values that match the given stops.","items":{"type":"number"},"type":"array"}},"required":["unitsPerPixel","values"],"type":"object"},"Encoding":{"additionalProperties":false,"properties":{"angle":{"$ref":"#/definitions/NumericMarkPropDef","description":"Rotation angle of point and text marks."},"color":{"$ref":"#/definitions/ColorDef","description":"Color of the marks – either fill or stroke color based on the `filled` property of mark definition.\\n\\n_Note:_ 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. The `fill` or `stroke` encodings have higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified. 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme)."},"dx":{"$ref":"#/definitions/NumericMarkPropDef"},"dy":{"$ref":"#/definitions/NumericMarkPropDef"},"facetIndex":{"$ref":"#/definitions/FieldDefWithoutScale","description":"For internal use"},"fill":{"$ref":"#/definitions/ColorDef","description":"Fill color of the marks.\\n\\n_Note:_ The `fill` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."},"fillOpacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Fill opacity of the marks."},"opacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Opacity of the marks."},"sample":{"$ref":"#/definitions/FieldDefWithoutScale","description":"Facet identifier for interactive filtering, sorting, and grouping in the App."},"search":{"$ref":"#/definitions/FieldDefWithoutScale"},"semanticScore":{"$ref":"#/definitions/FieldDefWithoutScale"},"shape":{"$ref":"#/definitions/ShapeDef","description":"Shape of the mark.\\n\\nFor `point` marks the supported values include:\\n- plotting shapes: `\\"circle\\"`, `\\"square\\"`, `\\"cross\\"`, `\\"diamond\\"`, `\\"triangle-up\\"`, `\\"triangle-down\\"`, `\\"triangle-right\\"`, or `\\"triangle-left\\"`.\\n- centered directional shape `\\"triangle\\"`"},"size":{"$ref":"#/definitions/NumericMarkPropDef","description":"Size of the mark.\\n- For `\\"point\\"` – the symbol size, or pixel area of the mark.\\n- For `\\"text\\"` – the text\'s font size."},"stroke":{"$ref":"#/definitions/ColorDef","description":"Stroke color of the marks.\\n\\n_Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."},"strokeOpacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Stroke opacity of the marks."},"strokeWidth":{"$ref":"#/definitions/NumericMarkPropDef","description":"Stroke width of the marks."},"text":{"$ref":"#/definitions/TextDef","description":"Text of the `text` mark."},"uniqueId":{"$ref":"#/definitions/FieldDefWithoutScale","description":"For internal use"},"x":{"anyOf":[{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"const":"locus","type":"string"}},"required":["chrom","type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr","type"],"type":"object"},{"additionalProperties":false,"properties":{"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["value"],"type":"object"}],"description":"X coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"x2":{"$ref":"#/definitions/Position2Def","description":"X2 coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"y":{"$ref":"#/definitions/PositionDef","description":"Y coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"y2":{"$ref":"#/definitions/Position2Def","description":"Y2 coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."}},"type":"object"},"ExprDef":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr"],"type":"object"},"ExprFilterParams":{"additionalProperties":false,"properties":{"expr":{"description":"An expression string. The data object is removed if the expression evaluates to false.","type":"string"},"type":{"const":"filter","description":"The type of the transform to be applied","type":"string"}},"required":["expr","type"],"type":"object"},"ExprRef":{"additionalProperties":false,"properties":{"expr":{"description":"The expression string.","type":"string"}},"required":["expr"],"type":"object"},"Field":{"description":"The name of the field or a JavaScript expression for accessing nested properties. Dots and brackets in the field name must be escaped.","type":"string"},"FieldDefWithoutScale":{"additionalProperties":false,"properties":{"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},"FieldName":{"type":"string"},"FieldOrDatumDefWithCondition":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"FieldOrDatumDefWithCondition":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"FieldOrDatumDefWithCondition,(string|null)>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"FieldOrDatumDefWithCondition,number>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"FieldOrDatumDefWithCondition,(string|null)>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/TypeForShape"}},"required":["type"],"type":"object"},"FilterParams":{"anyOf":[{"$ref":"#/definitions/ExprFilterParams"},{"$ref":"#/definitions/SelectionFilterParams"}]},"FilterScoredLabelsParams":{"additionalProperties":false,"properties":{"channel":{"description":"**Default:** `\\"x\\"`","enum":["x","y"],"type":"string"},"lane":{"$ref":"#/definitions/Field","description":"An optional field representing element\'s lane, e.g., if transcripts are shown using a piled up layout."},"padding":{"description":"Padding (in pixels) around the element.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/Field","description":"The field representing element\'s position on the domain."},"score":{"$ref":"#/definitions/Field","description":"The field representing the score used for prioritization."},"type":{"const":"filterScoredLabels","description":"The type of the transform to be applied","type":"string"},"width":{"$ref":"#/definitions/Field","description":"The field representing element\'s width in pixels"}},"required":["pos","score","type","width"],"type":"object"},"FlattenCompressedExonsParams":{"additionalProperties":false,"properties":{"as":{"description":"Field names for the flattened exons.\\n\\n**Default:** `[\\"exonStart\\", \\"exonEnd\\"]`","items":{"type":"string"},"maxItems":2,"minItems":2,"type":"array"},"exons":{"$ref":"#/definitions/Field","description":"The field containing the exons.\\n\\n**Default:** `\\"exons\\"`"},"start":{"$ref":"#/definitions/Field","description":"Start coordinate of the gene body.\\n\\n**Default:** `\\"start\\"`"},"type":{"const":"flattenCompressedExons","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FlattenDelimitedParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"The output field name(s) for the flattened field.\\n\\n**Default:** the input fields."},"field":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to split and flatten"},"separator":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"Separator(s) used on the field(s) TODO: Rename to delimiter"},"type":{"const":"flattenDelimited","description":"The type of the transform to be applied","type":"string"}},"required":["field","separator","type"],"type":"object"},"FlattenParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"The output field name(s) for the flattened field.\\n\\n**Default:** the input fields."},"fields":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to flatten. If no field is defined, the data object itself is treated as an array to be flattened."},"index":{"description":"The output field name for the zero-based index of the array values. If unspecified, an index field is not added.","type":"string"},"type":{"const":"flatten","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FlattenSequenceParams":{"additionalProperties":false,"properties":{"as":{"description":"Name of the fields where the zero-based index number and flattened sequence letter are written to.\\n\\n**Default:** `[\\"pos\\", \\"sequence\\"]`","items":{"type":"string"},"maxItems":2,"minItems":2,"type":"array"},"field":{"$ref":"#/definitions/Field","description":"The field to flatten.\\n\\n**Default:** `\\"sequence\\"`"},"type":{"const":"flattenSequence","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FontStyle":{"enum":["normal","italic"],"type":"string"},"FontWeight":{"anyOf":[{"type":"number"},{"const":"thin","type":"string"},{"const":"light","type":"string"},{"const":"regular","type":"string"},{"const":"normal","type":"string"},{"const":"medium","type":"string"},{"const":"bold","type":"string"},{"const":"black","type":"string"}]},"FormulaParams":{"additionalProperties":false,"properties":{"as":{"description":"The (new) field where the computed value is written to","type":"string"},"expr":{"description":"An expression string","type":"string"},"type":{"const":"formula","description":"The type of the transform to be applied","type":"string"}},"required":["as","expr","type"],"type":"object"},"Generator":{"$ref":"#/definitions/SequenceGenerator"},"GenomeAxis":{"additionalProperties":false,"properties":{"chromGrid":{"description":"A boolean flag indicating if chromosome grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"chromGridCap":{"description":"The stroke cap for the chromosome grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"chromGridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"chromGridDash":{"description":"An array of alternating [stroke, space] lengths for dashed chromosome grid mark lines.","items":{"type":"number"},"type":"array"},"chromGridDashOffset":{"description":"The pixel offset at which to start drawing with the chromosome grid mark dash array.","type":"number"},"chromGridFillEven":{"description":"Fill color of odd chromosomes.\\n\\n__Default value:__ (none)","type":"string"},"chromGridFillOdd":{"description":"Fill color of odd chromosomes.\\n\\n__Default value:__ (none)","type":"string"},"chromGridOpacity":{"description":"The opacity of the chromosome grid lines.\\n\\n__Default value:__ `1`","type":"number"},"chromGridWidth":{"description":"Width of the chromosome grid lines.\\n\\n__Default value:__ `1`","type":"number"},"chromLabelAlign":{"$ref":"#/definitions/Align"},"chromLabelColor":{"type":"string"},"chromLabelFont":{"type":"string"},"chromLabelFontSize":{"type":"number"},"chromLabelFontStyle":{"$ref":"#/definitions/FontStyle"},"chromLabelFontWeight":{"$ref":"#/definitions/FontWeight"},"chromLabelPadding":{"type":"number"},"chromLabels":{"type":"boolean"},"chromTickColor":{"type":"string"},"chromTickDash":{"items":{"type":"number"},"type":"array"},"chromTickDashOffset":{"type":"number"},"chromTickSize":{"type":"number"},"chromTickWidth":{"type":"number"},"chromTicks":{"type":"boolean"},"domain":{"description":"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`","type":"boolean"},"domainCap":{"description":"The stroke cap for the domain line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"domainColor":{"description":"Color of axis domain line.\\n\\n__Default value:__ `\\"gray\\"`.","type":"string"},"domainDash":{"description":"An array of alternating [stroke, space] lengths for dashed domain lines.","items":{"type":"number"},"type":"array"},"domainDashOffset":{"description":"The pixel offset at which to start drawing with the domain dash array.","type":"number"},"domainWidth":{"description":"Stroke width of axis domain line\\n\\n__Default value:__ `1`","type":"number"},"format":{"description":"The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.","type":"string"},"grid":{"description":"A boolean flag indicating if grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"gridCap":{"description":"The stroke cap for the grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"gridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"gridDash":{"description":"An array of alternating [stroke, space] lengths for dashed grid mark lines.","items":{"type":"number"},"type":"array"},"gridDashOffset":{"description":"The pixel offset at which to start drawing with the grid mark dash array.","type":"number"},"gridOpacity":{"description":"The opacity of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"gridWidth":{"description":"Width of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"labelAlign":{"$ref":"#/definitions/Align","description":"Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."},"labelAngle":{"description":"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.","maximum":360,"minimum":-360,"type":"number"},"labelBaseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`."},"labelColor":{"description":"The color of the tick label, can be in hex color code or regular color name.","type":"string"},"labelFont":{"description":"The font of the tick label.","type":"string"},"labelFontSize":{"description":"The font size of the label, in pixels.","minimum":0,"type":"number"},"labelFontStyle":{"description":"Font style of the title.","type":"string"},"labelFontWeight":{"description":"Font weight of axis tick labels.","type":"string"},"labelLimit":{"description":"Maximum allowed pixel width of axis tick labels.\\n\\n__Default value:__ `180`","type":"number"},"labelPadding":{"description":"The padding, in pixels, between axis and text labels.\\n\\n__Default value:__ `2`","type":"number"},"labels":{"description":"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.","type":"boolean"},"maxExtent":{"description":"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.","type":"number"},"minExtent":{"description":"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.","type":"number"},"offset":{"description":"The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/AxisOrient","description":"The orientation of the axis. One of `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"` or `\\"right\\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\\n\\n__Default value:__ `\\"bottom\\"` for x-axes and `\\"left\\"` for y-axes."},"tickCap":{"description":"The stroke cap for the tick lines\' ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"tickColor":{"description":"The color of the axis\'s tick.\\n\\n__Default value:__ `\\"gray\\"`","type":"string"},"tickCount":{"description":"A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \\"nice\\" (multiples of `2`, `5`, `10`) and lie within the underlying scale\'s range.","minimum":0,"type":"number"},"tickDash":{"description":"An array of alternating [stroke, space] lengths for dashed tick mark lines.","items":{"type":"number"},"type":"array"},"tickDashOffset":{"description":"The pixel offset at which to start drawing with the tick mark dash array.","type":"number"},"tickMinStep":{"description":"The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.","type":"number"},"tickSize":{"description":"The size in pixels of axis ticks.\\n\\n__Default value:__ `5`","minimum":0,"type":"number"},"tickWidth":{"description":"The width, in pixels, of ticks.\\n\\n__Default value:__ `1`","minimum":0,"type":"number"},"ticks":{"description":"Boolean value that determines whether the axis should include ticks.\\n\\n__Default value:__ `true`","type":"boolean"},"title":{"description":"A title for the axis (none by default).","type":"string"},"titleColor":{"description":"Color of the title, can be in hex color code or regular color name.","type":"string"},"titleFont":{"description":"Font of the title. (e.g., `\\"Helvetica Neue\\"`).","type":"string"},"titleFontSize":{"description":"Font size of the title.","minimum":0,"type":"number"},"titleFontStyle":{"description":"Font style of the title.","type":"string"},"titleFontWeight":{"description":"Font weight of the title. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`).","type":"string"},"titleOpacity":{"description":"Opacity of the axis title.","type":"number"},"titlePadding":{"description":"The padding, in pixels, between title and axis.","type":"number"},"values":{"description":"Explicitly set the visible axis tick and label values.","items":{},"type":"array"}},"type":"object"},"GenomeConfig":{"anyOf":[{"$ref":"#/definitions/UrlGenomeConfig"},{"$ref":"#/definitions/InlineGenomeConfig"},{"$ref":"#/definitions/GenomeConfigBase"}]},"GenomeConfigBase":{"additionalProperties":false,"properties":{"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"}},"required":["name"],"type":"object"},"Gff3Data":{"additionalProperties":false,"properties":{"addChrPrefix":{"description":"Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\\n\\n__Default value:__ `false`","type":["boolean","string"]},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"Url of the tabix index file.\\n\\n__Default value:__ `url` + `\\".tbi\\"`.","type":"string"},"type":{"const":"gff3","type":"string"},"url":{"description":"Url of the bgzip compressed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `30000000`","type":"number"}},"required":["type","url"],"type":"object"},"HConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"hconcat":{"description":"Specifies views that will be concatenated horizontally.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["hconcat"],"type":"object"},"HandledTooltip":{"additionalProperties":false,"properties":{"handler":{"type":"string"},"params":{"type":"object"}},"required":["handler"],"type":"object"},"IdentifierParams":{"additionalProperties":false,"properties":{"as":{"description":"**Default:** `\\"_uniqueId\\"`","type":"string"},"type":{"const":"identifier","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"ImportSpec":{"additionalProperties":false,"properties":{"import":{"anyOf":[{"$ref":"#/definitions/UrlImport"},{"$ref":"#/definitions/TemplateImport"}],"description":"The method to import a specification."},"name":{"description":"The name given to the imported view. This property overrides the name specified in the imported specification.","type":"string"},"params":{"anyOf":[{"items":{"$ref":"#/definitions/Parameter"},"type":"array"},{"type":"object"}],"description":"Dynamic variables that parameterize a visualization. Parameters defined here override the parameters defined in the imported specification."}},"required":["import"],"type":"object"},"IndexedFastaData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"URL of the index file.\\n\\n__Default value:__ `url` + `\\".fai\\"`.","type":"string"},"type":{"const":"indexedFasta","type":"string"},"url":{"description":"URL of the fasta file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the fasta file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `7000`","type":"number"}},"required":["type","url"],"type":"object"},"InlineData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"values":{"$ref":"#/definitions/InlineDataset","description":"The full data set, included inline. This can be an array of objects or primitive values, an object, or a string. Arrays of primitive values are ingested as objects with a `data` property. Strings are parsed according to the specified format type."}},"required":["values"],"type":"object"},"InlineDataset":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"items":{"type":"string"},"type":"array"},{"items":{"type":"boolean"},"type":"array"},{"items":{"type":"object"},"type":"array"},{"type":"string"},{"type":"object"}]},"InlineGenomeConfig":{"additionalProperties":false,"properties":{"contigs":{"description":"An array of contigs/sequences in the genome assembly.","items":{"$ref":"#/definitions/Contig"},"type":"array"},"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"}},"required":["contigs","name"],"type":"object"},"IntervalSelectionConfig":{"additionalProperties":false,"properties":{"encodings":{"description":"An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"$ref":"#/definitions/ChannelWithScale"},"type":"array"},"fields":{"description":"An array of field names whose values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"type":"string"},"type":"array"},"on":{"enum":["click","mouseover","pointerover"],"type":"string"},"type":{"const":"interval","description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`.","type":"string"}},"required":["type"],"type":"object"},"JsonDataFormat":{"additionalProperties":false,"properties":{"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"property":{"description":"The JSON property containing the desired data. This parameter can be used when the loaded JSON file may have surrounding structure or meta-data. For example `\\"property\\": \\"values.features\\"` is equivalent to retrieving `json.values.features` from the loaded JSON object.","type":"string"},"type":{"const":"json","description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","type":"string"}},"type":"object"},"LayerSpec":{"additionalProperties":false,"properties":{"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"layer":{"items":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["layer"],"type":"object"},"LazyData":{"additionalProperties":false,"properties":{"lazy":{"$ref":"#/definitions/LazyDataParams"}},"required":["lazy"],"type":"object"},"LazyDataParams":{"anyOf":[{"$ref":"#/definitions/AxisTicksData"},{"$ref":"#/definitions/AxisGenomeData"},{"$ref":"#/definitions/IndexedFastaData"},{"$ref":"#/definitions/BigWigData"},{"$ref":"#/definitions/BigBedData"},{"$ref":"#/definitions/BamData"},{"$ref":"#/definitions/Gff3Data"},{"$ref":"#/definitions/VcfData"}]},"LinearizeGenomicCoordinateParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"The output field or fields for linearized coordinates."},"channel":{"description":"Get the genome assembly from the scale of the channel.\\n\\n**Default:** `\\"x\\"`","enum":["x","y"],"type":"string"},"chrom":{"$ref":"#/definitions/Field","description":"The chromosome/contig field"},"offset":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"}],"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`"},"pos":{"anyOf":[{"$ref":"#/definitions/Field"},{"items":{"$ref":"#/definitions/Field"},"type":"array"}],"description":"The field or fields that contain intra-chromosomal positions"},"type":{"const":"linearizeGenomicCoordinate","description":"The type of the transform to be applied","type":"string"}},"required":["as","chrom","pos","type"],"type":"object"},"LinkProps":{"additionalProperties":false,"properties":{"arcFadingDistance":{"anyOf":[{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},{"const":false,"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"The range of the `\\"arc\\"` shape\'s fading distance in pixels. This property allows for making the arc\'s opacity fade out as it extends away from the chord. The fading distance is interpolated from one to zero between the interval defined by this property. Both `false` and `[0, 0]` disable fading.\\n\\n**Default value:** `false`"},"arcHeightFactor":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Scaling factor for the `\\"arc`\\" shape\'s height. The default value `1.0` produces roughly circular arcs.\\n\\n**Default value:** `1.0`"},"clampApex":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Whether the apex of the `\\"dome\\"` shape is clamped to the viewport edge. When over a half of the dome is located outside the viewport, clamping allows for more accurate reading of the value encoded by the apex\' position.\\n\\n**Default value:** `false`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"linkShape":{"anyOf":[{"const":"arc","type":"string"},{"const":"diagonal","type":"string"},{"const":"line","type":"string"},{"const":"dome","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The shape of the link path.\\n\\nThe `\\"arc\\"` shape draws a circular arc between the two points. The apex of the arc resides on the left side of the line that connects the two points. The `\\"dome\\"` shape draws a vertical or horizontal arc with a specific height. The primary positional channel determines the apex of the arc and the secondary determines the endpoint placement. The `\\"diagonal\\"` shape draws an \\"S\\"-shaped curve between the two points. The `\\"line\\"` shape draws a straight line between the two points. See an [example](#different-link-shapes-and-orientations) of the different shapes below.\\n\\n**Default value:** `\\"arc\\"`"},"maxChordLength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The maximum length of `\\"arc\\"` shape\'s chord in pixels. The chord is the line segment between the two points that define the arc. Limiting the chord length serves two purposes when zooming in close enough: 1) it prevents the arc from becoming a straight line and 2) it mitigates the limited precision of floating point numbers in arc rendering.\\n\\n**Default value:** `50000`"},"minArcHeight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum height of an `\\"arc\\"` shape. Makes very short links more clearly visible.\\n\\n**Default value:** `1.5`"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minPickingSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\\n\\n**Default value:** `3.0` for `\\"link\\"` and `2.0` for `\\"point\\"`"},"noFadingOnPointSelection":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Disables fading of the link when an mark instance is subject to any point selection. As the fading distance is unavailable as a visual channel, this property allows for enhancing the visibility of the selected links.\\n\\n**Default value:** `true`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"orient":{"anyOf":[{"const":"vertical","type":"string"},{"const":"horizontal","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The orientation of the link path. Either `\\"vertical\\"` or `\\"horizontal\\"`. Only applies to diagonal links.\\n\\n**Default value:** `\\"vertical\\"`"},"segments":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The number of segments in the bézier curve. Affects the rendering quality and performance. Use a higher value for a smoother curve.\\n\\n**Default value:** `101`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"link","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"MarkPropDef<(string|null),TypeForShape>":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CTypeForShape%3E%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3C(string%7Cnull)%3E"}]},"MarkPropDef<(string|null)>":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3C(string%7Cnull)%3E"}]},"MarkPropDef":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2Cnumber%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2Cnumber%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3Cnumber%3E"}]},"MarkProps":{"anyOf":[{"$ref":"#/definitions/RectProps"},{"$ref":"#/definitions/TextProps"},{"$ref":"#/definitions/RuleProps"},{"$ref":"#/definitions/LinkProps"},{"$ref":"#/definitions/PointProps"}]},"MarkType":{"enum":["rect","point","rule","text","link"],"type":"string"},"MeasureTextParams":{"additionalProperties":false,"properties":{"as":{"type":"string"},"field":{"$ref":"#/definitions/Field"},"fontSize":{"type":"number"},"type":{"const":"measureText","description":"The type of the transform to be applied","type":"string"}},"required":["as","field","fontSize","type"],"type":"object"},"MergeFacetsParams":{"additionalProperties":false,"properties":{"type":{"const":"mergeFacets","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"NamedData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"}},"required":["name"],"type":"object"},"NumericDomain":{"items":{"type":"number"},"type":"array"},"NumericMarkPropDef":{"$ref":"#/definitions/MarkPropDef%3Cnumber%3E"},"NumericValueDef":{"$ref":"#/definitions/ValueDef%3Cnumber%3E"},"OtherDataFormat":{"additionalProperties":false,"description":"Other data format, such as `\\"fasta\\"`","properties":{"type":{"type":"string"}},"required":["type"],"type":"object"},"PaddingConfig":{"anyOf":[{"$ref":"#/definitions/Paddings"},{"type":"number"}]},"Paddings":{"additionalProperties":false,"properties":{"bottom":{"type":"number"},"left":{"type":"number"},"right":{"type":"number"},"top":{"type":"number"}},"type":"object"},"Parameter":{"anyOf":[{"$ref":"#/definitions/VariableParameter"},{"$ref":"#/definitions/SelectionParameter"}]},"Parse":{"additionalProperties":{"$ref":"#/definitions/ParseValue"},"type":"object"},"ParseValue":{"anyOf":[{"type":"null"},{"type":"string"},{"const":"string","type":"string"},{"const":"boolean","type":"string"},{"const":"date","type":"string"},{"const":"number","type":"string"}]},"PileupParams":{"additionalProperties":false,"properties":{"as":{"description":"The output field name for the computed lane.\\n\\n**Default:** `\\"lane\\"`.","type":"string"},"end":{"$ref":"#/definitions/Field","description":"The field representing the end coordinate of the segment (exclusive)."},"preference":{"$ref":"#/definitions/Field","description":"An optional field indicating the preferred lane. Use together with the `preferredOrder` property."},"preferredOrder":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"items":{"type":"number"},"type":"array"},{"items":{"type":"boolean"},"type":"array"}],"description":"The order of the lane preferences. The first element contains the value that should place the segment on the first lane and so forth. If the preferred lane is occupied, the first available lane is taken."},"spacing":{"description":"The spacing between adjacent segments on the same lane in coordinate units.\\n\\n**Default:** `1`.","type":"number"},"start":{"$ref":"#/definitions/Field","description":"The field representing the start coordinate of the segment (inclusive)."},"type":{"const":"pileup","description":"The type of the transform to be applied","type":"string"}},"required":["end","start","type"],"type":"object"},"PointProps":{"additionalProperties":false,"properties":{"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The rotation angle in degrees.\\n\\n**Default value:** `0`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillGradientStrength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Gradient strength controls the amount of the gradient eye-candy effect in the fill color. Valid values are between `0` and `1`.\\n\\n**Default value:** `0`"},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"filled":{"description":"Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).","type":"boolean"},"geometricZoomBound":{"description":"Enables geometric zooming. The value is the base two logarithmic zoom level where the maximum point size is reached.\\n\\n**Default value:** `0`","type":"number"},"inwardStroke":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Should the stroke only grow inwards, e.g, the diameter/outline is not affected by the stroke width. Thus, a point that has a zero size has no visible stroke. This allows strokes to be used with geometric zoom, etc.\\n\\n**Default value:** `false`"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minPickingSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\\n\\n**Default value:** `3.0` for `\\"link\\"` and `2.0` for `\\"point\\"`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"semanticZoomFraction":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"TODO\\n\\n**Default value:** `0.02`"},"shape":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"One of `\\"circle\\"`, `\\"square\\"`, `\\"cross\\"`, `\\"diamond\\"`, `\\"triangle-up\\"`, `\\"triangle-down\\"`, `\\"triangle-right\\"`, `\\"triangle-left\\"`, `\\"tick-up\\"`, `\\"tick-down\\"`, `\\"tick-right\\"`, or `\\"tick-left\\"`\\n\\n**Default value:** `\\"circle\\"`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke width in pixels."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"point","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"PointSelectionConfig":{"additionalProperties":false,"properties":{"encodings":{"description":"An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"$ref":"#/definitions/ChannelWithScale"},"type":"array"},"fields":{"description":"An array of field names whose values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"type":"string"},"type":"array"},"on":{"enum":["click","mouseover","pointerover"],"type":"string"},"toggle":{"description":"Controls whether data values should be toggled (inserted or removed from a point selection) when clicking with the shift key pressed.\\n\\n- `true` -- additional values can be selected by shift-clicking.\\n- `false` -- only a single value can be selected at a time.\\n\\n__Default value:__ `true`","type":"boolean"},"type":{"const":"point","description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`.","type":"string"}},"required":["type"],"type":"object"},"Position2Def":{"anyOf":[{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},{"$ref":"#/definitions/SecondaryChromPosDef"},{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr"],"type":"object"},{"$ref":"#/definitions/PositionValueDef"}]},"PositionDatumDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"PositionDef":{"anyOf":[{"$ref":"#/definitions/PositionFieldDef"},{"$ref":"#/definitions/ChromPosDef"},{"$ref":"#/definitions/PositionDatumDef"},{"$ref":"#/definitions/PositionExprDef"},{"$ref":"#/definitions/PositionValueDef"}]},"PositionExprDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr","type"],"type":"object"},"PositionFieldDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"PositionValueDef":{"$ref":"#/definitions/NumericValueDef"},"PositionalChannel":{"anyOf":[{"$ref":"#/definitions/PrimaryPositionalChannel"},{"$ref":"#/definitions/SecondaryPositionalChannel"}]},"PrimaryPositionalChannel":{"enum":["x","y"],"type":"string"},"ProjectParams":{"additionalProperties":false,"properties":{"as":{"description":"New names for the projected fields. If omitted, the names of the source fields are used.","items":{"type":"string"},"type":"array"},"fields":{"description":"The fields to be projected.","items":{"$ref":"#/definitions/Field"},"type":"array"},"type":{"const":"project","description":"The type of the transform to be applied","type":"string"}},"required":["fields","type"],"type":"object"},"RectProps":{"additionalProperties":false,"properties":{"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"cornerRadius":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the rounded corners.\\n\\n**Default value:** `0`"},"cornerRadiusBottomLeft":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the bottom left rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusBottomRight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the bottom right rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusTopLeft":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the top left rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusTopRight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the top right rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"filled":{"description":"Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).","type":"boolean"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minHeight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum height of a rectangle in pixels. The property clamps rectangles\' heights.\\n\\n**Default value:** `0`"},"minOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Clamps the minimum size-dependent opacity. The property does not affect the `opacity` channel. Valid values are between `0` and `1`.\\n\\nWhen a rectangle would be smaller than what is specified in `minHeight` and `minWidth`, it is faded out proportionally. Example: a rectangle would be rendered as one pixel wide, but `minWidth` clamps it to five pixels. The rectangle is actually rendered as five pixels wide, but its opacity is multiplied by 0.2. With this setting, you can limit the factor to, for example, 0.5 to keep the rectangles more clearly visible.\\n\\n**Default value:** `0`"},"minWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum width of a rectangle in pixels. The property clamps rectangles\' widths when the viewport is zoomed out.\\n\\nThis property also reduces flickering of very narrow rectangles when zooming. The value should generally be at least one.\\n\\n**Default value:** `1`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke width in pixels."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"rect","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"RegexExtractParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"The new field or an array of fields where the extracted values are written."},"field":{"$ref":"#/definitions/Field","description":"The source field"},"regex":{"description":"A valid JavaScript regular expression with at least one group. For example: `\\"^Sample(\\\\\\\\d+)$\\"`.\\n\\nRead more at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions","type":"string"},"skipInvalidInput":{"description":"Do not complain about invalid input. Just skip it and leave the new fields undefined on the affected datum.\\n\\n**Default:** `false`","type":"boolean"},"type":{"const":"regexExtract","description":"The type of the transform to be applied","type":"string"}},"required":["as","field","regex","type"],"type":"object"},"RegexFoldParams":{"additionalProperties":false,"properties":{"asKey":{"description":"**Default:** `\\"sample\\"`","type":"string"},"asValue":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"A new column name for the extracted values."},"columnRegex":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"A regular expression that matches to column names. The regex must have one capturing group that is used for extracting the key (e.g., a sample id) from the column name."},"skipRegex":{"description":"An optional regex that matches to fields that should not be included in the new folded data objects.","type":"string"},"type":{"const":"regexFold","description":"The type of the transform to be applied","type":"string"}},"required":["asValue","columnRegex","type"],"type":"object"},"ResolutionBehavior":{"description":"`\\"independent\\"` and `\\"shared\\"` behave similarly to Vega-Lite. `\\"excluded\\"` behaves like `\\"shared\\"`, but is not pulled towards the root. `\\"forced\\"` behaves like `\\"shared\\"`, but is forced towards the root even if the parent has `\\"independent\\"` behavior.","enum":["independent","shared","excluded","forced"],"type":"string"},"RootSpec":{"anyOf":[{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"mark":{"anyOf":[{"$ref":"#/definitions/MarkType"},{"$ref":"#/definitions/MarkProps"}],"description":"The graphical mark presenting the data objects."},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"The background of the view, including fill, stroke, and stroke width."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["mark"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"layer":{"items":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["layer"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"vconcat":{"description":"Specifies views that will be concatenated vertically.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["vconcat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"hconcat":{"description":"Specifies views that will be concatenated horizontally.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["hconcat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"columns":{"description":"The number of columns in the grid.","type":"number"},"concat":{"description":"Specifies views that will be concatenated into a grid that wraps when the specified number of columns are used.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["columns","concat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"samples":{"$ref":"#/definitions/SampleDef","description":"Sample metadata definition. If the object is empty, the sample identifiers will be inferred from the data."},"spec":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"}],"description":"The view specification to be repeated for each sample."},"stickySummaries":{"type":"boolean"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"An object defining the view background and outline. The background is repeated for each group."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["samples","spec"],"type":"object"}]},"RuleProps":{"additionalProperties":false,"properties":{"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minLength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum length of the rule in pixels. Use this property to ensure that very short ranged rules remain visible even when the user zooms out.\\n\\n**Default value:** `0`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"strokeCap":{"anyOf":[{"const":"butt","type":"string"},{"const":"square","type":"string"},{"const":"round","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The style of stroke ends. Available choices: `\\"butt\\"`, `\\"round`\\", and `\\"square\\"`.\\n\\n**Default value:** `\\"butt\\"`"},"strokeDash":{"description":"An array of of alternating stroke and gap lengths or `null` for solid strokes.\\n\\n**Default value:** `null`","items":{"type":"number"},"type":"array"},"strokeDashOffset":{"description":"An offset for the stroke dash pattern.\\n\\n**Default value:** `0`","type":"number"},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"rule","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"SampleAttributeDef":{"additionalProperties":false,"properties":{"barScale":{"$ref":"#/definitions/Scale","description":"An optional scale definition for mapping the attribute to the width of a metadata rectangle."},"scale":{"$ref":"#/definitions/Scale","description":"Scale definition for the (default) color channel"},"type":{"$ref":"#/definitions/Type","description":"The attribute type. One of `\\"nominal\\"`, `\\"ordinal\\"`, or `\\"quantitative\\"`."},"visible":{"description":"Whether the attribute is visible by default.","type":"boolean"},"width":{"description":"Width of the column in pixels.","type":"number"}},"required":["type"],"type":"object"},"SampleDef":{"additionalProperties":false,"properties":{"attributeLabelAngle":{"description":"Angle to be added to the default label angle (-90).\\n\\n**Default value:** `0`","type":"number"},"attributeLabelFont":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"attributeLabelFontSize":{"description":"The font size in pixels.\\n\\n**Default value:** `11`","type":"number"},"attributeLabelFontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"attributeLabelFontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"attributeSize":{"description":"Default size (width) of the metadata attribute columns. Can be configured per attribute using the `attributes` property.\\n\\n**Default value:** `10`","type":"number"},"attributeSpacing":{"description":"Spacing between attribute columns in pixels.\\n\\n**Default value:** `1`","type":"number"},"attributes":{"additionalProperties":{"$ref":"#/definitions/SampleAttributeDef"},"description":"Explicitly specify the sample attributes.","type":"object"},"data":{"$ref":"#/definitions/Data","description":"Optional metadata about the samples."},"labelAlign":{"$ref":"#/definitions/Align","description":"The horizontal alignment of the text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`.\\n\\n**Default value:** `\\"left\\"`"},"labelFont":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"labelFontSize":{"description":"The font size in pixels.\\n\\n**Default value:** `11`","type":"number"},"labelFontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"labelFontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"labelLength":{"description":"How much space in pixels to reserve for the labels.\\n\\n**Default:** `140`","type":"number"},"labelTitleText":{"description":"Text in the label title\\n\\n**Default:** `\\"Sample name\\"`","type":"string"}},"type":"object"},"SampleParams":{"additionalProperties":false,"properties":{"size":{"description":"The maximum sample size.\\n\\n**Default:** `500`","type":"number"},"type":{"const":"sample","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"SampleSpec":{"additionalProperties":false,"description":"A view specification for a SampleView. This is only functional in the GenomeSpy app.","properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"samples":{"$ref":"#/definitions/SampleDef","description":"Sample metadata definition. If the object is empty, the sample identifiers will be inferred from the data."},"spec":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"}],"description":"The view specification to be repeated for each sample."},"stickySummaries":{"type":"boolean"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"An object defining the view background and outline. The background is repeated for each group."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["samples","spec"],"type":"object"},"Scalar":{"type":["string","number","boolean"]},"ScalarDomain":{"anyOf":[{"$ref":"#/definitions/NumericDomain"},{"items":{"type":"string"},"type":"array"},{"items":{"type":"boolean"},"type":"array"}]},"Scale":{"additionalProperties":false,"properties":{"align":{"description":"The alignment of the steps within the scale range.\\n\\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\\n\\n__Default value:__ `0.5`","type":"number"},"base":{"description":"The logarithm base of the `log` scale (default `10`).","type":"number"},"bins":{"description":"An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.","items":{"type":"number"},"type":"array"},"clamp":{"description":"If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)\'s `clamp` (`true` by default).","type":"boolean"},"constant":{"description":"A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\\n\\n__Default value:__ `1`","type":"number"},"domain":{"anyOf":[{"$ref":"#/definitions/ScalarDomain"},{"$ref":"#/definitions/ComplexDomain"}],"description":"Customized domain values.\\n\\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\\n\\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\\n\\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."},"domainMax":{"description":"Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.","type":"number"},"domainMid":{"description":"Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.","type":"number"},"domainMin":{"description":"Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.","type":"number"},"exponent":{"description":"The exponent of the `pow` scale.","type":"number"},"interpolate":{"anyOf":[{"$ref":"#/definitions/ScaleInterpolate"},{"$ref":"#/definitions/ScaleInterpolateParams"}],"description":"The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` (\'-long\' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\\n\\n__Default value:__ `hcl`"},"name":{"description":"The name of the scale. Names are optional but allow the scales to be referenced and found with the API.","type":"string"},"nice":{"anyOf":[{"type":"boolean"},{"type":"number"},{"additionalProperties":false,"properties":{"interval":{"type":"string"},"step":{"type":"number"}},"required":["interval","step"],"type":"object"}],"description":"Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\\n\\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\\n\\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."},"padding":{"description":"For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\\n\\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\\n\\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\\n\\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`. By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.","minimum":0,"type":"number"},"paddingInner":{"description":"The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\\n\\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `bandPaddingInner`.","maximum":1,"minimum":0,"type":"number"},"paddingOuter":{"description":"The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.","maximum":1,"minimum":0,"type":"number"},"range":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"items":{"type":"string"},"type":"array"},{"type":"string"},{"items":{"$ref":"#/definitions/ExprRef"},"type":"array"}],"description":"The range of the scale. One of:\\n\\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\\"symbol\\"`, or `\\"diverging\\"`).\\n\\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\\n\\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\\n\\n__Notes:__\\n\\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\\n\\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view\'s corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."},"reverse":{"description":"If true, reverses the order of the scale range.\\n\\n__Default value:__ `false`.","type":"boolean"},"round":{"description":"If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\\n\\n__Default value:__ `false`.","type":"boolean"},"scheme":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/SchemeParams"}],"description":"A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\\"category10\\"` or `\\"blues\\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\\n\\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\\n\\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."},"type":{"$ref":"#/definitions/ScaleType","description":"The type of scale. Vega-Lite supports the following categories of scale types:\\n\\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\\"linear\\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\\"pow\\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\\"sqrt\\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\\"symlog\\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\\"log\\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\\"time\\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\\"utc\\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\\n\\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\\"ordinal\\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\\"band\\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\\"point\\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\\n\\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\\"bin-ordinal\\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\\"quantile\\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\\"quantize\\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\\"threshold\\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\\n\\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."},"zero":{"description":"If `true`, ensures that a zero baseline value is included in the scale domain.\\n\\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\\n\\n__Note:__ Log, time, and utc scales do not support `zero`.","type":"boolean"},"zoom":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ZoomParams"}],"description":"If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."}},"type":"object"},"ScaleInterpolate":{"enum":["rgb","lab","hcl","hsl","hsl-long","hcl-long","cubehelix","cubehelix-long"],"type":"string"},"ScaleInterpolateParams":{"additionalProperties":false,"properties":{"gamma":{"type":"number"},"type":{"enum":["rgb","cubehelix","cubehelix-long"],"type":"string"}},"required":["type"],"type":"object"},"ScaleType":{"enum":["null","linear","log","pow","sqrt","symlog","identity","sequential","quantize","threshold","ordinal","point","band","index","locus"],"type":"string"},"SchemeParams":{"additionalProperties":false,"properties":{"count":{"description":"The number of colors to use in the scheme. This can be useful for scale types such as `\\"quantize\\"`, which use the length of the scale range to determine the number of discrete bins for the scale domain.","type":"number"},"extent":{"description":"The extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.","items":{"type":"number"},"type":"array"},"name":{"description":"A color scheme name for ordinal scales (e.g., `\\"category10\\"` or `\\"blues\\"`).\\n\\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.","type":"string"}},"required":["name"],"type":"object"},"SecondaryChromPosDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"required":["chrom"],"type":"object"},"SecondaryPositionalChannel":{"enum":["x2","y2"],"type":"string"},"SelectionFilterParams":{"additionalProperties":false,"properties":{"empty":{"description":"If true, the filter retains all data objects when the selection is empty.\\n\\n**Default:** `true`","type":"boolean"},"param":{"description":"A selection parameter. The data object is removed if it is not part of the selection.","type":"string"},"type":{"const":"filter","description":"The type of the transform to be applied","type":"string"}},"required":["param","type"],"type":"object"},"SelectionParameter":{"additionalProperties":false,"properties":{"name":{"description":"A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \\"$\\", or \\"_\\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \\"datum\\".","type":"string"},"push":{"const":"outer","type":"string"},"select":{"anyOf":[{"$ref":"#/definitions/SelectionType"},{"$ref":"#/definitions/PointSelectionConfig"},{"$ref":"#/definitions/IntervalSelectionConfig"}],"description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`."}},"required":["name","select"],"type":"object"},"SelectionType":{"enum":["point","interval"],"type":"string"},"SequenceGenerator":{"additionalProperties":false,"properties":{"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"sequence":{"$ref":"#/definitions/SequenceParams","description":"Generate a sequence of numbers."}},"required":["sequence"],"type":"object"},"SequenceParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"$ref":"#/definitions/FieldName"},{"$ref":"#/definitions/ExprRef"}],"description":"The name of the generated sequence field.\\n\\n__Default value:__ `\\"data\\"`"},"start":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The starting value of the sequence (inclusive)."},"step":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The step value between sequence entries.\\n\\n__Default value:__ `1`"},"stop":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The ending value of the sequence (exclusive)."}},"required":["start","stop"],"type":"object"},"ShapeDef":{"$ref":"#/definitions/MarkPropDef%3C(string%7Cnull)%2CTypeForShape%3E"},"SizeDef":{"additionalProperties":false,"properties":{"grow":{"description":"Share of the remaining space. See [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.","type":"number"},"px":{"description":"Size in pixels","type":"number"}},"type":"object"},"SortOrder":{"enum":["ascending","descending"],"type":"string"},"StackParams":{"additionalProperties":false,"properties":{"as":{"description":"Fields to write the stacked values.\\n\\n**Default:** `[\\"y0\\", \\"y1\\"]`","items":{"type":"string"},"type":"array"},"baseField":{"$ref":"#/definitions/Field","description":"The field that contains the base or amino acid. Used for information content calculation when the offset is `\\"information\\"`. The data objects that have `null` in the baseField are considered gaps and they are taken into account when scaling the the locus\' information content."},"cardinality":{"description":"Cardinality, e.g., the number if distinct bases or amino acids. Used for information content calculation when the offset is `\\"information\\"`.\\n\\n**Default:** `4`","type":"number"},"field":{"$ref":"#/definitions/Field","description":"The field to stack. If no field is defined, a constant value of one is assumed."},"groupby":{"description":"The fields to be used for forming groups for different stacks.","items":{"$ref":"#/definitions/Field"},"type":"array"},"offset":{"description":"How to offset the values in a stack. `\\"zero\\"` (default) starts stacking at 0. `\\"center\\"` centers the values around zero. `\\"normalize\\"` computes intra-stack percentages and normalizes the values to the range of `[0, 1]`. `\\"information\\"` computes a layout for a sequence logo. The total height of the stack reflects the group\'s information content.","enum":["zero","center","normalize","information"],"type":"string"},"sort":{"$ref":"#/definitions/CompareParams","description":"The sort order of data in each stack."},"type":{"const":"stack","description":"The type of the transform to be applied","type":"string"}},"required":["as","groupby","type"],"type":"object"},"Step":{"additionalProperties":false,"properties":{"step":{"type":"number"}},"required":["step"],"type":"object"},"StringDatumDef":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"format":{"description":"When used with the default `\\"number\\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\\n\\n- If the format type is `\\"number\\"` (e.g., for quantitative fields), this is D3\'s [number format pattern](https://github.com/d3/d3-format#locale_format).\\n\\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"StringFieldDef":{"additionalProperties":false,"properties":{"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"format":{"description":"When used with the default `\\"number\\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\\n\\n- If the format type is `\\"number\\"` (e.g., for quantitative fields), this is D3\'s [number format pattern](https://github.com/d3/d3-format#locale_format).\\n\\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},"TemplateImport":{"additionalProperties":false,"properties":{"template":{"description":"Imports a specification from the current view hierarchy, searching first in the current view, then ascending through ancestors.","type":"string"}},"required":["template"],"type":"object"},"TextDef":{"anyOf":[{"$ref":"#/definitions/StringFieldDef"},{"$ref":"#/definitions/StringDatumDef"},{"$ref":"#/definitions/ExprDef"}]},"TextProps":{"additionalProperties":false,"properties":{"align":{"$ref":"#/definitions/Align","description":"The horizontal alignment of the text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`.\\n\\n**Default value:** `\\"left\\"`"},"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The rotation angle in degrees.\\n\\n**Default value:** `0`"},"baseline":{"$ref":"#/definitions/Baseline","description":"The vertical alignment of the text. One of `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`.\\n\\n**Default value:** `\\"bottom\\"`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"dx":{"description":"The horizontal offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.","type":"number"},"dy":{"description":"The vertical offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.","type":"number"},"fitToBand":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, sets the secondary positional channel that allows the text to be squeezed (see the `squeeze` property). Can be used when: 1) `\\"band\\"`, `\\"index\\"`, or `\\"locus\\"` scale is being used and 2) only the primary positional channel is specified.\\n\\n**Default value:** `false`"},"flushX":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, the text is kept inside the viewport when the range of `x` and `x2` intersect the viewport."},"flushY":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, the text is kept inside the viewport when the range of `y` and `y2` intersect the viewport."},"font":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"fontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"fontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"logoLetters":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Stretch letters so that they can be used with [sequence logos](https://en.wikipedia.org/wiki/Sequence_logo), etc..."},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"paddingX":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The horizontal padding, in pixels, when the `x2` channel is used for ranged text.\\n\\n**Default value:** `0`"},"paddingY":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The vertical padding, in pixels, when the `y2` channel is used for ranged text.\\n\\n**Default value:** `0`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The font size in pixels.\\n\\n**Default value:** `11`"},"squeeze":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If the `squeeze` property is true and secondary positional channels (`x2` and/or `y2`) are used, the text is scaled to fit mark\'s width and/or height.\\n\\n**Default value:** `true`"},"text":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"The text to display. The format of numeric data can be customized by setting a [format specifier](https://github.com/d3/d3-format#locale_format) to channel definition\'s `format` property.\\n\\n**Default value:** `\\"\\"`"},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"text","type":"string"},"viewportEdgeFadeDistanceBottom":{"type":"number"},"viewportEdgeFadeDistanceLeft":{"type":"number"},"viewportEdgeFadeDistanceRight":{"type":"number"},"viewportEdgeFadeDistanceTop":{"type":"number"},"viewportEdgeFadeWidthBottom":{"type":"number"},"viewportEdgeFadeWidthLeft":{"type":"number"},"viewportEdgeFadeWidthRight":{"type":"number"},"viewportEdgeFadeWidthTop":{"type":"number"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"Title":{"additionalProperties":false,"properties":{"align":{"$ref":"#/definitions/Align","description":"Horizontal text alignment for title text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`."},"anchor":{"$ref":"#/definitions/TitleAnchor","description":"The anchor position for placing the title and subtitle text. One of `\\"start\\"`, `\\"middle\\"`, or `\\"end\\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."},"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Angle in degrees of title and subtitle text."},"baseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline for title and subtitle text. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, or `\\"bottom\\"`."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Text color for title text."},"dx":{"description":"Delta offset for title and subtitle text x-coordinate.","type":"number"},"dy":{"description":"Delta offset for title and subtitle text y-coordinate.","type":"number"},"font":{"description":"Font name for title text.","type":"string"},"fontSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Font size in pixels for title text.","minimum":0},"fontStyle":{"$ref":"#/definitions/FontStyle","description":"Font style for title text."},"fontWeight":{"$ref":"#/definitions/FontWeight","description":"Font weight for title text. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`)."},"frame":{"$ref":"#/definitions/TitleFrame","description":"The reference frame for the anchor position, one of `\\"bounds\\"` (to anchor relative to the full bounding box) or `\\"group\\"` (to anchor relative to the group width or height)."},"offset":{"description":"The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/TitleOrient","description":"Default title orientation (`\\"none\\"`, `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"`, or `\\"right\\"`)"},"style":{"description":"A mark style property to apply to the title text mark. If not specified, a default style of `\\"group-title\\"` is applied.","type":"string"},"text":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The title text."}},"required":["text"],"type":"object"},"TitleAnchor":{"enum":[null,"start","middle","end"],"type":["null","string"]},"TitleFrame":{"enum":["bounds","group"],"type":"string"},"TitleOrient":{"enum":["none","left","right","top","bottom"],"type":"string"},"Tooltip":{"anyOf":[{"$ref":"#/definitions/HandledTooltip"},{"type":"null"}]},"TransformParams":{"anyOf":[{"$ref":"#/definitions/AggregateParams"},{"$ref":"#/definitions/CollectParams"},{"$ref":"#/definitions/CoverageParams"},{"$ref":"#/definitions/FlattenDelimitedParams"},{"$ref":"#/definitions/FormulaParams"},{"$ref":"#/definitions/FilterParams"},{"$ref":"#/definitions/FilterScoredLabelsParams"},{"$ref":"#/definitions/FlattenParams"},{"$ref":"#/definitions/FlattenCompressedExonsParams"},{"$ref":"#/definitions/FlattenSequenceParams"},{"$ref":"#/definitions/IdentifierParams"},{"$ref":"#/definitions/LinearizeGenomicCoordinateParams"},{"$ref":"#/definitions/MeasureTextParams"},{"$ref":"#/definitions/MergeFacetsParams"},{"$ref":"#/definitions/PileupParams"},{"$ref":"#/definitions/ProjectParams"},{"$ref":"#/definitions/RegexExtractParams"},{"$ref":"#/definitions/RegexFoldParams"},{"$ref":"#/definitions/SampleParams"},{"$ref":"#/definitions/StackParams"}]},"Type":{"enum":["quantitative","ordinal","nominal","index","locus"],"type":"string"},"TypeForShape":{"enum":["ordinal","nominal"],"type":"string"},"UnitSpec":{"additionalProperties":false,"properties":{"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"mark":{"anyOf":[{"$ref":"#/definitions/MarkType"},{"$ref":"#/definitions/MarkProps"}],"description":"The graphical mark presenting the data objects."},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"The background of the view, including fill, stroke, and stroke width."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["mark"],"type":"object"},"UrlData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"url":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"$ref":"#/definitions/ExprRef"}],"description":"An URL or an array of URLs from which to load the data set. Use the `format.type` property to ensure the loaded data is correctly parsed."}},"required":["url"],"type":"object"},"UrlGenomeConfig":{"additionalProperties":false,"properties":{"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"},"url":{"description":"A URL to a `chrom.sizes` file, which is a tab-separated file with two columns: the sequence name and its size.\\n\\nYou may want to strip alternative loci, haplotypes, and other non-canonical contigs from the file.\\n\\nExample: `\\"https://genomespy.app/data/genomes/hg19/chrom.sizes\\"`","type":"string"}},"required":["name","url"],"type":"object"},"UrlImport":{"additionalProperties":false,"properties":{"url":{"description":"Imports a specification from the specified URL.","type":"string"}},"required":["url"],"type":"object"},"VConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"vconcat":{"description":"Specifies views that will be concatenated vertically.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["vconcat"],"type":"object"},"ValueDef":{"additionalProperties":false,"properties":{"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["value"],"type":"object"},"ValueDefWithCondition<(string|null)>":{"additionalProperties":false,"minProperties":1,"properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CFieldDef%3E"},{"$ref":"#/definitions/Conditional%3CDatumDef%3E"},{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"A field definition or one or more value definition(s) with a parameter predicate."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"string"},{"type":"null"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"type":"object"},"ValueDefWithCondition":{"additionalProperties":false,"minProperties":1,"properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CFieldDef%3E"},{"$ref":"#/definitions/Conditional%3CDatumDef%3E"},{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"A field definition or one or more value definition(s) with a parameter predicate."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"type":"object"},"VariableParameter":{"additionalProperties":false,"properties":{"bind":{"$ref":"#/definitions/Binding","description":"Binds the parameter to an external input element such as a slider, selection list or radio button group."},"expr":{"description":"An expression for the value of the parameter. This expression may include other parameters, in which case the parameter will automatically update in response to upstream parameter changes.","type":"string"},"name":{"description":"A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \\"$\\", or \\"_\\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \\"datum\\".","type":"string"},"push":{"const":"outer","type":"string"},"value":{"description":"The [initial value](http://vega.github.io/vega-lite/docs/value.html) of the parameter.\\n\\n__Default value:__ `undefined`"}},"required":["name"],"type":"object"},"VcfData":{"additionalProperties":false,"properties":{"addChrPrefix":{"description":"Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\\n\\n__Default value:__ `false`","type":["boolean","string"]},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"Url of the tabix index file.\\n\\n__Default value:__ `url` + `\\".tbi\\"`.","type":"string"},"type":{"const":"vcf","type":"string"},"url":{"description":"Url of the bgzip compressed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `30000000`","type":"number"}},"required":["type","url"],"type":"object"},"ViewBackground":{"additionalProperties":false,"properties":{"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"description":"The stroke width in pixels.","type":"number"}},"type":"object"},"ViewOpacityDef":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/DynamicOpacity"},{"$ref":"#/definitions/ExprRef"}]},"ViewSpec":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/VConcatSpec"},{"$ref":"#/definitions/HConcatSpec"},{"$ref":"#/definitions/ConcatSpec"},{"$ref":"#/definitions/SampleSpec"}]},"ZoomParams":{"additionalProperties":false,"properties":{"extent":{"anyOf":[{"$ref":"#/definitions/ScalarDomain"},{"$ref":"#/definitions/ComplexDomain"}],"description":"The boundaries that limit the zoom and pan interactions."}},"type":"object"}}'),lB={$ref:MNe,$schema:PNe,definitions:ONe},FNe="@genome-spy/playground",BNe="0.58.0",WNe="A playground for testing GenomeSpy visualizations",VNe="module",zNe={dev:"vite",build:"vite build",serve:"vite preview"},HNe="Kari Lavikka",$Ne="MIT",UNe={"@fortawesome/fontawesome-free":"^6.1.1","@fortawesome/fontawesome-svg-core":"^6.1.1","@fortawesome/free-solid-svg-icons":"^6.1.1","@genome-spy/core":"^0.58.0",lit:"^3.1.2","monaco-editor":"^0.44.0",prettier:"^3.4.1","vega-loader":"^4.4.0"},cB={name:FNe,private:!0,version:BNe,description:WNe,type:VNe,scripts:zNe,author:HNe,license:$Ne,dependencies:UNe};var Ym,jK,qK;class CR extends zh{constructor(){super();Me(this,Ym);this.orientation="horizontal",this.reverse=!1}render(){return St`
${xe(this,Ym,jK).call(this)}
`}}Ym=new WeakSet,jK=function(){const t=Array.from(this.children);return Array.from(this.reverse?t.reverse():t).map((i,s)=>St` + hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof a.open=="string"&&typeof a.token=="string"&&typeof a.close=="string")o.push({token:a.token+t.tokenPostfix,open:Nd(t,a.open),close:Nd(t,a.close)});else throw Vt(t,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return t.brackets=o,t.noThrow=!0,t}var kTe=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})};function ETe(n){xm.registerLanguage(n)}function ATe(){let n=[];return n=n.concat(xm.getLanguages()),n}function ITe(n){return Ae.get(Ni).languageIdCodec.encodeLanguageId(n)}function TTe(n,e){return Ae.withServices(()=>{const i=Ae.get(Ni).onDidRequestRichLanguageFeatures(s=>{s===n&&(i.dispose(),e())});return i})}function NTe(n,e){return Ae.withServices(()=>{const i=Ae.get(Ni).onDidRequestBasicLanguageFeatures(s=>{s===n&&(i.dispose(),e())});return i})}function RTe(n,e){if(!Ae.get(Ni).isRegisteredLanguageId(n))throw new Error(`Cannot set configuration for unknown language ${n}`);return Ae.get(so).register(n,e,100)}class MTe{constructor(e,t){this._languageId=e,this._actual=t}dispose(){}getInitialState(){return this._actual.getInitialState()}tokenize(e,t,i){if(typeof this._actual.tokenize=="function")return Fv.adaptTokenize(this._languageId,this._actual,e,i);throw new Error("Not supported!")}tokenizeEncoded(e,t,i){const s=this._actual.tokenizeEncoded(e,i);return new B2(s.tokens,s.endState)}}class Fv{constructor(e,t,i,s){this._languageId=e,this._actual=t,this._languageService=i,this._standaloneThemeService=s}dispose(){}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(e,t){const i=[];let s=0;for(let o=0,r=e.length;o0&&o[r-1]===h)continue;let f=u.startIndex;c===0?f=0:fkTe(this,void 0,void 0,function*(){const i=yield Promise.resolve(e.create());return i?PTe(i)?VK(n,i):new nv(Ae.get(Ni),Ae.get(Nr),n,BK(n,i),Ae.get(ii)):null}));return Si.registerFactory(n,t)}function BTe(n,e){if(!Ae.get(Ni).isRegisteredLanguageId(n))throw new Error(`Cannot set tokens provider for unknown language ${n}`);return WK(e)?P5(n,{create:()=>e}):Si.register(n,VK(n,e))}function WTe(n,e){const t=i=>new nv(Ae.get(Ni),Ae.get(Nr),n,BK(n,i),Ae.get(ii));return WK(e)?P5(n,{create:()=>e}):Si.register(n,t(e))}function VTe(n,e){return Ae.get(it).referenceProvider.register(n,e)}function zTe(n,e){return Ae.get(it).renameProvider.register(n,e)}function HTe(n,e){return Ae.get(it).signatureHelpProvider.register(n,e)}function $Te(n,e){return Ae.get(it).hoverProvider.register(n,{provideHover:(i,s,o)=>{const r=i.getWordAtPosition(s);return Promise.resolve(e.provideHover(i,s,o)).then(a=>{if(a)return!a.range&&r&&(a.range=new N(s.lineNumber,r.startColumn,s.lineNumber,r.endColumn)),a.range||(a.range=new N(s.lineNumber,s.column,s.lineNumber,s.column)),a})}})}function UTe(n,e){return Ae.get(it).documentSymbolProvider.register(n,e)}function jTe(n,e){return Ae.get(it).documentHighlightProvider.register(n,e)}function qTe(n,e){return Ae.get(it).linkedEditingRangeProvider.register(n,e)}function GTe(n,e){return Ae.get(it).definitionProvider.register(n,e)}function KTe(n,e){return Ae.get(it).implementationProvider.register(n,e)}function YTe(n,e){return Ae.get(it).typeDefinitionProvider.register(n,e)}function ZTe(n,e){return Ae.get(it).codeLensProvider.register(n,e)}function XTe(n,e,t){return Ae.get(it).codeActionProvider.register(n,{providedCodeActionKinds:t==null?void 0:t.providedCodeActionKinds,documentation:t==null?void 0:t.documentation,provideCodeActions:(s,o,r,a)=>{const c=Ae.get(ml).read({resource:s.uri}).filter(d=>N.areIntersectingOrTouching(d,o));return e.provideCodeActions(s,o,{markers:c,only:r.only,trigger:r.trigger},a)},resolveCodeAction:e.resolveCodeAction})}function QTe(n,e){return Ae.get(it).documentFormattingEditProvider.register(n,e)}function JTe(n,e){return Ae.get(it).documentRangeFormattingEditProvider.register(n,e)}function eNe(n,e){return Ae.get(it).onTypeFormattingEditProvider.register(n,e)}function tNe(n,e){return Ae.get(it).linkProvider.register(n,e)}function iNe(n,e){return Ae.get(it).completionProvider.register(n,e)}function nNe(n,e){return Ae.get(it).colorProvider.register(n,e)}function sNe(n,e){return Ae.get(it).foldingRangeProvider.register(n,e)}function oNe(n,e){return Ae.get(it).declarationProvider.register(n,e)}function rNe(n,e){return Ae.get(it).selectionRangeProvider.register(n,e)}function aNe(n,e){return Ae.get(it).documentSemanticTokensProvider.register(n,e)}function lNe(n,e){return Ae.get(it).documentRangeSemanticTokensProvider.register(n,e)}function cNe(n,e){return Ae.get(it).inlineCompletionsProvider.register(n,e)}function dNe(n,e){return Ae.get(it).inlayHintsProvider.register(n,e)}function uNe(){return{register:ETe,getLanguages:ATe,onLanguage:TTe,onLanguageEncountered:NTe,getEncodedLanguageId:ITe,setLanguageConfiguration:RTe,setColorMap:FTe,registerTokensProviderFactory:P5,setTokensProvider:BTe,setMonarchTokensProvider:WTe,registerReferenceProvider:VTe,registerRenameProvider:zTe,registerCompletionItemProvider:iNe,registerSignatureHelpProvider:HTe,registerHoverProvider:$Te,registerDocumentSymbolProvider:UTe,registerDocumentHighlightProvider:jTe,registerLinkedEditingRangeProvider:qTe,registerDefinitionProvider:GTe,registerImplementationProvider:KTe,registerTypeDefinitionProvider:YTe,registerCodeLensProvider:ZTe,registerCodeActionProvider:XTe,registerDocumentFormattingEditProvider:QTe,registerDocumentRangeFormattingEditProvider:JTe,registerOnTypeFormattingEditProvider:eNe,registerLinkProvider:tNe,registerColorProvider:nNe,registerFoldingRangeProvider:sNe,registerDeclarationProvider:oNe,registerSelectionRangeProvider:rNe,registerDocumentSemanticTokensProvider:aNe,registerDocumentRangeSemanticTokensProvider:lNe,registerInlineCompletionsProvider:cNe,registerInlayHintsProvider:dNe,DocumentHighlightKind:CI,CompletionItemKind:mI,CompletionItemTag:_I,CompletionItemInsertTextRule:pI,SymbolKind:qI,SymbolTag:GI,IndentAction:EI,CompletionTriggerKind:bI,SignatureHelpTriggerKind:jI,InlayHintKind:II,InlineCompletionTriggerKind:TI,CodeActionTriggerType:gI,FoldingRangeKind:as,SelectedSuggestionInfo:epe}}const O5=rt("IEditorCancelService"),zK=new _e("cancellableOperation",!1,m("cancellableOperation","Whether the editor runs a cancellable operation, e.g. like 'Peek References'"));ft(O5,class{constructor(){this._tokens=new WeakMap}add(n,e){let t=this._tokens.get(n);t||(t=n.invokeWithinContext(s=>{const o=zK.bindTo(s.get(et)),r=new Ds;return{key:o,tokens:r}}),this._tokens.set(n,t));let i;return t.key.set(!0),i=t.tokens.push(e),()=>{i&&(i(),t.key.set(!t.tokens.isEmpty()),i=void 0)}}cancel(n){const e=this._tokens.get(n);if(!e)return;const t=e.tokens.pop();t&&(t.cancel(),e.key.set(!e.tokens.isEmpty()))}},1);class hNe extends Ar{constructor(e,t){super(t),this.editor=e,this._unregister=e.invokeWithinContext(i=>i.get(O5).add(e,this))}dispose(){this._unregister(),super.dispose()}}Ee(new class extends kr{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:zK})}runEditorCommand(n,e){n.get(O5).cancel(e)}});let fNe=class wR{constructor(e,t){if(this.flags=t,this.flags&1){const i=e.getModel();this.modelVersionId=i?zb("{0}#{1}",i.uri.toString(),i.getVersionId()):null}else this.modelVersionId=null;this.flags&4?this.position=e.getPosition():this.position=null,this.flags&2?this.selection=e.getSelection():this.selection=null,this.flags&8?(this.scrollLeft=e.getScrollLeft(),this.scrollTop=e.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(e){if(!(e instanceof wR))return!1;const t=e;return!(this.modelVersionId!==t.modelVersionId||this.scrollLeft!==t.scrollLeft||this.scrollTop!==t.scrollTop||!this.position&&t.position||this.position&&!t.position||this.position&&t.position&&!this.position.equals(t.position)||!this.selection&&t.selection||this.selection&&!t.selection||this.selection&&t.selection&&!this.selection.equalsRange(t.selection))}validate(e){return this._equals(new wR(e,this.flags))}};class gNe extends hNe{constructor(e,t,i,s){super(e,s),this._listener=new pe,t&4&&this._listener.add(e.onDidChangeCursorPosition(o=>{(!i||!N.containsPosition(i,o.position))&&this.cancel()})),t&2&&this._listener.add(e.onDidChangeCursorSelection(o=>{(!i||!N.containsRange(i,o.selection))&&this.cancel()})),t&8&&this._listener.add(e.onDidScrollChange(o=>this.cancel())),t&1&&(this._listener.add(e.onDidChangeModel(o=>this.cancel())),this._listener.add(e.onDidChangeModelContent(o=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}class pNe extends Ar{constructor(e,t){super(t),this._listener=e.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}function HK(n){return n&&typeof n.getEditorType=="function"?n.getEditorType()===aL.ICodeEditor:!1}class aB{constructor(e){this.value=e,this._lower=e.toLowerCase()}static toKey(e){return typeof e=="string"?e.toLowerCase():e._lower}}class mNe{constructor(e){if(this._set=new Set,e)for(const t of e)this.add(t)}add(e){this._set.add(aB.toKey(e))}has(e){return this._set.has(aB.toKey(e))}}var g0=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})};function _Ne(n,e,t){const i=[],s=new mNe,o=n.ordered(t);for(const a of o)i.push(a),a.extensionId&&s.add(a.extensionId);const r=e.ordered(t);for(const a of r){if(a.extensionId){if(s.has(a.extensionId))continue;s.add(a.extensionId)}i.push({displayName:a.displayName,extensionId:a.extensionId,provideDocumentFormattingEdits(l,c,d){return a.provideDocumentRangeFormattingEdits(l,l.getFullModelRange(),c,d)}})}return i}class Bv{static setFormatterSelector(e){return{dispose:Bv._selectors.unshift(e)}}static select(e,t,i){return g0(this,void 0,void 0,function*(){if(e.length===0)return;const s=ut.first(Bv._selectors);if(s)return yield s(e,t,i)})}}Bv._selectors=new Ds;function bNe(n,e,t,i,s,o){return g0(this,void 0,void 0,function*(){const r=e.documentRangeFormattingEditProvider.ordered(t);for(const a of r){const l=yield Promise.resolve(a.provideDocumentRangeFormattingEdits(t,i,s,o)).catch(wc);if(oc(l))return yield n.computeMoreMinimalEdits(t.uri,l)}})}function vNe(n,e,t,i,s){return g0(this,void 0,void 0,function*(){const o=_Ne(e.documentFormattingEditProvider,e.documentRangeFormattingEditProvider,t);for(const r of o){const a=yield Promise.resolve(r.provideDocumentFormattingEdits(t,i,s)).catch(wc);if(oc(a))return yield n.computeMoreMinimalEdits(t.uri,a)}})}function yNe(n,e,t,i,s,o,r){const a=e.onTypeFormattingEditProvider.ordered(t);return a.length===0||a[0].autoFormatTriggerCharacters.indexOf(s)<0?Promise.resolve(void 0):Promise.resolve(a[0].provideOnTypeFormattingEdits(t,i,s,o,r)).catch(wc).then(l=>n.computeMoreMinimalEdits(t.uri,l))}Yt.registerCommand("_executeFormatRangeProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i,s]=e;xs(Ue.isUri(t)),xs(N.isIRange(i));const o=n.get(Lu),r=n.get(cy),a=n.get(it),l=yield o.createModelReference(t);try{return bNe(r,a,l.object.textEditorModel,N.lift(i),s,rn.None)}finally{l.dispose()}})});Yt.registerCommand("_executeFormatDocumentProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i]=e;xs(Ue.isUri(t));const s=n.get(Lu),o=n.get(cy),r=n.get(it),a=yield s.createModelReference(t);try{return vNe(o,r,a.object.textEditorModel,i,rn.None)}finally{a.dispose()}})});Yt.registerCommand("_executeFormatOnTypeProvider",function(n,...e){return g0(this,void 0,void 0,function*(){const[t,i,s,o]=e;xs(Ue.isUri(t)),xs(V.isIPosition(i)),xs(typeof s=="string");const r=n.get(Lu),a=n.get(cy),l=n.get(it),c=yield r.createModelReference(t);try{return yNe(a,l,c.object.textEditorModel,V.lift(i),s,o,rn.None)}finally{c.dispose()}})});Vf.wrappingIndent.defaultValue=0;Vf.glyphMargin.defaultValue=!1;Vf.autoIndent.defaultValue=3;Vf.overviewRulerLanes.defaultValue=2;Bv.setFormatterSelector((n,e,t)=>Promise.resolve(n[0]));const ps=AU();ps.editor=wTe();ps.languages=uNe();const wNe=ps.CancellationTokenSource,CNe=ps.Emitter,SNe=ps.KeyCode,xNe=ps.KeyMod,LNe=ps.Position,DNe=ps.Range,kNe=ps.Selection,ENe=ps.SelectionDirection,ANe=ps.MarkerSeverity,INe=ps.MarkerTag,TNe=ps.Uri,NNe=ps.Token,$K=ps.editor,UK=ps.languages,pE=globalThis.MonacoEnvironment;(pE!=null&&pE.globalAPI||typeof define=="function"&&define.amd)&&(globalThis.monaco=ps);typeof globalThis.require<"u"&&typeof globalThis.require.config=="function"&&globalThis.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]});const RNe=Object.freeze(Object.defineProperty({__proto__:null,CancellationTokenSource:wNe,Emitter:CNe,KeyCode:SNe,KeyMod:xNe,MarkerSeverity:ANe,MarkerTag:INe,Position:LNe,Range:DNe,Selection:kNe,SelectionDirection:ENe,Token:NNe,Uri:TNe,editor:$K,languages:UK},Symbol.toStringTag,{value:"Module"})),MNe="#/definitions/RootSpec",PNe="http://json-schema.org/draft-07/schema#",ONe=JSON.parse('{"AggregateOp":{"enum":["count","valid","sum","min","max","mean","median","variance"],"type":"string"},"AggregateParams":{"additionalProperties":false,"properties":{"as":{"description":"The names for the output fields corresponding to each aggregated field. If not provided, names will be automatically created using the operation and field names (e.g., `sum_field`, `average_field`).","items":{"type":"string"},"type":"array"},"fields":{"description":"The data fields to apply aggregate functions to. This array should correspond with the `ops` and `as` arrays. If no fields or operations are specified, a count aggregation will be applied by default.","items":{"$ref":"#/definitions/Field"},"type":"array"},"groupby":{"description":"The fields by which to group the data. If these are not defined, all data objects will be grouped into a single category.","items":{"$ref":"#/definitions/Field"},"type":"array"},"ops":{"description":"The aggregation operations to be performed on the fields, such as `\\"sum\\"`, `\\"average\\"`, or `\\"count\\"`.","items":{"$ref":"#/definitions/AggregateOp"},"type":"array"},"type":{"const":"aggregate","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"Align":{"enum":["left","center","right"],"type":"string"},"Axis":{"additionalProperties":false,"properties":{"domain":{"description":"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`","type":"boolean"},"domainCap":{"description":"The stroke cap for the domain line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"domainColor":{"description":"Color of axis domain line.\\n\\n__Default value:__ `\\"gray\\"`.","type":"string"},"domainDash":{"description":"An array of alternating [stroke, space] lengths for dashed domain lines.","items":{"type":"number"},"type":"array"},"domainDashOffset":{"description":"The pixel offset at which to start drawing with the domain dash array.","type":"number"},"domainWidth":{"description":"Stroke width of axis domain line\\n\\n__Default value:__ `1`","type":"number"},"format":{"description":"The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.","type":"string"},"grid":{"description":"A boolean flag indicating if grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"gridCap":{"description":"The stroke cap for the grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"gridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"gridDash":{"description":"An array of alternating [stroke, space] lengths for dashed grid mark lines.","items":{"type":"number"},"type":"array"},"gridDashOffset":{"description":"The pixel offset at which to start drawing with the grid mark dash array.","type":"number"},"gridOpacity":{"description":"The opacity of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"gridWidth":{"description":"Width of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"labelAlign":{"$ref":"#/definitions/Align","description":"Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."},"labelAngle":{"description":"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.","maximum":360,"minimum":-360,"type":"number"},"labelBaseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`."},"labelColor":{"description":"The color of the tick label, can be in hex color code or regular color name.","type":"string"},"labelFont":{"description":"The font of the tick label.","type":"string"},"labelFontSize":{"description":"The font size of the label, in pixels.","minimum":0,"type":"number"},"labelFontStyle":{"description":"Font style of the title.","type":"string"},"labelFontWeight":{"description":"Font weight of axis tick labels.","type":"string"},"labelLimit":{"description":"Maximum allowed pixel width of axis tick labels.\\n\\n__Default value:__ `180`","type":"number"},"labelPadding":{"description":"The padding, in pixels, between axis and text labels.\\n\\n__Default value:__ `2`","type":"number"},"labels":{"description":"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.","type":"boolean"},"maxExtent":{"description":"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.","type":"number"},"minExtent":{"description":"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.","type":"number"},"offset":{"description":"The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/AxisOrient","description":"The orientation of the axis. One of `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"` or `\\"right\\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\\n\\n__Default value:__ `\\"bottom\\"` for x-axes and `\\"left\\"` for y-axes."},"tickCap":{"description":"The stroke cap for the tick lines\' ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"tickColor":{"description":"The color of the axis\'s tick.\\n\\n__Default value:__ `\\"gray\\"`","type":"string"},"tickCount":{"description":"A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \\"nice\\" (multiples of `2`, `5`, `10`) and lie within the underlying scale\'s range.","minimum":0,"type":"number"},"tickDash":{"description":"An array of alternating [stroke, space] lengths for dashed tick mark lines.","items":{"type":"number"},"type":"array"},"tickDashOffset":{"description":"The pixel offset at which to start drawing with the tick mark dash array.","type":"number"},"tickMinStep":{"description":"The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.","type":"number"},"tickSize":{"description":"The size in pixels of axis ticks.\\n\\n__Default value:__ `5`","minimum":0,"type":"number"},"tickWidth":{"description":"The width, in pixels, of ticks.\\n\\n__Default value:__ `1`","minimum":0,"type":"number"},"ticks":{"description":"Boolean value that determines whether the axis should include ticks.\\n\\n__Default value:__ `true`","type":"boolean"},"title":{"description":"A title for the axis (none by default).","type":"string"},"titleColor":{"description":"Color of the title, can be in hex color code or regular color name.","type":"string"},"titleFont":{"description":"Font of the title. (e.g., `\\"Helvetica Neue\\"`).","type":"string"},"titleFontSize":{"description":"Font size of the title.","minimum":0,"type":"number"},"titleFontStyle":{"description":"Font style of the title.","type":"string"},"titleFontWeight":{"description":"Font weight of the title. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`).","type":"string"},"titleOpacity":{"description":"Opacity of the axis title.","type":"number"},"titlePadding":{"description":"The padding, in pixels, between title and axis.","type":"number"},"values":{"description":"Explicitly set the visible axis tick and label values.","items":{},"type":"array"}},"type":"object"},"AxisGenomeData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to use"},"type":{"const":"axisGenome","type":"string"}},"required":["type","channel"],"type":"object"},"AxisOrient":{"enum":["top","bottom","left","right"],"type":"string"},"AxisTicksData":{"additionalProperties":false,"properties":{"axis":{"$ref":"#/definitions/Axis","description":"Optional axis properties"},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to listen to"},"type":{"const":"axisTicks","type":"string"}},"required":["type","channel"],"type":"object"},"BamData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"URL of the index file.\\n\\n__Default value:__ `url` + `\\".bai\\"`.","type":"string"},"type":{"const":"bam","type":"string"},"url":{"description":"URL of the BigBed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `10000`","type":"number"}},"required":["type","url"],"type":"object"},"Baseline":{"enum":["top","middle","bottom","alphabetic"],"type":"string"},"BigBedData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"type":{"const":"bigbed","type":"string"},"url":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"URL of the BigBed file."},"windowSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Size of each chunk when fetching the BigBed file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `1000000`"}},"required":["type","url"],"type":"object"},"BigWigData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"pixelsPerBin":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The approximate minimum width of each data bin, in pixels.\\n\\n__Default value:__ `2`"},"type":{"const":"bigwig","type":"string"},"url":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"URL of the BigWig file."}},"required":["type","url"],"type":"object"},"BindCheckbox":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"const":"checkbox","type":"string"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"}},"required":["input"],"type":"object"},"BindInput":{"additionalProperties":false,"properties":{"autocomplete":{"description":"A hint for form autofill. See the [HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for additional information.","type":"string"},"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"description":"The type of input element to use. The valid values are `\\"checkbox\\"`, `\\"radio\\"`, `\\"range\\"`, `\\"select\\"`, `\\"text\\"`, `\\"number\\"`, and `\\"color\\"`.","enum":["text","number","color"],"type":"string"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"placeholder":{"description":"Text that appears in the form control when it has no value set.","type":"string"}},"type":"object"},"BindRadioSelect":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"enum":["radio","select"],"type":"string"},"labels":{"description":"An array of label strings to represent the `options` values. If unspecified, the `options` value will be coerced to a string and used as the label.","items":{"type":"string"},"type":"array"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"options":{"description":"An array of options to select from.","items":{},"type":"array"}},"required":["input","options"],"type":"object"},"BindRange":{"additionalProperties":false,"properties":{"debounce":{"description":"If defined, delays event handling until the specified milliseconds have elapsed since the last event was fired.","type":"number"},"description":{"description":"An optional description or help text that is shown below the input element.","type":"string"},"input":{"const":"range","type":"string"},"max":{"description":"Sets the maximum slider value. Defaults to the larger of the signal value and `100`.","type":"number"},"min":{"description":"Sets the minimum slider value. Defaults to the smaller of the signal value and `0`.","type":"number"},"name":{"description":"By default, the parameter name is used to label input elements. This `name` property can be used instead to specify a custom label for the bound parameter.","type":"string"},"step":{"description":"Sets the minimum slider increment. If undefined, the step size will be automatically determined based on the `min` and `max` values.","type":"number"}},"required":["input"],"type":"object"},"Binding":{"anyOf":[{"$ref":"#/definitions/BindCheckbox"},{"$ref":"#/definitions/BindRadioSelect"},{"$ref":"#/definitions/BindRange"},{"$ref":"#/definitions/BindInput"}]},"ChannelWithScale":{"anyOf":[{"$ref":"#/definitions/PositionalChannel"},{"const":"color","type":"string"},{"const":"fill","type":"string"},{"const":"stroke","type":"string"},{"const":"opacity","type":"string"},{"const":"fillOpacity","type":"string"},{"const":"strokeOpacity","type":"string"},{"const":"strokeWidth","type":"string"},{"const":"size","type":"string"},{"const":"shape","type":"string"},{"const":"angle","type":"string"},{"const":"dx","type":"string"},{"const":"dy","type":"string"}]},"ChromPosDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"const":"locus","type":"string"}},"required":["chrom","type"],"type":"object"},"ChromosomalLocus":{"additionalProperties":false,"properties":{"chrom":{"description":"The name of the chromosome. For example: `\\"chr1\\"`, `\\"CHR1\\"`, or `\\"1\\"`.","type":"string"},"pos":{"description":"The zero-based position inside the chromosome or contig.","type":"number"}},"required":["chrom"],"type":"object"},"CollectParams":{"additionalProperties":false,"properties":{"groupby":{"description":"Arranges the data into consecutive batches based on the groups. This is mainly intended for internal use so that faceted data can be handled as batches.","items":{"$ref":"#/definitions/Field"},"type":"array"},"sort":{"$ref":"#/definitions/CompareParams","description":"The sort order."},"type":{"const":"collect","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"ColorDef":{"$ref":"#/definitions/MarkPropDef%3C(string%7Cnull)%3E"},"CompareParams":{"additionalProperties":false,"properties":{"field":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to sort by"},"order":{"anyOf":[{"items":{"$ref":"#/definitions/SortOrder"},"type":"array"},{"$ref":"#/definitions/SortOrder"}],"description":"The order(s) to use: `\\"ascending\\"` (default), `\\"descending\\"`."}},"required":["field"],"type":"object"},"ComplexDomain":{"description":"A complex domain that needs to be converted into a scalar domain before it is assigned to a scale.","items":{"$ref":"#/definitions/ChromosomalLocus"},"type":"array"},"ConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"columns":{"description":"The number of columns in the grid.","type":"number"},"concat":{"description":"Specifies views that will be concatenated into a grid that wraps when the specified number of columns are used.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["concat","columns"],"type":"object"},"Conditional":{"$ref":"#/definitions/ConditionalParameter%3CDatumDef%3E"},"Conditional":{"$ref":"#/definitions/ConditionalParameter%3CFieldDef%3E"},"Conditional>":{"$ref":"#/definitions/ConditionalParameter%3CValueDef%3C(number%7CExprRef)%3E%3E"},"Conditional>":{"$ref":"#/definitions/ConditionalParameter%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"ConditionalParameter":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["param"],"type":"object"},"ConditionalParameter":{"anyOf":[{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"required":["param"],"type":"object"},{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["param","type"],"type":"object"}]},"ConditionalParameter>":{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["param","value"],"type":"object"},"ConditionalParameter>":{"additionalProperties":false,"properties":{"empty":{"description":"For selection parameters, the predicate of empty selections returns true by default. Override this behavior, by setting this property `empty: false`.","type":"boolean"},"param":{"description":"Filter using a parameter name.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"string"},{"type":"null"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["param","value"],"type":"object"},"Contig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"size":{"type":"number"}},"required":["name","size"],"type":"object"},"CoverageParams":{"additionalProperties":false,"properties":{"as":{"description":"The output field for the computed coverage.","type":"string"},"asChrom":{"description":"The output field for the chromosome.\\n\\n**Default:** Same as `chrom`","type":"string"},"asEnd":{"description":"The output field for the end coordinate.\\n\\n**Default:** Same as `end`","type":"string"},"asStart":{"description":"The output field for the start coordinate.\\n\\n**Default:** Same as `start`","type":"string"},"chrom":{"$ref":"#/definitions/Field","description":"An optional chromosome field that is passed through. TODO: groupby"},"end":{"$ref":"#/definitions/Field","description":"The field representing the end coordinate of the segment (exclusive)."},"start":{"$ref":"#/definitions/Field","description":"The field representing the start coordinate of the segment (inclusive)."},"type":{"const":"coverage","description":"The type of the transform to be applied","type":"string"},"weight":{"$ref":"#/definitions/Field","description":"A field representing an optional weight for the segment. Can be used with copy ratios, for example."}},"required":["end","start","type"],"type":"object"},"CsvDataFormat":{"additionalProperties":false,"properties":{"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"type":{"description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","enum":["csv","tsv"],"type":"string"}},"type":"object"},"Data":{"anyOf":[{"$ref":"#/definitions/DataSource"},{"$ref":"#/definitions/Generator"}]},"DataFormat":{"anyOf":[{"$ref":"#/definitions/CsvDataFormat"},{"$ref":"#/definitions/DsvDataFormat"},{"$ref":"#/definitions/JsonDataFormat"},{"$ref":"#/definitions/OtherDataFormat"}]},"DataSource":{"anyOf":[{"$ref":"#/definitions/UrlData"},{"$ref":"#/definitions/InlineData"},{"$ref":"#/definitions/NamedData"},{"$ref":"#/definitions/DynamicCallbackData"},{"$ref":"#/definitions/LazyData"}]},"DsvDataFormat":{"additionalProperties":false,"properties":{"delimiter":{"description":"The delimiter between records. The delimiter must be a single character (i.e., a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not.","maxLength":1,"minLength":1,"type":"string"},"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"type":{"const":"dsv","description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","type":"string"}},"required":["delimiter"],"type":"object"},"DynamicCallbackData":{"additionalProperties":false,"properties":{"dynamicCallbackSource":{"description":"The View class has `getDynamicData()` methods that provides the data. This is intended for internal use.","type":"boolean"},"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"}},"required":["dynamicCallbackSource"],"type":"object"},"DynamicOpacity":{"additionalProperties":false,"description":"DynamicOpacity specifies a zoom-dependent behavior for view opacity. The opacity is interpolated between the specified stops.","properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel"},"unitsPerPixel":{"description":"Stops expressed as units (base pairs, for example) per pixel.","items":{"type":"number"},"type":"array"},"values":{"description":"Opacity values that match the given stops.","items":{"type":"number"},"type":"array"}},"required":["unitsPerPixel","values"],"type":"object"},"Encoding":{"additionalProperties":false,"properties":{"angle":{"$ref":"#/definitions/NumericMarkPropDef","description":"Rotation angle of point and text marks."},"color":{"$ref":"#/definitions/ColorDef","description":"Color of the marks – either fill or stroke color based on the `filled` property of mark definition.\\n\\n_Note:_ 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. The `fill` or `stroke` encodings have higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified. 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme)."},"dx":{"$ref":"#/definitions/NumericMarkPropDef"},"dy":{"$ref":"#/definitions/NumericMarkPropDef"},"facetIndex":{"$ref":"#/definitions/FieldDefWithoutScale","description":"For internal use"},"fill":{"$ref":"#/definitions/ColorDef","description":"Fill color of the marks.\\n\\n_Note:_ The `fill` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."},"fillOpacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Fill opacity of the marks."},"opacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Opacity of the marks."},"sample":{"$ref":"#/definitions/FieldDefWithoutScale","description":"Facet identifier for interactive filtering, sorting, and grouping in the App."},"search":{"$ref":"#/definitions/FieldDefWithoutScale"},"semanticScore":{"$ref":"#/definitions/FieldDefWithoutScale"},"shape":{"$ref":"#/definitions/ShapeDef","description":"Shape of the mark.\\n\\nFor `point` marks the supported values include:\\n- plotting shapes: `\\"circle\\"`, `\\"square\\"`, `\\"cross\\"`, `\\"diamond\\"`, `\\"triangle-up\\"`, `\\"triangle-down\\"`, `\\"triangle-right\\"`, or `\\"triangle-left\\"`.\\n- centered directional shape `\\"triangle\\"`"},"size":{"$ref":"#/definitions/NumericMarkPropDef","description":"Size of the mark.\\n- For `\\"point\\"` – the symbol size, or pixel area of the mark.\\n- For `\\"text\\"` – the text\'s font size."},"stroke":{"$ref":"#/definitions/ColorDef","description":"Stroke color of the marks.\\n\\n_Note:_ The `stroke` encoding has higher precedence than `color`, thus may override the `color` encoding if conflicting encodings are specified."},"strokeOpacity":{"$ref":"#/definitions/NumericMarkPropDef","description":"Stroke opacity of the marks."},"strokeWidth":{"$ref":"#/definitions/NumericMarkPropDef","description":"Stroke width of the marks."},"text":{"$ref":"#/definitions/TextDef","description":"Text of the `text` mark."},"uniqueId":{"$ref":"#/definitions/FieldDefWithoutScale","description":"For internal use"},"x":{"anyOf":[{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"const":"locus","type":"string"}},"required":["chrom","type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr","type"],"type":"object"},{"additionalProperties":false,"properties":{"buildIndex":{"description":"Builds and index for efficient rendering of subsets of the data. This setting is useful when rendering large amounts of data and often only a small subset of the data is visible. An example of such a situation is a scatter plot spanning the whole genome.\\n\\nThis setting implicitly sorts the data by the field assigned on the `x` channel.","type":"boolean"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["value"],"type":"object"}],"description":"X coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"x2":{"$ref":"#/definitions/Position2Def","description":"X2 coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"y":{"$ref":"#/definitions/PositionDef","description":"Y coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."},"y2":{"$ref":"#/definitions/Position2Def","description":"Y2 coordinates of the marks.\\n\\nThe `value` of this channel can be a number between zero and one."}},"type":"object"},"ExprDef":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr"],"type":"object"},"ExprFilterParams":{"additionalProperties":false,"properties":{"expr":{"description":"An expression string. The data object is removed if the expression evaluates to false.","type":"string"},"type":{"const":"filter","description":"The type of the transform to be applied","type":"string"}},"required":["expr","type"],"type":"object"},"ExprRef":{"additionalProperties":false,"properties":{"expr":{"description":"The expression string.","type":"string"}},"required":["expr"],"type":"object"},"Field":{"description":"The name of the field or a JavaScript expression for accessing nested properties. Dots and brackets in the field name must be escaped.","type":"string"},"FieldDefWithoutScale":{"additionalProperties":false,"properties":{"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},"FieldName":{"type":"string"},"FieldOrDatumDefWithCondition":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"FieldOrDatumDefWithCondition":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"FieldOrDatumDefWithCondition,(string|null)>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"FieldOrDatumDefWithCondition,number>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"FieldOrDatumDefWithCondition,(string|null)>":{"additionalProperties":false,"description":"A FieldDef with Condition { condition: {value: ...}, field: ..., ... }","properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"One or more value definition(s) with [a parameter or a test predicate](https://vega.github.io/vega-lite/docs/condition.html).\\n\\n__Note:__ A field definition\'s `condition` property can only contain [conditional value definitions](https://vega.github.io/vega-lite/docs/condition.html#value) since Vega-Lite only allows at most one encoded field per encoding channel."},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/TypeForShape"}},"required":["type"],"type":"object"},"FilterParams":{"anyOf":[{"$ref":"#/definitions/ExprFilterParams"},{"$ref":"#/definitions/SelectionFilterParams"}]},"FilterScoredLabelsParams":{"additionalProperties":false,"properties":{"channel":{"description":"**Default:** `\\"x\\"`","enum":["x","y"],"type":"string"},"lane":{"$ref":"#/definitions/Field","description":"An optional field representing element\'s lane, e.g., if transcripts are shown using a piled up layout."},"padding":{"description":"Padding (in pixels) around the element.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/Field","description":"The field representing element\'s position on the domain."},"score":{"$ref":"#/definitions/Field","description":"The field representing the score used for prioritization."},"type":{"const":"filterScoredLabels","description":"The type of the transform to be applied","type":"string"},"width":{"$ref":"#/definitions/Field","description":"The field representing element\'s width in pixels"}},"required":["pos","score","type","width"],"type":"object"},"FlattenCompressedExonsParams":{"additionalProperties":false,"properties":{"as":{"description":"Field names for the flattened exons.\\n\\n**Default:** `[\\"exonStart\\", \\"exonEnd\\"]`","items":{"type":"string"},"maxItems":2,"minItems":2,"type":"array"},"exons":{"$ref":"#/definitions/Field","description":"The field containing the exons.\\n\\n**Default:** `\\"exons\\"`"},"start":{"$ref":"#/definitions/Field","description":"Start coordinate of the gene body.\\n\\n**Default:** `\\"start\\"`"},"type":{"const":"flattenCompressedExons","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FlattenDelimitedParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"The output field name(s) for the flattened field.\\n\\n**Default:** the input fields."},"field":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to split and flatten"},"separator":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"Separator(s) used on the field(s) TODO: Rename to delimiter"},"type":{"const":"flattenDelimited","description":"The type of the transform to be applied","type":"string"}},"required":["field","separator","type"],"type":"object"},"FlattenParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"The output field name(s) for the flattened field.\\n\\n**Default:** the input fields."},"fields":{"anyOf":[{"items":{"$ref":"#/definitions/Field"},"type":"array"},{"$ref":"#/definitions/Field"}],"description":"The field(s) to flatten. If no field is defined, the data object itself is treated as an array to be flattened."},"index":{"description":"The output field name for the zero-based index of the array values. If unspecified, an index field is not added.","type":"string"},"type":{"const":"flatten","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FlattenSequenceParams":{"additionalProperties":false,"properties":{"as":{"description":"Name of the fields where the zero-based index number and flattened sequence letter are written to.\\n\\n**Default:** `[\\"pos\\", \\"sequence\\"]`","items":{"type":"string"},"maxItems":2,"minItems":2,"type":"array"},"field":{"$ref":"#/definitions/Field","description":"The field to flatten.\\n\\n**Default:** `\\"sequence\\"`"},"type":{"const":"flattenSequence","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"FontStyle":{"enum":["normal","italic"],"type":"string"},"FontWeight":{"anyOf":[{"type":"number"},{"const":"thin","type":"string"},{"const":"light","type":"string"},{"const":"regular","type":"string"},{"const":"normal","type":"string"},{"const":"medium","type":"string"},{"const":"bold","type":"string"},{"const":"black","type":"string"}]},"FormulaParams":{"additionalProperties":false,"properties":{"as":{"description":"The (new) field where the computed value is written to","type":"string"},"expr":{"description":"An expression string","type":"string"},"type":{"const":"formula","description":"The type of the transform to be applied","type":"string"}},"required":["as","expr","type"],"type":"object"},"Generator":{"$ref":"#/definitions/SequenceGenerator"},"GenomeAxis":{"additionalProperties":false,"properties":{"chromGrid":{"description":"A boolean flag indicating if chromosome grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"chromGridCap":{"description":"The stroke cap for the chromosome grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"chromGridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"chromGridDash":{"description":"An array of alternating [stroke, space] lengths for dashed chromosome grid mark lines.","items":{"type":"number"},"type":"array"},"chromGridDashOffset":{"description":"The pixel offset at which to start drawing with the chromosome grid mark dash array.","type":"number"},"chromGridFillEven":{"description":"Fill color of odd chromosomes.\\n\\n__Default value:__ (none)","type":"string"},"chromGridFillOdd":{"description":"Fill color of odd chromosomes.\\n\\n__Default value:__ (none)","type":"string"},"chromGridOpacity":{"description":"The opacity of the chromosome grid lines.\\n\\n__Default value:__ `1`","type":"number"},"chromGridWidth":{"description":"Width of the chromosome grid lines.\\n\\n__Default value:__ `1`","type":"number"},"chromLabelAlign":{"$ref":"#/definitions/Align"},"chromLabelColor":{"type":"string"},"chromLabelFont":{"type":"string"},"chromLabelFontSize":{"type":"number"},"chromLabelFontStyle":{"$ref":"#/definitions/FontStyle"},"chromLabelFontWeight":{"$ref":"#/definitions/FontWeight"},"chromLabelPadding":{"type":"number"},"chromLabels":{"type":"boolean"},"chromTickColor":{"type":"string"},"chromTickDash":{"items":{"type":"number"},"type":"array"},"chromTickDashOffset":{"type":"number"},"chromTickSize":{"type":"number"},"chromTickWidth":{"type":"number"},"chromTicks":{"type":"boolean"},"domain":{"description":"A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis.\\n\\n__Default value:__ `true`","type":"boolean"},"domainCap":{"description":"The stroke cap for the domain line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"domainColor":{"description":"Color of axis domain line.\\n\\n__Default value:__ `\\"gray\\"`.","type":"string"},"domainDash":{"description":"An array of alternating [stroke, space] lengths for dashed domain lines.","items":{"type":"number"},"type":"array"},"domainDashOffset":{"description":"The pixel offset at which to start drawing with the domain dash array.","type":"number"},"domainWidth":{"description":"Stroke width of axis domain line\\n\\n__Default value:__ `1`","type":"number"},"format":{"description":"The format specifier pattern for axis labels. Must be a legal [d3-format](https://github.com/d3/d3-format#locale_format) specifier.","type":"string"},"grid":{"description":"A boolean flag indicating if grid lines should be included as part of the axis.\\n\\n__Default value:__ `false`","type":"boolean"},"gridCap":{"description":"The stroke cap for the grid line\'s ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"gridColor":{"description":"Color of grid lines.\\n\\n__Default value:__ `lightgray`","type":"string"},"gridDash":{"description":"An array of alternating [stroke, space] lengths for dashed grid mark lines.","items":{"type":"number"},"type":"array"},"gridDashOffset":{"description":"The pixel offset at which to start drawing with the grid mark dash array.","type":"number"},"gridOpacity":{"description":"The opacity of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"gridWidth":{"description":"Width of the grid lines.\\n\\n__Default value:__ `1`","type":"number"},"labelAlign":{"$ref":"#/definitions/Align","description":"Horizontal text alignment of axis tick labels, overriding the default setting for the current axis orientation."},"labelAngle":{"description":"The rotation angle of the axis labels.\\n\\n__Default value:__ `-90` for nominal and ordinal fields; `0` otherwise.","maximum":360,"minimum":-360,"type":"number"},"labelBaseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline of axis tick labels, overriding the default setting for the current axis orientation. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`."},"labelColor":{"description":"The color of the tick label, can be in hex color code or regular color name.","type":"string"},"labelFont":{"description":"The font of the tick label.","type":"string"},"labelFontSize":{"description":"The font size of the label, in pixels.","minimum":0,"type":"number"},"labelFontStyle":{"description":"Font style of the title.","type":"string"},"labelFontWeight":{"description":"Font weight of axis tick labels.","type":"string"},"labelLimit":{"description":"Maximum allowed pixel width of axis tick labels.\\n\\n__Default value:__ `180`","type":"number"},"labelPadding":{"description":"The padding, in pixels, between axis and text labels.\\n\\n__Default value:__ `2`","type":"number"},"labels":{"description":"A boolean flag indicating if labels should be included as part of the axis.\\n\\n__Default value:__ `true`.","type":"boolean"},"maxExtent":{"description":"The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.\\n\\n__Default value:__ `undefined`.","type":"number"},"minExtent":{"description":"The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.\\n\\n__Default value:__ `30` for y-axis; `undefined` for x-axis.","type":"number"},"offset":{"description":"The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/AxisOrient","description":"The orientation of the axis. One of `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"` or `\\"right\\"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).\\n\\n__Default value:__ `\\"bottom\\"` for x-axes and `\\"left\\"` for y-axes."},"tickCap":{"description":"The stroke cap for the tick lines\' ending style. One of `\\"butt\\"`, `\\"round\\"` or `\\"square\\"`.\\n\\n__Default value:__ `\\"butt\\"`","enum":["butt","round","square"],"type":"string"},"tickColor":{"description":"The color of the axis\'s tick.\\n\\n__Default value:__ `\\"gray\\"`","type":"string"},"tickCount":{"description":"A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are \\"nice\\" (multiples of `2`, `5`, `10`) and lie within the underlying scale\'s range.","minimum":0,"type":"number"},"tickDash":{"description":"An array of alternating [stroke, space] lengths for dashed tick mark lines.","items":{"type":"number"},"type":"array"},"tickDashOffset":{"description":"The pixel offset at which to start drawing with the tick mark dash array.","type":"number"},"tickMinStep":{"description":"The minimum desired step between axis ticks, in terms of scale domain values. For example, a value of `1` indicates that ticks should not be less than 1 unit apart. If `tickMinStep` is specified, the `tickCount` value will be adjusted, if necessary, to enforce the minimum step value.","type":"number"},"tickSize":{"description":"The size in pixels of axis ticks.\\n\\n__Default value:__ `5`","minimum":0,"type":"number"},"tickWidth":{"description":"The width, in pixels, of ticks.\\n\\n__Default value:__ `1`","minimum":0,"type":"number"},"ticks":{"description":"Boolean value that determines whether the axis should include ticks.\\n\\n__Default value:__ `true`","type":"boolean"},"title":{"description":"A title for the axis (none by default).","type":"string"},"titleColor":{"description":"Color of the title, can be in hex color code or regular color name.","type":"string"},"titleFont":{"description":"Font of the title. (e.g., `\\"Helvetica Neue\\"`).","type":"string"},"titleFontSize":{"description":"Font size of the title.","minimum":0,"type":"number"},"titleFontStyle":{"description":"Font style of the title.","type":"string"},"titleFontWeight":{"description":"Font weight of the title. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`).","type":"string"},"titleOpacity":{"description":"Opacity of the axis title.","type":"number"},"titlePadding":{"description":"The padding, in pixels, between title and axis.","type":"number"},"values":{"description":"Explicitly set the visible axis tick and label values.","items":{},"type":"array"}},"type":"object"},"GenomeConfig":{"anyOf":[{"$ref":"#/definitions/UrlGenomeConfig"},{"$ref":"#/definitions/InlineGenomeConfig"},{"$ref":"#/definitions/GenomeConfigBase"}]},"GenomeConfigBase":{"additionalProperties":false,"properties":{"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"}},"required":["name"],"type":"object"},"Gff3Data":{"additionalProperties":false,"properties":{"addChrPrefix":{"description":"Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\\n\\n__Default value:__ `false`","type":["boolean","string"]},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"Url of the tabix index file.\\n\\n__Default value:__ `url` + `\\".tbi\\"`.","type":"string"},"type":{"const":"gff3","type":"string"},"url":{"description":"Url of the bgzip compressed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `30000000`","type":"number"}},"required":["type","url"],"type":"object"},"HConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"hconcat":{"description":"Specifies views that will be concatenated horizontally.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["hconcat"],"type":"object"},"HandledTooltip":{"additionalProperties":false,"properties":{"handler":{"type":"string"},"params":{"type":"object"}},"required":["handler"],"type":"object"},"IdentifierParams":{"additionalProperties":false,"properties":{"as":{"description":"**Default:** `\\"_uniqueId\\"`","type":"string"},"type":{"const":"identifier","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"ImportSpec":{"additionalProperties":false,"properties":{"import":{"anyOf":[{"$ref":"#/definitions/UrlImport"},{"$ref":"#/definitions/TemplateImport"}],"description":"The method to import a specification."},"name":{"description":"The name given to the imported view. This property overrides the name specified in the imported specification.","type":"string"},"params":{"anyOf":[{"items":{"$ref":"#/definitions/Parameter"},"type":"array"},{"type":"object"}],"description":"Dynamic variables that parameterize a visualization. Parameters defined here override the parameters defined in the imported specification."}},"required":["import"],"type":"object"},"IndexedFastaData":{"additionalProperties":false,"properties":{"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"URL of the index file.\\n\\n__Default value:__ `url` + `\\".fai\\"`.","type":"string"},"type":{"const":"indexedFasta","type":"string"},"url":{"description":"URL of the fasta file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the fasta file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `7000`","type":"number"}},"required":["type","url"],"type":"object"},"InlineData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"values":{"$ref":"#/definitions/InlineDataset","description":"The full data set, included inline. This can be an array of objects or primitive values, an object, or a string. Arrays of primitive values are ingested as objects with a `data` property. Strings are parsed according to the specified format type."}},"required":["values"],"type":"object"},"InlineDataset":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"items":{"type":"string"},"type":"array"},{"items":{"type":"boolean"},"type":"array"},{"items":{"type":"object"},"type":"array"},{"type":"string"},{"type":"object"}]},"InlineGenomeConfig":{"additionalProperties":false,"properties":{"contigs":{"description":"An array of contigs/sequences in the genome assembly.","items":{"$ref":"#/definitions/Contig"},"type":"array"},"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"}},"required":["contigs","name"],"type":"object"},"IntervalSelectionConfig":{"additionalProperties":false,"properties":{"encodings":{"description":"An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"$ref":"#/definitions/ChannelWithScale"},"type":"array"},"fields":{"description":"An array of field names whose values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"type":"string"},"type":"array"},"on":{"enum":["click","mouseover","pointerover"],"type":"string"},"type":{"const":"interval","description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`.","type":"string"}},"required":["type"],"type":"object"},"JsonDataFormat":{"additionalProperties":false,"properties":{"parse":{"anyOf":[{"$ref":"#/definitions/Parse"},{"type":"null"}],"description":"If set to `null`, disable type inference based on the spec and only use type inference based on the data. Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `\\"number\\"`, `\\"boolean\\"`, `\\"date\\"`, or null (do not parse the field)). For example, `\\"parse\\": {\\"modified_on\\": \\"date\\"}` parses the `modified_on` field in each input record a Date value.\\n\\nFor `\\"date\\"`, we parse data based using Javascript\'s [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). For Specific date formats can be provided (e.g., `{foo: \\"date:\'%m%d%Y\'\\"}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: \\"utc:\'%m%d%Y\'\\"}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc)"},"property":{"description":"The JSON property containing the desired data. This parameter can be used when the loaded JSON file may have surrounding structure or meta-data. For example `\\"property\\": \\"values.features\\"` is equivalent to retrieving `json.values.features` from the loaded JSON object.","type":"string"},"type":{"const":"json","description":"Type of input data: `\\"json\\"`, `\\"csv\\"`, `\\"tsv\\"`, `\\"dsv\\"`.\\n\\n__Default value:__ The default format type is determined by the extension of the file URL. If no extension is detected, `\\"json\\"` will be used by default.","type":"string"}},"type":"object"},"LayerSpec":{"additionalProperties":false,"properties":{"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"layer":{"items":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["layer"],"type":"object"},"LazyData":{"additionalProperties":false,"properties":{"lazy":{"$ref":"#/definitions/LazyDataParams"}},"required":["lazy"],"type":"object"},"LazyDataParams":{"anyOf":[{"$ref":"#/definitions/AxisTicksData"},{"$ref":"#/definitions/AxisGenomeData"},{"$ref":"#/definitions/IndexedFastaData"},{"$ref":"#/definitions/BigWigData"},{"$ref":"#/definitions/BigBedData"},{"$ref":"#/definitions/BamData"},{"$ref":"#/definitions/Gff3Data"},{"$ref":"#/definitions/VcfData"}]},"LinearizeGenomicCoordinateParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"The output field or fields for linearized coordinates."},"channel":{"description":"Get the genome assembly from the scale of the channel.\\n\\n**Default:** `\\"x\\"`","enum":["x","y"],"type":"string"},"chrom":{"$ref":"#/definitions/Field","description":"The chromosome/contig field"},"offset":{"anyOf":[{"type":"number"},{"items":{"type":"number"},"type":"array"}],"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`"},"pos":{"anyOf":[{"$ref":"#/definitions/Field"},{"items":{"$ref":"#/definitions/Field"},"type":"array"}],"description":"The field or fields that contain intra-chromosomal positions"},"type":{"const":"linearizeGenomicCoordinate","description":"The type of the transform to be applied","type":"string"}},"required":["as","chrom","pos","type"],"type":"object"},"LinkProps":{"additionalProperties":false,"properties":{"arcFadingDistance":{"anyOf":[{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},{"const":false,"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"The range of the `\\"arc\\"` shape\'s fading distance in pixels. This property allows for making the arc\'s opacity fade out as it extends away from the chord. The fading distance is interpolated from one to zero between the interval defined by this property. Both `false` and `[0, 0]` disable fading.\\n\\n**Default value:** `false`"},"arcHeightFactor":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Scaling factor for the `\\"arc`\\" shape\'s height. The default value `1.0` produces roughly circular arcs.\\n\\n**Default value:** `1.0`"},"clampApex":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Whether the apex of the `\\"dome\\"` shape is clamped to the viewport edge. When over a half of the dome is located outside the viewport, clamping allows for more accurate reading of the value encoded by the apex\' position.\\n\\n**Default value:** `false`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"linkShape":{"anyOf":[{"const":"arc","type":"string"},{"const":"diagonal","type":"string"},{"const":"line","type":"string"},{"const":"dome","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The shape of the link path.\\n\\nThe `\\"arc\\"` shape draws a circular arc between the two points. The apex of the arc resides on the left side of the line that connects the two points. The `\\"dome\\"` shape draws a vertical or horizontal arc with a specific height. The primary positional channel determines the apex of the arc and the secondary determines the endpoint placement. The `\\"diagonal\\"` shape draws an \\"S\\"-shaped curve between the two points. The `\\"line\\"` shape draws a straight line between the two points. See an [example](#different-link-shapes-and-orientations) of the different shapes below.\\n\\n**Default value:** `\\"arc\\"`"},"maxChordLength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The maximum length of `\\"arc\\"` shape\'s chord in pixels. The chord is the line segment between the two points that define the arc. Limiting the chord length serves two purposes when zooming in close enough: 1) it prevents the arc from becoming a straight line and 2) it mitigates the limited precision of floating point numbers in arc rendering.\\n\\n**Default value:** `50000`"},"minArcHeight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum height of an `\\"arc\\"` shape. Makes very short links more clearly visible.\\n\\n**Default value:** `1.5`"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minPickingSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\\n\\n**Default value:** `3.0` for `\\"link\\"` and `2.0` for `\\"point\\"`"},"noFadingOnPointSelection":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Disables fading of the link when an mark instance is subject to any point selection. As the fading distance is unavailable as a visual channel, this property allows for enhancing the visibility of the selected links.\\n\\n**Default value:** `true`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"orient":{"anyOf":[{"const":"vertical","type":"string"},{"const":"horizontal","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The orientation of the link path. Either `\\"vertical\\"` or `\\"horizontal\\"`. Only applies to diagonal links.\\n\\n**Default value:** `\\"vertical\\"`"},"segments":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The number of segments in the bézier curve. Affects the rendering quality and performance. Use a higher value for a smoother curve.\\n\\n**Default value:** `101`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"link","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"MarkPropDef<(string|null),TypeForShape>":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CTypeForShape%3E%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3C(string%7Cnull)%3E"}]},"MarkPropDef<(string|null)>":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2C(string%7Cnull)%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3C(string%7Cnull)%3E"}]},"MarkPropDef":{"anyOf":[{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CMarkPropFieldDef%3CType%3E%2Cnumber%3E"},{"$ref":"#/definitions/FieldOrDatumDefWithCondition%3CDatumDef%2Cnumber%3E"},{"$ref":"#/definitions/ValueDefWithCondition%3Cnumber%3E"}]},"MarkProps":{"anyOf":[{"$ref":"#/definitions/RectProps"},{"$ref":"#/definitions/TextProps"},{"$ref":"#/definitions/RuleProps"},{"$ref":"#/definitions/LinkProps"},{"$ref":"#/definitions/PointProps"}]},"MarkType":{"enum":["rect","point","rule","text","link"],"type":"string"},"MeasureTextParams":{"additionalProperties":false,"properties":{"as":{"type":"string"},"field":{"$ref":"#/definitions/Field"},"fontSize":{"type":"number"},"type":{"const":"measureText","description":"The type of the transform to be applied","type":"string"}},"required":["as","field","fontSize","type"],"type":"object"},"MergeFacetsParams":{"additionalProperties":false,"properties":{"type":{"const":"mergeFacets","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"NamedData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"}},"required":["name"],"type":"object"},"NumericDomain":{"items":{"type":"number"},"type":"array"},"NumericMarkPropDef":{"$ref":"#/definitions/MarkPropDef%3Cnumber%3E"},"NumericValueDef":{"$ref":"#/definitions/ValueDef%3Cnumber%3E"},"OtherDataFormat":{"additionalProperties":false,"description":"Other data format, such as `\\"fasta\\"`","properties":{"type":{"type":"string"}},"required":["type"],"type":"object"},"PaddingConfig":{"anyOf":[{"$ref":"#/definitions/Paddings"},{"type":"number"}]},"Paddings":{"additionalProperties":false,"properties":{"bottom":{"type":"number"},"left":{"type":"number"},"right":{"type":"number"},"top":{"type":"number"}},"type":"object"},"Parameter":{"anyOf":[{"$ref":"#/definitions/VariableParameter"},{"$ref":"#/definitions/SelectionParameter"}]},"Parse":{"additionalProperties":{"$ref":"#/definitions/ParseValue"},"type":"object"},"ParseValue":{"anyOf":[{"type":"null"},{"type":"string"},{"const":"string","type":"string"},{"const":"boolean","type":"string"},{"const":"date","type":"string"},{"const":"number","type":"string"}]},"PileupParams":{"additionalProperties":false,"properties":{"as":{"description":"The output field name for the computed lane.\\n\\n**Default:** `\\"lane\\"`.","type":"string"},"end":{"$ref":"#/definitions/Field","description":"The field representing the end coordinate of the segment (exclusive)."},"preference":{"$ref":"#/definitions/Field","description":"An optional field indicating the preferred lane. Use together with the `preferredOrder` property."},"preferredOrder":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"items":{"type":"number"},"type":"array"},{"items":{"type":"boolean"},"type":"array"}],"description":"The order of the lane preferences. The first element contains the value that should place the segment on the first lane and so forth. If the preferred lane is occupied, the first available lane is taken."},"spacing":{"description":"The spacing between adjacent segments on the same lane in coordinate units.\\n\\n**Default:** `1`.","type":"number"},"start":{"$ref":"#/definitions/Field","description":"The field representing the start coordinate of the segment (inclusive)."},"type":{"const":"pileup","description":"The type of the transform to be applied","type":"string"}},"required":["end","start","type"],"type":"object"},"PointProps":{"additionalProperties":false,"properties":{"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The rotation angle in degrees.\\n\\n**Default value:** `0`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillGradientStrength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Gradient strength controls the amount of the gradient eye-candy effect in the fill color. Valid values are between `0` and `1`.\\n\\n**Default value:** `0`"},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"filled":{"description":"Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).","type":"boolean"},"geometricZoomBound":{"description":"Enables geometric zooming. The value is the base two logarithmic zoom level where the maximum point size is reached.\\n\\n**Default value:** `0`","type":"number"},"inwardStroke":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Should the stroke only grow inwards, e.g, the diameter/outline is not affected by the stroke width. Thus, a point that has a zero size has no visible stroke. This allows strokes to be used with geometric zoom, etc.\\n\\n**Default value:** `false`"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minPickingSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum picking size invisibly increases the stroke width or point diameter of marks when pointing them with the mouse cursor, making it easier to select them. The valus is the minimum size in pixels.\\n\\n**Default value:** `3.0` for `\\"link\\"` and `2.0` for `\\"point\\"`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"semanticZoomFraction":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"TODO\\n\\n**Default value:** `0.02`"},"shape":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"One of `\\"circle\\"`, `\\"square\\"`, `\\"cross\\"`, `\\"diamond\\"`, `\\"triangle-up\\"`, `\\"triangle-down\\"`, `\\"triangle-right\\"`, `\\"triangle-left\\"`, `\\"tick-up\\"`, `\\"tick-down\\"`, `\\"tick-right\\"`, or `\\"tick-left\\"`\\n\\n**Default value:** `\\"circle\\"`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke width in pixels."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"point","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"PointSelectionConfig":{"additionalProperties":false,"properties":{"encodings":{"description":"An array of encoding channels. The corresponding data field values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"$ref":"#/definitions/ChannelWithScale"},"type":"array"},"fields":{"description":"An array of field names whose values must match for a data tuple to fall within the selection.\\n\\n__See also:__ The [projection with `encodings` and `fields` section](https://vega.github.io/vega-lite/docs/selection.html#project) in the documentation.","items":{"type":"string"},"type":"array"},"on":{"enum":["click","mouseover","pointerover"],"type":"string"},"toggle":{"description":"Controls whether data values should be toggled (inserted or removed from a point selection) when clicking with the shift key pressed.\\n\\n- `true` -- additional values can be selected by shift-clicking.\\n- `false` -- only a single value can be selected at a time.\\n\\n__Default value:__ `true`","type":"boolean"},"type":{"const":"point","description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`.","type":"string"}},"required":["type"],"type":"object"},"Position2Def":{"anyOf":[{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},{"$ref":"#/definitions/SecondaryChromPosDef"},{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr"],"type":"object"},{"$ref":"#/definitions/PositionValueDef"}]},"PositionDatumDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"PositionDef":{"anyOf":[{"$ref":"#/definitions/PositionFieldDef"},{"$ref":"#/definitions/ChromPosDef"},{"$ref":"#/definitions/PositionDatumDef"},{"$ref":"#/definitions/PositionExprDef"},{"$ref":"#/definitions/PositionValueDef"}]},"PositionExprDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"expr":{"description":"An expression. Properties of the data can be accessed through the `datum` object.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["expr","type"],"type":"object"},"PositionFieldDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"required":["type"],"type":"object"},"PositionValueDef":{"$ref":"#/definitions/NumericValueDef"},"PositionalChannel":{"anyOf":[{"$ref":"#/definitions/PrimaryPositionalChannel"},{"$ref":"#/definitions/SecondaryPositionalChannel"}]},"PrimaryPositionalChannel":{"enum":["x","y"],"type":"string"},"ProjectParams":{"additionalProperties":false,"properties":{"as":{"description":"New names for the projected fields. If omitted, the names of the source fields are used.","items":{"type":"string"},"type":"array"},"fields":{"description":"The fields to be projected.","items":{"$ref":"#/definitions/Field"},"type":"array"},"type":{"const":"project","description":"The type of the transform to be applied","type":"string"}},"required":["fields","type"],"type":"object"},"RectProps":{"additionalProperties":false,"properties":{"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"cornerRadius":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the rounded corners.\\n\\n**Default value:** `0`"},"cornerRadiusBottomLeft":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the bottom left rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusBottomRight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the bottom right rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusTopLeft":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the top left rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"cornerRadiusTopRight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Radius of the top right rounded corner. Has higher precedence than `cornerRadius`.\\n\\n**Default value:** (None)"},"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"filled":{"description":"Whether the `color` represents the `fill` color (`true`) or the `stroke` color (`false`).","type":"boolean"},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minHeight":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum height of a rectangle in pixels. The property clamps rectangles\' heights.\\n\\n**Default value:** `0`"},"minOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Clamps the minimum size-dependent opacity. The property does not affect the `opacity` channel. Valid values are between `0` and `1`.\\n\\nWhen a rectangle would be smaller than what is specified in `minHeight` and `minWidth`, it is faded out proportionally. Example: a rectangle would be rendered as one pixel wide, but `minWidth` clamps it to five pixels. The rectangle is actually rendered as five pixels wide, but its opacity is multiplied by 0.2. With this setting, you can limit the factor to, for example, 0.5 to keep the rectangles more clearly visible.\\n\\n**Default value:** `0`"},"minWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum width of a rectangle in pixels. The property clamps rectangles\' widths when the viewport is zoomed out.\\n\\nThis property also reduces flickering of very narrow rectangles when zooming. The value should generally be at least one.\\n\\n**Default value:** `1`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke width in pixels."},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"rect","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"RegexExtractParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"The new field or an array of fields where the extracted values are written."},"field":{"$ref":"#/definitions/Field","description":"The source field"},"regex":{"description":"A valid JavaScript regular expression with at least one group. For example: `\\"^Sample(\\\\\\\\d+)$\\"`.\\n\\nRead more at: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions","type":"string"},"skipInvalidInput":{"description":"Do not complain about invalid input. Just skip it and leave the new fields undefined on the affected datum.\\n\\n**Default:** `false`","type":"boolean"},"type":{"const":"regexExtract","description":"The type of the transform to be applied","type":"string"}},"required":["as","field","regex","type"],"type":"object"},"RegexFoldParams":{"additionalProperties":false,"properties":{"asKey":{"description":"**Default:** `\\"sample\\"`","type":"string"},"asValue":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"A new column name for the extracted values."},"columnRegex":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"description":"A regular expression that matches to column names. The regex must have one capturing group that is used for extracting the key (e.g., a sample id) from the column name."},"skipRegex":{"description":"An optional regex that matches to fields that should not be included in the new folded data objects.","type":"string"},"type":{"const":"regexFold","description":"The type of the transform to be applied","type":"string"}},"required":["asValue","columnRegex","type"],"type":"object"},"ResolutionBehavior":{"description":"`\\"independent\\"` and `\\"shared\\"` behave similarly to Vega-Lite. `\\"excluded\\"` behaves like `\\"shared\\"`, but is not pulled towards the root. `\\"forced\\"` behaves like `\\"shared\\"`, but is forced towards the root even if the parent has `\\"independent\\"` behavior.","enum":["independent","shared","excluded","forced"],"type":"string"},"RootSpec":{"anyOf":[{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"mark":{"anyOf":[{"$ref":"#/definitions/MarkType"},{"$ref":"#/definitions/MarkProps"}],"description":"The graphical mark presenting the data objects."},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"The background of the view, including fill, stroke, and stroke width."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["mark"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"layer":{"items":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["layer"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"vconcat":{"description":"Specifies views that will be concatenated vertically.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["vconcat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"hconcat":{"description":"Specifies views that will be concatenated horizontally.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["hconcat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"columns":{"description":"The number of columns in the grid.","type":"number"},"concat":{"description":"Specifies views that will be concatenated into a grid that wraps when the specified number of columns are used.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["columns","concat"],"type":"object"},{"additionalProperties":false,"properties":{"$schema":{"type":"string"},"background":{"description":"Background color of the canvas.","type":"string"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"datasets":{"additionalProperties":{"items":{},"type":"array"},"description":"https://vega.github.io/vega-lite/docs/data.html#datasets","type":"object"},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"genome":{"$ref":"#/definitions/GenomeConfig"},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"samples":{"$ref":"#/definitions/SampleDef","description":"Sample metadata definition. If the object is empty, the sample identifiers will be inferred from the data."},"spec":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"}],"description":"The view specification to be repeated for each sample."},"stickySummaries":{"type":"boolean"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"An object defining the view background and outline. The background is repeated for each group."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["samples","spec"],"type":"object"}]},"RuleProps":{"additionalProperties":false,"properties":{"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"minLength":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The minimum length of the rule in pixels. Use this property to ensure that very short ranged rules remain visible even when the user zooms out.\\n\\n**Default value:** `0`"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Stroke width of `\\"link\\"` and `\\"rule\\"` marks in pixels, the area of the bounding square of `\\"point\\"` mark, or the font size of `\\"text\\"` mark."},"strokeCap":{"anyOf":[{"const":"butt","type":"string"},{"const":"square","type":"string"},{"const":"round","type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The style of stroke ends. Available choices: `\\"butt\\"`, `\\"round`\\", and `\\"square\\"`.\\n\\n**Default value:** `\\"butt\\"`"},"strokeDash":{"description":"An array of of alternating stroke and gap lengths or `null` for solid strokes.\\n\\n**Default value:** `null`","items":{"type":"number"},"type":"array"},"strokeDashOffset":{"description":"An offset for the stroke dash pattern.\\n\\n**Default value:** `0`","type":"number"},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"rule","type":"string"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"SampleAttributeDef":{"additionalProperties":false,"properties":{"barScale":{"$ref":"#/definitions/Scale","description":"An optional scale definition for mapping the attribute to the width of a metadata rectangle."},"scale":{"$ref":"#/definitions/Scale","description":"Scale definition for the (default) color channel"},"type":{"$ref":"#/definitions/Type","description":"The attribute type. One of `\\"nominal\\"`, `\\"ordinal\\"`, or `\\"quantitative\\"`."},"visible":{"description":"Whether the attribute is visible by default.","type":"boolean"},"width":{"description":"Width of the column in pixels.","type":"number"}},"required":["type"],"type":"object"},"SampleDef":{"additionalProperties":false,"properties":{"attributeLabelAngle":{"description":"Angle to be added to the default label angle (-90).\\n\\n**Default value:** `0`","type":"number"},"attributeLabelFont":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"attributeLabelFontSize":{"description":"The font size in pixels.\\n\\n**Default value:** `11`","type":"number"},"attributeLabelFontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"attributeLabelFontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"attributeSize":{"description":"Default size (width) of the metadata attribute columns. Can be configured per attribute using the `attributes` property.\\n\\n**Default value:** `10`","type":"number"},"attributeSpacing":{"description":"Spacing between attribute columns in pixels.\\n\\n**Default value:** `1`","type":"number"},"attributes":{"additionalProperties":{"$ref":"#/definitions/SampleAttributeDef"},"description":"Explicitly specify the sample attributes.","type":"object"},"data":{"$ref":"#/definitions/Data","description":"Optional metadata about the samples."},"labelAlign":{"$ref":"#/definitions/Align","description":"The horizontal alignment of the text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`.\\n\\n**Default value:** `\\"left\\"`"},"labelFont":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"labelFontSize":{"description":"The font size in pixels.\\n\\n**Default value:** `11`","type":"number"},"labelFontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"labelFontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"labelLength":{"description":"How much space in pixels to reserve for the labels.\\n\\n**Default:** `140`","type":"number"},"labelTitleText":{"description":"Text in the label title\\n\\n**Default:** `\\"Sample name\\"`","type":"string"}},"type":"object"},"SampleParams":{"additionalProperties":false,"properties":{"size":{"description":"The maximum sample size.\\n\\n**Default:** `500`","type":"number"},"type":{"const":"sample","description":"The type of the transform to be applied","type":"string"}},"required":["type"],"type":"object"},"SampleSpec":{"additionalProperties":false,"description":"A view specification for a SampleView. This is only functional in the GenomeSpy app.","properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"samples":{"$ref":"#/definitions/SampleDef","description":"Sample metadata definition. If the object is empty, the sample identifiers will be inferred from the data."},"spec":{"anyOf":[{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/UnitSpec"}],"description":"The view specification to be repeated for each sample."},"stickySummaries":{"type":"boolean"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"An object defining the view background and outline. The background is repeated for each group."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["samples","spec"],"type":"object"},"Scalar":{"type":["string","number","boolean"]},"ScalarDomain":{"anyOf":[{"$ref":"#/definitions/NumericDomain"},{"items":{"type":"string"},"type":"array"},{"items":{"type":"boolean"},"type":"array"}]},"Scale":{"additionalProperties":false,"properties":{"align":{"description":"The alignment of the steps within the scale range.\\n\\nThis value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\\n\\n__Default value:__ `0.5`","type":"number"},"base":{"description":"The logarithm base of the `log` scale (default `10`).","type":"number"},"bins":{"description":"An array of bin boundaries over the scale domain. If provided, axes and legends will use the bin boundaries to inform the choice of tick marks and text labels.","items":{"type":"number"},"type":"array"},"clamp":{"description":"If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)\'s `clamp` (`true` by default).","type":"boolean"},"constant":{"description":"A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\\n\\n__Default value:__ `1`","type":"number"},"domain":{"anyOf":[{"$ref":"#/definitions/ScalarDomain"},{"$ref":"#/definitions/ComplexDomain"}],"description":"Customized domain values.\\n\\nFor _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries.\\n\\nFor _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime).\\n\\nFor _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values."},"domainMax":{"description":"Sets the maximum value in the scale domain, overriding the `domain` property. This property is only intended for use with scales having continuous domains.","type":"number"},"domainMid":{"description":"Inserts a single mid-point value into a two-element domain. The mid-point value must lie between the domain minimum and maximum values. This property can be useful for setting a midpoint for [diverging color scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise). The domainMid property is only intended for use with scales supporting continuous, piecewise domains.","type":"number"},"domainMin":{"description":"Sets the minimum value in the scale domain, overriding the domain property. This property is only intended for use with scales having continuous domains.","type":"number"},"exponent":{"description":"The exponent of the `pow` scale.","type":"number"},"interpolate":{"anyOf":[{"$ref":"#/definitions/ScaleInterpolate"},{"$ref":"#/definitions/ScaleInterpolateParams"}],"description":"The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` (\'-long\' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\\n\\n__Default value:__ `hcl`"},"name":{"description":"The name of the scale. Names are optional but allow the scales to be referenced and found with the API.","type":"string"},"nice":{"anyOf":[{"type":"boolean"},{"type":"number"},{"additionalProperties":false,"properties":{"interval":{"type":"string"},"step":{"type":"number"}},"required":["interval","step"],"type":"object"}],"description":"Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\\n\\nFor quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\\n\\n__Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise."},"padding":{"description":"For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.\\n\\nFor _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\\n\\nFor _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`.\\n\\n__Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `continuousPadding`. For _band and point_ scales, see `paddingInner` and `paddingOuter`. By default, Vega-Lite sets padding such that _width/height = number of unique values * step_.","minimum":0,"type":"number"},"paddingInner":{"description":"The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\\n\\nFor point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands).\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `bandPaddingInner`.","maximum":1,"minimum":0,"type":"number"},"paddingOuter":{"description":"The outer padding (spacing) at the ends of the range of band and point scales, as a fraction of the step size. This value must lie in the range [0,1].\\n\\n__Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)\'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. By default, Vega-Lite sets outer padding such that _width/height = number of unique values * step_.","maximum":1,"minimum":0,"type":"number"},"range":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"items":{"type":"string"},"type":"array"},{"type":"string"},{"items":{"$ref":"#/definitions/ExprRef"},"type":"array"}],"description":"The range of the scale. One of:\\n\\n- A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `\\"symbol\\"`, or `\\"diverging\\"`).\\n\\n- For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise).\\n\\n- For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values.\\n\\n__Notes:__\\n\\n1) For color scales you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`.\\n\\n2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view\'s corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`)."},"reverse":{"description":"If true, reverses the order of the scale range.\\n\\n__Default value:__ `false`.","type":"boolean"},"round":{"description":"If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\\n\\n__Default value:__ `false`.","type":"boolean"},"scheme":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/SchemeParams"}],"description":"A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `\\"category10\\"` or `\\"blues\\"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params).\\n\\nDiscrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with color scales.\\n\\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference."},"type":{"$ref":"#/definitions/ScaleType","description":"The type of scale. Vega-Lite supports the following categories of scale types:\\n\\n1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`\\"linear\\"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`\\"pow\\"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`\\"sqrt\\"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`\\"symlog\\"`](https://vega.github.io/vega-lite/docs/scale.html#symlog), [`\\"log\\"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`\\"time\\"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`\\"utc\\"`](https://vega.github.io/vega-lite/docs/scale.html#utc).\\n\\n2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`\\"ordinal\\"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`\\"band\\"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`\\"point\\"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges.\\n\\n3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges [`\\"bin-ordinal\\"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal), [`\\"quantile\\"`](https://vega.github.io/vega-lite/docs/scale.html#quantile), [`\\"quantize\\"`](https://vega.github.io/vega-lite/docs/scale.html#quantize) and [`\\"threshold\\"`](https://vega.github.io/vega-lite/docs/scale.html#threshold).\\n\\n__Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type)."},"zero":{"description":"If `true`, ensures that a zero baseline value is included in the scale domain.\\n\\n__Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise.\\n\\n__Note:__ Log, time, and utc scales do not support `zero`.","type":"boolean"},"zoom":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ZoomParams"}],"description":"If `true` and the scale is used on a positional channel, it can bee zoomed and translated interactively."}},"type":"object"},"ScaleInterpolate":{"enum":["rgb","lab","hcl","hsl","hsl-long","hcl-long","cubehelix","cubehelix-long"],"type":"string"},"ScaleInterpolateParams":{"additionalProperties":false,"properties":{"gamma":{"type":"number"},"type":{"enum":["rgb","cubehelix","cubehelix-long"],"type":"string"}},"required":["type"],"type":"object"},"ScaleType":{"enum":["null","linear","log","pow","sqrt","symlog","identity","sequential","quantize","threshold","ordinal","point","band","index","locus"],"type":"string"},"SchemeParams":{"additionalProperties":false,"properties":{"count":{"description":"The number of colors to use in the scheme. This can be useful for scale types such as `\\"quantize\\"`, which use the length of the scale range to determine the number of discrete bins for the scale domain.","type":"number"},"extent":{"description":"The extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme.","items":{"type":"number"},"type":"array"},"name":{"description":"A color scheme name for ordinal scales (e.g., `\\"category10\\"` or `\\"blues\\"`).\\n\\nFor the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference.","type":"string"}},"required":["name"],"type":"object"},"SecondaryChromPosDef":{"additionalProperties":false,"properties":{"axis":{"anyOf":[{"$ref":"#/definitions/GenomeAxis"},{"type":"null"}],"description":"An object defining properties of axis\'s gridlines, ticks and labels. If `null`, the axis for the encoding channel will be removed.\\n\\n__Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied.\\n\\n__See also:__ [`axis`](https://vega.github.io/vega-lite/docs/axis.html) documentation."},"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"chrom":{"$ref":"#/definitions/FieldName","description":"The field having the chromosome or contig."},"offset":{"description":"An offset or offsets that allow for adjusting the numbering base. The offset is subtracted from the positions.\\n\\nGenomeSpy uses internally zero-based indexing with half-open intervals. UCSC-based formats (BED, etc.) generally use this scheme. However, for example, VCF files use one-based indexing and must be adjusted by setting the offset to `1`.\\n\\n**Default:** `0`","type":"number"},"pos":{"$ref":"#/definitions/FieldName","description":"The field having an intra-chromosomal position."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"required":["chrom"],"type":"object"},"SecondaryPositionalChannel":{"enum":["x2","y2"],"type":"string"},"SelectionFilterParams":{"additionalProperties":false,"properties":{"empty":{"description":"If true, the filter retains all data objects when the selection is empty.\\n\\n**Default:** `true`","type":"boolean"},"param":{"description":"A selection parameter. The data object is removed if it is not part of the selection.","type":"string"},"type":{"const":"filter","description":"The type of the transform to be applied","type":"string"}},"required":["param","type"],"type":"object"},"SelectionParameter":{"additionalProperties":false,"properties":{"name":{"description":"A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \\"$\\", or \\"_\\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \\"datum\\".","type":"string"},"push":{"const":"outer","type":"string"},"select":{"anyOf":[{"$ref":"#/definitions/SelectionType"},{"$ref":"#/definitions/PointSelectionConfig"},{"$ref":"#/definitions/IntervalSelectionConfig"}],"description":"Determines the default event processing and data query for the selection. Vega-Lite currently supports two selection types:\\n\\n- `\\"point\\"` -- to select multiple discrete data values; the first value is selected on `click` and additional values toggled on shift-click.\\n- `\\"interval\\"` -- to select a continuous range of data values on `drag`."}},"required":["name","select"],"type":"object"},"SelectionType":{"enum":["point","interval"],"type":"string"},"SequenceGenerator":{"additionalProperties":false,"properties":{"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"sequence":{"$ref":"#/definitions/SequenceParams","description":"Generate a sequence of numbers."}},"required":["sequence"],"type":"object"},"SequenceParams":{"additionalProperties":false,"properties":{"as":{"anyOf":[{"$ref":"#/definitions/FieldName"},{"$ref":"#/definitions/ExprRef"}],"description":"The name of the generated sequence field.\\n\\n__Default value:__ `\\"data\\"`"},"start":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The starting value of the sequence (inclusive)."},"step":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The step value between sequence entries.\\n\\n__Default value:__ `1`"},"stop":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The ending value of the sequence (exclusive)."}},"required":["start","stop"],"type":"object"},"ShapeDef":{"$ref":"#/definitions/MarkPropDef%3C(string%7Cnull)%2CTypeForShape%3E"},"SizeDef":{"additionalProperties":false,"properties":{"grow":{"description":"Share of the remaining space. See [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.","type":"number"},"px":{"description":"Size in pixels","type":"number"}},"type":"object"},"SortOrder":{"enum":["ascending","descending"],"type":"string"},"StackParams":{"additionalProperties":false,"properties":{"as":{"description":"Fields to write the stacked values.\\n\\n**Default:** `[\\"y0\\", \\"y1\\"]`","items":{"type":"string"},"type":"array"},"baseField":{"$ref":"#/definitions/Field","description":"The field that contains the base or amino acid. Used for information content calculation when the offset is `\\"information\\"`. The data objects that have `null` in the baseField are considered gaps and they are taken into account when scaling the the locus\' information content."},"cardinality":{"description":"Cardinality, e.g., the number if distinct bases or amino acids. Used for information content calculation when the offset is `\\"information\\"`.\\n\\n**Default:** `4`","type":"number"},"field":{"$ref":"#/definitions/Field","description":"The field to stack. If no field is defined, a constant value of one is assumed."},"groupby":{"description":"The fields to be used for forming groups for different stacks.","items":{"$ref":"#/definitions/Field"},"type":"array"},"offset":{"description":"How to offset the values in a stack. `\\"zero\\"` (default) starts stacking at 0. `\\"center\\"` centers the values around zero. `\\"normalize\\"` computes intra-stack percentages and normalizes the values to the range of `[0, 1]`. `\\"information\\"` computes a layout for a sequence logo. The total height of the stack reflects the group\'s information content.","enum":["zero","center","normalize","information"],"type":"string"},"sort":{"$ref":"#/definitions/CompareParams","description":"The sort order of data in each stack."},"type":{"const":"stack","description":"The type of the transform to be applied","type":"string"}},"required":["as","groupby","type"],"type":"object"},"Step":{"additionalProperties":false,"properties":{"step":{"type":"number"}},"required":["step"],"type":"object"},"StringDatumDef":{"additionalProperties":false,"properties":{"band":{"description":"Relative position on band scale. For example, the marks will be positioned at the beginning of the band if set to `0`, and at the middle of the band if set to `0.5`.","maximum":1,"minimum":0,"type":"number"},"contributesToScaleDomain":{"description":"Whether the field or evaluated expr should be included in the scale\'s domain.\\n\\n**Default value:** `true`","type":"boolean"},"datum":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in data domain."},"format":{"description":"When used with the default `\\"number\\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\\n\\n- If the format type is `\\"number\\"` (e.g., for quantitative fields), this is D3\'s [number format pattern](https://github.com/d3/d3-format#locale_format).\\n\\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.","type":"string"},"resolutionChannel":{"$ref":"#/definitions/ChannelWithScale","description":"An alternative channel for scale resolution.\\n\\nThis is mainly for internal use and allows using `color` channel to resolve `fill` and `stroke` channels under certain circumstances."},"scale":{"anyOf":[{"$ref":"#/definitions/Scale"},{"type":"null"}],"description":"An object defining properties of the channel\'s scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels.\\n\\nIf `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable).\\n\\n__Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied.\\n\\n__See also:__ [`scale`](https://vega.github.io/vega-lite/docs/scale.html) documentation."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"type":{"$ref":"#/definitions/Type"}},"type":"object"},"StringFieldDef":{"additionalProperties":false,"properties":{"field":{"description":"__Required.__ A string defining the name of the field from which to pull a data value or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator.\\n\\n__See also:__ [`field`](https://vega.github.io/vega-lite/docs/field.html) documentation.\\n\\n__Notes:__ 1) Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `\\"field\\": \\"foo.bar\\"` and `\\"field\\": \\"foo[\'bar\']\\"`). If field names contain dots or brackets but are not nested, you can use `\\\\\\\\` to escape dots and brackets (e.g., `\\"a\\\\\\\\.b\\"` and `\\"a\\\\\\\\[0\\\\\\\\]\\"`). See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). 2) `field` is not required if `aggregate` is `count`.","type":"string"},"format":{"description":"When used with the default `\\"number\\"` format type, the text formatting pattern for labels of guides (axes, legends, headers) and text marks.\\n\\n- If the format type is `\\"number\\"` (e.g., for quantitative fields), this is D3\'s [number format pattern](https://github.com/d3/d3-format#locale_format).\\n\\nSee the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more examples.","type":"string"},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]}},"type":"object"},"TemplateImport":{"additionalProperties":false,"properties":{"template":{"description":"Imports a specification from the current view hierarchy, searching first in the current view, then ascending through ancestors.","type":"string"}},"required":["template"],"type":"object"},"TextDef":{"anyOf":[{"$ref":"#/definitions/StringFieldDef"},{"$ref":"#/definitions/StringDatumDef"},{"$ref":"#/definitions/ExprDef"}]},"TextProps":{"additionalProperties":false,"properties":{"align":{"$ref":"#/definitions/Align","description":"The horizontal alignment of the text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`.\\n\\n**Default value:** `\\"left\\"`"},"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The rotation angle in degrees.\\n\\n**Default value:** `0`"},"baseline":{"$ref":"#/definitions/Baseline","description":"The vertical alignment of the text. One of `\\"top\\"`, `\\"middle\\"`, `\\"bottom\\"`.\\n\\n**Default value:** `\\"bottom\\"`"},"clip":{"anyOf":[{"type":"boolean"},{"const":"never","type":"string"}],"description":"If true, the mark is clipped to the UnitView\'s rectangle. By default, clipping is enabled for marks that have zoomable positional scales."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Color of the mark. Affects either `fill` or `stroke`, depending on the `filled` property."},"dx":{"description":"The horizontal offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.","type":"number"},"dy":{"description":"The vertical offset between the text and its anchor point, in pixels. Applied after the rotation by `angle`.","type":"number"},"fitToBand":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, sets the secondary positional channel that allows the text to be squeezed (see the `squeeze` property). Can be used when: 1) `\\"band\\"`, `\\"index\\"`, or `\\"locus\\"` scale is being used and 2) only the primary positional channel is specified.\\n\\n**Default value:** `false`"},"flushX":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, the text is kept inside the viewport when the range of `x` and `x2` intersect the viewport."},"flushY":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If true, the text is kept inside the viewport when the range of `y` and `y2` intersect the viewport."},"font":{"description":"The font typeface. GenomeSpy uses [SDF](https://github.com/Chlumsky/msdfgen) versions of [Google Fonts](https://fonts.google.com/). Check their availability at the [A-Frame Fonts](https://github.com/etiennepinchon/aframe-fonts/tree/master/fonts) repository. System fonts are **not** supported.\\n\\n**Default value:** `\\"Lato\\"`","type":"string"},"fontStyle":{"$ref":"#/definitions/FontStyle","description":"The font style. Valid values: `\\"normal\\"` and `\\"italic\\"`.\\n\\n**Default value:** `\\"normal\\"`"},"fontWeight":{"$ref":"#/definitions/FontWeight","description":"The font weight. The following strings and numbers are valid values: `\\"thin\\"` (`100`), `\\"light\\"` (`300`), `\\"regular\\"` (`400`), `\\"normal\\"` (`400`), `\\"medium\\"` (`500`), `\\"bold\\"` (`700`), `\\"black\\"` (`900`)\\n\\n**Default value:** `\\"regular\\"`"},"logoLetters":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"Stretch letters so that they can be used with [sequence logos](https://en.wikipedia.org/wiki/Sequence_logo), etc..."},"minBufferSize":{"description":"Minimum size for WebGL buffers (number of data items). Allows for using `bufferSubData()` to update graphics.\\n\\nThis property is intended for internal use.","type":"number"},"opacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Opacity of the mark. Affects `fillOpacity` or `strokeOpacity`, depending on the `filled` property."},"paddingX":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The horizontal padding, in pixels, when the `x2` channel is used for ranged text.\\n\\n**Default value:** `0`"},"paddingY":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The vertical padding, in pixels, when the `y2` channel is used for ranged text.\\n\\n**Default value:** `0`"},"size":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The font size in pixels.\\n\\n**Default value:** `11`"},"squeeze":{"anyOf":[{"type":"boolean"},{"$ref":"#/definitions/ExprRef"}],"description":"If the `squeeze` property is true and secondary positional channels (`x2` and/or `y2`) are used, the text is scaled to fit mark\'s width and/or height.\\n\\n**Default value:** `true`"},"text":{"anyOf":[{"$ref":"#/definitions/Scalar"},{"$ref":"#/definitions/ExprRef"}],"description":"The text to display. The format of numeric data can be customized by setting a [format specifier](https://github.com/d3/d3-format#locale_format) to channel definition\'s `format` property.\\n\\n**Default value:** `\\"\\"`"},"tooltip":{"$ref":"#/definitions/Tooltip","description":"Tooltip handler. If `null`, no tooltip is shown. If string, specifies the [tooltip handler](https://genomespy.app/docs/api/#custom-tooltip-handlers) to use."},"type":{"const":"text","type":"string"},"viewportEdgeFadeDistanceBottom":{"type":"number"},"viewportEdgeFadeDistanceLeft":{"type":"number"},"viewportEdgeFadeDistanceRight":{"type":"number"},"viewportEdgeFadeDistanceTop":{"type":"number"},"viewportEdgeFadeWidthBottom":{"type":"number"},"viewportEdgeFadeWidthLeft":{"type":"number"},"viewportEdgeFadeWidthRight":{"type":"number"},"viewportEdgeFadeWidthTop":{"type":"number"},"x":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the x axis."},"x2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the x axis."},"xOffset":{"description":"Offsets of the `x` and `x2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"},"y":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Position on the y axis."},"y2":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The secondary position on the y axis."},"yOffset":{"description":"Offsets of the `y` and `y2` coordinates in pixels. The offset is applied after the viewport scaling and translation.\\n\\n**Default value:** `0`","type":"number"}},"required":["type"],"type":"object"},"Title":{"additionalProperties":false,"properties":{"align":{"$ref":"#/definitions/Align","description":"Horizontal text alignment for title text. One of `\\"left\\"`, `\\"center\\"`, or `\\"right\\"`."},"anchor":{"$ref":"#/definitions/TitleAnchor","description":"The anchor position for placing the title and subtitle text. One of `\\"start\\"`, `\\"middle\\"`, or `\\"end\\"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title."},"angle":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Angle in degrees of title and subtitle text."},"baseline":{"$ref":"#/definitions/Baseline","description":"Vertical text baseline for title and subtitle text. One of `\\"alphabetic\\"` (default), `\\"top\\"`, `\\"middle\\"`, or `\\"bottom\\"`."},"color":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"Text color for title text."},"dx":{"description":"Delta offset for title and subtitle text x-coordinate.","type":"number"},"dy":{"description":"Delta offset for title and subtitle text y-coordinate.","type":"number"},"font":{"description":"Font name for title text.","type":"string"},"fontSize":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Font size in pixels for title text.","minimum":0},"fontStyle":{"$ref":"#/definitions/FontStyle","description":"Font style for title text."},"fontWeight":{"$ref":"#/definitions/FontWeight","description":"Font weight for title text. This can be either a string (e.g `\\"bold\\"`, `\\"normal\\"`) or a number (`100`, `200`, `300`, ..., `900` where `\\"normal\\"` = `400` and `\\"bold\\"` = `700`)."},"frame":{"$ref":"#/definitions/TitleFrame","description":"The reference frame for the anchor position, one of `\\"bounds\\"` (to anchor relative to the full bounding box) or `\\"group\\"` (to anchor relative to the group width or height)."},"offset":{"description":"The orthogonal offset in pixels by which to displace the title group from its position along the edge of the chart.","type":"number"},"orient":{"$ref":"#/definitions/TitleOrient","description":"Default title orientation (`\\"none\\"`, `\\"top\\"`, `\\"bottom\\"`, `\\"left\\"`, or `\\"right\\"`)"},"style":{"description":"A mark style property to apply to the title text mark. If not specified, a default style of `\\"group-title\\"` is applied.","type":"string"},"text":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The title text."}},"required":["text"],"type":"object"},"TitleAnchor":{"enum":[null,"start","middle","end"],"type":["null","string"]},"TitleFrame":{"enum":["bounds","group"],"type":"string"},"TitleOrient":{"enum":["none","left","right","top","bottom"],"type":"string"},"Tooltip":{"anyOf":[{"$ref":"#/definitions/HandledTooltip"},{"type":"null"}]},"TransformParams":{"anyOf":[{"$ref":"#/definitions/AggregateParams"},{"$ref":"#/definitions/CollectParams"},{"$ref":"#/definitions/CoverageParams"},{"$ref":"#/definitions/FlattenDelimitedParams"},{"$ref":"#/definitions/FormulaParams"},{"$ref":"#/definitions/FilterParams"},{"$ref":"#/definitions/FilterScoredLabelsParams"},{"$ref":"#/definitions/FlattenParams"},{"$ref":"#/definitions/FlattenCompressedExonsParams"},{"$ref":"#/definitions/FlattenSequenceParams"},{"$ref":"#/definitions/IdentifierParams"},{"$ref":"#/definitions/LinearizeGenomicCoordinateParams"},{"$ref":"#/definitions/MeasureTextParams"},{"$ref":"#/definitions/MergeFacetsParams"},{"$ref":"#/definitions/PileupParams"},{"$ref":"#/definitions/ProjectParams"},{"$ref":"#/definitions/RegexExtractParams"},{"$ref":"#/definitions/RegexFoldParams"},{"$ref":"#/definitions/SampleParams"},{"$ref":"#/definitions/StackParams"}]},"Type":{"enum":["quantitative","ordinal","nominal","index","locus"],"type":"string"},"TypeForShape":{"enum":["ordinal","nominal"],"type":"string"},"UnitSpec":{"additionalProperties":false,"properties":{"aggregateSamples":{"description":"Specifies views that [aggregate](https://genomespy.app/docs/sample-collections/visualizing/#aggregation) multiple samples within the GenomeSpy App.","items":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"}]},"type":"array"},"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"mark":{"anyOf":[{"$ref":"#/definitions/MarkType"},{"$ref":"#/definitions/MarkProps"}],"description":"The graphical mark presenting the data objects."},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"opacity":{"$ref":"#/definitions/ViewOpacityDef","description":"Opacity of the view and all its children. Allows implementing semantic zooming where the layers are faded in and out as the user zooms in and out.\\n\\nTODO: Write proper documentation with examples.\\n\\n**Default:** `1.0`"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"view":{"$ref":"#/definitions/ViewBackground","description":"The background of the view, including fill, stroke, and stroke width."},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["mark"],"type":"object"},"UrlData":{"additionalProperties":false,"properties":{"format":{"$ref":"#/definitions/DataFormat","description":"An object that specifies the format for parsing the data."},"name":{"description":"Provide a placeholder name and bind data at runtime.","type":"string"},"url":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"$ref":"#/definitions/ExprRef"}],"description":"An URL or an array of URLs from which to load the data set. Use the `format.type` property to ensure the loaded data is correctly parsed."}},"required":["url"],"type":"object"},"UrlGenomeConfig":{"additionalProperties":false,"properties":{"name":{"description":"Name of the genome assembly, e.g., `hg19` or `hg38`.","type":"string"},"url":{"description":"A URL to a `chrom.sizes` file, which is a tab-separated file with two columns: the sequence name and its size.\\n\\nYou may want to strip alternative loci, haplotypes, and other non-canonical contigs from the file.\\n\\nExample: `\\"https://genomespy.app/data/genomes/hg19/chrom.sizes\\"`","type":"string"}},"required":["name","url"],"type":"object"},"UrlImport":{"additionalProperties":false,"properties":{"url":{"description":"Imports a specification from the specified URL.","type":"string"}},"required":["url"],"type":"object"},"VConcatSpec":{"additionalProperties":false,"properties":{"baseUrl":{"description":"The base URL for relative URL data sources and URL [imports](https://genomespy.app/docs/grammar/import/#importing-from-a-url). The base URLs are inherited in the view hierarchy unless overridden with this property. By default, the top-level view\'s base URL equals to the visualization specification\'s base URL.","type":"string"},"configurableVisibility":{"description":"Is the visibility configurable interactively from the [GenomeSpy App](https://genomespy.app/docs/sample-collections/). Configurability requires that the view has an explicitly specified name that is *unique* in within the view hierarchy.\\n\\n**Default:** `false` for children of `layer`, `true` for others.","type":"boolean"},"data":{"$ref":"#/definitions/Data","description":"Specifies a [data source](https://genomespy.app/docs/grammar/data/). If omitted, the data source is inherited from the parent view."},"description":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"description":"A description of the view. Can be used for documentation. The description of the top-level view is shown in the toolbar of the [GenomeSpy App](https://genomespy.app/docs/sample-collections/)."},"encoding":{"$ref":"#/definitions/Encoding","description":"Specifies how data are [encoded](https://genomespy.app/docs/grammar/mark/#encoding) using the visual channels."},"height":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Height of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default value:** `\\"container\\"`"},"name":{"description":"An internal name that can be used for referring the view. For referencing purposes, the name should be unique within the view hierarchy.","type":"string"},"padding":{"$ref":"#/definitions/PaddingConfig","description":"Padding applied to the view. Accepts either a number representing pixels or an object specifying separate paddings for each edge.\\n\\nExamples:\\n- `padding: 10`\\n- `padding: { top: 10, right: 20, bottom: 10, left: 20 }`\\n\\n**Default value:** `0`"},"params":{"description":"Dynamic variables that [parameterize](https://genomespy.app/docs/grammar/parameters/) a visualization.","items":{"$ref":"#/definitions/Parameter"},"type":"array"},"resolve":{"additionalProperties":false,"description":"Specifies how scales and axes are [resolved](https://genomespy.app/docs/grammar/composition/#scale-and-axis-resolution) in the view hierarchy.","properties":{"axis":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"},"scale":{"additionalProperties":{"$ref":"#/definitions/ResolutionBehavior"},"properties":{"default":{"$ref":"#/definitions/ResolutionBehavior"}},"type":"object"}},"type":"object"},"spacing":{"description":"The gap between the views, in pixels.","type":"number"},"templates":{"additionalProperties":{"$ref":"#/definitions/ViewSpec"},"description":"[Templates](https://genomespy.app/docs/grammar/import/#repeating-with-named-templates) that can be reused within the view specification by importing them with the template key.","type":"object"},"title":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Title"}],"description":"View title. N.B.: Currently, GenomeSpy doesn\'t do bound calculation, and you need to manually specify proper padding for the view to ensure that the title is visible."},"transform":{"description":"An array of [transformations](https://genomespy.app/docs/grammar/transform/) applied to the data before visual encoding.","items":{"$ref":"#/definitions/TransformParams"},"type":"array"},"vconcat":{"description":"Specifies views that will be concatenated vertically.","items":{"anyOf":[{"$ref":"#/definitions/ViewSpec"},{"$ref":"#/definitions/ImportSpec"}]},"type":"array"},"viewportHeight":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport height of the view. If the view size exceeds the viewport height, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `height`)"},"viewportWidth":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"const":"container","type":"string"}],"description":"Optional viewport width of the view. If the view size exceeds the viewport width, it will be shown with [scrollbars](https://genomespy.app/docs/grammar/composition/concat/#scrollable-viewports). This property implicitly enables clipping.\\n\\n**Default:** `null` (same as `width`)"},"visible":{"description":"The default visibility of the view. An invisible view is removed from the layout and not rendered. For context, see [toggleable view visibility](https://genomespy.app/docs/sample-collections/visualizing/#toggleable-view-visibility).\\n\\n**Default:** `true`","type":"boolean"},"width":{"anyOf":[{"$ref":"#/definitions/SizeDef"},{"type":"number"},{"$ref":"#/definitions/Step"},{"const":"container","type":"string"}],"description":"Width of the view. If a number, it is interpreted as pixels. Check [child sizing](https://genomespy.app/docs/grammar/composition/concat/#child-sizing) for details.\\n\\n**Default:** `\\"container\\"`"}},"required":["vconcat"],"type":"object"},"ValueDef":{"additionalProperties":false,"properties":{"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"required":["value"],"type":"object"},"ValueDefWithCondition<(string|null)>":{"additionalProperties":false,"minProperties":1,"properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CFieldDef%3E"},{"$ref":"#/definitions/Conditional%3CDatumDef%3E"},{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(string%7Cnull%7CExprRef)%3E%3E"},"type":"array"}],"description":"A field definition or one or more value definition(s) with a parameter predicate."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"string"},{"type":"null"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"type":"object"},"ValueDefWithCondition":{"additionalProperties":false,"minProperties":1,"properties":{"condition":{"anyOf":[{"$ref":"#/definitions/Conditional%3CFieldDef%3E"},{"$ref":"#/definitions/Conditional%3CDatumDef%3E"},{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},{"items":{"$ref":"#/definitions/Conditional%3CValueDef%3C(number%7CExprRef)%3E%3E"},"type":"array"}],"description":"A field definition or one or more value definition(s) with a parameter predicate."},"title":{"description":"A title for the field. If `null`, the title will be removed.","type":["string","null"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"A constant value in visual domain (e.g., `\\"red\\"` / `\\"#0099ff\\"`, values between `0` to `1` for opacity)."}},"type":"object"},"VariableParameter":{"additionalProperties":false,"properties":{"bind":{"$ref":"#/definitions/Binding","description":"Binds the parameter to an external input element such as a slider, selection list or radio button group."},"expr":{"description":"An expression for the value of the parameter. This expression may include other parameters, in which case the parameter will automatically update in response to upstream parameter changes.","type":"string"},"name":{"description":"A unique name for the variable parameter. Parameter names should be valid JavaScript identifiers: they should contain only alphanumeric characters (or \\"$\\", or \\"_\\") and may not start with a digit. Reserved keywords that may not be used as parameter names are: \\"datum\\".","type":"string"},"push":{"const":"outer","type":"string"},"value":{"description":"The [initial value](http://vega.github.io/vega-lite/docs/value.html) of the parameter.\\n\\n__Default value:__ `undefined`"}},"required":["name"],"type":"object"},"VcfData":{"additionalProperties":false,"properties":{"addChrPrefix":{"description":"Add a `chr` (boolean) or custom (string) prefix to the chromosome names in the Tabix file.\\n\\n__Default value:__ `false`","type":["boolean","string"]},"channel":{"$ref":"#/definitions/PrimaryPositionalChannel","description":"Which channel\'s scale domain to monitor.\\n\\n__Default value:__ `\\"x\\"`"},"debounce":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"Debounce time for data updates, in milliseconds. Debouncing prevents excessive data updates when the user is zooming or panning around.\\n\\n__Default value:__ `200`"},"debounceMode":{"description":"The debounce mode for data updates. If set to `\\"domain\\"`, domain change events (panning and zooming) will be debounced. If set to `\\"window\\"`, the data fetches initiated by the changes to the visible window (or tile) will be debounced. If your data is small, the `\\"window\\"` is better as it will start fetching data while the user is still panning around, resulting in a shorter perceived latency.\\n\\n__Default value:__ `\\"window\\"`","enum":["domain","window"],"type":"string"},"indexUrl":{"description":"Url of the tabix index file.\\n\\n__Default value:__ `url` + `\\".tbi\\"`.","type":"string"},"type":{"const":"vcf","type":"string"},"url":{"description":"Url of the bgzip compressed file.","type":"string"},"windowSize":{"description":"Size of each chunk when fetching the Tabix file. Data is only fetched when the length of the visible domain smaller than the window size.\\n\\n__Default value:__ `30000000`","type":"number"}},"required":["type","url"],"type":"object"},"ViewBackground":{"additionalProperties":false,"properties":{"fill":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill color."},"fillOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The fill opacity. Value between `0` and `1`."},"stroke":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke color"},"strokeOpacity":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/ExprRef"}],"description":"The stroke opacity. Value between `0` and `1`."},"strokeWidth":{"description":"The stroke width in pixels.","type":"number"}},"type":"object"},"ViewOpacityDef":{"anyOf":[{"type":"number"},{"$ref":"#/definitions/DynamicOpacity"},{"$ref":"#/definitions/ExprRef"}]},"ViewSpec":{"anyOf":[{"$ref":"#/definitions/UnitSpec"},{"$ref":"#/definitions/LayerSpec"},{"$ref":"#/definitions/VConcatSpec"},{"$ref":"#/definitions/HConcatSpec"},{"$ref":"#/definitions/ConcatSpec"},{"$ref":"#/definitions/SampleSpec"}]},"ZoomParams":{"additionalProperties":false,"properties":{"extent":{"anyOf":[{"$ref":"#/definitions/ScalarDomain"},{"$ref":"#/definitions/ComplexDomain"}],"description":"The boundaries that limit the zoom and pan interactions."}},"type":"object"}}'),lB={$ref:MNe,$schema:PNe,definitions:ONe},FNe="@genome-spy/playground",BNe="0.58.1",WNe="A playground for testing GenomeSpy visualizations",VNe="module",zNe={dev:"vite",build:"vite build",serve:"vite preview"},HNe="Kari Lavikka",$Ne="MIT",UNe={"@fortawesome/fontawesome-free":"^6.1.1","@fortawesome/fontawesome-svg-core":"^6.1.1","@fortawesome/free-solid-svg-icons":"^6.1.1","@genome-spy/core":"^0.58.1",lit:"^3.1.2","monaco-editor":"^0.44.0",prettier:"^3.4.1","vega-loader":"^4.4.0"},cB={name:FNe,private:!0,version:BNe,description:WNe,type:VNe,scripts:zNe,author:HNe,license:$Ne,dependencies:UNe};var Ym,jK,qK;class CR extends zh{constructor(){super();Me(this,Ym);this.orientation="horizontal",this.reverse=!1}render(){return St`
${xe(this,Ym,jK).call(this)}
`}}Ym=new WeakSet,jK=function(){const t=Array.from(this.children);return Array.from(this.reverse?t.reverse():t).map((i,s)=>St`
{if(e&&typeof e=="object"||typeof e=="function")for(let s of GNe(e))!KNe.call(n,s)&&s!==t&&jNe(n,s,{get:()=>e[s],enumerable:!(i=qNe(e,s))||i.enumerable});return n},ZNe=(n,e,t)=>(YNe(n,e,"default"),t),_y={};ZNe(_y,RNe);var XNe=class{constructor(n,e,t){Ei(this,"_onDidChange",new _y.Emitter);Ei(this,"_diagnosticsOptions");Ei(this,"_modeConfiguration");Ei(this,"_languageId");this._languageId=n,this.setDiagnosticsOptions(e),this.setModeConfiguration(t)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(n){this._diagnosticsOptions=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},QNe={validate:!0,allowComments:!0,schemas:[],enableSchemaRequest:!1,schemaRequest:"warning",schemaValidation:"warning",comments:"error",trailingCommas:"error"},JNe={documentFormattingEdits:!0,documentRangeFormattingEdits:!0,completionItems:!0,hovers:!0,documentSymbols:!0,tokens:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0},GK=new XNe("json",QNe,JNe);_y.languages.json={jsonDefaults:GK};function eRe(){return Zn(()=>import("./jsonMode-CGDzc0v3.js"),[],import.meta.url)}_y.languages.register({id:"json",extensions:[".json",".bowerrc",".jshintrc",".jscsrc",".eslintrc",".babelrc",".har"],aliases:["JSON","json"],mimetypes:["application/json"]});_y.languages.onLanguage("json",()=>{eRe().then(n=>n.setupMode(GK))});const tRe={0:" ",1:"u",2:"r"},dB=65535,jr=16777215,uB=4278190080;class mE{constructor(e){const t=Math.ceil(e/32);this._states=new Uint32Array(t)}get(e){const t=e/32|0,i=e%32;return(this._states[t]&1<dB)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=e,this._endIndexes=t,this._collapseStates=new mE(e.length),this._userDefinedStates=new mE(e.length),this._recoveredStates=new mE(e.length),this._types=i,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;const e=[],t=(i,s)=>{const o=e[e.length-1];return this.getStartLineNumber(o)<=i&&this.getEndLineNumber(o)>=s};for(let i=0,s=this._startIndexes.length;ijr||r>jr)throw new Error("startLineNumber or endLineNumber must not exceed "+jr);for(;e.length>0&&!t(o,r);)e.pop();const a=e.length>0?e[e.length-1]:-1;e.push(i),this._startIndexes[i]=o+((a&255)<<24),this._endIndexes[i]=r+((a&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(e){return this._startIndexes[e]&jr}getEndLineNumber(e){return this._endIndexes[e]&jr}getType(e){return this._types?this._types[e]:void 0}hasTypes(){return!!this._types}isCollapsed(e){return this._collapseStates.get(e)}setCollapsed(e,t){this._collapseStates.set(e,t)}isUserDefined(e){return this._userDefinedStates.get(e)}setUserDefined(e,t){return this._userDefinedStates.set(e,t)}isRecovered(e){return this._recoveredStates.get(e)}setRecovered(e,t){return this._recoveredStates.set(e,t)}getSource(e){return this.isUserDefined(e)?1:this.isRecovered(e)?2:0}setSource(e,t){t===1?(this.setUserDefined(e,!0),this.setRecovered(e,!1)):t===2?(this.setUserDefined(e,!1),this.setRecovered(e,!0)):(this.setUserDefined(e,!1),this.setRecovered(e,!1))}setCollapsedAllOfType(e,t){let i=!1;if(this._types)for(let s=0;s>>24)+((this._endIndexes[e]&uB)>>>16);return t===dB?-1:t}contains(e,t){return this.getStartLineNumber(e)<=t&&this.getEndLineNumber(e)>=t}findIndex(e){let t=0,i=this._startIndexes.length;if(i===0)return-1;for(;t=0){if(this.getEndLineNumber(t)>=e)return t;for(t=this.getParentIndex(t);t!==-1;){if(this.contains(t,e))return t;t=this.getParentIndex(t)}}return-1}toString(){const e=[];for(let t=0;tArray.isArray(p)?v=>v<_?p[v]:void 0:v=>v<_?p.toFoldRange(v):void 0,o=s(e,e.length),r=s(t,t.length);let a=0,l=0,c=o(0),d=r(0);const u=[];let h,f=0;const g=[];for(;c||d;){let p;if(d&&(!c||c.startLineNumber>=d.startLineNumber))c&&c.startLineNumber===d.startLineNumber?(d.source===1?p=d:(p=c,p.isCollapsed=d.isCollapsed&&c.endLineNumber===d.endLineNumber,p.source=0),c=o(++a)):(p=d,d.isCollapsed&&d.source===0&&(p.source=2)),d=r(++l);else{let _=l,v=d;for(;;){if(!v||v.startLineNumber>c.endLineNumber){p=c;break}if(v.source===1&&v.endLineNumber>c.endLineNumber)break;v=r(++_)}c=o(++a)}if(p){for(;h&&h.endLineNumberp.startLineNumber&&p.startLineNumber>f&&p.endLineNumber<=i&&(!h||h.endLineNumber>=p.endLineNumber)&&(g.push(p),f=p.startLineNumber,h&&u.push(h),h=p)}}return g}}class iRe{constructor(e,t){this.ranges=e,this.index=t}get startLineNumber(){return this.ranges.getStartLineNumber(this.index)}get endLineNumber(){return this.ranges.getEndLineNumber(this.index)}get regionIndex(){return this.index}get parentIndex(){return this.ranges.getParentIndex(this.index)}get isCollapsed(){return this.ranges.isCollapsed(this.index)}containedBy(e){return e.startLineNumber<=this.startLineNumber&&e.endLineNumber>=this.endLineNumber}containsLine(e){return this.startLineNumber<=e&&e<=this.endLineNumber}}class nRe{get regions(){return this._regions}get textModel(){return this._textModel}constructor(e,t){this._updateEventEmitter=new B,this.onDidChange=this._updateEventEmitter.event,this._textModel=e,this._decorationProvider=t,this._regions=new fo(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[]}toggleCollapseState(e){if(!e.length)return;e=e.sort((i,s)=>i.regionIndex-s.regionIndex);const t={};this._decorationProvider.changeDecorations(i=>{let s=0,o=-1,r=-1;const a=l=>{for(;sr&&(r=c),s++}};for(const l of e){const c=l.regionIndex,d=this._editorDecorationIds[c];if(d&&!t[d]){t[d]=!0,a(c);const u=!this._regions.isCollapsed(c);this._regions.setCollapsed(c,u),o=Math.max(o,this._regions.getEndLineNumber(c))}}a(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:e})}removeManualRanges(e){const t=new Array,i=s=>{for(const o of e)if(!(o.startLineNumber>s.endLineNumber||s.startLineNumber>o.endLineNumber))return!0;return!1};for(let s=0;si&&(i=a)}this._decorationProvider.changeDecorations(s=>this._editorDecorationIds=s.deltaDecorations(this._editorDecorationIds,t)),this._regions=e,this._updateEventEmitter.fire({model:this})}_currentFoldedOrManualRanges(e=[]){const t=(s,o)=>{for(const r of e)if(s=r.endLineNumber||r.startLineNumber<1||r.endLineNumber>i)continue;const a=this._getLinesChecksum(r.startLineNumber+1,r.endLineNumber);t.push({startLineNumber:r.startLineNumber,endLineNumber:r.endLineNumber,isCollapsed:r.isCollapsed,source:r.source,checksum:a})}return t.length>0?t:void 0}applyMemento(e){var t,i;if(!Array.isArray(e))return;const s=[],o=this._textModel.getLineCount();for(const a of e){if(a.startLineNumber>=a.endLineNumber||a.startLineNumber<1||a.endLineNumber>o)continue;const l=this._getLinesChecksum(a.startLineNumber+1,a.endLineNumber);(!a.checksum||l===a.checksum)&&s.push({startLineNumber:a.startLineNumber,endLineNumber:a.endLineNumber,type:void 0,isCollapsed:(t=a.isCollapsed)!==null&&t!==void 0?t:!0,source:(i=a.source)!==null&&i!==void 0?i:0})}const r=fo.sanitizeAndMerge(this._regions,s,o);this.updatePost(fo.fromFoldRanges(r))}_getLinesChecksum(e,t){return Q0e(this._textModel.getLineContent(e)+this._textModel.getLineContent(t))%1e6}dispose(){this._decorationProvider.removeDecorations(this._editorDecorationIds)}getAllRegionsAtLine(e,t){const i=[];if(this._regions){let s=this._regions.findRange(e),o=1;for(;s>=0;){const r=this._regions.toRegion(s);(!t||t(r,o))&&i.push(r),o++,s=r.parentIndex}}return i}getRegionAtLine(e){if(this._regions){const t=this._regions.findRange(e);if(t>=0)return this._regions.toRegion(t)}return null}getRegionsInside(e,t){const i=[],s=e?e.regionIndex+1:0,o=e?e.endLineNumber:Number.MAX_VALUE;if(t&&t.length===2){const r=[];for(let a=s,l=this._regions.length;a0&&!c.containedBy(r[r.length-1]);)r.pop();r.push(c),t(c,r.length)&&i.push(c)}else break}}else for(let r=s,a=this._regions.length;r0)for(const o of i){const r=n.getRegionAtLine(o);if(r&&(r.isCollapsed!==e&&s.push(r),t>1)){const a=n.getRegionsInside(r,(l,c)=>l.isCollapsed!==e&&cr.isCollapsed!==e&&aa.isCollapsed!==e&&l<=t);s.push(...r)}n.toggleCollapseState(s)}function oRe(n,e,t){const i=[];for(const s of t){const o=n.getAllRegionsAtLine(s,r=>r.isCollapsed!==e);o.length>0&&i.push(o[0])}n.toggleCollapseState(i)}function rRe(n,e,t,i){const s=(r,a)=>a===e&&r.isCollapsed!==t&&!i.some(l=>r.containsLine(l)),o=n.getRegionsInside(null,s);n.toggleCollapseState(o)}function YK(n,e,t){const i=[];for(const r of t){const a=n.getAllRegionsAtLine(r,void 0);a.length>0&&i.push(a[0])}const s=r=>i.every(a=>!a.containedBy(r)&&!r.containedBy(a))&&r.isCollapsed!==e,o=n.getRegionsInside(null,s);n.toggleCollapseState(o)}function F5(n,e,t){const i=n.textModel,s=n.regions,o=[];for(let r=s.length-1;r>=0;r--)if(t!==s.isCollapsed(r)){const a=s.getStartLineNumber(r);e.test(i.getLineContent(a))&&o.push(s.toRegion(r))}n.toggleCollapseState(o)}function B5(n,e,t){const i=n.regions,s=[];for(let o=i.length-1;o>=0;o--)t!==i.isCollapsed(o)&&e===i.getType(o)&&s.push(i.toRegion(o));n.toggleCollapseState(s)}function aRe(n,e){let t=null;const i=e.getRegionAtLine(n);if(i!==null&&(t=i.startLineNumber,n===t)){const s=i.parentIndex;s!==-1?t=e.regions.getStartLineNumber(s):t=null}return t}function lRe(n,e){let t=e.getRegionAtLine(n);if(t!==null&&t.startLineNumber===n){if(n!==t.startLineNumber)return t.startLineNumber;{const i=t.parentIndex;let s=0;for(i!==-1&&(s=e.regions.getStartLineNumber(t.parentIndex));t!==null;)if(t.regionIndex>0){if(t=e.regions.toRegion(t.regionIndex-1),t.startLineNumber<=s)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}}else if(e.regions.length>0)for(t=e.regions.toRegion(e.regions.length-1);t!==null;){if(t.startLineNumber0?t=e.regions.toRegion(t.regionIndex-1):t=null}return null}function cRe(n,e){let t=e.getRegionAtLine(n);if(t!==null&&t.startLineNumber===n){const i=t.parentIndex;let s=0;if(i!==-1)s=e.regions.getEndLineNumber(t.parentIndex);else{if(e.regions.length===0)return null;s=e.regions.getEndLineNumber(e.regions.length-1)}for(;t!==null;)if(t.regionIndex=s)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}else if(e.regions.length>0)for(t=e.regions.toRegion(0);t!==null;){if(t.startLineNumber>n)return t.startLineNumber;t.regionIndexthis.updateHiddenRanges()),this._hiddenRanges=[],e.regions.length&&this.updateHiddenRanges()}notifyChangeModelContent(e){this._hiddenRanges.length&&!this._hasLineChanges&&(this._hasLineChanges=e.changes.some(t=>t.range.endLineNumber!==t.range.startLineNumber||Lf(t.text)[0]!==0))}updateHiddenRanges(){let e=!1;const t=[];let i=0,s=0,o=Number.MAX_VALUE,r=-1;const a=this._foldingModel.regions;for(;i0}isHidden(e){return hB(this._hiddenRanges,e)!==null}adjustSelections(e){let t=!1;const i=this._foldingModel.textModel;let s=null;const o=r=>((!s||!uRe(r,s))&&(s=hB(this._hiddenRanges,r)),s?s.startLineNumber-1:null);for(let r=0,a=e.length;r0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}function uRe(n,e){return n>=e.startLineNumber&&n<=e.endLineNumber}function hB(n,e){const t=Qb(n,i=>e=0&&n[t].endLineNumber>=e?n[t]:null}const hRe=5e3,fRe="indent";class ZK{constructor(e,t,i){this.editorModel=e,this.languageConfigurationService=t,this.foldingRangesLimit=i,this.id=fRe}dispose(){}compute(e){const t=this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules,i=t&&!!t.offSide,s=t&&t.markers;return Promise.resolve(mRe(this.editorModel,i,s,this.foldingRangesLimit))}}let gRe=class{constructor(e){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=e}insertFirst(e,t,i){if(e>jr||t>jr)return;const s=this._length;this._startIndexes[s]=e,this._endIndexes[s]=t,this._length++,i<1e3&&(this._indentOccurrences[i]=(this._indentOccurrences[i]||0)+1)}toIndentRanges(e){const t=this._foldingRangesLimit.limit;if(this._length<=t){this._foldingRangesLimit.update(this._length,!1);const i=new Uint32Array(this._length),s=new Uint32Array(this._length);for(let o=this._length-1,r=0;o>=0;o--,r++)i[r]=this._startIndexes[o],s[r]=this._endIndexes[o];return new fo(i,s)}else{this._foldingRangesLimit.update(this._length,t);let i=0,s=this._indentOccurrences.length;for(let l=0;lt){s=l;break}i+=c}}const o=e.getOptions().tabSize,r=new Uint32Array(t),a=new Uint32Array(t);for(let l=this._length-1,c=0;l>=0;l--){const d=this._startIndexes[l],u=e.getLineContent(d),h=_L(u,o);(h{}};function mRe(n,e,t,i=pRe){const s=n.getOptions().tabSize,o=new gRe(i);let r;t&&(r=new RegExp(`(${t.start.source})|(?:${t.end.source})`));const a=[],l=n.getLineCount()+1;a.push({indent:-1,endAbove:l,line:l});for(let c=n.getLineCount();c>0;c--){const d=n.getLineContent(c),u=_L(d,s);let h=a[a.length-1];if(u===-1){e&&(h.endAbove=c);continue}let f;if(r&&(f=d.match(r)))if(f[1]){let g=a.length-1;for(;g>0&&a[g].indent!==-2;)g--;if(g>0){a.length=g+1,h=a[g],o.insertFirst(c,h.line,u),h.line=c,h.indent=u,h.endAbove=c;continue}}else{a.push({indent:-2,endAbove:c,line:c});continue}if(h.indent>u){do a.pop(),h=a[a.length-1];while(h.indent>u);const g=h.endAbove-1;g-c>=1&&o.insertFirst(c,g,u)}h.indent===u?h.endAbove=c:a.push({indent:u,endAbove:c,line:c})}return o.toIndentRanges(n)}const _Re=E("editor.foldBackground",{light:we(fd,.3),dark:we(fd,.3),hcDark:null,hcLight:null},m("foldBackgroundBackground","Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."),!0);E("editorGutter.foldingControlForeground",{dark:hd,light:hd,hcDark:hd,hcLight:hd},m("editorGutter.foldingControlForeground","Color of the folding control in the editor gutter."));const W5=Zi("folding-expanded",se.chevronDown,m("foldingExpandedIcon","Icon for expanded ranges in the editor glyph margin.")),V5=Zi("folding-collapsed",se.chevronRight,m("foldingCollapsedIcon","Icon for collapsed ranges in the editor glyph margin.")),XK=Zi("folding-manual-collapsed",V5,m("foldingManualCollapedIcon","Icon for manually collapsed ranges in the editor glyph margin.")),QK=Zi("folding-manual-expanded",W5,m("foldingManualExpandedIcon","Icon for manually expanded ranges in the editor glyph margin.")),z5={color:sn(_Re),position:Zs.Inline};class Ai{constructor(e){this.editor=e,this.showFoldingControls="mouseover",this.showFoldingHighlights=!0}getDecorationOption(e,t,i){return t?Ai.HIDDEN_RANGE_DECORATION:this.showFoldingControls==="never"?e?this.showFoldingHighlights?Ai.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION:Ai.NO_CONTROLS_COLLAPSED_RANGE_DECORATION:Ai.NO_CONTROLS_EXPANDED_RANGE_DECORATION:e?i?this.showFoldingHighlights?Ai.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:Ai.MANUALLY_COLLAPSED_VISUAL_DECORATION:this.showFoldingHighlights?Ai.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:Ai.COLLAPSED_VISUAL_DECORATION:this.showFoldingControls==="mouseover"?i?Ai.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION:Ai.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:i?Ai.MANUALLY_EXPANDED_VISUAL_DECORATION:Ai.EXPANDED_VISUAL_DECORATION}changeDecorations(e){return this.editor.changeDecorations(e)}removeDecorations(e){this.editor.removeDecorations(e)}}Ai.COLLAPSED_VISUAL_DECORATION=Je.register({description:"folding-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(V5)});Ai.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Je.register({description:"folding-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(V5)});Ai.MANUALLY_COLLAPSED_VISUAL_DECORATION=Je.register({description:"folding-manually-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(XK)});Ai.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Je.register({description:"folding-manually-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(XK)});Ai.NO_CONTROLS_COLLAPSED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0});Ai.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0});Ai.EXPANDED_VISUAL_DECORATION=Je.register({description:"folding-expanded-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+Te.asClassName(W5)});Ai.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Je.register({description:"folding-expanded-auto-hide-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(W5)});Ai.MANUALLY_EXPANDED_VISUAL_DECORATION=Je.register({description:"folding-manually-expanded-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+Te.asClassName(QK)});Ai.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Je.register({description:"folding-manually-expanded-auto-hide-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(QK)});Ai.NO_CONTROLS_EXPANDED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,isWholeLine:!0});Ai.HIDDEN_RANGE_DECORATION=Je.register({description:"folding-hidden-range-decoration",stickiness:1});const bRe={},vRe="syntax";class JK{constructor(e,t,i,s,o){this.editorModel=e,this.providers=t,this.handleFoldingRangesChange=i,this.foldingRangesLimit=s,this.fallbackRangeProvider=o,this.id=vRe,this.disposables=new pe,o&&this.disposables.add(o);for(const r of t)typeof r.onDidChange=="function"&&this.disposables.add(r.onDidChange(i))}compute(e){return yRe(this.providers,this.editorModel,e).then(t=>{var i,s;return t?CRe(t,this.foldingRangesLimit):(s=(i=this.fallbackRangeProvider)===null||i===void 0?void 0:i.compute(e))!==null&&s!==void 0?s:null})}dispose(){this.disposables.dispose()}}function yRe(n,e,t){let i=null;const s=n.map((o,r)=>Promise.resolve(o.provideFoldingRanges(e,bRe,t)).then(a=>{if(!t.isCancellationRequested&&Array.isArray(a)){Array.isArray(i)||(i=[]);const l=e.getLineCount();for(const c of a)c.start>0&&c.end>c.start&&c.end<=l&&i.push({start:c.start,end:c.end,rank:r,kind:c.kind})}},wc));return Promise.all(s).then(o=>i)}class wRe{constructor(e){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=e}add(e,t,i,s){if(e>jr||t>jr)return;const o=this._length;this._startIndexes[o]=e,this._endIndexes[o]=t,this._nestingLevels[o]=s,this._types[o]=i,this._length++,s<30&&(this._nestingLevelCounts[s]=(this._nestingLevelCounts[s]||0)+1)}toIndentRanges(){const e=this._foldingRangesLimit.limit;if(this._length<=e){this._foldingRangesLimit.update(this._length,!1);const t=new Uint32Array(this._length),i=new Uint32Array(this._length);for(let s=0;se){i=a;break}t+=l}}const s=new Uint32Array(e),o=new Uint32Array(e),r=[];for(let a=0,l=0;a{let l=r.start-a.start;return l===0&&(l=r.rank-a.rank),l}),i=new wRe(e);let s;const o=[];for(const r of t)if(!s)s=r,i.add(r.start,r.end,r.kind&&r.kind.value,o.length);else if(r.start>s.start)if(r.end<=s.end)o.push(s),s=r,i.add(r.start,r.end,r.kind&&r.kind.value,o.length);else{if(r.start>s.end){do s=o.pop();while(s&&r.start>s.end);s&&o.push(s),s=r}i.add(r.start,r.end,r.kind&&r.kind.value,o.length)}return i.toIndentRanges()}var SRe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},j0=function(n,e){return function(t,i){e(t,i,n)}},xRe=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})},Rg;const Vn=new _e("foldingEnabled",!1);let Af=Rg=class extends Y{static get(e){return e.getContribution(Rg.ID)}static getFoldingRangeProviders(e,t){var i,s;const o=e.foldingRangeProvider.ordered(t);return(s=(i=Rg._foldingRangeSelector)===null||i===void 0?void 0:i.call(Rg,o,t))!==null&&s!==void 0?s:o}constructor(e,t,i,s,o,r){super(),this.contextKeyService=t,this.languageConfigurationService=i,this.languageFeaturesService=r,this.localToDispose=this._register(new pe),this.editor=e,this._foldingLimitReporter=new LRe(e);const a=this.editor.getOptions();this._isEnabled=a.get(43),this._useFoldingProviders=a.get(44)!=="indentation",this._unfoldOnClickAfterEndOfLine=a.get(48),this._restoringViewState=!1,this._currentModelHasFoldedImports=!1,this._foldingImportsByDefault=a.get(46),this.updateDebounceInfo=o.for(r.foldingRangeProvider,"Folding",{min:200}),this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new Ai(e),this.foldingDecorationProvider.showFoldingControls=a.get(109),this.foldingDecorationProvider.showFoldingHighlights=a.get(45),this.foldingEnabled=Vn.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(l=>{if(l.hasChanged(43)&&(this._isEnabled=this.editor.getOptions().get(43),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),l.hasChanged(47)&&this.onModelChanged(),l.hasChanged(109)||l.hasChanged(45)){const c=this.editor.getOptions();this.foldingDecorationProvider.showFoldingControls=c.get(109),this.foldingDecorationProvider.showFoldingHighlights=c.get(45),this.triggerFoldingModelChanged()}l.hasChanged(44)&&(this._useFoldingProviders=this.editor.getOptions().get(44)!=="indentation",this.onFoldingStrategyChanged()),l.hasChanged(48)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(48)),l.hasChanged(46)&&(this._foldingImportsByDefault=this.editor.getOptions().get(46))})),this.onModelChanged()}saveViewState(){const e=this.editor.getModel();if(!e||!this._isEnabled||e.isTooLargeForTokenization())return{};if(this.foldingModel){const t=this.foldingModel.getMemento(),i=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:t,lineCount:e.getLineCount(),provider:i,foldedImports:this._currentModelHasFoldedImports}}}restoreViewState(e){const t=this.editor.getModel();if(!(!t||!this._isEnabled||t.isTooLargeForTokenization()||!this.hiddenRangeModel)&&e&&(this._currentModelHasFoldedImports=!!e.foldedImports,e.collapsedRegions&&e.collapsedRegions.length>0&&this.foldingModel)){this._restoringViewState=!0;try{this.foldingModel.applyMemento(e.collapsedRegions)}finally{this._restoringViewState=!1}}}onModelChanged(){this.localToDispose.clear();const e=this.editor.getModel();!this._isEnabled||!e||e.isTooLargeForTokenization()||(this._currentModelHasFoldedImports=!1,this.foldingModel=new nRe(e,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new dRe(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(t=>this.onHiddenRangesChanges(t))),this.updateScheduler=new ku(this.updateDebounceInfo.get(e)),this.cursorChangedScheduler=new Li(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(t=>this.onDidChangeModelContent(t))),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(t=>this.onEditorMouseDown(t))),this.localToDispose.add(this.editor.onMouseUp(t=>this.onEditorMouseUp(t))),this.localToDispose.add({dispose:()=>{var t,i;this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),(t=this.updateScheduler)===null||t===void 0||t.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,(i=this.rangeProvider)===null||i===void 0||i.dispose(),this.rangeProvider=null}}),this.triggerFoldingModelChanged())}onFoldingStrategyChanged(){var e;(e=this.rangeProvider)===null||e===void 0||e.dispose(),this.rangeProvider=null,this.triggerFoldingModelChanged()}getRangeProvider(e){if(this.rangeProvider)return this.rangeProvider;const t=new ZK(e,this.languageConfigurationService,this._foldingLimitReporter);if(this.rangeProvider=t,this._useFoldingProviders&&this.foldingModel){const i=Rg.getFoldingRangeProviders(this.languageFeaturesService,e);i.length>0&&(this.rangeProvider=new JK(e,i,()=>this.triggerFoldingModelChanged(),this._foldingLimitReporter,t))}return this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onDidChangeModelContent(e){var t;(t=this.hiddenRangeModel)===null||t===void 0||t.notifyChangeModelContent(e),this.triggerFoldingModelChanged()}triggerFoldingModelChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const e=this.foldingModel;if(!e)return null;const t=new Su,i=this.getRangeProvider(e.textModel),s=this.foldingRegionPromise=xc(o=>i.compute(o));return s.then(o=>{if(o&&s===this.foldingRegionPromise){let r;if(this._foldingImportsByDefault&&!this._currentModelHasFoldedImports){const d=o.setCollapsedAllOfType(as.Imports.value,!0);d&&(r=Ov.capture(this.editor),this._currentModelHasFoldedImports=d)}const a=this.editor.getSelections(),l=a?a.map(d=>d.startLineNumber):[];e.update(o,l),r==null||r.restore(this.editor);const c=this.updateDebounceInfo.update(e.textModel,t.elapsed());this.updateScheduler&&(this.updateScheduler.defaultDelay=c)}return e})}).then(void 0,e=>(mt(e),null)))}onHiddenRangesChanges(e){if(this.hiddenRangeModel&&e.length&&!this._restoringViewState){const t=this.editor.getSelections();t&&this.hiddenRangeModel.adjustSelections(t)&&this.editor.setSelections(t)}this.editor.setHiddenAreas(e,this)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const e=this.getFoldingModel();e&&e.then(t=>{if(t){const i=this.editor.getSelections();if(i&&i.length>0){const s=[];for(const o of i){const r=o.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(r)&&s.push(...t.getAllRegionsAtLine(r,a=>a.isCollapsed&&r>a.startLineNumber))}s.length&&(t.toggleCollapseState(s),this.reveal(i[0].getPosition()))}}}).then(void 0,mt)}onEditorMouseDown(e){if(this.mouseDownInfo=null,!this.hiddenRangeModel||!e.target||!e.target.range||!e.event.leftButton&&!e.event.middleButton)return;const t=e.target.range;let i=!1;switch(e.target.type){case 4:{const s=e.target.detail,o=e.target.element.offsetLeft;if(s.offsetX-o<4)return;i=!0;break}case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!e.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){const s=this.editor.getModel();if(s&&t.startColumn===s.getLineMaxColumn(t.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:t.startLineNumber,iconClicked:i}}onEditorMouseUp(e){const t=this.foldingModel;if(!t||!this.mouseDownInfo||!e.target)return;const i=this.mouseDownInfo.lineNumber,s=this.mouseDownInfo.iconClicked,o=e.target.range;if(!o||o.startLineNumber!==i)return;if(s){if(e.target.type!==4)return}else{const a=this.editor.getModel();if(!a||o.startColumn!==a.getLineMaxColumn(i))return}const r=t.getRegionAtLine(i);if(r&&r.startLineNumber===i){const a=r.isCollapsed;if(s||a){const l=e.event.altKey;let c=[];if(l){const d=h=>!h.containedBy(r)&&!r.containedBy(h),u=t.getRegionsInside(null,d);for(const h of u)h.isCollapsed&&c.push(h);c.length===0&&(c=u)}else{const d=e.event.middleButton||e.event.shiftKey;if(d)for(const u of t.getRegionsInside(r))u.isCollapsed===a&&c.push(u);(a||!d||c.length===0)&&c.push(r)}t.toggleCollapseState(c),this.reveal({lineNumber:i,column:1})}}}reveal(e){this.editor.revealPositionInCenterIfOutsideViewport(e,0)}};Af.ID="editor.contrib.folding";Af=Rg=SRe([j0(1,et),j0(2,so),j0(3,xn),j0(4,aG),j0(5,it)],Af);class LRe{constructor(e){this.editor=e,this._onDidChange=new B,this._computed=0,this._limited=!1}get limit(){return this.editor.getOptions().get(47)}update(e,t){(e!==this._computed||t!==this._limited)&&(this._computed=e,this._limited=t,this._onDidChange.fire())}}class Jn extends Qt{runEditorCommand(e,t,i){const s=e.get(so),o=Af.get(t);if(!o)return;const r=o.getFoldingModel();if(r)return this.reportTelemetry(e,t),r.then(a=>{if(a){this.invoke(o,a,t,i,s);const l=t.getSelection();l&&o.reveal(l.getStartPosition())}})}getSelectedLines(e){const t=e.getSelections();return t?t.map(i=>i.startLineNumber):[]}getLineNumbers(e,t){return e&&e.selectionLines?e.selectionLines.map(i=>i+1):this.getSelectedLines(t)}run(e,t){}}function eY(n){if(!qs(n)){if(!Ls(n))return!1;const e=n;if(!qs(e.levels)&&!Jd(e.levels)||!qs(e.direction)&&!Rs(e.direction)||!qs(e.selectionLines)&&(!Array.isArray(e.selectionLines)||!e.selectionLines.every(Jd)))return!1}return!0}class DRe extends Jn{constructor(){super({id:"editor.unfold",label:m("unfoldAction.label","Unfold"),alias:"Unfold",precondition:Vn,kbOpts:{kbExpr:$.editorTextFocus,primary:3166,mac:{primary:2654},weight:100},description:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument: + *-----------------------------------------------------------------------------*/var jNe=Object.defineProperty,qNe=Object.getOwnPropertyDescriptor,GNe=Object.getOwnPropertyNames,KNe=Object.prototype.hasOwnProperty,YNe=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of GNe(e))!KNe.call(n,s)&&s!==t&&jNe(n,s,{get:()=>e[s],enumerable:!(i=qNe(e,s))||i.enumerable});return n},ZNe=(n,e,t)=>(YNe(n,e,"default"),t),_y={};ZNe(_y,RNe);var XNe=class{constructor(n,e,t){Ei(this,"_onDidChange",new _y.Emitter);Ei(this,"_diagnosticsOptions");Ei(this,"_modeConfiguration");Ei(this,"_languageId");this._languageId=n,this.setDiagnosticsOptions(e),this.setModeConfiguration(t)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(n){this._diagnosticsOptions=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},QNe={validate:!0,allowComments:!0,schemas:[],enableSchemaRequest:!1,schemaRequest:"warning",schemaValidation:"warning",comments:"error",trailingCommas:"error"},JNe={documentFormattingEdits:!0,documentRangeFormattingEdits:!0,completionItems:!0,hovers:!0,documentSymbols:!0,tokens:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0},GK=new XNe("json",QNe,JNe);_y.languages.json={jsonDefaults:GK};function eRe(){return Zn(()=>import("./jsonMode-CB12BjWw.js"),[],import.meta.url)}_y.languages.register({id:"json",extensions:[".json",".bowerrc",".jshintrc",".jscsrc",".eslintrc",".babelrc",".har"],aliases:["JSON","json"],mimetypes:["application/json"]});_y.languages.onLanguage("json",()=>{eRe().then(n=>n.setupMode(GK))});const tRe={0:" ",1:"u",2:"r"},dB=65535,jr=16777215,uB=4278190080;class mE{constructor(e){const t=Math.ceil(e/32);this._states=new Uint32Array(t)}get(e){const t=e/32|0,i=e%32;return(this._states[t]&1<dB)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=e,this._endIndexes=t,this._collapseStates=new mE(e.length),this._userDefinedStates=new mE(e.length),this._recoveredStates=new mE(e.length),this._types=i,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;const e=[],t=(i,s)=>{const o=e[e.length-1];return this.getStartLineNumber(o)<=i&&this.getEndLineNumber(o)>=s};for(let i=0,s=this._startIndexes.length;ijr||r>jr)throw new Error("startLineNumber or endLineNumber must not exceed "+jr);for(;e.length>0&&!t(o,r);)e.pop();const a=e.length>0?e[e.length-1]:-1;e.push(i),this._startIndexes[i]=o+((a&255)<<24),this._endIndexes[i]=r+((a&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(e){return this._startIndexes[e]&jr}getEndLineNumber(e){return this._endIndexes[e]&jr}getType(e){return this._types?this._types[e]:void 0}hasTypes(){return!!this._types}isCollapsed(e){return this._collapseStates.get(e)}setCollapsed(e,t){this._collapseStates.set(e,t)}isUserDefined(e){return this._userDefinedStates.get(e)}setUserDefined(e,t){return this._userDefinedStates.set(e,t)}isRecovered(e){return this._recoveredStates.get(e)}setRecovered(e,t){return this._recoveredStates.set(e,t)}getSource(e){return this.isUserDefined(e)?1:this.isRecovered(e)?2:0}setSource(e,t){t===1?(this.setUserDefined(e,!0),this.setRecovered(e,!1)):t===2?(this.setUserDefined(e,!1),this.setRecovered(e,!0)):(this.setUserDefined(e,!1),this.setRecovered(e,!1))}setCollapsedAllOfType(e,t){let i=!1;if(this._types)for(let s=0;s>>24)+((this._endIndexes[e]&uB)>>>16);return t===dB?-1:t}contains(e,t){return this.getStartLineNumber(e)<=t&&this.getEndLineNumber(e)>=t}findIndex(e){let t=0,i=this._startIndexes.length;if(i===0)return-1;for(;t=0){if(this.getEndLineNumber(t)>=e)return t;for(t=this.getParentIndex(t);t!==-1;){if(this.contains(t,e))return t;t=this.getParentIndex(t)}}return-1}toString(){const e=[];for(let t=0;tArray.isArray(p)?v=>v<_?p[v]:void 0:v=>v<_?p.toFoldRange(v):void 0,o=s(e,e.length),r=s(t,t.length);let a=0,l=0,c=o(0),d=r(0);const u=[];let h,f=0;const g=[];for(;c||d;){let p;if(d&&(!c||c.startLineNumber>=d.startLineNumber))c&&c.startLineNumber===d.startLineNumber?(d.source===1?p=d:(p=c,p.isCollapsed=d.isCollapsed&&c.endLineNumber===d.endLineNumber,p.source=0),c=o(++a)):(p=d,d.isCollapsed&&d.source===0&&(p.source=2)),d=r(++l);else{let _=l,v=d;for(;;){if(!v||v.startLineNumber>c.endLineNumber){p=c;break}if(v.source===1&&v.endLineNumber>c.endLineNumber)break;v=r(++_)}c=o(++a)}if(p){for(;h&&h.endLineNumberp.startLineNumber&&p.startLineNumber>f&&p.endLineNumber<=i&&(!h||h.endLineNumber>=p.endLineNumber)&&(g.push(p),f=p.startLineNumber,h&&u.push(h),h=p)}}return g}}class iRe{constructor(e,t){this.ranges=e,this.index=t}get startLineNumber(){return this.ranges.getStartLineNumber(this.index)}get endLineNumber(){return this.ranges.getEndLineNumber(this.index)}get regionIndex(){return this.index}get parentIndex(){return this.ranges.getParentIndex(this.index)}get isCollapsed(){return this.ranges.isCollapsed(this.index)}containedBy(e){return e.startLineNumber<=this.startLineNumber&&e.endLineNumber>=this.endLineNumber}containsLine(e){return this.startLineNumber<=e&&e<=this.endLineNumber}}class nRe{get regions(){return this._regions}get textModel(){return this._textModel}constructor(e,t){this._updateEventEmitter=new B,this.onDidChange=this._updateEventEmitter.event,this._textModel=e,this._decorationProvider=t,this._regions=new fo(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[]}toggleCollapseState(e){if(!e.length)return;e=e.sort((i,s)=>i.regionIndex-s.regionIndex);const t={};this._decorationProvider.changeDecorations(i=>{let s=0,o=-1,r=-1;const a=l=>{for(;sr&&(r=c),s++}};for(const l of e){const c=l.regionIndex,d=this._editorDecorationIds[c];if(d&&!t[d]){t[d]=!0,a(c);const u=!this._regions.isCollapsed(c);this._regions.setCollapsed(c,u),o=Math.max(o,this._regions.getEndLineNumber(c))}}a(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:e})}removeManualRanges(e){const t=new Array,i=s=>{for(const o of e)if(!(o.startLineNumber>s.endLineNumber||s.startLineNumber>o.endLineNumber))return!0;return!1};for(let s=0;si&&(i=a)}this._decorationProvider.changeDecorations(s=>this._editorDecorationIds=s.deltaDecorations(this._editorDecorationIds,t)),this._regions=e,this._updateEventEmitter.fire({model:this})}_currentFoldedOrManualRanges(e=[]){const t=(s,o)=>{for(const r of e)if(s=r.endLineNumber||r.startLineNumber<1||r.endLineNumber>i)continue;const a=this._getLinesChecksum(r.startLineNumber+1,r.endLineNumber);t.push({startLineNumber:r.startLineNumber,endLineNumber:r.endLineNumber,isCollapsed:r.isCollapsed,source:r.source,checksum:a})}return t.length>0?t:void 0}applyMemento(e){var t,i;if(!Array.isArray(e))return;const s=[],o=this._textModel.getLineCount();for(const a of e){if(a.startLineNumber>=a.endLineNumber||a.startLineNumber<1||a.endLineNumber>o)continue;const l=this._getLinesChecksum(a.startLineNumber+1,a.endLineNumber);(!a.checksum||l===a.checksum)&&s.push({startLineNumber:a.startLineNumber,endLineNumber:a.endLineNumber,type:void 0,isCollapsed:(t=a.isCollapsed)!==null&&t!==void 0?t:!0,source:(i=a.source)!==null&&i!==void 0?i:0})}const r=fo.sanitizeAndMerge(this._regions,s,o);this.updatePost(fo.fromFoldRanges(r))}_getLinesChecksum(e,t){return Q0e(this._textModel.getLineContent(e)+this._textModel.getLineContent(t))%1e6}dispose(){this._decorationProvider.removeDecorations(this._editorDecorationIds)}getAllRegionsAtLine(e,t){const i=[];if(this._regions){let s=this._regions.findRange(e),o=1;for(;s>=0;){const r=this._regions.toRegion(s);(!t||t(r,o))&&i.push(r),o++,s=r.parentIndex}}return i}getRegionAtLine(e){if(this._regions){const t=this._regions.findRange(e);if(t>=0)return this._regions.toRegion(t)}return null}getRegionsInside(e,t){const i=[],s=e?e.regionIndex+1:0,o=e?e.endLineNumber:Number.MAX_VALUE;if(t&&t.length===2){const r=[];for(let a=s,l=this._regions.length;a0&&!c.containedBy(r[r.length-1]);)r.pop();r.push(c),t(c,r.length)&&i.push(c)}else break}}else for(let r=s,a=this._regions.length;r0)for(const o of i){const r=n.getRegionAtLine(o);if(r&&(r.isCollapsed!==e&&s.push(r),t>1)){const a=n.getRegionsInside(r,(l,c)=>l.isCollapsed!==e&&cr.isCollapsed!==e&&aa.isCollapsed!==e&&l<=t);s.push(...r)}n.toggleCollapseState(s)}function oRe(n,e,t){const i=[];for(const s of t){const o=n.getAllRegionsAtLine(s,r=>r.isCollapsed!==e);o.length>0&&i.push(o[0])}n.toggleCollapseState(i)}function rRe(n,e,t,i){const s=(r,a)=>a===e&&r.isCollapsed!==t&&!i.some(l=>r.containsLine(l)),o=n.getRegionsInside(null,s);n.toggleCollapseState(o)}function YK(n,e,t){const i=[];for(const r of t){const a=n.getAllRegionsAtLine(r,void 0);a.length>0&&i.push(a[0])}const s=r=>i.every(a=>!a.containedBy(r)&&!r.containedBy(a))&&r.isCollapsed!==e,o=n.getRegionsInside(null,s);n.toggleCollapseState(o)}function F5(n,e,t){const i=n.textModel,s=n.regions,o=[];for(let r=s.length-1;r>=0;r--)if(t!==s.isCollapsed(r)){const a=s.getStartLineNumber(r);e.test(i.getLineContent(a))&&o.push(s.toRegion(r))}n.toggleCollapseState(o)}function B5(n,e,t){const i=n.regions,s=[];for(let o=i.length-1;o>=0;o--)t!==i.isCollapsed(o)&&e===i.getType(o)&&s.push(i.toRegion(o));n.toggleCollapseState(s)}function aRe(n,e){let t=null;const i=e.getRegionAtLine(n);if(i!==null&&(t=i.startLineNumber,n===t)){const s=i.parentIndex;s!==-1?t=e.regions.getStartLineNumber(s):t=null}return t}function lRe(n,e){let t=e.getRegionAtLine(n);if(t!==null&&t.startLineNumber===n){if(n!==t.startLineNumber)return t.startLineNumber;{const i=t.parentIndex;let s=0;for(i!==-1&&(s=e.regions.getStartLineNumber(t.parentIndex));t!==null;)if(t.regionIndex>0){if(t=e.regions.toRegion(t.regionIndex-1),t.startLineNumber<=s)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}}else if(e.regions.length>0)for(t=e.regions.toRegion(e.regions.length-1);t!==null;){if(t.startLineNumber0?t=e.regions.toRegion(t.regionIndex-1):t=null}return null}function cRe(n,e){let t=e.getRegionAtLine(n);if(t!==null&&t.startLineNumber===n){const i=t.parentIndex;let s=0;if(i!==-1)s=e.regions.getEndLineNumber(t.parentIndex);else{if(e.regions.length===0)return null;s=e.regions.getEndLineNumber(e.regions.length-1)}for(;t!==null;)if(t.regionIndex=s)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}else if(e.regions.length>0)for(t=e.regions.toRegion(0);t!==null;){if(t.startLineNumber>n)return t.startLineNumber;t.regionIndexthis.updateHiddenRanges()),this._hiddenRanges=[],e.regions.length&&this.updateHiddenRanges()}notifyChangeModelContent(e){this._hiddenRanges.length&&!this._hasLineChanges&&(this._hasLineChanges=e.changes.some(t=>t.range.endLineNumber!==t.range.startLineNumber||Lf(t.text)[0]!==0))}updateHiddenRanges(){let e=!1;const t=[];let i=0,s=0,o=Number.MAX_VALUE,r=-1;const a=this._foldingModel.regions;for(;i0}isHidden(e){return hB(this._hiddenRanges,e)!==null}adjustSelections(e){let t=!1;const i=this._foldingModel.textModel;let s=null;const o=r=>((!s||!uRe(r,s))&&(s=hB(this._hiddenRanges,r)),s?s.startLineNumber-1:null);for(let r=0,a=e.length;r0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}function uRe(n,e){return n>=e.startLineNumber&&n<=e.endLineNumber}function hB(n,e){const t=Qb(n,i=>e=0&&n[t].endLineNumber>=e?n[t]:null}const hRe=5e3,fRe="indent";class ZK{constructor(e,t,i){this.editorModel=e,this.languageConfigurationService=t,this.foldingRangesLimit=i,this.id=fRe}dispose(){}compute(e){const t=this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules,i=t&&!!t.offSide,s=t&&t.markers;return Promise.resolve(mRe(this.editorModel,i,s,this.foldingRangesLimit))}}let gRe=class{constructor(e){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=e}insertFirst(e,t,i){if(e>jr||t>jr)return;const s=this._length;this._startIndexes[s]=e,this._endIndexes[s]=t,this._length++,i<1e3&&(this._indentOccurrences[i]=(this._indentOccurrences[i]||0)+1)}toIndentRanges(e){const t=this._foldingRangesLimit.limit;if(this._length<=t){this._foldingRangesLimit.update(this._length,!1);const i=new Uint32Array(this._length),s=new Uint32Array(this._length);for(let o=this._length-1,r=0;o>=0;o--,r++)i[r]=this._startIndexes[o],s[r]=this._endIndexes[o];return new fo(i,s)}else{this._foldingRangesLimit.update(this._length,t);let i=0,s=this._indentOccurrences.length;for(let l=0;lt){s=l;break}i+=c}}const o=e.getOptions().tabSize,r=new Uint32Array(t),a=new Uint32Array(t);for(let l=this._length-1,c=0;l>=0;l--){const d=this._startIndexes[l],u=e.getLineContent(d),h=_L(u,o);(h{}};function mRe(n,e,t,i=pRe){const s=n.getOptions().tabSize,o=new gRe(i);let r;t&&(r=new RegExp(`(${t.start.source})|(?:${t.end.source})`));const a=[],l=n.getLineCount()+1;a.push({indent:-1,endAbove:l,line:l});for(let c=n.getLineCount();c>0;c--){const d=n.getLineContent(c),u=_L(d,s);let h=a[a.length-1];if(u===-1){e&&(h.endAbove=c);continue}let f;if(r&&(f=d.match(r)))if(f[1]){let g=a.length-1;for(;g>0&&a[g].indent!==-2;)g--;if(g>0){a.length=g+1,h=a[g],o.insertFirst(c,h.line,u),h.line=c,h.indent=u,h.endAbove=c;continue}}else{a.push({indent:-2,endAbove:c,line:c});continue}if(h.indent>u){do a.pop(),h=a[a.length-1];while(h.indent>u);const g=h.endAbove-1;g-c>=1&&o.insertFirst(c,g,u)}h.indent===u?h.endAbove=c:a.push({indent:u,endAbove:c,line:c})}return o.toIndentRanges(n)}const _Re=E("editor.foldBackground",{light:we(fd,.3),dark:we(fd,.3),hcDark:null,hcLight:null},m("foldBackgroundBackground","Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."),!0);E("editorGutter.foldingControlForeground",{dark:hd,light:hd,hcDark:hd,hcLight:hd},m("editorGutter.foldingControlForeground","Color of the folding control in the editor gutter."));const W5=Zi("folding-expanded",se.chevronDown,m("foldingExpandedIcon","Icon for expanded ranges in the editor glyph margin.")),V5=Zi("folding-collapsed",se.chevronRight,m("foldingCollapsedIcon","Icon for collapsed ranges in the editor glyph margin.")),XK=Zi("folding-manual-collapsed",V5,m("foldingManualCollapedIcon","Icon for manually collapsed ranges in the editor glyph margin.")),QK=Zi("folding-manual-expanded",W5,m("foldingManualExpandedIcon","Icon for manually expanded ranges in the editor glyph margin.")),z5={color:sn(_Re),position:Zs.Inline};class Ai{constructor(e){this.editor=e,this.showFoldingControls="mouseover",this.showFoldingHighlights=!0}getDecorationOption(e,t,i){return t?Ai.HIDDEN_RANGE_DECORATION:this.showFoldingControls==="never"?e?this.showFoldingHighlights?Ai.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION:Ai.NO_CONTROLS_COLLAPSED_RANGE_DECORATION:Ai.NO_CONTROLS_EXPANDED_RANGE_DECORATION:e?i?this.showFoldingHighlights?Ai.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:Ai.MANUALLY_COLLAPSED_VISUAL_DECORATION:this.showFoldingHighlights?Ai.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:Ai.COLLAPSED_VISUAL_DECORATION:this.showFoldingControls==="mouseover"?i?Ai.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION:Ai.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:i?Ai.MANUALLY_EXPANDED_VISUAL_DECORATION:Ai.EXPANDED_VISUAL_DECORATION}changeDecorations(e){return this.editor.changeDecorations(e)}removeDecorations(e){this.editor.removeDecorations(e)}}Ai.COLLAPSED_VISUAL_DECORATION=Je.register({description:"folding-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(V5)});Ai.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Je.register({description:"folding-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(V5)});Ai.MANUALLY_COLLAPSED_VISUAL_DECORATION=Je.register({description:"folding-manually-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(XK)});Ai.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Je.register({description:"folding-manually-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(XK)});Ai.NO_CONTROLS_COLLAPSED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0});Ai.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:z5,isWholeLine:!0});Ai.EXPANDED_VISUAL_DECORATION=Je.register({description:"folding-expanded-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+Te.asClassName(W5)});Ai.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Je.register({description:"folding-expanded-auto-hide-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(W5)});Ai.MANUALLY_EXPANDED_VISUAL_DECORATION=Je.register({description:"folding-manually-expanded-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+Te.asClassName(QK)});Ai.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Je.register({description:"folding-manually-expanded-auto-hide-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:Te.asClassName(QK)});Ai.NO_CONTROLS_EXPANDED_RANGE_DECORATION=Je.register({description:"folding-no-controls-range-decoration",stickiness:0,isWholeLine:!0});Ai.HIDDEN_RANGE_DECORATION=Je.register({description:"folding-hidden-range-decoration",stickiness:1});const bRe={},vRe="syntax";class JK{constructor(e,t,i,s,o){this.editorModel=e,this.providers=t,this.handleFoldingRangesChange=i,this.foldingRangesLimit=s,this.fallbackRangeProvider=o,this.id=vRe,this.disposables=new pe,o&&this.disposables.add(o);for(const r of t)typeof r.onDidChange=="function"&&this.disposables.add(r.onDidChange(i))}compute(e){return yRe(this.providers,this.editorModel,e).then(t=>{var i,s;return t?CRe(t,this.foldingRangesLimit):(s=(i=this.fallbackRangeProvider)===null||i===void 0?void 0:i.compute(e))!==null&&s!==void 0?s:null})}dispose(){this.disposables.dispose()}}function yRe(n,e,t){let i=null;const s=n.map((o,r)=>Promise.resolve(o.provideFoldingRanges(e,bRe,t)).then(a=>{if(!t.isCancellationRequested&&Array.isArray(a)){Array.isArray(i)||(i=[]);const l=e.getLineCount();for(const c of a)c.start>0&&c.end>c.start&&c.end<=l&&i.push({start:c.start,end:c.end,rank:r,kind:c.kind})}},wc));return Promise.all(s).then(o=>i)}class wRe{constructor(e){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=e}add(e,t,i,s){if(e>jr||t>jr)return;const o=this._length;this._startIndexes[o]=e,this._endIndexes[o]=t,this._nestingLevels[o]=s,this._types[o]=i,this._length++,s<30&&(this._nestingLevelCounts[s]=(this._nestingLevelCounts[s]||0)+1)}toIndentRanges(){const e=this._foldingRangesLimit.limit;if(this._length<=e){this._foldingRangesLimit.update(this._length,!1);const t=new Uint32Array(this._length),i=new Uint32Array(this._length);for(let s=0;se){i=a;break}t+=l}}const s=new Uint32Array(e),o=new Uint32Array(e),r=[];for(let a=0,l=0;a{let l=r.start-a.start;return l===0&&(l=r.rank-a.rank),l}),i=new wRe(e);let s;const o=[];for(const r of t)if(!s)s=r,i.add(r.start,r.end,r.kind&&r.kind.value,o.length);else if(r.start>s.start)if(r.end<=s.end)o.push(s),s=r,i.add(r.start,r.end,r.kind&&r.kind.value,o.length);else{if(r.start>s.end){do s=o.pop();while(s&&r.start>s.end);s&&o.push(s),s=r}i.add(r.start,r.end,r.kind&&r.kind.value,o.length)}return i.toIndentRanges()}var SRe=function(n,e,t,i){var s=arguments.length,o=s<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(r=n[a])&&(o=(s<3?r(o):s>3?r(e,t,o):r(e,t))||o);return s>3&&o&&Object.defineProperty(e,t,o),o},j0=function(n,e){return function(t,i){e(t,i,n)}},xRe=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(r){r(o)})}return new(t||(t=Promise))(function(o,r){function a(d){try{c(i.next(d))}catch(u){r(u)}}function l(d){try{c(i.throw(d))}catch(u){r(u)}}function c(d){d.done?o(d.value):s(d.value).then(a,l)}c((i=i.apply(n,e||[])).next())})},Rg;const Vn=new _e("foldingEnabled",!1);let Af=Rg=class extends Y{static get(e){return e.getContribution(Rg.ID)}static getFoldingRangeProviders(e,t){var i,s;const o=e.foldingRangeProvider.ordered(t);return(s=(i=Rg._foldingRangeSelector)===null||i===void 0?void 0:i.call(Rg,o,t))!==null&&s!==void 0?s:o}constructor(e,t,i,s,o,r){super(),this.contextKeyService=t,this.languageConfigurationService=i,this.languageFeaturesService=r,this.localToDispose=this._register(new pe),this.editor=e,this._foldingLimitReporter=new LRe(e);const a=this.editor.getOptions();this._isEnabled=a.get(43),this._useFoldingProviders=a.get(44)!=="indentation",this._unfoldOnClickAfterEndOfLine=a.get(48),this._restoringViewState=!1,this._currentModelHasFoldedImports=!1,this._foldingImportsByDefault=a.get(46),this.updateDebounceInfo=o.for(r.foldingRangeProvider,"Folding",{min:200}),this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new Ai(e),this.foldingDecorationProvider.showFoldingControls=a.get(109),this.foldingDecorationProvider.showFoldingHighlights=a.get(45),this.foldingEnabled=Vn.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(l=>{if(l.hasChanged(43)&&(this._isEnabled=this.editor.getOptions().get(43),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),l.hasChanged(47)&&this.onModelChanged(),l.hasChanged(109)||l.hasChanged(45)){const c=this.editor.getOptions();this.foldingDecorationProvider.showFoldingControls=c.get(109),this.foldingDecorationProvider.showFoldingHighlights=c.get(45),this.triggerFoldingModelChanged()}l.hasChanged(44)&&(this._useFoldingProviders=this.editor.getOptions().get(44)!=="indentation",this.onFoldingStrategyChanged()),l.hasChanged(48)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(48)),l.hasChanged(46)&&(this._foldingImportsByDefault=this.editor.getOptions().get(46))})),this.onModelChanged()}saveViewState(){const e=this.editor.getModel();if(!e||!this._isEnabled||e.isTooLargeForTokenization())return{};if(this.foldingModel){const t=this.foldingModel.getMemento(),i=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:t,lineCount:e.getLineCount(),provider:i,foldedImports:this._currentModelHasFoldedImports}}}restoreViewState(e){const t=this.editor.getModel();if(!(!t||!this._isEnabled||t.isTooLargeForTokenization()||!this.hiddenRangeModel)&&e&&(this._currentModelHasFoldedImports=!!e.foldedImports,e.collapsedRegions&&e.collapsedRegions.length>0&&this.foldingModel)){this._restoringViewState=!0;try{this.foldingModel.applyMemento(e.collapsedRegions)}finally{this._restoringViewState=!1}}}onModelChanged(){this.localToDispose.clear();const e=this.editor.getModel();!this._isEnabled||!e||e.isTooLargeForTokenization()||(this._currentModelHasFoldedImports=!1,this.foldingModel=new nRe(e,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new dRe(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(t=>this.onHiddenRangesChanges(t))),this.updateScheduler=new ku(this.updateDebounceInfo.get(e)),this.cursorChangedScheduler=new Li(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(t=>this.onDidChangeModelContent(t))),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(t=>this.onEditorMouseDown(t))),this.localToDispose.add(this.editor.onMouseUp(t=>this.onEditorMouseUp(t))),this.localToDispose.add({dispose:()=>{var t,i;this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),(t=this.updateScheduler)===null||t===void 0||t.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,(i=this.rangeProvider)===null||i===void 0||i.dispose(),this.rangeProvider=null}}),this.triggerFoldingModelChanged())}onFoldingStrategyChanged(){var e;(e=this.rangeProvider)===null||e===void 0||e.dispose(),this.rangeProvider=null,this.triggerFoldingModelChanged()}getRangeProvider(e){if(this.rangeProvider)return this.rangeProvider;const t=new ZK(e,this.languageConfigurationService,this._foldingLimitReporter);if(this.rangeProvider=t,this._useFoldingProviders&&this.foldingModel){const i=Rg.getFoldingRangeProviders(this.languageFeaturesService,e);i.length>0&&(this.rangeProvider=new JK(e,i,()=>this.triggerFoldingModelChanged(),this._foldingLimitReporter,t))}return this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onDidChangeModelContent(e){var t;(t=this.hiddenRangeModel)===null||t===void 0||t.notifyChangeModelContent(e),this.triggerFoldingModelChanged()}triggerFoldingModelChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const e=this.foldingModel;if(!e)return null;const t=new Su,i=this.getRangeProvider(e.textModel),s=this.foldingRegionPromise=xc(o=>i.compute(o));return s.then(o=>{if(o&&s===this.foldingRegionPromise){let r;if(this._foldingImportsByDefault&&!this._currentModelHasFoldedImports){const d=o.setCollapsedAllOfType(as.Imports.value,!0);d&&(r=Ov.capture(this.editor),this._currentModelHasFoldedImports=d)}const a=this.editor.getSelections(),l=a?a.map(d=>d.startLineNumber):[];e.update(o,l),r==null||r.restore(this.editor);const c=this.updateDebounceInfo.update(e.textModel,t.elapsed());this.updateScheduler&&(this.updateScheduler.defaultDelay=c)}return e})}).then(void 0,e=>(mt(e),null)))}onHiddenRangesChanges(e){if(this.hiddenRangeModel&&e.length&&!this._restoringViewState){const t=this.editor.getSelections();t&&this.hiddenRangeModel.adjustSelections(t)&&this.editor.setSelections(t)}this.editor.setHiddenAreas(e,this)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const e=this.getFoldingModel();e&&e.then(t=>{if(t){const i=this.editor.getSelections();if(i&&i.length>0){const s=[];for(const o of i){const r=o.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(r)&&s.push(...t.getAllRegionsAtLine(r,a=>a.isCollapsed&&r>a.startLineNumber))}s.length&&(t.toggleCollapseState(s),this.reveal(i[0].getPosition()))}}}).then(void 0,mt)}onEditorMouseDown(e){if(this.mouseDownInfo=null,!this.hiddenRangeModel||!e.target||!e.target.range||!e.event.leftButton&&!e.event.middleButton)return;const t=e.target.range;let i=!1;switch(e.target.type){case 4:{const s=e.target.detail,o=e.target.element.offsetLeft;if(s.offsetX-o<4)return;i=!0;break}case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!e.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){const s=this.editor.getModel();if(s&&t.startColumn===s.getLineMaxColumn(t.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:t.startLineNumber,iconClicked:i}}onEditorMouseUp(e){const t=this.foldingModel;if(!t||!this.mouseDownInfo||!e.target)return;const i=this.mouseDownInfo.lineNumber,s=this.mouseDownInfo.iconClicked,o=e.target.range;if(!o||o.startLineNumber!==i)return;if(s){if(e.target.type!==4)return}else{const a=this.editor.getModel();if(!a||o.startColumn!==a.getLineMaxColumn(i))return}const r=t.getRegionAtLine(i);if(r&&r.startLineNumber===i){const a=r.isCollapsed;if(s||a){const l=e.event.altKey;let c=[];if(l){const d=h=>!h.containedBy(r)&&!r.containedBy(h),u=t.getRegionsInside(null,d);for(const h of u)h.isCollapsed&&c.push(h);c.length===0&&(c=u)}else{const d=e.event.middleButton||e.event.shiftKey;if(d)for(const u of t.getRegionsInside(r))u.isCollapsed===a&&c.push(u);(a||!d||c.length===0)&&c.push(r)}t.toggleCollapseState(c),this.reveal({lineNumber:i,column:1})}}}reveal(e){this.editor.revealPositionInCenterIfOutsideViewport(e,0)}};Af.ID="editor.contrib.folding";Af=Rg=SRe([j0(1,et),j0(2,so),j0(3,xn),j0(4,aG),j0(5,it)],Af);class LRe{constructor(e){this.editor=e,this._onDidChange=new B,this._computed=0,this._limited=!1}get limit(){return this.editor.getOptions().get(47)}update(e,t){(e!==this._computed||t!==this._limited)&&(this._computed=e,this._limited=t,this._onDidChange.fire())}}class Jn extends Qt{runEditorCommand(e,t,i){const s=e.get(so),o=Af.get(t);if(!o)return;const r=o.getFoldingModel();if(r)return this.reportTelemetry(e,t),r.then(a=>{if(a){this.invoke(o,a,t,i,s);const l=t.getSelection();l&&o.reveal(l.getStartPosition())}})}getSelectedLines(e){const t=e.getSelections();return t?t.map(i=>i.startLineNumber):[]}getLineNumbers(e,t){return e&&e.selectionLines?e.selectionLines.map(i=>i+1):this.getSelectedLines(t)}run(e,t){}}function eY(n){if(!qs(n)){if(!Ls(n))return!1;const e=n;if(!qs(e.levels)&&!Jd(e.levels)||!qs(e.direction)&&!Rs(e.direction)||!qs(e.selectionLines)&&(!Array.isArray(e.selectionLines)||!e.selectionLines.every(Jd)))return!1}return!0}class DRe extends Jn{constructor(){super({id:"editor.unfold",label:m("unfoldAction.label","Unfold"),alias:"Unfold",precondition:Vn,kbOpts:{kbExpr:$.editorTextFocus,primary:3166,mac:{primary:2654},weight:100},description:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument: * 'levels': Number of levels to unfold. If not set, defaults to 1. * 'direction': If 'up', unfold given number of levels up otherwise unfolds down. * 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used. diff --git a/playground/assets/index-Ct7_ui2i.js b/playground/assets/index-Ct7_ui2i.js new file mode 100644 index 0000000..518099c --- /dev/null +++ b/playground/assets/index-Ct7_ui2i.js @@ -0,0 +1,3 @@ +import{A as J,L as K}from"./index-MItgq5d9.js";import{b as Q}from"./index-D1-7ym7j.js";import{L as R}from"./__vite-browser-external-D80GqXp3.js";import{R as F}from"./remoteFile-Bm2xbUQM.js";import{u as $,L as H,a as Z}from"./long-CAmP1QdM.js";import"./_commonjsHelpers-C932wzq6.js";import"./index-ClfaVKLN.js";function j(o){if(o.greaterThan(Number.MAX_SAFE_INTEGER)||o.lessThan(Number.MIN_SAFE_INTEGER))throw new Error("integer overflow");return o.toNumber()}class ee extends Error{}function _(o){if(o&&o.aborted){if(typeof DOMException<"u")throw new DOMException("aborted","AbortError");{const e=new ee("aborted");throw e.code="ERR_ABORTED",e}}}function te(o,e){return e.minv.blockPosition-o.maxv.blockPosition<65e3&&e.maxv.blockPosition-o.minv.blockPosition<5e6}function X(o,e){const t=[];let n=null;return o.length===0?o:(o.sort(function(i,s){const a=i.minv.blockPosition-s.minv.blockPosition;return a!==0?a:i.minv.dataPosition-s.minv.dataPosition}),o.forEach(i=>{(!e||i.maxv.compareTo(e)>0)&&(n===null?(t.push(i),n=i):te(n,i)?i.maxv.compareTo(n.maxv)>0&&(n.maxv=i.maxv):(t.push(i),n=i))}),t)}class V{constructor(e,t){this.blockPosition=e,this.dataPosition=t}toString(){return`${this.blockPosition}:${this.dataPosition}`}compareTo(e){return this.blockPosition-e.blockPosition||this.dataPosition-e.dataPosition}}function T(o,e=0,t=!1){if(t)throw new Error("big-endian virtual file offsets not implemented");return new V(o[e+7]*1099511627776+o[e+6]*4294967296+o[e+5]*16777216+o[e+4]*65536+o[e+3]*256+o[e+2],o[e+1]<<8|o[e])}class D{constructor(e,t,n,i=void 0){this.minv=e,this.maxv=t,this.bin=n,this._fetchedSize=i}toUniqueString(){return`${this.minv}..${this.maxv} (bin ${this.bin}, fetchedSize ${this.fetchedSize()})`}toString(){return this.toUniqueString()}compareTo(e){return this.minv.compareTo(e.minv)||this.maxv.compareTo(e.maxv)||this.bin-e.bin}fetchedSize(){return this._fetchedSize!==void 0?this._fetchedSize:this.maxv.blockPosition+65536-this.minv.blockPosition}}class W{constructor({filehandle:e,renameRefSeqs:t=n=>n}){this.filehandle=e,this.renameRefSeq=t}async getMetadata(e={}){const{indices:t,...n}=await this.parse(e);return n}_findFirstData(e,t){return e?e.compareTo(t)>0?t:e:t}async parse(e={}){return this.parseP||(this.parseP=this._parse(e).catch(t=>{throw this.parseP=void 0,t})),this.parseP}async hasRefSeq(e,t={}){var n;return!!(!((n=(await this.parse(t)).indices[e])===null||n===void 0)&&n.binIndex)}}const ne=21578324,U=14;function ie(o,e){return o+=1,e-=1,[[0,0],[1+(o>>26),1+(e>>26)],[9+(o>>23),9+(e>>23)],[73+(o>>20),73+(e>>20)],[585+(o>>17),585+(e>>17)],[4681+(o>>14),4681+(e>>14)]]}class y extends W{async lineCount(e,t={}){const n=await this.parse(t),i=n.refNameToId[e];if(i===void 0||!n.indices[i])return-1;const{stats:a}=n.indices[i];return a?a.lineCount:-1}async _parse(e={}){const t=await this.filehandle.readFile(e),n=await $(t);if(_(e.signal),n.readUInt32LE(0)!==ne)throw new Error("Not a TBI file");const i=n.readInt32LE(4),s=n.readInt32LE(8),a=s&65536?"zero-based-half-open":"1-based-closed",f={0:"generic",1:"SAM",2:"VCF"}[s&15];if(!f)throw new Error(`invalid Tabix preset format flags ${s}`);const d={ref:n.readInt32LE(12),start:n.readInt32LE(16),end:n.readInt32LE(20)},u=n.readInt32LE(24),h=5,c=((1<<(h+1)*3)-1)/7,b=2**(14+h*3),I=u?String.fromCharCode(u):null,m=n.readInt32LE(28),w=n.readInt32LE(32),{refNameToId:x,refIdToName:p}=this._parseNameBytes(n.slice(36,36+w));let l=36+w,g;return{indices:new Array(i).fill(0).map(()=>{const E=n.readInt32LE(l);l+=4;const v={};let N;for(let C=0;Cc+1)throw new Error("tabix index contains too many bins, please use a CSI index");if(A===c+1){const k=n.readInt32LE(l);l+=4,k===2&&(N=this.parsePseudoBin(n,l)),l+=16*k}else{const k=n.readInt32LE(l);l+=4;const O=new Array(k);for(let M=0;M>U>=r.linearIndex.length?r.linearIndex.length-1:t>>U]:new V(0,0))||console.warn("querying outside of possible tabix range");const d=ie(t,n),u=[];for(const[m,w]of d)for(let x=m;x<=w;x++)if(r.binIndex[x])for(const p of r.binIndex[x])u.push(new D(p.minv,p.maxv,x));const h=r.linearIndex.length;let c=null;const b=Math.min(t>>14,h-1),I=Math.min(n>>14,h-1);for(let m=b;m<=I;++m){const w=r.linearIndex[m];w&&(!c||w.compareTo(c)<0)&&(c=w)}return X(u,c)}}const re=21582659,se=38359875;function ae(o,e){return o*2**e}function G(o,e){return Math.floor(o/2**e)}class z extends W{constructor(e){super(e),this.maxBinNumber=0,this.depth=0,this.minShift=0}async lineCount(e,t={}){const n=await this.parse(t),i=n.refNameToId[e];if(i===void 0||!n.indices[i])return-1;const{stats:a}=n.indices[i];return a?a.lineCount:-1}indexCov(){throw new Error("CSI indexes do not support indexcov")}parseAuxData(e,t){const n=e.readInt32LE(t),i=n&65536?"zero-based-half-open":"1-based-closed",s={0:"generic",1:"SAM",2:"VCF"}[n&15];if(!s)throw new Error(`invalid Tabix preset format flags ${n}`);const a={ref:e.readInt32LE(t+4),start:e.readInt32LE(t+8),end:e.readInt32LE(t+12)},r=e.readInt32LE(t+16),f=r?String.fromCharCode(r):null,d=e.readInt32LE(t+20),u=e.readInt32LE(t+24),{refIdToName:h,refNameToId:c}=this._parseNameBytes(e.slice(t+28,t+28+u));return{refIdToName:h,refNameToId:c,skipLines:d,metaChar:f,columnNumbers:a,format:s,coordinateType:i}}_parseNameBytes(e){let t=0,n=0;const i=[],s={};for(let a=0;a=30?this.parseAuxData(t,16):{refIdToName:[],refNameToId:{},metaChar:null,columnNumbers:{ref:0,start:1,end:2},coordinateType:"zero-based-half-open",format:"generic"},r=t.readInt32LE(16+s);let f,d=16+s+4;const u=new Array(r).fill(0).map(()=>{const h=t.readInt32LE(d);d+=4;const c={};let b;for(let I=0;Ithis.maxBinNumber)b=this.parsePseudoBin(t,d+4),d+=48;else{const w=T(t,d+4);f=this._findFirstData(f,w);const x=t.readInt32LE(d+12);d+=16;const p=new Array(x);for(let l=0;l2**50&&(t=2**34),t-=1;let n=0,i=0,s=this.minShift+this.depth*3;const a=[];for(;n<=this.depth;s-=3,i+=ae(1,n*3),n+=1){const r=i+G(e,s),f=i+G(t,s);if(f-r+a.length>this.maxBinNumber)throw new Error(`query ${e}-${t} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`);a.push([r,f])}return a}}function oe(o){return/^[\u0000-\u007F]*$/.test(o)}const S=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;class xe{constructor({path:e,filehandle:t,url:n,tbiPath:i,tbiUrl:s,tbiFilehandle:a,csiPath:r,csiUrl:f,csiFilehandle:d,renameRefSeqs:u=c=>c,chunkCacheSize:h=5*2**20}){if(t)this.filehandle=t;else if(e)this.filehandle=new R(e);else if(n)this.filehandle=new F(n);else throw new TypeError("must provide either filehandle or path");if(a)this.index=new y({filehandle:a,renameRefSeqs:u});else if(d)this.index=new z({filehandle:d,renameRefSeqs:u});else if(i)this.index=new y({filehandle:new R(i),renameRefSeqs:u});else if(r)this.index=new z({filehandle:new R(r),renameRefSeqs:u});else if(e)this.index=new y({filehandle:new R(`${e}.tbi`),renameRefSeqs:u});else if(f)this.index=new z({filehandle:new F(f)});else if(s)this.index=new y({filehandle:new F(s)});else if(n)this.index=new y({filehandle:new F(`${n}.tbi`)});else throw new TypeError("must provide one of tbiFilehandle, tbiPath, csiFilehandle, csiPath, tbiUrl, csiUrl");this.renameRefSeq=u,this.chunkCache=new J({cache:new K({maxSize:Math.floor(h/65536)}),fill:(c,b)=>this.readChunk(c,{signal:b})})}async getLines(e,t,n,i){var s,a;let r,f={},d;typeof i=="function"?d=i:(f=i,d=i.lineCallback,r=i.signal);const u=await this.index.getMetadata(f);_(r);const h=t??0,c=n??u.maxRefLength;if(!(h<=c))throw new TypeError("invalid start and end coordinates. start must be less than or equal to end");if(h===c)return;const b=await this.index.blocksForRange(e,h,c,f);_(r);for(const I of b){const{buffer:m,cpositions:w,dpositions:x}=await this.chunkCache.get(I.toString(),I,r);_(r);let p=0,l=0;const g=(s=S==null?void 0:S.decode(m))!==null&&s!==void 0?s:m.toString(),P=m.length<5e8&&oe(g);for(;p=x[l++];);l--}const{startCoordinate:N,overlaps:B}=this.checkLine(u,e,h,c,E);if(B)d(E,w[l]*256+(p-x[l])+I.minv.dataPosition+1);else if(N!==void 0&&N>=c)return;p=v+1}}}async getMetadata(e={}){return this.index.getMetadata(e)}async getHeaderBuffer(e={}){const{firstDataLine:t,metaChar:n,maxBlockSize:i}=await this.getMetadata(e);_(e.signal);const s=((t==null?void 0:t.blockPosition)||0)+i,a=await this._readRegion(0,s,e),r=await $(a);if(n){let f=-1;const d=10,u=n.charCodeAt(0);for(let h=0;h=i)return{startCoordinate:x,overlaps:!1};if((c===0||c===h)&&x+1<=n)return{startCoordinate:x,overlaps:!1}}else if(d==="VCF"&&I===4)w=s.slice(m,l);else if(I===c&&(d==="VCF"?this._getVcfEnd(x,w,s.slice(m,l)):Number.parseInt(s.slice(m,l),10))<=n)return{overlaps:!1};if(m=l+1,I+=1,I>b)break}return{startCoordinate:x,overlaps:!0}}_getVcfEnd(e,t,n){let i=e+t.length;const s=n.includes("SVTYPE=TRA");if(n[0]!=="."&&!s){let a=";";for(let r=0;r{(!e||i.maxv.compareTo(e)>0)&&(n===null?(t.push(i),n=i):te(n,i)?i.maxv.compareTo(n.maxv)>0&&(n.maxv=i.maxv):(t.push(i),n=i))}),t)}class V{constructor(e,t){this.blockPosition=e,this.dataPosition=t}toString(){return`${this.blockPosition}:${this.dataPosition}`}compareTo(e){return this.blockPosition-e.blockPosition||this.dataPosition-e.dataPosition}}function T(o,e=0,t=!1){if(t)throw new Error("big-endian virtual file offsets not implemented");return new V(o[e+7]*1099511627776+o[e+6]*4294967296+o[e+5]*16777216+o[e+4]*65536+o[e+3]*256+o[e+2],o[e+1]<<8|o[e])}class D{constructor(e,t,n,i=void 0){this.minv=e,this.maxv=t,this.bin=n,this._fetchedSize=i}toUniqueString(){return`${this.minv}..${this.maxv} (bin ${this.bin}, fetchedSize ${this.fetchedSize()})`}toString(){return this.toUniqueString()}compareTo(e){return this.minv.compareTo(e.minv)||this.maxv.compareTo(e.maxv)||this.bin-e.bin}fetchedSize(){return this._fetchedSize!==void 0?this._fetchedSize:this.maxv.blockPosition+65536-this.minv.blockPosition}}class W{constructor({filehandle:e,renameRefSeqs:t=n=>n}){this.filehandle=e,this.renameRefSeq=t}async getMetadata(e={}){const{indices:t,...n}=await this.parse(e);return n}_findFirstData(e,t){return e?e.compareTo(t)>0?t:e:t}async parse(e={}){return this.parseP||(this.parseP=this._parse(e).catch(t=>{throw this.parseP=void 0,t})),this.parseP}async hasRefSeq(e,t={}){var n;return!!(!((n=(await this.parse(t)).indices[e])===null||n===void 0)&&n.binIndex)}}const ne=21578324,U=14;function ie(o,e){return o+=1,e-=1,[[0,0],[1+(o>>26),1+(e>>26)],[9+(o>>23),9+(e>>23)],[73+(o>>20),73+(e>>20)],[585+(o>>17),585+(e>>17)],[4681+(o>>14),4681+(e>>14)]]}class k extends W{async lineCount(e,t={}){const n=await this.parse(t),i=n.refNameToId[e];if(i===void 0||!n.indices[i])return-1;const{stats:r}=n.indices[i];return r?r.lineCount:-1}async _parse(e={}){const t=await this.filehandle.readFile(e),n=await $(t);if(L(e.signal),n.readUInt32LE(0)!==ne)throw new Error("Not a TBI file");const i=n.readInt32LE(4),a=n.readInt32LE(8),r=a&65536?"zero-based-half-open":"1-based-closed",d={0:"generic",1:"SAM",2:"VCF"}[a&15];if(!d)throw new Error(`invalid Tabix preset format flags ${a}`);const l={ref:n.readInt32LE(12),start:n.readInt32LE(16),end:n.readInt32LE(20)},u=n.readInt32LE(24),c=5,f=((1<<(c+1)*3)-1)/7,I=2**(14+c*3),w=u?String.fromCharCode(u):null,m=n.readInt32LE(28),b=n.readInt32LE(32),{refNameToId:p,refIdToName:x}=this._parseNameBytes(n.slice(36,36+b));let h=36+b,g;return{indices:new Array(i).fill(0).map(()=>{const y=n.readInt32LE(h);h+=4;const S={};let E;for(let v=0;vf+1)throw new Error("tabix index contains too many bins, please use a CSI index");if(_===f+1){const N=n.readInt32LE(h);h+=4,N===2&&(E=this.parsePseudoBin(n,h)),h+=16*N}else{const N=n.readInt32LE(h);h+=4;const O=new Array(N);for(let F=0;F>U>=s.linearIndex.length?s.linearIndex.length-1:t>>U]:new V(0,0))||console.warn("querying outside of possible tabix range");const l=ie(t,n),u=[];for(const[m,b]of l)for(let p=m;p<=b;p++)if(s.binIndex[p])for(const x of s.binIndex[p])u.push(new D(x.minv,x.maxv,p));const c=s.linearIndex.length;let f=null;const I=Math.min(t>>14,c-1),w=Math.min(n>>14,c-1);for(let m=I;m<=w;++m){const b=s.linearIndex[m];b&&(!f||b.compareTo(f)<0)&&(f=b)}return X(u,f)}}const re=21582659,se=38359875;function ae(o,e){return o*2**e}function G(o,e){return Math.floor(o/2**e)}class M extends W{constructor(e){super(e),this.maxBinNumber=0,this.depth=0,this.minShift=0}async lineCount(e,t={}){const n=await this.parse(t),i=n.refNameToId[e];if(i===void 0||!n.indices[i])return-1;const{stats:r}=n.indices[i];return r?r.lineCount:-1}indexCov(){throw new Error("CSI indexes do not support indexcov")}parseAuxData(e,t){const n=e.readInt32LE(t),i=n&65536?"zero-based-half-open":"1-based-closed",a={0:"generic",1:"SAM",2:"VCF"}[n&15];if(!a)throw new Error(`invalid Tabix preset format flags ${n}`);const r={ref:e.readInt32LE(t+4),start:e.readInt32LE(t+8),end:e.readInt32LE(t+12)},s=e.readInt32LE(t+16),d=s?String.fromCharCode(s):null,l=e.readInt32LE(t+20),u=e.readInt32LE(t+24),{refIdToName:c,refNameToId:f}=this._parseNameBytes(e.slice(t+28,t+28+u));return{refIdToName:c,refNameToId:f,skipLines:l,metaChar:d,columnNumbers:r,format:a,coordinateType:i}}_parseNameBytes(e){let t=0,n=0;const i=[],a={};for(let r=0;r=30?this.parseAuxData(t,16):{refIdToName:[],refNameToId:{},metaChar:null,columnNumbers:{ref:0,start:1,end:2},coordinateType:"zero-based-half-open",format:"generic"},s=t.readInt32LE(16+a);let d,l=16+a+4;const u=new Array(s).fill(0).map(()=>{const c=t.readInt32LE(l);l+=4;const f={};let I;for(let w=0;wthis.maxBinNumber)I=this.parsePseudoBin(t,l+4),l+=48;else{const b=T(t,l+4);d=this._findFirstData(d,b);const p=t.readInt32LE(l+12);l+=16;const x=new Array(p);for(let h=0;h2**50&&(t=2**34),t-=1;let n=0,i=0,a=this.minShift+this.depth*3;const r=[];for(;n<=this.depth;a-=3,i+=ae(1,n*3),n+=1){const s=i+G(e,a),d=i+G(t,a);if(d-s+r.length>this.maxBinNumber)throw new Error(`query ${e}-${t} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`);r.push([s,d])}return r}}const z=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function oe(o){return new Promise(e=>setTimeout(e,o))}class xe{constructor({path:e,filehandle:t,url:n,tbiPath:i,tbiUrl:a,tbiFilehandle:r,csiPath:s,csiUrl:d,csiFilehandle:l,yieldTime:u=500,renameRefSeqs:c=I=>I,chunkCacheSize:f=5*2**20}){if(t)this.filehandle=t;else if(e)this.filehandle=new B(e);else if(n)this.filehandle=new A(n);else throw new TypeError("must provide either filehandle or path");if(r)this.index=new k({filehandle:r,renameRefSeqs:c});else if(l)this.index=new M({filehandle:l,renameRefSeqs:c});else if(i)this.index=new k({filehandle:new B(i),renameRefSeqs:c});else if(s)this.index=new M({filehandle:new B(s),renameRefSeqs:c});else if(e)this.index=new k({filehandle:new B(`${e}.tbi`),renameRefSeqs:c});else if(d)this.index=new M({filehandle:new A(d)});else if(a)this.index=new k({filehandle:new A(a)});else if(n)this.index=new k({filehandle:new A(`${n}.tbi`)});else throw new TypeError("must provide one of tbiFilehandle, tbiPath, csiFilehandle, csiPath, tbiUrl, csiUrl");this.renameRefSeq=c,this.yieldTime=u,this.chunkCache=new J({cache:new K({maxSize:Math.floor(f/65536)}),fill:(I,w)=>this.readChunk(I,{signal:w})})}async getLines(e,t,n,i){var a;let r,s={},d;typeof i=="function"?d=i:(s=i,d=i.lineCallback,r=i.signal);const l=await this.index.getMetadata(s);L(r);const u=t??0,c=n??l.maxRefLength;if(!(u<=c))throw new TypeError("invalid start and end coordinates. start must be less than or equal to end");if(u===c)return;const f=await this.index.blocksForRange(e,u,c,s);L(r);let I=Date.now();for(const w of f){let m;const{buffer:b,cpositions:p,dpositions:x}=await this.chunkCache.get(w.toString(),w,r);L(r);let h=0,g=0;for(;h=x[g++];);g--}const{startCoordinate:E,overlaps:P}=this.checkLine(l,e,u,c,S);if(m!==void 0&&E!==void 0&&m>E)throw new Error(`Lines not sorted by start coordinate (${m} > ${E}), this file is not usable with Tabix.`);if(m=E,P)d(S.trim(),p[g]*256+(h-x[g])+w.minv.dataPosition+1);else if(E!==void 0&&E>=c)return;this.yieldTime&&I-Date.now()>this.yieldTime&&(I=Date.now(),L(r),await oe(1)),h=C+1}}}async getMetadata(e={}){return this.index.getMetadata(e)}async getHeaderBuffer(e={}){const{firstDataLine:t,metaChar:n,maxBlockSize:i}=await this.getMetadata(e);L(e.signal);const a=((t==null?void 0:t.blockPosition)||0)+i,r=await this._readRegion(0,a,e),s=await $(r);if(n){let d=-1;const l=10,u=n.charCodeAt(0);for(let c=0;c=i)return{startCoordinate:p,overlaps:!1};if((f===0||f===c)&&p+1<=n)return{startCoordinate:p,overlaps:!1}}else if(l==="VCF"&&w===4)b=a.slice(m,x);else if(w===f&&(l==="VCF"?this._getVcfEnd(p,b,a.slice(m,x)):parseInt(a.slice(m,x),10))<=n)return{overlaps:!1};if(m=x+1,w+=1,w>I)break}return{startCoordinate:p,overlaps:!0}}_getVcfEnd(e,t,n){let i=e+t.length;const a=n.includes("SVTYPE=TRA");if(n[0]!=="."&&!a){let r=";";for(let s=0;sn in e?$e(e,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[n]=i;var C=(e,n,i)=>Ge(e,typeof n!="symbol"?n+"":n,i);import{m as Qe}from"./index-CLPuIZl5.js";/*!----------------------------------------------------------------------------- +var $e=Object.defineProperty;var Ge=(e,n,i)=>n in e?$e(e,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[n]=i;var C=(e,n,i)=>Ge(e,typeof n!="symbol"?n+"":n,i);import{m as Qe}from"./index-B-N43nsC.js";/*!----------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Version: 0.44.0(3e047efd345ff102c8c61b5398fb30845aaac166) * Released under the MIT license diff --git a/playground/index.html b/playground/index.html index 4d9b53e..aef3471 100644 --- a/playground/index.html +++ b/playground/index.html @@ -10,7 +10,7 @@ href="https://fonts.googleapis.com/css2?family=Source+Code+Pro&display=swap" rel="stylesheet" /> - +