jbrowse-plugin-graphgenomeviewer 6.4.0 → 6.6.0

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.
Files changed (46) hide show
  1. package/dist/chunks/{GraphGenomeView-ULQ6U5MK.js → GraphGenomeView-ZB4ED45M.js} +2 -2
  2. package/dist/chunks/{GraphTrackSettingsDialog-O6IYVHNJ.js → GraphTrackSettingsDialog-UPAINCUZ.js} +2 -2
  3. package/dist/chunks/{LinearGraphDisplay-KM5SOSQQ.js → LinearGraphDisplay-TQX7ZJZF.js} +2 -2
  4. package/dist/chunks/RgfaTabixAdapter-GNFUR2FW.js +3 -0
  5. package/dist/chunks/RgfaTabixAdapter-GNFUR2FW.js.map +7 -0
  6. package/dist/chunks/chunk-JC7I7V6M.js +2 -0
  7. package/dist/chunks/chunk-JC7I7V6M.js.map +7 -0
  8. package/dist/chunks/chunk-OTI5X5W7.js +2 -0
  9. package/dist/chunks/chunk-OTI5X5W7.js.map +7 -0
  10. package/dist/chunks/chunk-OU6VYHKB.js +2 -0
  11. package/dist/chunks/chunk-OU6VYHKB.js.map +7 -0
  12. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +6 -6
  13. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  14. package/package.json +2 -2
  15. package/src/GraphComputeLayout.ts +2 -9
  16. package/src/GraphGenomeView/components/FacetPanels.tsx +2 -0
  17. package/src/GraphGenomeView/components/GraphCanvas.tsx +2 -0
  18. package/src/GraphGenomeView/components/GraphSettingsDialog.tsx +23 -3
  19. package/src/GraphGenomeView/components/usePaneGestures.ts +1 -0
  20. package/src/GraphGenomeView/launchKeys.test.ts +1 -0
  21. package/src/GraphGenomeView/model.test.ts +15 -0
  22. package/src/GraphGenomeView/pane/fitViews.ts +1 -0
  23. package/src/GraphGenomeView/pane/loadActions.ts +1 -0
  24. package/src/GraphGenomeView/pane/paneBase.ts +4 -0
  25. package/src/GraphGenomeView/pane/settingActions.ts +4 -0
  26. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +26 -0
  27. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +205 -0
  28. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +31 -4
  29. package/src/RgfaTabixAdapter/configSchema.ts +6 -5
  30. package/src/RgfaTabixAdapter/rgfaBed.ts +64 -6
  31. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli_anchored.links.bed.gz +0 -0
  32. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli_anchored.links.bed.gz.tbi +0 -0
  33. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli_anchored.segs.bed.gz +0 -0
  34. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli_anchored.segs.bed.gz.tbi +0 -0
  35. package/src/version.ts +1 -1
  36. package/dist/chunks/RgfaTabixAdapter-GYRNCGT2.js +0 -3
  37. package/dist/chunks/RgfaTabixAdapter-GYRNCGT2.js.map +0 -7
  38. package/dist/chunks/chunk-AMD4KXQV.js +0 -2
  39. package/dist/chunks/chunk-AMD4KXQV.js.map +0 -7
  40. package/dist/chunks/chunk-GMSOU6VO.js +0 -2
  41. package/dist/chunks/chunk-GMSOU6VO.js.map +0 -7
  42. package/dist/chunks/chunk-X4DGSMS6.js +0 -2
  43. package/dist/chunks/chunk-X4DGSMS6.js.map +0 -7
  44. /package/dist/chunks/{GraphGenomeView-ULQ6U5MK.js.map → GraphGenomeView-ZB4ED45M.js.map} +0 -0
  45. /package/dist/chunks/{GraphTrackSettingsDialog-O6IYVHNJ.js.map → GraphTrackSettingsDialog-UPAINCUZ.js.map} +0 -0
  46. /package/dist/chunks/{LinearGraphDisplay-KM5SOSQQ.js.map → LinearGraphDisplay-TQX7ZJZF.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{a as x}from"./chunk-AMD4KXQV.js";import"./chunk-X4DGSMS6.js";import"./chunk-7KFSWOWX.js";import"./chunk-GXQ7NYB3.js";import{j as L}from"./chunk-GMSOU6VO.js";import"./chunk-GB7CF6Z2.js";import"./chunk-WTOQRUK2.js";import"./chunk-B7GF3TC3.js";import"./chunk-KRXALLQG.js";import"./chunk-EHV7EUMI.js";import"./chunk-MYJYGSOH.js";import"./chunk-YBLNN5FU.js";import"./chunk-DILFGQIL.js";import"./chunk-FCWXYIFC.js";import{a as B}from"./chunk-J6KYLXRD.js";import{a as v,b as G}from"./chunk-NXZT63HN.js";import{a as s,b as g}from"./chunk-64LZZURD.js";import{b as a}from"./chunk-FY3BTKY4.js";var S=a(g(),1);var m=a(v(),1),n=a(G(),1),C=a(g(),1),P=a(L(),1),o=a(s(),1),I=(0,P.makeStyles)()({paper:{padding:16,margin:8,maxWidth:560,marginInline:"auto",display:"flex",flexDirection:"column",gap:12},row:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8}}),b=(0,C.observer)(function({model:e}){let{classes:r}=I();return e.isLoading?(0,o.jsxs)(n.Paper,{className:r.paper,"data-testid":"graph-genome-loading",children:[(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(m.LoadingEllipses,{variant:"h6",message:e.statusMessage}),(0,o.jsx)(n.Button,{size:"small","data-testid":"graph-genome-cancel",onClick:()=>{e.cancelLoad()},children:"Cancel"})]}),(0,o.jsx)(n.LinearProgress,{variant:"indeterminate"})]}):e.error?(0,o.jsx)(n.Paper,{className:r.paper,children:(0,o.jsx)(m.ErrorBanner,{error:e.error,onReset:()=>{e.retryLoad()}})}):(0,o.jsx)(n.Paper,{className:r.paper,"data-testid":"graph-genome-load-canceled",children:(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(n.Typography,{variant:"h6",children:"Loading canceled"}),(0,o.jsx)(n.Button,{variant:"contained",size:"small","data-testid":"graph-genome-retry",onClick:()=>{e.retryLoad()},children:"Retry"})]})})}),h=b;var M=a(B(),1),N=a(v(),1),i=a(G(),1),w=a(g(),1),E=a(L(),1),t=a(s(),1),k=`H VN:Z:1.0
1
+ import{a as x}from"./chunk-OU6VYHKB.js";import"./chunk-JC7I7V6M.js";import"./chunk-7KFSWOWX.js";import"./chunk-GXQ7NYB3.js";import{p as L}from"./chunk-OTI5X5W7.js";import"./chunk-GB7CF6Z2.js";import"./chunk-WTOQRUK2.js";import"./chunk-B7GF3TC3.js";import"./chunk-KRXALLQG.js";import"./chunk-EHV7EUMI.js";import"./chunk-MYJYGSOH.js";import"./chunk-YBLNN5FU.js";import"./chunk-DILFGQIL.js";import"./chunk-FCWXYIFC.js";import{a as B}from"./chunk-J6KYLXRD.js";import{a as v,b as G}from"./chunk-NXZT63HN.js";import{a as s,b as g}from"./chunk-64LZZURD.js";import{b as a}from"./chunk-FY3BTKY4.js";var S=a(g(),1);var m=a(v(),1),n=a(G(),1),C=a(g(),1),P=a(L(),1),o=a(s(),1),I=(0,P.makeStyles)()({paper:{padding:16,margin:8,maxWidth:560,marginInline:"auto",display:"flex",flexDirection:"column",gap:12},row:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8}}),b=(0,C.observer)(function({model:e}){let{classes:r}=I();return e.isLoading?(0,o.jsxs)(n.Paper,{className:r.paper,"data-testid":"graph-genome-loading",children:[(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(m.LoadingEllipses,{variant:"h6",message:e.statusMessage}),(0,o.jsx)(n.Button,{size:"small","data-testid":"graph-genome-cancel",onClick:()=>{e.cancelLoad()},children:"Cancel"})]}),(0,o.jsx)(n.LinearProgress,{variant:"indeterminate"})]}):e.error?(0,o.jsx)(n.Paper,{className:r.paper,children:(0,o.jsx)(m.ErrorBanner,{error:e.error,onReset:()=>{e.retryLoad()}})}):(0,o.jsx)(n.Paper,{className:r.paper,"data-testid":"graph-genome-load-canceled",children:(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(n.Typography,{variant:"h6",children:"Loading canceled"}),(0,o.jsx)(n.Button,{variant:"contained",size:"small","data-testid":"graph-genome-retry",onClick:()=>{e.retryLoad()},children:"Retry"})]})})}),h=b;var M=a(B(),1),N=a(v(),1),i=a(G(),1),w=a(g(),1),E=a(L(),1),t=a(s(),1),k=`H VN:Z:1.0
2
2
  S 1 ACGT
3
3
  S 2 GGCC
4
4
  S 3 TTAA
@@ -7,4 +7,4 @@ L 1 + 2 + 0M
7
7
  L 1 + 3 + 0M
8
8
  L 2 + 4 + 0M
9
9
  L 3 + 4 + 0M`,z=(0,E.makeStyles)()({column:{display:"flex",flexDirection:"column",gap:8},rowEnd:{display:"flex",gap:8,alignItems:"flex-end"},rowCenter:{display:"flex",gap:8,alignItems:"center"},flex1:{flex:1},paper:{padding:16,margin:8,maxWidth:560,marginInline:"auto"},header:{marginBottom:12},footer:{marginTop:12,display:"flex",justifyContent:"flex-end"}}),R=(0,w.observer)(function({model:e}){let{classes:r}=z(),[d,T]=(0,M.useState)("");function y(){d.trim()&&e.loadGFAFromLocation({uri:d,locationType:"UriLocation"})}function A(p){let c=p.target.files?.[0];c&&c.text().then(f=>e.loadGFA(f,c.name)).catch(f=>{e.setError(f)})}return(0,t.jsxs)(i.Paper,{className:r.paper,children:[(0,t.jsx)("div",{className:r.header,children:(0,t.jsx)(i.Typography,{variant:"h6",children:"Load a GFA graph"})}),(0,t.jsxs)("div",{className:r.column,children:[(0,t.jsxs)("div",{className:r.rowCenter,children:[(0,t.jsxs)(i.Button,{variant:"outlined",component:"label",size:"small",children:["Choose file",(0,t.jsx)("input",{type:"file",accept:".gfa,.gfa1,.gfa2",hidden:!0,onChange:p=>{A(p)}})]}),(0,t.jsx)(i.Typography,{variant:"caption",color:"text.secondary",children:"Whole-file GFA; best for small/medium graphs."})]}),(0,t.jsxs)("div",{className:r.rowEnd,children:[(0,t.jsx)(i.TextField,{size:"small",label:"URL",placeholder:"https://example.com/graph.gfa",value:d,onChange:p=>{T(p.target.value)},onKeyDown:p=>{p.key==="Enter"&&y()},className:r.flex1}),(0,t.jsx)(i.Button,{variant:"contained",onClick:()=>{y()},disabled:!d.trim(),children:"Open"})]})]}),(0,t.jsx)("div",{className:r.footer,children:(0,t.jsx)(i.Button,{size:"small",onClick:()=>{e.loadGFA(k,"Example graph")},children:"Load 4-node example"})}),e.error?(0,t.jsx)(N.ErrorBanner,{error:e.error}):null]})}),F=R;var l=a(s(),1),U=(0,S.observer)(function({model:e}){return e.hasGraph?(0,l.jsx)(x,{model:e}):e.canRetryLoad&&(e.error||e.loadCanceled)?(0,l.jsx)(h,{model:e}):(0,l.jsxs)(l.Fragment,{children:[e.isLoading?(0,l.jsx)(h,{model:e}):null,(0,l.jsx)("div",{hidden:e.isLoading,children:(0,l.jsx)(F,{model:e})})]})}),O=U;export{O as default};
10
- //# sourceMappingURL=GraphGenomeView-ULQ6U5MK.js.map
10
+ //# sourceMappingURL=GraphGenomeView-ZB4ED45M.js.map
@@ -1,4 +1,4 @@
1
- import{a as g}from"./chunk-X4DGSMS6.js";import{j as f}from"./chunk-GMSOU6VO.js";import"./chunk-B7GF3TC3.js";import"./chunk-MYJYGSOH.js";import"./chunk-DILFGQIL.js";import{a as x}from"./chunk-J6KYLXRD.js";import{b as y}from"./chunk-NXZT63HN.js";import{a as l,b as m}from"./chunk-64LZZURD.js";import{b as o}from"./chunk-FY3BTKY4.js";var a=o(y(),1),b=o(m(),1),S=o(f(),1),n=o(l(),1),L=(0,S.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}}),w=[{value:0,label:"None"},{value:1,label:"1 hop"},{value:2,label:"2 hops"}],k=(0,b.observer)(function({model:e}){let{classes:t}=L();return(0,n.jsxs)("div",{className:t.section,children:[(0,n.jsxs)(a.FormControl,{className:t.formControl,children:[(0,n.jsx)(a.InputLabel,{children:"Graph context"}),(0,n.jsx)(a.Select,{value:e.subgraphContext,label:"Graph context","data-testid":"graph-context-select",onChange:p=>{e.setSubgraphContext(p.target.value),e.cut()},children:w.map(({value:p,label:u})=>(0,n.jsx)(a.MenuItem,{value:p,children:u},p))})]}),(0,n.jsx)(a.Typography,{variant:"caption",color:"text.secondary",children:"How far the cut follows links out of the region, one hop by default. A detour that leaves the reference before the window and rejoins after it is indexed under its own sequence, so at none its middle is missing and the one bubble draws as two unrelated stubs. Each hop costs a query per off-reference segment already reached."})]})}),v=k;var C=o(x(),1),d=o(y(),1),c=o(m(),1),G=o(f(),1),i=o(l(),1),T=(0,G.makeStyles)()({section:{marginBottom:24}});function M(r){let e=r.split(/[\s,]+/).map(t=>t.trim()).filter(t=>t!=="");return e.length===0?void 0:e}var F=(0,c.observer)(function({model:e}){let[t,p]=(0,C.useState)(e.chosenHaplotypes?.join(", ")??""),u=()=>{let s=M(t)??[];s.join(`
1
+ import{a as g}from"./chunk-JC7I7V6M.js";import{p as f}from"./chunk-OTI5X5W7.js";import"./chunk-B7GF3TC3.js";import"./chunk-MYJYGSOH.js";import"./chunk-DILFGQIL.js";import{a as x}from"./chunk-J6KYLXRD.js";import{b as y}from"./chunk-NXZT63HN.js";import{a as l,b as m}from"./chunk-64LZZURD.js";import{b as o}from"./chunk-FY3BTKY4.js";var a=o(y(),1),b=o(m(),1),S=o(f(),1),n=o(l(),1),L=(0,S.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}}),w=[{value:0,label:"None"},{value:1,label:"1 hop"},{value:2,label:"2 hops"}],k=(0,b.observer)(function({model:e}){let{classes:t}=L();return(0,n.jsxs)("div",{className:t.section,children:[(0,n.jsxs)(a.FormControl,{className:t.formControl,children:[(0,n.jsx)(a.InputLabel,{children:"Graph context"}),(0,n.jsx)(a.Select,{value:e.subgraphContext,label:"Graph context","data-testid":"graph-context-select",onChange:p=>{e.setSubgraphContext(p.target.value),e.cut()},children:w.map(({value:p,label:u})=>(0,n.jsx)(a.MenuItem,{value:p,children:u},p))})]}),(0,n.jsx)(a.Typography,{variant:"caption",color:"text.secondary",children:"How far the cut follows links out of the region, one hop by default. A detour that leaves the reference before the window and rejoins after it is indexed under its own sequence, so at none its middle is missing and the one bubble draws as two unrelated stubs. Each hop costs a query per off-reference segment already reached."})]})}),v=k;var C=o(x(),1),d=o(y(),1),c=o(m(),1),G=o(f(),1),i=o(l(),1),T=(0,G.makeStyles)()({section:{marginBottom:24}});function M(r){let e=r.split(/[\s,]+/).map(t=>t.trim()).filter(t=>t!=="");return e.length===0?void 0:e}var F=(0,c.observer)(function({model:e}){let[t,p]=(0,C.useState)(e.chosenHaplotypes?.join(", ")??""),u=()=>{let s=M(t)??[];s.join(`
2
2
  `)===(e.chosenHaplotypes??[]).join(`
3
3
  `)||(e.setSubgraphHaplotypes(s),e.cut())};return(0,i.jsx)(d.TextField,{fullWidth:!0,label:"Haplotypes",placeholder:"every haplotype",value:t,slotProps:{htmlInput:{"data-testid":"graph-haplotypes-field"}},onChange:s=>{p(s.target.value)},onBlur:()=>{u()},onKeyDown:s=>{s.key==="Enter"&&u()}})}),N=(0,c.observer)(function({model:e}){let{classes:t}=T();return e.adapterConfig.type==="GbzBaseSyntenyAdapter"?(0,i.jsxs)("div",{className:t.section,children:[(0,i.jsx)(F,{model:e},e.chosenHaplotypes?.join(",")??""),(0,i.jsx)(d.Typography,{variant:"caption",color:"text.secondary",children:"The haplotypes the cut is for, as lane assembly names or PanSN prefixes (HG002#1, or HG002 for both), separated by commas. The cut keeps their walks and the nodes those walks visit, with the reference. Empty is every haplotype."})]}):null}),H=N;var h=o(l(),1);function B({model:r,open:e,onClose:t}){return(0,h.jsxs)(g,{model:r,open:e,onClose:t,children:[(0,h.jsx)(v,{model:r}),(0,h.jsx)(H,{model:r})]})}export{B as default};
