celldega 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "celldega",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "npm run build -- --sourcemap=inline --watch",
@@ -1722,7 +1722,7 @@ ${g.stack}`:B}var LE=0,aM=new TextEncoder("utf-8"),VeA=typeof aM.encodeInto=="fu
1722
1722
  if(bool(picking.isActive)){
1723
1723
  widthPixels.xy += pickingLineWidthExtraPixels;
1724
1724
  }
1725
- `),{...A,inject:{...A.inject||{},"vs:#decl":(A.inject?.["vs:#decl"]||"").concat("uniform float pickingLineWidthExtraPixels;")}}}draw(A){super.draw({...A,uniforms:{...A.uniforms,pickingLineWidthExtraPixels:this.props.pickingLineWidthExtraPixels}})}};Vn.defaultProps=jrA;Vn.layerName="EditablePathLayer";var XrA=[0,0,0,153],zrA=[0,0,0,144],_rA=[0,0,0,255],$rA=[0,0,144,144],AnA=[144,144,144,255],gnA=[144,144,144,144],InA=[192,0,0,255],BnA=[0,0,0,128],QnA=[124,0,192,255],CnA=[255,255,255,255],EnA=5,inA=3,onA=7,tnA=32*P0,$O=HE;function st(g){return!g||typeof g!="function"?g:A=>g(enA(A))}function enA(g){return g.__source?g.__source.object:g.sourceFeature?g.sourceFeature.feature:g}function _O(g){switch(g.properties.editHandleType){case"existing":return InA;case"snap-source":return QnA;case"intermediate":default:return BnA}}function anA(g){return CnA}function DnA(g){switch(g.properties.editHandleType){case"existing":return EnA;case"snap":return onA;case"intermediate":default:return inA}}var snA={mode:$O,onEdit:()=>{},pickable:!0,pickingRadius:10,pickingDepth:5,fp64:!1,filled:!0,stroked:!0,lineWidthScale:P0,lineWidthMinPixels:1,lineWidthMaxPixels:Number.MAX_SAFE_INTEGER,pickingLineWidthExtraPixels:0,lineWidthUnits:"pixels",lineJointRounded:!1,lineCapRounded:!1,lineMiterLimit:4,pointRadiusScale:1,pointRadiusMinPixels:2,pointRadiusMaxPixels:Number.MAX_SAFE_INTEGER,getLineColor:(g,A,I)=>A?_rA:XrA,getFillColor:(g,A,I)=>A?$rA:zrA,getRadius:g=>g&&g.properties&&g.properties.radius||g&&g.properties&&g.properties.size||1,getLineWidth:g=>g&&g.properties&&g.properties.lineWidth||3,getTentativeLineColor:g=>AnA,getTentativeFillColor:g=>gnA,getTentativeLineWidth:g=>g&&g.properties&&g.properties.lineWidth||3,editHandleType:"point",editHandlePointRadiusScale:1,editHandlePointOutline:!0,editHandlePointStrokeWidth:2,editHandlePointRadiusUnits:"pixels",editHandlePointRadiusMinPixels:4,editHandlePointRadiusMaxPixels:8,getEditHandlePointColor:_O,getEditHandlePointOutlineColor:anA,getEditHandlePointRadius:DnA,editHandleIconAtlas:null,editHandleIconMapping:null,editHandleIconSizeScale:1,editHandleIconSizeUnits:"pixels",getEditHandleIcon:g=>g.properties.editHandleType,getEditHandleIconSize:10,getEditHandleIconColor:_O,getEditHandleIconAngle:0,billboard:!0},rnA={view:pC,modify:co,translate:new Pn(new et),transform:new Pn(new Z0),scale:qe,rotate:de,duplicate:N0,split:l0,extrude:J0,elevation:Y0,drawPoint:K0,drawLineString:p0,drawPolygon:HE,drawRectangle:Ms,drawSquare:d0,drawRectangleFromCenter:U0,drawSquareFromCenter:S0,drawCircleFromCenter:H0,drawCircleByBoundingBox:f0,drawEllipseByBoundingBox:u0,drawRectangleUsing3Points:m0,drawEllipseUsing3Points:x0,draw90DegreePolygon:b0,drawPolygonByDragging:T0},rt=class extends On{constructor(){super(...arguments);q(this,"state")}renderLayers(){let I=this.getSubLayerProps({id:"geojson",data:this.props.data,fp64:this.props.fp64,filled:this.props.filled,stroked:this.props.stroked,lineWidthScale:this.props.lineWidthScale,lineWidthMinPixels:this.props.lineWidthMinPixels,lineWidthMaxPixels:this.props.lineWidthMaxPixels,lineWidthUnits:this.props.lineWidthUnits,lineJointRounded:this.props.lineJointRounded,lineCapRounded:this.props.lineCapRounded,lineMiterLimit:this.props.lineMiterLimit,pointRadiusScale:this.props.pointRadiusScale,pointRadiusMinPixels:this.props.pointRadiusMinPixels,pointRadiusMaxPixels:this.props.pointRadiusMaxPixels,getLineColor:this.selectionAwareAccessor(this.props.getLineColor),getFillColor:this.selectionAwareAccessor(this.props.getFillColor),getPointRadius:this.selectionAwareAccessor(this.props.getRadius),getLineWidth:this.selectionAwareAccessor(this.props.getLineWidth),_subLayerProps:{linestrings:{billboard:this.props.billboard,updateTriggers:{all:[this.props.selectedFeatureIndexes,this.props.mode]}},"polygons-stroke":{billboard:this.props.billboard,pickingLineWidthExtraPixels:this.props.pickingLineWidthExtraPixels,type:Vn,updateTriggers:{all:[this.props.selectedFeatureIndexes,this.props.mode]}}},updateTriggers:{getLineColor:[this.props.selectedFeatureIndexes,this.props.mode],getFillColor:[this.props.selectedFeatureIndexes,this.props.mode],getPointRadius:[this.props.selectedFeatureIndexes,this.props.mode],getLineWidth:[this.props.selectedFeatureIndexes,this.props.mode]}}),B=[new $D(I)];return B=B.concat(this.createGuidesLayers(),this.createTooltipsLayers()),B}initializeState(){super.initializeState(),this.setState({selectedFeatures:[],editHandles:[]})}shouldUpdateState(I){return super.shouldUpdateState(I)||I.changeFlags.stateChanged}updateState({props:I,oldProps:B,changeFlags:Q,context:C}){if(super.updateState({oldProps:B,props:I,changeFlags:Q,context:C}),Q.propsOrDataChanged&&(Object.keys(B).length===0||I.mode!==B.mode)){let e;if(typeof I.mode=="function"){let D=I.mode;e=new D}else typeof I.mode=="string"?(e=rnA[I.mode],console.warn("Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead.")):e=I.mode;e||(console.warn(`No mode configured for ${String(I.mode)}`),e=new $O),e!==this.state.mode&&this.setState({mode:e,cursor:null})}let E=[];if(Array.isArray(I.selectedFeatureIndexes)&&typeof I.data=="object"&&"features"in I.data){let o=I.data;E=I.selectedFeatureIndexes.map(e=>o.features[e])}this.setState({selectedFeatures:E})}getModeProps(I){return{modeConfig:I.modeConfig,data:I.data,selectedIndexes:I.selectedFeatureIndexes,lastPointerMoveEvent:this.state.lastPointerMoveEvent,cursor:this.state.cursor,onEdit:B=>{this.setNeedsUpdate(),I.onEdit(B)},onUpdateCursor:B=>{this.setState({cursor:B})}}}selectionAwareAccessor(I){return typeof I!="function"?I:B=>I(B,this.isFeatureSelected(B),this.props.mode)}isFeatureSelected(I){return!this.props.data||!this.props.selectedFeatureIndexes||!this.props.selectedFeatureIndexes.length?!1:this.state.selectedFeatures.includes(I)}getPickingInfo({info:I,sourceLayer:B}){return B.id.endsWith("guides")&&(I.isGuide=!0),I}_updateAutoHighlight(I){if(I?.sourceLayer)if(I.isGuide)for(let B of I.sourceLayer.getSubLayers())B.updateAutoHighlight(I);else I.sourceLayer.updateAutoHighlight(I)}createGuidesLayers(){let B=this.getActiveMode().getGuides(this.getModeProps(this.props));if(!B||!B.features.length)return[];let Q={linestrings:{billboard:this.props.billboard,autoHighlight:!1},"polygons-fill":{autoHighlight:!1},"polygons-stroke":{billboard:this.props.billboard}};return this.props.editHandleType==="icon"?Q["points-icon"]={type:Ga,iconAtlas:this.props.editHandleIconAtlas,iconMapping:this.props.editHandleIconMapping,sizeUnits:this.props.editHandleIconSizeUnits,sizeScale:this.props.editHandleIconSizeScale,getIcon:st(this.props.getEditHandleIcon),getSize:st(this.props.getEditHandleIconSize),getColor:st(this.props.getEditHandleIconColor),getAngle:st(this.props.getEditHandleIconAngle),billboard:this.props.billboard}:Q["points-circle"]={type:BQ,radiusScale:this.props.editHandlePointRadiusScale,stroked:this.props.editHandlePointOutline,getLineWidth:this.props.editHandlePointStrokeWidth,radiusUnits:this.props.editHandlePointRadiusUnits,radiusMinPixels:this.props.editHandlePointRadiusMinPixels,radiusMaxPixels:this.props.editHandlePointRadiusMaxPixels,getRadius:st(this.props.getEditHandlePointRadius),getFillColor:st(this.props.getEditHandlePointColor),getLineColor:st(this.props.getEditHandlePointOutlineColor),billboard:this.props.billboard},[new $D(this.getSubLayerProps({id:"guides",data:B,fp64:this.props.fp64,_subLayerProps:Q,lineWidthScale:this.props.lineWidthScale,lineWidthMinPixels:this.props.lineWidthMinPixels,lineWidthMaxPixels:this.props.lineWidthMaxPixels,lineWidthUnits:this.props.lineWidthUnits,lineJointRounded:this.props.lineJointRounded,lineCapRounded:this.props.lineCapRounded,lineMiterLimit:this.props.lineMiterLimit,getLineColor:st(this.props.getTentativeLineColor),getLineWidth:st(this.props.getTentativeLineWidth),getFillColor:st(this.props.getTentativeFillColor),pointType:this.props.editHandleType==="icon"?"icon":"circle",iconAtlas:this.props.editHandleIconAtlas}))]}createTooltipsLayers(){let B=this.getActiveMode().getTooltips(this.getModeProps(this.props));return[new vt({getSize:tnA,...this.getSubLayerProps({id:"tooltips",data:B})})]}onLayerClick(I){this.getActiveMode().handleClick(I,this.getModeProps(this.props))}onLayerKeyUp(I){this.getActiveMode().handleKeyUp(I,this.getModeProps(this.props))}onStartDragging(I){this.getActiveMode().handleStartDragging(I,this.getModeProps(this.props))}onDragging(I){this.getActiveMode().handleDragging(I,this.getModeProps(this.props))}onStopDragging(I){this.getActiveMode().handleStopDragging(I,this.getModeProps(this.props))}onPointerMove(I){this.setState({lastPointerMoveEvent:I}),this.getActiveMode().handlePointerMove(I,this.getModeProps(this.props))}getCursor({isDragging:I}){if(this.state===null||this.state===void 0)return null;let{cursor:B}=this.state;return B||(B=I?"grabbing":"grab"),B}getActiveMode(){return this.state.mode}};q(rt,"layerName","EditableGeoJsonLayer"),q(rt,"defaultProps",snA);var nnA=pC,cnA=9;var Iwg={mode:nnA,...rt.defaultProps,data:[],selectedIndexes:[],filled:!1,stroked:!0,lineWidthScale:P0,lineWidthMinPixels:1,lineWidthMaxPixels:Number.MAX_SAFE_INTEGER,lineWidthUnits:"pixels",getHexagons:g=>g.hexIds,getEditedCluster:(g,A)=>A?{...A,hexIds:g}:{hexIds:g},resolution:cnA};var ul={NONE:null,RECTANGLE:"rectangle",POLYGON:"polygon"},Dwg={[ul.RECTANGLE]:Ms,[ul.POLYGON]:HE},swg={[ul.RECTANGLE]:{dragToDraw:!0}},rwg={selectionType:ul.RECTANGLE,layerIds:[],onSelect:()=>{}};var GnA=g=>(g.features.forEach((A,I)=>{if(A.geometry.type==="Polygon"){let B=A.geometry.coordinates[0],Q=Math.abs(YJ(B));A.properties={...A.properties,area:Q,name:A.properties.name||`Feature ${I+1}`,color:A.properties.color||[Math.random()*255,Math.random()*255,Math.random()*255]}}else console.warn(`Feature ${I} is not a Polygon.`)}),g),ml=g=>{Object.keys(g.model).length>0&&(g.model.set("region",{}),g.model.set("region",g.edit.feature_collection),g.model.save_changes())},xl=(g,A,I)=>{g.edit.feature_collection=GnA(g.edit.feature_collection),g.edit.rgn_areas=g.edit.feature_collection.features.map((B,Q)=>({name:(Q+1).toString(),value:B.properties.area})).sort((B,Q)=>Q.value-B.value),g.edit.color_dict_rgn=g.edit.feature_collection.features.reduce((B,Q,C)=>(B[(C+1).toString()]=Q.properties.color,B),{}),Je(g.edit.svg_bar_rgn,g.edit.rgn_areas,g.edit.color_dict_rgn,UM,[],A,I,g)},wnA=(g,A,I,B)=>{let{updatedData:Q,editType:C}=B;I.edit.feature_collection=Q,A.edit_layer=A.edit_layer.clone({data:I.edit.feature_collection}),C==="addFeature"&&(bl(A,pC),VA(I.edit.buttons.sktch).style("color","gray").classed("active",!1),I.edit.mode="view",V0(A,!0),O0(A,!0),vh(A,!0),xl(I,g,A),ml(I));let E=ag(A,I.close_up);g.setProps({layers:E}),xl(I,g,A),ml(I)},hnA=(g,A,I,B)=>{if(g.featureType==="polygons"&&B.edit.mode==="view"){I.edit_layer=I.edit_layer.clone({id:"edit-layer-modify",mode:co,selectedFeatureIndexes:[g.index],modeConfig:{dragToAddNew:!0,enableSnapping:!1}});let Q=ag(I,B.close_up);A.setProps({layers:Q}),B.edit.mode="modify",B.edit.modify_index=g.index,VA(B.edit.buttons.del).classed("active",!0).style("display","inline-flex"),VA(B.edit.buttons.rgn).style("display","none"),VA(B.edit.buttons.sktch).style("display","none")}else if(g.featureType==="polygons"&&B.edit.mode==="modify"){I.edit_layer=I.edit_layer.clone({id:"edit-layer-view",mode:pC,selectedFeatureIndexes:[]});let Q=ag(I,B.close_up);A.setProps({layers:Q}),B.edit.mode="view",B.edit.modify_index=null,VA(B.edit.buttons.del).classed("active",!1).style("display","none"),VA(B.edit.buttons.rgn).style("display","inline-flex"),VA(B.edit.buttons.sktch).style("display","inline-flex")}},AV=g=>new rt({id:"edit-layer",data:g.edit.feature_collection,selectedFeatureIndexes:[],mode:pC,filled:!0,pointRadiusMinPixels:2,pointRadiusScale:2e3,extruded:!0,getElevation:1e3,getFillColor:I=>I.properties.color,pickable:!0,autoHighlight:!0,modeConfig:{preventOverlappingLines:!0},visible:!1}),gV=(g,A,I)=>{A.edit_layer=A.edit_layer.clone({onEdit:B=>wnA(g,A,I,B)})},IV=(g,A,I)=>{A.edit_layer=A.edit_layer.clone({onClick:B=>hnA(B,g,A,I)})},bl=(g,A)=>{g.edit_layer=g.edit_layer.clone({mode:A})},vS=(g,A)=>{g.edit_layer=g.edit_layer.clone({visible:A})};var EB=(g,A,I)=>{VA(A.containers.image).selectAll(".img_layer_button").style("color",I?"blue":"gray"),A.img.image_layer_sliders.map(B=>fa(B,I)),MM(g,I)},jS=()=>{let g=document.createElement("div");return g.style.display="flex",g.style.flexDirection="row",g.style.border="1px solid #d3d3d3",g.className="ui_container",g.style.height="100px",g},BV=()=>{let g=document.createElement("div");return g.style.display="flex",g.style.flexDirection="row",g.className="ctrl_container",g.style.width="535px",g},rE=(g,A,I=null)=>{let B=document.createElement("div");return B.className=g,B.style.display="flex",B.style.flexDirection=A,I!==null&&(B.style.height=I+"px",B.style.overflow="scroll"),B},Tl=g=>{let A=document.createElement("div");return A.className=g,A.style.width="100%",A.style.marginLeft="2px",A.style.marginTop="2px",A},QV=(g,A,I)=>{let B=jS(),Q=rE("button_container","column"),C=rE("slider_container","column"),E=33,o=["col","row"],e=["clust","sum","var","ini"];o.forEach(r=>{let n=rE(r,"row");VA(n).append("div").text(r.toUpperCase()).style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),e.forEach(G=>{f8(n,G,G==="clust",E,r,g,A,I)}),Q.appendChild(n)}),I.dendro.sliders={},o.forEach(r=>{I.dendro.sliders[r]=document.createElement("input"),I.dendro.sliders[r].type="range",I.dendro.sliders[r].min="0",I.dendro.sliders[r].max="100",I.dendro.sliders[r].value=50,I.dendro.sliders[r].className="slider",I.dendro.sliders[r].style.width="75px"});let D=(r,n,G,w)=>{n.dendro.sliders[G+"_value"]=n.dendro.max_linkage_dist[G]*w.target.value/100,EU(n,G,n.dendro.sliders[G+"_value"]),iU(n,G),zh(n,G),L8(A,n,G),r.setProps({layers:Qt(A)})};return o.forEach(r=>{I.dendro.sliders[r].addEventListener("input",n=>D(g,I,r,n))}),I.dendro.sliders.col.style.marginTop="5px",I.dendro.sliders.row.style.marginTop="20px",VA(C).append("div").text("DENDRO").style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-left","20px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),C.appendChild(I.dendro.sliders.col),C.appendChild(I.dendro.sliders.row),Q.style.marginTop="15px",C.style.marginTop="0px",C.style.marginLeft="10px",B.appendChild(Q),B.appendChild(C),B},CV=(g,A,I)=>{let B=jS(),Q=BV(),C=rE("image_container","row"),E=rE("tile_container","row"),o=Tl("tile_slider_container");return ks(C,"sst","IMG","blue",50,"button",g,A,I),ks(E,"sst","TILE","blue",50,"button",g,A,I),I.sliders={},KM("tile",g,A,I),o.appendChild(I.sliders.tile),B.appendChild(Q),E.appendChild(o),IU("sst",g,A,I),Q.appendChild(C),Q.appendChild(E),Q.appendChild(I.genes.gene_search),B},EV=(g,A,I,B)=>{let Q=jS(),C=BV();B.containers.image=rE("image_container","column");let E=rE("img_layers_container","column",72);E.style.width="135px",E.style.border="1px solid #d3d3d3",E.style.marginTop="3px",E.style.marginLeft="2px",E.addEventListener("wheel",K=>{let{scrollTop:U,scrollHeight:f,clientHeight:Y}=E,P=U===0,Z=U+Y===f;(P&&K.deltaY<0||Z&&K.deltaY>0)&&K.preventDefault()});let o=rE("cell_container","column");o.style.width="120px";let e=rE("cell_ctrl_container","row");e.style.marginLeft="0px";let D=rE("gene_container","column");D.style.marginTop="0px",D.style.width="125px";let r=rE("trx_container","row"),n=rE("rgn_container","column");n.style.width="120px";let G=rE("rgn_ctrl_container","row");G.style.marginLeft="0px";let w=Tl("cell_slider_container"),k=Tl("trx_slider_container");ks(B.containers.image,"ist","IMG","blue",30,"button",A,I,B);let F=(K,U)=>K.image_layer_sliders.filter(f=>f.name===U),h=(K,U)=>{let f=U.button_name,Y=rE("image_layer_container","row");Y.style.height="21px",ks(Y,"ist",f,"blue",75,"img_layer_button",A,I,B);let P=Tl(f),Z=F(K,f)[0],j=d8(f,A,I,B),gA=qM(j,100);BU(Z,50,gA),P.appendChild(Z),Y.appendChild(P),E.appendChild(Y)};B.img.image_info.map(K=>h(B.img,K)),ks(e,"ist","CELL","blue",40,"button",A,I,B),ks(r,"ist","TRX","blue",40,"button",A,I,B),B.containers.image.appendChild(E),B.sliders={},KM("cell",A,I,B),w.appendChild(B.sliders.cell),e.appendChild(w),B.containers.bar_cluster=dM(),SM(B.containers.bar_cluster,ys,B.cats.svg_bar_cluster,B.cats.cluster_counts,B.cats.color_dict_cluster,A,I,B),B.containers.bar_gene=dM(),SM(B.containers.bar_gene,Xh,B.genes.svg_bar_gene,B.genes.gene_counts,B.genes.color_dict_gene,A,I,B),o.appendChild(e),o.appendChild(B.containers.bar_cluster),KM("trx",A,I,B),r.appendChild(k),k.appendChild(B.sliders.trx),D.appendChild(r),D.appendChild(B.containers.bar_gene),IU("ist",A,I,B),B.genes.gene_search.style.marginLeft="0px",Q.appendChild(C),C.appendChild(B.containers.image),C.appendChild(o),C.appendChild(D),B.genes.gene_search.style.width="160px",C.appendChild(B.genes.gene_search);let y=(K,U,f,Y)=>{let P=VA(K.currentTarget),Z=P.classed("active");if(Y.edit.visible=!0,P.classed("active",Y.edit.visible).style("color","blue"),VA(Y.edit.buttons.rgn).style("color","blue").classed("active",!0),vS(f,Y.edit.visible),Z===!1){P.classed("active",!0).style("color","blue"),Y.edit.mode="sktch",bl(f,HE),V0(f,!1),O0(f,!1),vh(f,!1);let j=ag(f,Y.close_up);U.setProps({layers:j})}else if(Z===!0){Y.edit.mode="view",P.classed("active",!1).style("color","gray"),bl(f,pC),V0(f,!0),O0(f,!0),vh(f,!0);let j=ag(f,Y.close_up);U.setProps({layers:j})}},J=(K,U,f,Y)=>{let P=VA(K.currentTarget);P.classed("active")===!1?(Y.edit.visible=!0,P.classed("active",Y.edit.visible).style("color","blue")):(Y.edit.visible=!1,P.classed("active",Y.edit.visible).style("color","gray")),vS(f,Y.edit.visible);let j=ag(f,Y.close_up);U.setProps({layers:j})},M=(K,U)=>(U>=0&&U<K.features.length&&K.features.splice(U,1),K),l=(K,U,f,Y)=>{Y.edit.feature_collection=M(Y.edit.feature_collection,Y.edit.modify_index),f.edit_layer=f.edit_layer.clone({id:"edit-layer-delete",data:Y.edit.feature_collection,mode:pC,selectedFeatureIndexes:[]});let P=ag(f,Y.close_up);U.setProps({layers:P}),VA(Y.edit.buttons.del).classed("active",!1).style("display","none"),VA(Y.edit.buttons.rgn).style("display","inline-flex"),VA(Y.edit.buttons.sktch).style("display","inline-flex"),xl(Y,U,f),ml(Y)};return B.edit.buttons={},B.edit.mode="view",pM(A,I,B,G,"RGN",30,J),pM(A,I,B,G,"SKTCH",40,y),pM(A,I,B,G,"DEL",30,l),VA(B.edit.buttons.del).style("color","red").style("display","none"),B.containers.bar_rgn=dM(),n.appendChild(G),n.appendChild(B.containers.bar_rgn),C.appendChild(n),SM(B.containers.bar_rgn,UM,B.edit.svg_bar_rgn,B.edit.rgn_areas,B.edit.color_dict_rgn,A,I,B),Q};var NnA=(g,A,I)=>{let B=g.polygon_cell_names[I.index],Q=g.dict_cell_cats[B],C;Q in g.color_dict_cluster?C=g.color_dict_cluster[Q]:C=[0,0,255];let E=g.selected_cats.length===0||g.selected_cats.includes(Q)?255:50;return[...C,E]},iV=g=>new bi({id:"path-layer",data:[],pickable:!0,widthScale:3,widthMinPixels:1,getPath:I=>I,getColor:(I,B)=>NnA(g.cats,I,B),widthUnits:"pixels"}),knA=(g,A,I,B,Q)=>{let C=Q.cats.polygon_cell_names[g.index],E=Q.cats.dict_cell_cats[C];Wg(Q.cats,"cluster"),QI(Q.cats,[E]),zI(Q.genes,[]),EB(B,Q,!Q.cats.selected_cats.length>0);let o=Q.cats.selected_cats.join("-");_I(B,o),GB(B,o),cB(Q.genes,B);let e=ag(B,Q.close_up);I.setProps({layers:e})},oV=async(g,A,I,B)=>{let Q=await v4(g,A,B);I.path_layer=I.path_layer.clone({data:Q})},tV=(g,A,I)=>{A.path_layer=A.path_layer.clone({onClick:(B,Q)=>knA(B,Q,g,A,I)})},u8=(g,A)=>{g.path_layer=g.path_layer.clone({visible:A})},GB=(g,A)=>{g.path_layer=g.path_layer.clone({id:"path-layer-"+A})},O0=(g,A)=>{g.path_layer=g.path_layer.clone({pickable:A})};var ynA=async(g,A,I,B,Q)=>{let C="ontouchstart"in window||navigator.maxTouchPoints>0,E;C?E=Q.cats.cell_cats[g.index]:E=Q.tooltip_cat_cell,Wg(Q.cats,"cluster"),QI(Q.cats,[E]),zI(Q.genes,[]),EB(B,Q,!Q.cats.selected_cats.length>0);let o=Q.cats.selected_cats.join("-");if(Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",Q.cats.reset_cat?1:.25),Q.cats.reset_cat)Q.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let D=Q.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===E}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=Q.containers.bar_cluster.getBoundingClientRect().top,G=r-n+Q.containers.bar_cluster.scrollTop;Q.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}_I(B,o),GB(B,o),cB(Q.genes,B);let e=ag(B,Q.close_up);I.setProps({layers:e}),Q.genes.gene_search_input.value="",RQ(Q.genes,"")},eV=async(g,A)=>{let I=g+"/cell_metadata.parquet";var B=await FQ(I,zg.fetch);let Q=Jn(B);await H4(A.genes,g),f4(A.cats,B),u4(A.cats);var C=await FQ(g+"/cell_clusters/cluster.parquet",zg.fetch);m4(A.cats,C,"cluster"),b4(A.cats);let E=B.getChild("name").toArray(),o=Q.attributes.getPosition.value;return A.combo_data.cell=E.map((D,r)=>({name:D,cat:A.cats.dict_cell_cats[D],x:o[r*2],y:o[r*2+1]})),new BQ({id:"cell-layer",radiusMinPixels:1,getRadius:5,pickable:!0,getColor:(D,r)=>T4(A.cats,D,r),data:Q})},aV=(g,A,I)=>{A.cell_layer=A.cell_layer.clone({onClick:(B,Q)=>ynA(B,Q,g,A,I)})},m8=(g,A)=>{g.cell_layer=g.cell_layer.clone({visible:A})},U8=(g,A)=>{g.cell_layer=g.cell_layer.clone({getRadius:A})},_I=(g,A)=>{g.cell_layer=g.cell_layer.clone({id:"cell-layer-"+A})},V0=(g,A)=>{g.cell_layer=g.cell_layer.clone({pickable:A})};var Wl=()=>[new Ei({id:"ortho"})];var DV=(g,A,I,B,Q)=>{let C=Math.floor(g/Q),E=Math.floor(A/Q),o=Math.floor(I/Q),e=Math.floor(B/Q),D=[];for(let r=C;r<=E;r++)for(let n=o;n<=e;n++)D.push({tileX:r,tileY:n,name:r+"_"+n});return D};var Zl=async({height:g,width:A,zoom:I,target:B},Q,C,E)=>{let o=E.img.landscape_parameters.tile_size,e=50,D=Math.pow(2,I),[r,n]=B,G=A/(2*D),w=g/(2*D);E.bounds={},E.bounds.min_x=r-G,E.bounds.max_x=r+G,E.bounds.min_y=n-w,E.bounds.max_y=n+w;let k=Q.viewManager.getViewports();if(!k||k.length===0){console.error("No viewports available");return}let F=DV(E.bounds.min_x,E.bounds.max_x,E.bounds.min_y,E.bounds.max_y,o);if(F.length<e){await K8(E.global_base_url,F,C,E),await oV(E.global_base_url,F,C,E),E.close_up=!0;let M=E.combo_data.trx.filter(f=>f.x>=E.bounds.min_x&&f.x<=E.bounds.max_x&&f.y>=E.bounds.min_y&&f.y<=E.bounds.max_y).map(f=>f.name).reduce((f,Y)=>{let P=f.find(Z=>Z.name===Y);return P?P.value+=1:f.push({name:Y,value:1}),f},[]).filter(f=>f.value>0).sort((f,Y)=>Y.value-f.value);Je(E.genes.svg_bar_gene,M,E.genes.color_dict_gene,Xh,E.genes.selected_genes,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});let U=E.combo_data.cell.filter(f=>f.x>=E.bounds.min_x&&f.x<=E.bounds.max_x&&f.y>=E.bounds.min_y&&f.y<=E.bounds.max_y).map(f=>f.cat).reduce((f,Y)=>{let P=f.find(Z=>Z.name===Y);return P?P.value+=1:f.push({name:Y,value:1}),f},[]).filter(f=>f.value>0).sort((f,Y)=>Y.value-f.value);Je(E.cats.svg_bar_cluster,U,E.cats.color_dict_cluster,ys,E.cats.selected_cats,Q,C,E),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"})}else E.close_up&&(E.close_up=!1,Je(E.genes.svg_bar_gene,E.genes.gene_counts,E.genes.color_dict_gene,Xh,E.genes.selected_genes,Q,C,E),Je(E.cats.svg_bar_cluster,E.cats.cluster_counts,E.cats.color_dict_cluster,ys,E.cats.selected_cats,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"}),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"}));let h=ag(C,E.close_up);Q.setProps({layers:h})};var FnA=200,sV=qM(({viewState:g},A,I,B)=>(Zl(g,A,I,B),typeof B.custom_callbacks.view_change=="function"&&B.custom_callbacks.view_change(g,B.close_up,I.trx_layer),g),FnA);var rV=(g,A)=>{if(A.index===-1||!A.layer)return null;let I="",B="",Q="";return A.layer.id.startsWith("cell-layer")||A.layer.id.startsWith("path-layer")?(B=A.layer.id.startsWith("cell-layer")?g.cats.cell_names_array[A.index]:g.cats.polygon_cell_names[A.index],Q=g.cats.dict_cell_cats[B],I=`<div>cell: ${B}</div><div>cluster: ${Q}</div>`,g.tooltip_cat_cell=Q):A.layer.id.startsWith("trx-layer")&&(B=g.genes.trx_names_array[A.index],I=`<div>transcript: ${B}</div>`),rD(".deck-tooltip").style("margin-top","75px"),{html:I}};var RnA=({isDragging:g})=>g?"grabbing":"pointer",nV=(g,A,I)=>new ra({parent:g,controller:{doubleClickZoom:!1},getCursor:RnA,width:A,height:I}),cV=(g,A)=>{g.setProps({views:A})},GV=(g,A)=>{g.setProps({getTooltip:I=>rV(A,I)})},wV=(g,A,I)=>{g.setProps({onViewStateChange:B=>{sV(B,g,A,I)}})},hV=(g,A,I,B,Q)=>{let C={target:[A,I,B],zoom:Q};g.setProps({initialViewState:C})};var NV=(g,A)=>{g.image_format=A},kV=(g,A)=>{g.image_info=A},yV=(g,A)=>{A.forEach(I=>{g[I.button_name]=I.color})};var Pl=async(g,A)=>{let I=await FQ(A+"/meta_gene.parquet",zg.fetch),B=I.getChild("__index_level_0__").toArray(),Q=I.getChild("mean").toArray(),C=I.getChild("std").toArray(),E=I.getChild("max").toArray();B.forEach((o,e)=>{g.meta_gene[o]={mean:Q[e],std:C[e],max:E[e]},g.gene_counts.push({name:o,value:Number(Q[e])})}),g.gene_counts.sort((o,e)=>e.value-o.value),g.gene_names=g.gene_counts.map(o=>o.name)};var FV=(g,A)=>{g.color_dict_cluster=A.color;for(let B in g.color_dict_cluster)g.color_dict_cluster[B]=hs(g.color_dict_cluster[B]);var I=A.count;g.cluster_counts=[];for(let B in I)g.cluster_counts.push({name:B,value:I[B]});g.cluster_counts.sort((B,Q)=>Q.value-B.value)},RV=async g=>{let A=g.global_base_url+"/cell_clusters/meta_cluster.parquet";var I=await FQ(A,zg.fetch);let B=[],Q=[],C=[],E=I.getChild("__index_level_0__"),o=I.getChild("color"),e=I.getChild("count"),D=[];for(let r of I.schema.fields)D.push(r.name);E&&o&&(B=E.toArray(),Q=o.toArray(),C=e.toArray()),B.forEach((r,n)=>{g.cats.color_dict_cluster[r]=hs(Q[n]),g.cats.cluster_counts.push({name:r,value:Number(C[n])})}),g.cats.cluster_counts.sort((r,n)=>n.value-r.value)};var MV=async(g,A,I)=>{let B=I.model.get("update_trigger"),Q,C;if(!("click_type"in B)||!("click_value"in B)){if(B.type==="row_label"){Q=B.value.name;let E=Q===I.cats.cat?"cluster":Q;EB(A,I,I.cats.cat===Q),Wg(I.cats,E),zI(I.genes,[Q]),QI(I.cats,[]),await oo(I.cats,I.genes,I.global_base_url,Q),_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o});let e=!1;if(I.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",e?1:.25),!e){let D=I.genes.svg_bar_gene.selectAll("g").filter(function(){return VA(this).select("text").text()===Q}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_gene.getBoundingClientRect().top,G=r-n+I.containers.bar_gene.scrollTop;I.containers.bar_gene.scrollTo({top:G,behavior:"smooth"})}}I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",RQ(I.genes,Q)}else if(B.type==="col_label"){Q="cluster",C=B.value.name,Wg(I.cats,"cluster"),QI(I.cats,[C]),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let E=I.cats.selected_cats.join("-");_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let e=C;if(!I.cats.reset_cat){let D=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===e}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_cluster.getBoundingClientRect().top,G=r-n+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}}else if(B.type==="col_dendro"){Q="cluster",Q="cluster";let E=B.value.selected_names;Wg(I.cats,"cluster"),QI(I.cats,E),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let o=I.cats.selected_cats.join("-");_I(A,o),GB(A,o),cB(I.genes,A);let e=ag(A,I.close_up);g.setProps({layers:e}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let D=E;if(!I.cats.reset_cat){let r=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===D}).attr("opacity",1);if(!r.empty()){let n=r.node().getBoundingClientRect().top,G=I.containers.bar_cluster.getBoundingClientRect().top,w=n-G+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:w,behavior:"smooth"})}}Wg(I.cats,Q),QI(I.cats,B.click_value)}}else if(B.click_type==="row-label"){Q=B.click_value;let E=Q===I.cats.cat?"cluster":Q;EB(A,I,I.cats.cat===Q),Wg(I.cats,E),zI(I.genes,[Q]),QI(I.cats,[]),await oo(I.cats,I.genes,I.global_base_url,Q),_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o});let e=!1;if(I.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",e?1:.25),!e){let D=I.genes.svg_bar_gene.selectAll("g").filter(function(){return VA(this).select("text").text()===Q}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_gene.getBoundingClientRect().top,G=r-n+I.containers.bar_gene.scrollTop;I.containers.bar_gene.scrollTo({top:G,behavior:"smooth"})}}I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",RQ(I.genes,Q)}else if(B.click_type==="col-label"){Q="cluster",C=B.click_value,Wg(I.cats,"cluster"),QI(I.cats,[C]),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let E=I.cats.selected_cats.join("-");_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let e=C;if(!I.cats.reset_cat){let D=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===e}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_cluster.getBoundingClientRect().top,G=r-n+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}}else if(B.click_type==="col-dendro"){Q="cluster",Q="cluster";let E=B.click_value;Wg(I.cats,"cluster"),QI(I.cats,E),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let o=I.cats.selected_cats.join("-");_I(A,o),GB(A,o),cB(I.genes,A);let e=ag(A,I.close_up);g.setProps({layers:e}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let D=E;if(!I.cats.reset_cat){let r=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===D}).attr("opacity",1);if(!r.empty()){let n=r.node().getBoundingClientRect().top,G=I.containers.bar_cluster.getBoundingClientRect().top,w=n-G+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:w,behavior:"smooth"})}}Wg(I.cats,Q),QI(I.cats,B.click_value)}else Q="cluster"};var lV=(g,A,I)=>{let B=I.model.get("cell_clusters");FV(I.cats,B.meta_cluster),x4(I.cats,B.new_clusters),_I(A,"cluster");let Q=ag(A,I.close_up);g.setProps({layers:Q}),I.combo_data.cell=I.combo_data.cell.map(C=>({...C,cat:I.cats.dict_cell_cats[C.name]})),Je(I.cats.svg_bar_cluster,I.cats.cluster_counts,I.cats.color_dict_cluster,ys,[],g,A,I)};var MnA=(g,A,I)=>{if(g.size>=20){let Q=g.keys().next().value;g.delete(Q)}g.set(A,I)},lnA=(g,A)=>{let I=g.get(A);return I&&(g.delete(A),g.set(A,I)),I},JnA=g=>{g.clear()},XS=()=>{let g=new Map;return{set:(A,I)=>MnA(g,A,I),get:A=>lnA(g,A),clear:()=>JnA(g)}};var zS=async(g,A,I,B,Q,C,E,o,e="",D=.25,r=0,n=800,G=null)=>{r===0&&(r="100%");let w={};w.buttons={},w.buttons.blue="#8797ff",w.buttons.gray="gray",w.buttons.light_gray="#EEEEEE",dN(w,o),w.close_up=!1,w.model=A,w.containers={},w.custom_callbacks={},w.custom_callbacks.view_change=G,w.cats={},w.cats.cat,w.cats.reset_cat=!1,w.cats.selected_cats=[],w.cats.cell_cats=[],w.cats.dict_cell_cats={},w.cats.color_dict_cluster={},w.cats.cluster_counts=[],w.cats.polygon_cell_names=[],w.cats.svg_bar_cluster=Pe("svg"),w.genes={},w.genes.color_dict_gene={},w.genes.gene_names=[],w.genes.meta_gene={},w.genes.gene_counts=[],w.genes.selected_genes=[],w.genes.trx_ini_radius=D,w.genes.trx_names_array=[],w.genes.trx_data=[],w.genes.gene_text_box="",w.genes.trx_slider=document.createElement("input"),w.genes.gene_search=document.createElement("div"),w.genes.svg_bar_gene=Pe("svg"),w.cats.cell_exp_array=[],w.cats.cell_names_array=[],w.cats.cell_name_to_index_map=new Map,w.img={},w.img.image_layer_colors={},w.img.image_layer_sliders={},qN(I);let k="dapi";await UN(w.img,o);let F=w.img.landscape_parameters.image_info;NV(w.img,w.img.landscape_parameters.image_format),kV(w.img,F),q8(w.img),yV(w.img.image_layer_colors,w.img.image_info);let h=document.createElement("div");h.style.height=n+"px",h.style.border="1px solid #d3d3d3",await SN(w,o,k),await Pl(w.genes,o),await RV(w),w.views=Wl();let y=await nV(h,r,n);hV(y,B,Q,C,E),cV(y,w.views),w.cache={},w.cache.cell=await XS(),w.cache.trx=await XS(),w.combo_data={},w.tooltip_cat_cell="",GV(y,w),w.edit={},w.edit.svg_bar_rgn=Pe("svg"),w.edit.rgn_areas=[],w.edit.color_dict_rgn={},w.edit.rgn_opacity=.75,w.edit.visible=!1,w.edit.modify_index=null,Object.keys(w.model.get("region")).length===0?w.edit.feature_collection={type:"FeatureCollection",features:[]}:w.edit.feature_collection=w.model.get("region");let J=y8(w),M=await h8(w),l=await eV(o,w),K=await iV(w),U=J8(w.genes),f=AV(w),Y={background_layer:J,image_layers:M,cell_layer:l,path_layer:K,trx_layer:U,edit_layer:f};aV(y,Y,w),tV(y,Y,w),Y8(y,Y,w),gV(y,Y,w),IV(y,Y,w),YM(Y,D);let P=ag(Y,w.close_up);y.setProps({layers:P}),wV(y,Y,w),Object.keys(w.model).length>0&&(w.model.on("change:update_trigger",()=>MV(y,Y,w)),w.model.on("change:cell_clusters",()=>lV(y,Y,w)));let Z=EV(e,y,Y,w);return g.appendChild(Z),g.appendChild(h),{update_matrix_gene:async L=>{let gA=L===w.cats.cat,W=gA?"cluster":L;if(gA)w.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let kA=w.genes.svg_bar_gene.selectAll("g").filter(function(){let FA=VA(this).select("text").node();return FA&&FA.textContent===L}).attr("opacity",1);if(!kA.empty()){let FA=kA.node().getBoundingClientRect().top,HA=w.containers.bar_gene.getBoundingClientRect().top,ZA=FA-HA+w.containers.bar_gene.scrollTop;w.genes.svg_bar_gene.attr("opacity",1),w.containers.bar_gene.scrollTo({top:ZA,behavior:"smooth"})}}w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),EB(Y,w,w.cats.cat===L),Wg(w.cats,W),zI(w.genes,[L]),QI(w.cats,[]),await oo(w.cats,w.genes,w.global_base_url,L),_I(Y,W),GB(Y,W),cB(w.genes,Y);let sA=ag(Y,w.close_up);y.setProps({layers:sA}),w.genes.gene_search_input.value=w.genes.gene_search_input.value!==L?L:"",RQ(w.genes,gA?"":L)},update_matrix_col:async L=>{if(w.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",w.cats.reset_cat?1:.25),w.cats.reset_cat)w.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let sA=w.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===L}).attr("opacity",1);if(!sA.empty()){let kA=sA.node().getBoundingClientRect().top,FA=w.containers.bar_cluster.getBoundingClientRect().top,HA=kA-FA+w.containers.bar_cluster.scrollTop;w.containers.bar_cluster.scrollTo({top:HA,behavior:"smooth"})}}Wg(w.cats,"cluster"),QI(w.cats,[L]),zI(w.genes,[]),EB(Y,w,!w.cats.selected_cats.length>0);let gA=w.cats.selected_cats.join("-");_I(Y,gA),GB(Y,gA),cB(w.genes,Y);let W=ag(Y,w.close_up);y.setProps({layers:W}),w.genes.gene_search_input.value="",RQ(w.genes,"")},update_matrix_dendro_col:async L=>{let gA=L;Wg(w.cats,"cluster"),QI(w.cats,gA),zI(w.genes,[]),EB(Y,w,!w.cats.selected_cats.length>0);let W=w.cats.selected_cats.join("-");_I(Y,W),GB(Y,W),cB(w.genes,Y);let sA=ag(Y,w.close_up);y.setProps({layers:sA}),w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",w.cats.reset_cat?1:.25);let kA=gA;if(!w.cats.reset_cat){let FA=w.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===kA}).attr("opacity",1);if(!FA.empty()){let HA=FA.node().getBoundingClientRect().top,ZA=w.containers.bar_cluster.getBoundingClientRect().top,_=HA-ZA+w.containers.bar_cluster.scrollTop;w.containers.bar_cluster.scrollTo({top:_,behavior:"smooth"})}}},update_view_state:async(L,gA,W)=>{w.close_up=gA,Zl(L,y,Y,w);let sA=ag(Y,w.close_up);y.setProps({controller:{doubleClickZoom:!1},initialViewState:L,views:w.views,layers:sA})},update_layers:()=>{console.log("update_layers")},finalize:()=>{y.finalize()}}};var JV=(g,A)=>{g.tile_scatter_data=A};var YV=(g,A)=>{g.tile_names_array=A},KV=g=>{g.tile_name_to_index_map=new Map,g.tile_names_array.forEach((A,I)=>{g.tile_name_to_index_map.set(A,I)})};var pV=async g=>{let A={},I=g+"/df_colors.parquet";var B=await FQ(I,zg.fetch);let Q=[],C=[],E=B.getChild("__index_level_0__"),o=B.getChild("color");return E&&o&&(Q=E.toArray(),C=o.toArray()),Q.forEach((e,D)=>{A[String(e)]=hs(C[D])}),A};var qV=async(g,A,I)=>{let B=I.model.get("update_trigger"),Q;B.click_type==="row-label"?(Q=B.click_value,Wg(I.cats,Q),await lM(I,Q)):B.click_type==="col-label"?(Wg(I.cats,"cluster"),QI(I.cats,[B.click_value])):B.click_type==="col-dendro"?(Wg(I.cats,"cluster"),QI(I.cats,B.click_value)):Wg("cluster"),Vh(I,A),g.setProps({layers:[A.simple_image_layer,A.square_scatter_layer]}),Q&&Q!=="cluster"&&(I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",await RQ(I.genes,Q))};var dV=(g,A)=>{if(g.index===-1||!g.layer)return null;let I=A.cats.tile_cats_array[g.index];return A.tooltip_cat_cell=I,rD(".deck-tooltip").style("margin-top","75px"),{html:`<div>${I}</div?`}};var _S=async(g,A,I,B,Q,C,E,o,e=1.4,D="",r=0,n=800)=>{r===0&&(r="100%");let G=document.createElement("div");G.style.height=" 800px";let w={};qN(B),dN(w,I),w.model=g,w.img={},w.img.image_layer_colors={},w.img.image_layer_sliders={},await UN(w.img,I),await SN(w,I,"cells"),w.genes={},w.genes.color_dict_gene={},w.genes.gene_names=[],w.genes.meta_gene={},w.genes.gene_counts=[],w.genes.selected_genes=[],w.genes.trx_ini_radius=1,w.genes.trx_names_array=[],w.genes.trx_data=[],w.genes.gene_text_box="",w.genes.trx_slider=document.createElement("input"),w.genes.gene_search=document.createElement("div"),w.genes.svg_bar_gene=Pe("svg"),w.cats={},w.cats.cat="cluster",w.cats.reset_cat=!1,w.cats.selected_cats=[],w.cats.cell_cats=[],w.cats.dict_cell_cats={},w.cats.color_dict_cluster={},w.cats.cluster_counts=[],w.cats.polygon_cell_names=[],w.cats.svg_bar_cluster=Pe("svg"),w.tooltip_cat_tile="",w.cats.square_tile_size=e,await Pl(w.genes,I);let k={name:"cells",color:[0,0,255]},F=I+"/tile_geometries.parquet";var h=await FQ(F,zg.fetch);w.cats.tile_cats_array=h.getChild("cluster").toArray(),w.cats.tile_exp_array=[],w.cats.tile_names_array=[],w.cats.tile_scatter_data=[],JV(w.cats,Jn(h)),YV(w.cats,h.getChild("name").toArray()),KV(w.cats),w.cats.tile_color_dict=await pV(I);let y=await D8(w,k),J=n8(w.cats),M={simple_image_layer:y,square_scatter_layer:J};w.views=Wl();let l=r8(G,r,n),K={target:[Q,C,E],zoom:o};l.setProps({views:w.views,layers:[M.simple_image_layer,M.square_scatter_layer],getTooltip:f=>dV(f,w),initialViewState:K}),Object.keys(w.model).length>0&&w.model.on("change:update_trigger",()=>qV(l,M,w)),w8(l,M,w);let U=CV(l,M,w);return A.appendChild(U),A.appendChild(G),()=>l.finalize()};var YnA=({isDragging:g})=>g?"grabbing":"pointer",UV=(g,A,I)=>(typeof A=="number"&&(A=A+100,I=I+100),new ra({parent:g,getCursor:YnA,width:A,height:I}));var SV=(g,A)=>{let I;g.mat.forEach((B,Q)=>{B.forEach((C,E)=>{C>=0?I=[255,0,0]:I=[0,0,255];let o={position:[A.viz.col_offset*(E+.5),A.viz.row_offset*(Q+1.5)],color:[I[0],I[1],I[2],255*Math.abs(C)/A.mat.max_abs_value],value:C,row:Q,col:E};A.mat.mat_data.push(o)})})};var LV=(g,A,I,B,Q,C,E,o)=>{let e={};return e.root=I,e.model=g,e.custom_callbacks={},e.custom_callbacks.row=C,e.custom_callbacks.col=E,e.custom_callbacks.col_dendro=o,e.viz={},e.viz.height_margin=100,e.cats={},e.cats.num_cats={},e.cats.num_cats.row=0,e.cats.num_cats.col=0,e.root.style.height=Q+e.viz.height_margin+"px",e.viz.mat_width=B,e.viz.mat_height=Q,e.mat={},e.mat.num_rows=A.mat.length,e.mat.num_cols=A.mat[0].length,e.row_nodes=A.row_nodes,e.col_nodes=A.col_nodes,e.mat.net_mat=A.mat,e.linkage=A.linkage,e.viz.base_font_size=125,e.viz.col_label=75,e.viz.row_label=75,e.viz.extra_space={},e.viz.extra_space.row=10,e.viz.extra_space.col=10,e.zoom={},e.zoom.ini_zoom_x=0,e.zoom.ini_zoom_y=0,e.viz.row_cat_width=9,e.viz.col_cat_height=9,e.viz.row_cat_offset=10,e.viz.col_cat_offset=10,e.viz.label_row_x=15,e.viz.label_col_y=25,e.viz.cat_shift_row=30,e.viz.label_buffer=1,e.animate={},e.animate.duration=2500,e.viz.dendrogram_width=15,e.viz.font_size={},e.viz.font_size.rows=e.viz.base_font_size/e.mat.num_rows,e.viz.font_size.cols=e.viz.base_font_size/e.mat.num_cols,e.viz.col_region=(e.viz.col_cat_height+e.viz.extra_space.col)*e.cats.num_cats.col+e.viz.col_label,e.viz.row_region=(e.viz.row_cat_width+e.viz.extra_space.row)*e.cats.num_cats.row+e.viz.row_label,e.viz.col_width=e.viz.mat_width/e.mat.num_cols,e.viz.row_offset=e.viz.mat_height/e.mat.num_rows,e.viz.col_offset=e.viz.mat_width/e.mat.num_cols,e.viz.cat_shift_col=e.viz.col_label,e.zoom.ini_pan_x=e.viz.mat_width/2,e.zoom.ini_pan_y=e.viz.mat_height/2+e.viz.row_offset,e.mat.mat_data=[],e.mat.num_rows=A.mat.length,e.mat.num_cols=A.mat[0].length,e.mat.max_abs_value=A.mat.flat().reduce((D,r)=>Math.max(D,Math.abs(r)),-1/0),e.order={},e.order.current={},e.order.current.row="clust",e.order.current.col="clust",e.order.new="ini",e.buttons={},e.buttons.blue="#8797ff",e.buttons.gray="#EEEEEE",e.click={},e.click.type,e.click.value,e};var HV=(g,A)=>{let I=[];g.col_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};I.push(C)}),A.labels.col_label_data=I,A.labels.clicks.col=0,A.mat.orders.col={},A.mat.orders.col.ini=I.map(B=>B.ini),A.mat.orders.col.clust=I.map(B=>B.clust+1),A.mat.orders.col.rank=I.map(B=>B.rank+1),A.mat.orders.col.rankvar=I.map(B=>B.rankvar+1)},fV=(g,A)=>{let I=[];g.row_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};I.push(C)}),A.labels.row_label_data=I,A.labels.clicks.row=0,A.mat.orders.row={},A.mat.orders.row.ini=I.map(B=>B.ini),A.mat.orders.row.clust=I.map(B=>B.clust+1),A.mat.orders.row.rank=I.map(B=>B.rank+1),A.mat.orders.row.rankvar=I.map(B=>B.rankvar+1)};var uV=(g,A)=>{var I=0;let B=0;var Q=A.mat.num_rows*A.cats.num_cats.row;return new Array(Q).fill(0).map(()=>{var E=B%A.cats.num_cats.row;B%A.cats.num_cats.row===0&&(I+=1);let o={position:[A.viz.row_cat_offset*(E+.5)+20,A.viz.row_offset*(I+.5)],color:[0,255,0,255],name:"something "+I};return B+=1,o})},mV=(g,A)=>{var I=A.mat.num_cols*A.cats.num_cats.col,B=0;let Q=0;return new Array(I).fill(0).map(()=>{var E=Q%A.mat.num_cols;Q%A.mat.num_cols===0&&(B+=1);let o={position:[A.viz.col_offset*(E+.5),A.viz.col_cat_offset*(B+1.5)-35],color:[0,255,0,150],name:"some column "+E};return Q+=1,o})};var xV=`#version 300 es
1725
+ `),{...A,inject:{...A.inject||{},"vs:#decl":(A.inject?.["vs:#decl"]||"").concat("uniform float pickingLineWidthExtraPixels;")}}}draw(A){super.draw({...A,uniforms:{...A.uniforms,pickingLineWidthExtraPixels:this.props.pickingLineWidthExtraPixels}})}};Vn.defaultProps=jrA;Vn.layerName="EditablePathLayer";var XrA=[0,0,0,153],zrA=[0,0,0,144],_rA=[0,0,0,255],$rA=[0,0,144,144],AnA=[144,144,144,255],gnA=[144,144,144,144],InA=[192,0,0,255],BnA=[0,0,0,128],QnA=[124,0,192,255],CnA=[255,255,255,255],EnA=5,inA=3,onA=7,tnA=32*P0,$O=HE;function st(g){return!g||typeof g!="function"?g:A=>g(enA(A))}function enA(g){return g.__source?g.__source.object:g.sourceFeature?g.sourceFeature.feature:g}function _O(g){switch(g.properties.editHandleType){case"existing":return InA;case"snap-source":return QnA;case"intermediate":default:return BnA}}function anA(g){return CnA}function DnA(g){switch(g.properties.editHandleType){case"existing":return EnA;case"snap":return onA;case"intermediate":default:return inA}}var snA={mode:$O,onEdit:()=>{},pickable:!0,pickingRadius:10,pickingDepth:5,fp64:!1,filled:!0,stroked:!0,lineWidthScale:P0,lineWidthMinPixels:1,lineWidthMaxPixels:Number.MAX_SAFE_INTEGER,pickingLineWidthExtraPixels:0,lineWidthUnits:"pixels",lineJointRounded:!1,lineCapRounded:!1,lineMiterLimit:4,pointRadiusScale:1,pointRadiusMinPixels:2,pointRadiusMaxPixels:Number.MAX_SAFE_INTEGER,getLineColor:(g,A,I)=>A?_rA:XrA,getFillColor:(g,A,I)=>A?$rA:zrA,getRadius:g=>g&&g.properties&&g.properties.radius||g&&g.properties&&g.properties.size||1,getLineWidth:g=>g&&g.properties&&g.properties.lineWidth||3,getTentativeLineColor:g=>AnA,getTentativeFillColor:g=>gnA,getTentativeLineWidth:g=>g&&g.properties&&g.properties.lineWidth||3,editHandleType:"point",editHandlePointRadiusScale:1,editHandlePointOutline:!0,editHandlePointStrokeWidth:2,editHandlePointRadiusUnits:"pixels",editHandlePointRadiusMinPixels:4,editHandlePointRadiusMaxPixels:8,getEditHandlePointColor:_O,getEditHandlePointOutlineColor:anA,getEditHandlePointRadius:DnA,editHandleIconAtlas:null,editHandleIconMapping:null,editHandleIconSizeScale:1,editHandleIconSizeUnits:"pixels",getEditHandleIcon:g=>g.properties.editHandleType,getEditHandleIconSize:10,getEditHandleIconColor:_O,getEditHandleIconAngle:0,billboard:!0},rnA={view:pC,modify:co,translate:new Pn(new et),transform:new Pn(new Z0),scale:qe,rotate:de,duplicate:N0,split:l0,extrude:J0,elevation:Y0,drawPoint:K0,drawLineString:p0,drawPolygon:HE,drawRectangle:Ms,drawSquare:d0,drawRectangleFromCenter:U0,drawSquareFromCenter:S0,drawCircleFromCenter:H0,drawCircleByBoundingBox:f0,drawEllipseByBoundingBox:u0,drawRectangleUsing3Points:m0,drawEllipseUsing3Points:x0,draw90DegreePolygon:b0,drawPolygonByDragging:T0},rt=class extends On{constructor(){super(...arguments);q(this,"state")}renderLayers(){let I=this.getSubLayerProps({id:"geojson",data:this.props.data,fp64:this.props.fp64,filled:this.props.filled,stroked:this.props.stroked,lineWidthScale:this.props.lineWidthScale,lineWidthMinPixels:this.props.lineWidthMinPixels,lineWidthMaxPixels:this.props.lineWidthMaxPixels,lineWidthUnits:this.props.lineWidthUnits,lineJointRounded:this.props.lineJointRounded,lineCapRounded:this.props.lineCapRounded,lineMiterLimit:this.props.lineMiterLimit,pointRadiusScale:this.props.pointRadiusScale,pointRadiusMinPixels:this.props.pointRadiusMinPixels,pointRadiusMaxPixels:this.props.pointRadiusMaxPixels,getLineColor:this.selectionAwareAccessor(this.props.getLineColor),getFillColor:this.selectionAwareAccessor(this.props.getFillColor),getPointRadius:this.selectionAwareAccessor(this.props.getRadius),getLineWidth:this.selectionAwareAccessor(this.props.getLineWidth),_subLayerProps:{linestrings:{billboard:this.props.billboard,updateTriggers:{all:[this.props.selectedFeatureIndexes,this.props.mode]}},"polygons-stroke":{billboard:this.props.billboard,pickingLineWidthExtraPixels:this.props.pickingLineWidthExtraPixels,type:Vn,updateTriggers:{all:[this.props.selectedFeatureIndexes,this.props.mode]}}},updateTriggers:{getLineColor:[this.props.selectedFeatureIndexes,this.props.mode],getFillColor:[this.props.selectedFeatureIndexes,this.props.mode],getPointRadius:[this.props.selectedFeatureIndexes,this.props.mode],getLineWidth:[this.props.selectedFeatureIndexes,this.props.mode]}}),B=[new $D(I)];return B=B.concat(this.createGuidesLayers(),this.createTooltipsLayers()),B}initializeState(){super.initializeState(),this.setState({selectedFeatures:[],editHandles:[]})}shouldUpdateState(I){return super.shouldUpdateState(I)||I.changeFlags.stateChanged}updateState({props:I,oldProps:B,changeFlags:Q,context:C}){if(super.updateState({oldProps:B,props:I,changeFlags:Q,context:C}),Q.propsOrDataChanged&&(Object.keys(B).length===0||I.mode!==B.mode)){let e;if(typeof I.mode=="function"){let D=I.mode;e=new D}else typeof I.mode=="string"?(e=rnA[I.mode],console.warn("Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead.")):e=I.mode;e||(console.warn(`No mode configured for ${String(I.mode)}`),e=new $O),e!==this.state.mode&&this.setState({mode:e,cursor:null})}let E=[];if(Array.isArray(I.selectedFeatureIndexes)&&typeof I.data=="object"&&"features"in I.data){let o=I.data;E=I.selectedFeatureIndexes.map(e=>o.features[e])}this.setState({selectedFeatures:E})}getModeProps(I){return{modeConfig:I.modeConfig,data:I.data,selectedIndexes:I.selectedFeatureIndexes,lastPointerMoveEvent:this.state.lastPointerMoveEvent,cursor:this.state.cursor,onEdit:B=>{this.setNeedsUpdate(),I.onEdit(B)},onUpdateCursor:B=>{this.setState({cursor:B})}}}selectionAwareAccessor(I){return typeof I!="function"?I:B=>I(B,this.isFeatureSelected(B),this.props.mode)}isFeatureSelected(I){return!this.props.data||!this.props.selectedFeatureIndexes||!this.props.selectedFeatureIndexes.length?!1:this.state.selectedFeatures.includes(I)}getPickingInfo({info:I,sourceLayer:B}){return B.id.endsWith("guides")&&(I.isGuide=!0),I}_updateAutoHighlight(I){if(I?.sourceLayer)if(I.isGuide)for(let B of I.sourceLayer.getSubLayers())B.updateAutoHighlight(I);else I.sourceLayer.updateAutoHighlight(I)}createGuidesLayers(){let B=this.getActiveMode().getGuides(this.getModeProps(this.props));if(!B||!B.features.length)return[];let Q={linestrings:{billboard:this.props.billboard,autoHighlight:!1},"polygons-fill":{autoHighlight:!1},"polygons-stroke":{billboard:this.props.billboard}};return this.props.editHandleType==="icon"?Q["points-icon"]={type:Ga,iconAtlas:this.props.editHandleIconAtlas,iconMapping:this.props.editHandleIconMapping,sizeUnits:this.props.editHandleIconSizeUnits,sizeScale:this.props.editHandleIconSizeScale,getIcon:st(this.props.getEditHandleIcon),getSize:st(this.props.getEditHandleIconSize),getColor:st(this.props.getEditHandleIconColor),getAngle:st(this.props.getEditHandleIconAngle),billboard:this.props.billboard}:Q["points-circle"]={type:BQ,radiusScale:this.props.editHandlePointRadiusScale,stroked:this.props.editHandlePointOutline,getLineWidth:this.props.editHandlePointStrokeWidth,radiusUnits:this.props.editHandlePointRadiusUnits,radiusMinPixels:this.props.editHandlePointRadiusMinPixels,radiusMaxPixels:this.props.editHandlePointRadiusMaxPixels,getRadius:st(this.props.getEditHandlePointRadius),getFillColor:st(this.props.getEditHandlePointColor),getLineColor:st(this.props.getEditHandlePointOutlineColor),billboard:this.props.billboard},[new $D(this.getSubLayerProps({id:"guides",data:B,fp64:this.props.fp64,_subLayerProps:Q,lineWidthScale:this.props.lineWidthScale,lineWidthMinPixels:this.props.lineWidthMinPixels,lineWidthMaxPixels:this.props.lineWidthMaxPixels,lineWidthUnits:this.props.lineWidthUnits,lineJointRounded:this.props.lineJointRounded,lineCapRounded:this.props.lineCapRounded,lineMiterLimit:this.props.lineMiterLimit,getLineColor:st(this.props.getTentativeLineColor),getLineWidth:st(this.props.getTentativeLineWidth),getFillColor:st(this.props.getTentativeFillColor),pointType:this.props.editHandleType==="icon"?"icon":"circle",iconAtlas:this.props.editHandleIconAtlas}))]}createTooltipsLayers(){let B=this.getActiveMode().getTooltips(this.getModeProps(this.props));return[new vt({getSize:tnA,...this.getSubLayerProps({id:"tooltips",data:B})})]}onLayerClick(I){this.getActiveMode().handleClick(I,this.getModeProps(this.props))}onLayerKeyUp(I){this.getActiveMode().handleKeyUp(I,this.getModeProps(this.props))}onStartDragging(I){this.getActiveMode().handleStartDragging(I,this.getModeProps(this.props))}onDragging(I){this.getActiveMode().handleDragging(I,this.getModeProps(this.props))}onStopDragging(I){this.getActiveMode().handleStopDragging(I,this.getModeProps(this.props))}onPointerMove(I){this.setState({lastPointerMoveEvent:I}),this.getActiveMode().handlePointerMove(I,this.getModeProps(this.props))}getCursor({isDragging:I}){if(this.state===null||this.state===void 0)return null;let{cursor:B}=this.state;return B||(B=I?"grabbing":"grab"),B}getActiveMode(){return this.state.mode}};q(rt,"layerName","EditableGeoJsonLayer"),q(rt,"defaultProps",snA);var nnA=pC,cnA=9;var Iwg={mode:nnA,...rt.defaultProps,data:[],selectedIndexes:[],filled:!1,stroked:!0,lineWidthScale:P0,lineWidthMinPixels:1,lineWidthMaxPixels:Number.MAX_SAFE_INTEGER,lineWidthUnits:"pixels",getHexagons:g=>g.hexIds,getEditedCluster:(g,A)=>A?{...A,hexIds:g}:{hexIds:g},resolution:cnA};var ul={NONE:null,RECTANGLE:"rectangle",POLYGON:"polygon"},Dwg={[ul.RECTANGLE]:Ms,[ul.POLYGON]:HE},swg={[ul.RECTANGLE]:{dragToDraw:!0}},rwg={selectionType:ul.RECTANGLE,layerIds:[],onSelect:()=>{}};var GnA=g=>(g.features.forEach((A,I)=>{if(A.geometry.type==="Polygon"){let B=A.geometry.coordinates[0],Q=Math.abs(YJ(B));A.properties={...A.properties,area:Q,name:A.properties.name||`Feature ${I+1}`,color:A.properties.color||[Math.random()*255,Math.random()*255,Math.random()*255]}}else console.warn(`Feature ${I} is not a Polygon.`)}),g),ml=g=>{Object.keys(g.model).length>0&&(g.model.set("region",{}),g.model.set("region",g.edit.feature_collection),g.model.save_changes())},xl=(g,A,I)=>{g.edit.feature_collection=GnA(g.edit.feature_collection),g.edit.rgn_areas=g.edit.feature_collection.features.map((B,Q)=>({name:(Q+1).toString(),value:B.properties.area})).sort((B,Q)=>Q.value-B.value),g.edit.color_dict_rgn=g.edit.feature_collection.features.reduce((B,Q,C)=>(B[(C+1).toString()]=Q.properties.color,B),{}),Je(g.edit.svg_bar_rgn,g.edit.rgn_areas,g.edit.color_dict_rgn,UM,[],A,I,g)},wnA=(g,A,I,B)=>{let{updatedData:Q,editType:C}=B;I.edit.feature_collection=Q,A.edit_layer=A.edit_layer.clone({data:I.edit.feature_collection}),C==="addFeature"&&(bl(A,pC),VA(I.edit.buttons.sktch).style("color","gray").classed("active",!1),I.edit.mode="view",V0(A,!0),O0(A,!0),vh(A,!0),xl(I,g,A),ml(I));let E=ag(A,I.close_up);g.setProps({layers:E}),xl(I,g,A),ml(I)},hnA=(g,A,I,B)=>{if(g.featureType==="polygons"&&B.edit.mode==="view"){I.edit_layer=I.edit_layer.clone({id:"edit-layer-modify",mode:co,selectedFeatureIndexes:[g.index],modeConfig:{dragToAddNew:!0,enableSnapping:!1}});let Q=ag(I,B.close_up);A.setProps({layers:Q}),B.edit.mode="modify",B.edit.modify_index=g.index,VA(B.edit.buttons.del).classed("active",!0).style("display","inline-flex"),VA(B.edit.buttons.rgn).style("display","none"),VA(B.edit.buttons.sktch).style("display","none")}else if(g.featureType==="polygons"&&B.edit.mode==="modify"){I.edit_layer=I.edit_layer.clone({id:"edit-layer-view",mode:pC,selectedFeatureIndexes:[]});let Q=ag(I,B.close_up);A.setProps({layers:Q}),B.edit.mode="view",B.edit.modify_index=null,VA(B.edit.buttons.del).classed("active",!1).style("display","none"),VA(B.edit.buttons.rgn).style("display","inline-flex"),VA(B.edit.buttons.sktch).style("display","inline-flex")}},AV=g=>new rt({id:"edit-layer",data:g.edit.feature_collection,selectedFeatureIndexes:[],mode:pC,filled:!0,pointRadiusMinPixels:2,pointRadiusScale:2e3,extruded:!0,getElevation:1e3,getFillColor:I=>I.properties.color,pickable:!0,autoHighlight:!0,modeConfig:{preventOverlappingLines:!0},visible:!1}),gV=(g,A,I)=>{A.edit_layer=A.edit_layer.clone({onEdit:B=>wnA(g,A,I,B)})},IV=(g,A,I)=>{A.edit_layer=A.edit_layer.clone({onClick:B=>hnA(B,g,A,I)})},bl=(g,A)=>{g.edit_layer=g.edit_layer.clone({mode:A})},vS=(g,A)=>{g.edit_layer=g.edit_layer.clone({visible:A})};var EB=(g,A,I)=>{VA(A.containers.image).selectAll(".img_layer_button").style("color",I?"blue":"gray"),A.img.image_layer_sliders.map(B=>fa(B,I)),MM(g,I)},jS=()=>{let g=document.createElement("div");return g.style.display="flex",g.style.flexDirection="row",g.style.border="1px solid #d3d3d3",g.className="ui_container",g.style.height="100px",g},BV=()=>{let g=document.createElement("div");return g.style.display="flex",g.style.flexDirection="row",g.className="ctrl_container",g.style.width="535px",g},rE=(g,A,I=null)=>{let B=document.createElement("div");return B.className=g,B.style.display="flex",B.style.flexDirection=A,I!==null&&(B.style.height=I+"px",B.style.overflow="scroll"),B},Tl=g=>{let A=document.createElement("div");return A.className=g,A.style.width="100%",A.style.marginLeft="2px",A.style.marginTop="2px",A},QV=(g,A,I)=>{let B=jS(),Q=rE("button_container","column"),C=rE("slider_container","column"),E=33,o=["col","row"],e=["clust","sum","var","ini"];o.forEach(r=>{let n=rE(r,"row");VA(n).append("div").text(r.toUpperCase()).style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-top","5px").style("margin-left","5px").style("padding","4px 10px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),e.forEach(G=>{f8(n,G,G==="clust",E,r,g,A,I)}),Q.appendChild(n)}),I.dendro.sliders={},o.forEach(r=>{I.dendro.sliders[r]=document.createElement("input"),I.dendro.sliders[r].type="range",I.dendro.sliders[r].min="0",I.dendro.sliders[r].max="100",I.dendro.sliders[r].value=50,I.dendro.sliders[r].className="slider",I.dendro.sliders[r].style.width="75px"});let D=(r,n,G,w)=>{n.dendro.sliders[G+"_value"]=n.dendro.max_linkage_dist[G]*w.target.value/100,EU(n,G,n.dendro.sliders[G+"_value"]),iU(n,G),zh(n,G),L8(A,n,G),r.setProps({layers:Qt(A)})};return o.forEach(r=>{I.dendro.sliders[r].addEventListener("input",n=>D(g,I,r,n))}),I.dendro.sliders.col.style.marginTop="5px",I.dendro.sliders.row.style.marginTop="20px",VA(C).append("div").text("DENDRO").style("width",E+"px").style("height","20px").style("display","inline-flex").style("align-items","center").style("justify-content","center").style("text-align","center").style("cursor","pointer").style("font-size","12px").style("font-weight","bold").style("color","#47515b").style("border","3px solid").style("border-color","white").style("border-radius","12px").style("margin-left","20px").style("user-select","none").style("font-family",'-apple-system, BlinkMacSystemFont, "San Francisco", "Helvetica Neue", Helvetica, Arial, sans-serif'),C.appendChild(I.dendro.sliders.col),C.appendChild(I.dendro.sliders.row),Q.style.marginTop="15px",C.style.marginTop="0px",C.style.marginLeft="10px",B.appendChild(Q),B.appendChild(C),B},CV=(g,A,I)=>{let B=jS(),Q=BV(),C=rE("image_container","row"),E=rE("tile_container","row"),o=Tl("tile_slider_container");return ks(C,"sst","IMG","blue",50,"button",g,A,I),ks(E,"sst","TILE","blue",50,"button",g,A,I),I.sliders={},KM("tile",g,A,I),o.appendChild(I.sliders.tile),B.appendChild(Q),E.appendChild(o),IU("sst",g,A,I),Q.appendChild(C),Q.appendChild(E),Q.appendChild(I.genes.gene_search),B},EV=(g,A,I,B)=>{let Q=jS(),C=BV();B.containers.image=rE("image_container","column");let E=rE("img_layers_container","column",72);E.style.width="135px",E.style.border="1px solid #d3d3d3",E.style.marginTop="3px",E.style.marginLeft="2px",E.addEventListener("wheel",K=>{let{scrollTop:U,scrollHeight:f,clientHeight:Y}=E,P=U===0,Z=U+Y===f;(P&&K.deltaY<0||Z&&K.deltaY>0)&&K.preventDefault()});let o=rE("cell_container","column");o.style.width="120px";let e=rE("cell_ctrl_container","row");e.style.marginLeft="0px";let D=rE("gene_container","column");D.style.marginTop="0px",D.style.width="125px";let r=rE("trx_container","row"),n=rE("rgn_container","column");n.style.width="120px";let G=rE("rgn_ctrl_container","row");G.style.marginLeft="0px";let w=Tl("cell_slider_container"),k=Tl("trx_slider_container");ks(B.containers.image,"ist","IMG","blue",30,"button",A,I,B);let F=(K,U)=>K.image_layer_sliders.filter(f=>f.name===U),h=(K,U)=>{let f=U.button_name,Y=rE("image_layer_container","row");Y.style.height="21px",ks(Y,"ist",f,"blue",75,"img_layer_button",A,I,B);let P=Tl(f),Z=F(K,f)[0],j=d8(f,A,I,B),gA=qM(j,100);BU(Z,50,gA),P.appendChild(Z),Y.appendChild(P),E.appendChild(Y)};B.img.image_info.map(K=>h(B.img,K)),ks(e,"ist","CELL","blue",40,"button",A,I,B),ks(r,"ist","TRX","blue",40,"button",A,I,B),B.containers.image.appendChild(E),B.sliders={},KM("cell",A,I,B),w.appendChild(B.sliders.cell),e.appendChild(w),B.containers.bar_cluster=dM(),SM(B.containers.bar_cluster,ys,B.cats.svg_bar_cluster,B.cats.cluster_counts,B.cats.color_dict_cluster,A,I,B),B.containers.bar_gene=dM(),SM(B.containers.bar_gene,Xh,B.genes.svg_bar_gene,B.genes.gene_counts,B.genes.color_dict_gene,A,I,B),o.appendChild(e),o.appendChild(B.containers.bar_cluster),KM("trx",A,I,B),r.appendChild(k),k.appendChild(B.sliders.trx),D.appendChild(r),D.appendChild(B.containers.bar_gene),IU("ist",A,I,B),B.genes.gene_search.style.marginLeft="0px",Q.appendChild(C),C.appendChild(B.containers.image),C.appendChild(o),C.appendChild(D),B.genes.gene_search.style.width="160px",C.appendChild(B.genes.gene_search);let y=(K,U,f,Y)=>{let P=VA(K.currentTarget),Z=P.classed("active");if(Y.edit.visible=!0,P.classed("active",Y.edit.visible).style("color","blue"),VA(Y.edit.buttons.rgn).style("color","blue").classed("active",!0),vS(f,Y.edit.visible),Z===!1){P.classed("active",!0).style("color","blue"),Y.edit.mode="sktch",bl(f,HE),V0(f,!1),O0(f,!1),vh(f,!1);let j=ag(f,Y.close_up);U.setProps({layers:j})}else if(Z===!0){Y.edit.mode="view",P.classed("active",!1).style("color","gray"),bl(f,pC),V0(f,!0),O0(f,!0),vh(f,!0);let j=ag(f,Y.close_up);U.setProps({layers:j})}},J=(K,U,f,Y)=>{let P=VA(K.currentTarget);P.classed("active")===!1?(Y.edit.visible=!0,P.classed("active",Y.edit.visible).style("color","blue")):(Y.edit.visible=!1,P.classed("active",Y.edit.visible).style("color","gray")),vS(f,Y.edit.visible);let j=ag(f,Y.close_up);U.setProps({layers:j})},M=(K,U)=>(U>=0&&U<K.features.length&&K.features.splice(U,1),K),l=(K,U,f,Y)=>{Y.edit.feature_collection=M(Y.edit.feature_collection,Y.edit.modify_index),f.edit_layer=f.edit_layer.clone({id:"edit-layer-delete",data:Y.edit.feature_collection,mode:pC,selectedFeatureIndexes:[]});let P=ag(f,Y.close_up);U.setProps({layers:P}),VA(Y.edit.buttons.del).classed("active",!1).style("display","none"),VA(Y.edit.buttons.rgn).style("display","inline-flex"),VA(Y.edit.buttons.sktch).style("display","inline-flex"),xl(Y,U,f),ml(Y)};return B.edit.buttons={},B.edit.mode="view",pM(A,I,B,G,"RGN",30,J),pM(A,I,B,G,"SKTCH",40,y),pM(A,I,B,G,"DEL",30,l),VA(B.edit.buttons.del).style("color","red").style("display","none"),B.containers.bar_rgn=dM(),n.appendChild(G),n.appendChild(B.containers.bar_rgn),C.appendChild(n),SM(B.containers.bar_rgn,UM,B.edit.svg_bar_rgn,B.edit.rgn_areas,B.edit.color_dict_rgn,A,I,B),Q};var NnA=(g,A,I)=>{let B=g.polygon_cell_names[I.index],Q=g.dict_cell_cats[B],C;Q in g.color_dict_cluster?C=g.color_dict_cluster[Q]:C=[0,0,255];let E=g.selected_cats.length===0||g.selected_cats.includes(Q)?255:50;return[...C,E]},iV=g=>new bi({id:"path-layer",data:[],pickable:!0,widthScale:3,widthMinPixels:1,getPath:I=>I,getColor:(I,B)=>NnA(g.cats,I,B),widthUnits:"pixels"}),knA=(g,A,I,B,Q)=>{let C=Q.cats.polygon_cell_names[g.index],E=Q.cats.dict_cell_cats[C];Wg(Q.cats,"cluster"),QI(Q.cats,[E]),zI(Q.genes,[]),EB(B,Q,!Q.cats.selected_cats.length>0);let o=Q.cats.selected_cats.join("-");_I(B,o),GB(B,o),cB(Q.genes,B);let e=ag(B,Q.close_up);I.setProps({layers:e})},oV=async(g,A,I,B)=>{let Q=await v4(g,A,B);I.path_layer=I.path_layer.clone({data:Q})},tV=(g,A,I)=>{A.path_layer=A.path_layer.clone({onClick:(B,Q)=>knA(B,Q,g,A,I)})},u8=(g,A)=>{g.path_layer=g.path_layer.clone({visible:A})},GB=(g,A)=>{g.path_layer=g.path_layer.clone({id:"path-layer-"+A})},O0=(g,A)=>{g.path_layer=g.path_layer.clone({pickable:A})};var ynA=async(g,A,I,B,Q)=>{let C="ontouchstart"in window||navigator.maxTouchPoints>0,E;C?E=Q.cats.cell_cats[g.index]:E=Q.tooltip_cat_cell,Wg(Q.cats,"cluster"),QI(Q.cats,[E]),zI(Q.genes,[]),EB(B,Q,!Q.cats.selected_cats.length>0);let o=Q.cats.selected_cats.join("-");if(Q.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),Q.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",Q.cats.reset_cat?1:.25),Q.cats.reset_cat)Q.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let D=Q.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===E}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=Q.containers.bar_cluster.getBoundingClientRect().top,G=r-n+Q.containers.bar_cluster.scrollTop;Q.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}_I(B,o),GB(B,o),cB(Q.genes,B);let e=ag(B,Q.close_up);I.setProps({layers:e}),Q.genes.gene_search_input.value="",RQ(Q.genes,"")},eV=async(g,A)=>{let I=g+"/cell_metadata.parquet";var B=await FQ(I,zg.fetch);let Q=Jn(B);await H4(A.genes,g),f4(A.cats,B),u4(A.cats);var C=await FQ(g+"/cell_clusters/cluster.parquet",zg.fetch);m4(A.cats,C,"cluster"),b4(A.cats);let E=B.getChild("name").toArray(),o=Q.attributes.getPosition.value;return A.combo_data.cell=E.map((D,r)=>({name:D,cat:A.cats.dict_cell_cats[D],x:o[r*2],y:o[r*2+1]})),new BQ({id:"cell-layer",radiusMinPixels:1,getRadius:5,pickable:!0,getColor:(D,r)=>T4(A.cats,D,r),data:Q})},aV=(g,A,I)=>{A.cell_layer=A.cell_layer.clone({onClick:(B,Q)=>ynA(B,Q,g,A,I)})},m8=(g,A)=>{g.cell_layer=g.cell_layer.clone({visible:A})},U8=(g,A)=>{g.cell_layer=g.cell_layer.clone({getRadius:A})},_I=(g,A)=>{g.cell_layer=g.cell_layer.clone({id:"cell-layer-"+A})},V0=(g,A)=>{g.cell_layer=g.cell_layer.clone({pickable:A})};var Wl=()=>[new Ei({id:"ortho"})];var DV=(g,A,I,B,Q)=>{let C=Math.floor(g/Q),E=Math.floor(A/Q),o=Math.floor(I/Q),e=Math.floor(B/Q),D=[];for(let r=C;r<=E;r++)for(let n=o;n<=e;n++)D.push({tileX:r,tileY:n,name:r+"_"+n});return D};var Zl=async({height:g,width:A,zoom:I,target:B},Q,C,E)=>{let o=E.img.landscape_parameters.tile_size,e=50,D=Math.pow(2,I),[r,n]=B,G=A/(2*D),w=g/(2*D);E.bounds={},E.bounds.min_x=r-G,E.bounds.max_x=r+G,E.bounds.min_y=n-w,E.bounds.max_y=n+w;let k=Q.viewManager.getViewports();if(!k||k.length===0){console.error("No viewports available");return}let F=DV(E.bounds.min_x,E.bounds.max_x,E.bounds.min_y,E.bounds.max_y,o);if(F.length<e){await K8(E.global_base_url,F,C,E),await oV(E.global_base_url,F,C,E),E.close_up=!0;let M=E.combo_data.trx.filter(f=>f.x>=E.bounds.min_x&&f.x<=E.bounds.max_x&&f.y>=E.bounds.min_y&&f.y<=E.bounds.max_y).map(f=>f.name).reduce((f,Y)=>{let P=f.find(Z=>Z.name===Y);return P?P.value+=1:f.push({name:Y,value:1}),f},[]).filter(f=>f.value>0).sort((f,Y)=>Y.value-f.value);Je(E.genes.svg_bar_gene,M,E.genes.color_dict_gene,Xh,E.genes.selected_genes,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});let U=E.combo_data.cell.filter(f=>f.x>=E.bounds.min_x&&f.x<=E.bounds.max_x&&f.y>=E.bounds.min_y&&f.y<=E.bounds.max_y).map(f=>f.cat).reduce((f,Y)=>{let P=f.find(Z=>Z.name===Y);return P?P.value+=1:f.push({name:Y,value:1}),f},[]).filter(f=>f.value>0).sort((f,Y)=>Y.value-f.value);Je(E.cats.svg_bar_cluster,U,E.cats.color_dict_cluster,ys,E.cats.selected_cats,Q,C,E),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"})}else E.close_up&&(E.close_up=!1,Je(E.genes.svg_bar_gene,E.genes.gene_counts,E.genes.color_dict_gene,Xh,E.genes.selected_genes,Q,C,E),Je(E.cats.svg_bar_cluster,E.cats.cluster_counts,E.cats.color_dict_cluster,ys,E.cats.selected_cats,Q,C,E),E.containers.bar_gene.scrollTo({top:0,behavior:"smooth"}),E.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"}));let h=ag(C,E.close_up);Q.setProps({layers:h})};var FnA=200,sV=qM(({viewState:g},A,I,B)=>(Zl(g,A,I,B),typeof B.custom_callbacks.view_change=="function"&&B.custom_callbacks.view_change(g,B.close_up,I.trx_layer),g),FnA);var rV=(g,A)=>{if(A.index===-1||!A.layer)return null;let I="",B="",Q="";return A.layer.id.startsWith("cell-layer")||A.layer.id.startsWith("path-layer")?(B=A.layer.id.startsWith("cell-layer")?g.cats.cell_names_array[A.index]:g.cats.polygon_cell_names[A.index],Q=g.cats.dict_cell_cats[B],I=`<div>cell: ${B}</div><div>cluster: ${Q}</div>`,g.tooltip_cat_cell=Q):A.layer.id.startsWith("trx-layer")&&(B=g.genes.trx_names_array[A.index],I=`<div>transcript: ${B}</div>`),rD(".deck-tooltip").style("margin-top","75px"),{html:I}};var RnA=({isDragging:g})=>g?"grabbing":"pointer",nV=(g,A,I)=>new ra({parent:g,controller:{doubleClickZoom:!1},getCursor:RnA,width:A,height:I}),cV=(g,A)=>{g.setProps({views:A})},GV=(g,A)=>{g.setProps({getTooltip:I=>rV(A,I)})},wV=(g,A,I)=>{g.setProps({onViewStateChange:B=>{sV(B,g,A,I)}})},hV=(g,A,I,B,Q)=>{let C={target:[A,I,B],zoom:Q};g.setProps({initialViewState:C})};var NV=(g,A)=>{g.image_format=A},kV=(g,A)=>{g.image_info=A},yV=(g,A)=>{A.forEach(I=>{g[I.button_name]=I.color})};var Pl=async(g,A)=>{let I=await FQ(A+"/meta_gene.parquet",zg.fetch),B=I.getChild("__index_level_0__").toArray(),Q=I.getChild("mean").toArray(),C=I.getChild("std").toArray(),E=I.getChild("max").toArray();B.forEach((o,e)=>{g.meta_gene[o]={mean:Q[e],std:C[e],max:E[e]},g.gene_counts.push({name:o,value:Number(Q[e])})}),g.gene_counts.sort((o,e)=>e.value-o.value),g.gene_names=g.gene_counts.map(o=>o.name)};var FV=(g,A)=>{g.color_dict_cluster=A.color;for(let B in g.color_dict_cluster)g.color_dict_cluster[B]=hs(g.color_dict_cluster[B]);var I=A.count;g.cluster_counts=[];for(let B in I)g.cluster_counts.push({name:B,value:I[B]});g.cluster_counts.sort((B,Q)=>Q.value-B.value)},RV=async g=>{let A=g.global_base_url+"/cell_clusters/meta_cluster.parquet";var I=await FQ(A,zg.fetch);let B=[],Q=[],C=[],E=I.getChild("__index_level_0__"),o=I.getChild("color"),e=I.getChild("count"),D=[];for(let r of I.schema.fields)D.push(r.name);E&&o&&(B=E.toArray(),Q=o.toArray(),C=e.toArray()),B.forEach((r,n)=>{g.cats.color_dict_cluster[r]=hs(Q[n]),g.cats.cluster_counts.push({name:r,value:Number(C[n])})}),g.cats.cluster_counts.sort((r,n)=>n.value-r.value)};var MV=async(g,A,I)=>{let B=I.model.get("update_trigger"),Q,C;if(!("click_type"in B)||!("click_value"in B)){if(B.type==="row_label"){Q=B.value.name;let E=Q===I.cats.cat?"cluster":Q;EB(A,I,I.cats.cat===Q),Wg(I.cats,E),zI(I.genes,[Q]),QI(I.cats,[]),await oo(I.cats,I.genes,I.global_base_url,Q),_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o});let e=!1;if(I.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",e?1:.25),!e){let D=I.genes.svg_bar_gene.selectAll("g").filter(function(){return VA(this).select("text").text()===Q}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_gene.getBoundingClientRect().top,G=r-n+I.containers.bar_gene.scrollTop;I.containers.bar_gene.scrollTo({top:G,behavior:"smooth"})}}I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",RQ(I.genes,Q)}else if(B.type==="col_label"){Q="cluster",C=B.value.name,Wg(I.cats,"cluster"),QI(I.cats,[C]),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let E=I.cats.selected_cats.join("-");_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let e=C;if(!I.cats.reset_cat){let D=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===e}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_cluster.getBoundingClientRect().top,G=r-n+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}}else if(B.type==="col_dendro"){Q="cluster",Q="cluster";let E=B.value.selected_names;Wg(I.cats,"cluster"),QI(I.cats,E),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let o=I.cats.selected_cats.join("-");_I(A,o),GB(A,o),cB(I.genes,A);let e=ag(A,I.close_up);g.setProps({layers:e}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let D=E;if(!I.cats.reset_cat){let r=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===D}).attr("opacity",1);if(!r.empty()){let n=r.node().getBoundingClientRect().top,G=I.containers.bar_cluster.getBoundingClientRect().top,w=n-G+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:w,behavior:"smooth"})}}Wg(I.cats,Q),QI(I.cats,B.click_value)}}else if(B.click_type==="row-label"){Q=B.click_value;let E=Q===I.cats.cat?"cluster":Q;EB(A,I,I.cats.cat===Q),Wg(I.cats,E),zI(I.genes,[Q]),QI(I.cats,[]),await oo(I.cats,I.genes,I.global_base_url,Q),_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o});let e=!1;if(I.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",e?1:.25),!e){let D=I.genes.svg_bar_gene.selectAll("g").filter(function(){return VA(this).select("text").text()===Q}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_gene.getBoundingClientRect().top,G=r-n+I.containers.bar_gene.scrollTop;I.containers.bar_gene.scrollTo({top:G,behavior:"smooth"})}}I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",RQ(I.genes,Q)}else if(B.click_type==="col-label"){Q="cluster",C=B.click_value,Wg(I.cats,"cluster"),QI(I.cats,[C]),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let E=I.cats.selected_cats.join("-");_I(A,E),GB(A,E),cB(I.genes,A);let o=ag(A,I.close_up);g.setProps({layers:o}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let e=C;if(!I.cats.reset_cat){let D=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===e}).attr("opacity",1);if(!D.empty()){let r=D.node().getBoundingClientRect().top,n=I.containers.bar_cluster.getBoundingClientRect().top,G=r-n+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:G,behavior:"smooth"})}}}else if(B.click_type==="col-dendro"){Q="cluster",Q="cluster";let E=B.click_value;Wg(I.cats,"cluster"),QI(I.cats,E),zI(I.genes,[]),EB(A,I,!I.cats.selected_cats.length>0);let o=I.cats.selected_cats.join("-");_I(A,o),GB(A,o),cB(I.genes,A);let e=ag(A,I.close_up);g.setProps({layers:e}),I.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",I.cats.reset_cat?1:.25);let D=E;if(!I.cats.reset_cat){let r=I.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===D}).attr("opacity",1);if(!r.empty()){let n=r.node().getBoundingClientRect().top,G=I.containers.bar_cluster.getBoundingClientRect().top,w=n-G+I.containers.bar_cluster.scrollTop;I.containers.bar_cluster.scrollTo({top:w,behavior:"smooth"})}}Wg(I.cats,Q),QI(I.cats,B.click_value)}else Q="cluster"};var lV=(g,A,I)=>{let B=I.model.get("cell_clusters");FV(I.cats,B.meta_cluster),x4(I.cats,B.new_clusters),_I(A,"cluster");let Q=ag(A,I.close_up);g.setProps({layers:Q}),I.combo_data.cell=I.combo_data.cell.map(C=>({...C,cat:I.cats.dict_cell_cats[C.name]})),Je(I.cats.svg_bar_cluster,I.cats.cluster_counts,I.cats.color_dict_cluster,ys,[],g,A,I)};var MnA=(g,A,I)=>{if(g.size>=20){let Q=g.keys().next().value;g.delete(Q)}g.set(A,I)},lnA=(g,A)=>{let I=g.get(A);return I&&(g.delete(A),g.set(A,I)),I},JnA=g=>{g.clear()},XS=()=>{let g=new Map;return{set:(A,I)=>MnA(g,A,I),get:A=>lnA(g,A),clear:()=>JnA(g)}};var zS=async(g,A,I,B,Q,C,E,o,e="",D=.25,r=0,n=800,G=null)=>{r===0&&(r="100%");let w={};w.buttons={},w.buttons.blue="#8797ff",w.buttons.gray="gray",w.buttons.light_gray="#EEEEEE",dN(w,o),w.close_up=!1,w.model=A,w.containers={},w.custom_callbacks={},w.custom_callbacks.view_change=G,w.cats={},w.cats.cat,w.cats.reset_cat=!1,w.cats.selected_cats=[],w.cats.cell_cats=[],w.cats.dict_cell_cats={},w.cats.color_dict_cluster={},w.cats.cluster_counts=[],w.cats.polygon_cell_names=[],w.cats.svg_bar_cluster=Pe("svg"),w.genes={},w.genes.color_dict_gene={},w.genes.gene_names=[],w.genes.meta_gene={},w.genes.gene_counts=[],w.genes.selected_genes=[],w.genes.trx_ini_radius=D,w.genes.trx_names_array=[],w.genes.trx_data=[],w.genes.gene_text_box="",w.genes.trx_slider=document.createElement("input"),w.genes.gene_search=document.createElement("div"),w.genes.svg_bar_gene=Pe("svg"),w.cats.cell_exp_array=[],w.cats.cell_names_array=[],w.cats.cell_name_to_index_map=new Map,w.img={},w.img.image_layer_colors={},w.img.image_layer_sliders={},qN(I);let k="dapi";await UN(w.img,o);let F=w.img.landscape_parameters.image_info;NV(w.img,w.img.landscape_parameters.image_format),kV(w.img,F),q8(w.img),yV(w.img.image_layer_colors,w.img.image_info);let h=document.createElement("div");h.style.height=n+"px",h.style.border="1px solid #d3d3d3",await SN(w,o,k),await Pl(w.genes,o),await RV(w),w.views=Wl();let y=await nV(h,r,n);hV(y,B,Q,C,E),cV(y,w.views),w.cache={},w.cache.cell=await XS(),w.cache.trx=await XS(),w.combo_data={},w.tooltip_cat_cell="",GV(y,w),w.edit={},w.edit.svg_bar_rgn=Pe("svg"),w.edit.rgn_areas=[],w.edit.color_dict_rgn={},w.edit.rgn_opacity=.75,w.edit.visible=!1,w.edit.modify_index=null,Object.keys(w.model).length!==0?Object.keys(w.model.get("region")).length===0?w.edit.feature_collection={type:"FeatureCollection",features:[]}:w.edit.feature_collection=w.model.get("region"):w.edit.feature_collection={type:"FeatureCollection",features:[]};let J=y8(w),M=await h8(w),l=await eV(o,w),K=await iV(w),U=J8(w.genes),f=AV(w),Y={background_layer:J,image_layers:M,cell_layer:l,path_layer:K,trx_layer:U,edit_layer:f};aV(y,Y,w),tV(y,Y,w),Y8(y,Y,w),gV(y,Y,w),IV(y,Y,w),YM(Y,D);let P=ag(Y,w.close_up);y.setProps({layers:P}),wV(y,Y,w),Object.keys(w.model).length>0&&(w.model.on("change:update_trigger",()=>MV(y,Y,w)),w.model.on("change:cell_clusters",()=>lV(y,Y,w)));let Z=EV(e,y,Y,w);return g.appendChild(Z),g.appendChild(h),{update_matrix_gene:async L=>{let gA=L===w.cats.cat,W=gA?"cluster":L;if(gA)w.containers.bar_gene.scrollTo({top:0,behavior:"smooth"});else{let kA=w.genes.svg_bar_gene.selectAll("g").filter(function(){let FA=VA(this).select("text").node();return FA&&FA.textContent===L}).attr("opacity",1);if(!kA.empty()){let FA=kA.node().getBoundingClientRect().top,HA=w.containers.bar_gene.getBoundingClientRect().top,ZA=FA-HA+w.containers.bar_gene.scrollTop;w.genes.svg_bar_gene.attr("opacity",1),w.containers.bar_gene.scrollTo({top:ZA,behavior:"smooth"})}}w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",1),EB(Y,w,w.cats.cat===L),Wg(w.cats,W),zI(w.genes,[L]),QI(w.cats,[]),await oo(w.cats,w.genes,w.global_base_url,L),_I(Y,W),GB(Y,W),cB(w.genes,Y);let sA=ag(Y,w.close_up);y.setProps({layers:sA}),w.genes.gene_search_input.value=w.genes.gene_search_input.value!==L?L:"",RQ(w.genes,gA?"":L)},update_matrix_col:async L=>{if(w.genes.svg_bar_gene.selectAll("g").attr("font-weight","normal").attr("opacity",1),w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",w.cats.reset_cat?1:.25),w.cats.reset_cat)w.containers.bar_cluster.scrollTo({top:0,behavior:"smooth"});else{let sA=w.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===L}).attr("opacity",1);if(!sA.empty()){let kA=sA.node().getBoundingClientRect().top,FA=w.containers.bar_cluster.getBoundingClientRect().top,HA=kA-FA+w.containers.bar_cluster.scrollTop;w.containers.bar_cluster.scrollTo({top:HA,behavior:"smooth"})}}Wg(w.cats,"cluster"),QI(w.cats,[L]),zI(w.genes,[]),EB(Y,w,!w.cats.selected_cats.length>0);let gA=w.cats.selected_cats.join("-");_I(Y,gA),GB(Y,gA),cB(w.genes,Y);let W=ag(Y,w.close_up);y.setProps({layers:W}),w.genes.gene_search_input.value="",RQ(w.genes,"")},update_matrix_dendro_col:async L=>{let gA=L;Wg(w.cats,"cluster"),QI(w.cats,gA),zI(w.genes,[]),EB(Y,w,!w.cats.selected_cats.length>0);let W=w.cats.selected_cats.join("-");_I(Y,W),GB(Y,W),cB(w.genes,Y);let sA=ag(Y,w.close_up);y.setProps({layers:sA}),w.cats.svg_bar_cluster.selectAll("g").attr("font-weight","normal").attr("opacity",w.cats.reset_cat?1:.25);let kA=gA;if(!w.cats.reset_cat){let FA=w.cats.svg_bar_cluster.selectAll("g").filter(function(){return VA(this).select("text").text()===kA}).attr("opacity",1);if(!FA.empty()){let HA=FA.node().getBoundingClientRect().top,ZA=w.containers.bar_cluster.getBoundingClientRect().top,_=HA-ZA+w.containers.bar_cluster.scrollTop;w.containers.bar_cluster.scrollTo({top:_,behavior:"smooth"})}}},update_view_state:async(L,gA,W)=>{w.close_up=gA,Zl(L,y,Y,w);let sA=ag(Y,w.close_up);y.setProps({controller:{doubleClickZoom:!1},initialViewState:L,views:w.views,layers:sA})},update_layers:()=>{console.log("update_layers")},finalize:()=>{y.finalize()}}};var JV=(g,A)=>{g.tile_scatter_data=A};var YV=(g,A)=>{g.tile_names_array=A},KV=g=>{g.tile_name_to_index_map=new Map,g.tile_names_array.forEach((A,I)=>{g.tile_name_to_index_map.set(A,I)})};var pV=async g=>{let A={},I=g+"/df_colors.parquet";var B=await FQ(I,zg.fetch);let Q=[],C=[],E=B.getChild("__index_level_0__"),o=B.getChild("color");return E&&o&&(Q=E.toArray(),C=o.toArray()),Q.forEach((e,D)=>{A[String(e)]=hs(C[D])}),A};var qV=async(g,A,I)=>{let B=I.model.get("update_trigger"),Q;B.click_type==="row-label"?(Q=B.click_value,Wg(I.cats,Q),await lM(I,Q)):B.click_type==="col-label"?(Wg(I.cats,"cluster"),QI(I.cats,[B.click_value])):B.click_type==="col-dendro"?(Wg(I.cats,"cluster"),QI(I.cats,B.click_value)):Wg("cluster"),Vh(I,A),g.setProps({layers:[A.simple_image_layer,A.square_scatter_layer]}),Q&&Q!=="cluster"&&(I.genes.gene_search_input.value=I.genes.gene_search_input.value!==Q?Q:"",await RQ(I.genes,Q))};var dV=(g,A)=>{if(g.index===-1||!g.layer)return null;let I=A.cats.tile_cats_array[g.index];return A.tooltip_cat_cell=I,rD(".deck-tooltip").style("margin-top","75px"),{html:`<div>${I}</div?`}};var _S=async(g,A,I,B,Q,C,E,o,e=1.4,D="",r=0,n=800)=>{r===0&&(r="100%");let G=document.createElement("div");G.style.height=" 800px";let w={};qN(B),dN(w,I),w.model=g,w.img={},w.img.image_layer_colors={},w.img.image_layer_sliders={},await UN(w.img,I),await SN(w,I,"cells"),w.genes={},w.genes.color_dict_gene={},w.genes.gene_names=[],w.genes.meta_gene={},w.genes.gene_counts=[],w.genes.selected_genes=[],w.genes.trx_ini_radius=1,w.genes.trx_names_array=[],w.genes.trx_data=[],w.genes.gene_text_box="",w.genes.trx_slider=document.createElement("input"),w.genes.gene_search=document.createElement("div"),w.genes.svg_bar_gene=Pe("svg"),w.cats={},w.cats.cat="cluster",w.cats.reset_cat=!1,w.cats.selected_cats=[],w.cats.cell_cats=[],w.cats.dict_cell_cats={},w.cats.color_dict_cluster={},w.cats.cluster_counts=[],w.cats.polygon_cell_names=[],w.cats.svg_bar_cluster=Pe("svg"),w.tooltip_cat_tile="",w.cats.square_tile_size=e,await Pl(w.genes,I);let k={name:"cells",color:[0,0,255]},F=I+"/tile_geometries.parquet";var h=await FQ(F,zg.fetch);w.cats.tile_cats_array=h.getChild("cluster").toArray(),w.cats.tile_exp_array=[],w.cats.tile_names_array=[],w.cats.tile_scatter_data=[],JV(w.cats,Jn(h)),YV(w.cats,h.getChild("name").toArray()),KV(w.cats),w.cats.tile_color_dict=await pV(I);let y=await D8(w,k),J=n8(w.cats),M={simple_image_layer:y,square_scatter_layer:J};w.views=Wl();let l=r8(G,r,n),K={target:[Q,C,E],zoom:o};l.setProps({views:w.views,layers:[M.simple_image_layer,M.square_scatter_layer],getTooltip:f=>dV(f,w),initialViewState:K}),Object.keys(w.model).length>0&&w.model.on("change:update_trigger",()=>qV(l,M,w)),w8(l,M,w);let U=CV(l,M,w);return A.appendChild(U),A.appendChild(G),()=>l.finalize()};var YnA=({isDragging:g})=>g?"grabbing":"pointer",UV=(g,A,I)=>(typeof A=="number"&&(A=A+100,I=I+100),new ra({parent:g,getCursor:YnA,width:A,height:I}));var SV=(g,A)=>{let I;g.mat.forEach((B,Q)=>{B.forEach((C,E)=>{C>=0?I=[255,0,0]:I=[0,0,255];let o={position:[A.viz.col_offset*(E+.5),A.viz.row_offset*(Q+1.5)],color:[I[0],I[1],I[2],255*Math.abs(C)/A.mat.max_abs_value],value:C,row:Q,col:E};A.mat.mat_data.push(o)})})};var LV=(g,A,I,B,Q,C,E,o)=>{let e={};return e.root=I,e.model=g,e.custom_callbacks={},e.custom_callbacks.row=C,e.custom_callbacks.col=E,e.custom_callbacks.col_dendro=o,e.viz={},e.viz.height_margin=100,e.cats={},e.cats.num_cats={},e.cats.num_cats.row=0,e.cats.num_cats.col=0,e.root.style.height=Q+e.viz.height_margin+"px",e.viz.mat_width=B,e.viz.mat_height=Q,e.mat={},e.mat.num_rows=A.mat.length,e.mat.num_cols=A.mat[0].length,e.row_nodes=A.row_nodes,e.col_nodes=A.col_nodes,e.mat.net_mat=A.mat,e.linkage=A.linkage,e.viz.base_font_size=125,e.viz.col_label=75,e.viz.row_label=75,e.viz.extra_space={},e.viz.extra_space.row=10,e.viz.extra_space.col=10,e.zoom={},e.zoom.ini_zoom_x=0,e.zoom.ini_zoom_y=0,e.viz.row_cat_width=9,e.viz.col_cat_height=9,e.viz.row_cat_offset=10,e.viz.col_cat_offset=10,e.viz.label_row_x=15,e.viz.label_col_y=25,e.viz.cat_shift_row=30,e.viz.label_buffer=1,e.animate={},e.animate.duration=2500,e.viz.dendrogram_width=15,e.viz.font_size={},e.viz.font_size.rows=e.viz.base_font_size/e.mat.num_rows,e.viz.font_size.cols=e.viz.base_font_size/e.mat.num_cols,e.viz.col_region=(e.viz.col_cat_height+e.viz.extra_space.col)*e.cats.num_cats.col+e.viz.col_label,e.viz.row_region=(e.viz.row_cat_width+e.viz.extra_space.row)*e.cats.num_cats.row+e.viz.row_label,e.viz.col_width=e.viz.mat_width/e.mat.num_cols,e.viz.row_offset=e.viz.mat_height/e.mat.num_rows,e.viz.col_offset=e.viz.mat_width/e.mat.num_cols,e.viz.cat_shift_col=e.viz.col_label,e.zoom.ini_pan_x=e.viz.mat_width/2,e.zoom.ini_pan_y=e.viz.mat_height/2+e.viz.row_offset,e.mat.mat_data=[],e.mat.num_rows=A.mat.length,e.mat.num_cols=A.mat[0].length,e.mat.max_abs_value=A.mat.flat().reduce((D,r)=>Math.max(D,Math.abs(r)),-1/0),e.order={},e.order.current={},e.order.current.row="clust",e.order.current.col="clust",e.order.new="ini",e.buttons={},e.buttons.blue="#8797ff",e.buttons.gray="#EEEEEE",e.click={},e.click.type,e.click.value,e};var HV=(g,A)=>{let I=[];g.col_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};I.push(C)}),A.labels.col_label_data=I,A.labels.clicks.col=0,A.mat.orders.col={},A.mat.orders.col.ini=I.map(B=>B.ini),A.mat.orders.col.clust=I.map(B=>B.clust+1),A.mat.orders.col.rank=I.map(B=>B.rank+1),A.mat.orders.col.rankvar=I.map(B=>B.rankvar+1)},fV=(g,A)=>{let I=[];g.row_nodes.forEach((B,Q)=>{let C={name:B.name,ini:B.ini,clust:B.clust,rank:B.rank,rankvar:B.rankvar,index:Q};I.push(C)}),A.labels.row_label_data=I,A.labels.clicks.row=0,A.mat.orders.row={},A.mat.orders.row.ini=I.map(B=>B.ini),A.mat.orders.row.clust=I.map(B=>B.clust+1),A.mat.orders.row.rank=I.map(B=>B.rank+1),A.mat.orders.row.rankvar=I.map(B=>B.rankvar+1)};var uV=(g,A)=>{var I=0;let B=0;var Q=A.mat.num_rows*A.cats.num_cats.row;return new Array(Q).fill(0).map(()=>{var E=B%A.cats.num_cats.row;B%A.cats.num_cats.row===0&&(I+=1);let o={position:[A.viz.row_cat_offset*(E+.5)+20,A.viz.row_offset*(I+.5)],color:[0,255,0,255],name:"something "+I};return B+=1,o})},mV=(g,A)=>{var I=A.mat.num_cols*A.cats.num_cats.col,B=0;let Q=0;return new Array(I).fill(0).map(()=>{var E=Q%A.mat.num_cols;Q%A.mat.num_cols===0&&(B+=1);let o={position:[A.viz.col_offset*(E+.5),A.viz.col_cat_offset*(B+1.5)-35],color:[0,255,0,150],name:"some column "+E};return Q+=1,o})};var xV=`#version 300 es
1726
1726
  #define SHADER_NAME scatterplot-layer-vertex-shader
1727
1727
 
1728
1728
  // customize the vertex shader to allow for x and y scaling and zooming