4
- //# sourceMappingURL=GraphTrackSettingsDialog-O6IYVHNJ.js.map
4
+ //# sourceMappingURL=GraphTrackSettingsDialog-UPAINCUZ.js.map
@@ -1,2 +1,2 @@
1
- import{a as i}from"./chunk-AMD4KXQV.js";import"./chunk-X4DGSMS6.js";import"./chunk-7KFSWOWX.js";import"./chunk-GXQ7NYB3.js";import"./chunk-GMSOU6VO.js";import"./chunk-GB7CF6Z2.js";import"./chunk-WTOQRUK2.js";import"./chunk-B7GF3TC3.js";import"./chunk-KRXALLQG.js";import"./chunk-EHV7EUMI.js";import"./chunk-MYJYGSOH.js";import"./chunk-YBLNN5FU.js";import"./chunk-DILFGQIL.js";import"./chunk-FCWXYIFC.js";import"./chunk-J6KYLXRD.js";import"./chunk-NXZT63HN.js";import{a as e,b as d}from"./chunk-64LZZURD.js";import{a as h,b as t}from"./chunk-FY3BTKY4.js";var p=h((l,o)=>{o.exports=JBrowseExports["@jbrowse/display-kit/DisplayChrome"]});var s=t(p(),1),n=t(d(),1);var r=t(e(),1),y=(0,n.observer)(function({model:a}){return(0,r.jsx)(s.DisplayStatusChrome,{model:a,phase:a.displayPhase,drawn:a.painted&&a.geometryPainted,testid:"linear-graph-display","data-layout":a.chosenLayoutMode,"data-cut-tier":a.cutTier,"data-recuts":a.recuts,"data-node-count":a.hasGraph?a.nodeCount:void 0,"data-loading":a.isLoading?"":void 0,style:{width:a.paneWidth,height:a.height,overflow:"hidden"},children:(0,r.jsx)(i,{model:a,ownChrome:!1})})}),c=y;export{c as default};
2
- //# sourceMappingURL=LinearGraphDisplay-KM5SOSQQ.js.map
1
+ import{a as i}from"./chunk-OU6VYHKB.js";import"./chunk-JC7I7V6M.js";import"./chunk-7KFSWOWX.js";import"./chunk-GXQ7NYB3.js";import"./chunk-OTI5X5W7.js";import"./chunk-GB7CF6Z2.js";import"./chunk-WTOQRUK2.js";import"./chunk-B7GF3TC3.js";import"./chunk-KRXALLQG.js";import"./chunk-EHV7EUMI.js";import"./chunk-MYJYGSOH.js";import"./chunk-YBLNN5FU.js";import"./chunk-DILFGQIL.js";import"./chunk-FCWXYIFC.js";import"./chunk-J6KYLXRD.js";import"./chunk-NXZT63HN.js";import{a as e,b as d}from"./chunk-64LZZURD.js";import{a as h,b as t}from"./chunk-FY3BTKY4.js";var p=h((l,o)=>{o.exports=JBrowseExports["@jbrowse/display-kit/DisplayChrome"]});var s=t(p(),1),n=t(d(),1);var r=t(e(),1),y=(0,n.observer)(function({model:a}){return(0,r.jsx)(s.DisplayStatusChrome,{model:a,phase:a.displayPhase,drawn:a.painted&&a.geometryPainted,testid:"linear-graph-display","data-layout":a.chosenLayoutMode,"data-cut-tier":a.cutTier,"data-recuts":a.recuts,"data-node-count":a.hasGraph?a.nodeCount:void 0,"data-loading":a.isLoading?"":void 0,style:{width:a.paneWidth,height:a.height,overflow:"hidden"},children:(0,r.jsx)(i,{model:a,ownChrome:!1})})}),c=y;export{c as default};
2
+ //# sourceMappingURL=LinearGraphDisplay-TQX7ZJZF.js.map
@@ -0,0 +1,3 @@
1
+ import{a as D,b as _,d as L,e as M}from"./chunk-2SIR336R.js";import"./chunk-KWAXLUPQ.js";import"./chunk-YBLNN5FU.js";import"./chunk-DILFGQIL.js";import{a as Z}from"./chunk-J4OLMLS5.js";import{b as x}from"./chunk-FY3BTKY4.js";var O=x(D(),1),R=x(Z(),1),j=x(_(),1);function y(r){let e=r.split(" "),a=e.length>=8,i=a?5:0;return{anchored:a,segment:{refName:e[i],start:+e[i+1],end:+e[i+2],id:e[3],rank:+e[4],tags:e[a?8:5]??""}}}function T(r){let e=r.tags.split(" ").find(i=>i.startsWith("SM:Z:"));if(e===void 0)return;let a=e.slice(5).split(",").map(i=>i.trim()).filter(Boolean);return a.length>0?a:void 0}function A(r){return{id:r.slice(0,-1),strand:r.slice(-1)}}function b(r){let e=r.split(" "),a=A(e[3]),i=A(e[4]);return{source:a.id,sourceStrand:a.strand,target:i.id,targetStrand:i.strand,sourceSegment:{id:a.id,refName:e[5],start:+e[6],end:+e[7],rank:+e[8],tags:e[13]??""},targetSegment:{id:i.id,refName:e[9],start:+e[10],end:+e[11],rank:+e[12],tags:e[14]??""}}}function l(r){return`${r.source}${r.sourceStrand}${r.target}${r.targetStrand}`}function F(r,e,a){let i=n=>n.rank!==0||n.refName!==a.refName?0:n.end<=a.start?-1:n.start>=a.end?1:0,t=new Map(r),s=new Map;for(let n of e)if(r.has(n.source)||r.has(n.target)||i(n.sourceSegment)*i(n.targetSegment)===-1){s.set(l(n),n);for(let o of[n.sourceSegment,n.targetSegment])t.has(o.id)||t.set(o.id,o)}for(let n of e)t.has(n.source)&&t.has(n.target)&&s.set(l(n),n);return{segments:t,links:s}}function v(r,e,a){let i=t=>t.refName!==a.refName||t.end<=a.start||t.start>=a.end;return[...I(r.filter(t=>t.rank>0),e,a.end-a.start),...I(r.filter(t=>t.rank===0&&i(t)),new Set(r.map(t=>t.id)),0)]}function I(r,e,a){let i=[...r].sort((s,n)=>N(s.refName,n.refName)||s.start-n.start),t=[];for(let s of i){let n=t.at(-1);n?.refName===s.refName&&s.start-n.end<=a?(n.needed||=s.start>n.end||e.has(s.id),n.end=Math.max(n.end,s.end)):t.push({refName:s.refName,start:s.start,end:s.end,needed:e.has(s.id)})}return t.filter(s=>s.needed).map(({refName:s,start:n,end:o})=>({refName:s,start:n,end:o}))}function P(r,e,a){let i=t=>e.has(t.id)||a.some(s=>s.refName===t.refName&&t.start>=s.start&&t.end<=s.end);return r.filter(t=>i(t.sourceSegment)&&i(t.targetSegment))}var z=/^[A-Za-z][A-Za-z0-9]:[AifZJHB]:/;function E(r){let{id:e,refName:a,start:i,end:t,rank:s,tags:n}=r,o=n.split(" ").filter(d=>z.test(d)),g=o.length===0?"":` ${o.join(" ")}`;return`S ${e} * LN:i:${t-i} SN:Z:${a} SO:i:${i} SR:i:${s}${g}`}function H(r){let{source:e,sourceStrand:a,target:i,targetStrand:t}=r;return`L ${e} ${a} ${i} ${t} 0M`}function N(r,e){return r<e?-1:r>e?1:0}function w(r,e){let a=[...r.values()].sort((t,s)=>N(t.refName,s.refName)||t.start-s.start||N(t.id,s.id)),i=[...e.keys()].sort((t,s)=>N(t,s));return["H VN:Z:1.0",...a.map(t=>E(t)),...i.map(t=>H(e.get(t)))].join(`
2
+ `)}function B(r){return r.filter(e=>e.rank>0)}var $=class extends O.BaseFeatureDataAdapter{static{this.capabilities=["getFeatures","getRefNames"]}constructor(e,a,i){super(e,a,i),this.fine=this.openIndex([])}openIndex(e){let a=L(this,[...e,"segmentsLocation"],[...e,"segmentsIndex"]);return{segments:a,links:L(this,[...e,"linksLocation"],[...e,"linksIndex"]),refNames:new M(a,this)}}index(e="fine"){return e==="fine"?this.fine:(this.coarse??=this.openIndex(["coarse"]),this.coarse)}async getRefNames(e={}){return this.fine.refNames.assemblyRefNames(e)}async hasDataForRefName(){return!0}getFeatures(e,a={}){let{signal:i,statusCallback:t}=a;return(0,j.ObservableCreate)(async s=>{let n=await this.fine.refNames.resolve(e,a);n!==void 0&&await(0,R.updateStatus)("Downloading segments",t,()=>this.fine.segments.getLines(n,e.start,e.end,{signal:i,lineCallback:o=>{let{segment:g,anchored:d}=y(o);if(d&&g.refName!==n)return;let u=T(g);s.next(new R.SimpleFeature({uniqueId:g.id,refName:e.refName,start:g.start,end:g.end,name:g.id,type:"segment",rank:g.rank,stableName:g.refName,...u&&{samples:u,sampleCount:u.length}}))}})),s.complete()},i)}async getSubgraph(e,a={}){let{hops:i=0,signal:t,tier:s}=a,n=this.index(s),o=new Map,g=new Map,d=await n.refNames.resolve(e,{signal:t}),u=async(c,m,f)=>{let p=[];return await n.links.getLines(c,m,f,{signal:t,lineCallback:G=>{let S=b(G);g.set(l(S),S);for(let h of[S.sourceSegment,S.targetSegment])o.has(h.id)||(o.set(h.id,h),p.push(h))}}),p};if(d===void 0)throw new Error(`${e.assemblyName} ${e.refName} is not in this graph's index; a graph with PanSN names (GRCh38#0#chr1) needs ${e.assemblyName} mapped to its prefix in assemblyNameToPanSN`);let C={anchored:!1};if(await n.segments.getLines(d,e.start,e.end,{signal:t,lineCallback:c=>{let m=y(c);C.anchored||=m.anchored,o.set(m.segment.id,m.segment)}}),C.anchored){let c=[];await n.links.getLines(d,e.start,e.end,{signal:t,lineCallback:f=>{c.push(b(f))}});let m=F(o,c,{refName:d,start:e.start,end:e.end});return w(m.segments,m.links)}let k=B(await u(d,e.start,e.end));for(let c=0;c<i;c++){let m=await Promise.all(k.map(f=>u(f.refName,f.start,f.end)));k=B(m.flat())}if(i>0){let c=v([...o.values()],new Set(k.map(f=>f.id)),{refName:d,start:e.start,end:e.end}),m=[];await Promise.all(c.map(f=>n.links.getLines(f.refName,f.start,f.end,{signal:t,lineCallback:p=>{m.push(b(p))}})));for(let f of P(m,o,c)){g.set(l(f),f);for(let p of[f.sourceSegment,f.targetSegment])o.has(p.id)||o.set(p.id,p)}}return w(o,g)}};export{$ as default};
3
+ //# sourceMappingURL=RgfaTabixAdapter-GNFUR2FW.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/RgfaTabixAdapter/RgfaTabixAdapter.ts", "../../src/RgfaTabixAdapter/rgfaBed.ts"],
4
+ "sourcesContent": ["import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SimpleFeature, updateStatus } from '@jbrowse/core/util'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\n\nimport { PanSNRefNames, openTabixSlot } from '../panSNTabix.ts'\nimport {\n anchoredCut,\n closingLinks,\n closingSpans,\n formatSubgraph,\n linkKey,\n parseLinkLine,\n parseSegmentRow,\n segmentSamples,\n} from './rgfaBed.ts'\n\nimport type { RgfaTabixAdapterConfig } from './configSchema.ts'\nimport type { SubgraphAdapterOptions, SubgraphTier } from '../GetSubgraph.ts'\nimport type { RgfaLink, RgfaSegment } from './rgfaBed.ts'\nimport type { TabixIndexedFile } from '@gmod/tabix'\nimport type PluginManager from '@jbrowse/core/PluginManager'\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { Region } from '@jbrowse/core/util/types'\n\n// What a hop follows: alleles, never the backbone. A rank-0 segment reached\n// through a link is flanking backbone, usually outside the window, so querying\n// its links walks the reference away from the region, brings back more backbone,\n// and closes nothing. Every segment that closes a bubble is an allele interior,\n// and an allele interior is rank > 0 in both index formats (rGFA's SR tag, and\n// pggb's rank 0-or-1 against the anchor path). Reached backbone still becomes a\n// node and its edge still draws; it is only not walked through.\n//\n// This is gfabase's rule, arrived at from the other end. `gfabase sub` expands\n// from a seed either to the whole connected component (`--connected`, which its\n// own README calls overkill) or with `--cutpoints 1`, which takes the biconnected\n// component by *stopping at cutpoints*, the segments every end-to-end walk of\n// the chromosome must traverse. In a reference-anchored pangenome the cutpoints\n// are the backbone, and rank is what the index already states about it, so\n// `rank > 0` is that stopping rule without a connectivity index to build. The\n// third tool is the same shape again: `gfatools view -R` maps the region onto its\n// precomputed bubble decomposition and returns whole overlapping bubbles\n// (gfa_query_by_reg), which is complete for the same reason. Bandage's own\n// `--distance` is a node-step radius, but Bandage holds the entire graph in\n// memory, so its scope is a drawing filter rather than a fetch strategy.\n//\n// Measured with this rule: the E. coli paa window converges at one hop (17\n// segments at 1 and at 2), so the cut closes and stays closed. HPRC's amylase\n// window keeps growing (63 at 0, 78 at 1, 92 at 2) because its alleles have\n// alleles, and wall-clock is flat across all three, since a hop's queries go out\n// together and the remote index dominates.\n//\n// The exact version, when a graph ships a bubble index beside its segments:\n// gfatools' bubble rows carry the member segment ids of every bubble, so the\n// bubbles overlapping the region state which segments a complete cut must\n// contain. That turns the hop count into a termination condition rather than a\n// setting, and MinigraphBubbleAdapter already parses those rows.\nfunction offReference(segments: RgfaSegment[]) {\n return segments.filter(segment => segment.rank > 0)\n}\n\ninterface GraphIndex {\n segments: TabixIndexedFile\n links: TabixIndexedFile\n refNames: PanSNRefNames\n}\n\nexport default class RgfaTabixAdapter extends BaseFeatureDataAdapter<RgfaTabixAdapterConfig> {\n public static capabilities = ['getFeatures', 'getRefNames']\n\n private readonly fine\n private coarse: GraphIndex | undefined\n\n public constructor(\n config: RgfaTabixAdapterConfig,\n getSubAdapter?: getSubAdapterType,\n pluginManager?: PluginManager,\n ) {\n super(config, getSubAdapter, pluginManager)\n this.fine = this.openIndex([])\n }\n\n // refNames off the SEGMENT index: it is the one that names every stable\n // sequence the graph is anchored to, where the link index only names those a\n // link touches.\n private openIndex(under: string[]): GraphIndex {\n const segments = openTabixSlot(\n this,\n [...under, 'segmentsLocation'],\n [...under, 'segmentsIndex'],\n )\n return {\n segments,\n links: openTabixSlot(\n this,\n [...under, 'linksLocation'],\n [...under, 'linksIndex'],\n ),\n refNames: new PanSNRefNames(segments, this),\n }\n }\n\n private index(tier: SubgraphTier = 'fine') {\n if (tier === 'fine') {\n return this.fine\n }\n this.coarse ??= this.openIndex(['coarse'])\n return this.coarse\n }\n\n async getRefNames(opts: BaseOptions = {}) {\n return this.fine.refNames.assemblyRefNames(opts)\n }\n\n public async hasDataForRefName() {\n return true\n }\n\n getFeatures(query: Region, opts: BaseOptions = {}) {\n const { signal, statusCallback } = opts\n return ObservableCreate<Feature>(async observer => {\n const tabixRefName = await this.fine.refNames.resolve(query, opts)\n if (tabixRefName !== undefined) {\n await updateStatus('Downloading segments', statusCallback, () =>\n this.fine.segments.getLines(tabixRefName, query.start, query.end, {\n signal,\n lineCallback: line => {\n const { segment, anchored } = parseSegmentRow(line)\n // An anchored index also returns the alleles under the region,\n // which lie on other stable sequences and have no place on this\n // one.\n if (anchored && segment.refName !== tabixRefName) {\n return\n }\n // `samples` lists the haplotypes whose paths visit the segment and\n // `sampleCount` counts them. A lane's color reads the count, and\n // a count in jexl would otherwise rely on `.length` resolving\n // through a member access on an array.\n const samples = segmentSamples(segment)\n observer.next(\n new SimpleFeature({\n uniqueId: segment.id,\n refName: query.refName,\n start: segment.start,\n end: segment.end,\n name: segment.id,\n type: 'segment',\n rank: segment.rank,\n stableName: segment.refName,\n ...(samples && { samples, sampleCount: samples.length }),\n }),\n )\n },\n }),\n )\n }\n observer.complete()\n }, signal)\n }\n\n // Extract the graph around a region as GFA text, for GraphGenomeView. The\n // region's own segments come from segs.bed.gz; links.bed.gz supplies the edges\n // incident to them *and* the coordinates of the segments on the other end,\n // which typically sit on a different stable sequence (a rank>0 bubble) and so\n // are not reachable by any coordinate query on this region.\n //\n // `hops` is extra rounds of link-following past the region's own segments\n // and their immediate neighbours, each costing one tabix query per\n // off-reference segment newly reached. After the last round, one more read\n // per stretch of stable sequence the cut holds closes it (closingSpans), so\n // an allele reached from both ends draws whole. The view asks for one hop; a\n // hopless cut stays as cheap as it was. `signal` goes to every one of those\n // queries, so a cut the view has replaced stops.\n // `tier: 'coarse'` reads the `coarse` pair instead, the same way.\n async getSubgraph(region: Region, opts: SubgraphAdapterOptions = {}) {\n const { hops = 0, signal, tier } = opts\n const index = this.index(tier)\n const segments = new Map<string, RgfaSegment>()\n const links = new Map<string, RgfaLink>()\n const tabixRefName = await index.refNames.resolve(region, { signal })\n\n const addLinksOver = async (\n refName: string,\n start: number,\n end: number,\n ) => {\n const reached: RgfaSegment[] = []\n await index.links.getLines(refName, start, end, {\n signal,\n lineCallback: line => {\n const link = parseLinkLine(line)\n links.set(linkKey(link), link)\n for (const segment of [link.sourceSegment, link.targetSegment]) {\n if (!segments.has(segment.id)) {\n segments.set(segment.id, segment)\n reached.push(segment)\n }\n }\n },\n })\n return reached\n }\n\n if (tabixRefName === undefined) {\n throw new Error(\n `${region.assemblyName} ${region.refName} is not in this graph's index; a graph with PanSN names (GRCh38#0#chr1) needs ${region.assemblyName} mapped to its prefix in assemblyNameToPanSN`,\n )\n }\n const layout = { anchored: false }\n await index.segments.getLines(tabixRefName, region.start, region.end, {\n signal,\n lineCallback: line => {\n const row = parseSegmentRow(line)\n layout.anchored ||= row.anchored\n segments.set(row.segment.id, row.segment)\n },\n })\n // An anchored index files every allele and every link under the reference\n // interval its bubble hangs from, so one read of each file holds the whole\n // graph under the region and there is nothing to hop to or close.\n if (layout.anchored) {\n const found: RgfaLink[] = []\n await index.links.getLines(tabixRefName, region.start, region.end, {\n signal,\n lineCallback: line => {\n found.push(parseLinkLine(line))\n },\n })\n const cut = anchoredCut(segments, found, {\n refName: tabixRefName,\n start: region.start,\n end: region.end,\n })\n return formatSubgraph(cut.segments, cut.links)\n }\n let frontier = offReference(\n await addLinksOver(tabixRefName, region.start, region.end),\n )\n for (let hop = 0; hop < hops; hop++) {\n // One hop's queries are independent of each other, so they go out\n // together rather than one round-trip at a time. Their callbacks share\n // the segment and link maps, which is safe because only one of them runs\n // at a time, and the output is sorted at the end regardless of the order\n // they arrive in.\n const reached = await Promise.all(\n frontier.map(segment =>\n addLinksOver(segment.refName, segment.start, segment.end),\n ),\n )\n frontier = offReference(reached.flat())\n }\n if (hops > 0) {\n const spans = closingSpans(\n [...segments.values()],\n new Set(frontier.map(segment => segment.id)),\n { refName: tabixRefName, start: region.start, end: region.end },\n )\n const found: RgfaLink[] = []\n await Promise.all(\n spans.map(span =>\n index.links.getLines(span.refName, span.start, span.end, {\n signal,\n lineCallback: line => {\n found.push(parseLinkLine(line))\n },\n }),\n ),\n )\n for (const link of closingLinks(found, segments, spans)) {\n links.set(linkKey(link), link)\n for (const segment of [link.sourceSegment, link.targetSegment]) {\n if (!segments.has(segment.id)) {\n segments.set(segment.id, segment)\n }\n }\n }\n }\n\n return formatSubgraph(segments, links)\n }\n}\n", "// A segment as it appears in segs.bed.gz, and as it is repeated inside every\n// links.bed.gz row: `stableName start end segmentId rank [tags]`. The first\n// five are the SN/SO/SR tags rGFA already carries, projected to BED by\n// `gfatools gfa2bed -m`.\n//\n// `tags` is a space-separated list of GFA tags, written verbatim onto the\n// S-line formatSegment synthesizes, where the GFA parser reads them into\n// `GraphNode.tags` with no work here. It is the extension point for everything\n// the five columns cannot say: carriage on a path-derived graph (`SM:Z:`), the\n// collapse summary on a level-of-detail tier (`ct:Z:`, `cn:i:`, ...), a\n// precomputed layout position later. rGFA files have no sixth column at all,\n// so this is empty for them and nothing changes.\nexport interface RgfaSegment {\n refName: string\n start: number\n end: number\n id: string\n rank: number\n tags: string\n}\n\nexport interface RgfaLink {\n source: string\n sourceStrand: string\n target: string\n targetStrand: string\n sourceSegment: RgfaSegment\n targetSegment: RgfaSegment\n}\n\nexport function parseSegmentLine(line: string): RgfaSegment {\n return parseSegmentRow(line).segment\n}\n\n// gfa-to-tabix's anchored layout files a segment under the reference interval\n// its bubble hangs from and states the segment's own coordinate after the rank:\n// `anchorName anchorStart anchorEnd segmentId rank stableName start end [tags]`.\n// One query over a region then returns every segment of every bubble under it,\n// and `anchored` tells a cut it has nothing left to follow.\nexport function parseSegmentRow(line: string) {\n const cols = line.split('\\t')\n const anchored = cols.length >= 8\n const own = anchored ? 5 : 0\n return {\n anchored,\n segment: {\n refName: cols[own]!,\n start: +cols[own + 1]!,\n end: +cols[own + 2]!,\n id: cols[3]!,\n rank: +cols[4]!,\n tags: cols[anchored ? 8 : 5] ?? '',\n } satisfies RgfaSegment,\n }\n}\n\n// Carriage as an ordinary feature attribute, for the linear track rather than\n// the graph. The tag column reaches the graph view through the synthesized\n// S-line (formatSegment below, then gfaConverter reads SM into\n// `GraphNode.samples`), and that route ends at the graph: `getFeatures` builds\n// its own features and had no way to say who carries a segment, so a lane\n// colored by carriage was not expressible.\n//\n// `SM:Z:` is its own grammar check here. build_pggb_tabix.sh wrote a bare\n// comma-separated list in this column before the tag column existed, and those\n// files are still hosted; a bare list has no prefix to match, so it is dropped\n// rather than read as one sample named `K12,Sakai,CFT073`.\n//\n// Undefined rather than [] when the tag is absent, matching gfaConverter: an\n// rGFA has no sixth column at all, so a segment that says nothing about\n// carriage stays distinguishable from one carried by nobody.\nexport function segmentSamples(segment: RgfaSegment) {\n const tag = segment.tags.split(' ').find(t => t.startsWith('SM:Z:'))\n if (tag === undefined) {\n return undefined\n }\n const samples = tag\n .slice('SM:Z:'.length)\n .split(',')\n .map(s => s.trim())\n .filter(Boolean)\n return samples.length > 0 ? samples : undefined\n}\n\n// `s322+` \u2014 the L-line's segment id with its orientation appended, mirroring\n// the GFA record it came from.\nfunction parseEndpoint(field: string) {\n return { id: field.slice(0, -1), strand: field.slice(-1) }\n}\n\nexport function parseLinkLine(line: string): RgfaLink {\n const cols = line.split('\\t')\n const source = parseEndpoint(cols[3]!)\n const target = parseEndpoint(cols[4]!)\n return {\n source: source.id,\n sourceStrand: source.strand,\n target: target.id,\n targetStrand: target.strand,\n sourceSegment: {\n id: source.id,\n refName: cols[5]!,\n start: +cols[6]!,\n end: +cols[7]!,\n rank: +cols[8]!,\n tags: cols[13] ?? '',\n },\n targetSegment: {\n id: target.id,\n refName: cols[9]!,\n start: +cols[10]!,\n end: +cols[11]!,\n rank: +cols[12]!,\n tags: cols[14] ?? '',\n },\n }\n}\n\nexport function linkKey(link: RgfaLink) {\n return `${link.source}${link.sourceStrand}${link.target}${link.targetStrand}`\n}\n\n// The cut an anchored index gives: `under` is what the segment file returned\n// for the window, every segment of every bubble under it, and `found` is what\n// the link file returned. gfa-to-tabix files a link widely enough that `found`\n// holds every link touching a segment in `under` and every link between the\n// segments those lead to, plus links of neither kind, which are dropped here.\n// A backbone link that jumps the whole window, as a deletion or inversion\n// spanning it does, touches nothing in `under` and is kept by its own rule.\nexport function anchoredCut(\n under: Map<string, RgfaSegment>,\n found: RgfaLink[],\n window: StableSpan,\n) {\n const side = (segment: RgfaSegment) =>\n segment.rank !== 0 || segment.refName !== window.refName\n ? 0\n : segment.end <= window.start\n ? -1\n : segment.start >= window.end\n ? 1\n : 0\n const segments = new Map(under)\n const links = new Map<string, RgfaLink>()\n for (const link of found) {\n if (\n under.has(link.source) ||\n under.has(link.target) ||\n side(link.sourceSegment) * side(link.targetSegment) === -1\n ) {\n links.set(linkKey(link), link)\n for (const segment of [link.sourceSegment, link.targetSegment]) {\n if (!segments.has(segment.id)) {\n segments.set(segment.id, segment)\n }\n }\n }\n }\n for (const link of found) {\n if (segments.has(link.source) && segments.has(link.target)) {\n links.set(linkKey(link), link)\n }\n }\n return { segments, links }\n}\n\n// Both endpoints of a link are written into every row, so the same link is\n// indexed under each endpoint's stable sequence and arrives twice for a region\n// covering both. Callers dedupe on linkKey.\n\nexport interface StableSpan {\n refName: string\n start: number\n end: number\n}\n\n// Where a cut reads links once more to close itself. A hop reads the links of\n// the segments the round before it reached, so a link between two segments of\n// the last round is never read and an allele reached from both ends draws as\n// two stubs. rGFA lays an allele out as one stretch of the stable sequence that\n// introduced it, so pieces of one sequence within the window's length of each\n// other merge into a span, and reading it brings the pieces between too.\n// Backbone reached past the window is unread for the same reason; its spans\n// join only abutting pieces, since the reference past the window is not the\n// cut's to fill. A span whose segments were all read and abut is skipped.\nexport function closingSpans(\n held: RgfaSegment[],\n unread: Set<string>,\n window: StableSpan,\n) {\n const outside = (segment: RgfaSegment) =>\n segment.refName !== window.refName ||\n segment.end <= window.start ||\n segment.start >= window.end\n return [\n ...mergedSpans(\n held.filter(segment => segment.rank > 0),\n unread,\n window.end - window.start,\n ),\n ...mergedSpans(\n held.filter(segment => segment.rank === 0 && outside(segment)),\n new Set(held.map(segment => segment.id)),\n 0,\n ),\n ]\n}\n\nfunction mergedSpans(\n segments: RgfaSegment[],\n unread: Set<string>,\n maxGap: number,\n) {\n const sorted = [...segments].sort(\n (a, b) => compare(a.refName, b.refName) || a.start - b.start,\n )\n const spans: (StableSpan & { needed: boolean })[] = []\n for (const segment of sorted) {\n const span = spans.at(-1)\n if (\n span?.refName === segment.refName &&\n segment.start - span.end <= maxGap\n ) {\n span.needed ||= segment.start > span.end || unread.has(segment.id)\n span.end = Math.max(span.end, segment.end)\n } else {\n spans.push({\n refName: segment.refName,\n start: segment.start,\n end: segment.end,\n needed: unread.has(segment.id),\n })\n }\n }\n return spans\n .filter(span => span.needed)\n .map(({ refName, start, end }): StableSpan => ({ refName, start, end }))\n}\n\n// The links a closing read keeps: each end is a segment the cut holds or one\n// lying inside a span. Following anything else is what another hop is for.\nexport function closingLinks(\n found: RgfaLink[],\n held: Map<string, RgfaSegment>,\n spans: StableSpan[],\n) {\n const inside = (segment: RgfaSegment) =>\n held.has(segment.id) ||\n spans.some(\n span =>\n span.refName === segment.refName &&\n segment.start >= span.start &&\n segment.end <= span.end,\n )\n return found.filter(\n link => inside(link.sourceSegment) && inside(link.targetSegment),\n )\n}\n\n// Segments carry no sequence here \u2014 the BED records only their span \u2014 so every\n// S-line is written with `*` and an LN tag, which is what the GFA spec asks for\n// and what packages/graph-core's parser reads back as the node length.\n// `NM:i:0`, `SM:Z:HG002.1,HG002.2` \u2014 the GFA tag grammar, checked rather than\n// trusted. Files built before the tag column existed put a bare comma-separated\n// sample list here, and passing that through would put a field that is not a\n// tag on an S-line, which is a malformed GFA rather than a missing annotation.\n// Dropping it degrades to the pre-tag behaviour instead.\nconst GFA_TAG = /^[A-Za-z][A-Za-z0-9]:[AifZJHB]:/\n\nfunction formatSegment(segment: RgfaSegment) {\n const { id, refName, start, end, rank, tags } = segment\n const valid = tags.split(' ').filter(t => GFA_TAG.test(t))\n const extra = valid.length === 0 ? '' : `\\t${valid.join('\\t')}`\n return `S\\t${id}\\t*\\tLN:i:${end - start}\\tSN:Z:${refName}\\tSO:i:${start}\\tSR:i:${rank}${extra}`\n}\n\nfunction formatLink(link: RgfaLink) {\n const { source, sourceStrand, target, targetStrand } = link\n return `L\\t${source}\\t${sourceStrand}\\t${target}\\t${targetStrand}\\t0M`\n}\n\n// Codepoint order, not localeCompare: the byte-identical-output guarantee below\n// has to hold across locales.\nfunction compare(a: string, b: string) {\n return a < b ? -1 : a > b ? 1 : 0\n}\n\n// Deterministic ordering: the same region always produces byte-identical GFA,\n// so a layout computed from it is reproducible.\nexport function formatSubgraph(\n segments: Map<string, RgfaSegment>,\n links: Map<string, RgfaLink>,\n) {\n const sortedSegments = [...segments.values()].sort(\n (a, b) =>\n compare(a.refName, b.refName) || a.start - b.start || compare(a.id, b.id),\n )\n const sortedLinks = [...links.keys()].sort((a, b) => compare(a, b))\n return [\n 'H\\tVN:Z:1.0',\n ...sortedSegments.map(s => formatSegment(s)),\n ...sortedLinks.map(k => formatLink(links.get(k)!)),\n ].join('\\n')\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_BaseAdapter", "import_util", "import_rxjs", "parseSegmentRow", "line", "cols", "anchored", "own", "segmentSamples", "segment", "tag", "t", "samples", "s", "parseEndpoint", "field", "parseLinkLine", "source", "target", "linkKey", "link", "anchoredCut", "under", "found", "window", "side", "segments", "links", "closingSpans", "held", "unread", "outside", "mergedSpans", "maxGap", "sorted", "a", "b", "compare", "spans", "span", "refName", "start", "end", "closingLinks", "inside", "GFA_TAG", "formatSegment", "id", "rank", "tags", "valid", "extra", "formatLink", "sourceStrand", "targetStrand", "formatSubgraph", "sortedSegments", "sortedLinks", "k", "offReference", "segments", "segment", "RgfaTabixAdapter", "config", "getSubAdapter", "pluginManager", "under", "openTabixSlot", "PanSNRefNames", "tier", "opts", "query", "signal", "statusCallback", "observer", "tabixRefName", "line", "anchored", "parseSegmentRow", "samples", "segmentSamples", "region", "hops", "index", "links", "addLinksOver", "refName", "start", "end", "reached", "link", "parseLinkLine", "linkKey", "layout", "row", "found", "cut", "anchoredCut", "formatSubgraph", "frontier", "hop", "spans", "closingSpans", "span", "closingLinks"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{d as S,g as k,m as T,p as D}from"./chunk-OTI5X5W7.js";import{N as g,T as I}from"./chunk-B7GF3TC3.js";import{a as A,b as R}from"./chunk-NXZT63HN.js";import{a as w,b as E}from"./chunk-64LZZURD.js";import{b as c}from"./chunk-FY3BTKY4.js";var u=[{value:0,label:"Fastest"},{value:1,label:"Fast"},{value:2,label:"Default"},{value:3,label:"Fine"},{value:4,label:"Best"}];var N=c(A(),1),o=c(R(),1),v=c(E(),1),G=c(D(),1),e=c(w(),1),C=(0,G.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}});function s({warn:l=!1,children:n}){return(0,e.jsx)(o.Typography,{variant:"caption",color:l?"warning.main":"text.secondary",children:n})}var m=(0,v.observer)(function({model:n}){return n.hasGraph&&!n.usesLayoutEngine?(0,e.jsx)(s,{warn:!0,children:"No effect on this layout: only the force-directed layout is drawn by the engine that reads this."}):null});function b({label:l,checked:n,onChange:t,children:p}){let{classes:h}=C();return(0,e.jsxs)("div",{className:h.section,children:[(0,e.jsx)(o.FormControlLabel,{control:(0,e.jsx)(o.Switch,{checked:n,onChange:d=>{t(d.target.checked)}}),label:l}),p]})}function i({label:l,value:n,options:t,testId:p,sx:h,onChange:d}){let{classes:r}=C();return(0,e.jsxs)(o.FormControl,{className:r.formControl,sx:h,children:[(0,e.jsx)(o.InputLabel,{children:l}),(0,e.jsx)(o.Select,{value:n,label:l,"data-testid":p,onChange:a=>{d(a.target.value)},children:t.map(({value:a,label:f,description:y})=>(0,e.jsx)(o.MenuItem,{value:a,children:y?(0,e.jsx)(o.Tooltip,{title:y,placement:"right",children:(0,e.jsx)("span",{children:f})}):f},a))})]})}var L=l=>l.map(({trackId:n,name:t})=>({value:n,label:t})),P=(0,v.observer)(function(n){let{model:t,open:p,onClose:h,children:d}=n,{classes:r}=C();return(0,e.jsxs)(N.Dialog,{open:p,onClose:h,title:"Graph settings",children:[(0,e.jsxs)(o.DialogContent,{children:[(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(i,{label:"Engine",value:t.layoutEngine,options:S,testId:"graph-layout-engine-select",onChange:a=>{t.setLayoutEngine(a),t.recomputeLayout()}}),(0,e.jsx)(s,{children:"Which engine draws the force-directed layout. Stress reads distances along the graph as distances on the page, so the reference draws straight; it is experimental, and slower than FMMM on large cuts."}),(0,e.jsx)(m,{model:t})]}),(0,e.jsx)("div",{className:r.section,children:(0,e.jsxs)(o.FormControl,{fullWidth:!0,children:[(0,e.jsx)(o.FormLabel,{component:"legend",children:"Layout quality"}),(0,e.jsx)(o.RadioGroup,{value:t.layoutQuality,onChange:a=>{t.setLayoutQuality(parseInt(a.target.value)),t.recomputeLayout()},children:u.map(a=>(0,e.jsx)(o.FormControlLabel,{value:a.value,control:(0,e.jsx)(o.Radio,{}),label:a.label},a.value))}),(0,e.jsx)(s,{children:"The engine's iteration budget; for FMMM the same scale Bandage exposes. Higher is slower: on a thousand-node cut the top setting is seconds rather than tenths."}),(0,e.jsx)(m,{model:t})]})}),(0,e.jsxs)(b,{label:"Draw paths",checked:t.drawPaths,onChange:a=>{t.setDrawPaths(a)},children:[(0,e.jsx)(s,{children:"Color each node and connector by the paths through it, one lane per path in legend order, so a path that skips a node leaves its lane empty"}),t.drawPaths&&!t.effectiveDrawPaths?(0,e.jsx)(s,{warn:!0,children:t.pathCount>g?`Off: ${t.pathCount.toLocaleString()} paths is past the ${g} this can tell apart`:"Off: this graph states no paths"}):null]}),(0,e.jsx)(b,{label:"Mark bubbles",checked:t.showBubbles,onChange:a=>{t.setShowBubbles(a)},children:(0,e.jsx)(s,{children:"A halo along the nodes of each bubble, labelled by what it is, with the label opening the bubble on its own"})}),(0,e.jsxs)(b,{label:"Genes on the backbone",checked:t.showGenes,onChange:a=>{t.setShowGenes(a)},children:[(0,e.jsx)(s,{children:"Exons along the reference nodes that carry them and each gene's name at its midpoint, from the assembly's annotation track"}),t.geneTrackChoices.length>1?(0,e.jsx)(i,{label:"Gene track",value:t.geneTrack?.trackId??"",options:L(t.geneTrackChoices),testId:"graph-gene-track-select",sx:{mt:1},onChange:a=>{t.setGeneTrackId(a),t.reloadGenes()}}):null,t.repeatTrackChoices.length>1?(0,e.jsx)(i,{label:"Repeat track",value:t.repeatTrack?.trackId??"",options:L(t.repeatTrackChoices),testId:"graph-repeat-track-select",sx:{mt:1},onChange:a=>{t.setRepeatTrackId(a),t.reloadRepeats()}}):null]}),t.anchorPaths.length>1?(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(i,{label:"Reference path",value:t.activeReferencePath??"",options:t.anchorPaths.map(({name:a})=>({value:a,label:a})),testId:"graph-reference-path-select",onChange:a=>{t.setReferencePath(a),t.recomputeLayout()}}),(0,e.jsx)(s,{children:"Which path the anchored layouts draw x against. A GFA with no rGFA tags states its coordinates only in its paths, and marks none of them as the reference."})]}):null,(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(i,{label:"Bubble spread",value:t.bubbleSpread,options:T,testId:"graph-bubble-spread-select",onChange:a=>{t.setBubbleSpread(a),t.recomputeLayout()}}),(0,e.jsx)(s,{children:"How far the force layout opens a bubble. A pangenome allele is a few bp, so at Bandage's own scale both arms land inside one node thickness and the graph draws as a rope."}),(0,e.jsx)(m,{model:t})]}),(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(i,{label:"Node width",value:t.nodeWidth,options:I,testId:"graph-node-width-select",onChange:a=>{t.setNodeWidth(a)}}),(0,e.jsx)(s,{children:"Bandage's depth as width. In a cut with walks, depth is how many haplotypes carry the node."})]}),d,(0,e.jsxs)("div",{className:r.section,children:[(0,e.jsx)(i,{label:"Color scheme",value:t.chosenColorScheme,options:k,onChange:a=>{t.setColorScheme(a)}}),t.colorSchemeLock?(0,e.jsxs)(s,{warn:!0,children:["No effect now. ",t.colorSchemeLock.why]}):null]})]}),(0,e.jsx)(o.DialogActions,{children:(0,e.jsx)(o.Button,{variant:"contained",color:"primary",onClick:h,children:"Close"})})]})}),Q=P;export{Q as a};
2
+ //# sourceMappingURL=chunk-JC7I7V6M.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-K5SIJGAE.js", "../../src/GraphGenomeView/components/GraphSettingsDialog.tsx"],
4
+ "sourcesContent": ["// src/layoutQualities.ts\nvar LAYOUT_QUALITIES = [\n { value: 0, label: \"Fastest\" },\n { value: 1, label: \"Fast\" },\n { value: 2, label: \"Default\" },\n { value: 3, label: \"Fine\" },\n { value: 4, label: \"Best\" }\n];\n\nexport {\n LAYOUT_QUALITIES\n};\n", "import type { ReactNode } from 'react'\n\nimport { BUBBLE_SPREADS } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { COLOR_SCHEMES } from '@jbrowse/bandage-core/colorSchemes'\nimport { LAYOUT_ENGINES } from '@jbrowse/bandage-core/layoutEngines'\nimport { LAYOUT_QUALITIES } from '@jbrowse/bandage-core/layoutQualities'\nimport { NODE_WIDTHS } from '@jbrowse/bandage-core/nodeWidths'\nimport { MAX_PATH_COLORS } from '@jbrowse/bandage-core/pathColors'\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n FormControl,\n FormControlLabel,\n FormLabel,\n InputLabel,\n MenuItem,\n Radio,\n RadioGroup,\n Select,\n Switch,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport type { GraphPaneModel } from '../model'\nimport type { SxProps } from '@mui/material'\n\nconst useStyles = makeStyles()({\n section: {\n marginBottom: 24,\n },\n formControl: {\n minWidth: 200,\n },\n})\n\nfunction Caption({\n warn = false,\n children,\n}: {\n warn?: boolean\n children: ReactNode\n}) {\n return (\n <Typography\n variant=\"caption\"\n color={warn ? 'warning.main' : 'text.secondary'}\n >\n {children}\n </Typography>\n )\n}\n\n// Layout quality and bubble spread are the engine's inputs, and an anchored\n// layout places a node from its coordinates without reaching it. Left enabled\n// so the force layout can be set up before switching to it.\nconst EngineOnly = observer(function EngineOnly({\n model,\n}: {\n model: GraphPaneModel\n}) {\n return model.hasGraph && !model.usesLayoutEngine ? (\n <Caption warn>\n No effect on this layout: only the force-directed layout is drawn by the\n engine that reads this.\n </Caption>\n ) : null\n})\n\nfunction SettingSwitch({\n label,\n checked,\n onChange,\n children,\n}: {\n label: string\n checked: boolean\n onChange: (checked: boolean) => void\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <FormControlLabel\n control={\n <Switch\n checked={checked}\n onChange={e => {\n onChange(e.target.checked)\n }}\n />\n }\n label={label}\n />\n {children}\n </div>\n )\n}\n\n// One dropdown setting; an option's description is its tooltip\nfunction SettingSelect<T extends string>({\n label,\n value,\n options,\n testId,\n sx,\n onChange,\n}: {\n label: string\n value: T\n options: readonly { value: T; label: string; description?: string }[]\n testId?: string\n sx?: SxProps\n onChange: (value: T) => void\n}) {\n const { classes } = useStyles()\n return (\n <FormControl className={classes.formControl} sx={sx}>\n <InputLabel>{label}</InputLabel>\n <Select\n value={value}\n label={label}\n data-testid={testId}\n onChange={e => {\n onChange(e.target.value as T)\n }}\n >\n {options.map(({ value, label, description }) => (\n <MenuItem key={value} value={value}>\n {description ? (\n <Tooltip title={description} placement=\"right\">\n <span>{label}</span>\n </Tooltip>\n ) : (\n label\n )}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n}\n\nconst trackOptions = (tracks: { trackId: string; name: string }[]) =>\n tracks.map(({ trackId, name }) => ({ value: trackId, label: name }))\n\n// `children` is the host's own section, between node width and colour\nconst GraphSettingsDialog = observer(function GraphSettingsDialog(props: {\n model: GraphPaneModel\n open: boolean\n onClose: () => void\n children?: ReactNode\n}) {\n const { model, open, onClose, children } = props\n const { classes } = useStyles()\n\n return (\n <Dialog open={open} onClose={onClose} title=\"Graph settings\">\n <DialogContent>\n <div className={classes.section}>\n <SettingSelect\n label=\"Engine\"\n value={model.layoutEngine}\n options={LAYOUT_ENGINES}\n testId=\"graph-layout-engine-select\"\n onChange={engine => {\n model.setLayoutEngine(engine)\n void model.recomputeLayout()\n }}\n />\n <Caption>\n Which engine draws the force-directed layout. Stress reads distances\n along the graph as distances on the page, so the reference draws\n straight; it is experimental, and slower than FMMM on large cuts.\n </Caption>\n <EngineOnly model={model} />\n </div>\n\n <div className={classes.section}>\n <FormControl fullWidth>\n <FormLabel component=\"legend\">Layout quality</FormLabel>\n <RadioGroup\n value={model.layoutQuality}\n onChange={e => {\n model.setLayoutQuality(parseInt(e.target.value))\n void model.recomputeLayout()\n }}\n >\n {LAYOUT_QUALITIES.map(q => (\n <FormControlLabel\n key={q.value}\n value={q.value}\n control={<Radio />}\n label={q.label}\n />\n ))}\n </RadioGroup>\n <Caption>\n The engine&apos;s iteration budget; for FMMM the same scale\n Bandage exposes. Higher is slower: on a thousand-node cut the top\n setting is seconds rather than tenths.\n </Caption>\n <EngineOnly model={model} />\n </FormControl>\n </div>\n\n <SettingSwitch\n label=\"Draw paths\"\n checked={model.drawPaths}\n onChange={draw => {\n model.setDrawPaths(draw)\n }}\n >\n <Caption>\n Color each node and connector by the paths through it, one lane per\n path in legend order, so a path that skips a node leaves its lane\n empty\n </Caption>\n {model.drawPaths && !model.effectiveDrawPaths ? (\n <Caption warn>\n {model.pathCount > MAX_PATH_COLORS\n ? `Off: ${model.pathCount.toLocaleString()} paths is past the ${MAX_PATH_COLORS} this can tell apart`\n : 'Off: this graph states no paths'}\n </Caption>\n ) : null}\n </SettingSwitch>\n\n <SettingSwitch\n label=\"Mark bubbles\"\n checked={model.showBubbles}\n onChange={show => {\n model.setShowBubbles(show)\n }}\n >\n <Caption>\n A halo along the nodes of each bubble, labelled by what it is, with\n the label opening the bubble on its own\n </Caption>\n </SettingSwitch>\n\n <SettingSwitch\n label=\"Genes on the backbone\"\n checked={model.showGenes}\n onChange={show => {\n model.setShowGenes(show)\n }}\n >\n <Caption>\n Exons along the reference nodes that carry them and each gene's name\n at its midpoint, from the assembly's annotation track\n </Caption>\n {model.geneTrackChoices.length > 1 ? (\n <SettingSelect\n label=\"Gene track\"\n value={model.geneTrack?.trackId ?? ''}\n options={trackOptions(model.geneTrackChoices)}\n testId=\"graph-gene-track-select\"\n sx={{ mt: 1 }}\n onChange={trackId => {\n model.setGeneTrackId(trackId)\n void model.reloadGenes()\n }}\n />\n ) : null}\n {model.repeatTrackChoices.length > 1 ? (\n <SettingSelect\n label=\"Repeat track\"\n value={model.repeatTrack?.trackId ?? ''}\n options={trackOptions(model.repeatTrackChoices)}\n testId=\"graph-repeat-track-select\"\n sx={{ mt: 1 }}\n onChange={trackId => {\n model.setRepeatTrackId(trackId)\n void model.reloadRepeats()\n }}\n />\n ) : null}\n </SettingSwitch>\n\n {model.anchorPaths.length > 1 ? (\n <div className={classes.section}>\n <SettingSelect\n label=\"Reference path\"\n value={model.activeReferencePath ?? ''}\n options={model.anchorPaths.map(({ name }) => ({\n value: name,\n label: name,\n }))}\n testId=\"graph-reference-path-select\"\n onChange={name => {\n model.setReferencePath(name)\n void model.recomputeLayout()\n }}\n />\n <Caption>\n Which path the anchored layouts draw x against. A GFA with no rGFA\n tags states its coordinates only in its paths, and marks none of\n them as the reference.\n </Caption>\n </div>\n ) : null}\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Bubble spread\"\n value={model.bubbleSpread}\n options={BUBBLE_SPREADS}\n testId=\"graph-bubble-spread-select\"\n onChange={spread => {\n model.setBubbleSpread(spread)\n void model.recomputeLayout()\n }}\n />\n <Caption>\n How far the force layout opens a bubble. A pangenome allele is a few\n bp, so at Bandage&apos;s own scale both arms land inside one node\n thickness and the graph draws as a rope.\n </Caption>\n <EngineOnly model={model} />\n </div>\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Node width\"\n value={model.nodeWidth}\n options={NODE_WIDTHS}\n testId=\"graph-node-width-select\"\n onChange={width => {\n model.setNodeWidth(width)\n }}\n />\n <Caption>\n Bandage&apos;s depth as width. In a cut with walks, depth is how\n many haplotypes carry the node.\n </Caption>\n </div>\n\n {children}\n\n <div className={classes.section}>\n <SettingSelect\n label=\"Color scheme\"\n value={model.chosenColorScheme}\n options={COLOR_SCHEMES}\n onChange={scheme => {\n model.setColorScheme(scheme)\n }}\n />\n {model.colorSchemeLock ? (\n <Caption warn>No effect now. {model.colorSchemeLock.why}</Caption>\n ) : null}\n </div>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default GraphSettingsDialog\n"],
5
+ "mappings": "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",
6
+ "names": ["LAYOUT_QUALITIES", "import_ui", "import_material", "import_mobx_react", "import_mui", "import_jsx_runtime", "useStyles", "Caption", "warn", "children", "EngineOnly", "model", "SettingSwitch", "label", "checked", "onChange", "classes", "e", "SettingSelect", "value", "options", "testId", "sx", "description", "trackOptions", "tracks", "trackId", "name", "GraphSettingsDialog", "props", "open", "onClose", "LAYOUT_ENGINES", "engine", "LAYOUT_QUALITIES", "q", "draw", "MAX_PATH_COLORS", "show", "BUBBLE_SPREADS", "spread", "NODE_WIDTHS", "width", "COLOR_SCHEMES", "scheme", "GraphSettingsDialog_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as At}from"./chunk-MYJYGSOH.js";import{a as Xt}from"./chunk-FY3BTKY4.js";var On=Xt((De,Jt)=>{Jt.exports=JBrowseExports["tss-react/mui"]});var ct="\0deletion:",tn=.5;function In(t,e,n=new Set){let o=new Map(e.map(a=>[a.edgeIndex,`${ct}${a.edgeIndex}`])),s=[];return t.edges.forEach((a,i)=>{let c=o.get(i);if(!n.has(i))if(c===void 0)s.push(a);else{let{fromStrand:l,toStrand:d}=a;s.push({from:a.from,to:c,...l?{fromStrand:l}:{}},{from:c,to:a.to,...d?{toStrand:d}:{}})}}),{graph:{...t,nodes:[...t.nodes,...[...o.values()].map(a=>({id:a,name:a,length:0,depth:0}))],edges:s},routes:o,ids:new Set(o.values())}}function Pn(t,e,n,o,s){let a=new Map(t.nodes.map(i=>[i.id,i.length]));return e.map(i=>{let c=i.bypassed.reduce((h,r)=>h+(a.get(r)??0),0),l=Math.max(s.minimumNodeLength,o(c)*tn),d=n.get(i.edgeIndex);return{id:d,name:d,length:Math.round(l*1e6/s.nodeLengthPerMegabase),depth:0}})}function _n(t,e){let n={...t},o={};for(let[s,a]of e){let i=n[a];delete n[a],i?.length&&(o[s]=i)}return{nodePositions:n,deletionRoutes:o}}var lt=12,gt=15,tt=gt*.7,Lt=25*Math.PI/180,nn=.25,en=150,on=[0,-.35,.35,-.7,.7],ht=[0,1];function Et(t){return t?0:1}function rt(t,e){let n=e.x-t.x,o=e.y-t.y,s=Math.hypot(n,o)||1;return{x:n/s,y:o/s}}function dt(t,e,n){return{x:t.x+(e.x-t.x)*n,y:t.y+(e.y-t.y)*n}}function Pt(t){let e=0,n=0;for(let o of t)e+=o.x,n+=o.y;return{x:e/t.length,y:n/t.length}}function _t(t){let e=new Float64Array(t.length);for(let n=1;n<t.length;n++)e[n]=e[n-1]+Math.hypot(t[n].x-t[n-1].x,t[n].y-t[n-1].y);return e}function Tt(t){return _t(t)[t.length-1]??0}function sn(t){let e=1e-6,n=2*Math.PI-1e-6;for(let o=0;o<60;o++){let s=(e+n)/2;s/(2*Math.sin(s/2))<t?e=s:n=s}return(e+n)/2}function rn(t,e){if(t<1e-9)return Math.PI*e;let n=(t*t/4+e*e)/(2*e),o=2*Math.asin(Math.min(1,t/(2*n)));return n*(e>n?2*Math.PI-o:o)}function ft(t,e,n,o){let s=e-2*n,a=t<1e-9?2*Math.PI:sn(s/t),i=s/a,c=Math.cos(a/2),l=t/2,d=o+n-i*c;return{at:h=>{if(h<=n)return{u:0,v:o+h};if(h>=e-n)return{u:t,v:o+e-h};let r=(h-n)/i-a/2;return{u:l+i*Math.sin(r),v:d+i*Math.cos(r)}},apex:o+n+i*(1-c),length:e}}function an(t,e,n){if(!n)return t;let o=Math.cos(n),s=Math.sin(n);return{...t,at:a=>{let{u:i,v:c}=t.at(a),l=i-e/2;return{u:e/2+l*o-c*s,v:l*s+c*o}}}}function St(t,e,n,o,s){return{at:a=>({u:t+n*a,v:e+o*a}),apex:e+Math.max(0,o)*s,length:s}}var ut=class{constructor(t,e,n=!1){this.pts=t,this.normals=e,this.straight=n,this.arc=_t(t),this.total=this.arc[t.length-1]??0}segment(t){let{arc:e}=this,n=1,o=e.length-1;for(;n<o;){let s=n+o>>1;e[s]<t?n=s+1:o=s}return n}fraction(t,e){let n=this.arc[t]-this.arc[t-1];return n>0?(e-this.arc[t-1])/n:0}pointAt(t){let{pts:e}=this,n=e.length-1;if(n===0)return{...e[0]};if(t<=0){let s=rt(e[0],e[1]);return{x:e[0].x+s.x*t,y:e[0].y+s.y*t}}if(t>=this.total){let s=rt(e[n-1],e[n]),a=t-this.total;return{x:e[n].x+s.x*a,y:e[n].y+s.y*a}}let o=this.segment(t);return dt(e[o-1],e[o],this.fraction(o,t))}normalAt(t){let{normals:e}=this;if(e.length===1||t<=0)return e[0];if(t>=this.total)return e[e.length-1];let n=this.segment(t),{x:o,y:s}=dt(e[n-1],e[n],this.fraction(n,t)),a=Math.hypot(o,s)||1;return{x:o/a,y:s/a}}};function cn(t,e){let n=Pt(t);return t.map((o,s)=>{let a=rt(t[Math.max(0,s-1)],t[Math.min(t.length-1,s+1)]),i={x:-a.y,y:a.x},c=o.x-n.x,l=o.y-n.y,d=Math.hypot(c,l),h=i.x*c+i.y*l,r=e[s],f=d>1e-9&&Math.abs(h)>.3*d?Math.sign(h):Math.sign(i.x*r.x+i.y*r.y)||1;return{x:i.x*f,y:i.y*f}})}function mt(t,e,n,o){let s=Math.min(5,Math.max(o.length/24,.5)),a=[],i=[];for(let c=0;c<=o.length+1e-9;c+=s){let{u:l,v:d}=o.at(Math.min(c,o.length)),h=t.pointAt(e+l),r=t.normalAt(e+l),f=r.x*n,g=r.y*n;a.push({x:h.x+f*d,y:h.y+g*d}),i.push({x:f,y:g})}return{pts:a,refs:i}}function pt(t,e,n,o,s){let a=s,i=mt(t,e,n,o(a));if(t.straight)return i;for(let c=0;c<2;c++){let l=Tt(i.pts);if(!(l>0))break;a*=s/l,i=mt(t,e,n,o(a))}return i}function st(t,e){return Array.from({length:e},(n,o)=>t+o*gt/2)}function kt(t){if(t.length===0)return 1/0;let e=1/0,n=-1/0;for(let o of t)e=Math.min(e,o.point.x),n=Math.max(n,o.point.x);return n-e}function Ot(t,e){return t*73856093^e*19349663}var It=class{constructor(t){this.c=t,this.grid=new Map;let{ids:e,first:n,count:o,per:s,seedX:a,seedY:i,backbone:c}=t,l=e.length;this.points=Array.from({length:l},()=>{}),this.params=Array.from({length:l},()=>{}),this.curves=Array.from({length:l},()=>{}),this.links=t.links.map((r,f)=>r.map(g=>g.filter(([E])=>E!==f))),this.route=e.map(r=>r.startsWith(ct));let d=1/0,h=-1/0;for(let r=0;r<l;r++){let f=n[r];!c[f]||Number.isNaN(a[f])||(d=Math.min(d,a[f]),h=Math.max(h,a[f]+s[r]*(o[r]-1)))}this.backbone=new ut([{x:d,y:0},{x:h,y:0}],[{x:0,y:1},{x:0,y:1}],!0),this.backboneCentroid={x:(d+h)/2,y:0};for(let r=0;r<l;r++){let f=n[r];if(!c[f]||Number.isNaN(a[f]))continue;let g=[],E=[];for(let _=0;_<o[r];_++){let B=a[f]+_*s[r];g.push({x:B,y:i[f]}),E.push(B-d)}this.points[r]=g,this.params[r]=E,this.curves[r]=this.backbone,this.occupy(g,this.backbone)}}static hasBackbone(t){for(let e=0;e<t.ids.length;e++){let n=t.first[e];if(t.backbone[n]&&!Number.isNaN(t.seedX[n]))return!0}return!1}run(){let t=[];for(let n=0;n<this.points.length;n++)this.points[n]||t.push(n);let e=this.componentsOf(t).map(n=>({members:n,anchors:this.anchorsOf(n)})).filter(n=>n.anchors.length).map(n=>({members:n.members,span:kt(n.anchors),drawn:n.members.reduce((o,s)=>o+this.drawn(s),0)})).sort((n,o)=>n.span-o.span||n.drawn-o.drawn);for(let n of e)this.placePiece(n.members,this.backboneCentroid)}write(t,e){let{first:n}=this.c;this.points.forEach((o,s)=>{o?.forEach((a,i)=>{t[n[s]+i]=a.x,e[n[s]+i]=a.y})})}drawn(t){return this.c.per[t]*(this.c.count[t]-1)}endIndex(t,e){return e?this.c.count[t]-1:0}occupy(t,e){for(let n of t){let o=Ot(Math.floor(n.x/tt),Math.floor(n.y/tt)),s=this.grid.get(o),a={x:n.x,y:n.y,curve:e};s?s.push(a):this.grid.set(o,[a])}}violations(t,e,n,o){let s=0;for(let a of t){if(n.some(l=>Math.hypot(a.x-l.x,a.y-l.y)<2*gt))continue;let i=Math.floor(a.x/tt),c=Math.floor(a.y/tt);for(let l=i-1;l<=i+1;l++)for(let d=c-1;d<=c+1;d++)for(let h of this.grid.get(Ot(l,d))??[])if(h.curve!==e&&Math.hypot(a.x-h.x,a.y-h.y)<tt&&(s++,s>=o))return s}return s}choose(t,e,n){let o,s=1/0;for(let a of t){let i=a(),c=this.violations(i.pts,e,n,s);if(c===0)return i;c<s&&(s=c,o=i)}return o}anchorsOf(t){let e=new Set(t),n=[];for(let o of t)for(let s of ht)for(let[a,i]of this.links[o][s]){let c=this.points[a];if(e.has(a)||!c)continue;let l=this.endIndex(a,i);n.push({u:o,uSide:s,v:a,vSide:i,point:c[l],curve:this.curves[a],t:this.params[a][l]})}return n}componentsOf(t){let e=new Set(t),n=new Set,o=[];for(let s of t){if(n.has(s))continue;let a=[s];n.add(s);for(let i of a)for(let c of ht)for(let[l]of this.links[i][c])e.has(l)&&!n.has(l)&&(n.add(l),a.push(l));o.push(a)}return o}spinePath(t,e,n,o,s){let a=new Set(t),i=(f,g)=>f*2+g,c=(f,g)=>f===o&&Et(g)===s,l=new Map([[i(e,n),-1]]),d=[[e,n]],h=[e,n];for(let[f,g]of d){if(h=[f,g],o!==void 0&&c(f,g))break;for(let[E,_]of this.links[f][Et(g)])!a.has(E)||l.has(i(E,_))||(l.set(i(E,_),i(f,g)),d.push([E,_]))}if(o!==void 0&&!c(h[0],h[1]))return;let r=[];for(let f=i(h[0],h[1]);f!==-1;f=l.get(f))r.push({k:f>>1,enter:f&1});return r.reverse()}loosePath(t,e,n){let o=new Set(t),s=new Map([[e,-1]]),a=new Map([[e,0]]),i=[e];for(let l of i){if(l===n)break;for(let d of ht)for(let[h,r]of this.links[l][d])!o.has(h)||s.has(h)||(s.set(h,l),a.set(h,r),i.push(h))}let c=[];for(let l=n;l!==-1;l=s.get(l))c.push({k:l,enter:a.get(l)});return c.reverse()}spineLength(t){let{link:e}=this.c;return t.reduce((n,{k:o})=>n+this.drawn(o)+e,e)}layAlong(t,e,n,o){let{count:s,per:a,link:i}=this.c,c=n,l=[];for(let{k:d,enter:h}of t){let r=o??a[d],f=[],g=[];for(let E=0;E<s[d];E++)f.push(e.pointAt(c+E*r)),g.push(c+E*r);h===1&&(f.reverse(),g.reverse()),this.points[d]=f,this.params[d]=g,this.curves[d]=e,l.push(...f),c+=r*(s[d]-1)+i}return l}arcCandidates(t,e,n,o,s){let a=(s-o)/2-1e-6,i=s>2*o?on:[0],c=[];for(let l of st(0,8))for(let d of i)for(let h=0;h<=16;h++){let r=a*h/16;h<16&&ft(o,s,r,l).apex<lt||c.push(()=>pt(t,e,n,f=>an(ft(o,f,Math.min(r,(f-o)/2-1e-6),l),o,d),s))}return c}placePiece(t,e){let{count:n,link:o}=this.c,s=this.anchorsOf(t);if(s.length===0)return;let a=t.every(m=>this.route[m]),i=s.every(m=>m.curve===s[0].curve)?s[0].curve:void 0,c,l,d,h;if(i)s.sort((m,v)=>m.t-v.t),c=i,l=s[0].t,d=s[s.length-1].t,h=c===this.backbone&&a?-1:1;else{s.sort((W,Y)=>W.point.x-Y.point.x||W.point.y-Y.point.y);let m=s[0].point,v=s[s.length-1].point,I=Math.hypot(v.x-m.x,v.y-m.y),k=I>1e-9?rt(m,v):{x:1,y:0},R={x:-k.y,y:k.x},V=dt(m,v,.5);h=s.some(W=>W.curve===this.backbone)?(a?-1:1)*(Math.sign(R.y)||1):(V.x-e.x)*R.x+(V.y-e.y)*R.y>=0?1:-1,c=new ut([m,v],[R,R],!0),l=0,d=I}let r=s[0],f=s[s.length-1],g=d-l,E=s.length===1||r.u===f.u&&r.uSide===f.uSide&&g<1e-9,_=[r.point,f.point],B=m=>this.choose(m,i,_),O,y,A=o,D;if(E){O=this.spinePath(t,r.u,r.uSide);let m=this.spineLength(O),v=r.vSide?Math.max(0,n[r.v]-2):Math.min(1,n[r.v]-1),k=(r.t>=this.params[r.v][v]?1:-1)*Math.cos(Lt),R=Math.sin(Lt);y=B(st(0,12).map(V=>()=>pt(c,l,h,W=>St(0,V,k,R,W),m)))}else{O=this.spinePath(t,r.u,r.uSide,f.u,f.uSide)??this.loosePath(t,r.u,f.u);let m=this.spineLength(O);if(a){let v=Math.max(lt,Math.min(nn*g,en));y=B(st(v,12).map(k=>()=>mt(c,l,h,ft(g,rn(g,k),0,0))));let I=Tt(y.pts);D=Math.max(.001,(I-2*o)/(n[O[0].k]-1))}else if(m>g+1e-6)y=B(this.arcCandidates(c,l,h,g,m));else{let v=m-2*o;y=B(st(lt,12).map(I=>()=>pt(c,l,h,k=>St(g/2-k/2,I,1,0,k),v))),A=0}}let T=new ut(y.pts,cn(y.pts,y.refs)),q=this.layAlong(O,T,A,D);this.occupy(q,T);let H=Pt(q),M=t.filter(m=>!this.points[m]),N=this.componentsOf(M).map(m=>({members:m,span:kt(this.anchorsOf(m))})).sort((m,v)=>m.span-v.span);for(let m of N)this.placePiece(m.members,H)}};function Rt(t){let e=new Float64Array(t.n).fill(NaN),n=new Float64Array(t.n).fill(NaN);if(It.hasBackbone(t)){let o=new It(t);o.run(),o.write(e,n)}return{X:e,Y:n}}var ln=[{walks:2,iterations:15},{walks:4,iterations:30},{walks:8,iterations:60},{walks:12,iterations:90},{walks:16,iterations:120}],hn=20,fn=3,yt=.3,un=2,pn=200,dn=.1,mn=.5;function Ut(t,e){let n=e.at(-1);return(t==="+"||t==="-")&&(n==="+"||n==="-")&&t!==n}function gn(t){let e=Math.imul(t,2654435761)>>>0||1;return()=>(e^=e<<13,e>>>=0,e^=e>>>17,e^=e<<5,e>>>=0,e/4294967296)}function $(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function yn(t){let{nodes:e,edges:n}=t.graph,o=t.options,s=$(o.nodeLengthPerMegabase,1e3),a=$(o.minimumNodeLength,1),i=$(o.nodeSegmentLength,1),c=$(o.edgeLength,1),l=e.map(M=>M.id),d=new Int32Array(e.length),h=new Int32Array(e.length),r=new Float64Array(e.length),f=0;e.forEach((M,N)=>{let m=Math.max(s*M.length/1e6,a),v=Math.max(1,Math.ceil(m/i));d[N]=f,h[N]=v+1,r[N]=m/v,f+=v+1});let g=new Int32Array(f),E=new Int32Array(f),_=new Float64Array(f).fill(NaN),B=new Float64Array(f).fill(NaN),O=new Uint8Array(f),y=Array.from({length:f},()=>[]);e.forEach((M,N)=>{let m=typeof M.x=="number"&&typeof M.y=="number",v=At(M)?1:0;for(let I=0;I<h[N];I++){let k=d[N]+I;g[k]=N,E[k]=I,O[k]=v,m&&(_[k]=M.x+I*r[N],B[k]=M.y),I>0&&(y[k-1].push([k,r[N]]),y[k].push([k-1,r[N]]))}});let A=new Map(l.map((M,N)=>[M,N])),D=e.map(()=>[[],[]]);for(let M of n){let N=A.get(M.from),m=A.get(M.to);if(N===void 0||m===void 0||N===m&&h[N]<=2)continue;let v=Ut(M.fromStrand,M.from)?0:1,I=Ut(M.toStrand,M.to)?1:0,k=d[N]+(v?h[N]-1:0),R=d[m]+(I?h[m]-1:0);y[k].push([R,c]),y[R].push([k,c]),D[N][v].push([m,I]),D[m][I].push([N,v])}let T=new Int32Array(f+1);for(let M=0;M<f;M++)T[M+1]=T[M]+y[M].length;let q=new Int32Array(T[f]),H=new Float64Array(T[f]);for(let M=0;M<f;M++)y[M].forEach(([N,m],v)=>{q[T[M]+v]=N,H[T[M]+v]=m});return{ids:l,first:d,count:h,per:r,links:D,chainOf:g,indexOf:E,seedX:_,seedY:B,backbone:O,off:T,nb:q,wt:H,n:f,link:c}}function xn(t){let{n:e,off:n,nb:o}=t,s=new Int32Array(e).fill(-1),a=[];for(let i=0;i<e;i++){if(s[i]>=0)continue;let c=[i];s[i]=a.length;for(let l of c)for(let d=n[l];d<n[l+1];d++){let h=o[d];s[h]<0&&(s[h]=a.length,c.push(h))}a.push(c)}return{comp:s,members:a}}function Bt(t,e={}){let n=yn(t),{n:o,off:s,nb:a,wt:i,seedX:c,seedY:l,backbone:d,first:h,count:r,per:f,link:g}=n,E=t.options,_=ln[Math.max(0,Math.min(4,$(e.quality??E.quality,2)))],B=$(e.componentSeparation??E.componentSeparation,15),O=gn($(e.seed??E.seed,1)),y=new Float64Array(o),A=new Float64Array(o),D={};if(o===0)return{nodePositions:D};let{comp:T,members:q}=xn(n),H=1/0,M=0;for(let u=0;u<a.length;u++)H=Math.min(H,i[u]),M+=i[u];M/=2;let N=!1;for(let u=0;u<o;u++)if(!Number.isNaN(c[u])){N=!0;break}let m=N?Rt(n):void 0,v=Math.sqrt(o)*20;for(let u=0;u<o;u++)m&&!Number.isNaN(m.X[u])?(y[u]=m.X[u],A[u]=m.Y[u]):N&&!Number.isNaN(c[u])?(y[u]=c[u]+O()-.5,A[u]=l[u]+O()-.5):(y[u]=O()*v,A[u]=O()*v);let I=q.map(u=>Int32Array.from(u.filter(x=>d[x]&&!Number.isNaN(c[x])).sort((x,p)=>c[x]-c[p]))),k=I.map(u=>Float64Array.from(u,x=>c[x])),R=0;for(let u of k)u.length&&(R=Math.max(R,u[u.length-1]-u[0]));let V=Math.max(R,M/4,H*10),W=V*V,Y=dn*H*H,{walks:$t,iterations:it}=_,zt=Math.log(W/Y)/Math.max(1,it-1),et=Math.log(H),vt=Math.log(V),wt=(u,x,p,w)=>{let S=w/(p*p);S>1&&(S=1);let L=y[u]-y[x],b=A[u]-A[x],U=Math.sqrt(L*L+b*b)||1e-9,P=S*(U-p)/(2*U),C=P*L,F=P*b;y[u]=y[u]-C,A[u]=A[u]-F,y[x]=y[x]+C,A[x]=A[x]+F},X=0,Qt=(u,x)=>{let p=n.chainOf[u],w=n.indexOf[u],S=O()<.5?-1:1,L=x;for(let b=0;b<pn;b++){let U=r[p],P=f[p],C=(S>0?U-1-w:w)*P;if(L<=C){let J=Math.round(L/P);return X=x-L+J*P,h[p]+w+S*J}L-=C;let F=n.links[p][S>0?1:0];if(F.length===0)return X=x-L,h[p]+(S>0?U-1:0);let[G,j]=F[Math.floor(O()*F.length)];if(L-=g,p=G,S=j===0?1:-1,w=j===0?0:r[G]-1,L<=0)return X=x-L,h[p]+w}return-1},Nt=(u,x)=>{let p=I[T[u]];if(!d[u]||p.length<2||Number.isNaN(c[u]))return;let w=k[T[u]],S=c[u]+Math.exp(et+O()*(vt-et))*(O()<.5?-1:1),L=0,b=w.length;for(;L<b;){let G=L+b>>1;w[G]<S?L=G+1:b=G}let U=p[Math.min(L,p.length-1)],P=c[U]-c[u];if(U===u||P===0)return;let C=x/(P*P);C>1&&(C=1);let F=C*(y[U]-y[u]-P)/2;y[u]=y[u]+F,y[U]=y[U]-F},bt=(u,x)=>{for(let p=s[u];p<s[u+1];p++){let w=a[p];w>u&&wt(u,w,i[p],x)}},z=new Int32Array(o);for(let u=0;u<o;u++)z[u]=u;let Zt=N?Math.floor(mn*it):0;for(let u=Zt;u<it;u++){let x=W*Math.exp(-zt*u);for(let p=o-1;p>0;p--){let w=Math.floor(O()*(p+1)),S=z[p];z[p]=z[w],z[w]=S}for(let p=0;p<o;p++){let w=z[p];bt(w,x);for(let S=0;S<$t;S++){let L=Math.exp(et+O()*(vt-et)),b=Qt(w,L);b>=0&&b!==w&&X>0&&wt(w,b,X,x)}Nt(w,x)}}let K=fn*g,Yt=(u,x)=>Math.floor(u/K)*73856093^Math.floor(x/K)*19349663;for(let u=0;u<hn;u++){let x=new Map;for(let p=0;p<o;p++){let w=Yt(y[p],A[p]),S=x.get(w);S?S.push(p):x.set(w,[p])}for(let p=0;p<o;p++){let w=Math.floor(y[p]/K),S=Math.floor(A[p]/K);for(let L=w-1;L<=w+1;L++)for(let b=S-1;b<=S+1;b++){let U=x.get(L*73856093^b*19349663);if(U)for(let P of U){if(P<=p)continue;let C=!1;for(let Q=s[p];Q<s[p+1];Q++)if(a[Q]===P){C=!0;break}if(C)continue;let F=y[p]-y[P],G=A[p]-A[P],j=Math.sqrt(F*F+G*G);if(j>=K)continue;let J,ot;if(j>1e-6){let Q=yt*(K-j)/(2*j);J=Q*F,ot=Q*G}else J=yt*K*(O()-.5),ot=yt*K*(O()-.5);y[p]=y[p]+J,A[p]=A[p]+ot,y[P]=y[P]-J,A[P]=A[P]-ot}}}for(let p=0;p<o;p++)bt(p,1/0),Nt(p,Y*4)}for(let u=0;u<r.length;u++){let x=h[u],p=r[u];if(!(p<3)){for(let w=0;w<un;w++){let S=y.slice(x,x+p),L=A.slice(x,x+p);for(let b=1;b+1<p;b++)y[x+b]=.5*S[b]+.25*(S[b-1]+S[b+1]),A[x+b]=.5*L[b]+.25*(L[b-1]+L[b+1])}Mn(y,A,x,p,f[u])}}vn(T,q,y,A,N,B);for(let u=0;u<n.ids.length;u++){let x=[];for(let p=0;p<r[u];p++)x.push({x:y[h[u]+p],y:A[h[u]+p]});D[n.ids[u]]=x}return{nodePositions:D}}function Mn(t,e,n,o,s){let a=new Float64Array(o);for(let r=1;r<o;r++)a[r]=a[r-1]+Math.hypot(t[n+r]-t[n+r-1],e[n+r]-e[n+r-1]);if(!a[o-1])return;let i=s*(o-1)-a[o-1];if(i>0){Ft(t,e,n,n+1,i/2),Ft(t,e,n+o-1,n+o-2,i/2);for(let r=1;r<o;r++)a[r]=a[r-1]+Math.hypot(t[n+r]-t[n+r-1],e[n+r]-e[n+r-1])}let c=a[o-1],l=t.slice(n,n+o),d=e.slice(n,n+o),h=1;for(let r=1;r+1<o;r++){let f=c*r/(o-1);for(;h<o-1&&a[h]<f;)h++;let g=a[h]-a[h-1],E=g>0?(f-a[h-1])/g:0;t[n+r]=l[h-1]+(l[h]-l[h-1])*E,e[n+r]=d[h-1]+(d[h]-d[h-1])*E}}function Ft(t,e,n,o,s){let a=t[n]-t[o],i=e[n]-e[o],c=Math.hypot(a,i);c>0&&(t[n]=t[n]+a/c*s,e[n]=e[n]+i/c*s)}function vn(t,e,n,o,s,a){if(!s)for(let r of e)wn(n,o,r);if(e.length<2)return;let i=new Float64Array(e.length).fill(1/0),c=new Float64Array(e.length).fill(1/0),l=new Float64Array(e.length).fill(-1/0);for(let r=0;r<n.length;r++){let f=t[r];i[f]=Math.min(i[f],n[r]),c[f]=Math.min(c[f],o[r]),l[f]=Math.max(l[f],o[r])}let d=new Float64Array(e.length),h=0;for(let r=0;r<e.length;r++)d[r]=h-c[r],h+=l[r]-c[r]+a;for(let r=0;r<n.length;r++){let f=t[r];n[r]=n[r]-i[f],o[r]=o[r]+d[f]}}function wn(t,e,n){if(n.length<3)return;let o=0,s=0;for(let r of n)o+=t[r],s+=e[r];o/=n.length,s/=n.length;let a=0,i=0,c=0;for(let r of n){let f=t[r]-o,g=e[r]-s;a+=f*f,i+=g*g,c+=f*g}let l=-.5*Math.atan2(2*c,a-i),d=Math.cos(l),h=Math.sin(l);for(let r of n){let f=t[r]-o,g=e[r]-s;t[r]=o+d*f-h*g,e[r]=s+h*f+d*g}}var xt;function Ct(){return xt??=import("./bandage-layout-3AR6BCUD-PYYNJEGI.js").then(t=>t.default()).catch(t=>{throw xt=void 0,t}),xt}var Ht=[{value:"fmmm",label:"Bandage (FMMM)",description:"Bandage's force-directed layout: OGDF's fast multipole multilevel method, compiled to wasm."},{value:"stress",label:"Stress (experimental)",description:"Stress layout by stochastic gradient descent in plain JS: distances along the graph become distances on the page, so the reference reads straight and a repeat loop reads as a ring."}],Nn=Ht.map(t=>t.value);var bn=async t=>{if(t.options.engine==="stress"){let s=performance.now();return{result:Bt(t),duration:performance.now()-s}}let e=await Ct(),n=performance.now();return{result:e.computeLayout(t.graph,t.options),duration:performance.now()-n}};var Dt=[{value:"auto",label:"Auto"},{value:"uniform",label:"Uniform"},{value:"random",label:"Random"},{value:"rainbow",label:"Rainbow"},{value:"depth",label:"Depth"},{value:"node-length",label:"Node length"},{value:"stable-rank",label:"Stable rank"},{value:"reference-position",label:"Reference position"},{value:"grey",label:"Grey"}],An=Dt.map(t=>t.value);function Ln(t,e){return t!=="auto"?t:e?.anchoredBy?"reference-position":"uniform"}var nt=40,Wt=500,at=5;function En(t,e){return Math.max(t.nodeLengthPerMegabase*e/1e6,t.minimumNodeLength)}function qt(t,e=at){let o=t.nodes.reduce((a,i)=>a+i.length,0)/1e6,s=Math.max(t.nodes.length*nt,Wt);return{nodeLengthPerMegabase:o>0?s/o:1e4,minimumNodeLength:Math.max(at,e),edgeLength:5,nodeSegmentLength:20}}var Z={power:1,effect:1};function Vt(t){return t.power===1&&t.effect===1}function Kt(t,e){let n=t.nodes.length,o=t.nodes.reduce((i,c)=>i+c.length,0),s=n>0?o/n:0,a=n>0?Math.max(n*nt,Wt)/n:nt;return i=>{if(s<=0)return a;let c=(i/s)**e.power;return Math.max(a*((c-1)*e.effect+1),at)}}var Gt=1e3,jt={law:Z,minNodeLength:0};function ee(t,e=jt){let{law:n,minNodeLength:o}=e,s=qt(t,o);if(Vt(n))return{nodes:t.nodes,opts:s};let a=Kt(t,n);return{nodes:t.nodes.map(i=>({...i,length:Math.round(a(i.length)*Gt)})),opts:{...s,nodeLengthPerMegabase:1e6/Gt,minimumNodeLength:at}}}function oe(t,e=jt){if(Vt(e.law)){let n=qt(t,e.minNodeLength);return o=>En(n,o)}return Kt(t,e.law)}var Mt=[{value:"auto",label:"Proportional",description:"Bandage's own scale: a node draws proportional to its length, so a 1 bp allele is a speck.",law:Z,minNodeFactor:0},{value:"open",label:"Open bubbles",description:"Give every allele a drawn length, so a bubble reads as two arms rather than a knot.",law:Z,minNodeFactor:2.5},{value:"wide",label:"Wide bubbles",description:"As open, spread further. Best on a window of a dozen bubbles.",law:Z,minNodeFactor:10},{value:"compress",label:"Compress lengths",description:"Pull the longest and shortest nodes towards the graph\u2019s mean, so a cut spanning kb and bp fits one pane.",law:{power:.5,effect:.5},minNodeFactor:0}],Sn=Mt.map(t=>t.value);function kn(t){let e=Mt.find(n=>n.value===t);return{law:e?.law??Z,minNodeLength:(e?.minNodeFactor??0)*nt}}export{In as a,Pn as b,_n as c,Ht as d,Nn as e,bn as f,Dt as g,An as h,Ln as i,En as j,ee as k,oe as l,Mt as m,Sn as n,kn as o,On as p};
2
+ //# sourceMappingURL=chunk-OTI5X5W7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["global-externals:tss-react/mui", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-JVLURPFW.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LYJ4US66.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-UNOE2NDN.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-7XHHVYG7.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-6EJIU6IA.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-JKJWSY4V.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-6JEWNXCQ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@8.0.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-UVBGRJQX.js"],
4
+ "sourcesContent": ["module.exports = JBrowseExports[\"tss-react/mui\"];", "// src/layout/deletionRoutes.ts\nvar ROUTE_ID = \"\\0deletion:\";\nvar ROUTE_FRACTION = 0.5;\nfunction withDeletionRoutes(graph, deletions, dropped = /* @__PURE__ */ new Set()) {\n const routes = new Map(\n deletions.map((d) => [d.edgeIndex, `${ROUTE_ID}${d.edgeIndex}`])\n );\n const edges = [];\n graph.edges.forEach((edge, ei) => {\n const id = routes.get(ei);\n if (dropped.has(ei)) {\n return;\n }\n if (id === void 0) {\n edges.push(edge);\n } else {\n const { fromStrand, toStrand } = edge;\n edges.push(\n { from: edge.from, to: id, ...fromStrand ? { fromStrand } : {} },\n { from: id, to: edge.to, ...toStrand ? { toStrand } : {} }\n );\n }\n });\n return {\n graph: {\n ...graph,\n nodes: [\n ...graph.nodes,\n ...[...routes.values()].map((id) => ({\n id,\n name: id,\n length: 0,\n depth: 0\n }))\n ],\n edges\n },\n routes,\n ids: new Set(routes.values())\n };\n}\nfunction routeNodes(graph, deletions, routes, drawnOf, opts) {\n const lengths = new Map(graph.nodes.map((n) => [n.id, n.length]));\n return deletions.map((d) => {\n const skipped = d.bypassed.reduce(\n (sum, id2) => sum + (lengths.get(id2) ?? 0),\n 0\n );\n const drawn = Math.max(\n opts.minimumNodeLength,\n drawnOf(skipped) * ROUTE_FRACTION\n );\n const id = routes.get(d.edgeIndex);\n return {\n id,\n name: id,\n length: Math.round(drawn * 1e6 / opts.nodeLengthPerMegabase),\n depth: 0\n };\n });\n}\nfunction takeRoutes(positions, routes) {\n const nodePositions = { ...positions };\n const deletionRoutes = {};\n for (const [edgeIndex, id] of routes) {\n const route = nodePositions[id];\n delete nodePositions[id];\n if (route?.length) {\n deletionRoutes[edgeIndex] = route;\n }\n }\n return { nodePositions, deletionRoutes };\n}\n\nexport {\n ROUTE_ID,\n withDeletionRoutes,\n routeNodes,\n takeRoutes\n};\n", "import {\n ROUTE_ID\n} from \"./chunk-JVLURPFW.js\";\n\n// src/layout/stressPlacement.ts\nvar MIN_DEPTH = 12;\nvar LANE_GAP = 15;\nvar CLEAR = LANE_GAP * 0.7;\nvar TIP_ANGLE = 25 * Math.PI / 180;\nvar ROUTE_BOW = 0.25;\nvar ROUTE_CAP = 150;\nvar TEARDROP_TILTS = [0, -0.35, 0.35, -0.7, 0.7];\nvar SIDES = [0, 1];\nfunction other(side) {\n return side ? 0 : 1;\n}\nfunction unit(a, b) {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const m = Math.hypot(dx, dy) || 1;\n return { x: dx / m, y: dy / m };\n}\nfunction lerp(a, b, f) {\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n}\nfunction centroidOf(pts) {\n let x = 0;\n let y = 0;\n for (const p of pts) {\n x += p.x;\n y += p.y;\n }\n return { x: x / pts.length, y: y / pts.length };\n}\nfunction arcLengths(pts) {\n const arc = new Float64Array(pts.length);\n for (let i = 1; i < pts.length; i++) {\n arc[i] = arc[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y);\n }\n return arc;\n}\nfunction polylineLength(pts) {\n return arcLengths(pts)[pts.length - 1] ?? 0;\n}\nfunction arcAngle(ratio) {\n let lo = 1e-6;\n let hi = 2 * Math.PI - 1e-6;\n for (let i = 0; i < 60; i++) {\n const mid = (lo + hi) / 2;\n if (mid / (2 * Math.sin(mid / 2)) < ratio) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return (lo + hi) / 2;\n}\nfunction archLength(c, s) {\n if (c < 1e-9) {\n return Math.PI * s;\n }\n const R = (c * c / 4 + s * s) / (2 * s);\n const theta = 2 * Math.asin(Math.min(1, c / (2 * R)));\n return R * (s > R ? 2 * Math.PI - theta : theta);\n}\nfunction arcFlat(c, length, h, drop) {\n const arc = length - 2 * h;\n const theta = c < 1e-9 ? 2 * Math.PI : arcAngle(arc / c);\n const R = arc / theta;\n const cos = Math.cos(theta / 2);\n const cu = c / 2;\n const cv = drop + h - R * cos;\n return {\n at: (t) => {\n if (t <= h) {\n return { u: 0, v: drop + t };\n }\n if (t >= length - h) {\n return { u: c, v: drop + length - t };\n }\n const a = (t - h) / R - theta / 2;\n return { u: cu + R * Math.sin(a), v: cv + R * Math.cos(a) };\n },\n apex: drop + h + R * (1 - cos),\n length\n };\n}\nfunction tilted(flat, c, angle) {\n if (!angle) {\n return flat;\n }\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return {\n ...flat,\n at: (t) => {\n const { u, v } = flat.at(t);\n const du = u - c / 2;\n return { u: c / 2 + du * cos - v * sin, v: du * sin + v * cos };\n }\n };\n}\nfunction lineFlat(u0, v0, du, dv, length) {\n return {\n at: (t) => ({ u: u0 + du * t, v: v0 + dv * t }),\n apex: v0 + Math.max(0, dv) * length,\n length\n };\n}\nvar Curve = class {\n constructor(pts, normals, straight = false) {\n this.pts = pts;\n this.normals = normals;\n this.straight = straight;\n this.arc = arcLengths(pts);\n this.total = this.arc[pts.length - 1] ?? 0;\n }\n segment(t) {\n const { arc } = this;\n let lo = 1;\n let hi = arc.length - 1;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n if (arc[mid] < t) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return lo;\n }\n fraction(i, t) {\n const span = this.arc[i] - this.arc[i - 1];\n return span > 0 ? (t - this.arc[i - 1]) / span : 0;\n }\n pointAt(t) {\n const { pts } = this;\n const last = pts.length - 1;\n if (last === 0) {\n return { ...pts[0] };\n }\n if (t <= 0) {\n const d = unit(pts[0], pts[1]);\n return { x: pts[0].x + d.x * t, y: pts[0].y + d.y * t };\n }\n if (t >= this.total) {\n const d = unit(pts[last - 1], pts[last]);\n const r = t - this.total;\n return { x: pts[last].x + d.x * r, y: pts[last].y + d.y * r };\n }\n const i = this.segment(t);\n return lerp(pts[i - 1], pts[i], this.fraction(i, t));\n }\n normalAt(t) {\n const { normals } = this;\n if (normals.length === 1 || t <= 0) {\n return normals[0];\n }\n if (t >= this.total) {\n return normals[normals.length - 1];\n }\n const i = this.segment(t);\n const { x, y } = lerp(normals[i - 1], normals[i], this.fraction(i, t));\n const m = Math.hypot(x, y) || 1;\n return { x: x / m, y: y / m };\n }\n};\nfunction outwardNormals(pts, outRef) {\n const centroid = centroidOf(pts);\n return pts.map((p, i) => {\n const t = unit(\n pts[Math.max(0, i - 1)],\n pts[Math.min(pts.length - 1, i + 1)]\n );\n const n = { x: -t.y, y: t.x };\n const rx = p.x - centroid.x;\n const ry = p.y - centroid.y;\n const rm = Math.hypot(rx, ry);\n const dot = n.x * rx + n.y * ry;\n const ref = outRef[i];\n const sign = rm > 1e-9 && Math.abs(dot) > 0.3 * rm ? Math.sign(dot) : Math.sign(n.x * ref.x + n.y * ref.y) || 1;\n return { x: n.x * sign, y: n.y * sign };\n });\n}\nfunction mapFlat(frame, tA, sign, flat) {\n const ds = Math.min(5, Math.max(flat.length / 24, 0.5));\n const pts = [];\n const refs = [];\n for (let t = 0; t <= flat.length + 1e-9; t += ds) {\n const { u, v } = flat.at(Math.min(t, flat.length));\n const q = frame.pointAt(tA + u);\n const nr = frame.normalAt(tA + u);\n const ox = nr.x * sign;\n const oy = nr.y * sign;\n pts.push({ x: q.x + ox * v, y: q.y + oy * v });\n refs.push({ x: ox, y: oy });\n }\n return { pts, refs };\n}\nfunction fitted(frame, tA, sign, make, length) {\n let flatLength = length;\n let mapped = mapFlat(frame, tA, sign, make(flatLength));\n if (frame.straight) {\n return mapped;\n }\n for (let i = 0; i < 2; i++) {\n const got = polylineLength(mapped.pts);\n if (!(got > 0)) {\n break;\n }\n flatLength *= length / got;\n mapped = mapFlat(frame, tA, sign, make(flatLength));\n }\n return mapped;\n}\nfunction depths(from, n) {\n return Array.from({ length: n }, (_, i) => from + i * LANE_GAP / 2);\n}\nfunction spanOf(anchors) {\n if (anchors.length === 0) {\n return Infinity;\n }\n let lo = Infinity;\n let hi = -Infinity;\n for (const a of anchors) {\n lo = Math.min(lo, a.point.x);\n hi = Math.max(hi, a.point.x);\n }\n return hi - lo;\n}\nfunction cellKey(gx, gy) {\n return gx * 73856093 ^ gy * 19349663;\n}\nvar Placer = class {\n constructor(c) {\n this.c = c;\n this.grid = /* @__PURE__ */ new Map();\n const { ids, first, count, per, seedX, seedY, backbone } = c;\n const N = ids.length;\n this.points = Array.from({ length: N }, () => void 0);\n this.params = Array.from({ length: N }, () => void 0);\n this.curves = Array.from({ length: N }, () => void 0);\n this.links = c.links.map(\n (sides, k) => sides.map((out) => out.filter(([v]) => v !== k))\n );\n this.route = ids.map((id) => id.startsWith(ROUTE_ID));\n let min = Infinity;\n let max = -Infinity;\n for (let k = 0; k < N; k++) {\n const start = first[k];\n if (!backbone[start] || Number.isNaN(seedX[start])) {\n continue;\n }\n min = Math.min(min, seedX[start]);\n max = Math.max(max, seedX[start] + per[k] * (count[k] - 1));\n }\n this.backbone = new Curve(\n [\n { x: min, y: 0 },\n { x: max, y: 0 }\n ],\n [\n { x: 0, y: 1 },\n { x: 0, y: 1 }\n ],\n true\n );\n this.backboneCentroid = { x: (min + max) / 2, y: 0 };\n for (let k = 0; k < N; k++) {\n const start = first[k];\n if (!backbone[start] || Number.isNaN(seedX[start])) {\n continue;\n }\n const pts = [];\n const ts = [];\n for (let i = 0; i < count[k]; i++) {\n const x = seedX[start] + i * per[k];\n pts.push({ x, y: seedY[start] });\n ts.push(x - min);\n }\n this.points[k] = pts;\n this.params[k] = ts;\n this.curves[k] = this.backbone;\n this.occupy(pts, this.backbone);\n }\n }\n static hasBackbone(c) {\n for (let k = 0; k < c.ids.length; k++) {\n const start = c.first[k];\n if (c.backbone[start] && !Number.isNaN(c.seedX[start])) {\n return true;\n }\n }\n return false;\n }\n run() {\n const free = [];\n for (let k = 0; k < this.points.length; k++) {\n if (!this.points[k]) {\n free.push(k);\n }\n }\n const pieces = this.componentsOf(free).map((members) => ({ members, anchors: this.anchorsOf(members) })).filter((p) => p.anchors.length).map((p) => ({\n members: p.members,\n span: spanOf(p.anchors),\n drawn: p.members.reduce((s, k) => s + this.drawn(k), 0)\n })).sort((a, b) => a.span - b.span || a.drawn - b.drawn);\n for (const p of pieces) {\n this.placePiece(p.members, this.backboneCentroid);\n }\n }\n write(X, Y) {\n const { first } = this.c;\n this.points.forEach((pts, k) => {\n pts?.forEach((p, i) => {\n X[first[k] + i] = p.x;\n Y[first[k] + i] = p.y;\n });\n });\n }\n drawn(k) {\n return this.c.per[k] * (this.c.count[k] - 1);\n }\n endIndex(k, side) {\n return side ? this.c.count[k] - 1 : 0;\n }\n occupy(pts, curve) {\n for (const p of pts) {\n const key = cellKey(Math.floor(p.x / CLEAR), Math.floor(p.y / CLEAR));\n const list = this.grid.get(key);\n const occupant = { x: p.x, y: p.y, curve };\n if (list) {\n list.push(occupant);\n } else {\n this.grid.set(key, [occupant]);\n }\n }\n }\n // placed points within CLEAR of the candidate, off the exempt curve and away\n // from the anchors, up to `limit`\n violations(pts, exempt, anchorPts, limit) {\n let n = 0;\n for (const p of pts) {\n if (anchorPts.some((a) => Math.hypot(p.x - a.x, p.y - a.y) < 2 * LANE_GAP)) {\n continue;\n }\n const cx = Math.floor(p.x / CLEAR);\n const cy = Math.floor(p.y / CLEAR);\n for (let gx = cx - 1; gx <= cx + 1; gx++) {\n for (let gy = cy - 1; gy <= cy + 1; gy++) {\n for (const q of this.grid.get(cellKey(gx, gy)) ?? []) {\n if (q.curve !== exempt && Math.hypot(p.x - q.x, p.y - q.y) < CLEAR) {\n n++;\n if (n >= limit) {\n return n;\n }\n }\n }\n }\n }\n }\n return n;\n }\n // the first candidate that clears what is drawn, else the least crowded\n choose(candidates, exempt, anchorPts) {\n let best;\n let bestV = Infinity;\n for (const candidate of candidates) {\n const m = candidate();\n const v = this.violations(m.pts, exempt, anchorPts, bestV);\n if (v === 0) {\n return m;\n }\n if (v < bestV) {\n bestV = v;\n best = m;\n }\n }\n return best;\n }\n anchorsOf(members) {\n const set = new Set(members);\n const out = [];\n for (const u of members) {\n for (const uSide of SIDES) {\n for (const [v, vSide] of this.links[u][uSide]) {\n const pts = this.points[v];\n if (set.has(v) || !pts) {\n continue;\n }\n const i = this.endIndex(v, vSide);\n out.push({\n u,\n uSide,\n v,\n vSide,\n point: pts[i],\n curve: this.curves[v],\n t: this.params[v][i]\n });\n }\n }\n }\n return out;\n }\n componentsOf(members) {\n const set = new Set(members);\n const seen = /* @__PURE__ */ new Set();\n const comps = [];\n for (const s of members) {\n if (seen.has(s)) {\n continue;\n }\n const queue = [s];\n seen.add(s);\n for (const u of queue) {\n for (const side of SIDES) {\n for (const [v] of this.links[u][side]) {\n if (set.has(v) && !seen.has(v)) {\n seen.add(v);\n queue.push(v);\n }\n }\n }\n }\n comps.push(queue);\n }\n return comps;\n }\n // side-consistent BFS over (node, entered side) within the piece; without a\n // target, the path to the farthest state\n spinePath(members, from, fromSide, to, toExitSide) {\n const set = new Set(members);\n const key = (k, s) => k * 2 + s;\n const reached = (k, s) => k === to && other(s) === toExitSide;\n const prev = /* @__PURE__ */ new Map([[key(from, fromSide), -1]]);\n const queue = [[from, fromSide]];\n let far = [from, fromSide];\n for (const [k, s] of queue) {\n far = [k, s];\n if (to !== void 0 && reached(k, s)) {\n break;\n }\n for (const [v, t] of this.links[k][other(s)]) {\n if (!set.has(v) || prev.has(key(v, t))) {\n continue;\n }\n prev.set(key(v, t), key(k, s));\n queue.push([v, t]);\n }\n }\n if (to !== void 0 && !reached(far[0], far[1])) {\n return void 0;\n }\n const path = [];\n for (let cur = key(far[0], far[1]); cur !== -1; cur = prev.get(cur)) {\n path.push({ k: cur >> 1, enter: cur & 1 });\n }\n return path.reverse();\n }\n loosePath(members, from, to) {\n const set = new Set(members);\n const prev = /* @__PURE__ */ new Map([[from, -1]]);\n const side = /* @__PURE__ */ new Map([[from, 0]]);\n const queue = [from];\n for (const k of queue) {\n if (k === to) {\n break;\n }\n for (const s of SIDES) {\n for (const [v, t] of this.links[k][s]) {\n if (!set.has(v) || prev.has(v)) {\n continue;\n }\n prev.set(v, k);\n side.set(v, t);\n queue.push(v);\n }\n }\n }\n const path = [];\n for (let cur = to; cur !== -1; cur = prev.get(cur)) {\n path.push({ k: cur, enter: side.get(cur) });\n }\n return path.reverse();\n }\n spineLength(spine) {\n const { link } = this.c;\n return spine.reduce((s, { k }) => s + this.drawn(k) + link, link);\n }\n // the spine's chains along the curve from arc length t0, at their own\n // spacing unless one is given\n layAlong(spine, curve, t0, spacing) {\n const { count, per, link } = this.c;\n let t = t0;\n const all = [];\n for (const { k, enter } of spine) {\n const step = spacing ?? per[k];\n const pts = [];\n const ts = [];\n for (let i = 0; i < count[k]; i++) {\n pts.push(curve.pointAt(t + i * step));\n ts.push(t + i * step);\n }\n if (enter === 1) {\n pts.reverse();\n ts.reverse();\n }\n this.points[k] = pts;\n this.params[k] = ts;\n this.curves[k] = curve;\n all.push(...pts);\n t += step * (count[k] - 1) + link;\n }\n return all;\n }\n arcCandidates(frame, tA, sign, c, L) {\n const hMax = (L - c) / 2 - 1e-6;\n const tilts = L > 2 * c ? TEARDROP_TILTS : [0];\n const candidates = [];\n for (const drop of depths(0, 8)) {\n for (const tilt of tilts) {\n for (let i = 0; i <= 16; i++) {\n const h = hMax * i / 16;\n if (i < 16 && arcFlat(c, L, h, drop).apex < MIN_DEPTH) {\n continue;\n }\n candidates.push(\n () => fitted(\n frame,\n tA,\n sign,\n (length) => tilted(\n arcFlat(\n c,\n length,\n Math.min(h, (length - c) / 2 - 1e-6),\n drop\n ),\n c,\n tilt\n ),\n L\n )\n );\n }\n }\n }\n return candidates;\n }\n placePiece(members, parent) {\n const { count, link } = this.c;\n const anchors = this.anchorsOf(members);\n if (anchors.length === 0) {\n return;\n }\n const route = members.every((k) => this.route[k]);\n const shared = anchors.every((a) => a.curve === anchors[0].curve) ? anchors[0].curve : void 0;\n let frame;\n let tA;\n let tB;\n let sign;\n if (shared) {\n anchors.sort((a, b) => a.t - b.t);\n frame = shared;\n tA = anchors[0].t;\n tB = anchors[anchors.length - 1].t;\n sign = frame === this.backbone && route ? -1 : 1;\n } else {\n anchors.sort((a2, b2) => a2.point.x - b2.point.x || a2.point.y - b2.point.y);\n const a = anchors[0].point;\n const b = anchors[anchors.length - 1].point;\n const chord = Math.hypot(b.x - a.x, b.y - a.y);\n const u = chord > 1e-9 ? unit(a, b) : { x: 1, y: 0 };\n const n = { x: -u.y, y: u.x };\n const mid = lerp(a, b, 0.5);\n sign = anchors.some((x) => x.curve === this.backbone) ? (route ? -1 : 1) * (Math.sign(n.y) || 1) : (mid.x - parent.x) * n.x + (mid.y - parent.y) * n.y >= 0 ? 1 : -1;\n frame = new Curve([a, b], [n, n], true);\n tA = 0;\n tB = chord;\n }\n const A = anchors[0];\n const B = anchors[anchors.length - 1];\n const c = tB - tA;\n const single = anchors.length === 1 || A.u === B.u && A.uSide === B.uSide && c < 1e-9;\n const anchorPts = [A.point, B.point];\n const pick = (candidates) => this.choose(candidates, shared, anchorPts);\n let spine;\n let mapped;\n let start = link;\n let spacing;\n if (single) {\n spine = this.spinePath(members, A.u, A.uSide);\n const L = this.spineLength(spine);\n const next = A.vSide ? Math.max(0, count[A.v] - 2) : Math.min(1, count[A.v] - 1);\n const dirU = A.t >= this.params[A.v][next] ? 1 : -1;\n const du = dirU * Math.cos(TIP_ANGLE);\n const dv = Math.sin(TIP_ANGLE);\n mapped = pick(\n depths(0, 12).map(\n (drop) => () => fitted(\n frame,\n tA,\n sign,\n (length) => lineFlat(0, drop, du, dv, length),\n L\n )\n )\n );\n } else {\n spine = this.spinePath(members, A.u, A.uSide, B.u, B.uSide) ?? this.loosePath(members, A.u, B.u);\n const L = this.spineLength(spine);\n if (route) {\n const d0 = Math.max(MIN_DEPTH, Math.min(ROUTE_BOW * c, ROUTE_CAP));\n mapped = pick(\n depths(d0, 12).map(\n (d) => () => mapFlat(frame, tA, sign, arcFlat(c, archLength(c, d), 0, 0))\n )\n );\n const total = polylineLength(mapped.pts);\n spacing = Math.max(1e-3, (total - 2 * link) / (count[spine[0].k] - 1));\n } else if (L > c + 1e-6) {\n mapped = pick(this.arcCandidates(frame, tA, sign, c, L));\n } else {\n const bar = L - 2 * link;\n mapped = pick(\n depths(MIN_DEPTH, 12).map(\n (d) => () => fitted(\n frame,\n tA,\n sign,\n (length) => lineFlat(c / 2 - length / 2, d, 1, 0, length),\n bar\n )\n )\n );\n start = 0;\n }\n }\n const curve = new Curve(mapped.pts, outwardNormals(mapped.pts, mapped.refs));\n const placed = this.layAlong(spine, curve, start, spacing);\n this.occupy(placed, curve);\n const centroid = centroidOf(placed);\n const rest = members.filter((k) => !this.points[k]);\n const subs = this.componentsOf(rest).map((m) => ({ members: m, span: spanOf(this.anchorsOf(m)) })).sort((a, b) => a.span - b.span);\n for (const sub of subs) {\n this.placePiece(sub.members, centroid);\n }\n }\n};\nfunction stressPlacement(c) {\n const X = new Float64Array(c.n).fill(NaN);\n const Y = new Float64Array(c.n).fill(NaN);\n if (Placer.hasBackbone(c)) {\n const placer = new Placer(c);\n placer.run();\n placer.write(X, Y);\n }\n return { X, Y };\n}\n\nexport {\n stressPlacement\n};\n", "import {\n stressPlacement\n} from \"./chunk-LYJ4US66.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/stressEngine.ts\nvar QUALITY = [\n { walks: 2, iterations: 15 },\n { walks: 4, iterations: 30 },\n { walks: 8, iterations: 60 },\n { walks: 12, iterations: 90 },\n { walks: 16, iterations: 120 }\n];\nvar UNTANGLE_PASSES = 20;\nvar UNTANGLE_LINKS = 3;\nvar UNTANGLE_PUSH = 0.3;\nvar SMOOTH_PASSES = 2;\nvar MAX_HOPS = 200;\nvar EPS = 0.1;\nvar WARM = 0.5;\nfunction flipped(strand, name) {\n const own = name.at(-1);\n return (strand === \"+\" || strand === \"-\") && (own === \"+\" || own === \"-\") && strand !== own;\n}\nfunction xorshift(seed) {\n let s = Math.imul(seed, 2654435761) >>> 0 || 1;\n return () => {\n s ^= s << 13;\n s >>>= 0;\n s ^= s >>> 17;\n s ^= s << 5;\n s >>>= 0;\n return s / 4294967296;\n };\n}\nfunction num(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\nfunction chains(request) {\n const { nodes, edges } = request.graph;\n const o = request.options;\n const perMegabase = num(o.nodeLengthPerMegabase, 1e3);\n const minimum = num(o.minimumNodeLength, 1);\n const segment = num(o.nodeSegmentLength, 1);\n const link = num(o.edgeLength, 1);\n const ids = nodes.map((n2) => n2.id);\n const first = new Int32Array(nodes.length);\n const count = new Int32Array(nodes.length);\n const per = new Float64Array(nodes.length);\n let n = 0;\n nodes.forEach((node, k) => {\n const drawn = Math.max(perMegabase * node.length / 1e6, minimum);\n const steps = Math.max(1, Math.ceil(drawn / segment));\n first[k] = n;\n count[k] = steps + 1;\n per[k] = drawn / steps;\n n += steps + 1;\n });\n const chainOf = new Int32Array(n);\n const indexOf = new Int32Array(n);\n const seedX = new Float64Array(n).fill(NaN);\n const seedY = new Float64Array(n).fill(NaN);\n const backbone = new Uint8Array(n);\n const adjacent = Array.from({ length: n }, () => []);\n nodes.forEach((node, k) => {\n const seeded = typeof node.x === \"number\" && typeof node.y === \"number\";\n const reference = isBackbone(node) ? 1 : 0;\n for (let i = 0; i < count[k]; i++) {\n const v = first[k] + i;\n chainOf[v] = k;\n indexOf[v] = i;\n backbone[v] = reference;\n if (seeded) {\n seedX[v] = node.x + i * per[k];\n seedY[v] = node.y;\n }\n if (i > 0) {\n adjacent[v - 1].push([v, per[k]]);\n adjacent[v].push([v - 1, per[k]]);\n }\n }\n });\n const index = new Map(ids.map((id, k) => [id, k]));\n const links = nodes.map(() => [[], []]);\n for (const edge of edges) {\n const a = index.get(edge.from);\n const b = index.get(edge.to);\n if (a === void 0 || b === void 0) {\n continue;\n }\n if (a === b && count[a] <= 2) {\n continue;\n }\n const fromSide = flipped(edge.fromStrand, edge.from) ? 0 : 1;\n const toSide = flipped(edge.toStrand, edge.to) ? 1 : 0;\n const u = first[a] + (fromSide ? count[a] - 1 : 0);\n const v = first[b] + (toSide ? count[b] - 1 : 0);\n adjacent[u].push([v, link]);\n adjacent[v].push([u, link]);\n links[a][fromSide].push([b, toSide]);\n links[b][toSide].push([a, fromSide]);\n }\n const off = new Int32Array(n + 1);\n for (let i = 0; i < n; i++) {\n off[i + 1] = off[i] + adjacent[i].length;\n }\n const nb = new Int32Array(off[n]);\n const wt = new Float64Array(off[n]);\n for (let i = 0; i < n; i++) {\n adjacent[i].forEach(([v, w], k) => {\n nb[off[i] + k] = v;\n wt[off[i] + k] = w;\n });\n }\n return {\n ids,\n first,\n count,\n per,\n links,\n chainOf,\n indexOf,\n seedX,\n seedY,\n backbone,\n off,\n nb,\n wt,\n n,\n link\n };\n}\nfunction components(c) {\n const { n, off, nb } = c;\n const comp = new Int32Array(n).fill(-1);\n const members = [];\n for (let s = 0; s < n; s++) {\n if (comp[s] >= 0) {\n continue;\n }\n const queue = [s];\n comp[s] = members.length;\n for (const u of queue) {\n for (let e = off[u]; e < off[u + 1]; e++) {\n const v = nb[e];\n if (comp[v] < 0) {\n comp[v] = members.length;\n queue.push(v);\n }\n }\n }\n members.push(queue);\n }\n return { comp, members };\n}\nfunction stressLayout(request, opts = {}) {\n const c = chains(request);\n const { n, off, nb, wt, seedX, seedY, backbone, first, count, per, link } = c;\n const o = request.options;\n const quality = QUALITY[Math.max(0, Math.min(4, num(opts.quality ?? o.quality, 2)))];\n const gap = num(opts.componentSeparation ?? o.componentSeparation, 15);\n const rand = xorshift(num(opts.seed ?? o.seed, 1));\n const X = new Float64Array(n);\n const Y = new Float64Array(n);\n const nodePositions = {};\n if (n === 0) {\n return { nodePositions };\n }\n const { comp, members } = components(c);\n let dmin = Infinity;\n let total = 0;\n for (let e = 0; e < nb.length; e++) {\n dmin = Math.min(dmin, wt[e]);\n total += wt[e];\n }\n total /= 2;\n let anySeed = false;\n for (let i = 0; i < n; i++) {\n if (!Number.isNaN(seedX[i])) {\n anySeed = true;\n break;\n }\n }\n const placed = anySeed ? stressPlacement(c) : void 0;\n const side = Math.sqrt(n) * 20;\n for (let i = 0; i < n; i++) {\n if (placed && !Number.isNaN(placed.X[i])) {\n X[i] = placed.X[i];\n Y[i] = placed.Y[i];\n } else if (anySeed && !Number.isNaN(seedX[i])) {\n X[i] = seedX[i] + rand() - 0.5;\n Y[i] = seedY[i] + rand() - 0.5;\n } else {\n X[i] = rand() * side;\n Y[i] = rand() * side;\n }\n }\n const refIdx = members.map(\n (points) => Int32Array.from(\n points.filter((i) => backbone[i] && !Number.isNaN(seedX[i])).sort((a, b) => seedX[a] - seedX[b])\n )\n );\n const refX = refIdx.map((idx) => Float64Array.from(idx, (i) => seedX[i]));\n let span = 0;\n for (const xs of refX) {\n if (xs.length) {\n span = Math.max(span, xs[xs.length - 1] - xs[0]);\n }\n }\n const dmax = Math.max(span, total / 4, dmin * 10);\n const etaMax = dmax * dmax;\n const etaMin = EPS * dmin * dmin;\n const { walks, iterations } = quality;\n const lambda = Math.log(etaMax / etaMin) / Math.max(1, iterations - 1);\n const logMin = Math.log(dmin);\n const logMax = Math.log(dmax);\n const move = (i, j, d, eta) => {\n let mu = eta / (d * d);\n if (mu > 1) {\n mu = 1;\n }\n const dx = X[i] - X[j];\n const dy = Y[i] - Y[j];\n const mag = Math.sqrt(dx * dx + dy * dy) || 1e-9;\n const r = mu * (mag - d) / (2 * mag);\n const rx = r * dx;\n const ry = r * dy;\n X[i] = X[i] - rx;\n Y[i] = Y[i] - ry;\n X[j] = X[j] + rx;\n Y[j] = Y[j] + ry;\n };\n let walked = 0;\n const walk = (i, length) => {\n let chain = c.chainOf[i];\n let idx = c.indexOf[i];\n let dir = rand() < 0.5 ? -1 : 1;\n let remaining = length;\n for (let hops = 0; hops < MAX_HOPS; hops++) {\n const points = count[chain];\n const step = per[chain];\n const toEnd = (dir > 0 ? points - 1 - idx : idx) * step;\n if (remaining <= toEnd) {\n const steps = Math.round(remaining / step);\n walked = length - remaining + steps * step;\n return first[chain] + idx + dir * steps;\n }\n remaining -= toEnd;\n const out = c.links[chain][dir > 0 ? 1 : 0];\n if (out.length === 0) {\n walked = length - remaining;\n return first[chain] + (dir > 0 ? points - 1 : 0);\n }\n const [next, enterSide] = out[Math.floor(rand() * out.length)];\n remaining -= link;\n chain = next;\n dir = enterSide === 0 ? 1 : -1;\n idx = enterSide === 0 ? 0 : count[next] - 1;\n if (remaining <= 0) {\n walked = length - remaining;\n return first[chain] + idx;\n }\n }\n return -1;\n };\n const referenceTerm = (i, eta) => {\n const idx = refIdx[comp[i]];\n if (!backbone[i] || idx.length < 2 || Number.isNaN(seedX[i])) {\n return;\n }\n const xs = refX[comp[i]];\n const target = seedX[i] + Math.exp(logMin + rand() * (logMax - logMin)) * (rand() < 0.5 ? -1 : 1);\n let lo = 0;\n let hi = xs.length;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n if (xs[mid] < target) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n const j = idx[Math.min(lo, idx.length - 1)];\n const d = seedX[j] - seedX[i];\n if (j === i || d === 0) {\n return;\n }\n let mu = eta / (d * d);\n if (mu > 1) {\n mu = 1;\n }\n const r = mu * (X[j] - X[i] - d) / 2;\n X[i] = X[i] + r;\n X[j] = X[j] - r;\n };\n const adjacentTerms = (i, eta) => {\n for (let e = off[i]; e < off[i + 1]; e++) {\n const j = nb[e];\n if (j > i) {\n move(i, j, wt[e], eta);\n }\n }\n };\n const order = new Int32Array(n);\n for (let i = 0; i < n; i++) {\n order[i] = i;\n }\n const warm = anySeed ? Math.floor(WARM * iterations) : 0;\n for (let t = warm; t < iterations; t++) {\n const eta = etaMax * Math.exp(-lambda * t);\n for (let k = n - 1; k > 0; k--) {\n const r = Math.floor(rand() * (k + 1));\n const tmp = order[k];\n order[k] = order[r];\n order[r] = tmp;\n }\n for (let q = 0; q < n; q++) {\n const i = order[q];\n adjacentTerms(i, eta);\n for (let w = 0; w < walks; w++) {\n const length = Math.exp(logMin + rand() * (logMax - logMin));\n const j = walk(i, length);\n if (j >= 0 && j !== i && walked > 0) {\n move(i, j, walked, eta);\n }\n }\n referenceTerm(i, eta);\n }\n }\n const radius = UNTANGLE_LINKS * link;\n const key = (x, y) => Math.floor(x / radius) * 73856093 ^ Math.floor(y / radius) * 19349663;\n for (let u = 0; u < UNTANGLE_PASSES; u++) {\n const grid = /* @__PURE__ */ new Map();\n for (let i = 0; i < n; i++) {\n const k = key(X[i], Y[i]);\n const list = grid.get(k);\n if (list) {\n list.push(i);\n } else {\n grid.set(k, [i]);\n }\n }\n for (let i = 0; i < n; i++) {\n const cx = Math.floor(X[i] / radius);\n const cy = Math.floor(Y[i] / radius);\n for (let gx = cx - 1; gx <= cx + 1; gx++) {\n for (let gy = cy - 1; gy <= cy + 1; gy++) {\n const list = grid.get(gx * 73856093 ^ gy * 19349663);\n if (!list) {\n continue;\n }\n for (const j of list) {\n if (j <= i) {\n continue;\n }\n let joined = false;\n for (let e = off[i]; e < off[i + 1]; e++) {\n if (nb[e] === j) {\n joined = true;\n break;\n }\n }\n if (joined) {\n continue;\n }\n const dx = X[i] - X[j];\n const dy = Y[i] - Y[j];\n const mag = Math.sqrt(dx * dx + dy * dy);\n if (mag >= radius) {\n continue;\n }\n let rx;\n let ry;\n if (mag > 1e-6) {\n const r = UNTANGLE_PUSH * (radius - mag) / (2 * mag);\n rx = r * dx;\n ry = r * dy;\n } else {\n rx = UNTANGLE_PUSH * radius * (rand() - 0.5);\n ry = UNTANGLE_PUSH * radius * (rand() - 0.5);\n }\n X[i] = X[i] + rx;\n Y[i] = Y[i] + ry;\n X[j] = X[j] - rx;\n Y[j] = Y[j] - ry;\n }\n }\n }\n }\n for (let i = 0; i < n; i++) {\n adjacentTerms(i, Infinity);\n referenceTerm(i, etaMin * 4);\n }\n }\n for (let k = 0; k < count.length; k++) {\n const a = first[k];\n const m = count[k];\n if (m < 3) {\n continue;\n }\n for (let s = 0; s < SMOOTH_PASSES; s++) {\n const xs = X.slice(a, a + m);\n const ys = Y.slice(a, a + m);\n for (let i = 1; i + 1 < m; i++) {\n X[a + i] = 0.5 * xs[i] + 0.25 * (xs[i - 1] + xs[i + 1]);\n Y[a + i] = 0.5 * ys[i] + 0.25 * (ys[i - 1] + ys[i + 1]);\n }\n }\n respace(X, Y, a, m, per[k]);\n }\n packComponents(comp, members, X, Y, anySeed, gap);\n for (let k = 0; k < c.ids.length; k++) {\n const points = [];\n for (let i = 0; i < count[k]; i++) {\n points.push({ x: X[first[k] + i], y: Y[first[k] + i] });\n }\n nodePositions[c.ids[k]] = points;\n }\n return { nodePositions };\n}\nfunction respace(X, Y, a, m, per) {\n const arc = new Float64Array(m);\n for (let i = 1; i < m; i++) {\n arc[i] = arc[i - 1] + Math.hypot(X[a + i] - X[a + i - 1], Y[a + i] - Y[a + i - 1]);\n }\n if (!arc[m - 1]) {\n return;\n }\n const loss = per * (m - 1) - arc[m - 1];\n if (loss > 0) {\n extend(X, Y, a, a + 1, loss / 2);\n extend(X, Y, a + m - 1, a + m - 2, loss / 2);\n for (let i = 1; i < m; i++) {\n arc[i] = arc[i - 1] + Math.hypot(X[a + i] - X[a + i - 1], Y[a + i] - Y[a + i - 1]);\n }\n }\n const total = arc[m - 1];\n const xs = X.slice(a, a + m);\n const ys = Y.slice(a, a + m);\n let seg = 1;\n for (let i = 1; i + 1 < m; i++) {\n const s = total * i / (m - 1);\n while (seg < m - 1 && arc[seg] < s) {\n seg++;\n }\n const span = arc[seg] - arc[seg - 1];\n const t = span > 0 ? (s - arc[seg - 1]) / span : 0;\n X[a + i] = xs[seg - 1] + (xs[seg] - xs[seg - 1]) * t;\n Y[a + i] = ys[seg - 1] + (ys[seg] - ys[seg - 1]) * t;\n }\n}\nfunction extend(X, Y, end, next, by) {\n const dx = X[end] - X[next];\n const dy = Y[end] - Y[next];\n const mag = Math.hypot(dx, dy);\n if (mag > 0) {\n X[end] = X[end] + dx / mag * by;\n Y[end] = Y[end] + dy / mag * by;\n }\n}\nfunction packComponents(comp, members, X, Y, anySeed, gap) {\n if (!anySeed) {\n for (const points of members) {\n rotateToPrincipalAxis(X, Y, points);\n }\n }\n if (members.length < 2) {\n return;\n }\n const minX = new Float64Array(members.length).fill(Infinity);\n const minY = new Float64Array(members.length).fill(Infinity);\n const maxY = new Float64Array(members.length).fill(-Infinity);\n for (let i = 0; i < X.length; i++) {\n const k = comp[i];\n minX[k] = Math.min(minX[k], X[i]);\n minY[k] = Math.min(minY[k], Y[i]);\n maxY[k] = Math.max(maxY[k], Y[i]);\n }\n const shift = new Float64Array(members.length);\n let y = 0;\n for (let k = 0; k < members.length; k++) {\n shift[k] = y - minY[k];\n y += maxY[k] - minY[k] + gap;\n }\n for (let i = 0; i < X.length; i++) {\n const k = comp[i];\n X[i] = X[i] - minX[k];\n Y[i] = Y[i] + shift[k];\n }\n}\nfunction rotateToPrincipalAxis(X, Y, points) {\n if (points.length < 3) {\n return;\n }\n let cx = 0;\n let cy = 0;\n for (const i of points) {\n cx += X[i];\n cy += Y[i];\n }\n cx /= points.length;\n cy /= points.length;\n let sxx = 0;\n let syy = 0;\n let sxy = 0;\n for (const i of points) {\n const dx = X[i] - cx;\n const dy = Y[i] - cy;\n sxx += dx * dx;\n syy += dy * dy;\n sxy += dx * dy;\n }\n const angle = -0.5 * Math.atan2(2 * sxy, sxx - syy);\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n for (const i of points) {\n const dx = X[i] - cx;\n const dy = Y[i] - cy;\n X[i] = cx + cos * dx - sin * dy;\n Y[i] = cy + sin * dx + cos * dy;\n }\n}\n\nexport {\n chains,\n stressLayout\n};\n", "// src/loadBandage.ts\nvar cached;\nfunction loadBandage() {\n cached ??= import(\"./bandage-layout-3AR6BCUD.js\").then((mod) => mod.default()).catch((e) => {\n cached = void 0;\n throw e;\n });\n return cached;\n}\n\nexport {\n loadBandage\n};\n", "import {\n stressLayout\n} from \"./chunk-UNOE2NDN.js\";\nimport {\n loadBandage\n} from \"./chunk-7XHHVYG7.js\";\n\n// src/layoutEngines.ts\nvar LAYOUT_ENGINES = [\n {\n value: \"fmmm\",\n label: \"Bandage (FMMM)\",\n description: \"Bandage's force-directed layout: OGDF's fast multipole multilevel method, compiled to wasm.\"\n },\n {\n value: \"stress\",\n label: \"Stress (experimental)\",\n description: \"Stress layout by stochastic gradient descent in plain JS: distances along the graph become distances on the page, so the reference reads straight and a repeat loop reads as a ring.\"\n }\n];\nvar LAYOUT_ENGINE_VALUES = LAYOUT_ENGINES.map((e) => e.value);\nfunction isLayoutEngineKind(value) {\n return LAYOUT_ENGINE_VALUES.includes(value);\n}\nvar layoutEngine = async (request) => {\n if (request.options.engine === \"stress\") {\n const start2 = performance.now();\n const result2 = stressLayout(request);\n return { result: result2, duration: performance.now() - start2 };\n }\n const bandage = await loadBandage();\n const start = performance.now();\n const result = bandage.computeLayout(request.graph, request.options);\n return { result, duration: performance.now() - start };\n};\n\nexport {\n LAYOUT_ENGINES,\n LAYOUT_ENGINE_VALUES,\n isLayoutEngineKind,\n layoutEngine\n};\n", "// src/colorSchemes.ts\nvar COLOR_SCHEMES = [\n // Mirrors `layoutModes`' 'auto': a value the model resolves rather than a\n // colour of its own. It exists because 'uniform' was the default, so a\n // launched graph opened flat grey and both tutorials spent a step saying \"now\n // pick a colour\" \u2014 one figure literally drives that click. A graph with\n // reference coordinates resolves to 'reference-position', which is the one\n // ramp a linear track beside it can be painted with too; a graph with none\n // keeps 'uniform', because there the ramp would be a hue nothing earned.\n //\n // Resolve through `effectiveColorScheme`; the dropdown reads the raw prop, so\n // \"Auto\" stays selectable and visible as what it is.\n { value: \"auto\", label: \"Auto\" },\n { value: \"uniform\", label: \"Uniform\" },\n { value: \"random\", label: \"Random\" },\n { value: \"rainbow\", label: \"Rainbow\" },\n { value: \"depth\", label: \"Depth\" },\n { value: \"node-length\", label: \"Node length\" },\n { value: \"stable-rank\", label: \"Stable rank\" },\n { value: \"reference-position\", label: \"Reference position\" },\n { value: \"grey\", label: \"Grey\" }\n];\nvar COLOR_SCHEME_VALUES = COLOR_SCHEMES.map((s) => s.value);\nfunction resolveColorScheme(scheme, graph) {\n return scheme !== \"auto\" ? scheme : graph?.anchoredBy ? \"reference-position\" : \"uniform\";\n}\n\nexport {\n COLOR_SCHEMES,\n COLOR_SCHEME_VALUES,\n resolveColorScheme\n};\n", "// src/layout/drawnScale.ts\nvar MEAN_NODE_LENGTH = 40;\nvar MIN_TOTAL_GRAPH_LENGTH = 500;\nvar BANDAGE_MINIMUM_NODE_LENGTH = 5;\nfunction drawnNodeLength(opts, length) {\n return Math.max(\n opts.nodeLengthPerMegabase * length / 1e6,\n opts.minimumNodeLength\n );\n}\nfunction bandageAutoScale(graph, minNodeLength = BANDAGE_MINIMUM_NODE_LENGTH) {\n const totalLength = graph.nodes.reduce((sum, n) => sum + n.length, 0);\n const megabases = totalLength / 1e6;\n const target = Math.max(\n graph.nodes.length * MEAN_NODE_LENGTH,\n MIN_TOTAL_GRAPH_LENGTH\n );\n return {\n nodeLengthPerMegabase: megabases > 0 ? target / megabases : 1e4,\n minimumNodeLength: Math.max(BANDAGE_MINIMUM_NODE_LENGTH, minNodeLength),\n edgeLength: 5,\n nodeSegmentLength: 20\n };\n}\nvar PROPORTIONAL_LENGTH = { power: 1, effect: 1 };\nfunction isProportional(law) {\n return law.power === 1 && law.effect === 1;\n}\nfunction drawnLengthFor(graph, law) {\n const count = graph.nodes.length;\n const totalLength = graph.nodes.reduce((sum, n) => sum + n.length, 0);\n const meanBp = count > 0 ? totalLength / count : 0;\n const meanDrawn = count > 0 ? Math.max(count * MEAN_NODE_LENGTH, MIN_TOTAL_GRAPH_LENGTH) / count : MEAN_NODE_LENGTH;\n return (bp) => {\n if (meanBp <= 0) {\n return meanDrawn;\n }\n const relative = (bp / meanBp) ** law.power;\n return Math.max(\n meanDrawn * ((relative - 1) * law.effect + 1),\n BANDAGE_MINIMUM_NODE_LENGTH\n );\n };\n}\nvar LAYOUT_LENGTH_PRECISION = 1e3;\nvar PROPORTIONAL_SPREAD = {\n law: PROPORTIONAL_LENGTH,\n minNodeLength: 0\n};\nfunction layoutScaling(graph, spread = PROPORTIONAL_SPREAD) {\n const { law, minNodeLength } = spread;\n const opts = bandageAutoScale(graph, minNodeLength);\n if (isProportional(law)) {\n return { nodes: graph.nodes, opts };\n }\n const drawn = drawnLengthFor(graph, law);\n return {\n nodes: graph.nodes.map((node) => ({\n ...node,\n length: Math.round(drawn(node.length) * LAYOUT_LENGTH_PRECISION)\n })),\n opts: {\n ...opts,\n nodeLengthPerMegabase: 1e6 / LAYOUT_LENGTH_PRECISION,\n // Bandage's own floor only. A law and a raised floor are alternatives\n // rather than a stack: the law has already lifted the small end, and a\n // floor on top of it would flatten exactly what it just spread.\n minimumNodeLength: BANDAGE_MINIMUM_NODE_LENGTH\n }\n };\n}\nfunction drawnLengthOf(graph, spread = PROPORTIONAL_SPREAD) {\n if (isProportional(spread.law)) {\n const opts = bandageAutoScale(graph, spread.minNodeLength);\n return (bp) => drawnNodeLength(opts, bp);\n }\n return drawnLengthFor(graph, spread.law);\n}\n\nexport {\n MEAN_NODE_LENGTH,\n drawnNodeLength,\n bandageAutoScale,\n PROPORTIONAL_LENGTH,\n isProportional,\n drawnLengthFor,\n PROPORTIONAL_SPREAD,\n layoutScaling,\n drawnLengthOf\n};\n", "import {\n MEAN_NODE_LENGTH,\n PROPORTIONAL_LENGTH\n} from \"./chunk-6JEWNXCQ.js\";\n\n// src/bubbleSpreads.ts\nvar BUBBLE_SPREADS = [\n {\n value: \"auto\",\n label: \"Proportional\",\n description: \"Bandage's own scale: a node draws proportional to its length, so a 1 bp allele is a speck.\",\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 0\n },\n {\n value: \"open\",\n label: \"Open bubbles\",\n description: \"Give every allele a drawn length, so a bubble reads as two arms rather than a knot.\",\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 2.5\n },\n {\n value: \"wide\",\n label: \"Wide bubbles\",\n description: \"As open, spread further. Best on a window of a dozen bubbles.\",\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 10\n },\n {\n value: \"compress\",\n label: \"Compress lengths\",\n description: \"Pull the longest and shortest nodes towards the graph\\u2019s mean, so a cut spanning kb and bp fits one pane.\",\n law: { power: 0.5, effect: 0.5 },\n minNodeFactor: 0\n }\n];\nvar BUBBLE_SPREAD_VALUES = BUBBLE_SPREADS.map((s) => s.value);\nfunction spreadFor(spread) {\n const entry = BUBBLE_SPREADS.find((s) => s.value === spread);\n return {\n law: entry?.law ?? PROPORTIONAL_LENGTH,\n minNodeLength: (entry?.minNodeFactor ?? 0) * MEAN_NODE_LENGTH\n };\n}\n\nexport {\n BUBBLE_SPREADS,\n BUBBLE_SPREAD_VALUES,\n spreadFor\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["require_mui", "__commonJSMin", "exports", "module", "ROUTE_ID", "ROUTE_FRACTION", "withDeletionRoutes", "graph", "deletions", "dropped", "routes", "d", "edges", "edge", "ei", "id", "fromStrand", "toStrand", "routeNodes", "drawnOf", "opts", "lengths", "n", "skipped", "sum", "id2", "drawn", "takeRoutes", "positions", "nodePositions", "deletionRoutes", "edgeIndex", "route", "MIN_DEPTH", "LANE_GAP", "CLEAR", "TIP_ANGLE", "ROUTE_BOW", "ROUTE_CAP", "TEARDROP_TILTS", "SIDES", "other", "side", "unit", "a", "b", "dx", "dy", "m", "lerp", "f", "centroidOf", "pts", "x", "y", "p", "arcLengths", "arc", "i", "polylineLength", "arcAngle", "ratio", "lo", "hi", "mid", "archLength", "c", "s", "R", "theta", "arcFlat", "length", "h", "drop", "cos", "cu", "cv", "t", "tilted", "flat", "angle", "sin", "u", "v", "du", "lineFlat", "u0", "v0", "dv", "Curve", "normals", "straight", "span", "last", "d", "r", "outwardNormals", "outRef", "centroid", "n", "rx", "ry", "rm", "dot", "ref", "sign", "mapFlat", "frame", "tA", "ds", "refs", "q", "nr", "ox", "oy", "fitted", "make", "flatLength", "mapped", "got", "depths", "from", "_", "spanOf", "anchors", "cellKey", "gx", "gy", "Placer", "ids", "first", "count", "per", "seedX", "seedY", "backbone", "N", "sides", "k", "out", "id", "ROUTE_ID", "min", "max", "start", "ts", "free", "pieces", "members", "X", "Y", "curve", "key", "list", "occupant", "exempt", "anchorPts", "limit", "cx", "cy", "candidates", "best", "bestV", "candidate", "set", "uSide", "vSide", "seen", "comps", "queue", "fromSide", "to", "toExitSide", "reached", "prev", "far", "path", "cur", "spine", "link", "t0", "spacing", "all", "enter", "step", "L", "hMax", "tilts", "tilt", "parent", "route", "shared", "tB", "a2", "b2", "chord", "A", "B", "single", "pick", "next", "d0", "total", "bar", "placed", "rest", "subs", "sub", "stressPlacement", "placer", "QUALITY", "UNTANGLE_PASSES", "UNTANGLE_LINKS", "UNTANGLE_PUSH", "SMOOTH_PASSES", "MAX_HOPS", "EPS", "WARM", "flipped", "strand", "name", "own", "xorshift", "seed", "s", "num", "value", "fallback", "chains", "request", "nodes", "edges", "perMegabase", "minimum", "segment", "link", "ids", "n2", "first", "count", "per", "n", "node", "k", "drawn", "steps", "chainOf", "indexOf", "seedX", "seedY", "backbone", "adjacent", "seeded", "reference", "isBackbone", "i", "v", "index", "id", "links", "edge", "a", "b", "fromSide", "toSide", "u", "off", "nb", "wt", "w", "components", "c", "comp", "members", "queue", "e", "stressLayout", "opts", "o", "quality", "gap", "rand", "X", "Y", "nodePositions", "dmin", "total", "anySeed", "placed", "stressPlacement", "side", "refIdx", "points", "refX", "idx", "span", "xs", "dmax", "etaMax", "etaMin", "walks", "iterations", "lambda", "logMin", "logMax", "move", "j", "d", "eta", "mu", "dx", "dy", "mag", "r", "rx", "ry", "walked", "walk", "length", "chain", "dir", "remaining", "hops", "step", "toEnd", "out", "next", "enterSide", "referenceTerm", "target", "lo", "hi", "mid", "adjacentTerms", "order", "warm", "t", "tmp", "q", "radius", "key", "x", "y", "grid", "list", "cx", "cy", "gx", "gy", "joined", "m", "ys", "respace", "packComponents", "arc", "loss", "extend", "seg", "end", "by", "rotateToPrincipalAxis", "minX", "minY", "maxY", "shift", "sxx", "syy", "sxy", "angle", "cos", "sin", "cached", "loadBandage", "mod", "e", "LAYOUT_ENGINES", "LAYOUT_ENGINE_VALUES", "e", "layoutEngine", "request", "start2", "stressLayout", "bandage", "loadBandage", "start", "COLOR_SCHEMES", "COLOR_SCHEME_VALUES", "s", "resolveColorScheme", "scheme", "graph", "MEAN_NODE_LENGTH", "MIN_TOTAL_GRAPH_LENGTH", "BANDAGE_MINIMUM_NODE_LENGTH", "drawnNodeLength", "opts", "length", "bandageAutoScale", "graph", "minNodeLength", "megabases", "sum", "n", "target", "PROPORTIONAL_LENGTH", "isProportional", "law", "drawnLengthFor", "count", "totalLength", "meanBp", "meanDrawn", "bp", "relative", "LAYOUT_LENGTH_PRECISION", "PROPORTIONAL_SPREAD", "layoutScaling", "spread", "drawn", "node", "drawnLengthOf", "BUBBLE_SPREADS", "PROPORTIONAL_LENGTH", "BUBBLE_SPREAD_VALUES", "s", "spreadFor", "spread", "entry", "MEAN_NODE_LENGTH"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as Ke}from"./chunk-JC7I7V6M.js";import{a as K,b as R,c as Ye,d as $e,e as ne,f as Ze,g as Ue,i as qe,j as Je,l as Qe,m as et,n as tt,o as nt,p as ot}from"./chunk-7KFSWOWX.js";import{A as fe,C as Ve,D as je,a as w,h as Le,q as Be,r as Fe,s as De,t as _e,u as Xe,z as te}from"./chunk-GXQ7NYB3.js";import{g as Pe,p as Y}from"./chunk-OTI5X5W7.js";import{$ as ue,F as We,K as ze,Q as Ne,S as Q,T as Ae,X as Oe,Z as de,a as mn,ba as ee,h as Ie,i as Ge,z as J}from"./chunk-GB7CF6Z2.js";import{g as Ee,i as He,t as Te}from"./chunk-WTOQRUK2.js";import{z as Ce}from"./chunk-B7GF3TC3.js";import{a as ce}from"./chunk-FCWXYIFC.js";import{a as j}from"./chunk-J6KYLXRD.js";import{a as pe,b as _}from"./chunk-NXZT63HN.js";import{a as f,b as S}from"./chunk-64LZZURD.js";import{a as fn,b as a}from"./chunk-FY3BTKY4.js";var st=fn((ko,at)=>{at.exports=JBrowseExports["@jbrowse/render-core/useRenderingBackend"]});var ie=a(j(),1);function rt(t){return`${t.refName}:${(t.start+1).toLocaleString()}-${t.end.toLocaleString()}`}function me(t,e,n=r=>r){return e?{deletion:{bp:`${e.bp.toLocaleString()} bp`,where:rt(e)}}:{ends:`${n(t.from)}${t.fromStrand??""} \u2192 ${n(t.to)}${t.toStrand??""}`}}var X=a(pe(),1),Me=a(ce(),1),an=a(st(),1);var it=a(f(),1),lt=(0,w.createSvgIcon)((0,it.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"}),"Info");var C=a(S(),1);var re=a(j(),1);var ae=a(mn(),1),ge=a(S(),1);var H=a(f(),1),A={width:18,height:8,borderRadius:2,flex:"none"},hn={marginBottom:2},gn={...A,width:48};function U({walk:t,label:e,reference:n,hint:r,at:i}){let s=Oe(t,n);return(0,H.jsxs)("div",{style:hn,title:[s.hover,r].filter(Boolean).join(" \xB7 ")||void 0,children:[(0,H.jsxs)("div",{style:R,children:[(0,H.jsx)("div",{style:{...s.shades?gn:A,background:Te(t.encoding)}}),(0,H.jsxs)("span",{children:[(0,H.jsx)("strong",{children:e}),s.delta,s.outside,s.reversed]})]}),i?(0,H.jsx)("div",{"data-testid":"graph-walk-at",children:i}):s.scale?(0,H.jsx)("div",{children:s.scale}):null]})}var I=a(j(),1);var vn=1.1,yn=100,bn=40,wn=800,kn=10,ct=2;function he(t){let e=t.deltaY*(t.deltaMode===1?bn:t.deltaMode===2?wn:1),n=(t.ctrlKey?kn:1)*e/yn;return vn**-Math.max(-ct,Math.min(ct,n))}var pt=a(ce(),1);function oe(t,e){(0,I.useEffect)(()=>{if(!t)return;let n=t;function r(i){if(e.hostPlacesX)return;e.host&&i.stopPropagation(),i.preventDefault();let s=n.getBoundingClientRect();e.zoom(he(i),i.clientX-s.left,i.clientY-s.top)}return n.addEventListener("wheel",r,{passive:!1}),()=>{n.removeEventListener("wheel",r)}},[t,e])}function dt(t){let e=(0,I.useRef)({x:0,y:0}),n=(0,I.useRef)(!1),r=(0,I.useRef)({frame:0,pan:null,hover:null});(0,I.useEffect)(()=>()=>{cancelAnimationFrame(r.current.frame)},[]);let[i,s]=(0,I.useState)(void 0),[p,l]=(0,I.useState)(void 0);function d(c,g){return{x:(c-t.translateX)/t.scaleX,y:(g-t.translateY)/t.scaleY}}function h(c){let g=c.currentTarget.getBoundingClientRect();return d(c.clientX-g.left,c.clientY-g.top)}function u(c,g){let{nodePositions:b}=t,v=c*t.scaleX+t.translateX,M=g*t.scaleY+t.translateY;if(t.layoutResult?.tubeMap)return t.tubeMapNodeAt(v,M);let Re=t.referenceStripNodeAt(v,M);return Re||(b?de(b,c,g,t.axisScale,t.positionsVersion,t.nodeInk):null)}function m(c){if(c.button===0){if(c.preventDefault(),n.current=!1,t.hostPlacesX)return;t.host&&c.stopPropagation();let{x:g,y:b}=h(c),v=t.layoutResult?.tubeMap||c.nativeEvent.offsetY<t.referenceStripZonePx?null:u(g,b);v?t.setDraggingNode(v):t.setPanning(!0),e.current={x:c.clientX,y:c.clientY}}}function L(){let c=r.current;c.frame=0,c.pan&&(t.setTransform(t.scale,t.translateX+c.pan.dx,t.translateY+c.pan.dy),c.pan=null);let g=t.walkRowBars;if(c.hover&&g){let b=t.walkRowAt(c.hover.x,c.hover.y);t.setHoveredWalkRow(b===void 0?null:[g.reference,...g.rows][b].name)}if(c.hover&&t.nodePositions&&t.graph){let{x:b,y:v}=d(c.hover.x,c.hover.y);c.hover=null;let M=u(b,v);t.setHoveredNode(M),t.setHoveredEdge(M||t.layoutResult?.tubeMap?null:ue(t.nodePositions,t.graph,b,v,t.axisScale,t.effectiveDrawPaths&&!t.facetPanels,t.positionsVersion,t.deletionEdgeIndexes,t.hiddenEdgeIndexes,t.deletionRoutes,t.layoutResult?.stranded))}}function P(){r.current.frame||(r.current.frame=requestAnimationFrame(L))}function le(){let c=r.current;cancelAnimationFrame(c.frame),c.frame=0,c.pan=null,c.hover=null}function V(c){let g=c.clientX-e.current.x,b=c.clientY-e.current.y;e.current={x:c.clientX,y:c.clientY},(Math.abs(g)>1||Math.abs(b)>1)&&(n.current=!0);let v=r.current;if(t.draggingNode)t.moveNode(t.draggingNode,g/t.scaleX,b/t.scaleY);else if(t.isPanning)v.pan={dx:(v.pan?.dx??0)+g,dy:(v.pan?.dy??0)+b},P();else{let M=c.currentTarget.getBoundingClientRect();v.hover={x:c.clientX-M.left,y:c.clientY-M.top},P()}}function cn(){t.stopDragging()}function pn(){le(),(0,pt.isAlive)(t)&&(t.stopDragging(),t.setHoveredNode(null),t.setHoveredEdge(null),t.setHoveredWalkRow(null))}function dn(c){let{x:g,y:b}=h(c),v=u(g,b);if(v){c.preventDefault(),s({nodeId:v,top:c.clientY,left:c.clientX});return}let M=t.walkRowAt(g*t.scaleX+t.translateX,b*t.scaleY+t.translateY);M!==void 0&&(c.preventDefault(),l({row:M,top:c.clientY,left:c.clientX}))}function un(c){if(!n.current){let{x:g,y:b}=h(c),v=u(g,b);t.setSelectedNode(v),v&&t.showNodeDetails(v)}}return{handlers:{onMouseDown:m,onMouseMove:V,onMouseUp:cn,onMouseLeave:pn,onClick:un,onContextMenu:dn},contextNode:i,contextRow:p,closeContextMenu:()=>{s(void 0),l(void 0)}}}var W=a(f(),1),Sn={position:"absolute",left:0,top:0,zIndex:4,display:"grid",gap:Ie,lineHeight:"normal"},xn={height:Ge,padding:"2px 6px",boxSizing:"border-box",fontFamily:"inherit",fontSize:11,color:"inherit",cursor:"pointer",border:"none",background:"none",textAlign:"left",display:"block"},Mn=(0,ge.observer)(function({model:e,lift:n,width:r,height:i,cell:s,handlers:p}){let[l,d]=(0,re.useState)(null),h=n.walks[0];oe(l,e),(0,re.useEffect)(()=>{if(!l)return;let m=new Q(l);m.resize(r,i);let L=(0,ae.computed)(()=>e.buildDrawing(n,!1)),P,le=(0,ae.autorun)(()=>{let V=L.get();V&&(V!==P&&(m.uploadGeometry(V.batch),P=V),e.applyHighlights(m),e.paint(m))});return()=>{le(),m.dispose()}},[l,e,n,r,i]);let u=e.walkLabel(h.name);return(0,W.jsxs)("div",{style:s,children:[(0,W.jsx)("button",{type:"button",style:xn,"data-testid":"graph-facet-title",onClick:()=>{e.liftWalks([h.name]),e.setFacet("")},children:(0,W.jsx)(U,{walk:h,label:u,reference:e.walkReference,hint:`click to lift ${u} alone`,at:e.hoveredOn(h)})}),(0,W.jsx)("canvas",{ref:d,"data-testid":"graph-facet-canvas",style:{width:r,height:i,display:"block",cursor:e.isPanning||e.draggingNode?"grabbing":"grab",touchAction:"none",overscrollBehavior:"contain"},...p})]})}),Rn=(0,ge.observer)(function({model:e,handlers:n}){let r=e.facetPanels,i=e.facetGrid,s=e.facetPlacement;if(!r||!i||!s)return null;let{columns:p,width:l,height:d}=i;return(0,W.jsx)("div",{"data-testid":"graph-facet-panels",style:{...Sn,width:e.paneWidth,minHeight:e.canvasHeight,gridTemplateColumns:`repeat(${p}, ${l}px)`,background:e.darkMode?"#1f1f1f":"white"},children:r.map((h,u)=>(0,W.jsx)(Mn,{model:e,lift:h,width:l,height:d,cell:{gridRow:Math.floor(s.cells[u]/p)+1,gridColumn:s.cells[u]%p+1},handlers:n},h.walks[0].name))})}),ut=Rn;var ft=a(f(),1),mt=(0,w.createSvgIcon)((0,ft.jsx)("path",{d:"M3 5v4h2V5h4V3H5c-1.1 0-2 .9-2 2m2 10H3v4c0 1.1.9 2 2 2h4v-2H5zm14 4h-4v2h4c1.1 0 2-.9 2-2v-4h-2zm0-16h-4v2h4v4h2V5c0-1.1-.9-2-2-2"}),"CropFree");var ve=a(f(),1),ht=(0,w.createSvgIcon)([(0,ve.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"},"0"),(0,ve.jsx)("path",{d:"M12 10h-2v2H9v-2H7V9h2V7h1v2h2z"},"1")],"ZoomIn");var gt=a(f(),1),vt=(0,w.createSvgIcon)((0,gt.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14M7 9h5v1H7z"}),"ZoomOut");var E=a(_(),1),ke=a(S(),1),At=a(Y(),1);var z=a(_(),1),yt=a(S(),1),bt=a(Y(),1),$=a(f(),1),Cn=(0,bt.makeStyles)()({formControl:{minWidth:100}}),Ln=(0,yt.observer)(function({model:e}){let{classes:n}=Cn(),r=e.colorSchemeLock;return(0,$.jsxs)(z.FormControl,{size:"small",className:n.formControl,disabled:r!==void 0,title:r?.why,children:[(0,$.jsx)(z.InputLabel,{children:"Color"}),(0,$.jsx)(z.Select,{value:e.chosenColorScheme,label:"Color",renderValue:r?()=>r.value:void 0,onChange:i=>{e.setColorScheme(i.target.value)},children:Pe.map(({value:i,label:s})=>(0,$.jsx)(z.MenuItem,{value:i,children:s},i))})]})}),wt=Ln;var be=a(_(),1),we=a(S(),1),kt=a(Y(),1),Z=a(f(),1),St=(0,kt.makeStyles)()({stats:{marginLeft:"auto"},perf:{color:"#888",fontVariantNumeric:"tabular-nums"}});function ye(t){return t===void 0?"\u2013":`${Math.round(t)}ms`}var Pn=(0,we.observer)(function({model:e}){let{classes:n}=St(),{lastFetchMs:r,lastLayoutMs:i,lastGeometryMs:s}=e,p=r!==void 0||i!==void 0||s!==void 0;return e.showPerf&&p?(0,Z.jsxs)(be.Typography,{variant:"caption",className:n.perf,"data-testid":"graph-perf-stats",children:["fetch ",ye(r)," \xB7 layout ",ye(i)," \xB7 geom"," ",ye(s)]}):null}),In=(0,we.observer)(function({model:e}){let{classes:n}=St();return(0,Z.jsxs)("div",{className:n.stats,"data-testid":"graph-stats","data-node-count":e.nodeCount,"data-edge-count":e.edgeCount,"data-path-count":e.pathCount,"data-fetch-ms":e.lastFetchMs??"","data-layout-ms":e.lastLayoutMs??"","data-geometry-ms":e.lastGeometryMs??"","data-geometry-strokes":e.lastGeometryStrokeCount??"",children:[(0,Z.jsxs)(be.Typography,{variant:"body2",component:"span",children:[e.nodeCount," nodes, ",e.edgeCount," edges",e.pathCount>0?`, ${e.pathCount} paths`:""]})," ",(0,Z.jsx)(Pn,{model:e})]})}),xt=In;var G=a(_(),1),Mt=a(S(),1),Rt=a(Y(),1),N=a(f(),1),Gn=(0,Rt.makeStyles)()({formControl:{minWidth:150}}),En=(0,Mt.observer)(function({model:e}){let{classes:n}=Gn(),{graph:r}=e;return(0,N.jsxs)(G.FormControl,{size:"small",className:n.formControl,children:[(0,N.jsx)(G.InputLabel,{children:"Layout"}),(0,N.jsx)(G.Select,{value:e.chosenLayoutMode,label:"Layout","data-testid":"graph-layout-select",onChange:i=>{e.switchLayout(i.target.value)},children:Le.map(({value:i,label:s,description:p,available:l})=>(0,N.jsx)(G.MenuItem,{value:i,disabled:r?!l(r):!1,children:(0,N.jsx)(G.Tooltip,{title:p,placement:"right",children:(0,N.jsx)("span",{children:s})})},i))})]})}),Ct=En;var T=a(_(),1),Lt=a(S(),1),Pt=a(Y(),1),B=a(f(),1),Hn=(0,Pt.makeStyles)()({formControl:{minWidth:130,maxWidth:240}}),Tn=(0,Lt.observer)(function({model:e}){let{classes:n}=Hn(),{repeatChoices:r}=e;if(e.chosenLayoutMode!=="walkrows"||r.length===0)return null;let i=new Set(r.map(s=>s.key));return(0,B.jsxs)(T.FormControl,{size:"small",className:n.formControl,children:[(0,B.jsx)(T.InputLabel,{children:"Repeat"}),(0,B.jsxs)(T.Select,{value:i.has(e.repeatKey)?e.repeatKey:"",label:"Repeat","data-testid":"graph-repeat-select",onChange:s=>{e.setRepeatKey(s.target.value)},children:[(0,B.jsx)(T.MenuItem,{value:"",children:(0,B.jsx)("em",{children:"Whole window"})}),r.map(({key:s,name:p,unit:l})=>(0,B.jsxs)(T.MenuItem,{value:s,children:[p," \xB7 ",l.toLocaleString()," bp unit"]},s))]})]})}),It=Tn;var Wt=a(j(),1),zt=a(pe(),1);var Gt=a(f(),1),Et=(0,w.createSvgIcon)((0,Gt.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM19 4h-3.5l-1-1h-5l-1 1H5v2h14z"}),"Delete");var Ht=a(f(),1),Tt=(0,w.createSvgIcon)((0,Ht.jsx)("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"}),"MoreVert");var Nt=a(S(),1);var F=a(f(),1),Wn=(0,Nt.observer)(function({model:e}){let[n,r]=(0,Wt.useState)(!1);return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(zt.CascadingMenuButton,{size:"small",menuItems:[{type:"checkbox",label:"Linear layout",checked:e.linearLayout,onClick:()=>{e.setLinearLayout(!e.linearLayout),e.recomputeLayout()}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.toggleDeletionEdges()}},{type:"checkbox",label:"Show timings",checked:e.showPerf,onClick:()=>{e.setShowPerf(!e.showPerf)}},{type:"divider"},{label:"Settings",icon:je,onClick:()=>{r(!0)}},{type:"divider"},{label:"Return to import form",icon:Et,onClick:()=>{e.clearGraph()}}],children:(0,F.jsx)(Tt,{})}),(0,F.jsx)(Ke,{model:e,open:n,onClose:()=>{r(!1)}})]})}),Bt=Wn;var x=a(_(),1),Ft=a(S(),1),Dt=a(Y(),1),D=a(f(),1),zn=(0,Dt.makeStyles)()({formControl:{minWidth:130,maxWidth:260}}),Nn=(0,Ft.observer)(function({model:e}){let{classes:n}=zn(),{walkChoices:r}=e;if(r.length===0||!e.liftsWalks)return null;let i=new Set(r.map(l=>l.name)),s=new Map(r.map(l=>[l.name,l.label])),p=e.walkLayers.map(l=>l.walk).filter(l=>i.has(l));return(0,D.jsxs)(x.FormControl,{size:"small",className:n.formControl,children:[(0,D.jsx)(x.InputLabel,{children:"Walks"}),(0,D.jsx)(x.Select,{multiple:!0,value:p,label:"Walks","data-testid":"graph-walk-select",renderValue:l=>l.map(d=>s.get(d)).join(", "),onChange:l=>{let{value:d}=l.target;e.liftWalks(typeof d=="string"?d.split(","):d)},children:r.map(({name:l,label:d})=>(0,D.jsxs)(x.MenuItem,{value:l,dense:!0,children:[(0,D.jsx)(x.Checkbox,{size:"small",checked:p.includes(l)}),(0,D.jsx)(x.ListItemText,{primary:d})]},l))})]})}),_t=Nn;var y=a(f(),1),Bn=(0,At.makeStyles)()({toolbar:{display:"flex",alignItems:"center",gap:4,padding:"2px 4px",borderBottom:"1px solid #ddd"}}),Fn=(0,ke.observer)(function({model:e}){return(0,y.jsx)(E.Typography,{variant:"body2",children:e.zoomPercent})}),Dn=(0,ke.observer)(function({model:e}){let{classes:n}=Bn();return(0,y.jsxs)("div",{className:n.toolbar,children:[(0,y.jsx)(Ct,{model:e}),(0,y.jsx)(wt,{model:e}),(0,y.jsx)(_t,{model:e}),(0,y.jsx)(It,{model:e}),(0,y.jsx)(E.Tooltip,{title:"Zoom in",children:(0,y.jsx)(E.IconButton,{size:"small",onClick:()=>{e.zoom(1.5,e.viewBox.width/2,e.viewBox.height/2)},children:(0,y.jsx)(ht,{})})}),(0,y.jsx)(E.Tooltip,{title:"Zoom out",children:(0,y.jsx)(E.IconButton,{size:"small",onClick:()=>{e.zoom(1/1.5,e.viewBox.width/2,e.viewBox.height/2)},children:(0,y.jsx)(vt,{})})}),(0,y.jsx)(E.Tooltip,{title:"Zoom to fit",children:(0,y.jsx)(E.IconButton,{size:"small",onClick:()=>{e.zoomToFit()},children:(0,y.jsx)(mt,{})})}),(0,y.jsx)(Fn,{model:e}),(0,y.jsx)(xt,{model:e}),(0,y.jsx)(Bt,{model:e})]})}),Ot=Dn;var Xt=a(_(),1),Vt=a(S(),1),$t=a(f(),1),_n={position:"absolute",left:8,zIndex:5,background:"rgba(255,255,255,0.9)",textTransform:"none"},An=(0,Vt.observer)(function({model:e}){let{poppedFrom:n}=e;return n?(0,$t.jsxs)(Xt.Button,{size:"small",variant:"outlined",style:{..._n,...e.facetPanels?{bottom:8}:{top:8}},"data-testid":"graph-unpop-bubble",onClick:()=>{e.unpopBubble()},children:["\u25C0 Back to ",n.label]}):null}),Yt=An;var qt=a(pe(),1);var Zt=a(f(),1),jt=(0,w.createSvgIcon)((0,Zt.jsx)("path",{d:"M10 18h4v-2h-4zM3 6v2h18V6zm3 7h12v-2H6z"}),"FilterList");var Kt=a(f(),1),Ut=(0,w.createSvgIcon)((0,Kt.jsx)("path",{d:"M10.83 8H21V6H8.83zm5 5H18v-2h-4.17zM14 16.83V18h-4v-2h3.17l-3-3H6v-2h2.17l-3-3H3V6h.17L1.39 4.22 2.8 2.81l18.38 18.38-1.41 1.41z"}),"FilterListOff");var Jt=a(S(),1);var Qt=a(f(),1),se=(0,Jt.observer)(function({model:e,row:n,bars:r,top:i,left:s,onClose:p}){let l=r??e.walkRowBars,d=e.walkRowLaunchTarget(n,l),h=d?.assembly,u=n>0?l?.rows[n-1]?.sample:void 0,m=!r&&e.walkRowBars,L=e.walkRowSamples;return(0,Qt.jsx)(qt.Menu,{open:!0,anchorReference:"anchorPosition",anchorPosition:{top:i,left:s},onClose:()=>{p()},onMenuItemClick:P=>{P()},menuItems:[d&&h?{label:`Linear genome view \u2014 ${h} ${te(d.location)}`,icon:fe,onClick:()=>{e.showInLinearView({location:d.location,assembly:h})}}:{label:"Linear genome view",icon:fe,disabled:!0,disabledHelpText:d?`No assembly in this session is ${d.location.haplotype??d.label}`:"This walk states no contig coordinates",onClick:()=>{}},...m&&u&&!(L?.length===1&&L[0]===u)?[{label:`Show only ${u}`,icon:jt,onClick:()=>{e.setWalkRowSamples([u])}}]:[],...m&&L?[{label:"Show every sample",icon:Ut,onClick:()=>{e.setWalkRowSamples(void 0)}}]:[]]})});var O=a(j(),1);var en=a(ce(),1),Se=a(S(),1);var k=a(f(),1),On={display:"flex",flexWrap:"wrap",gap:"2px 14px",padding:"2px 8px 6px",fontSize:11,color:"#333"},Xn={position:"absolute",pointerEvents:"none",background:"rgba(255,255,255,0.92)",border:"1px solid #ccc",borderRadius:3,padding:"1px 6px",fontSize:11,whiteSpace:"nowrap",zIndex:4},Vn=(0,Se.observer)(function({bars:e,frame:n,ramp:r,rowGenes:i}){let s=(0,O.useId)().replace(/[^\w-]/g,""),p=(0,O.useMemo)(()=>Ne(e,n,{ramp:r,rowGenes:i,idPrefix:s}),[e,n,r,i,s]);return(0,k.jsx)(ne,{el:p})}),Yn=(0,Se.observer)(function({model:e}){let n=e.walkStripRows,r=e.walkStripFrame,[i,s]=(0,O.useState)(void 0),[p,l]=(0,O.useState)(void 0);if(!n||!r)return null;let d=u=>{let m=u.currentTarget.getBoundingClientRect(),L=u.clientX-m.left,P=u.clientY-m.top;return{...Be(n,r,L,P),x:L,y:P}},h=ze(n,{ramp:e.referenceRampDomain,rampCss:J,genes:_e(r,e.walkRowGenes,e.walkRowGeneGaps)});return(0,k.jsxs)("div",{"data-testid":"graph-walk-strip",style:{position:"relative",borderTop:"1px solid #ddd"},onMouseEnter:()=>{e.setPointerInPane(!0)},onMouseLeave:()=>{(0,en.isAlive)(e)&&(e.setPointerInPane(!1),e.setStripHover(null)),l(void 0)},children:[(0,k.jsxs)("svg",{width:r.width,height:r.height,style:{display:"block",cursor:"pointer"},onMouseMove:u=>{let m=d(u);m.row?(e.setStripHover({row:m.row.name,offset:m.offset}),l(r.labelled?void 0:{text:`${m.row.label} \xB7 ${We(m.row,m.index===0?void 0:n.reference)}`,x:m.x,y:m.y})):(e.setStripHover(null),l(void 0))},onClick:u=>{let m=d(u);m.row&&m.index>0&&e.toggleWalk(m.row.name)},onContextMenu:u=>{let m=d(u);m.row&&(u.preventDefault(),s({row:m.index,top:u.clientY,left:u.clientX}))},children:[(0,k.jsx)(Vn,{bars:n,frame:r,ramp:e.referenceRampDomain,rowGenes:e.walkRowGenes}),(0,k.jsx)(ne,{el:Fe(n,r,e.walkStripMarks)}),(0,k.jsx)(ne,{el:De(n,r,new Set(e.walkLayers.map(u=>u.walk)))})]}),p?(0,k.jsx)("div",{style:{...Xn,left:p.x+12,top:p.y-18},children:p.text}):null,(0,k.jsxs)("div",{style:On,"data-testid":"graph-walk-strip-key",children:[h.map(u=>(0,k.jsxs)("div",{style:R,children:[(0,k.jsx)(tt,{swatch:u.swatch}),(0,k.jsx)("span",{children:u.label})]},u.label)),(0,k.jsx)("div",{style:R,children:(0,k.jsx)("span",{children:"\u25AE ticks: where each walk passes the node under the pointer \xB7 click a bar to lift its walk"})})]}),i?(0,k.jsx)(se,{model:e,row:i.row,bars:n,top:i.top,left:i.left,onClose:()=>{s(void 0)}}):null]})}),tn=Yn;var nn=a(S(),1),q=a(f(),1),$n={position:"absolute",left:0,top:0,pointerEvents:"none",overflow:"visible",zIndex:4},Zn=(0,nn.observer)(function({model:e}){let n=e.walkStripLocator;return n?(0,q.jsxs)("svg",{style:$n,width:e.paneWidth,height:e.canvasHeight,"data-testid":"graph-walk-strip-locator",children:[(0,q.jsx)("circle",{cx:n.x,cy:n.y,r:11,fill:"none",stroke:"white",strokeWidth:4}),(0,q.jsx)("circle",{cx:n.x,cy:n.y,r:11,fill:"none",stroke:"#111",strokeWidth:1.75})]}):null}),on=Zn;function rn(t){return Promise.resolve(new Q(t))}var o=a(f(),1),xe={position:"absolute",bottom:8,right:8,background:"rgba(0,0,0,0.75)",color:"white",padding:"4px 8px",borderRadius:4,fontSize:12,pointerEvents:"none",zIndex:6},jn={position:"relative"},Kn={position:"relative",lineHeight:0,isolation:"isolate"},Un={position:"absolute",left:0,right:0,bottom:0,zIndex:0},qn={position:"absolute",inset:0,zIndex:10,lineHeight:"normal",pointerEvents:"none"},Jn={position:"absolute",left:6,transform:"translateY(-50%)",background:"rgba(255,255,255,0.82)",padding:"0 4px",borderRadius:3,fontSize:11,lineHeight:"16px",whiteSpace:"nowrap",pointerEvents:"none",zIndex:4},Qn=(0,C.observer)(function({model:e}){let n=e.drawnRowLabels;return(0,o.jsx)(o.Fragment,{children:n.map(({label:r,y:i})=>{let s=i*e.scaleY+e.translateY;return s>=0&&s<=e.canvasHeight?(0,o.jsx)("div",{"data-testid":"graph-row-label",style:{...Jn,top:s},children:r},i):null})})}),eo={position:"absolute",top:ee,right:ee,display:"flex",flexDirection:"column",alignItems:"flex-end",gap:4,pointerEvents:"none",zIndex:4},to={width:18,height:3,borderRadius:2},no=(0,C.observer)(function({model:e}){let{pathLegend:n}=e;return n.length>0?(0,o.jsx)("div",{style:K,"data-testid":"graph-path-legend",children:n.map(({name:r,label:i,color:s})=>(0,o.jsxs)("div",{style:R,children:[(0,o.jsx)("div",{style:{...to,backgroundColor:s}}),(0,o.jsx)("span",{children:i})]},r))}):null}),oo=(0,C.observer)(function({model:e}){let n=e.walkLift;return n?(0,o.jsxs)("div",{style:K,"data-testid":"graph-walk-readout",children:[n.walks.map(r=>(0,o.jsx)(U,{walk:r,label:e.walkLabel(r.name),reference:e.walkReference,at:e.hoveredOn(r)},r.name)),e.liftPaintsOffReference?(0,o.jsx)(sn,{}):null,(0,o.jsxs)("div",{style:R,children:[(0,o.jsx)("div",{style:{...A,background:Ee}}),(0,o.jsxs)("span",{children:["not on ",e.liftedWalksLabel]})]})]}):null}),ro={minWidth:90,height:8,borderRadius:2,background:J},ao={display:"flex",justifyContent:"space-between",gap:8},so=(0,C.observer)(function({model:e}){let n=e.walkLift?void 0:e.referenceRampDomain,{offReference:r,unplaced:i}=e.referenceRampOffKeys,s=Math.round(n?.start??0),p=Math.round(n?.end??0);return n?(0,o.jsxs)("div",{style:K,"data-testid":"graph-ramp-legend",children:[(0,o.jsx)("div",{style:ro}),(0,o.jsxs)("div",{style:ao,children:[(0,o.jsx)("span",{children:s.toLocaleString()}),(0,o.jsxs)("span",{children:["(",Ce(p-s),")"]}),(0,o.jsx)("span",{children:p.toLocaleString()})]}),r?(0,o.jsx)(sn,{}):null,i?(0,o.jsxs)("div",{style:R,children:[(0,o.jsx)("div",{style:{...A,background:io}}),(0,o.jsx)("span",{children:"no reference position"})]}):null]}):null}),io="rgb(160, 160, 160)";function sn(){return(0,o.jsxs)("div",{style:R,children:[(0,o.jsx)("div",{style:{...A,background:He}}),(0,o.jsx)("span",{children:"off the reference"})]})}var lo={...A,border:`2px solid ${Ae}`,borderRadius:5,boxSizing:"border-box"},co=(0,C.observer)(function({model:e}){return e.genePins.some(n=>n.exonsByNode.length>0)?(0,o.jsx)("div",{style:K,"data-testid":"graph-gene-legend",children:(0,o.jsxs)("div",{style:R,children:[(0,o.jsx)("div",{style:lo}),(0,o.jsx)("span",{children:"exon"})]})}):null}),ln={position:"absolute",transform:"translate(-50%, -50%)",background:"rgba(255,255,255,0.78)",padding:"0 3px",borderRadius:3,fontSize:10,lineHeight:"13px",whiteSpace:"nowrap",pointerEvents:"none",zIndex:3},po={...ln,color:"#18181c",fontWeight:600},uo={position:"absolute",left:0,top:0,pointerEvents:"none",overflow:"visible",zIndex:2},fo=(0,C.observer)(function({model:e}){let n=(0,ie.useRef)(null);return(0,ie.useEffect)(()=>{let r=n.current;if(!r)return;let i=new ResizeObserver(()=>{(0,Me.isAlive)(e)&&e.hoveredNode===null&&e.setLegendSize({width:r.offsetWidth,height:r.offsetHeight})});return i.observe(r),()=>{i.disconnect()}},[e]),(0,o.jsxs)("div",{ref:n,style:{...eo,top:ee+e.referenceStripZonePx},children:[(0,o.jsx)(so,{model:e}),(0,o.jsx)(Je,{model:e}),(0,o.jsx)($e,{model:e}),(0,o.jsx)(co,{model:e}),(0,o.jsx)(no,{model:e}),(0,o.jsx)(et,{model:e}),(0,o.jsx)(nt,{model:e}),(0,o.jsx)(oo,{model:e})]})}),mo=(0,C.observer)(function({model:e}){let n=e.overlayLabels.sizes,r=n.flatMap(({key:i,leader:s})=>s?[{key:i,...s}]:[]);return(0,o.jsxs)(o.Fragment,{children:[r.length>0?(0,o.jsx)("svg",{style:uo,width:e.paneWidth,height:e.canvasHeight,children:r.map(({key:i,arcX:s,arcY:p,labelX:l,labelY:d})=>(0,o.jsx)("line",{"data-testid":"graph-label-leader",x1:s,y1:p,x2:l,y2:d,stroke:"#18181c",strokeWidth:1},i))}):null,n.map(({key:i,text:s,x:p,y:l,kind:d})=>(0,o.jsx)("div",{"data-testid":"graph-size-label",style:{...d==="deletion"?po:ln,left:p,top:l},children:s},i))]})}),ho=(0,C.observer)(function({model:e}){let n=e.hoveredNode?e.nodeById?.get(e.hoveredNode):null,r=e.hoveredEdge!==null&&e.graph?e.graph.edges[e.hoveredEdge]:null,i=n?Xe(n):void 0,s=r?me(r,e.deletions.find(l=>l.edgeIndex===e.hoveredEdge),l=>e.nodeById?.get(l)?.name??l):void 0,p=e.hoveredWalkRowText;return(0,o.jsxs)(o.Fragment,{children:[p&&!n?(0,o.jsxs)("div",{style:xe,"data-testid":"graph-walk-row-tooltip",children:[(0,o.jsx)("strong",{children:p.label})," \u2014 ",p.readout]}):null,n?(0,o.jsxs)("div",{style:xe,children:[(0,o.jsx)("strong",{children:n.name})," \u2014"," ",n.length.toLocaleString()," bp, depth"," ",n.depth.toFixed(1),i?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("br",{}),i.sample," ",te(i)," (rank"," ",n.stable?.rank,")"]}):null]}):null,s?(0,o.jsx)("div",{style:xe,children:s.deletion?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("strong",{children:"Deletion"})," ",s.deletion.bp,(0,o.jsx)("br",{}),s.deletion.where]}):(0,o.jsxs)(o.Fragment,{children:["Edge: ",s.ends]})}):null]})}),go=(0,C.observer)(function({model:e,nodeId:n,top:r,left:i,onClose:s}){let{own:p,reference:l,highlight:d}=e.nodeLaunchTargets(n);return(0,o.jsx)(X.Menu,{open:!0,anchorReference:"anchorPosition",anchorPosition:{top:r,left:i},onClose:()=>{s()},onMenuItemClick:h=>{h()},menuItems:[{label:"Node details",icon:lt,onClick:()=>{e.showNodeDetails(n)}},...Ve({own:p,reference:l,highlight:d,onShowLinear:h=>{e.showInLinearView(h)},onHighlight:e.canHighlightInLinearView?h=>{e.highlightInLinearView(h)}:void 0})]})}),vo=(0,C.observer)(function({model:e,ownChrome:n=!0}){let{canvasRef:r,canvas:i,error:s,retry:p}=(0,an.useRenderingBackend)(rn,e),{handlers:l,contextNode:d,contextRow:h,closeContextMenu:u}=dt(e);oe(i,e);let m=e.facetPanels!==void 0;return(0,o.jsxs)("div",{style:jn,children:[n?(0,o.jsx)(Ot,{model:e}):null,(0,o.jsxs)("div",{style:Kn,onMouseEnter:()=>{e.setPointerInPane(!0)},onMouseLeave:()=>{(0,Me.isAlive)(e)&&e.setPointerInPane(!1)},children:[e.referenceStripShown?(0,o.jsx)("div",{style:{...Un,top:e.referenceStripZonePx,background:e.paperCss}}):null,(0,o.jsx)("canvas",{ref:r,"data-testid":"graph-genome-canvas",style:{width:e.paneWidth,height:e.canvasHeight,cursor:e.isPanning||e.draggingNode?"grabbing":"grab",touchAction:"none",overscrollBehavior:"contain",display:"block",position:"relative",zIndex:1},...l}),m?(0,o.jsx)(ut,{model:e,handlers:l}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(Qe,{model:e}),(0,o.jsx)(qe,{model:e}),(0,o.jsx)(Qn,{model:e}),(0,o.jsx)(mo,{model:e}),(0,o.jsx)(Ye,{model:e}),(0,o.jsx)(Ze,{model:e}),(0,o.jsx)(Ue,{model:e}),(0,o.jsx)(ot,{model:e}),(0,o.jsx)(on,{model:e}),(0,o.jsx)(fo,{model:e})]}),(0,o.jsx)(Yt,{model:e}),n?(0,o.jsx)("div",{style:qn,children:(0,o.jsx)(X.LoadingOverlay,{isVisible:e.isLoading,immediate:!e.layoutResult,statusMessage:e.statusMessage,onCancel:e.canCancelLoad?()=>{e.cancelLoad()}:void 0})}):null]}),e.walkStripShown?(0,o.jsx)(tn,{model:e}):null,(0,o.jsx)(ho,{model:e}),d?(0,o.jsx)(go,{model:e,nodeId:d.nodeId,top:d.top,left:d.left,onClose:u}):null,h?(0,o.jsx)(se,{model:e,row:h.row,top:h.top,left:h.left,onClose:u}):null,s?(0,o.jsx)(X.ErrorBanner,{error:s,onReset:p}):null,n&&e.error?(0,o.jsx)(X.ErrorBanner,{error:e.error,onReset:e.canRetryLoad?()=>{e.retryLoad()}:void 0}):null]})}),ba=vo;export{ba as a};
2
+ //# sourceMappingURL=chunk-OU6VYHKB.js.map