jbrowse-plugin-graphgenomeviewer 6.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chunks/GbzBaseSyntenyAdapter-MB7NQPOZ.js +8 -0
- package/dist/chunks/{GbzBaseSyntenyAdapter-TQVDD3OC.js.map → GbzBaseSyntenyAdapter-MB7NQPOZ.js.map} +3 -3
- package/dist/chunks/{GraphGenomeView-AY2FO4P2.js → GraphGenomeView-QAJUST4R.js} +2 -2
- package/dist/chunks/{GraphGenomeView-AY2FO4P2.js.map → GraphGenomeView-QAJUST4R.js.map} +1 -1
- package/dist/chunks/GraphTrackSettingsDialog-CLI6V424.js +4 -0
- package/dist/chunks/{GraphTrackSettingsDialog-QJXPMWYG.js.map → GraphTrackSettingsDialog-CLI6V424.js.map} +1 -1
- package/dist/chunks/LinearGraphDisplay-2ZCJVTOZ.js +2 -0
- package/dist/chunks/{LinearGraphDisplay-GKVG72J4.js.map → LinearGraphDisplay-2ZCJVTOZ.js.map} +1 -1
- package/dist/chunks/MinigraphBubbleAdapter-5AQXW2NH.js +2 -0
- package/dist/chunks/{MinigraphBubbleAdapter-CZYQROL2.js.map → MinigraphBubbleAdapter-5AQXW2NH.js.map} +1 -1
- package/dist/chunks/RgfaTabixAdapter-P3RQBV2A.js +3 -0
- package/dist/chunks/{RgfaTabixAdapter-LQGQXCVO.js.map → RgfaTabixAdapter-P3RQBV2A.js.map} +1 -1
- package/dist/chunks/{bandage-layout-UCRW4G4J.js → bandage-layout-3AR6BCUD-7PXT4PRO.js} +15 -15
- package/dist/chunks/bandage-layout-3AR6BCUD-7PXT4PRO.js.map +7 -0
- package/dist/chunks/chunk-3TODQETZ.js +2 -0
- package/dist/chunks/{chunk-LJZDHT2C.js.map → chunk-3TODQETZ.js.map} +1 -1
- package/dist/chunks/chunk-5TCH4S5W.js +2 -0
- package/dist/chunks/chunk-5TCH4S5W.js.map +7 -0
- package/dist/chunks/chunk-6YAGPYAT.js +3 -0
- package/dist/chunks/chunk-6YAGPYAT.js.map +7 -0
- package/dist/chunks/chunk-KTZHBWBF.js +5 -0
- package/dist/chunks/chunk-KTZHBWBF.js.map +7 -0
- package/dist/chunks/chunk-NRYLVZMG.js +3 -0
- package/dist/chunks/chunk-NRYLVZMG.js.map +7 -0
- package/dist/chunks/chunk-TIMQMQZE.js +2 -0
- package/dist/chunks/chunk-TIMQMQZE.js.map +7 -0
- package/dist/chunks/chunk-X7R52TDL.js +2 -0
- package/dist/chunks/chunk-X7R52TDL.js.map +7 -0
- package/dist/chunks/chunk-XEY4OTQ5.js +2 -0
- package/dist/chunks/chunk-XEY4OTQ5.js.map +7 -0
- package/dist/chunks/chunk-XYYKXQ73.js +2 -0
- package/dist/chunks/chunk-XYYKXQ73.js.map +7 -0
- package/dist/chunks/{chunk-S3X3QFQD.js → chunk-Y5WX5MAD.js} +2 -2
- package/dist/chunks/chunk-YBLNN5FU.js +1 -0
- package/dist/chunks/chunk-YBLNN5FU.js.map +7 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +3 -7
- package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +1 -1
- package/src/GraphGenomeView/components/TubeMapOverlay.tsx +1 -1
- package/src/GraphGenomeView/pane/fitViews.ts +1 -1
- package/src/version.ts +1 -1
- package/dist/chunks/GbzBaseSyntenyAdapter-TQVDD3OC.js +0 -8
- package/dist/chunks/GraphTrackSettingsDialog-QJXPMWYG.js +0 -4
- package/dist/chunks/LinearGraphDisplay-GKVG72J4.js +0 -2
- package/dist/chunks/MinigraphBubbleAdapter-CZYQROL2.js +0 -2
- package/dist/chunks/RgfaTabixAdapter-LQGQXCVO.js +0 -3
- package/dist/chunks/bandage-layout-UCRW4G4J.js.map +0 -7
- package/dist/chunks/chunk-2V27PV25.js +0 -3
- package/dist/chunks/chunk-2V27PV25.js.map +0 -7
- package/dist/chunks/chunk-7BKUWQE5.js +0 -2
- package/dist/chunks/chunk-7BKUWQE5.js.map +0 -7
- package/dist/chunks/chunk-FNHKEAKB.js +0 -5
- package/dist/chunks/chunk-FNHKEAKB.js.map +0 -7
- package/dist/chunks/chunk-K5Z47YVI.js +0 -2
- package/dist/chunks/chunk-K5Z47YVI.js.map +0 -7
- package/dist/chunks/chunk-KULNKXPT.js +0 -2
- package/dist/chunks/chunk-KULNKXPT.js.map +0 -7
- package/dist/chunks/chunk-LJZDHT2C.js +0 -2
- package/dist/chunks/chunk-NWJN4C4V.js +0 -2
- package/dist/chunks/chunk-NWJN4C4V.js.map +0 -7
- package/dist/chunks/chunk-SCMIJAAX.js +0 -3
- package/dist/chunks/chunk-SCMIJAAX.js.map +0 -7
- package/dist/chunks/chunk-UQEPPJEO.js +0 -2
- package/dist/chunks/chunk-UQEPPJEO.js.map +0 -7
- /package/dist/chunks/{chunk-S3X3QFQD.js.map → chunk-Y5WX5MAD.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["global-externals:@mui/material/SvgIcon", "global-externals:mobx", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/utils/createSvgIcon.mjs", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-UMNCCYBN.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-Y3IOTZJA.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ES2N6V56.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RX5CSWJW.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ZHCDYSA5.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-NNODIW4U.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3S3YVOJ7.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-MREQ7GIA.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-YMSSF2RK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-DKOB2OPC.js", "../../src/launchFromGraph/contributors.ts", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/CompareArrows.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/HighlightAlt.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/LineStyle.mjs", "../../src/launchFromGraph/graphMenuItems.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TEDQJPMI.js", "../../node_modules/.pnpm/@gmod+tubemap-core@0.1.0/node_modules/@gmod/tubemap-core/dist/types.js", "../../node_modules/.pnpm/@gmod+tubemap-core@0.1.0/node_modules/@gmod/tubemap-core/dist/layout.js", "../../node_modules/.pnpm/@gmod+tubemap-core@0.1.0/node_modules/@gmod/tubemap-core/dist/geometry.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-R6ZUK4Y3.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RVS2QCOX.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TZFWUT2C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LOEA5IHZ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L3O7AWLI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-HNQPEMYE.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-SZNZ2T6D.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-EZPBJPK6.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-T43W7NKK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-X4VVPLI5.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-6SBUFFTB.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-WOO7QYKB.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-PJESIRDU.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-V5BPIOLS.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-4BYTEJGW.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CH3DLBUT.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-GOY6REMT.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CS3E4ETM.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-GQ2AOHU4.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-EJ5OZTCK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CR7EGAFE.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CTSBC2O6.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-SMQ545MU.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@6.0.4/node_modules/@jbrowse/bandage-core/dist/tubeMap/deviations.js", "../../src/GraphGenomeView/repeats/walkCalls.ts", "../../node_modules/.pnpm/@mui+icons-material@9.4.0_@mui+material@9.4.0_@emotion+react@11.14.0_@types+react@19.3._3766ec55733e6b150ee672ad270cc236/node_modules/@mui/icons-material/Settings.mjs"],
|
|
4
|
+
"sourcesContent": ["module.exports = JBrowseExports[\"@mui/material/SvgIcon\"];", "module.exports = JBrowseExports[\"mobx\"];", "'use client';\n\nexport { createSvgIcon as default } from '@mui/material/SvgIcon';", "// src/renderer/colorBits.ts\nfunction packAbgr(r, g, b, a) {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0;\n}\nfunction abgrRed(c) {\n return c & 255;\n}\nfunction abgrGreen(c) {\n return c >>> 8 & 255;\n}\nfunction abgrBlue(c) {\n return c >>> 16 & 255;\n}\nfunction abgrAlpha(c) {\n return c >>> 24 & 255;\n}\nfunction abgrToCssRgba(c) {\n return `rgba(${abgrRed(c)},${abgrGreen(c)},${abgrBlue(c)},${abgrAlpha(c) / 255})`;\n}\nfunction normalizedRgbToCssRgba(c, alpha) {\n return `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${alpha})`;\n}\nfunction fadeAbgr(c, alpha) {\n return packAbgr(\n abgrRed(c),\n abgrGreen(c),\n abgrBlue(c),\n Math.round(abgrAlpha(c) * alpha)\n );\n}\nfunction brightenAbgr(c, factor) {\n return packAbgr(\n Math.min(255, Math.round(abgrRed(c) * factor)),\n Math.min(255, Math.round(abgrGreen(c) * factor)),\n Math.min(255, Math.round(abgrBlue(c) * factor)),\n abgrAlpha(c)\n );\n}\n\nexport {\n packAbgr,\n abgrRed,\n abgrGreen,\n abgrBlue,\n abgrAlpha,\n abgrToCssRgba,\n normalizedRgbToCssRgba,\n fadeAbgr,\n brightenAbgr\n};\n", "import {\n bypassedPoints\n} from \"./chunk-4EMPBO7S.js\";\nimport {\n computeEdgeCurves,\n edgeJoinOf,\n routedEdgeCurves,\n strandSides\n} from \"./chunk-2CVHXFK7.js\";\n\n// src/util/edgeCurves.ts\nvar cache = /* @__PURE__ */ new WeakMap();\nfunction baseEdgeCurves(nodePositions, graph, axis, deletions, version, routes, stranded = false) {\n const { scaleX, scaleY } = axis;\n const cached = cache.get(nodePositions);\n if (cached?.graph === graph && cached.scaleX === scaleX && cached.scaleY === scaleY && cached.deletions === deletions && cached.routes === routes && cached.stranded === stranded && cached.version === version) {\n return cached.curves;\n }\n const curves = /* @__PURE__ */ new Map();\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const edge = graph.edges[ei];\n const from = nodePositions[edge.from];\n const to = nodePositions[edge.to];\n if (from?.length && to?.length) {\n const bypassed = deletions?.get(ei);\n const route = bypassed && routes?.[ei];\n curves.set(\n ei,\n route ? routedEdgeCurves(\n from,\n to,\n route,\n stranded ? strandSides(edge) : void 0\n ) : computeEdgeCurves(\n from,\n to,\n edgeJoinOf(edge, stranded),\n 0,\n 0,\n axis,\n bypassed ? bypassedPoints(nodePositions, bypassed) : []\n )\n );\n }\n }\n cache.set(nodePositions, {\n graph,\n scaleX,\n scaleY,\n deletions,\n routes,\n stranded,\n version,\n curves\n });\n return curves;\n}\n\nexport {\n baseEdgeCurves\n};\n", "import {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/referenceSpan.ts\nvar MAX_BACKBONE_HOPS = 4;\nfunction buildNeighbors(graph) {\n const neighbors = /* @__PURE__ */ new Map();\n function add(from, to) {\n const list = neighbors.get(from);\n if (list) {\n list.push(to);\n } else {\n neighbors.set(from, [to]);\n }\n }\n for (const edge of graph.edges) {\n add(edge.from, edge.to);\n add(edge.to, edge.from);\n }\n return neighbors;\n}\nfunction flankingSpan({\n nodeId,\n nodeById,\n neighbors\n}) {\n const seen = /* @__PURE__ */ new Set([nodeId]);\n let frontier = [nodeId];\n let minEnd = Infinity;\n let maxStart = -Infinity;\n for (let hop = 0; hop < MAX_BACKBONE_HOPS && frontier.length > 0; hop++) {\n const next = [];\n for (const id of frontier) {\n const adjacent = neighbors.get(id);\n if (adjacent) {\n for (const neighborId of adjacent) {\n if (!seen.has(neighborId)) {\n seen.add(neighborId);\n const neighbor = nodeById.get(neighborId);\n if (neighbor && isBackbone(neighbor)) {\n minEnd = Math.min(minEnd, neighbor.stable.start + neighbor.length);\n maxStart = Math.max(maxStart, neighbor.stable.start);\n } else {\n next.push(neighborId);\n }\n }\n }\n }\n }\n frontier = next;\n }\n return minEnd === Infinity ? void 0 : {\n start: Math.min(minEnd, maxStart),\n end: Math.max(minEnd, maxStart)\n };\n}\nfunction nodeReferenceSpan({\n nodeId,\n nodeById,\n neighbors\n}) {\n const node = nodeById.get(nodeId);\n return node === void 0 ? void 0 : isBackbone(node) ? { start: node.stable.start, end: node.stable.start + node.length } : flankingSpan({ nodeId, nodeById, neighbors });\n}\nfunction referenceMidpoints(graph) {\n const nodeById = new Map(graph.nodes.map((node) => [node.id, node]));\n const neighbors = buildNeighbors(graph);\n const midpoints = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n const span = nodeReferenceSpan({ nodeId: node.id, nodeById, neighbors });\n if (span) {\n midpoints.set(node.id, (span.start + span.end) / 2);\n }\n }\n return midpoints;\n}\n\nexport {\n buildNeighbors,\n nodeReferenceSpan,\n referenceMidpoints\n};\n", "import {\n abgrToCssRgba,\n fadeAbgr,\n packAbgr\n} from \"./chunk-UMNCCYBN.js\";\nimport {\n baseEdgeCurves\n} from \"./chunk-Y3IOTZJA.js\";\nimport {\n PATH_LIGHTNESS,\n PATH_SATURATION,\n nameHue,\n pathHueAt\n} from \"./chunk-X5L37W4J.js\";\nimport {\n referenceMidpoints\n} from \"./chunk-ES2N6V56.js\";\nimport {\n meanDepth,\n nodeWidthPx\n} from \"./chunk-PBENCR5L.js\";\nimport {\n dashCurves,\n pathRibbonOffsets,\n strandSides,\n translateCurves,\n yToXOf\n} from \"./chunk-2CVHXFK7.js\";\n\n// src/renderer/GeometryBuilder.ts\nvar EDGE_DEFAULT_COLOR = packAbgr(119, 119, 119, 217);\nvar EDGE_PATH_FALLBACK_COLOR = packAbgr(136, 136, 136, 217);\nvar EDGE_DELETION_COLOR = packAbgr(24, 24, 28, 240);\nvar DELETION_THICKNESS_FACTOR = 2.2;\nvar LIFT_BACKDROP_COLOR = packAbgr(160, 160, 160, 255);\nvar FADED_ALPHA = 0.18;\nvar LIFT_BACKDROP_CSS = abgrToCssRgba(\n fadeAbgr(LIFT_BACKDROP_COLOR, FADED_ALPHA)\n);\nvar DELETION_DASH_PX = 11;\nvar MIN_PATH_STRIPE_PX = 1.2;\nvar MIN_WALK_LANE_PX = 4;\nvar MIN_SCALE_FOR_OFFSET = 1e-6;\nvar ARROW_LENGTH_BASE_PX = 7;\nvar ARROW_LENGTH_PER_EDGE_PX = 3;\nvar ARROW_HALF_WIDTH_BASE_PX = 3;\nvar ARROW_HALF_WIDTH_PER_EDGE_PX = 1.5;\nvar MIN_LINK_HEADS = 3;\nvar MIN_ARROW_FIT = 0.5;\nvar MIN_ARROW_SCALE = 0.45;\nvar ARROW_CURVE_STEPS = 12;\nvar ABUTTING_PX = 1e-6;\nvar walkX = new Float64Array(64);\nvar walkY = new Float64Array(64);\nvar walkPx = new Float64Array(64);\nfunction backFromEnd(curves, scale, yToX, untilPx) {\n const most = curves.length * ARROW_CURVE_STEPS + 1;\n if (walkX.length < most) {\n walkX = new Float64Array(most);\n walkY = new Float64Array(most);\n walkPx = new Float64Array(most);\n }\n const last = curves[curves.length - 1];\n walkX[0] = last.x1;\n walkY[0] = last.y1;\n walkPx[0] = 0;\n let n = 1;\n let px = 0;\n for (let ci = curves.length - 1; ci >= 0 && px < untilPx; ci--) {\n const c = curves[ci];\n for (let k = 1; k <= ARROW_CURVE_STEPS && px < untilPx; k++) {\n const t = 1 - (k / ARROW_CURVE_STEPS) ** 2;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const d = 3 * u * t * t;\n const e = t * t * t;\n const x = a * c.x0 + b * c.cx0 + d * c.cx1 + e * c.x1;\n const y = a * c.y0 + b * c.cy0 + d * c.cy1 + e * c.y1;\n px += Math.hypot(x - walkX[n - 1], (y - walkY[n - 1]) * yToX) * scale;\n walkX[n] = x;\n walkY[n] = y;\n walkPx[n] = px;\n n++;\n }\n }\n return n;\n}\nfunction walkPointAt(n, px) {\n let i = 1;\n while (i < n - 1 && walkPx[i] < px) {\n i++;\n }\n const from = walkPx[i - 1];\n const to = walkPx[i];\n const f = to > from ? Math.min(1, Math.max(0, (px - from) / (to - from))) : 0;\n return {\n x: walkX[i - 1] + (walkX[i] - walkX[i - 1]) * f,\n y: walkY[i - 1] + (walkY[i] - walkY[i - 1]) * f\n };\n}\nfunction arrowheadFor({\n curves,\n edgeHalfWidth,\n nodeHalfWidth,\n scale,\n yToX,\n color,\n fromSegments,\n toSegments\n}) {\n const length = ARROW_LENGTH_BASE_PX + ARROW_LENGTH_PER_EDGE_PX * edgeHalfWidth;\n const n = backFromEnd(\n curves,\n scale,\n yToX,\n nodeHalfWidth + MIN_LINK_HEADS * length\n );\n const lengthPx = walkPx[n - 1];\n const abutting = lengthPx < ABUTTING_PX;\n const inset = Math.min(nodeHalfWidth, lengthPx);\n const fit = abutting ? Math.min(1, polylinePx(fromSegments, scale, yToX) / length) : 1;\n if (abutting ? fit < MIN_ARROW_FIT : lengthPx < MIN_LINK_HEADS * length) {\n return void 0;\n }\n const tip = walkPointAt(n, inset);\n const base = walkPointAt(n, inset + length * fit);\n const dx = tip.x - base.x;\n const dy = (tip.y - base.y) * yToX;\n const last = curves[curves.length - 1];\n return {\n x: tip.x,\n y: tip.y,\n angle: Math.hypot(dx, dy) > 0 ? Math.atan2(dy, dx) : endTangent(last, yToX, intoDirection(last, toSegments)),\n length: length * fit,\n halfWidth: (ARROW_HALF_WIDTH_BASE_PX + ARROW_HALF_WIDTH_PER_EDGE_PX * edgeHalfWidth) * fit,\n color\n };\n}\nfunction polylinePx(segments, scale, yToX) {\n let length = 0;\n for (let i = 1; i < segments.length; i++) {\n length += Math.hypot(\n segments[i].x - segments[i - 1].x,\n (segments[i].y - segments[i - 1].y) * yToX\n );\n }\n return length * scale;\n}\nfunction leavesStart(edge, segments, first, stranded, yToX) {\n if (stranded) {\n return strandSides(edge).from === \"start\";\n }\n const gap = (p) => Math.hypot(p.x - first.x0, (p.y - first.y0) * yToX);\n return gap(segments[0]) < gap(segments.at(-1));\n}\nfunction intoDirection(last, toSegments) {\n if (toSegments.length < 2) {\n return void 0;\n }\n const first = toSegments[0];\n const final = toSegments[toSegments.length - 1];\n const atStart = Math.hypot(last.x1 - first.x, last.y1 - first.y) <= Math.hypot(last.x1 - final.x, last.y1 - final.y);\n return atStart ? { from: first, to: toSegments[1] } : { from: final, to: toSegments[toSegments.length - 2] };\n}\nfunction pointNormalsOf(rawPoints, yToX = 1) {\n const points = yToX === 1 ? rawPoints : rawPoints.map((p) => ({ x: p.x, y: p.y * yToX }));\n const pointNormals = [];\n for (let i = 0; i < points.length; i++) {\n let nx = 0;\n let ny = 0;\n if (i === 0) {\n const dx = points[1].x - points[0].x;\n const dy = points[1].y - points[0].y;\n const len = Math.hypot(dx, dy);\n if (len > 0) {\n nx = -dy / len;\n ny = dx / len;\n }\n } else if (i === points.length - 1) {\n const dx = points[i].x - points[i - 1].x;\n const dy = points[i].y - points[i - 1].y;\n const len = Math.hypot(dx, dy);\n if (len > 0) {\n nx = -dy / len;\n ny = dx / len;\n }\n } else {\n const dx1 = points[i].x - points[i - 1].x;\n const dy1 = points[i].y - points[i - 1].y;\n const len1 = Math.hypot(dx1, dy1);\n const dx2 = points[i + 1].x - points[i].x;\n const dy2 = points[i + 1].y - points[i].y;\n const len2 = Math.hypot(dx2, dy2);\n if (len1 > 0 && len2 > 0) {\n const nx1 = -dy1 / len1;\n const ny1 = dx1 / len1;\n const nx2 = -dy2 / len2;\n const ny2 = dx2 / len2;\n nx = (nx1 + nx2) / 2;\n ny = (ny1 + ny2) / 2;\n const dot = nx1 * nx + ny1 * ny;\n if (dot > 0.1) {\n nx /= dot;\n ny /= dot;\n }\n } else if (len1 > 0) {\n nx = -dy1 / len1;\n ny = dx1 / len1;\n } else if (len2 > 0) {\n nx = -dy2 / len2;\n ny = dx2 / len2;\n }\n }\n pointNormals.push({ nx, ny });\n }\n return pointNormals;\n}\nfunction offsetPolyline(points, normals, distance, yToX = 1) {\n return points.map((p, i) => ({\n x: p.x + normals[i].nx * distance,\n y: p.y + normals[i].ny * distance / yToX\n }));\n}\nfunction packNorm(r, g, b, a) {\n return packAbgr(\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n Math.round(a * 255)\n );\n}\nfunction hslToRgb(h, s, l) {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(h / 60 % 2 - 1));\n const m = l - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n return [r + m, g + m, b + m];\n}\nvar DEPTH_GRADIENT = [\n [68, 1, 84],\n [59, 82, 139],\n [33, 145, 140],\n [94, 201, 98],\n [253, 231, 37]\n];\nvar STABLE_RANK_GRADIENT = [\n [237, 137, 44],\n [158, 42, 122]\n];\nvar NODE_LENGTH_GRADIENT = [\n [220, 50, 50],\n [50, 120, 220]\n];\nfunction sampleGradient(stops, t) {\n const pos = Math.max(0, Math.min(1, t)) * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(pos));\n const f = pos - i;\n const a = stops[i];\n const b = stops[i + 1];\n return packAbgr(\n Math.round(a[0] + (b[0] - a[0]) * f),\n Math.round(a[1] + (b[1] - a[1]) * f),\n Math.round(a[2] + (b[2] - a[2]) * f),\n 255\n );\n}\nfunction hashColor(str, alpha) {\n const [r, g, b] = hslToRgb(nameHue(str), PATH_SATURATION, PATH_LIGHTNESS);\n return packNorm(r, g, b, alpha);\n}\nvar REFERENCE_RAMP_MAX_HUE = 300;\nvar REFERENCE_RAMP_SATURATION = 0.7;\nvar REFERENCE_RAMP_LIGHTNESS = 0.5;\nvar REFERENCE_RAMP_ALT_RGB = [60, 65, 72];\nvar REFERENCE_RAMP_ALT_COLOR = packAbgr(...REFERENCE_RAMP_ALT_RGB, 255);\nvar REFERENCE_RAMP_ALT_CSS = `rgb(${REFERENCE_RAMP_ALT_RGB.join(\", \")})`;\nfunction computeReferenceRamp(graph, domain) {\n const midpoints = referenceMidpoints(graph);\n if (domain && domain.end > domain.start) {\n return {\n start: domain.start,\n span: domain.end - domain.start,\n midpoints\n };\n }\n let min = Infinity;\n let max = -Infinity;\n for (const mid of midpoints.values()) {\n min = Math.min(min, mid);\n max = Math.max(max, mid);\n }\n return {\n start: min === Infinity ? 0 : min,\n span: max > min ? max - min : 1,\n midpoints\n };\n}\nfunction computeColorSchemeRange(graph) {\n let minDepth = Infinity;\n let maxDepth = -Infinity;\n let minLength = Infinity;\n let maxLength = -Infinity;\n let maxRank = 0;\n for (const n of graph.nodes) {\n if (n.stable !== void 0 && n.stable.rank > maxRank) {\n maxRank = n.stable.rank;\n }\n if (n.depth < minDepth) {\n minDepth = n.depth;\n }\n if (n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n if (n.length < minLength) {\n minLength = n.length;\n }\n if (n.length > maxLength) {\n maxLength = n.length;\n }\n }\n return {\n minDepth,\n maxDepth,\n minLength,\n maxLength,\n maxRank,\n nodeCount: graph.nodes.length\n };\n}\nfunction getNodeColor(node, nodeIndex, colorScheme, range) {\n switch (colorScheme) {\n case \"random\":\n return hashColor(node.id, 1);\n case \"depth\":\n return sampleGradient(\n DEPTH_GRADIENT,\n range.maxDepth > range.minDepth ? (node.depth - range.minDepth) / (range.maxDepth - range.minDepth) : 0.5\n );\n case \"node-length\":\n return sampleGradient(\n NODE_LENGTH_GRADIENT,\n range.maxLength > range.minLength ? (node.length - range.minLength) / (range.maxLength - range.minLength) : 0.5\n );\n // rGFA states the backbone rather than leaving it to be inferred: rank 0 is\n // the reference, higher ranks are the sequence that diverges from it. A\n // graph with no SR tags draws every node as unranked.\n case \"stable-rank\":\n return node.stable === void 0 ? packAbgr(160, 160, 160, 255) : node.stable.rank === 0 ? packAbgr(52, 152, 219, 255) : sampleGradient(\n STABLE_RANK_GRADIENT,\n range.maxRank > 1 ? (node.stable.rank - 1) / (range.maxRank - 1) : 0\n );\n // Position on the reference, the one quantity both panels of a\n // graph-over-linear figure can state. A node with no reference position at\n // all \u2014 nothing anchored, or an allele whose flanks fell outside the cut \u2014\n // is grey rather than a hue it has not earned.\n case \"reference-position\": {\n const ramp = range.referenceRamp;\n const mid = ramp?.midpoints.get(node.id);\n if (ramp === void 0 || mid === void 0) {\n return packAbgr(160, 160, 160, 255);\n }\n if (node.stable !== void 0 && node.stable.rank > 0) {\n return REFERENCE_RAMP_ALT_COLOR;\n }\n const frac = Math.max(0, Math.min(1, (mid - ramp.start) / ramp.span));\n const [r, g, b] = hslToRgb(\n frac * REFERENCE_RAMP_MAX_HUE,\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n );\n return packNorm(r, g, b, 1);\n }\n case \"grey\":\n return packAbgr(160, 160, 160, 255);\n case \"rainbow\": {\n const hue = range.nodeCount > 1 ? nodeIndex / range.nodeCount * 360 : 0;\n const [r, g, b] = hslToRgb(hue, 0.75, 0.5);\n return packNorm(r, g, b, 1);\n }\n default:\n return packAbgr(52, 152, 219, 255);\n }\n}\nfunction endTangent(c, yToX = 1, into) {\n const candidates = [\n [c.cx1, c.cy1],\n [c.cx0, c.cy0],\n [c.x0, c.y0]\n ];\n for (const [x, y] of candidates) {\n const dx = c.x1 - x;\n const dy = (c.y1 - y) * yToX;\n if (Math.hypot(dx, dy) > 0) {\n return Math.atan2(dy, dx);\n }\n }\n return into ? Math.atan2((into.to.y - into.from.y) * yToX, into.to.x - into.from.x) : 0;\n}\nfunction isPolylineInBounds(segments, bounds) {\n let hit = false;\n for (let i = 0; i < segments.length - 1 && !hit; i++) {\n const a = segments[i];\n const b = segments[i + 1];\n hit = Math.max(a.x, b.x) >= bounds.minX && Math.min(a.x, b.x) <= bounds.maxX && Math.max(a.y, b.y) >= bounds.minY && Math.min(a.y, b.y) <= bounds.maxY;\n }\n return hit;\n}\nfunction isBezierInBounds(curves, bounds) {\n for (const c of curves) {\n const cMinX = Math.min(c.x0, c.cx0, c.cx1, c.x1);\n const cMaxX = Math.max(c.x0, c.cx0, c.cx1, c.x1);\n const cMinY = Math.min(c.y0, c.cy0, c.cy1, c.y1);\n const cMaxY = Math.max(c.y0, c.cy0, c.cy1, c.y1);\n if (cMaxX >= bounds.minX && cMinX <= bounds.maxX && cMaxY >= bounds.minY && cMinY <= bounds.maxY) {\n return true;\n }\n }\n return false;\n}\nvar paletteCache = /* @__PURE__ */ new WeakMap();\nfunction pathPaletteOf(graph) {\n let palette = paletteCache.get(graph);\n if (!palette) {\n const pathColorByIndex = [];\n const pathIndexByName = /* @__PURE__ */ new Map();\n const paths = graph.paths ?? [];\n for (let i = 0; i < paths.length; i++) {\n const [r, g, b] = hslToRgb(\n pathHueAt(i, paths.length),\n PATH_SATURATION,\n PATH_LIGHTNESS\n );\n pathColorByIndex.push(packNorm(r, g, b, 0.85));\n if (!pathIndexByName.has(paths[i].name)) {\n pathIndexByName.set(paths[i].name, i);\n }\n }\n palette = { pathColorByIndex, pathIndexByName };\n paletteCache.set(graph, palette);\n }\n return palette;\n}\nvar slotsCache = /* @__PURE__ */ new WeakMap();\nvar NO_SLOTS = /* @__PURE__ */ new Map();\nfunction pathSlotsOf(graph) {\n let slots = slotsCache.get(graph);\n if (!slots) {\n slots = /* @__PURE__ */ new Map();\n for (const [pathIdx, path] of (graph.paths ?? []).entries()) {\n for (const nodeId of new Set(path.nodeIds)) {\n const visits = slots.get(nodeId);\n if (visits) {\n visits.push(pathIdx);\n } else {\n slots.set(nodeId, [pathIdx]);\n }\n }\n }\n slotsCache.set(graph, slots);\n }\n return slots;\n}\nfunction buildGeometry(options) {\n const {\n nodePositions,\n graph,\n nodeById,\n colorScheme,\n contigThickness,\n connectorThickness,\n drawPaths,\n nodeWidth = \"uniform\",\n highlight,\n axis,\n linearLayout,\n viewportBounds,\n referenceRamp,\n deletions,\n deletionRoutes,\n stranded,\n hiddenEdges,\n version = 0\n } = options;\n const depthNorm = nodeWidth === \"depth\" ? meanDepth(graph) : 0;\n const scale = axis.scaleX;\n const yToX = yToXOf(axis);\n const sharedCurves = baseEdgeCurves(\n nodePositions,\n graph,\n axis,\n deletions,\n version,\n deletionRoutes,\n stranded\n );\n const nodeStrokes = [];\n const nodeStrokeRuns = /* @__PURE__ */ new Map();\n const arrows = [];\n const arrowRuns = /* @__PURE__ */ new Map();\n const edgeCurves = [];\n const edgeCurveRuns = /* @__PURE__ */ new Map();\n const colorRange = { ...computeColorSchemeRange(graph), referenceRamp };\n const nodeIndexMap = /* @__PURE__ */ new Map();\n if (colorScheme === \"rainbow\") {\n for (let i = 0; i < graph.nodes.length; i++) {\n nodeIndexMap.set(graph.nodes[i].id, i);\n }\n }\n const pathCount = graph.paths?.length ?? 0;\n const { pathColorByIndex, pathIndexByName } = pathPaletteOf(graph);\n const pathColorByName = (name) => pathColorByIndex[pathIndexByName.get(name) ?? -1] ?? EDGE_PATH_FALLBACK_COLOR;\n const nodePathSlots = drawPaths && pathCount > 1 ? pathSlotsOf(graph) : NO_SLOTS;\n const showArrows = scale > (linearLayout ? 1 : MIN_ARROW_SCALE);\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const edge = graph.edges[ei];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n const baseCurves = sharedCurves.get(ei);\n if (!fromSegments?.length || !toSegments?.length || !baseCurves || hiddenEdges?.has(ei)) {\n continue;\n }\n const numPaths = edge.pathIds?.length ?? 0;\n const bypassed = deletions?.get(ei);\n const isDeletion = bypassed !== void 0;\n const onWalk = highlight?.edgeIndexes.has(ei) ?? false;\n const edgeThickness = connectorThickness / 2 * (isDeletion ? DELETION_THICKNESS_FACTOR : 1);\n const ribbons = drawPaths && numPaths > 0;\n const plainEdgeColor = isDeletion ? EDGE_DELETION_COLOR : EDGE_DEFAULT_COLOR;\n const edgeColor = !highlight || onWalk ? plainEdgeColor : fadeAbgr(plainEdgeColor, FADED_ALPHA);\n const toNode = nodeById.get(edge.to);\n const intoHalfWidth = (toNode ? nodeWidthPx(toNode, contigThickness, nodeWidth, depthNorm) : contigThickness) / 2;\n const buildSingleEdge = (offsetX, offsetY, color, arrowColor) => {\n const curves = offsetX === 0 && offsetY === 0 ? baseCurves : translateCurves(baseCurves, offsetX, offsetY);\n if (viewportBounds && !isBezierInBounds(curves, viewportBounds)) {\n return;\n }\n if (isDeletion) {\n for (const dash of dashCurves(curves, DELETION_DASH_PX / scale)) {\n edgeCurves.push({ curves: dash, thickness: edgeThickness, color });\n }\n } else {\n edgeCurves.push({ curves, thickness: edgeThickness, color });\n }\n const head = showArrows && arrowColor !== void 0 ? arrowheadFor({\n curves,\n edgeHalfWidth: connectorThickness / 2,\n nodeHalfWidth: intoHalfWidth,\n scale,\n yToX,\n color: arrowColor,\n fromSegments,\n toSegments\n }) : void 0;\n if (head) {\n arrows.push(head);\n }\n };\n const edgeCurveStart = edgeCurves.length;\n const arrowStart = arrows.length;\n const laneWalks = highlight && onWalk && !ribbons ? highlight.walks : void 0;\n if (laneWalks) {\n const fromNode = nodeById.get(edge.from);\n const width = fromNode ? nodeWidthPx(fromNode, contigThickness, nodeWidth, depthNorm) : contigThickness;\n const laneWidth = Math.max(width / laneWalks.length, MIN_WALK_LANE_PX);\n const normals = pointNormalsOf(fromSegments, yToX);\n const { nx, ny } = (leavesStart(\n edge,\n fromSegments,\n baseCurves[0],\n stranded,\n yToX\n ) ? normals[0] : normals.at(-1)) ?? {\n nx: 0,\n ny: 0\n };\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\n laneWalks.forEach((walk, lane) => {\n if (!walk.edgeIndexes.has(ei)) {\n return;\n }\n const offset = (lane - (laneWalks.length - 1) / 2) * laneWidth * worldPerScreenPx;\n const curves = offset === 0 ? baseCurves : translateCurves(baseCurves, nx * offset, ny * offset / yToX);\n if (viewportBounds && !isBezierInBounds(curves, viewportBounds)) {\n return;\n }\n edgeCurves.push({\n curves,\n thickness: laneWidth / 2,\n color: walk.colors.get(edge.from) ?? walk.colors.get(edge.to) ?? plainEdgeColor\n });\n });\n } else if (!ribbons) {\n buildSingleEdge(0, 0, edgeColor, edgeColor);\n } else {\n const offsets = pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n );\n const arrowRibbon = Math.floor((numPaths - 1) / 2);\n for (let pathIdx = 0; pathIdx < numPaths; pathIdx++) {\n const offset = offsets[pathIdx];\n const ribbonColor = pathColorByName(edge.pathIds[pathIdx]);\n buildSingleEdge(\n offset.x,\n offset.y,\n highlight && !highlight.names.has(edge.pathIds[pathIdx]) ? fadeAbgr(ribbonColor, FADED_ALPHA) : ribbonColor,\n pathIdx === arrowRibbon ? edgeColor : void 0\n );\n }\n }\n const edgeCurveCount = edgeCurves.length - edgeCurveStart;\n if (edgeCurveCount > 0) {\n edgeCurveRuns.set(ei, { start: edgeCurveStart, count: edgeCurveCount });\n }\n const arrowCount = arrows.length - arrowStart;\n if (arrowCount > 0) {\n arrowRuns.set(ei, { start: arrowStart, count: arrowCount });\n }\n }\n for (const [nodeId, segments] of Object.entries(nodePositions)) {\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n if (viewportBounds && !isPolylineInBounds(segments, viewportBounds)) {\n continue;\n }\n const faded = highlight !== void 0 && !highlight.nodeIds.has(nodeId);\n const own = faded ? LIFT_BACKDROP_COLOR : getNodeColor(\n node,\n nodeIndexMap.get(nodeId) ?? 0,\n colorScheme,\n colorRange\n );\n const color = faded ? fadeAbgr(own, FADED_ALPHA) : own;\n const width = nodeWidthPx(node, contigThickness, nodeWidth, depthNorm);\n const nodeThickness = width / 2;\n const start = nodeStrokes.length;\n const slots = nodePathSlots.get(nodeId);\n const slotWidth = width / pathCount;\n const drawable = segments.length >= 2;\n const lanes = highlight && !faded && !slots?.length ? highlight.walks : void 0;\n if (drawable && lanes) {\n const laneWidth = Math.max(width / lanes.length, MIN_WALK_LANE_PX);\n const normals = pointNormalsOf(segments, yToX);\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\n lanes.forEach((walk, lane) => {\n const laneColor = walk.colors.get(nodeId);\n if (laneColor === void 0) {\n return;\n }\n const offset = (lane - (lanes.length - 1) / 2) * laneWidth * worldPerScreenPx;\n nodeStrokes.push({\n points: lanes.length === 1 ? segments : offsetPolyline(segments, normals, offset, yToX),\n thickness: laneWidth / 2,\n color: laneColor\n });\n });\n } else if (drawable && slots?.length && slotWidth >= MIN_PATH_STRIPE_PX) {\n const normals = pointNormalsOf(segments, yToX);\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\n for (const slot of slots) {\n const offset = (slot - (pathCount - 1) / 2) * slotWidth * worldPerScreenPx;\n const stripe = pathColorByIndex[slot] ?? EDGE_PATH_FALLBACK_COLOR;\n nodeStrokes.push({\n points: offsetPolyline(segments, normals, offset, yToX),\n thickness: slotWidth / 2,\n // a node off the lifted walk fades whichever way it is painted\n color: faded ? fadeAbgr(stripe, FADED_ALPHA) : stripe\n });\n }\n } else if (drawable) {\n nodeStrokes.push({ points: segments, thickness: nodeThickness, color });\n }\n const count = nodeStrokes.length - start;\n if (count > 0) {\n nodeStrokeRuns.set(nodeId, { start, count });\n }\n }\n return {\n nodeStrokes,\n nodeStrokeRuns,\n arrows,\n arrowRuns,\n edgeCurves,\n edgeCurveRuns\n };\n}\n\nexport {\n LIFT_BACKDROP_COLOR,\n FADED_ALPHA,\n LIFT_BACKDROP_CSS,\n hslToRgb,\n REFERENCE_RAMP_MAX_HUE,\n REFERENCE_RAMP_ALT_COLOR,\n REFERENCE_RAMP_ALT_CSS,\n computeReferenceRamp,\n computeColorSchemeRange,\n getNodeColor,\n endTangent,\n buildGeometry\n};\n", "import {\n REFERENCE_RAMP_MAX_HUE\n} from \"./chunk-RX5CSWJW.js\";\n\n// src/referenceRampCss.ts\nfunction rampHueCss(hue) {\n return `hsl(${hue}, 70%, 50%)`;\n}\nfunction rampHue(bp, domain) {\n const frac = (bp - domain.start) / (domain.end - domain.start);\n return Math.max(0, Math.min(1, frac)) * REFERENCE_RAMP_MAX_HUE;\n}\nvar HUE_STOP_DEG = 30;\nfunction rampStops({ start, bp, reversed }, domain) {\n const low = rampHue(start, domain);\n const high = rampHue(start + bp, domain);\n if (high - low < 1) {\n return [(low + high) / 2];\n }\n const n = Math.ceil((high - low) / HUE_STOP_DEG);\n return Array.from(\n { length: n + 1 },\n (_, i) => rampHue(start + bp * (reversed ? n - i : i) / n, domain)\n );\n}\nvar RAMP_GRADIENT_STOPS = Array.from({ length: 7 }, (_, i) => ({\n offset: i / 6,\n color: rampHueCss(i / 6 * REFERENCE_RAMP_MAX_HUE)\n}));\nvar RAMP_GRADIENT_CSS = `linear-gradient(to right, ${RAMP_GRADIENT_STOPS.map(\n (s) => `${s.color} ${s.offset * 100}%`\n).join(\", \")})`;\n\nexport {\n rampHueCss,\n rampHue,\n rampStops,\n RAMP_GRADIENT_STOPS,\n RAMP_GRADIENT_CSS\n};\n", "// src/el.ts\nfunction el(tag, attrs = {}, ...children) {\n return {\n tag,\n attrs,\n children: children.filter((c) => !!c || c === \"\")\n };\n}\nfunction escapeText(s) {\n return s.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\nfunction escapeAttr(s) {\n return escapeText(s).replaceAll('\"', \""\");\n}\nfunction serializeEl(node) {\n if (typeof node === \"string\") {\n return escapeText(node);\n }\n const attrs = Object.entries(node.attrs).filter(([, v]) => v !== void 0).map(([k, v]) => ` ${k}=\"${escapeAttr(String(v))}\"`).join(\"\");\n return `<${node.tag}${attrs}>${node.children.map(serializeEl).join(\"\")}</${node.tag}>`;\n}\n\nexport {\n el,\n serializeEl\n};\n", "import {\n el\n} from \"./chunk-NNODIW4U.js\";\n\n// src/genes/exonOutline.ts\nvar EXON_COLOR = \"#daa520\";\nvar EXON_GAP_PX = 1;\nvar EXON_LINE_PX = 2;\nvar MIN_LANE_PX = 4;\nfunction exonStretches(pins, halfWidthPx, lift, pathOf = (d) => d) {\n const inkPx = (nodeId) => {\n const own = halfWidthPx(nodeId) * 2;\n return lift?.nodeIds.has(nodeId) ? Math.max(own, lift.walks.length * MIN_LANE_PX) : own;\n };\n return pins.flatMap(\n (pin) => pin.exonsByNode.map(({ nodeId, d }) => ({\n key: `${pin.gene.name}-${pin.gene.start}-${nodeId}`,\n d: pathOf(d),\n inner: inkPx(nodeId) + 2 * EXON_GAP_PX\n }))\n );\n}\nfunction exonOutlineTree(stretches, o) {\n if (stretches.length === 0) {\n return void 0;\n }\n const stroke = (s, color, width) => el(\"path\", {\n d: s.d,\n fill: \"none\",\n stroke: color,\n \"stroke-width\": width,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"vector-effect\": o.transform ? \"non-scaling-stroke\" : void 0\n });\n return el(\n \"g\",\n {},\n el(\n \"mask\",\n {\n id: o.id,\n maskUnits: \"userSpaceOnUse\",\n x: 0,\n y: 0,\n width: o.width,\n height: o.height\n },\n el(\n \"g\",\n { transform: o.transform },\n ...stretches.map((s) => stroke(s, \"#fff\", s.inner + 2 * EXON_LINE_PX)),\n ...stretches.map((s) => stroke(s, \"#000\", s.inner))\n )\n ),\n el(\"rect\", {\n width: o.width,\n height: o.height,\n fill: EXON_COLOR,\n mask: `url(#${o.id})`\n })\n );\n}\n\nexport {\n EXON_COLOR,\n exonStretches,\n exonOutlineTree\n};\n", "import {\n baseEdgeCurves\n} from \"./chunk-Y3IOTZJA.js\";\nimport {\n curveBounds,\n pathRibbonOffsets\n} from \"./chunk-2CVHXFK7.js\";\n\n// src/util/SpatialIndex.ts\nvar FALLBACK_CELL_SIZE = 50;\nfunction meanExtentCellSize(extentTotal, count) {\n return count > 0 ? Math.max(1, extentTotal / count) : FALLBACK_CELL_SIZE;\n}\nfunction rowPitchOf(boxes) {\n const distinct = /* @__PURE__ */ new Set();\n let min = Infinity;\n let max = -Infinity;\n for (const box of boxes) {\n distinct.add(box.minY);\n min = Math.min(min, box.minY);\n max = Math.max(max, box.minY);\n }\n return distinct.size > 1 ? (max - min) / (distinct.size - 1) : void 0;\n}\nfunction cellSizeFrom(boxes, extentX, extentY) {\n const x = meanExtentCellSize(extentX, boxes.length);\n return {\n x,\n y: extentY > 0 ? meanExtentCellSize(extentY, boxes.length) : rowPitchOf(boxes) ?? x\n };\n}\nfunction resolveCellSize(given, boxes, extentX, extentY) {\n return given === void 0 ? cellSizeFrom(boxes, extentX, extentY) : typeof given === \"number\" ? { x: given, y: given } : given;\n}\nfunction getOrCreateCell(cells, cx, cy) {\n let row = cells.get(cx);\n if (!row) {\n row = /* @__PURE__ */ new Map();\n cells.set(cx, row);\n }\n let cell = row.get(cy);\n if (!cell) {\n cell = [];\n row.set(cy, cell);\n }\n return cell;\n}\nfunction addToGrid(cells, cellSize, minX, minY, maxX, maxY, entry) {\n const cx0 = Math.floor(minX / cellSize.x);\n const cx1 = Math.floor(maxX / cellSize.x);\n const cy0 = Math.floor(minY / cellSize.y);\n const cy1 = Math.floor(maxY / cellSize.y);\n for (let cx = cx0; cx <= cx1; cx++) {\n for (let cy = cy0; cy <= cy1; cy++) {\n getOrCreateCell(cells, cx, cy).push(entry);\n }\n }\n}\nfunction queryGrid(cells, cellSize, x, y, radiusX, radiusY) {\n const cx0 = Math.floor((x - radiusX) / cellSize.x);\n const cx1 = Math.floor((x + radiusX) / cellSize.x);\n const cy0 = Math.floor((y - radiusY) / cellSize.y);\n const cy1 = Math.floor((y + radiusY) / cellSize.y);\n const results = [];\n const seen = /* @__PURE__ */ new Set();\n for (let cx = cx0; cx <= cx1; cx++) {\n const row = cells.get(cx);\n if (row) {\n for (let cy = cy0; cy <= cy1; cy++) {\n const cell = row.get(cy);\n if (cell) {\n for (const entry of cell) {\n if (!seen.has(entry)) {\n seen.add(entry);\n results.push(entry);\n }\n }\n }\n }\n }\n }\n return results;\n}\nvar SpatialIndex = class {\n constructor(nodePositions, cellSize) {\n this.cells = /* @__PURE__ */ new Map();\n const boxes = [];\n let extentX = 0;\n let extentY = 0;\n for (const [nodeId, segments] of Object.entries(nodePositions)) {\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const next = segments[i + 1];\n const minX = Math.min(seg.x, next.x);\n const minY = Math.min(seg.y, next.y);\n const maxX = Math.max(seg.x, next.x);\n const maxY = Math.max(seg.y, next.y);\n extentX += maxX - minX;\n extentY += maxY - minY;\n boxes.push({ entry: { nodeId, segmentIdx: i }, minX, minY, maxX, maxY });\n }\n }\n this.cellSize = resolveCellSize(cellSize, boxes, extentX, extentY);\n for (const b of boxes) {\n addToGrid(\n this.cells,\n this.cellSize,\n b.minX,\n b.minY,\n b.maxX,\n b.maxY,\n b.entry\n );\n }\n }\n query(x, y, radiusX, radiusY = radiusX) {\n return queryGrid(this.cells, this.cellSize, x, y, radiusX, radiusY);\n }\n};\nvar EdgeSpatialIndex = class {\n constructor(nodePositions, graph, drawPaths, axis, cellSize, deletions, version = 0, routes, stranded = false) {\n this.cells = /* @__PURE__ */ new Map();\n this.edgeCurves = baseEdgeCurves(\n nodePositions,\n graph,\n axis,\n deletions,\n version,\n routes,\n stranded\n );\n const boxes = [];\n let extentX = 0;\n let extentY = 0;\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const edge = graph.edges[ei];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n const curves = this.edgeCurves.get(ei);\n if (fromSegments?.length && toSegments?.length && curves) {\n let { minX, minY, maxX, maxY } = curveBounds(curves);\n const numPaths = edge.pathIds?.length ?? 0;\n if (drawPaths && numPaths > 0) {\n let padX = 0;\n let padY = 0;\n for (const o of pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n )) {\n padX = Math.max(padX, Math.abs(o.x));\n padY = Math.max(padY, Math.abs(o.y));\n }\n minX -= padX;\n minY -= padY;\n maxX += padX;\n maxY += padY;\n }\n extentX += maxX - minX;\n extentY += maxY - minY;\n boxes.push({ ei, minX, minY, maxX, maxY });\n }\n }\n this.cellSize = resolveCellSize(cellSize, boxes, extentX, extentY);\n for (const b of boxes) {\n addToGrid(this.cells, this.cellSize, b.minX, b.minY, b.maxX, b.maxY, b.ei);\n }\n }\n getCurves(ei) {\n return this.edgeCurves.get(ei);\n }\n query(x, y, radiusX, radiusY = radiusX) {\n return queryGrid(this.cells, this.cellSize, x, y, radiusX, radiusY);\n }\n};\n\nexport {\n SpatialIndex,\n EdgeSpatialIndex\n};\n", "import {\n EdgeSpatialIndex,\n SpatialIndex\n} from \"./chunk-MREQ7GIA.js\";\nimport {\n pathRibbonOffsets,\n translateCurves,\n yToXOf\n} from \"./chunk-2CVHXFK7.js\";\n\n// src/util/hitDetection.ts\nfunction distanceToSegment(px, py, x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) {\n return Math.hypot(px - x1, py - y1);\n }\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\nfunction distanceToCubicBezier(px, py, x1, y1, cx1, cy1, cx2, cy2, x2, y2) {\n let minDist = Infinity;\n const samples = 20;\n let lastX = x1;\n let lastY = y1;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n const bx = u * u * u * x1 + 3 * u * u * t * cx1 + 3 * u * t * t * cx2 + t * t * t * x2;\n const by = u * u * u * y1 + 3 * u * u * t * cy1 + 3 * u * t * t * cy2 + t * t * t * y2;\n minDist = Math.min(minDist, distanceToSegment(px, py, lastX, lastY, bx, by));\n lastX = bx;\n lastY = by;\n }\n return minDist;\n}\nfunction distanceToBezierCurve(px, py, c) {\n return distanceToCubicBezier(\n px,\n py,\n c.x0,\n c.y0,\n c.cx0,\n c.cy0,\n c.cx1,\n c.cy1,\n c.x1,\n c.y1\n );\n}\nfunction distanceToEdgeCurves(px, py, curves, yToX = 1) {\n let minDist = Infinity;\n for (const c of curves) {\n const d = distanceToBezierCurve(\n px,\n py,\n yToX === 1 ? c : {\n x0: c.x0,\n y0: c.y0 * yToX,\n cx0: c.cx0,\n cy0: c.cy0 * yToX,\n cx1: c.cx1,\n cy1: c.cy1 * yToX,\n x1: c.x1,\n y1: c.y1 * yToX\n }\n );\n if (d < minDist) {\n minDist = d;\n }\n }\n return minDist;\n}\nvar nodeCache = /* @__PURE__ */ new WeakMap();\nfunction getSpatialIndex(nodePositions, version) {\n const cached = nodeCache.get(nodePositions);\n if (cached?.version === version) {\n return cached.index;\n }\n const index = new SpatialIndex(nodePositions);\n nodeCache.set(nodePositions, { version, index });\n return index;\n}\nvar edgeCache = /* @__PURE__ */ new WeakMap();\nfunction getEdgeSpatialIndex(nodePositions, graph, drawPaths, axis, version, deletions, routes, stranded = false) {\n const cached = edgeCache.get(nodePositions);\n if (cached?.graph === graph && cached.drawPaths === drawPaths && cached.scaleX === axis.scaleX && cached.scaleY === axis.scaleY && cached.version === version && cached.deletions === deletions && cached.routes === routes && cached.stranded === stranded) {\n return cached.index;\n }\n const index = new EdgeSpatialIndex(\n nodePositions,\n graph,\n drawPaths,\n axis,\n void 0,\n deletions,\n version,\n routes,\n stranded\n );\n edgeCache.set(nodePositions, {\n graph,\n drawPaths,\n scaleX: axis.scaleX,\n scaleY: axis.scaleY,\n version,\n index,\n deletions,\n routes,\n stranded\n });\n return index;\n}\nvar MIN_NODE_REACH_PX = 5;\nfunction findHoveredNode(nodePositions, graphX, graphY, axis, version = 0, ink) {\n const yToX = yToXOf(axis);\n const index = getSpatialIndex(nodePositions, version);\n const reach = (px) => Math.max(MIN_NODE_REACH_PX, px) / axis.scaleX;\n const queryReach = reach(ink?.maxHalfWidthPx ?? 0);\n const candidates = index.query(graphX, graphY, queryReach, queryReach / yToX);\n let hovered = null;\n let best = Infinity;\n for (const { nodeId, segmentIdx } of candidates) {\n const segments = nodePositions[nodeId];\n const dist = distanceToSegment(\n graphX,\n graphY * yToX,\n segments[segmentIdx].x,\n segments[segmentIdx].y * yToX,\n segments[segmentIdx + 1].x,\n segments[segmentIdx + 1].y * yToX\n );\n if (dist < best && dist < reach(ink?.halfWidthPx(nodeId) ?? 0)) {\n best = dist;\n hovered = nodeId;\n }\n }\n return hovered;\n}\nfunction segmentMeetsBox(a, b, box) {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n let t0 = 0;\n let t1 = 1;\n for (const [p, q] of [\n [-dx, a.x - box.x0],\n [dx, box.x1 - a.x],\n [-dy, a.y - box.y0],\n [dy, box.y1 - a.y]\n ]) {\n if (p === 0) {\n if (q < 0) {\n return false;\n }\n } else if (p < 0) {\n t0 = Math.max(t0, q / p);\n } else {\n t1 = Math.min(t1, q / p);\n }\n }\n return t0 <= t1;\n}\nfunction nodesUnderBox(nodePositions, t, version = 0) {\n const index = getSpatialIndex(nodePositions, version);\n const screen = (p) => ({\n x: p.x * t.scaleX + t.translateX,\n y: p.y * t.scaleY + t.translateY\n });\n return (box) => {\n const hits = /* @__PURE__ */ new Set();\n const candidates = index.query(\n ((box.x0 + box.x1) / 2 - t.translateX) / t.scaleX,\n ((box.y0 + box.y1) / 2 - t.translateY) / t.scaleY,\n Math.abs((box.x1 - box.x0) / 2 / t.scaleX),\n Math.abs((box.y1 - box.y0) / 2 / t.scaleY)\n );\n for (const { nodeId, segmentIdx } of candidates) {\n const line = nodePositions[nodeId];\n if (!hits.has(nodeId) && segmentMeetsBox(\n screen(line[segmentIdx]),\n screen(line[segmentIdx + 1]),\n box\n )) {\n hits.add(nodeId);\n }\n }\n return hits;\n };\n}\nfunction findHoveredEdge(nodePositions, graph, graphX, graphY, axis, drawPaths, version = 0, deletions, hiddenEdges, deletionRoutes, stranded = false) {\n const yToX = yToXOf(axis);\n const edgeThreshold = 10 / axis.scaleX;\n const edgeIndex = getEdgeSpatialIndex(\n nodePositions,\n graph,\n drawPaths,\n axis,\n version,\n deletions,\n deletionRoutes,\n stranded\n );\n const candidates = edgeIndex.query(\n graphX,\n graphY,\n edgeThreshold,\n edgeThreshold / yToX\n );\n let hovered = null;\n let best = edgeThreshold;\n for (const edgeIdx of candidates) {\n const edge = graph.edges[edgeIdx];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n if (!fromSegments?.length || !toSegments?.length || hiddenEdges?.has(edgeIdx)) {\n continue;\n }\n const numPaths = edge.pathIds?.length ?? 0;\n const baseCurves = edgeIndex.getCurves(edgeIdx);\n if (!baseCurves) {\n continue;\n }\n let dist;\n if (!drawPaths || numPaths === 0) {\n dist = distanceToEdgeCurves(graphX, graphY * yToX, baseCurves, yToX);\n } else {\n let minDist = Infinity;\n for (const offset of pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n )) {\n const curves = offset.x === 0 && offset.y === 0 ? baseCurves : translateCurves(baseCurves, offset.x, offset.y);\n const d = distanceToEdgeCurves(graphX, graphY * yToX, curves, yToX);\n if (d < minDist) {\n minDist = d;\n }\n }\n dist = minDist;\n }\n if (dist < best) {\n best = dist;\n hovered = edgeIdx;\n }\n }\n return hovered;\n}\n\nexport {\n distanceToSegment,\n distanceToCubicBezier,\n findHoveredNode,\n nodesUnderBox,\n findHoveredEdge\n};\n", "import {\n nodesUnderBox\n} from \"./chunk-YMSSF2RK.js\";\nimport {\n nodeLabelBudget,\n placeSizeLabels,\n rowLabelBox,\n sizeLabelCandidates\n} from \"./chunk-N62KBLFC.js\";\nimport {\n LABEL_CHAR_PX,\n LABEL_PAD,\n LABEL_PX,\n occupancy,\n placeLabels\n} from \"./chunk-AB35TJST.js\";\n\n// src/labelLayout.ts\nvar HALO_FACTOR = 3.4;\nvar LEGEND_INSET_PX = 6;\nvar ROUTE_STACK = 8;\nvar GENE_PIN_DROP_PX = 18;\nvar GENE_STACK = 2;\nvar TOPMOST_BASELINE = LABEL_PX + LABEL_PAD;\nfunction geneCoverageNote(pin) {\n const length = pin.gene.end - pin.gene.start;\n if (pin.covered >= 0.98) {\n return void 0;\n }\n const [per, unit] = length >= 1e6 ? [1e6, \"Mb\"] : length >= 1e3 ? [1e3, \"kb\"] : [1, \"bp\"];\n const amount = (bp) => +(bp / per).toFixed(per === 1 ? 0 : 1);\n return `${amount(pin.covered * length)} of ${amount(length)} ${unit}`;\n}\nfunction geneLabelCandidates(pins, screen, contigThickness, nodesUnder) {\n const ink = contigThickness / 2;\n return byExtent(pins, (pin) => pin.gene.end - pin.gene.start).map((pin) => {\n const { x, y } = screen(pin.at);\n const note = geneCoverageNote(pin);\n return {\n item: pin,\n x,\n y: y + contigThickness + GENE_PIN_DROP_PX,\n text: note ? `${pin.gene.name} \\xB7 ${note}` : pin.gene.name,\n fallback: note ? `${pin.gene.name} \\u2026` : void 0,\n stack: GENE_STACK,\n fits: (box) => [\n ...nodesUnder({\n x0: box.x0 - ink,\n x1: box.x1 + ink,\n y0: box.y0 - ink,\n y1: box.y1 + ink\n })\n ].every((id) => pin.nodeIds.has(id))\n };\n });\n}\nfunction byExtent(items, extent) {\n return [...items].sort((a, b) => extent(b) - extent(a));\n}\nfunction layoutLabels(m) {\n const { paneWidth: width, canvasHeight: height, translateX, translateY } = m;\n const { scaleX, scaleY } = m.axisScale;\n const frame = { width, height };\n const screen = (p) => ({\n x: p.x * scaleX + translateX,\n y: p.y * scaleY + translateY\n });\n const reserved = m.drawnRowLabels.map(\n ({ label, y }) => rowLabelBox(label, y * scaleY + translateY)\n );\n const stripPx = m.referenceStripZonePx ?? 0;\n if (stripPx > 0) {\n reserved.push({ x0: 0, x1: width, y0: 0, y1: stripPx });\n }\n if (m.legendSize.width > 0) {\n reserved.push({\n x0: width - LEGEND_INSET_PX - m.legendSize.width,\n x1: width,\n y0: 0,\n y1: stripPx + LEGEND_INSET_PX + m.legendSize.height\n });\n }\n if (m.poppedFrom) {\n reserved.push({\n x0: 0,\n x1: 60 + m.poppedFrom.label.length * LABEL_CHAR_PX * 1.2,\n y0: 0,\n y1: 44\n });\n }\n const take = occupancy(frame, reserved);\n const onRows = m.drawnRowLabels.length > 0;\n const rowsTop = onRows ? Math.min(...m.drawnRowLabels.map((r) => r.y)) : Infinity;\n const halo = m.contigThickness * HALO_FACTOR;\n const byBubble = byExtent(m.bubbleHalos, (h) => h.members);\n const bubbles = placeLabels(\n byBubble.map((h) => {\n const { x, y } = screen({\n x: h.labelAt.x,\n y: Math.min(h.labelAt.y, rowsTop)\n });\n const baseline = y - halo / 2 - 6;\n return {\n item: h,\n x,\n y: onRows ? Math.max(baseline, TOPMOST_BASELINE) : baseline,\n text: h.label\n };\n }),\n frame,\n take\n );\n const genes = placeLabels(\n geneLabelCandidates(\n m.genePins,\n screen,\n m.contigThickness,\n nodesUnderBox(\n m.nodePositions ?? {},\n { scaleX, scaleY, translateX, translateY },\n m.positionsVersion\n )\n ),\n frame,\n take\n );\n const sizeCandidates = m.nodePositions && m.labelsNodeSizes ? sizeLabelCandidates({\n nodePositions: m.nodePositions,\n nodeLengths: m.nodeLengths,\n deletions: m.showDeletionEdges ? m.deletions : [],\n deletionRoutes: m.deletionRoutes,\n stranded: m.stranded,\n alleleDeletions: m.alleleDeletions,\n axis: m.axisScale,\n translateX,\n translateY,\n width,\n height,\n version: m.positionsVersion\n }) : { deletions: [], nodes: [] };\n const deletionLabels = placeSizeLabels(sizeCandidates.deletions, take);\n const routes = placeLabels(\n byBubble.flatMap(\n (h) => h.routes.map((route) => {\n const { x, y } = screen(route.at);\n return {\n item: { halo: h, route },\n x,\n y: y + 4,\n text: route.text,\n stack: ROUTE_STACK\n };\n })\n ),\n frame,\n take\n );\n const nodeLabels = placeSizeLabels(\n sizeCandidates.nodes,\n take,\n nodeLabelBudget(width, height)\n );\n return {\n bubbles,\n genes,\n routes,\n sizes: [...deletionLabels, ...nodeLabels]\n };\n}\n\nexport {\n HALO_FACTOR,\n LEGEND_INSET_PX,\n geneCoverageNote,\n geneLabelCandidates,\n layoutLabels\n};\n", "import { isAnchored } from '@jbrowse/bandage-core/anchoredNodes'\nimport {\n panSNContig,\n panSNHaplotype,\n panSNSample,\n} from '@jbrowse/bandage-core/pansn'\n\nimport type { AnchoredNode } from '@jbrowse/bandage-core/anchoredNodes'\nimport type { Graph, GraphNode } from '@jbrowse/bandage-core/types'\n\nexport interface GraphLocation {\n // PanSN sample name off the node's own stable sequence. The assembly that\n // contributed the sequence, which is a *name*, not a resolved assembly \u2014 see\n // resolveContributors.\n sample: string\n // `sample#hap` where the stable name states a haplotype (HPRC release 2.1\n // names every node `NA20809#2#CM094351.1`), so a sample loaded as two\n // assemblies opens the right one; undefined where it states none\n haplotype: string | undefined\n refName: string\n start: number\n end: number\n}\n\n// Where a node's own sequence lives, in the coordinates of the assembly that\n// contributed it. rGFA states this on every segment: SN names the stable\n// sequence and SO the offset on it, so this is exact at every rank.\n//\n// It is the other question from nodeReferenceSpan, which asks where a node sits\n// on the *reference* axis and can only approximate that off the backbone. A\n// rank>0 node has an exact coordinate of its own; what it has no coordinate for\n// is the reference.\nexport function nodeOwnLocation(node: GraphNode): GraphLocation | undefined {\n return isAnchored(node) ? anchoredNodeLocation(node) : undefined\n}\n\nfunction anchoredNodeLocation(node: AnchoredNode): GraphLocation {\n return {\n sample: panSNSample(node.stable.refName),\n haplotype: panSNHaplotype(node.stable.refName),\n refName: panSNContig(node.stable.refName),\n start: node.stable.start,\n end: node.stable.start + node.length,\n }\n}\n\nexport interface Contributor extends GraphLocation {\n // lowest rank this assembly holds here: 0 means it is the reference backbone\n rank: number\n nodeCount: number\n}\n\ninterface Span {\n start: number\n end: number\n}\n\n// The widest run of spans with no gap larger than `maxGap`, which is the locus\n// this assembly contributes *here*. A bare union of every span would be wrong\n// on a graph where a sample also contributes sequence from a distant\n// duplication: the union then reads as a multi-megabase locus, and a linear view\n// launched at it shows neither end.\nfunction widestCluster(spans: Span[], maxGap: number) {\n const sorted = [...spans].sort((a, b) => a.start - b.start)\n let best: Span | undefined\n let current: Span | undefined\n for (const span of sorted) {\n current =\n current && span.start - current.end <= maxGap\n ? { start: current.start, end: Math.max(current.end, span.end) }\n : { start: span.start, end: span.end }\n if (!best || current.end - current.start > best.end - best.start) {\n best = current\n }\n }\n return best\n}\n\ninterface Group {\n sample: string\n haplotype: string | undefined\n refName: string\n rank: number\n spans: Span[]\n}\n\nfunction groupKey(loc: GraphLocation) {\n return `${loc.haplotype ?? loc.sample}\u0000${loc.refName}`\n}\n\n// Every assembly with a segment in this graph, and the locus each one covers on\n// its own coordinates.\n//\n// This is what makes a launch out of the graph possible at all: the graph names\n// its contributors in the data (rGFA's SN tag), so a node, a row and the graph\n// as a whole can each say which assembly they belong to without consulting an\n// alignment.\n//\n// Ordered reference-first, then by name, so the row order matches\n// sampleRowLayout's and neither reshuffles as the window moves.\nexport function contributingAssemblies(\n graph: Graph,\n { maxGap = Infinity }: { maxGap?: number } = {},\n): Contributor[] {\n const groups = new Map<string, Group>()\n for (const node of graph.nodes) {\n if (isAnchored(node)) {\n const loc = anchoredNodeLocation(node)\n const key = groupKey(loc)\n const group = groups.get(key)\n if (group) {\n group.spans.push({ start: loc.start, end: loc.end })\n group.rank = Math.min(group.rank, node.stable.rank)\n } else {\n groups.set(key, {\n sample: loc.sample,\n haplotype: loc.haplotype,\n refName: loc.refName,\n rank: node.stable.rank,\n spans: [{ start: loc.start, end: loc.end }],\n })\n }\n }\n }\n\n // One entry per assembly (a haplotype where the names state one, else the\n // sample): an assembly contributing on several contigs is launched at the\n // contig it contributes most of, since a linear view opens on one region.\n const bySample = new Map<string, Contributor>()\n for (const group of groups.values()) {\n const span = widestCluster(group.spans, maxGap)\n if (span) {\n const candidate = {\n sample: group.sample,\n haplotype: group.haplotype,\n refName: group.refName,\n start: span.start,\n end: span.end,\n rank: group.rank,\n nodeCount: group.spans.length,\n }\n const key = group.haplotype ?? group.sample\n const existing = bySample.get(key)\n if (!existing || candidate.nodeCount > existing.nodeCount) {\n bySample.set(key, candidate)\n }\n }\n }\n\n // Reference first, then by name: the same order sampleRowLayout gives its\n // rows, so the menu lists the assemblies in the order they are stacked on\n // screen. Sorting by rank instead would order them by minigraph's build\n // order, which is not what the labels beside the drawing say.\n return [...bySample.values()].sort(\n (a, b) =>\n Number(a.rank !== 0) - Number(b.rank !== 0) ||\n a.sample.localeCompare(b.sample) ||\n (a.haplotype ?? '').localeCompare(b.haplotype ?? ''),\n )\n}\n\n// The assembly a location opens on: its haplotype's where the name states one\n// and the session holds it, else its sample's. A session holding both\n// haplotypes of a sample opens the right one; one holding a haplotype under\n// the bare sample name still opens it.\nexport function resolveLocationAssembly(\n resolve: (sample: string) => string | undefined,\n loc: Pick<GraphLocation, 'sample' | 'haplotype'>,\n) {\n const byHaplotype =\n loc.haplotype === undefined ? undefined : resolve(loc.haplotype)\n return byHaplotype ?? resolve(loc.sample)\n}\n\n// Contributors that name an assembly this session has loaded, which are the\n// only ones a linear or synteny view can open on.\n//\n// The two cases this filters apart are both normal. An E. coli pangenome demo\n// loads every strain as its own assembly, so every contributor resolves and the\n// whole graph is navigable. An HPRC graph names hundreds of haplotypes that no\n// session would ever load as assemblies, so only the reference resolves \u2014\n// there the reference projection (nodeReferenceSpan) is the way back to a\n// coordinate, not this.\n//\n// `resolve` is a name lookup rather than a list of names, because a PanSN sample\n// is the *graph's* spelling and need not be the assembly's. HPRC's graph writes\n// `CHM13`, and the assembly holding that sequence is UCSC's `hs1`, with CHM13\n// among its aliases; matching on names alone leaves that donor unopenable unless\n// the reader renames their assembly after the graph. The resolved (canonical)\n// name replaces the sample, so a launch opens the assembly the session knows.\nexport function resolveContributors(\n contributors: Contributor[],\n resolve: (sample: string) => string | undefined,\n) {\n return contributors.flatMap(c => {\n const sample = resolveLocationAssembly(resolve, c)\n return sample === undefined ? [] : [{ ...c, sample }]\n })\n}\n\n// 1-based inclusive, which is what a locstring means. Unformatted digits: this\n// is parsed, not read. locLabel is the one people read.\nexport function locString(loc: GraphLocation) {\n return `${loc.refName}:${loc.start + 1}-${loc.end}`\n}\n\nexport function locLabel(loc: { refName: string; start: number; end: number }) {\n return `${loc.refName}:${(loc.start + 1).toLocaleString()}-${loc.end.toLocaleString()}`\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z\"\n}), 'CompareArrows');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2\"\n}), 'HighlightAlt');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z\"\n}), 'LineStyle');", "import CompareArrowsIcon from '@mui/icons-material/CompareArrows'\nimport HighlightAltIcon from '@mui/icons-material/HighlightAlt'\nimport LineStyleIcon from '@mui/icons-material/LineStyle'\n\nimport { locLabel } from './contributors'\n\nimport type { Contributor, GraphLocation } from './contributors'\nimport type { LaunchableSyntenyTrack } from './syntenyTracks'\nimport type { MenuItem } from '@jbrowse/core/ui'\n\nconst LINEAR_LABEL = 'Linear genome view'\nconst SYNTENY_LABEL = 'Linear synteny view'\nconst NO_SYNTENY_TRACK =\n 'No synteny track in this session aligns these assemblies'\n\nexport interface LinearTarget {\n location: GraphLocation\n assembly: string\n}\n\n// One flat item when there is one thing to open, a submenu when there is a\n// choice. Same shape as subgraphMenuItems uses in the other direction, so the\n// two ends of the graph <-> linear trip read the same way.\nfunction oneOrMany<T>({\n label,\n icon,\n entries,\n entryLabel,\n onSelect,\n disabledHelpText,\n nameTheOnlyEntry = true,\n}: {\n label: string\n icon: React.ElementType\n entries: T[]\n entryLabel: (entry: T) => string\n onSelect: (entry: T) => () => void\n disabledHelpText?: string\n // Whether a lone entry's name is worth appending to the item. It is when the\n // entry is where you land (`GRCh38 chr6:31,980,000-32,050,000`) and not when\n // it is the ingredient used to get there \u2014 a synteny track's name says\n // nothing the item does not already say, and reading it costs the width of\n // `pggb graph: all-vs-all synteny (wfmash)`.\n nameTheOnlyEntry?: boolean\n}): MenuItem[] {\n const [first] = entries\n // Nothing to open: a *disabled* item with the reason in its tooltip, when\n // there is a reason worth reading. An item that vanishes teaches nobody that\n // the session is one synteny track short of a multi-genome view.\n const empty: MenuItem[] = disabledHelpText\n ? [{ label, icon, disabled: true, disabledHelpText, onClick: () => {} }]\n : []\n return entries.length === 0\n ? empty\n : entries.length === 1 && first\n ? [\n {\n label: nameTheOnlyEntry ? `${label} \u2014 ${entryLabel(first)}` : label,\n icon,\n onClick: onSelect(first),\n },\n ]\n : [\n {\n label,\n icon,\n type: 'subMenu',\n subMenu: entries.map(entry => ({\n label: entryLabel(entry),\n onClick: onSelect(entry),\n })),\n },\n ]\n}\n\n// The graph's way out: a linear view of any assembly the graph names here, and a\n// synteny view of all of them at once. Until this existed the triangle had two\n// edges \u2014 a linear view could open a graph or a synteny view of a locus, and the\n// graph could open nothing at all.\n//\n// `contributors` are already resolved against the session's assemblies. On an\n// E. coli pangenome every strain is its own assembly, so all of them appear and\n// the synteny item is the interesting one; on an HPRC graph the 400-odd\n// contributing haplotypes are not loaded assemblies and only the reference\n// appears, which is the honest answer rather than a missing feature.\nexport function graphLaunchMenuItems({\n contributors,\n syntenyTracks,\n onShowLinear,\n onShowSynteny,\n}: {\n contributors: Contributor[]\n syntenyTracks: LaunchableSyntenyTrack[]\n onShowLinear: (target: LinearTarget) => void\n onShowSynteny: (trackId: string) => void\n}): MenuItem[] {\n // sorted widest first\n const widest = syntenyTracks[0]?.coverage ?? contributors.length\n return [\n ...oneOrMany({\n label: LINEAR_LABEL,\n icon: LineStyleIcon,\n entries: contributors,\n entryLabel: c => `${c.sample} ${locLabel(c)}`,\n onSelect: c => () => {\n onShowLinear({ location: c, assembly: c.sample })\n },\n }),\n ...(contributors.length >= 2\n ? oneOrMany({\n // the count the launch opens, which is what the widest track aligns\n // and not always every contributor; see launchSyntenyView\n label: `${SYNTENY_LABEL} (${widest} assemblies)`,\n icon: CompareArrowsIcon,\n entries: syntenyTracks,\n entryLabel: track =>\n track.coverage < widest\n ? `${track.name} (${track.coverage} of ${widest})`\n : track.name,\n nameTheOnlyEntry: false,\n disabledHelpText: NO_SYNTENY_TRACK,\n onSelect: track => () => {\n onShowSynteny(track.trackId)\n },\n })\n : []),\n ]\n}\n\n// A single node's way out, for the node context menu. Two different questions,\n// both worth offering:\n//\n// - the node's own coordinates, on the assembly that contributed it. Exact,\n// from the node's SN/SO, and available at every rank \u2014 but only openable\n// when that assembly is loaded, which for an HPRC haplotype it is not.\n// - where the node sits on the reference the graph was cut against. Always\n// openable, and off the backbone it is the flanking projection rather than\n// an exact span (see nodeReferenceSpan), so it is labelled as the region\n// around the node rather than as the node.\n//\n// Labels are verbs. Review: \"the lineargenomeview menu item should say launch\n// if that is what it does\" \u2014 a bare `Linear genome view \u2014 hg38 chr6:\u2026` names a\n// place and leaves the reader to guess whether clicking scrolls the view beside\n// the graph or opens a new one. It does the first when there is one to scroll\n// (see showInLinearView), so \"Open in\" covers both without claiming a launch.\n//\n// Verb, assembly, and where \u2014 nothing else. Every word here is read inside a\n// menu opened on a node, so \"this node in the hg38 view\" and \"in linear view\"\n// restate the context they are already in; what a coordinate opens in is not in\n// question, and the assembly name is.\n//\n// Flat, not under a \"Launch view\" submenu: this menu is a handful of items and\n// every one is contextual to the node just clicked.\nexport function nodeLaunchMenuItems({\n own,\n reference,\n highlight,\n onShowLinear,\n onHighlight,\n}: {\n own: LinearTarget | undefined\n reference: LinearTarget | undefined\n // the node's exact reference span, where `reference` is padded to open on\n highlight: LinearTarget | undefined\n onShowLinear: (target: LinearTarget) => void\n // absent when no linear view in the session is this graph's to mark\n onHighlight?: (target: LinearTarget) => void\n}): MenuItem[] {\n const entries = [\n own\n ? {\n label: `Open in ${own.assembly} \u2014 ${locLabel(own.location)}`,\n target: own,\n }\n : undefined,\n // Only when it says something the item above doesn't. A backbone segment on\n // a loaded reference answers both questions with the same assembly and\n // nearly the same span, and offering that twice reads as two different\n // places to go.\n reference && reference.assembly !== own?.assembly\n ? {\n label: `Open in ${reference.assembly} \u2014 around this node`,\n target: reference,\n }\n : undefined,\n ].filter(entry => entry !== undefined)\n\n // The reference projection, not the node's own coordinates: a highlight is\n // drawn in the linear view already on screen, and that view is on the\n // reference the subgraph was cut from.\n return [\n ...(onHighlight && highlight\n ? [\n {\n label: `Highlight in ${highlight.assembly}`,\n icon: HighlightAltIcon,\n onClick: () => {\n onHighlight(highlight)\n },\n },\n ]\n : []),\n ...entries.map(({ label, target }) => ({\n label,\n icon: LineStyleIcon,\n onClick: () => {\n onShowLinear(target)\n },\n })),\n ]\n}\n", "import {\n parseCs\n} from \"./chunk-C44YRP5F.js\";\n\n// src/tubeMap/reads.ts\nfunction canonicalStrand(node) {\n return node.id.endsWith(\"-\") ? \"-\" : \"+\";\n}\nfunction stepName(node, strand) {\n return strand === canonicalStrand(node) ? node.id : `-${node.id}`;\n}\nfunction stepStarts(lengths, total) {\n const starts = lengths.map(() => void 0);\n let head = 0;\n let i = 0;\n for (; i < lengths.length && lengths[i] !== void 0; i++) {\n starts[i] = head;\n head += lengths[i];\n }\n let tail = total;\n for (let j = lengths.length - 1; j > i && lengths[j] !== void 0; j--) {\n tail -= lengths[j];\n starts[j] = tail;\n }\n return starts;\n}\nfunction mismatchesByStep(record, lengths) {\n const byStep = record.path.map(() => []);\n if (record.cs === void 0) {\n return byStep;\n }\n const starts = stepStarts(lengths, record.pathLength);\n const stepAt = (pos2, atEnd = false) => {\n for (let s = 0; s < starts.length; s++) {\n const start = starts[s];\n const length = lengths[s];\n if (start !== void 0 && length !== void 0 && start <= pos2 && (pos2 < start + length || atEnd && pos2 === start + length)) {\n return { s, local: pos2 - start, room: start + length - pos2 };\n }\n }\n return void 0;\n };\n const add = (s, mismatch) => {\n const list = byStep[s];\n const last = list.at(-1);\n if (mismatch.type === \"substitution\" && last?.type === \"substitution\" && last.pos + last.seq.length === mismatch.pos) {\n last.seq += mismatch.seq;\n } else {\n list.push(mismatch);\n }\n };\n let pos = record.pathStart;\n for (const op of parseCs(record.cs)) {\n if (op.op === \"match\") {\n pos += op.length;\n } else if (op.op === \"substitution\") {\n const at = stepAt(pos);\n if (at) {\n add(at.s, { type: \"substitution\", pos: at.local, seq: op.seq });\n }\n pos += 1;\n } else if (op.op === \"insertion\") {\n const at = stepAt(pos, pos === record.pathEnd);\n if (at) {\n add(at.s, { type: \"insertion\", pos: at.local, seq: op.seq });\n }\n } else {\n let left = op.length;\n while (left > 0) {\n const at = stepAt(pos);\n const take = at ? Math.min(left, at.room) : left;\n if (at) {\n add(at.s, { type: \"deletion\", pos: at.local, length: take });\n }\n pos += take;\n left -= take;\n }\n }\n }\n return byStep;\n}\nfunction tubeMapReads(graph, records, firstId) {\n const nodeByName = new Map(graph.nodes.map((n) => [n.name, n]));\n const reads = [];\n for (const record of records) {\n const nodes = record.path.map((step) => nodeByName.get(step.name));\n const kept = nodes.flatMap((node, i) => node ? [i] : []);\n const first = kept[0];\n const last = kept.at(-1);\n if (first !== void 0 && last !== void 0) {\n const mismatches = mismatchesByStep(\n record,\n nodes.map((n) => n?.length)\n );\n const names = kept.map((i) => stepName(nodes[i], record.path[i].strand));\n const lastLength = nodes[last].length;\n reads.push({\n id: firstId + reads.length,\n name: record.name,\n type: \"read\",\n sourceTrackID: 1,\n sequence: names,\n sequenceNew: kept.map((i, k) => ({\n nodeName: names[k],\n mismatches: mismatches[i]\n })),\n firstNodeOffset: first === 0 ? record.pathStart : 0,\n finalNodeCoverLength: last === record.path.length - 1 ? lastLength - (record.pathLength - record.pathEnd) : lastLength,\n mapping_quality: record.mappingQuality === 255 ? 0 : record.mappingQuality,\n is_secondary: record.secondary,\n is_reverse: record.strand === \"-\"\n });\n }\n }\n return reads;\n}\nvar FORWARD_READ_COLORS = [\"#6baed6\", \"#4292c6\", \"#2171b5\", \"#08519c\"];\nvar REVERSE_READ_COLORS = [\"#fb6a4a\", \"#ef3b2c\", \"#cb181d\", \"#a50f15\"];\nfunction readColor(read) {\n const colors = read.is_reverse ? REVERSE_READ_COLORS : FORWARD_READ_COLORS;\n return colors[read.id % colors.length];\n}\n\nexport {\n canonicalStrand,\n stepName,\n tubeMapReads,\n FORWARD_READ_COLORS,\n REVERSE_READ_COLORS,\n readColor\n};\n", "export function emptyTrackShapes() {\n return {\n rectangles: [],\n curves: [],\n corners: [],\n verticalRectangles: [],\n featureRectangles: [],\n };\n}\n", "// The tube map layout, from input nodes and tracks to drawable shapes. Ported\n// from the original sequenceTubeMap JS, where it shared one module with the d3\n// drawing; the passes below still share module state, but layoutTubeMap resets\n// all of it on entry and runs synchronously, so no two calls see each other's.\nimport { emptyTrackShapes } from './types.js';\nconst DEBUG = false;\nconst DEFAULT_TRACK_COLORS = [\n '#1f77b4',\n '#ff7f0e',\n '#2ca02c',\n '#d62728',\n '#9467bd',\n '#8c564b',\n '#e377c2',\n '#7f7f7f',\n];\nfunction configFrom(options) {\n return {\n mergeNodesFlag: options.mergeNodes ?? true,\n showReads: options.showReads ?? true,\n coarsenedReadView: options.coarsenedReadView ?? false,\n ignoreStrand: options.ignoreStrand ?? false,\n nodeWidthOption: options.nodeWidthOption ?? 'normal',\n charWidth: options.charWidth ?? 8.401,\n trackWidth: options.trackWidth ?? 15,\n mappingQualityCutoff: options.mappingQualityCutoff ?? 0,\n focusReadNames: options.focusReadNames ?? null,\n showExonsFlag: options.showExons ?? false,\n trackColor: options.trackColor ??\n (track => DEFAULT_TRACK_COLORS[track.id % DEFAULT_TRACK_COLORS.length]),\n trackAlpha: options.trackAlpha ?? (() => 1),\n };\n}\nlet config = configFrom({});\nlet bed = null;\nlet nodes = [];\n// Each track has a `path`, which is an array of Segment objects describing pieces of the path that need to be drawn, in order along the path.\nlet tracks = [];\n// Each read also has a `path` list of Segments, but reads are organized vertically using a different system than non-read tracks.\nlet reads = [];\nlet nodeMap = new Map();\nlet nodesPerOrder = [];\n// Scratch array used only during generateNodeOrder. Indexed by node index;\n// undefined = \"not yet assigned.\" Copied into node.order at end of layout.\nlet nodeOrders = [];\n// Lane assignment info for tracks, in one list per horizontal \"order\" slot.\n// Duplicates info in tracks' `path` lists but is organized by order. Reads do not use this.\nlet assignments = [];\nlet extraLeft = [];\nlet extraRight = [];\nlet maxOrder = -1; // horizontal order of the rightmost node\nlet shapes = emptyTrackShapes();\nlet imageBounds = { minX: 0, maxX: 0, minY: 0, maxY: 0 };\nlet trackForRuler;\nlet coarsenedEdgeMeta = new Map();\n// Lay out `inputNodes` and `inputTracks` (and `inputReads`, when\n// `showReads`), or return undefined when nothing visible is left to draw.\n// Neither input is modified. Track 0 is the reference the layout straightens.\nexport function layoutTubeMap(inputNodes, inputTracks, inputReads = [], options = {}) {\n config = configFrom(options);\n bed = options.bed ?? null;\n shapes = emptyTrackShapes();\n assignments = [];\n extraLeft = [];\n extraRight = [];\n nodesPerOrder = [];\n imageBounds = { minX: 0, maxX: 0, minY: 0, maxY: 0 };\n trackForRuler = undefined;\n coarsenedEdgeMeta = new Map();\n if (inputNodes.length === 0 || inputTracks.length === 0) {\n return undefined;\n }\n // Boundary promotion: layout passes below populate the Node/Track fields\n // (width, order, x/y, path, indexSequence, etc.) before any reader runs.\n const copies = deepCopy(inputNodes);\n // Nodes are referenced in inputs by internal `name` attribute and not by\n // index. Internally in e.g. a path's indexSequence we need to reference\n // nodes by *signed* index, so index 0 can never be used: budge everything\n // down and leave a hole (rather than an `undefined` entry) at 0, which we\n // won't iterate over. Made after the copy, because not every structuredClone\n // keeps a hole.\n nodes = [];\n copies.forEach((node, i) => {\n nodes[i + 1] = node;\n });\n tracks = deepCopy(inputTracks);\n // Whether any reads were loaded at all, distinct from `reads.length` below:\n // a mapping-quality cutoff or focus-name filter can filter every read out,\n // and that should not make the coarsened view fall back to bunching\n // haplotypes instead \u2014 the graph does have reads, they're just all hidden.\n const hadInputReads = inputReads.length > 0;\n // Drop the reads we will never draw before cloning them \u2014 the deep copy of a\n // large GAM is the single most expensive step in a redraw.\n reads = deepCopy(filterReads(inputReads));\n for (let i = tracks.length - 1; i >= 0; i -= 1) {\n const t = tracks[i];\n if (t.type === undefined) {\n t.type = 'haplotype';\n }\n if (t.hidden === true) {\n tracks.splice(i, 1);\n continue;\n }\n if (t.indexOfFirstBase !== undefined) {\n trackForRuler = t.name;\n }\n }\n if (tracks.length === 0) {\n return undefined;\n }\n // Run against the visible tracks only, so hiding the reference doesn't leave\n // the layout straightened around a track that is no longer drawn.\n straightenTrack(0);\n nodeMap = generateNodeMap();\n generateTrackIndexSequences(tracks);\n if (config.showReads && reads.length > 0)\n generateTrackIndexSequences(reads);\n generateNodeWidth();\n if (config.mergeNodesFlag) {\n generateNodeSuccessors();\n generateNodeOrder();\n if (config.showReads && reads.length > 0)\n reverseReversedReads();\n mergeNodes();\n nodeMap = generateNodeMap();\n generateNodeWidth();\n generateTrackIndexSequences(tracks);\n if (config.showReads && reads.length > 0)\n generateTrackIndexSequences(reads);\n }\n generateNodeSuccessors();\n generateNodeDegree();\n if (DEBUG)\n console.log(`${nodes.length} nodes.`);\n generateNodeOrder();\n maxOrder = getMaxOrder();\n // can cause problems when there is a reversed single track node\n // OTOH, can solve problems with complex inversion patterns\n switchNodeOrientation();\n generateNodeOrder();\n maxOrder = getMaxOrder();\n // Coarsened (Sankey) mode normally collapses the *read* list into synthetic\n // per-edge bands (below). A haplotype-only graph has no reads to coarsen,\n // so a coarsened request there instead coarsens every haplotype but the\n // reference: that one keeps its normal per-track lane (so it still carries\n // the ruler) while the rest are pulled out of `tracks` here, before\n // calculateTrackWidth/generateLaneAssignment ever see them, and rejoin the\n // layout below through the same reads-style overlay used for coarsened\n // reads.\n const coarsenHaplotypes = config.showReads && config.coarsenedReadView && !hadInputReads;\n if (coarsenHaplotypes) {\n const rulerIndex = trackForRuler === undefined\n ? -1\n : tracks.findIndex(t => t.name === trackForRuler);\n const refIndex = rulerIndex === -1 ? 0 : rulerIndex;\n const altHaplotypes = tracks.filter((_, i) => i !== refIndex);\n if (altHaplotypes.length > 0) {\n const bands = buildCoarsenedSyntheticBands(altHaplotypes, 'haplotype');\n // A haplotype that only ever visits one node produces no edge, so an\n // all-single-node set of alts would otherwise leave `reads` empty and\n // fall through to the no-overlay branch below, which never gives their\n // nodes a y/contentHeight. Keep them off to the side instead of\n // dropping them silently.\n if (bands.length > 0) {\n tracks = [tracks[refIndex]];\n reads = bands;\n }\n }\n }\n calculateTrackWidth();\n generateLaneAssignment();\n if (config.showExonsFlag && bed !== null)\n addTrackFeatures();\n // Coarsened (Sankey) mode: collapse the read list (or, when coarsening\n // haplotypes, the alt haplotypes pulled out above) to one synthetic \"read\"\n // per (srcSigned \u2192 dstSigned) edge BEFORE the normal read placement runs.\n // Each synthetic read traverses exactly two nodes, so the rest of the\n // pipeline (placeReads, generateSVGShapesFromPath, curve drawing) handles\n // it like any normal read: it gets a lane, picks up the \"right-down-left-\n // up-right\" topology for loops automatically, and uses the same elegant\n // bezier. Node heights end up proportional to *edge* count (typically\n // tens) rather than *read* or *haplotype* count (potentially thousands).\n const drawCoarsenedReads = config.showReads &&\n config.coarsenedReadView &&\n reads.length > 0 &&\n !coarsenHaplotypes;\n if (config.showReads && reads.length > 0) {\n generateReadOnlyNodeAttributes();\n reverseReversedReads();\n generateTrackIndexSequences(reads);\n if (drawCoarsenedReads) {\n reads = buildCoarsenedSyntheticBands(reads, 'read');\n reverseReversedReads();\n generateTrackIndexSequences(reads);\n }\n placeReads();\n tracks = tracks.concat(reads);\n }\n else {\n nodes.forEach(node => {\n if (node) {\n node.incomingReads = [];\n node.outgoingReads = [];\n node.internalReads = [];\n }\n });\n }\n generateNodeXCoords();\n generateSVGShapesFromPath();\n if (DEBUG) {\n console.log('Tracks:');\n console.log(tracks);\n console.log('Nodes:');\n console.log(nodes);\n console.log('Lane assignment:');\n console.log(assignments);\n }\n getImageDimensions();\n return {\n nodes,\n tracks,\n reads,\n nodeMap,\n shapes,\n bounds: imageBounds,\n maxOrder,\n trackForRuler,\n coarsenedEdgeMeta,\n };\n}\nfunction generateTrackColor(track, highlight = 'plain') {\n return config.trackColor(track, highlight);\n}\nfunction generateTrackAlpha(track) {\n return config.trackAlpha(track);\n}\n// structuredClone preserves sparse-array holes; JSON round-trip would fill them with null.\nfunction deepCopy(val) {\n return structuredClone(val);\n}\n// Return true if the given name names a reverse strand node, and false otherwise.\nexport function isReverse(nodeName) {\n const s = String(nodeName);\n return s.length >= 1 && s.startsWith('-');\n}\n// Get the forward version of a node name, which may be either forward or backward (negative)\nexport function forward(nodeName) {\n return isReverse(nodeName) ? String(nodeName).substring(1) : nodeName;\n}\n// Get the reverse version of a node name, which may be either forward or backward (negative)\nexport function reverse(nodeName) {\n return isReverse(nodeName) ? nodeName : `-${nodeName}`;\n}\n// Get the opposite orientation node name for the given node.\nexport function flip(nodeName) {\n return isReverse(nodeName) ? forward(nodeName) : reverse(nodeName);\n}\n// Signed-index orientation test. Uses 1/n to distinguish -0 from +0 since\n// indexSequence entries can be negative-zero for reverse-strand visits of node 0.\nexport function isForwardIndex(n) {\n return (n || 1 / n) >= 0;\n}\n// straighten track given by index by inverting inverted nodes\n// only keep them inverted if this single track runs through them in both directions\n// Operates on the per-render `nodes`/`tracks` copies; inputs are left untouched.\nfunction straightenTrack(index) {\n const nodesToInvert = new Set();\n // find out which nodes should be inverted\n let currentSequence = tracks[index].sequence;\n for (let i = 0; i < currentSequence.length; i += 1) {\n const cur = currentSequence[i];\n if (isReverse(cur)) {\n const nodeName = forward(cur);\n const firstForwardIndex = currentSequence.indexOf(nodeName);\n if (firstForwardIndex === -1 || firstForwardIndex > i) {\n // only if this inverted node is no repeat\n nodesToInvert.add(nodeName);\n }\n }\n }\n // invert nodes in the tracks' sequence\n for (const track of tracks) {\n currentSequence = track.sequence;\n for (let j = 0; j < currentSequence.length; j += 1) {\n const cur = currentSequence[j];\n if (!isReverse(cur)) {\n if (nodesToInvert.has(cur)) {\n currentSequence[j] = reverse(cur);\n }\n }\n else if (nodesToInvert.has(forward(cur))) {\n currentSequence[j] = forward(cur);\n }\n }\n }\n // invert the sequence within the nodes\n nodes.forEach(node => {\n if (node && nodesToInvert.has(node.name)) {\n node.seq = node.seq.split('').reverse().join('');\n }\n });\n}\n// generates attributes (node.y, node.contentHeight) for nodes without tracks, only reads\nfunction generateReadOnlyNodeAttributes() {\n nodesPerOrder = [];\n for (let i = 0; i <= maxOrder; i += 1) {\n nodesPerOrder[i] = [];\n }\n const orderY = new Map();\n nodes.forEach(node => {\n if (node.y !== undefined) {\n setMapToMax(orderY, node.order, node.y + node.contentHeight);\n }\n });\n // for order values where there is no node with haplotypes, orderY is calculated via tracks\n tracks.forEach(track => {\n if (track.type === 'haplotype') {\n track.path.forEach(step => {\n setMapToMax(orderY, step.order, (step.y ?? 0) + track.width);\n });\n }\n });\n nodes.forEach((node, i) => {\n if (node.order >= 0 && node.y === undefined) {\n node.y = (orderY.get(node.order) ?? 0) + 25;\n node.contentHeight = 0;\n nodesPerOrder[node.order].push(i);\n }\n });\n}\nfunction setMapToMax(map, key, value) {\n const existing = map.get(key);\n if (existing === undefined) {\n map.set(key, value);\n }\n else {\n map.set(key, Math.max(existing, value));\n }\n}\nexport const READ_WIDTH = 7;\n// add info about reads to nodes (incoming, outgoing and internal reads)\nfunction assignReadsToNodes() {\n nodes.forEach(node => {\n if (node) {\n node.incomingReads = [];\n node.outgoingReads = [];\n node.internalReads = [];\n }\n });\n reads.forEach((read, idx) => {\n // Honor a pre-set width (e.g. coarsened Sankey bands pre-size themselves\n // by traversing-read count) \u2014 only fall back to the default for normal\n // reads which leave width unset.\n if (read.width === undefined || read.width === 0) {\n read.width = READ_WIDTH;\n }\n if (read.path.length === 1) {\n const firstNode = read.path[0].node;\n if (firstNode !== null) {\n nodes[firstNode].internalReads.push(idx);\n }\n }\n else {\n read.path.forEach((element, pathIdx) => {\n if (pathIdx === 0) {\n const firstNode = read.path[0].node;\n if (firstNode !== null) {\n nodes[firstNode].outgoingReads.push([idx, pathIdx]);\n }\n }\n else {\n const elemNode = element.node;\n if (elemNode !== null) {\n nodes[elemNode].incomingReads.push([idx, pathIdx]);\n }\n }\n });\n }\n });\n}\n// calculate paths (incl. correct y coordinate) for all reads\nfunction placeReads() {\n generateBasicPathsForReads();\n assignReadsToNodes();\n // sort nodes by order, then by y-coordinate\n const sortedNodes = nodes.slice();\n sortedNodes.sort(compareNodesByOrder);\n // Organize read IDs by source track\n const readsBySource = new Map();\n for (let i = 0; i < reads.length; i++) {\n const source = reads[i].sourceTrackID;\n const bucket = readsBySource.get(source);\n if (bucket === undefined) {\n readsBySource.set(source, [i]);\n }\n else {\n bucket.push(i);\n }\n }\n const allSources = Array.from(readsBySource.keys()).sort((a, b) => a - b);\n // Space out read tracks if multiple exist\n const topMargin = allSources.length > 1 ? READ_WIDTH : 0;\n sortedNodes.forEach(node => {\n if (!node)\n return;\n // For each node\n for (const source of allSources) {\n // Go through all source tracks in order\n // Place the reads from this source in this node.\n // Use a margin to separate multiple read tracks if we have them.\n placeReadSet(readsBySource.get(source), node, topMargin);\n }\n });\n // place read segments which are without node\n const bottomY = calculateBottomY();\n const elementsWithoutNode = [];\n reads.forEach((read, idx) => {\n const len = read.path.length;\n // For each path index, precompute the nearest preceding/following segment\n // whose node is non-null and truthy. Falls back to the boundary segment when\n // none qualifies, matching the original walking-loop semantics.\n const prevSegment = new Array(len);\n let lastValidPrev;\n for (let i = 0; i < len; i++) {\n if (i === 0) {\n prevSegment[i] = undefined;\n }\n else {\n prevSegment[i] = lastValidPrev ?? read.path[0];\n }\n const seg = read.path[i];\n if (seg.node !== null && seg.node)\n lastValidPrev = seg;\n }\n const nextSegment = new Array(len);\n let firstValidNext;\n for (let i = len - 1; i >= 0; i--) {\n if (i === len - 1) {\n nextSegment[i] = undefined;\n }\n else {\n nextSegment[i] = firstValidNext ?? read.path[len - 1];\n }\n const seg = read.path[i];\n if (seg.node !== null && seg.node)\n firstValidNext = seg;\n }\n read.path.forEach((element, pathIdx) => {\n if (element.y === undefined) {\n const previousVisitToNode = prevSegment[pathIdx];\n const nextVisitToNode = nextSegment[pathIdx];\n // Specifically referring to segments between a cycle that's traversing from right to left\n const betweenCycleReverseTraversal = Boolean(\n // A segment can be between a cycle if it there are nodes on both sides\n nextVisitToNode &&\n previousVisitToNode &&\n nextVisitToNode.isForward !== undefined &&\n previousVisitToNode.isForward !== undefined &&\n // A segment is between a cycle if the next node it visits is behind the previous node it visited\n (previousVisitToNode.order > nextVisitToNode.order ||\n // A segment can also be between a cycle if it's visiting the same node it just visited in the same direction\n (nextVisitToNode.order === previousVisitToNode.order &&\n nextVisitToNode.isForward === previousVisitToNode.isForward)));\n element.betweenCycleReverseTraversal = betweenCycleReverseTraversal;\n elementsWithoutNode.push({\n readIndex: idx,\n pathIndex: pathIdx,\n previousY: previousVisitToNode?.y,\n previousNode: previousVisitToNode?.node,\n });\n }\n });\n });\n elementsWithoutNode.sort(compareNoNodeReads);\n elementsWithoutNode.forEach(element => {\n const read = reads[element.readIndex];\n const segment = read.path[element.pathIndex];\n segment.y = bottomY[segment.order];\n bottomY[segment.order] += read.width;\n });\n if (DEBUG) {\n console.log('Reads:');\n console.log(reads);\n }\n}\n// Place a particular collection of reads, identified by a list of read\n// numbers, into the given node at the right Y coordinates. All reads in all\n// nodes above it, and no reads in any nodes below it, are already placed.\n// Makes the given node bigger if needed and moves other nodes down if needed.\n// If topMargin is set, applies that amount of spacing down from whatever is above the reads.\nfunction placeReadSet(readIDs, node, topMargin) {\n // Turn the read IDs into a set\n const toPlace = new Set(readIDs);\n // Get arrays of the read entry/exit/internal-ness records we want to work on\n let incomingReads = node.incomingReads.filter(([readID]) => toPlace.has(readID));\n const outgoingReads = node.outgoingReads.filter(([readID]) => toPlace.has(readID));\n const internalReads = node.internalReads.filter(readID => toPlace.has(readID));\n // Only actually use the top margin if we have any reads on the node.\n if (incomingReads.length === 0 &&\n outgoingReads.length === 0 &&\n internalReads.length === 0) {\n topMargin = 0;\n }\n // Determine where we start vertically in the node.\n // TODO: Why do we have to double this to keep reads out of adjacent lanes???\n const startY = node.y + node.contentHeight + topMargin * 2;\n // sort incoming reads \u2014 decorate with a precomputed key so each compare is O(1).\n // The original comparator walks pathIdx backwards in lockstep on both sides, picking\n // the first step where either has a defined y (or reaches index 0). The walk's outcome\n // for a single entry is fully captured by:\n // decisionStep: the smallest k>=1 where path[pathIdx-k].y is defined, or pathIdx+1\n // if no preceding segment has a defined y (the \"reached 0\" case).\n // y: the defined y at decisionStep, or undefined for \"reached 0\".\n // Smaller decisionStep wins; ties put the \"reached 0\" entries first;\n // otherwise compare y's.\n const incomingKeys = incomingReads.map(entry => {\n const [readID, pathIdx] = entry;\n const path = reads[readID].path;\n let decisionStep = pathIdx + 1;\n let foundY;\n for (let k = 1; k <= pathIdx; k++) {\n const y = path[pathIdx - k]?.y;\n if (y !== undefined) {\n decisionStep = k;\n foundY = y;\n break;\n }\n }\n return { entry, decisionStep, y: foundY };\n });\n incomingKeys.sort(compareIncomingReadKeys);\n incomingReads = incomingKeys.map(k => k.entry);\n // place incoming reads\n let currentY = startY;\n const occupiedUntil = new Map();\n incomingReads.forEach(readElement => {\n const read = reads[readElement[0]];\n read.path[readElement[1]].y = currentY;\n setOccupiedUntil(occupiedUntil, read, readElement[1], currentY, node);\n currentY += read.width;\n });\n let maxY = currentY;\n // sort outgoing reads\n outgoingReads.sort(compareReadOutgoingSegmentsByGoingTo);\n // place outgoing reads\n const occupiedFrom = new Map();\n currentY = startY;\n outgoingReads.forEach(readElement => {\n const read = reads[readElement[0]];\n const firstNodeOffset = read.firstNodeOffset ?? 0;\n // place in next lane\n read.path[readElement[1]].y = currentY;\n occupiedFrom.set(currentY, firstNodeOffset);\n // if no conflicts. The original predicate was strict-less-than, which\n // treats two reads that exactly touch (incoming ends at base K, outgoing\n // starts at base K+1) as conflicting. They don't overlap, so they can\n // share a lane \u2014 relax to <=. This also matters for coarsened Sankey\n // bands at single-base nodes (e.g. a 1bp \"G\" node): with edge-only offsets\n // the math becomes 0+1 < 1 (conflict, wrong) vs. 0+1 <= 1 (no conflict).\n const occUntil = occupiedUntil.get(currentY);\n if (occUntil === undefined || occUntil + 1 <= firstNodeOffset) {\n currentY += read.width;\n maxY = Math.max(maxY, currentY);\n }\n else {\n // otherwise push down incoming reads to make place for outgoing Read\n occupiedUntil.set(currentY, 0);\n incomingReads.forEach(incReadElementIndices => {\n const incRead = reads[incReadElementIndices[0]];\n const incReadPathElement = incRead.path[incReadElementIndices[1]];\n if (incReadPathElement.y !== undefined &&\n incReadPathElement.y >= currentY) {\n incReadPathElement.y += read.width;\n setOccupiedUntil(occupiedUntil, incRead, incReadElementIndices[1], incReadPathElement.y, node);\n }\n });\n currentY += read.width;\n maxY += read.width;\n }\n });\n // sort internal reads\n internalReads.sort(compareInternalReads);\n // place internal reads\n internalReads.forEach(readIdx => {\n const currentRead = reads[readIdx];\n const firstNodeOffset = currentRead.firstNodeOffset ?? 0;\n const finalNodeCoverLength = currentRead.finalNodeCoverLength ?? 0;\n currentY = startY;\n while (firstNodeOffset < (occupiedUntil.get(currentY) ?? -Infinity) + 2 ||\n finalNodeCoverLength > (occupiedFrom.get(currentY) ?? Infinity) - 3) {\n currentY += currentRead.width || READ_WIDTH;\n }\n currentRead.path[0].y = currentY;\n occupiedUntil.set(currentY, finalNodeCoverLength);\n maxY = Math.max(maxY, currentY);\n });\n // adjust node height and move other nodes vertically down\n const heightIncrease = maxY - node.y - node.contentHeight;\n node.contentHeight += heightIncrease;\n adjustVertically3(node, heightIncrease);\n}\n// Smaller decisionStep wins. On a tie, entries that walked off the front of the\n// path (no defined y) sort first and tie with each other; otherwise compare y.\nexport function compareIncomingReadKeys(a, b) {\n if (a.decisionStep !== b.decisionStep) {\n return a.decisionStep - b.decisionStep;\n }\n if (a.y === undefined || b.y === undefined) {\n return (a.y === undefined ? 0 : 1) - (b.y === undefined ? 0 : 1);\n }\n return a.y - b.y;\n}\n// keeps track of where reads end within nodes\nfunction setOccupiedUntil(map, read, pathIndex, y, node) {\n if (pathIndex === read.path.length - 1) {\n // last node of current read\n map.set(y, read.finalNodeCoverLength ?? 0);\n }\n else {\n // read covers the whole node\n map.set(y, node.sequenceLength);\n }\n}\n// compare read segments which are outside of nodes to sort them in a good horizontal\n// and then vertical display order.\nfunction compareNoNodeReads(a, b) {\n const readA = reads[a.readIndex];\n const readB = reads[b.readIndex];\n const segmentA = readA.path[a.pathIndex];\n const segmentB = readB.path[b.pathIndex];\n // Sort by order by segments\n if (segmentA.order !== segmentB.order) {\n return segmentA.order - segmentB.order;\n }\n // Sort by reads' source track\n if (readA.sourceTrackID !== readB.sourceTrackID) {\n return readA.sourceTrackID - readB.sourceTrackID;\n }\n // Sort by order of previous node\n if (a.previousNode && b.previousNode) {\n const prevNodeA = nodes[a.previousNode];\n const prevNodeB = nodes[b.previousNode];\n if (prevNodeA && prevNodeB && prevNodeA.order !== prevNodeB.order) {\n return prevNodeA.order - prevNodeB.order;\n }\n }\n // We want to sort in reverse order when the segment is along the reverse-going part of a cycle.\n // This ensures a loop that starts on the outside, stays on the outside,\n // and rolls up in order with other loops.\n const aPrev = a.previousY ?? 0;\n const bPrev = b.previousY ?? 0;\n if (segmentA.betweenCycleReverseTraversal &&\n segmentB.betweenCycleReverseTraversal) {\n return bPrev - aPrev;\n }\n else {\n return aPrev - bPrev;\n }\n}\n// compare read segments by where they are going to\nfunction compareReadOutgoingSegmentsByGoingTo([readIndexA, pathIndexA], [readIndexB, pathIndexB]) {\n // Expect two arrays both containing 2 integers.\n // The first index of each array contains the read index\n // The second index of each array contains the path index\n // Segments are first sorted by the y value of their last node,\n // then by the node they end on,\n // then by length in final node\n const readA = reads[readIndexA];\n const readB = reads[readIndexB];\n let previousValidYA;\n let previousValidYB;\n let lastPathIndexA = readA.path.length - 1;\n let lastPathIndexB = readB.path.length - 1;\n while (!previousValidYA && lastPathIndexA >= 0) {\n previousValidYA = readA.path[lastPathIndexA]?.y;\n lastPathIndexA -= 1;\n }\n while (!previousValidYB && lastPathIndexB >= 0) {\n previousValidYB = readB.path[lastPathIndexB]?.y;\n lastPathIndexB -= 1;\n }\n if (previousValidYA && previousValidYB) {\n return previousValidYA - previousValidYB;\n }\n // Couldn't find a valid y value for at least one of the reads, sort by which node reads end on\n const initialNodeA = readA.path[pathIndexA]?.node;\n const initialNodeB = readB.path[pathIndexB]?.node;\n let nodeA = initialNodeA != null ? nodes[initialNodeA] : null;\n let nodeB = initialNodeB != null ? nodes[initialNodeB] : null;\n // Follow the reads' paths until we find the node they diverge at\n // Or, they go through all the same nodes and we do a tiebreaker at the end\n while (nodeA != null && nodeB != null && nodeA === nodeB) {\n if (pathIndexA < readA.path.length - 1) {\n pathIndexA += 1;\n while (readA.path[pathIndexA]?.node === null)\n pathIndexA += 1; // skip null nodes in path\n const nextNodeIdx = readA.path[pathIndexA]?.node;\n nodeA = nextNodeIdx != null ? nodes[nextNodeIdx] : null;\n }\n else {\n nodeA = null;\n }\n if (pathIndexB < readB.path.length - 1) {\n pathIndexB += 1;\n while (readB.path[pathIndexB]?.node === null)\n pathIndexB += 1; // skip null nodes in path\n const nextNodeIdx = readB.path[pathIndexB]?.node;\n nodeB = nextNodeIdx != null ? nodes[nextNodeIdx] : null;\n }\n else {\n nodeB = null;\n }\n }\n if (nodeA != null) {\n if (nodeB != null)\n return compareNodesByOrder(nodeA, nodeB);\n return 1; // nodeB is null, nodeA not null\n }\n if (nodeB != null)\n return -1; // nodeB not null, nodeA null\n // both nodes are null -> both end in the same node\n const beginDiff = (readA.firstNodeOffset ?? 0) - (readB.firstNodeOffset ?? 0);\n if (beginDiff !== 0)\n return beginDiff;\n // break tie: both reads cover the same nodes and begin at the same position\n // One or both reads didn't have a previously valid Y value, compare by the endPosition of the read\n return (readA.finalNodeCoverLength ?? 0) - (readB.finalNodeCoverLength ?? 0);\n}\n// Compare tracks based on ordering at their first convergence\nfunction compareTrackByInitialOrdering(trackA, trackB) {\n // Find the first node where the two tracks converge, sort by layer.\n // Tracks with no path sort first, and two of them tie.\n if (trackA.path === undefined || trackB.path === undefined) {\n return ((trackA.path === undefined ? 0 : 1) - (trackB.path === undefined ? 0 : 1));\n }\n const pathA = trackA.path;\n const pathB = trackB.path;\n let AIndex = 0;\n let BIndex = 0;\n while (AIndex < pathA.length && BIndex < pathB.length) {\n const a = pathA[AIndex];\n const b = pathB[BIndex];\n const trackAOrder = a.order;\n const trackBOrder = b.order;\n if (trackAOrder === trackBOrder && a.node && b.node) {\n return (b.y ?? 0) - (a.y ?? 0);\n }\n else if (trackAOrder < trackBOrder) {\n AIndex += 1;\n }\n else if (trackAOrder > trackBOrder) {\n BIndex += 1;\n }\n else {\n // Orders are equal but are traversing out of nodes\n AIndex += 1;\n BIndex += 1;\n }\n }\n // Tracks do not converge, keep the same ordering\n return 0;\n}\n// compare 2 reads which are completely within a single node\nfunction compareInternalReads(idxA, idxB) {\n const a = reads[idxA];\n const b = reads[idxB];\n // compare by first base within first node\n const aFirst = a.firstNodeOffset ?? 0;\n const bFirst = b.firstNodeOffset ?? 0;\n if (aFirst < bFirst)\n return -1;\n else if (aFirst > bFirst)\n return 1;\n // compare by last base within last node\n const aLast = a.finalNodeCoverLength ?? 0;\n const bLast = b.finalNodeCoverLength ?? 0;\n if (aLast < bLast)\n return -1;\n else if (aLast > bLast)\n return 1;\n return 0;\n}\n// determine biggest y-coordinate for each order-value\nfunction calculateBottomY() {\n const bottomY = [];\n for (let i = 0; i <= maxOrder; i += 1) {\n bottomY.push(0);\n }\n nodes.forEach(node => {\n if (node.y !== undefined) {\n bottomY[node.order] = Math.max(bottomY[node.order], node.y + node.contentHeight + 20);\n }\n });\n tracks.forEach(track => {\n track.path.forEach(element => {\n bottomY[element.order] = Math.max(bottomY[element.order], (element.y ?? 0) + track.width);\n });\n });\n return bottomY;\n}\n// generate path-info for each read\n// containing order, node and orientation, but no concrete coordinates\n// TODO: Duplicates a lot of the same work as generateLaneAssignment() does for non-read tracks.\nfunction generateBasicPathsForReads() {\n reads.forEach(read => {\n // add info for start of track\n let currentNodeIndex = Math.abs(read.indexSequence[0]);\n let currentNodeIsForward = isForwardIndex(read.indexSequence[0]);\n let currentNode = nodes[currentNodeIndex];\n let previousNode;\n let previousNodeIsForward;\n read.path = [];\n read.path.push({\n order: currentNode.order,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n for (let i = 1; i < read.sequence.length; i += 1) {\n previousNode = currentNode;\n previousNodeIsForward = currentNodeIsForward;\n currentNodeIndex = Math.abs(read.indexSequence[i]);\n currentNodeIsForward = isForwardIndex(read.indexSequence[i]);\n currentNode = nodes[currentNodeIndex];\n if (currentNode.order > previousNode.order) {\n if (!previousNodeIsForward) {\n // backward to forward at previous node\n read.path.push({\n order: previousNode.order,\n isForward: true,\n node: null,\n });\n }\n for (let j = previousNode.order + 1; j < currentNode.order; j += 1) {\n // forward without nodes\n read.path.push({ order: j, isForward: true, node: null });\n }\n if (!currentNodeIsForward) {\n // forward to backward at current node\n read.path.push({\n order: currentNode.order,\n isForward: true,\n node: null,\n });\n read.path.push({\n order: currentNode.order,\n isForward: false,\n node: currentNodeIndex,\n });\n }\n else {\n // current Node forward\n read.path.push({\n order: currentNode.order,\n isForward: true,\n node: currentNodeIndex,\n });\n }\n }\n else if (currentNode.order < previousNode.order) {\n if (previousNodeIsForward) {\n // turnaround from fw to bw at previous node\n read.path.push({\n order: previousNode.order,\n isForward: false,\n node: null,\n });\n }\n for (let j = previousNode.order - 1; j > currentNode.order; j -= 1) {\n // bachward without nodes\n read.path.push({ order: j, isForward: false, node: null });\n }\n if (currentNodeIsForward) {\n // backward to forward at current node\n read.path.push({\n order: currentNode.order,\n isForward: false,\n node: null,\n });\n read.path.push({\n order: currentNode.order,\n isForward: true,\n node: currentNodeIndex,\n });\n }\n else {\n // backward at current node\n read.path.push({\n order: currentNode.order,\n isForward: false,\n node: currentNodeIndex,\n });\n }\n }\n else {\n if (currentNodeIsForward !== previousNodeIsForward) {\n read.path.push({\n order: currentNode.order,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n }\n else {\n read.path.push({\n order: currentNode.order,\n isForward: !currentNodeIsForward,\n node: null,\n });\n read.path.push({\n order: currentNode.order,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n }\n }\n }\n });\n}\n// reverse reads which are reversed\nfunction reverseReversedReads() {\n reads.forEach(read => {\n let pos = 0;\n while (pos < read.sequence.length && read.sequence[pos].startsWith('-')) {\n pos += 1;\n }\n if (pos === read.sequence.length) {\n // completely reversed read\n read.is_reverse = true;\n read.sequence = read.sequence.reverse(); // invert sequence\n for (let i = 0; i < read.sequence.length; i += 1) {\n read.sequence[i] = forward(read.sequence[i]); // visit nodes forward\n // TODO: Do we really want to visit all the nodes forward here? Are we\n // sure we aren't in mixed orientation?\n }\n const sequenceNew = read.sequenceNew ?? [];\n sequenceNew.reverse(); // invert sequence\n read.sequenceNew = sequenceNew;\n for (const entry of sequenceNew) {\n entry.nodeName = forward(entry.nodeName); // visit nodes forward\n reverseMismatches(entry.mismatches, nodeByName(entry.nodeName).sequenceLength);\n }\n // adjust firstNodeOffset and finalNodeCoverLength\n const temp = read.firstNodeOffset ?? 0;\n const firstLen = nodeByName(read.sequence[0]).sequenceLength;\n read.firstNodeOffset = firstLen - (read.finalNodeCoverLength ?? 0);\n const lastLen = nodeByName(read.sequence[read.sequence.length - 1]).sequenceLength;\n read.finalNodeCoverLength = lastLen - temp;\n }\n });\n}\n// Flip a node's mismatches onto the opposite strand: positions are measured\n// from the other end of the node, and sequences are complemented.\n// sequenceLength (not node.width, which is only equal to it in 'normal'\n// node-width mode) is the right pivot because mismatch positions are base\n// offsets. Exported for testing.\nexport function reverseMismatches(mismatches, sequenceLength) {\n mismatches.forEach(mm => {\n if (mm.type === 'insertion') {\n mm.pos = sequenceLength - mm.pos;\n }\n else if (mm.type === 'deletion') {\n mm.pos = sequenceLength - mm.pos - (mm.length ?? 0);\n }\n else if (mm.type === 'substitution') {\n mm.pos = sequenceLength - mm.pos - (mm.seq?.length ?? 0);\n }\n if (mm.seq !== undefined) {\n // NOTE: reverse-complement followed by reverse is a plain complement.\n // Preserved verbatim from the original code rather than \"fixed\" here.\n mm.seq = getReverseComplement(mm.seq).split('').reverse().join('');\n }\n });\n}\nconst COMPLEMENT = { A: 'T', T: 'A', C: 'G', G: 'C' };\nfunction getReverseComplement(s) {\n let result = '';\n for (let i = s.length - 1; i >= 0; i -= 1) {\n result += COMPLEMENT[s.charAt(i)] ?? 'N';\n }\n return result;\n}\n// for each track: generate sequence of node indices from seq. of node names\nfunction generateTrackIndexSequences(tracksOrReads) {\n tracksOrReads.forEach(track => {\n track.indexSequence = [];\n track.sequence.forEach(rawNodeName => {\n let nodeName = rawNodeName;\n // if node was switched, reverse it here\n // Q? Is flipping the index enough? It looks like yes. Or should we also flip the node name in 'sequence'?\n const fwdIdx = nodeMap.get(forward(nodeName));\n const switched = nodes[fwdIdx]?.switched ?? false;\n if (switched) {\n nodeName = flip(nodeName);\n }\n // Get the index to visit the node. If the node is switched, this means\n // visiting it reverse. Otherwise, this means visiting it forward.\n const nodeIndex = nodeMap.get(forward(nodeName));\n if (nodeIndex === 0) {\n // If a node index is ever 0, we can't visit it in reverse, so we don't allow that to happen.\n throw new Error('Node ' + forward(nodeName) + ' has prohibited index 0');\n }\n if (isReverse(nodeName) !== switched) {\n // If we visit the node in reverse XOR the node is switched, go through\n // it right to left as displayed.\n track.indexSequence.push(-nodeIndex);\n }\n else {\n // If either the node isn't switched and we go through it forward, or\n // the node is switched *and* we go through it backward, go through it\n // left to right as displayed.\n track.indexSequence.push(nodeIndex);\n }\n });\n });\n}\n// Tracks enter and leave a node this far outside it horizontally. Note that\n// getImageDimensions() below only adds it on the right: the pannable area\n// understates the left edge of the drawing by this much.\nconst NODE_HORIZONTAL_SLACK = 20;\n// get the minimum and maximum coordinates used in the image to calculate image dimensions\nfunction getImageDimensions() {\n // Sentinels, deliberately crossed: if nothing below runs, minZoom() and\n // alignSVG() detect the empty content rather than computing a negative scale.\n const bounds = { minX: 99, maxX: -99, minY: 99, maxY: -99 };\n nodes.forEach(node => {\n if (!node)\n return;\n if (node.x !== undefined) {\n bounds.minX = Math.min(bounds.minX, node.x);\n bounds.maxX = Math.max(bounds.maxX, node.x + NODE_HORIZONTAL_SLACK + node.pixelWidth);\n }\n if (node.y !== undefined) {\n bounds.minY = Math.min(bounds.minY, node.y - 10);\n bounds.maxY = Math.max(bounds.maxY, node.y + node.contentHeight + 10);\n }\n });\n tracks.forEach(track => {\n track.path.forEach(segment => {\n const y = segment.y ?? 0;\n bounds.maxY = Math.max(bounds.maxY, y + track.width);\n bounds.minY = Math.min(bounds.minY, y);\n });\n });\n imageBounds = bounds;\n}\n// Resolve a (possibly reverse-oriented) node name to its layout node. Every\n// caller runs after generateNodeMap, so a miss is a programming error.\nfunction nodeByName(nodeName) {\n const index = nodeMap.get(forward(nodeName));\n const node = index === undefined ? undefined : nodes[index];\n if (node === undefined) {\n throw new Error(`Unknown node ${nodeName}`);\n }\n return node;\n}\n// map node names to node indices\nfunction generateNodeMap() {\n nodeMap = new Map();\n nodes.forEach((node, index) => {\n if (node) {\n nodeMap.set(node.name, index);\n }\n });\n return nodeMap;\n}\n// adds a successor-array to each node containing the indices of the nodes coming directly after the current node\nfunction generateNodeSuccessors() {\n const successorSets = nodes.map(() => new Set());\n const predecessorSets = nodes.map(() => new Set());\n const addEdges = (track) => {\n for (let i = 0; i < track.indexSequence.length - 1; i += 1) {\n const current = Math.abs(track.indexSequence[i]);\n const follower = Math.abs(track.indexSequence[i + 1]);\n successorSets[current].add(follower);\n predecessorSets[follower].add(current);\n }\n };\n tracks.forEach(addEdges);\n if (config.showReads && reads.length > 0) {\n reads.forEach(addEdges);\n }\n nodes.forEach((node, i) => {\n if (node) {\n node.successors = Array.from(successorSets[i]);\n node.predecessors = Array.from(predecessorSets[i]);\n }\n });\n}\nfunction generateNodeOrderOfSingleTrack(sequence) {\n let forwardOrder = 0;\n let backwardOrder = 0;\n let minOrder = 0;\n sequence.forEach(nodeIndex => {\n const idx = Math.abs(nodeIndex);\n if (nodeIndex < 0) {\n if (nodeOrders[idx] === undefined)\n nodeOrders[idx] = backwardOrder;\n const order = nodeOrders[idx];\n if (order < minOrder)\n minOrder = order;\n forwardOrder = order;\n backwardOrder = order - 1;\n }\n else {\n if (nodeOrders[idx] === undefined)\n nodeOrders[idx] = forwardOrder;\n const order = nodeOrders[idx];\n forwardOrder = order + 1;\n backwardOrder = order;\n }\n });\n if (minOrder < 0) {\n increaseOrderForAllNodes(-minOrder);\n }\n}\n// calculate the order-value of nodes contained in sequence which are to the left of the first node which already has an order-value\nfunction generateNodeOrderTrackBeginning(sequence) {\n let anchorIndex = 0;\n let minOrder = 0;\n while (anchorIndex < sequence.length &&\n nodeOrders[Math.abs(sequence[anchorIndex])] === undefined) {\n anchorIndex += 1; // anchor = first node in common with existing graph\n }\n if (anchorIndex >= sequence.length) {\n return null;\n }\n const anchorSeqVal = sequence[anchorIndex];\n let currentOrder;\n let increment;\n if (anchorSeqVal >= 0) {\n // regular node\n currentOrder = nodeOrders[anchorSeqVal] - 1;\n increment = -1;\n }\n else {\n // reverse node\n currentOrder = nodeOrders[-anchorSeqVal] + 1;\n increment = 1;\n }\n for (let j = anchorIndex - 1; j >= 0; j -= 1) {\n // assign order to nodes which are left of anchor node\n const idx = Math.abs(sequence[j]);\n if (nodeOrders[idx] === undefined) {\n nodeOrders[idx] = currentOrder;\n minOrder = Math.min(minOrder, currentOrder);\n currentOrder += increment;\n }\n }\n if (minOrder < 0) {\n increaseOrderForAllNodes(-minOrder);\n }\n return anchorIndex;\n}\n// Sentinel order for nodes no track or read reaches.\nexport const UNREACHABLE_ORDER = -1;\n// Replace every unassigned entry with UNREACHABLE_ORDER, producing a dense\n// array. Holes matter here: `new Array(n)` is all holes and forEach/map skip\n// them, so an in-place forEach would leave the sentinel unset.\nexport function fillUnassignedOrders(orders) {\n const filled = [];\n for (const order of orders) {\n filled.push(order ?? UNREACHABLE_ORDER);\n }\n return filled;\n}\n// generate global sequence of nodes from left to right, starting with first track and adding other tracks sequentially\nfunction generateNodeOrder() {\n let modifiedSequence;\n let currentOrder;\n let rightIndex;\n let leftIndex;\n let minOrder = 0;\n const tracksAndReads = config.showReads && reads.length > 0 ? tracks.concat(reads) : tracks;\n const reachability = {\n stamp: new Int32Array(nodes.length),\n generation: 0,\n };\n // fill() makes the array dense: `new Array(n)` alone is all holes, which\n // forEach skips, so neither the sentinel pass nor the copy-back below ran.\n nodeOrders = new Array(nodes.length).fill(undefined);\n nodes.forEach(node => {\n if (node) {\n node.order = undefined;\n }\n });\n generateNodeOrderOfSingleTrack(tracks[0].indexSequence);\n for (let i = 1; i < tracksAndReads.length; i += 1) {\n if (DEBUG)\n console.log(`generating order for track ${i + 1}`);\n rightIndex = generateNodeOrderTrackBeginning(tracksAndReads[i].indexSequence);\n if (rightIndex === null) {\n if (tracksAndReads[i].type === 'haplotype') {\n generateNodeOrderOfSingleTrack(tracksAndReads[i].indexSequence);\n }\n else {\n tracksAndReads.splice(i, 1);\n reads.splice(i - tracks.length, 1);\n i -= 1;\n }\n continue;\n }\n modifiedSequence = uninvert(tracksAndReads[i].indexSequence);\n while (rightIndex < modifiedSequence.length) {\n // move right until the end of the sequence\n leftIndex = rightIndex;\n rightIndex += 1;\n while (rightIndex < modifiedSequence.length &&\n nodeOrders[modifiedSequence[rightIndex]] === undefined) {\n rightIndex += 1;\n }\n if (rightIndex < modifiedSequence.length) {\n // middle segment between two anchors\n currentOrder = nodeOrders[modifiedSequence[leftIndex]] + 1;\n for (let j = leftIndex + 1; j < rightIndex; j += 1) {\n nodeOrders[modifiedSequence[j]] = currentOrder;\n currentOrder += 1;\n }\n if (nodeOrders[modifiedSequence[rightIndex]] >\n nodeOrders[modifiedSequence[leftIndex]]) {\n if (nodeOrders[modifiedSequence[rightIndex]] < currentOrder) {\n increaseOrderForSuccessors(modifiedSequence[rightIndex], modifiedSequence[rightIndex - 1], currentOrder);\n }\n }\n else {\n if (tracksAndReads[i].indexSequence[rightIndex] >= 0 &&\n !isSuccessor(modifiedSequence[rightIndex], modifiedSequence[leftIndex], reachability)) {\n // no real reversal\n increaseOrderForSuccessors(modifiedSequence[rightIndex], modifiedSequence[rightIndex - 1], currentOrder);\n }\n else {\n // real reversal\n if (tracksAndReads[i].indexSequence[leftIndex] < 0 ||\n (nodes[modifiedSequence[leftIndex + 1]].degree < 2 &&\n nodeOrders[modifiedSequence[rightIndex]] <\n nodeOrders[modifiedSequence[leftIndex]])) {\n currentOrder = nodeOrders[modifiedSequence[leftIndex]] - 1;\n for (let j = leftIndex + 1; j < rightIndex; j += 1) {\n nodeOrders[modifiedSequence[j]] = currentOrder;\n minOrder = Math.min(minOrder, currentOrder);\n currentOrder -= 1;\n }\n }\n }\n }\n }\n else {\n // right segment to the right of last anchor\n if (tracksAndReads[i].indexSequence[leftIndex] >= 0) {\n // elongate towards the right\n currentOrder = nodeOrders[modifiedSequence[leftIndex]] + 1;\n for (let j = leftIndex + 1; j < modifiedSequence.length; j += 1) {\n const idx = modifiedSequence[j];\n if (nodeOrders[idx] === undefined) {\n nodeOrders[idx] = currentOrder;\n currentOrder += 1;\n }\n }\n }\n else {\n // elongate towards the left\n currentOrder = nodeOrders[modifiedSequence[leftIndex]] - 1;\n for (let j = leftIndex + 1; j < modifiedSequence.length; j += 1) {\n const idx = modifiedSequence[j];\n if (nodeOrders[idx] === undefined) {\n nodeOrders[idx] = currentOrder;\n minOrder = Math.min(minOrder, currentOrder);\n currentOrder -= 1;\n }\n }\n }\n }\n }\n }\n if (minOrder < 0)\n increaseOrderForAllNodes(-minOrder);\n // Nodes unreachable from any track get UNREACHABLE_ORDER so every node ends\n // up with a defined order; downstream code uses `order >= 0` to skip them.\n const finalOrders = fillUnassignedOrders(nodeOrders);\n nodeOrders = finalOrders;\n finalOrders.forEach((order, i) => {\n const node = nodes[i];\n if (node !== undefined) {\n node.order = order;\n }\n });\n}\nfunction isSuccessor(first, second, scratch) {\n scratch.generation += 1;\n const { stamp, generation } = scratch;\n const stack = [first];\n stamp[first] = generation;\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === second)\n return true;\n for (const childIndex of nodes[current].successors) {\n if (stamp[childIndex] !== generation) {\n stamp[childIndex] = generation;\n stack.push(childIndex);\n }\n }\n }\n return false;\n}\n// get order number of the rightmost node\nfunction getMaxOrder() {\n let max = -1;\n nodeOrders.forEach(order => {\n if (order !== undefined && order > max)\n max = order;\n });\n return max;\n}\n// generates sequence keeping the order but switching all reversed (negative) nodes to forward nodes\nfunction uninvert(sequence) {\n return sequence.map(v => Math.abs(v));\n}\n// increases the order-value of all nodes by amount\nfunction increaseOrderForAllNodes(amount) {\n nodeOrders.forEach((order, i) => {\n if (order !== undefined)\n nodeOrders[i] = order + amount;\n });\n}\n// increases the order-value for currentNode and (if necessary) successor nodes recursively\nfunction increaseOrderForSuccessors(startingNode, tabuNode, newOrder) {\n const increasedOrders = new Map();\n // Walked with a head pointer rather than shift(), which is O(length) per pop.\n const queue = [[startingNode, newOrder]];\n let head = 0;\n while (head < queue.length) {\n const [currentNode, currentOrder] = queue[head];\n head += 1;\n const currentNodeOrder = nodeOrders[currentNode];\n if (currentNodeOrder !== undefined && currentNodeOrder < currentOrder) {\n if (!increasedOrders.has(currentNode) ||\n increasedOrders.get(currentNode) < currentOrder) {\n increasedOrders.set(currentNode, currentOrder);\n nodes[currentNode].successors.forEach(successor => {\n if (nodeOrders[successor] > currentNodeOrder &&\n successor !== tabuNode) {\n // only increase order of successors to the right of currentNode\n queue.push([successor, currentOrder + 1]);\n }\n });\n if (currentNode !== startingNode) {\n nodes[currentNode].predecessors.forEach(predecessor => {\n if (nodeOrders[predecessor] > currentNodeOrder &&\n predecessor !== tabuNode) {\n // only increase order of predecessors to the right of currentNode\n queue.push([predecessor, currentOrder + 1]);\n }\n });\n }\n }\n }\n }\n increasedOrders.forEach((value, key) => {\n nodeOrders[key] = value;\n });\n}\n// calculates the node degree: the number of tracks passing through the node / the node height\nfunction generateNodeDegree() {\n nodes.forEach(node => {\n node.tracks = [];\n });\n tracks.forEach(track => {\n track.indexSequence.forEach(nodeIndex => {\n nodes[Math.abs(nodeIndex)].tracks.push(track.id);\n });\n });\n nodes.forEach(node => {\n if (node.tracks !== undefined)\n node.degree = node.tracks.length;\n });\n}\n// Optimize the orientations for nodes in the global `nodes` for displaying the\n// paths in the global `tracks` and the read paths, if applicable, in the\n// global `reads`\nfunction switchNodeOrientation() {\n const pivotPath = tracks[0];\n let countPaths = tracks.slice(1, tracks.length);\n if (config.showReads && reads.length > 0) {\n countPaths = countPaths.concat(reads);\n }\n switchNodeOrientationForPaths(countPaths, pivotPath);\n if (config.showReads && reads.length > 0) {\n // Any changes should be committed back\n for (let i = 0; i < reads.length; i++) {\n if (reads[i] !== countPaths[i + tracks.length - 1]) {\n throw new Error('Read inequality');\n }\n }\n }\n}\n// If more of the given paths pass through a specific node in reverse direction than in\n// regular direction, switch its orientation. Processes all paths' nodes in\n// place, so if you want e.g. a first track with nodes fixed in that\n// orientation, pass it as pivotPath.\n// References and modifies the global nodes variable.\nfunction switchNodeOrientationForPaths(paths, pivotPath) {\n const toSwitch = new Map();\n const pivotNames = pivotPath ? new Set(pivotPath.sequence) : null;\n for (const path of paths) {\n const sequence = path.sequence;\n for (let j = 0; j < sequence.length; j += 1) {\n const nodeName = forward(sequence[j]);\n const currentNode = nodeByName(nodeName);\n if (pivotNames && !pivotNames.has(nodeName)) {\n // do not change orientation for nodes which are part of the pivot path\n const prevOrder = j > 0 ? nodeByName(sequence[j - 1]).order : undefined;\n const nextOrder = j < sequence.length - 1\n ? nodeByName(sequence[j + 1]).order\n : undefined;\n if ((prevOrder === undefined || prevOrder < currentNode.order) &&\n (nextOrder === undefined || currentNode.order < nextOrder)) {\n // Node is visited in increasing order along the path. Reverse\n // visits count towards switching, forward visits against it.\n addToSwitchScore(toSwitch, nodeName, isReverse(sequence[j]) ? 1 : -1);\n }\n if ((prevOrder === undefined || prevOrder > currentNode.order) &&\n (nextOrder === undefined || currentNode.order > nextOrder)) {\n // Node is visited in *decreasing* order along the path, so is already\n // backward: the votes are the other way round.\n addToSwitchScore(toSwitch, nodeName, isReverse(sequence[j]) ? -1 : 1);\n }\n }\n }\n }\n for (const path of paths) {\n path.sequence.forEach((node, nodeIndex) => {\n const score = toSwitch.get(forward(node));\n if (score !== undefined && score > 0) {\n // This node is backward more so flip it around\n path.sequence[nodeIndex] = flip(node);\n path.indexSequence[nodeIndex] = -path.indexSequence[nodeIndex];\n }\n });\n }\n // invert the sequence within the nodes and mark them as \"switched\"\n toSwitch.forEach((value, key) => {\n if (value > 0) {\n const node = nodeByName(key);\n node.seq = getReverseComplement(node.seq);\n node.switched = true;\n }\n });\n}\nfunction addToSwitchScore(scores, nodeName, delta) {\n scores.set(nodeName, (scores.get(nodeName) ?? 0) + delta);\n}\n// calculates the concrete values for the nodes' x-coordinates\nfunction generateNodeXCoords() {\n let currentX = 0;\n let nextX = 20;\n let currentOrder = -1;\n const sortedNodes = nodes.slice();\n sortedNodes.sort(compareNodesByOrder);\n const extra = calculateExtraSpace();\n sortedNodes.forEach(node => {\n if (node.order >= 0) {\n if (node.order > currentOrder) {\n currentOrder = node.order;\n currentX = nextX + 10 * extra[node.order];\n }\n node.x = currentX;\n nextX = Math.max(nextX, currentX + 40 + node.pixelWidth);\n }\n });\n}\n// calculates additional horizontal space needed between two nodes\n// two neighboring nodes have to be moved further apart if there is a lot going on in between them\n// -> edges turning to vertical orientation should not overlap\nfunction calculateExtraSpace() {\n const leftSideEdges = [];\n const rightSideEdges = [];\n const fallAngleAdjustment = [];\n const extra = [];\n for (let i = 0; i <= maxOrder; i += 1) {\n leftSideEdges.push(0);\n rightSideEdges.push(0);\n fallAngleAdjustment.push(0);\n }\n tracks.forEach(track => {\n for (let i = 1; i < track.path.length; i += 1) {\n const seg = track.path[i];\n const prevSeg = track.path[i - 1];\n // Track is going to the same node, account for space taken up by edges looping around\n if (seg.order === prevSeg.order) {\n // repeat or translocation\n if (seg.isForward) {\n leftSideEdges[seg.order] = leftSideEdges[seg.order] + 1;\n }\n else {\n rightSideEdges[seg.order] = rightSideEdges[seg.order] + 1;\n }\n }\n else {\n // Track is going to a different node; account for space needed to limit rise/fall angle\n const yDifference = Math.abs((seg.y ?? 0) - (prevSeg.y ?? 0));\n //TODO: Extra space should also be accounted when there are too many tracks curving at the nodes\n fallAngleAdjustment[seg.order] = Math.max(yDifference / 17.5, fallAngleAdjustment[seg.order]);\n }\n }\n });\n extra.push(Math.max(0, leftSideEdges[0] - 1));\n for (let i = 1; i <= maxOrder; i += 1) {\n // Extra space uses space needed for edges(tracks looping), or space needed to limit rise/fall angle, whichever is larger\n extra.push(Math.max(Math.max(0, leftSideEdges[i] - 1) +\n Math.max(0, rightSideEdges[i - 1] - 1), fallAngleAdjustment[i]));\n }\n return extra;\n}\n// create and fill assignment-variable, which contains info about tracks and lanes for each order-value\nfunction generateLaneAssignment() {\n let segmentNumber;\n let currentNodeIndex;\n let currentNodeIsForward;\n let currentNode;\n let previousNode;\n let previousNodeIsForward;\n // For each horizontal order slot, for each track number, holds the\n // SegmentAssignment object for the visit of that track to that order slot.\n // When an order slot is visited multiple times, holds whatever\n // SegmentAssignment was created most recently.\n const prevSegmentPerOrderPerTrack = [];\n // Index into assignments[order] by node, so addToAssignment can find an\n // existing entry without scanning the whole order slot.\n const assignmentByOrderAndNode = [];\n // create empty variables\n for (let i = 0; i <= maxOrder; i += 1) {\n assignments[i] = [];\n assignmentByOrderAndNode[i] = new Map();\n prevSegmentPerOrderPerTrack[i] = [];\n for (let j = 0; j < tracks.length; j += 1) {\n prevSegmentPerOrderPerTrack[i][j] = null;\n }\n }\n tracks.forEach((track, trackNo) => {\n // Trace along each track and create Segment objects in the track's path\n // field, and SegmentAssignment objects in NodeAssignment objects in all\n // the order slots that are visited by the track. Set up all the\n // cross-reverencing indexes and work out when we need segments to let\n // tracks pass nodes and turn around, but leave all the assigned lane\n // values empty for now.\n // add info for start of track\n currentNodeIndex = Math.abs(track.indexSequence[0]);\n currentNodeIsForward = isForwardIndex(track.indexSequence[0]);\n currentNode = nodes[currentNodeIndex];\n track.path = [];\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, 0, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber = 1;\n for (let i = 1; i < track.sequence.length; i += 1) {\n previousNode = currentNode;\n previousNodeIsForward = currentNodeIsForward;\n currentNodeIndex = Math.abs(track.indexSequence[i]);\n currentNodeIsForward = isForwardIndex(track.indexSequence[i]);\n currentNode = nodes[currentNodeIndex];\n if (currentNode.order > previousNode.order) {\n if (!previousNodeIsForward) {\n // backward to forward at previous node\n track.path.push({\n order: previousNode.order,\n lane: null,\n isForward: true,\n node: null,\n });\n addToAssignment(previousNode.order, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n for (let j = previousNode.order + 1; j < currentNode.order; j += 1) {\n // forward without nodes\n track.path.push({\n order: j,\n lane: null,\n isForward: true,\n node: null,\n });\n addToAssignment(j, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n if (!currentNodeIsForward) {\n // forward to backward at current node\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: true,\n node: null,\n });\n addToAssignment(currentNode.order, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: false,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n else {\n // current Node forward\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: true,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n }\n else if (currentNode.order < previousNode.order) {\n if (previousNodeIsForward) {\n // turnaround from fw to bw at previous node\n track.path.push({\n order: previousNode.order,\n lane: null,\n isForward: false,\n node: null,\n });\n addToAssignment(previousNode.order, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n for (let j = previousNode.order - 1; j > currentNode.order; j -= 1) {\n // bachward without nodes\n track.path.push({\n order: j,\n lane: null,\n isForward: false,\n node: null,\n });\n addToAssignment(j, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n if (currentNodeIsForward) {\n // backward to forward at current node\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: false,\n node: null,\n });\n addToAssignment(currentNode.order, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: true,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n else {\n // backward at current node\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: false,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n }\n else {\n if (currentNodeIsForward !== previousNodeIsForward) {\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n else {\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: !currentNodeIsForward,\n node: null,\n });\n addToAssignment(currentNode.order, null, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n track.path.push({\n order: currentNode.order,\n lane: null,\n isForward: currentNodeIsForward,\n node: currentNodeIndex,\n });\n addToAssignment(currentNode.order, currentNodeIndex, trackNo, segmentNumber, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode);\n segmentNumber += 1;\n }\n }\n }\n });\n // Now sweep left to right across order slots and assign vertical lanes to all the segments.\n for (let i = 0; i <= maxOrder; i += 1) {\n generateSingleLaneAssignment(assignments[i], i); // this is where the lanes get assigned\n }\n}\nfunction addToAssignment(order, nodeIndex, trackNo, segmentID, prevSegmentPerOrderPerTrack, assignmentByOrderAndNode) {\n const segment = {\n trackID: trackNo,\n segmentID,\n compareToFromSame: prevSegmentPerOrderPerTrack[order][trackNo] ?? null,\n };\n // A null node means the track is passing through / turning around here rather\n // than visiting a node, so such segments never share a NodeAssignment.\n const existing = nodeIndex === null\n ? undefined\n : assignmentByOrderAndNode[order].get(nodeIndex);\n if (existing === undefined) {\n const assignment = {\n type: 'single',\n node: nodeIndex,\n tracks: [segment],\n };\n assignments[order].push(assignment);\n if (nodeIndex !== null) {\n assignmentByOrderAndNode[order].set(nodeIndex, assignment);\n }\n }\n else {\n // add to existing node in assignment\n existing.type = 'multiple';\n existing.tracks.push(segment);\n }\n prevSegmentPerOrderPerTrack[order][trackNo] = segment;\n}\n// looks at assignment and sets idealY and idealLane by looking at where the tracks come from\nfunction getIdealLanesAndCoords(assignment, order) {\n let index;\n assignment.forEach(node => {\n node.idealLane = 0;\n node.tracks.forEach(track => {\n if (track.segmentID === 0) {\n track.idealLane = track.trackID;\n track.idealY = null;\n }\n else {\n if (tracks[track.trackID].path[track.segmentID - 1].order ===\n order - 1) {\n track.idealLane =\n tracks[track.trackID].path[track.segmentID - 1].lane ?? undefined;\n track.idealY = tracks[track.trackID].path[track.segmentID - 1].y;\n }\n else if (track.segmentID < tracks[track.trackID].path.length - 1 &&\n tracks[track.trackID].path[track.segmentID + 1].order === order - 1) {\n track.idealLane =\n tracks[track.trackID].path[track.segmentID + 1].lane ?? undefined;\n track.idealY = tracks[track.trackID].path[track.segmentID + 1].y;\n }\n else {\n index = track.segmentID - 1;\n while (index >= 0 &&\n tracks[track.trackID].path[index].order !== order - 1) {\n index -= 1;\n }\n if (index < 0) {\n track.idealLane = track.trackID;\n track.idealY = null;\n }\n else {\n track.idealLane =\n tracks[track.trackID].path[index].lane ?? undefined;\n track.idealY = tracks[track.trackID].path[index].y;\n }\n }\n }\n node.idealLane += track.idealLane;\n });\n node.idealLane /= node.tracks.length;\n });\n}\n// assigns the optimal lanes for a single horizontal position (=order)\n// first an ideal lane is calculated for each track (which is ~ the lane of its predecessor)\n// then the nodes are sorted by their average ideal lane\n// and the whole construct is then moved up or down if necessary\nfunction generateSingleLaneAssignment(assignment, order) {\n let currentLane = 0;\n const potentialAdjustmentValues = new Set();\n let currentY = 20;\n let prevNameIsNull = false;\n let prevTrack = -1;\n getIdealLanesAndCoords(assignment, order);\n assignment.sort(compareByIdealLane);\n assignment.forEach(node => {\n if (node.node !== null) {\n nodes[node.node].topLane = currentLane;\n if (prevNameIsNull)\n currentY -= 10;\n nodes[node.node].y = currentY;\n nodes[node.node].contentHeight = 0;\n prevNameIsNull = false;\n }\n else {\n if (prevNameIsNull)\n currentY -= 25;\n else if (currentY > 20)\n currentY -= 10;\n prevNameIsNull = true;\n }\n node.tracks.sort(compareByIdealLane);\n node.tracks.forEach(track => {\n track.lane = currentLane;\n if (track.trackID === prevTrack && node.node === null && prevNameIsNull) {\n currentY += 10;\n }\n tracks[track.trackID].path[track.segmentID].lane = currentLane;\n tracks[track.trackID].path[track.segmentID].y = currentY;\n if (track.idealY != null) {\n potentialAdjustmentValues.add(track.idealY - currentY);\n }\n currentLane += 1;\n currentY += tracks[track.trackID].width;\n if (node.node !== null) {\n nodes[node.node].contentHeight += tracks[track.trackID].width;\n }\n prevTrack = track.trackID;\n });\n currentY += 25;\n });\n adjustVertically(assignment, potentialAdjustmentValues);\n}\n// moves all tracks at a single horizontal location (=order) up/down to minimize lane changes\nfunction adjustVertically(assignment, potentialAdjustmentValues) {\n let verticalAdjustment = 0;\n let minAdjustmentCost = Number.MAX_SAFE_INTEGER;\n potentialAdjustmentValues.forEach(moveBy => {\n if (getVerticalAdjustmentCost(assignment, moveBy) < minAdjustmentCost) {\n minAdjustmentCost = getVerticalAdjustmentCost(assignment, moveBy);\n verticalAdjustment = moveBy;\n }\n });\n assignment.forEach(node => {\n if (node.node !== null) {\n nodes[node.node].y += verticalAdjustment;\n }\n node.tracks.forEach(track => {\n const seg = tracks[track.trackID].path[track.segmentID];\n seg.y = seg.y + verticalAdjustment;\n });\n });\n}\n// Budge down all nodes and out-of-node tracks below this node by this amount\nfunction adjustVertically3(node, adjustBy) {\n if (node.order < 0 || assignments[node.order] === undefined)\n return;\n assignments[node.order].forEach(assignmentNode => {\n if (assignmentNode.node !== null) {\n const aNode = nodes[assignmentNode.node];\n if (aNode !== node && aNode.y > node.y) {\n aNode.y += adjustBy;\n assignmentNode.tracks.forEach(track => {\n const seg = tracks[track.trackID].path[track.segmentID];\n seg.y = seg.y + adjustBy;\n });\n }\n }\n else {\n // track-segment not within a node\n assignmentNode.tracks.forEach(track => {\n const seg = tracks[track.trackID].path[track.segmentID];\n if (seg.y >= node.y) {\n seg.y = seg.y + adjustBy;\n }\n });\n }\n });\n if (nodesPerOrder[node.order].length > 0) {\n nodesPerOrder[node.order].forEach(nodeIndex => {\n if (nodes[nodeIndex] !== node && nodes[nodeIndex].y > node.y) {\n nodes[nodeIndex].y += adjustBy;\n }\n });\n }\n}\n// calculates cost of vertical adjustment as vertical distance * width of track\nfunction getVerticalAdjustmentCost(assignment, moveBy) {\n let result = 0;\n assignment.forEach(node => {\n node.tracks.forEach(track => {\n if (track.idealY != null && tracks[track.trackID].type !== 'read') {\n result +=\n Math.abs(track.idealY -\n moveBy -\n tracks[track.trackID].path[track.segmentID].y) * tracks[track.trackID].width;\n }\n });\n });\n return result;\n}\nfunction compareByIdealLane(a, b) {\n if (a.idealLane !== undefined) {\n if (b.idealLane !== undefined) {\n if (a.idealLane < b.idealLane)\n return -1;\n else if (a.idealLane > b.idealLane)\n return 1;\n return 0;\n }\n return -1;\n }\n if (b.idealLane !== undefined) {\n return 1;\n }\n return 0;\n}\nfunction compareNodesByOrder(a, b) {\n if (!a) {\n if (!b)\n return 0;\n return -1;\n }\n if (!b)\n return 1;\n if (a.order !== undefined) {\n if (b.order !== undefined) {\n if (a.order < b.order)\n return -1;\n else if (a.order > b.order)\n return 1;\n if (a.y !== undefined && b.y !== undefined) {\n if (a.y < b.y)\n return -1;\n else if (a.y > b.y)\n return 1;\n }\n return 0;\n }\n return -1;\n }\n if (b.order !== undefined)\n return 1;\n return 0;\n}\nfunction addTrackFeatures() {\n let nodeStart;\n let nodeEnd;\n let feature = {};\n bed.forEach(line => {\n let i = 0;\n while (i < tracks.length && tracks[i].name !== line.track)\n i += 1;\n if (i < tracks.length) {\n nodeStart = 0;\n tracks[i].path.forEach(node => {\n if (node.node !== null) {\n feature = {};\n nodeEnd = nodeStart + nodes[node.node].sequenceLength - 1;\n if (nodeStart >= line.start && nodeStart <= line.end) {\n feature.start = 0;\n }\n if (nodeStart < line.start && nodeEnd >= line.start) {\n feature.start = line.start - nodeStart;\n }\n if (nodeEnd <= line.end && nodeEnd >= line.start) {\n feature.end = nodeEnd - nodeStart;\n if (nodeEnd < line.end)\n feature.continue = true;\n }\n if (nodeEnd > line.end && nodeStart <= line.end) {\n feature.end = line.end - nodeStart;\n }\n if (feature.start !== undefined) {\n feature.type = line.type;\n feature.name = line.name;\n if (node.features === undefined)\n node.features = [];\n node.features.push(feature);\n }\n nodeStart = nodeEnd + 1;\n }\n });\n }\n });\n}\nfunction calculateTrackWidth() {\n // flag: if vg returns freq of 0 for all tracks, we will increase width manually\n let allAreFour = true;\n const NARROW_WIDTH = 4;\n const WIDE_WIDTH = config.trackWidth;\n tracks.forEach(track => {\n if (track.freq !== undefined) {\n // custom track width\n track.width = Math.round((Math.log(track.freq) + 1) * NARROW_WIDTH);\n }\n else {\n // default track width\n track.width = WIDE_WIDTH;\n if (track.type !== undefined && track.type === 'read') {\n track.width = NARROW_WIDTH;\n }\n }\n if (track.width !== NARROW_WIDTH) {\n allAreFour = false;\n }\n });\n if (allAreFour) {\n tracks.forEach(track => {\n if (track.freq !== undefined) {\n track.width = WIDE_WIDTH;\n }\n });\n }\n}\nfunction getReadXStart(read) {\n const seg = read.path[0];\n const node = nodes[seg.node];\n const offset = read.firstNodeOffset ?? 0;\n // read starts in forward direction, or backward from the node's far end\n return clampedXCoordinateOfBaseWithinNode(node, seg.isForward ? offset : node.sequenceLength - offset);\n}\nfunction getReadXEnd(read) {\n const seg = read.path[read.path.length - 1];\n const node = nodes[seg.node];\n const cover = read.finalNodeCoverLength ?? 0;\n // read ends in forward direction, or backward from the node's far end\n return clampedXCoordinateOfBaseWithinNode(node, seg.isForward ? cover : node.sequenceLength - cover);\n}\n// returns the x coordinate (in pixels) of (the left side) of the given base\n// position within the given node, or null if the position is past its end\nexport function getXCoordinateOfBaseWithinNode(node, base) {\n if (base > node.sequenceLength)\n return null; // equality is allowed\n return clampedXCoordinateOfBaseWithinNode(node, base);\n}\n// Same, but a base outside the node maps to the nearest node edge. Callers that\n// have to produce a coordinate no matter what use this: falling back to 0 would\n// put the shape at the far left of the whole image instead.\nexport function clampedXCoordinateOfBaseWithinNode(node, base) {\n const [nodeLeftX, nodeRightX] = nodePixelCoordinatesInX(node);\n if (node.sequenceLength === 0) {\n return nodeLeftX;\n }\n const clamped = Math.min(Math.max(base, 0), node.sequenceLength);\n return nodeLeftX + (clamped / node.sequenceLength) * (nodeRightX - nodeLeftX);\n}\n// transforms the info in the tracks' path attribute into actual coordinates\n// and saves them in shapes.rectangles and shapes.curves\nfunction generateSVGShapesFromPath() {\n let xStart;\n let xEnd;\n let yStart;\n let yEnd;\n let trackColor;\n let trackAlpha;\n let highlight;\n let dummy;\n let reversalFlag;\n for (let i = 0; i <= maxOrder; i += 1) {\n extraLeft.push(0);\n extraRight.push(0);\n }\n // generate x coords where each order starts and ends\n const orderStartX = [];\n const orderEndX = [];\n nodes.forEach(node => {\n if (node.x !== undefined) {\n orderStartX[node.order] = node.x;\n if (orderEndX[node.order] === undefined) {\n orderEndX[node.order] = node.x + node.pixelWidth;\n }\n else {\n orderEndX[node.order] = Math.max(orderEndX[node.order], node.x + node.pixelWidth);\n }\n }\n });\n // Helps generation of verticalRectangles, correct increments of extraRight and extraLeft\n tracks.sort(compareTrackByInitialOrdering);\n tracks.forEach(track => {\n highlight = 'plain';\n // Both are pure functions of (track, highlight); alpha doesn't even look at\n // highlight. Recomputing them per path segment was pure overhead.\n trackColor = generateTrackColor(track, highlight);\n trackAlpha = generateTrackAlpha(track);\n let colorHighlight = highlight;\n const colorForCurrentHighlight = () => {\n if (colorHighlight !== highlight) {\n colorHighlight = highlight;\n trackColor = generateTrackColor(track, highlight);\n }\n return trackColor;\n };\n // start of path\n yStart = track.path[0].y;\n if (track.type !== 'read') {\n if (track.sequence[0].startsWith('-')) {\n // The track starts with an inversed node\n xStart = orderEndX[track.path[0].order] + 20;\n }\n else {\n // The track starts with a forward node\n xStart = orderStartX[track.path[0].order] - 20;\n }\n }\n else {\n xStart = getReadXStart(track);\n }\n // middle of path\n for (let i = 0; i < track.path.length; i += 1) {\n if (track.path[i].y === yStart) {\n if (track.path[i].features !== undefined) {\n reversalFlag =\n i > 0 && track.path[i - 1].order === track.path[i].order;\n dummy = createFeatureRectangle(track.path[i], orderStartX[track.path[i].order], orderEndX[track.path[i].order], highlight, track, xStart, yStart, trackColor, reversalFlag);\n highlight = dummy.highlight;\n xStart = dummy.xStart;\n }\n }\n else {\n if (track.path[i - 1].isForward) {\n xEnd = orderEndX[track.path[i - 1].order];\n }\n else {\n xEnd = orderStartX[track.path[i - 1].order];\n }\n if (xEnd !== xStart) {\n trackColor = colorForCurrentHighlight();\n shapes.rectangles.push({\n xStart: Math.min(xStart, xEnd),\n yStart,\n xEnd: Math.max(xStart, xEnd),\n yEnd: yStart + track.width - 1,\n color: trackColor,\n alpha: trackAlpha,\n // TODO: This is not actually the index of the track!\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n if (track.path[i].order - 1 === track.path[i - 1].order) {\n // regular forward connection\n xStart = xEnd;\n xEnd = orderStartX[track.path[i].order];\n yEnd = track.path[i].y;\n trackColor = colorForCurrentHighlight();\n shapes.curves.push({\n xStart,\n yStart,\n xEnd: xEnd + 1,\n yEnd,\n width: track.width,\n color: trackColor,\n alpha: trackAlpha,\n laneChange: Math.abs(track.path[i].lane - track.path[i - 1].lane),\n id: track.id,\n name: track.name,\n type: track.type,\n nodeStart: track.path[i - 1]?.node,\n nodeEnd: track.path[i]?.node,\n });\n xStart = xEnd;\n yStart = yEnd;\n }\n else if (track.path[i].order + 1 === track.path[i - 1].order) {\n // regular backward connection\n xStart = xEnd;\n xEnd = orderEndX[track.path[i].order];\n yEnd = track.path[i].y;\n trackColor = colorForCurrentHighlight();\n shapes.curves.push({\n xStart: xStart + 1,\n yStart,\n xEnd,\n yEnd,\n width: track.width,\n color: trackColor,\n alpha: trackAlpha,\n laneChange: Math.abs(track.path[i].lane - track.path[i - 1].lane),\n id: track.id,\n name: track.name,\n type: track.type,\n nodeStart: track.path[i - 1]?.node,\n nodeEnd: track.path[i]?.node,\n });\n xStart = xEnd;\n yStart = yEnd;\n }\n else {\n // change of direction\n if (track.path[i - 1].isForward) {\n yEnd = track.path[i].y;\n generateTurnaround(1, xEnd, yStart, yEnd, track.width, trackColor, track.id, track.path[i].order, track.type, track.name);\n xStart = orderEndX[track.path[i].order];\n yStart = track.path[i].y;\n }\n else {\n yEnd = track.path[i].y;\n generateTurnaround(-1, xEnd, yStart, yEnd, track.width, trackColor, track.id, track.path[i].order, track.type, track.name);\n xStart = orderStartX[track.path[i].order];\n yStart = track.path[i].y;\n }\n }\n if (track.path[i].features !== undefined) {\n reversalFlag = track.path[i - 1].order === track.path[i].order;\n dummy = createFeatureRectangle(track.path[i], orderStartX[track.path[i].order], orderEndX[track.path[i].order], highlight, track, xStart, yStart, trackColor, reversalFlag);\n highlight = dummy.highlight;\n xStart = dummy.xStart;\n }\n }\n }\n // ending edges\n if (track.type !== 'read') {\n if (!track.path[track.path.length - 1].isForward) {\n // The track ends with an inversed node\n xEnd = orderStartX[track.path[track.path.length - 1].order] - 20;\n }\n else {\n // The track ends with a forward node\n xEnd = orderEndX[track.path[track.path.length - 1].order] + 20;\n }\n }\n else {\n xEnd = getReadXEnd(track);\n }\n shapes.rectangles.push({\n xStart: Math.min(xStart, xEnd),\n yStart,\n xEnd: Math.max(xStart, xEnd),\n yEnd: yStart + track.width - 1,\n color: trackColor,\n alpha: trackAlpha,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n });\n}\n// Sankey-mode synthesis: one synthetic \"read\" per (srcSigned \u2192 dstSigned) edge,\n// fed through the normal placeReads/generateSVGShapesFromPath pipeline so the\n// band gets the same lane assignment, loop topology, bezier shape, AND color\n// scheme as a real read \u2014 colors come from generateTrackColor's natural\n// `id % palette.length` rotation, no custom palette needed.\n//\n// Synthetic-track ids live above this base so they don't collide with real\n// track ids and so click/hover handlers can show count info instead of the\n// per-read info dialog.\nconst COARSENED_ID_BASE = 1_000_000_000;\nexport const isCoarsenedId = (id) => id >= COARSENED_ID_BASE;\n// Build one synthetic read per (srcSigned \u2192 dstSigned) edge in `source`\n// (real reads, or the alt haplotype tracks). The synthetic reads replace the\n// real ones BEFORE placeReads runs, so:\n// \u2022 placeReads sees N_edges reads instead of N_reads (huge node-height win),\n// \u2022 each band gets a lane and an \"right-down-left-up-right\" loop topology\n// for free (placeReads handles reversals and out-of-order jumps),\n// \u2022 generateSVGShapesFromPath emits exactly one TrackCurve per band using\n// the same bezier as a real read \u2014 no special draw path needed.\n//\n// The synthetic track's `sequence` is just the two signed node names. After\n// generateTrackIndexSequences runs, indexSequence is set and the rest of the\n// layout follows.\nfunction buildCoarsenedSyntheticBands(source, unit) {\n coarsenedEdgeMeta = new Map();\n const edges = new Map();\n // When ignoring strand, (+A\u2192+B) and (-B\u2192-A) refer to the same underlying\n // graph connection \u2014 collapse both into one canonical key. We pick the\n // lexicographically smaller of the two orientations so a stable canonical\n // form is chosen; whichever orientation is seen first determines the\n // visual band direction.\n const ignoreStrand = config.ignoreStrand;\n for (const item of source) {\n const seq = item.indexSequence;\n if (!seq || seq.length < 2)\n continue;\n for (let i = 0; i < seq.length - 1; i += 1) {\n const sSigned = seq[i];\n const dSigned = seq[i + 1];\n const sIdx = Math.abs(sSigned);\n const dIdx = Math.abs(dSigned);\n const srcNode = nodes[sIdx];\n const dstNode = nodes[dIdx];\n if (!srcNode || !dstNode)\n continue;\n let key;\n if (ignoreStrand) {\n const a = `${sSigned}>${dSigned}`;\n const b = `${-dSigned}>${-sSigned}`;\n key = a < b ? a : b;\n }\n else {\n key = `${sSigned}>${dSigned}`;\n }\n const existing = edges.get(key);\n if (existing === undefined) {\n edges.set(key, {\n sSigned,\n dSigned,\n sName: sSigned < 0 ? `-${srcNode.name}` : srcNode.name,\n dName: dSigned < 0 ? `-${dstNode.name}` : dstNode.name,\n count: 1,\n sourceTrackID: item.sourceTrackID,\n });\n }\n else {\n existing.count += 1;\n }\n }\n }\n // Square-root scaling on count gives heavy edges visible weight without\n // letting one massive edge dwarf everything else. Min stays near READ_WIDTH\n // so single-read edges still look like a normal read; max is generous so\n // hot edges read as obvious \"highways.\"\n let maxEdgeCount = 0;\n for (const e of edges.values()) {\n if (e.count > maxEdgeCount)\n maxEdgeCount = e.count;\n }\n const BAND_MIN_WIDTH = READ_WIDTH;\n const BAND_MAX_WIDTH = 60;\n const widthForCount = (c) => {\n if (maxEdgeCount <= 1)\n return BAND_MIN_WIDTH;\n return (BAND_MIN_WIDTH +\n (BAND_MAX_WIDTH - BAND_MIN_WIDTH) * Math.sqrt(c / maxEdgeCount));\n };\n const synthetic = [];\n let i = 0;\n for (const edge of edges.values()) {\n const id = COARSENED_ID_BASE + i;\n const label = `${edge.count.toLocaleString()} ${unit}${edge.count === 1 ? '' : 's'}: Node ${edge.sName} \u2192 Node ${edge.dName}`;\n coarsenedEdgeMeta.set(id, { count: edge.count, label });\n // Place each synthetic band so it touches *only* its endpoint nodes' edges:\n // \u2022 firstNodeOffset = src.sequenceLength \u2192 curve exits at src's right\n // pixel edge, no rectangle drawn inside src.\n // \u2022 finalNodeCoverLength = 0 \u2192 curve enters at dst's left pixel edge,\n // no rectangle drawn inside dst.\n // The crucial side effect is in placeReadSet's conflict check: at any\n // node B with an incoming edge (A\u2192B) and an outgoing edge (B\u2192C), the\n // incoming's finalNodeCoverLength=0 and the outgoing's firstNodeOffset=\n // B.length leave them with no horizontal overlap, so they share a single\n // lane. Node heights collapse from ~(N_in + N_out) lanes down to\n // ~max(N_in, N_out) lanes.\n //\n // Note: reverseReversedReads will swap firstNodeOffset/finalNodeCoverLength\n // for fully-reverse synthetics. The math works out: pre-flip values of\n // (srcLen, 0) become post-flip (newSrcLen, 0), which is the same pattern\n // \u2014 bands stay edge-only regardless of orientation.\n const srcLen = nodes[Math.abs(edge.sSigned)]?.sequenceLength ?? 0; // node may be absent for a dangling edge\n synthetic.push({\n id,\n sourceTrackID: edge.sourceTrackID,\n type: 'read',\n // Human-readable so the name surfaces sensibly in any UI that uses it\n // (right-click \u2192 add to group, etc.) \u2014 and so trackTooltipText fallback\n // shows something meaningful.\n name: label,\n sequence: [edge.sName, edge.dName],\n indexSequence: [],\n path: [],\n // Pre-set width so placeReads / placeReadSet allocate the right vertical\n // space and assignReadsToNodes (patched to honor pre-set widths) leaves\n // it alone.\n width: widthForCount(edge.count),\n firstNodeOffset: srcLen,\n finalNodeCoverLength: 0,\n sequenceNew: [\n { nodeName: edge.sName, mismatches: [] },\n { nodeName: edge.dName, mismatches: [] },\n ],\n mapping_quality: 0,\n is_secondary: false,\n sample_name: null,\n read_group: null,\n score: edge.count,\n });\n i += 1;\n }\n // Single-line debug summary so the user can verify node sizing.\n let tallestName = '?';\n let tallestH = 0;\n for (const n of nodes) {\n if (!n)\n continue;\n const h = n.contentHeight;\n if (h > tallestH) {\n tallestH = h;\n tallestName = n.name;\n }\n }\n if (DEBUG) {\n console.log(`[coarsened] ${unit}s_in=${source.length} edges_out=${synthetic.length} ` +\n `tallestNodeBeforePlace=${tallestName}(${tallestH.toFixed(1)})`);\n }\n return synthetic;\n}\nfunction createFeatureRectangle(node, nodeXStart, nodeXEnd, highlight, track, rectXStart, yStart, trackColor, reversalFlag) {\n let currentHighlight = highlight;\n let c;\n let co;\n let featureXStart;\n let featureXEnd;\n nodeXStart -= 8;\n nodeXEnd += 8;\n const nodeWidth = nodes[node.node].sequenceLength;\n node.features.sort((a, b) => a.start - b.start);\n node.features.forEach(feature => {\n if (currentHighlight !== feature.type) {\n // finish incoming rectangle\n c = generateTrackColor(track, currentHighlight);\n if (node.isForward) {\n featureXStart =\n nodeXStart +\n Math.round((feature.start * (nodeXEnd - nodeXStart + 1)) / nodeWidth);\n // overwrite narrow post-inversion rectangle if highlight starts near beginning of node\n if (reversalFlag && featureXStart < nodeXStart + 8) {\n featureXEnd =\n nodeXStart +\n Math.round(((feature.end + 1) * (nodeXEnd - nodeXStart + 1)) / nodeWidth) -\n 1;\n co = generateTrackColor(track, feature.type);\n shapes.featureRectangles.push({\n xStart: featureXStart,\n yStart,\n xEnd: featureXEnd,\n yEnd: yStart + track.width - 1,\n color: co,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n if (featureXStart > rectXStart + 1) {\n shapes.featureRectangles.push({\n xStart: rectXStart,\n yStart,\n xEnd: featureXStart - 1,\n yEnd: yStart + track.width - 1,\n color: c,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n }\n else {\n featureXStart =\n nodeXEnd -\n Math.round((feature.start * (nodeXEnd - nodeXStart + 1)) / nodeWidth);\n // overwrite narrow post-inversion rectangle if highlight starts near beginning of node\n if (reversalFlag && featureXStart > nodeXEnd - 8) {\n featureXEnd =\n nodeXEnd -\n Math.round(((feature.end + 1) * (nodeXEnd - nodeXStart + 1)) / nodeWidth) -\n 1;\n co = generateTrackColor(track, feature.type);\n shapes.featureRectangles.push({\n xStart: featureXEnd,\n yStart,\n xEnd: featureXStart,\n yEnd: yStart + track.width - 1,\n color: co,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n if (rectXStart > featureXStart + 1) {\n shapes.featureRectangles.push({\n xStart: featureXStart + 1,\n yStart,\n xEnd: rectXStart,\n yEnd: yStart + track.width - 1,\n color: c,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n }\n rectXStart = featureXStart;\n currentHighlight = feature.type;\n }\n if (feature.end < nodeWidth - 1 || feature.continue === undefined) {\n // finish internal rectangle\n c = generateTrackColor(track, currentHighlight);\n if (node.isForward) {\n featureXEnd =\n nodeXStart +\n Math.round(((feature.end + 1) * (nodeXEnd - nodeXStart + 1)) / nodeWidth) -\n 1;\n shapes.featureRectangles.push({\n xStart: rectXStart,\n yStart,\n xEnd: featureXEnd,\n yEnd: yStart + track.width - 1,\n color: c,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n else {\n featureXEnd =\n nodeXEnd -\n Math.round(((feature.end + 1) * (nodeXEnd - nodeXStart + 1)) / nodeWidth) -\n 1;\n shapes.featureRectangles.push({\n xStart: featureXEnd,\n yStart,\n xEnd: rectXStart,\n yEnd: yStart + track.width - 1,\n color: c,\n id: track.id,\n name: track.name,\n type: track.type,\n });\n }\n rectXStart = featureXEnd + 1;\n currentHighlight = 'plain';\n }\n });\n return { xStart: rectXStart, highlight: currentHighlight };\n}\nconst MIN_BEND_WIDTH = 7;\n// Emit the vertical rectangles + rounded corners for a track turning around at\n// one end of an order slot. The two directions are mirror images of each other:\n// a forward-to-reverse turn bulges out to the right of the node and consumes an\n// `extraRight` slot, a reverse-to-forward turn bulges out to the left and\n// consumes an `extraLeft` slot. `dir` is +1 for right, -1 for left.\nfunction generateTurnaround(dir, x, yStart, yEnd, trackWidth, trackColor, trackID, order, type, trackName) {\n const extra = dir === 1 ? extraRight : extraLeft;\n const offset = 10 * extra[order];\n // The turn's apex, and the outward direction from it.\n const apex = x + dir * (offset + 5);\n const radius = MIN_BEND_WIDTH;\n const stem = Math.min(MIN_BEND_WIDTH, trackWidth);\n const yTop = Math.min(yStart, yEnd);\n const yBottom = Math.max(yStart, yEnd);\n // The incoming/outgoing stubs run from the node's edge out to the apex. The\n // one-pixel asymmetry between the two directions is carried over verbatim\n // from the original pair of functions.\n const stubNear = dir === 1 ? x : apex - 1;\n const stubFar = dir === 1 ? apex : x;\n const horizontal = (segTop) => {\n shapes.verticalRectangles.push({\n xStart: stubNear,\n yStart: segTop,\n xEnd: stubFar,\n yEnd: segTop + trackWidth - 1,\n color: trackColor,\n id: trackID,\n name: trackName,\n type,\n });\n };\n // elongate the incoming and outgoing rectangles a bit past the node\n horizontal(yStart);\n shapes.verticalRectangles.push({\n xStart: dir === 1 ? apex + radius : apex - radius - stem,\n yStart: yTop + trackWidth + radius - 1,\n xEnd: dir === 1 ? apex + radius + stem - 1 : apex - radius - 1,\n yEnd: yBottom - radius + 1,\n color: trackColor,\n id: trackID,\n name: trackName,\n type,\n });\n horizontal(yEnd);\n const inner = apex + dir * radius;\n const outer = apex + dir * (radius + stem);\n // bottom 90 degree bend\n let d = `M ${apex} ${yBottom}`;\n d += ` Q ${inner} ${yBottom} ${inner} ${yBottom - radius}`;\n d += ` H ${outer}`;\n d += ` Q ${outer} ${yBottom + trackWidth} ${apex} ${yBottom + trackWidth}`;\n d += ' Z ';\n shapes.corners.push({ path: d, color: trackColor, id: trackID, type });\n // top 90 degree bend\n d = `M ${apex} ${yTop}`;\n d += ` Q ${outer} ${yTop} ${outer} ${yTop + trackWidth + radius}`;\n d += ` H ${inner}`;\n d += ` Q ${inner} ${yTop + trackWidth} ${apex} ${yTop + trackWidth}`;\n d += ' Z ';\n shapes.corners.push({ path: d, color: trackColor, id: trackID, type });\n extra[order] += 1;\n}\nexport function nodePixelCoordinatesInX(node) {\n // Add and subtract 4 to account for stroke width - TODO: figure out what the 4 means\n const nodeLeftX = node.x - 4;\n const nodeRightX = node.x + node.pixelWidth + 4;\n return [nodeLeftX, nodeRightX];\n}\n// calculate node widths depending on sequence lengths and chosen calculation method\nfunction generateNodeWidth() {\n // Promote the input's optional sequenceLength; Node declares it required, so\n // widen to InputNode to make the still-possibly-undefined read explicit.\n nodes.forEach((node) => {\n if (node.sequenceLength === undefined) {\n node.sequenceLength = node.seq.length;\n }\n });\n switch (config.nodeWidthOption) {\n case 'compressed':\n nodes.forEach(node => {\n node.width = 1 + Math.log(node.sequenceLength) / Math.log(2);\n node.pixelWidth = Math.round((node.width - 1) * 8.401);\n });\n break;\n case 'small':\n nodes.forEach(node => {\n node.width = node.sequenceLength / 100;\n node.pixelWidth = Math.round((node.width - 1) * 8.401);\n });\n break;\n case 'fixed':\n // when there's no reads in the node, it should be a little wider\n nodes.forEach(node => {\n node.width = 10;\n node.pixelWidth = Math.round(node.width * 8.401);\n });\n break;\n case 'normal': {\n // The sequence is drawn in a monospace font, so one character's width,\n // which the caller measures, sizes every node.\n const charWidth = config.charWidth;\n nodes.forEach(node => {\n node.width = node.sequenceLength;\n const len = node.seq?.length ?? 1;\n node.pixelWidth = Math.round(charWidth * len);\n });\n break;\n }\n default:\n throw new Error(`${config.nodeWidthOption} not implemented`);\n }\n}\n// remove redundant nodes\n// two nodes A and B can be merged if all tracks leaving A go directly into B\n// and all tracks entering B come directly from A\n// (plus no inversions involved)\nfunction mergeNodes() {\n let nodeName;\n let nodeName2;\n // One set per node index, including the hole at 0 (Array.from materializes\n // holes, unlike forEach/map).\n const predSets = Array.from(nodes, () => new Set());\n const succSets = Array.from(nodes, () => new Set());\n let tracksAndReads;\n if (config.showReads && reads.length > 0)\n tracksAndReads = tracks.concat(reads);\n else\n tracksAndReads = tracks;\n tracksAndReads.forEach(track => {\n for (let i = 0; i < track.sequence.length; i += 1) {\n if (!isReverse(track.sequence[i])) {\n // forward Node\n if (i > 0) {\n nodeName = track.sequence[i - 1];\n predSets[nodeMap.get(track.sequence[i])].add(nodeName);\n if (isReverse(nodeName)) {\n // add 2 predecessors, to make sure there is no node merging in this case\n predSets[nodeMap.get(track.sequence[i])].add(forward(nodeName));\n }\n }\n else if (track.type === 'haplotype') {\n predSets[nodeMap.get(track.sequence[i])].add('None');\n }\n if (i < track.sequence.length - 1) {\n nodeName = track.sequence[i + 1];\n succSets[nodeMap.get(track.sequence[i])].add(nodeName);\n if (isReverse(nodeName)) {\n // add 2 successors, to make sure there is no node merging in this case\n succSets[nodeMap.get(track.sequence[i])].add(forward(nodeName));\n }\n }\n else if (track.type === 'haplotype') {\n succSets[nodeMap.get(track.sequence[i])].add('None');\n }\n }\n else {\n // reverse Node\n nodeName = forward(track.sequence[i]);\n if (i > 0) {\n nodeName2 = track.sequence[i - 1];\n if (isReverse(nodeName2)) {\n succSets[nodeMap.get(nodeName)].add(forward(nodeName2));\n }\n else {\n // add 2 successors, to make sure there is no node merging in this case\n succSets[nodeMap.get(nodeName)].add(nodeName2);\n succSets[nodeMap.get(nodeName)].add(reverse(nodeName2));\n }\n }\n else if (track.type === 'haplotype') {\n succSets[nodeMap.get(nodeName)].add('None');\n }\n if (i < track.sequence.length - 1) {\n nodeName2 = track.sequence[i + 1];\n if (isReverse(nodeName2)) {\n predSets[nodeMap.get(nodeName)].add(forward(nodeName2));\n }\n else {\n predSets[nodeMap.get(nodeName)].add(nodeName2);\n predSets[nodeMap.get(nodeName)].add(reverse(nodeName2));\n }\n }\n else if (track.type === 'haplotype') {\n predSets[nodeMap.get(nodeName)].add('None');\n }\n }\n }\n });\n // convert sets to arrays\n const pred = predSets.map(s => Array.from(s));\n const succ = succSets.map(s => Array.from(s));\n // update reads which pass through merging nodes\n if (config.showReads && reads.length > 0) {\n // sort nodes by order, then by y-coordinate\n const sortedNodes = nodes.slice();\n sortedNodes.sort(compareNodesByOrder);\n // iterate over all nodes and calculate their position within the new merged node\n // Both maps carry an entry for each orientation of every node name (\"7\"\n // and \"-7\"), because the read update below looks up whichever orientation\n // the read happens to visit.\n const mergeOffset = new Map();\n // maps to leftmost node of a node's \"merging cascade\"\n const mergeOrigin = new Map();\n const offsetOf = (nodeName) => {\n const offset = mergeOffset.get(nodeName);\n if (offset === undefined) {\n throw new Error(`No merge offset recorded for node ${nodeName}`);\n }\n return offset;\n };\n const originOf = (nodeName) => {\n const origin = mergeOrigin.get(nodeName);\n if (origin === undefined) {\n throw new Error(`No merge origin recorded for node ${nodeName}`);\n }\n return origin;\n };\n sortedNodes.forEach(node => {\n const predecessor = mergeableWithPred(nodeMap.get(node.name), pred, succ);\n if (predecessor) {\n // Nodes are visited in order, so the predecessor of a merge cascade is\n // always recorded before the node that follows it.\n const offset = offsetOf(predecessor) + nodeByName(predecessor).sequenceLength;\n mergeOffset.set(node.name, offset);\n mergeOffset.set(reverse(node.name), offset);\n mergeOrigin.set(node.name, originOf(predecessor));\n mergeOrigin.set(reverse(node.name), originOf(predecessor));\n }\n else {\n mergeOffset.set(node.name, 0);\n mergeOffset.set(reverse(node.name), 0);\n mergeOrigin.set(node.name, node.name);\n mergeOrigin.set(reverse(node.name), node.name);\n }\n });\n reads.forEach(read => {\n const sequenceNew = read.sequenceNew ?? [];\n read.firstNodeOffset =\n (read.firstNodeOffset ?? 0) + offsetOf(read.sequence[0]);\n read.finalNodeCoverLength =\n (read.finalNodeCoverLength ?? 0) +\n offsetOf(read.sequence[read.sequence.length - 1]);\n for (let i = read.sequence.length - 1; i >= 0; i -= 1) {\n const nodeName = forward(read.sequence[i]);\n const predecessor = mergeableWithPred(nodeMap.get(nodeName), pred, succ);\n if (predecessor &&\n mergeableWithSucc(nodeMap.get(predecessor), pred, succ)) {\n if (i > 0) {\n read.sequence.splice(i, 1);\n // adjust position of mismatches\n const predLength = nodeByName(predecessor).sequenceLength;\n sequenceNew[i].mismatches.forEach(mismatch => {\n mismatch.pos += predLength;\n });\n // append mismatches to previous entry's mismatches\n sequenceNew[i - 1].mismatches = sequenceNew[i - 1].mismatches.concat(sequenceNew[i].mismatches);\n sequenceNew.splice(i, 1);\n }\n else {\n read.sequence[0] = originOf(read.sequence[0]);\n const firstEntry = sequenceNew[0];\n const firstOffset = offsetOf(firstEntry.nodeName);\n firstEntry.mismatches.forEach(mismatch => {\n mismatch.pos += firstOffset;\n });\n firstEntry.nodeName = originOf(firstEntry.nodeName);\n }\n }\n }\n });\n }\n // update node sequences + sequence lengths\n for (let i = 0; i < nodes.length; i += 1) {\n if (mergeableWithSucc(i, pred, succ) && !mergeableWithPred(i, pred, succ)) {\n let donor = i;\n while (mergeableWithSucc(donor, pred, succ)) {\n donor = nodeMap.get(forward(succ[donor][0]));\n nodes[i].sequenceLength += nodes[donor].sequenceLength;\n nodes[i].seq += nodes[donor].seq;\n }\n }\n }\n // actually merge the nodes by removing the corresponding nodes from track data\n tracks.forEach(track => {\n for (let i = track.sequence.length - 1; i >= 0; i -= 1) {\n nodeName = forward(track.sequence[i]);\n const nodeIndex = nodeMap.get(nodeName);\n if (mergeableWithPred(nodeIndex, pred, succ)) {\n track.sequence.splice(i, 1);\n }\n }\n });\n // remove the nodes from node-array\n for (let i = nodes.length - 1; i >= 0; i -= 1) {\n if (mergeableWithPred(i, pred, succ)) {\n nodes.splice(i, 1);\n }\n }\n}\nfunction mergeableWithPred(index, pred, succ) {\n if (pred[index].length !== 1)\n return false;\n if (pred[index][0] === 'None')\n return false;\n const predecessor = forward(pred[index][0]);\n const predecessorIndex = nodeMap.get(predecessor);\n if (succ[predecessorIndex].length !== 1)\n return false;\n if (succ[predecessorIndex][0] === 'None')\n return false;\n return predecessor;\n}\nfunction mergeableWithSucc(index, pred, succ) {\n if (succ[index].length !== 1)\n return false;\n if (succ[index][0] === 'None')\n return false;\n const successor = forward(succ[index][0]);\n const successorIndex = nodeMap.get(successor);\n if (pred[successorIndex].length !== 1)\n return false;\n if (pred[successorIndex][0] === 'None')\n return false;\n return true;\n}\nfunction filterReads(readList) {\n const focusNames = config.focusReadNames\n ? new Set(config.focusReadNames)\n : null;\n return readList.filter(read => read.is_secondary !== true &&\n (read.mapping_quality ?? 0) >= config.mappingQualityCutoff &&\n (focusNames === null ||\n (read.name !== undefined && focusNames.has(read.name))));\n}\n", "function groupBy(items, key) {\n const groups = new Map();\n for (const item of items) {\n const k = key(item);\n const group = groups.get(k);\n if (group === undefined) {\n groups.set(k, [item]);\n }\n else {\n group.push(item);\n }\n }\n return groups;\n}\nfunction compareCurvesByXYStartValue(a, b) {\n if (a.xStart < b.xStart)\n return 1;\n else if (a.xStart > b.xStart)\n return -1;\n else if (a.yStart > b.yStart)\n return 1;\n else if (a.yStart < b.yStart)\n return -1;\n return 0;\n}\n// The curves of one track type in draw order, each with its `path` set. Curves\n// between the same pair of nodes form a group whose control points fan out, so\n// a bundle of tracks changing lanes together stays parallel rather than\n// crossing at one x.\nexport function curvePaths(curves, type) {\n const groupedCurves = groupBy(curves.filter(curve => curve.type === type), curve => `${curve.nodeStart},${curve.nodeEnd}`);\n groupedCurves.forEach(curveGroup => {\n // Control point adjustment range: 30% to 70% of the original x values\n let adjustValue = 0.3;\n let adjustIncrement = 0.4 / curveGroup.length;\n // Ignore Beziar Curve skewing when a group is not too big\n if (curveGroup.length <= 5) {\n adjustValue = 0.5;\n adjustIncrement = 0;\n }\n curveGroup.sort(compareCurvesByXYStartValue);\n curveGroup.forEach(curve => {\n let xAdjusted;\n // NextAdjusted is used to try to draw a parallel curve on the way back\n let xNextAdjusted;\n if (curve.yStart < curve.yEnd) {\n xAdjusted =\n curve.xStart + (curve.xEnd - curve.xStart) * (1 - adjustValue);\n adjustValue += adjustIncrement;\n xNextAdjusted =\n curve.xStart + (curve.xEnd - curve.xStart) * (1 - adjustValue);\n }\n else {\n xAdjusted = curve.xStart + (curve.xEnd - curve.xStart) * adjustValue;\n adjustValue += adjustIncrement;\n xNextAdjusted = curve.xStart + (curve.xEnd - curve.xStart) * adjustValue;\n }\n let d = `M ${curve.xStart} ${curve.yStart}`;\n d += ` C ${xAdjusted} ${curve.yStart} ${xAdjusted} ${curve.yEnd} ${curve.xEnd} ${curve.yEnd}`;\n d += ` V ${curve.yEnd + curve.width}`;\n d += ` C ${xNextAdjusted} ${curve.yEnd + curve.width} ${xNextAdjusted} ${curve.yStart + curve.width} ${curve.xStart} ${curve.yStart + curve.width}`;\n d += ' Z';\n curve.path = d;\n });\n });\n // One flat list ordered by group, then by the within-group sort\n const groupKeys = Array.from(groupedCurves.keys());\n groupKeys.sort(function (a, b) {\n const aParts = a.split(',').map(Number);\n const bParts = b.split(',').map(Number);\n const a0 = aParts[0] ?? 0;\n const a1 = aParts[1] ?? 0;\n const b0 = bParts[0] ?? 0;\n const b1 = bParts[1] ?? 0;\n if (a0 < b0) {\n return -1;\n }\n else if (a0 > b0) {\n return 1;\n }\n else {\n if (a1 < b1) {\n return -1;\n }\n else if (a1 > b1) {\n return 1;\n }\n else {\n return 0;\n }\n }\n });\n const flattenedGroups = [];\n for (const key of groupKeys) {\n const group = groupedCurves.get(key);\n if (group !== undefined) {\n flattenedGroups.push(...group);\n }\n }\n return flattenedGroups;\n}\n// A node's outline: a rounded box 9 units outside the node's x extent and its\n// content height, the tracks through it inside.\nexport function nodeOutlinePath(node) {\n // top left arc\n let d = `M ${node.x - 9} ${node.y} Q ${node.x - 9} ${node.y - 9} ${node.x} ${node.y - 9}`;\n let x = node.x;\n let y = node.y - 9;\n // top straight\n if (node.width > 1) {\n x += node.pixelWidth;\n d += ` L ${x} ${y}`;\n }\n // top right arc\n d += ` Q ${x + 9} ${y} ${x + 9} ${y + 9}`;\n x += 9;\n y += 9;\n // right straight\n if (node.contentHeight > 0) {\n y += node.contentHeight - 0;\n d += ` L ${x} ${y}`;\n }\n // bottom right arc\n d += ` Q ${x} ${y + 9} ${x - 9} ${y + 9}`;\n x -= 9;\n y += 9;\n // bottom straight\n if (node.width > 1) {\n x -= node.pixelWidth;\n d += ` L ${x} ${y}`;\n }\n // bottom left arc\n d += ` Q ${x - 9} ${y} ${x - 9} ${y - 9}`;\n x -= 9;\n y -= 9;\n // left straight\n if (node.contentHeight > 0) {\n y -= node.contentHeight - 0;\n d += ` L ${x} ${y}`;\n }\n return d;\n}\n", "import {\n canonicalStrand,\n readColor,\n stepName,\n tubeMapReads\n} from \"./chunk-TEDQJPMI.js\";\nimport {\n pathCssColor,\n pathGreyCssColor\n} from \"./chunk-X5L37W4J.js\";\nimport {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/tubeMapLayout.ts\nimport { layoutTubeMap } from \"@gmod/tubemap-core\";\nfunction visitStrands(graph) {\n const strands = /* @__PURE__ */ new Map();\n for (const [segment, visits] of graph.pathVisits ?? []) {\n for (const visit of visits) {\n const key = `${visit.path}\t${segment}`;\n const list = strands.get(key);\n if (list) {\n list.push(visit.strand);\n } else {\n strands.set(key, [visit.strand]);\n }\n }\n }\n return strands;\n}\nfunction tubeMapTracks(graph) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const strands = visitStrands(graph);\n const paths = (graph.paths ?? []).map((path, index) => ({ path, index }));\n const reference = paths.findIndex(\n (p) => pathOrigin(p.path.name).name === graph.referencePath\n );\n if (reference > 0) {\n paths.unshift(...paths.splice(reference, 1));\n }\n return paths.flatMap(({ path, index }) => {\n const visitName = pathOrigin(path.name).name;\n const seen = /* @__PURE__ */ new Map();\n const sequence = path.nodeIds.flatMap((id) => {\n const node = nodeById.get(id);\n if (!node) {\n return [];\n }\n const k = seen.get(node.name) ?? 0;\n seen.set(node.name, k + 1);\n const strand = strands.get(`${visitName}\t${node.name}`)?.[k] ?? canonicalStrand(node);\n return [stepName(node, strand)];\n });\n return sequence.length > 0 ? [\n {\n id: index,\n name: path.name,\n sequence,\n sourceTrackID: 0,\n type: \"haplotype\"\n }\n ] : [];\n });\n}\nfunction tubeMapNodes(graph) {\n return graph.nodes.map((n) => ({\n name: n.id,\n seq: \"\",\n sequenceLength: Math.max(1, n.length)\n }));\n}\nfunction hasTubeMapPaths(graph) {\n return (graph.paths?.length ?? 0) > 0;\n}\nvar STACK_PX = 600;\nvar MIN_TUBE_PX = 3;\nvar MAX_TUBE_PX = 15;\nfunction tubeWidth(trackCount) {\n return Math.max(\n MIN_TUBE_PX,\n Math.min(MAX_TUBE_PX, Math.floor(STACK_PX / Math.max(1, trackCount)))\n );\n}\nfunction runTubeMap(graph) {\n const paths = graph.paths ?? [];\n const tracks = tubeMapTracks(graph);\n const reads = graph.reads ? tubeMapReads(graph, graph.reads, paths.length) : [];\n const tubeColor = reads.length > 0 ? pathGreyCssColor : pathCssColor;\n const pathColors = paths.map((_, i) => tubeColor(i, paths.length));\n const layout = layoutTubeMap(tubeMapNodes(graph), tracks, reads, {\n nodeWidthOption: \"compressed\",\n trackWidth: tubeWidth(tracks.length),\n trackColor: (track) => track.type === \"read\" ? readColor(track) : pathColors[track.id]\n });\n return layout ? { layout, pathColors } : void 0;\n}\nfunction drawnNodes(layout) {\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n nodes.push(node);\n }\n });\n return nodes;\n}\nfunction centreline(node, yOffset, x0, x1) {\n const y = node.y + node.contentHeight / 2 - yOffset;\n return [\n { x: x0, y },\n { x: x1, y }\n ];\n}\nfunction extentOf(layout, yOffset) {\n return {\n minY: layout.bounds.minY - yOffset,\n maxY: layout.bounds.maxY - yOffset\n };\n}\nfunction tubeMapLayout(graph) {\n const run = hasTubeMapPaths(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, pathColors } = run;\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n nodePositions[node.name] = centreline(\n node,\n yOffset,\n node.x,\n node.x + node.pixelWidth\n );\n }\n const { minY, maxY } = extentOf(layout, yOffset);\n return {\n nodePositions,\n tubeMap: { layout, yOffset, pathColors },\n extent: {\n minX: layout.bounds.minX,\n maxX: layout.bounds.maxX,\n minY,\n maxY\n }\n };\n}\nfunction tubeMapColumns(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byOrder = /* @__PURE__ */ new Map();\n for (const node of drawnNodes(layout)) {\n const list = byOrder.get(node.order);\n if (list) {\n list.push(node);\n } else {\n byOrder.set(node.order, [node]);\n }\n }\n const columns = [];\n let end = -Infinity;\n for (const order of [...byOrder.keys()].sort((a, b) => a - b)) {\n const nodes = byOrder.get(order);\n let bp0 = Infinity;\n let bp1 = -Infinity;\n for (const node of nodes) {\n const graphNode = nodeById.get(node.name);\n if (graphNode && isBackbone(graphNode)) {\n bp0 = Math.min(bp0, graphNode.stable.start);\n bp1 = Math.max(bp1, graphNode.stable.start + node.sequenceLength);\n }\n }\n if (bp0 === Infinity) {\n bp0 = bp1 = end;\n }\n if (bp0 < end) {\n bp0 = end;\n bp1 = Math.max(end, bp1);\n }\n end = Math.max(end, bp1);\n columns.push({\n order,\n x0: Math.min(...nodes.map((n) => n.x)),\n x1: Math.max(...nodes.map((n) => n.x + n.pixelWidth)),\n bp0,\n bp1\n });\n }\n const first = columns.find((c) => c.bp0 !== -Infinity);\n for (const column of columns) {\n if (column.bp0 === -Infinity) {\n column.bp0 = column.bp1 = first?.bp0 ?? 0;\n }\n }\n return columns;\n}\nfunction pathsReachBackbone(graph) {\n return graph.nodes.some(isBackbone) && hasTubeMapPaths(graph);\n}\nfunction tubeMapReferenceLayout(graph) {\n const run = pathsReachBackbone(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, pathColors } = run;\n const columns = tubeMapColumns(graph, layout);\n const byOrder = new Map(columns.map((c) => [c.order, c]));\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n const column = byOrder.get(node.order);\n nodePositions[node.name] = centreline(node, yOffset, column.bp0, column.bp1);\n }\n return {\n nodePositions,\n tubeMap: { layout, yOffset, columns, pathColors },\n referenceAxis: true,\n pixelRows: true,\n extent: extentOf(layout, yOffset)\n };\n}\n\nexport {\n visitStrands,\n tubeMapTracks,\n hasTubeMapPaths,\n tubeWidth,\n tubeMapLayout,\n tubeMapReferenceLayout\n};\n", "import {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\nimport {\n REFERENCE_RANK,\n isAnchored\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/alleleProjection/projectAlleles.ts\nfunction parsePanSN(refName) {\n const parts = refName.split(\"#\");\n const haplotype = parts.length >= 2 ? Number(parts[1]) : Number.NaN;\n return {\n sample: parts[0] ?? refName,\n haplotype: Number.isFinite(haplotype) ? haplotype : void 0\n };\n}\nfunction collectRun(seed, byId, adj, claimed) {\n const members = [];\n const anchors = [];\n const queue = [seed];\n claimed.add(seed);\n while (queue.length > 0) {\n const id = queue.pop();\n const node = byId.get(id);\n if (node) {\n members.push(node);\n for (const neighborId of adj.get(id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor) {\n if (neighbor.stable.rank === REFERENCE_RANK) {\n anchors.push(neighbor);\n } else if (!claimed.has(neighborId)) {\n claimed.add(neighborId);\n queue.push(neighborId);\n }\n }\n }\n }\n }\n return { members, anchors };\n}\nfunction anchorSpan(anchors) {\n const refNames = new Set(anchors.map((a) => a.stable.refName));\n if (refNames.size !== 1 || anchors.length < 2) {\n return void 0;\n }\n const sorted = [...anchors].sort((a, b) => a.stable.start - b.stable.start);\n const first = sorted[0];\n const last = sorted.at(-1);\n const start = first.stable.start + first.length;\n const end = last.stable.start;\n return end >= start ? { start, end, entry: first } : void 0;\n}\nfunction runDistances(members, entry, adj) {\n const byId = new Map(members.map((m) => [m.id, m]));\n const dist = /* @__PURE__ */ new Map();\n const queue = [];\n for (const neighborId of adj.get(entry.id) ?? []) {\n if (byId.has(neighborId)) {\n dist.set(neighborId, 0);\n queue.push(neighborId);\n }\n }\n if (queue.length === 0) {\n for (const member of members) {\n dist.set(member.id, 0);\n queue.push(member.id);\n }\n }\n for (const id of queue) {\n const reach = dist.get(id) + byId.get(id).length;\n for (const neighborId of adj.get(id) ?? []) {\n if (byId.has(neighborId)) {\n const known = dist.get(neighborId);\n if (known === void 0 || reach < known) {\n dist.set(neighborId, reach);\n queue.push(neighborId);\n }\n }\n }\n }\n return dist;\n}\nfunction runOffsets(members, entry, adj) {\n const dist = runDistances(members, entry, adj);\n const ordered = [...members].sort((a, b) => dist.get(a.id) - dist.get(b.id));\n const rank = new Map(ordered.map((m, i) => [m.id, i]));\n const byId = new Map(members.map((m) => [m.id, m]));\n const offsets = /* @__PURE__ */ new Map();\n for (const [i, member] of ordered.entries()) {\n let offset = 0;\n for (const neighborId of adj.get(member.id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor && rank.get(neighborId) < i) {\n offset = Math.max(offset, offsets.get(neighborId) + neighbor.length);\n }\n }\n offsets.set(member.id, offset);\n }\n return { offsets, ordered };\n}\nfunction projectAlleles(graph) {\n const byId = new Map(\n graph.nodes.filter(isAnchored).map((n) => [n.id, n])\n );\n const adj = buildNeighbors(graph);\n const claimed = /* @__PURE__ */ new Set();\n const alleles = [];\n for (const node of byId.values()) {\n if (node.stable.rank !== REFERENCE_RANK && !claimed.has(node.id)) {\n const { members, anchors } = collectRun(node.id, byId, adj, claimed);\n const span = anchorSpan(anchors);\n if (span) {\n const { offsets, ordered } = runOffsets(members, span.entry, adj);\n alleles.push({\n start: span.start,\n refSpan: span.end - span.start,\n nodeIds: ordered.map((m) => m.id),\n nodeOffsets: ordered.map((m) => offsets.get(m.id)),\n pathLength: ordered.reduce(\n (max, m) => Math.max(max, offsets.get(m.id) + m.length),\n 0\n )\n });\n }\n }\n }\n return alleles.sort((a, b) => a.start - b.start);\n}\n\nexport {\n parsePanSN,\n projectAlleles\n};\n", "import {\n projectAlleles\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\n\n// src/layout/placeOffReference.ts\nvar MIN_DELETION_BP = 1;\nvar MIN_ALLELE_SPAN_FRACTION = 0.015;\nfunction placeOffReference({\n graph,\n span,\n rowY,\n positions\n}) {\n const minSpan = span * MIN_ALLELE_SPAN_FRACTION;\n const alleles = projectAlleles(graph);\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const alleleDeletions = [];\n for (const allele of alleles) {\n const skipped = allele.refSpan - allele.pathLength;\n if (skipped >= MIN_DELETION_BP) {\n alleleDeletions.push({ nodeIds: allele.nodeIds, bp: skipped });\n }\n const drawn = Math.max(allele.refSpan, minSpan);\n const scale = allele.pathLength > 0 ? drawn / allele.pathLength : 0;\n allele.nodeIds.forEach((nodeId, i) => {\n const node = byId.get(nodeId);\n if (node) {\n const offset = allele.nodeOffsets[i];\n const even = drawn / allele.nodeIds.length;\n const at = (bp) => allele.start + bp * scale;\n const y = rowY(node);\n positions[nodeId] = scale ? [\n { x: at(offset), y },\n { x: at(offset + node.length), y }\n ] : [\n { x: allele.start + i * even, y },\n { x: allele.start + (i + 1) * even, y }\n ];\n }\n });\n }\n const neighbors = buildNeighbors(graph);\n const queue = Object.keys(positions);\n for (const fromId of queue) {\n const fromEnd = positions[fromId].at(-1).x;\n for (const nextId of neighbors.get(fromId) ?? []) {\n const next = byId.get(nextId);\n if (next && !(nextId in positions)) {\n const y = rowY(next);\n positions[nextId] = [\n { x: fromEnd, y },\n { x: fromEnd + minSpan, y }\n ];\n queue.push(nextId);\n }\n }\n }\n return alleleDeletions;\n}\n\nexport {\n placeOffReference\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n parsePanSN\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n isOffReference,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/sampleRowLayout.ts\nfunction contributingSamples(graph, keep) {\n const carried = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n if (isOffReference(node)) {\n const { sample } = parsePanSN(node.stable.refName);\n carried.set(sample, (carried.get(sample) ?? 0) + node.length);\n }\n }\n const held = new Map(keep.map((sample, row) => [sample, row]));\n return [...carried.keys()].sort(\n (a, b) => (held.get(a) ?? Infinity) - (held.get(b) ?? Infinity) || carried.get(b) - carried.get(a) || a.localeCompare(b)\n );\n}\nfunction sampleRowLayout(graph, region, keep = []) {\n const backbone = backboneNodes(graph);\n const samples = contributingSamples(graph, keep);\n if (backbone.length === 0 || samples.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rowOf = new Map(samples.map((s, i) => [s, i + 1]));\n const nodePositions = backbonePositions(backbone);\n const spareRow = samples.length + 1;\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => {\n const stable = node.stable;\n const row = stable ? rowOf.get(parsePanSN(stable.refName).sample) : void 0;\n return (row ?? spareRow) * ROW_HEIGHT_PX;\n },\n positions: nodePositions\n });\n const referenceSample = parsePanSN(backbone[0].stable.refName).sample;\n const rowLabels = [\n { label: referenceSample, y: 0 },\n ...samples.map((sample) => ({\n label: sample,\n y: rowOf.get(sample) * ROW_HEIGHT_PX\n }))\n ];\n return {\n nodePositions,\n rowLabels,\n sampleRows: samples,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n sampleRowLayout\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/anchoredLayout.ts\nfunction rankRows(graph) {\n const present = /* @__PURE__ */ new Set();\n for (const node of graph.nodes) {\n if (node.stable) {\n present.add(node.stable.rank);\n }\n }\n return new Map([...present].sort((a, b) => a - b).map((r, i) => [r, i]));\n}\nfunction anchoredLayout(graph, region) {\n const backbone = backboneNodes(graph);\n if (backbone.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rows = rankRows(graph);\n const nodePositions = backbonePositions(backbone);\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => (node.stable ? rows.get(node.stable.rank) ?? rows.size : rows.size) * ROW_HEIGHT_PX,\n positions: nodePositions\n });\n const rowLabels = [...rows].map(([rank, row]) => ({\n label: rank === 0 ? \"Reference (rank 0)\" : `Rank ${rank}`,\n y: row * ROW_HEIGHT_PX\n }));\n return {\n nodePositions,\n rowLabels,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n anchoredLayout\n};\n", "import {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/orderedLayout.ts\nvar GUTTER = 12;\nvar LANE_PX = ROW_HEIGHT_PX;\nfunction nodeWidth(node) {\n return 10 + 8 * Math.log2(1 + node.length);\n}\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\nfunction compareKeys(a, b) {\n return compare(a.at, b.at) || compare(a.side, b.side) || compare(a.hops, b.hops);\n}\nvar UNREACHED = { at: Infinity, side: 0, hops: 0 };\nfunction referenceOrder(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const key = orderKeys(graph);\n return graph.nodes.map((n) => n.id).sort(\n (a, b) => compareKeys(key.get(a) ?? UNREACHED, key.get(b) ?? UNREACHED) || compare(byId.get(a).name, byId.get(b).name) || compare(a, b)\n );\n}\nfunction placeByWalks(graph, backbone) {\n const isNode = new Set(graph.nodes.map((n) => n.id));\n const startOf = new Map(backbone.map((n) => [n.id, n.stable.start]));\n const next = /* @__PURE__ */ new Map();\n const prev = /* @__PURE__ */ new Map();\n backbone.forEach((n, i) => {\n prev.set(n.id, backbone[i - 1]?.id);\n next.set(n.id, backbone[i + 1]?.id);\n });\n let head = backbone[0]?.id;\n const insertAfter = (at, id) => {\n const after = next.get(at);\n next.set(at, id);\n prev.set(id, at);\n next.set(id, after);\n if (after !== void 0) {\n prev.set(after, id);\n }\n };\n const insertBefore = (at, id) => {\n const before = prev.get(at);\n if (before === void 0) {\n head = id;\n prev.set(id, void 0);\n next.set(id, at);\n prev.set(at, id);\n } else {\n insertAfter(before, id);\n }\n };\n for (const path of graph.paths ?? []) {\n let rising = 0;\n let falling = 0;\n let last;\n for (const id of path.nodeIds) {\n const start = startOf.get(id);\n if (start !== void 0) {\n if (last !== void 0 && start !== last) {\n if (start > last) {\n rising++;\n } else {\n falling++;\n }\n }\n last = start;\n }\n }\n const ids = falling > rising ? [...path.nodeIds].reverse() : path.nodeIds;\n let from;\n const leading = /* @__PURE__ */ new Set();\n for (const id of ids) {\n if (next.has(id)) {\n if (from === void 0) {\n for (const lead of leading) {\n insertBefore(id, lead);\n }\n }\n from = id;\n } else if (isNode.has(id)) {\n if (from === void 0) {\n leading.add(id);\n } else {\n insertAfter(from, id);\n from = id;\n }\n }\n }\n }\n const placed = [];\n for (let id = head; id !== void 0; id = next.get(id)) {\n placed.push(id);\n }\n return placed;\n}\nfunction placeBySearch(adjacent, key) {\n const queue = [...key.entries()].sort(([a, ka], [b, kb]) => compareKeys(ka, kb) || compare(a, b)).map(([id]) => id);\n const placed = queue.length;\n for (const id of queue) {\n const from = key.get(id);\n for (const nb of adjacent.get(id) ?? []) {\n if (!key.has(nb)) {\n key.set(nb, { at: from.at, side: 1, hops: from.hops + 1 });\n queue.push(nb);\n }\n }\n }\n const searched = new Set(queue.slice(placed));\n const sided = /* @__PURE__ */ new Set();\n for (const seed of searched) {\n if (sided.has(seed)) {\n continue;\n }\n const { at } = key.get(seed);\n const run = [seed];\n sided.add(seed);\n let farHalf = true;\n for (const id of run) {\n const { hops } = key.get(id);\n let deadEnd = true;\n let touchesLeft = false;\n for (const nb of adjacent.get(id) ?? []) {\n const other = key.get(nb);\n if (other.at === at && searched.has(nb)) {\n deadEnd &&= other.hops <= hops;\n if (!sided.has(nb)) {\n sided.add(nb);\n run.push(nb);\n }\n } else if (other.at !== at) {\n touchesLeft ||= other.at < at;\n farHalf &&= other.at < at;\n }\n }\n farHalf &&= !deadEnd || touchesLeft;\n }\n if (farHalf) {\n for (const id of run) {\n const k = key.get(id);\n key.set(id, { ...k, side: -1, hops: -k.hops });\n }\n }\n }\n}\nfunction orderKeys(graph) {\n const ids = new Set(graph.nodes.map((n) => n.id));\n const adjacent = /* @__PURE__ */ new Map();\n for (const e of graph.edges) {\n if (!ids.has(e.from) || !ids.has(e.to)) {\n continue;\n }\n ;\n (adjacent.get(e.from) ?? adjacent.set(e.from, []).get(e.from)).push(e.to);\n (adjacent.get(e.to) ?? adjacent.set(e.to, []).get(e.to)).push(e.from);\n }\n const backbone = graph.nodes.filter(isBackbone).sort(\n (a, b) => compare(a.stable.start, b.stable.start) || compare(a.name, b.name)\n );\n const key = /* @__PURE__ */ new Map();\n placeByWalks(graph, backbone).forEach((id, rank) => {\n key.set(id, { at: rank, side: 0, hops: 0 });\n });\n placeBySearch(adjacent, key);\n return key;\n}\nfunction layerGraph(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const order = referenceOrder(graph);\n const key = new Map(order.map((id, i) => [id, i]));\n const isRef = (id) => isBackbone(byId.get(id));\n const preds = new Map(order.map((id) => [id, []]));\n const succs = new Map(order.map((id) => [id, []]));\n const link = (a, b) => {\n preds.get(b).push(a);\n succs.get(a).push(b);\n };\n for (const e of graph.edges) {\n if (e.from === e.to || !key.has(e.from) || !key.has(e.to)) {\n continue;\n }\n if (key.get(e.from) < key.get(e.to)) {\n link(e.from, e.to);\n } else {\n link(e.to, e.from);\n }\n }\n const backbone = order.filter(isRef);\n for (let i = 1; i < backbone.length; i++) {\n link(backbone[i - 1], backbone[i]);\n }\n const layerOf = /* @__PURE__ */ new Map();\n for (const id of order) {\n let l = 0;\n for (const p of preds.get(id)) {\n l = Math.max(l, layerOf.get(p) + 1);\n }\n layerOf.set(id, l);\n }\n for (let i = order.length - 1; i >= 0; i--) {\n const id = order[i];\n const s = succs.get(id);\n if (isRef(id) || s.length === 0) {\n continue;\n }\n let minSucc = Infinity;\n for (const t of s) {\n minSucc = Math.min(minSucc, layerOf.get(t));\n }\n const lo = layerOf.get(id);\n const hi = Math.max(lo, minSucc - 1);\n layerOf.set(id, Math.floor((lo + hi) / 2));\n }\n const layers = [];\n for (const id of order) {\n ;\n (layers[layerOf.get(id)] ??= []).push(id);\n }\n return { layers, layerOf, preds };\n}\nfunction orderedLayout(graph) {\n if (!graph.nodes.some(isBackbone)) {\n return void 0;\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const isRef = (id) => isBackbone(byId.get(id));\n const { layers, layerOf: layer, preds } = layerGraph(graph);\n const layerWidth = layers.map((ids) => {\n let w = 0;\n for (const id of ids) {\n w = Math.max(w, nodeWidth(byId.get(id)));\n }\n return w;\n });\n const layerX = [];\n let x = 0;\n for (let l = 0; l < layers.length; l++) {\n layerX[l] = x;\n x += layerWidth[l] + GUTTER;\n }\n const y = /* @__PURE__ */ new Map();\n for (const ids of layers) {\n const free = [];\n for (const id of ids) {\n if (isRef(id)) {\n y.set(id, 0);\n continue;\n }\n const placed = preds.get(id).filter((p) => y.has(p));\n let ideal = 0;\n for (const p of placed) {\n ideal += y.get(p) / placed.length;\n }\n free.push({ id, ideal: ideal === 0 ? LANE_PX : ideal });\n }\n free.sort((a, b) => a.ideal - b.ideal);\n const taken = /* @__PURE__ */ new Set([0]);\n for (const { id, ideal } of free) {\n let lane = Math.round(ideal / LANE_PX);\n if (lane === 0) {\n lane = ideal >= 0 ? 1 : -1;\n }\n for (let d = 1; taken.has(lane); d++) {\n if (!taken.has(lane + d)) {\n lane += d;\n } else if (!taken.has(lane - d)) {\n lane -= d;\n }\n }\n taken.add(lane);\n y.set(id, lane * LANE_PX);\n }\n }\n const nodePositions = {};\n for (const n of graph.nodes) {\n const l = layer.get(n.id);\n const w = nodeWidth(n);\n const cx = layerX[l] + layerWidth[l] / 2;\n const ny = y.get(n.id);\n nodePositions[n.id] = [\n { x: cx - w / 2, y: ny },\n { x: cx + w / 2, y: ny }\n ];\n }\n return { nodePositions, referenceAxis: false, pixelRows: true };\n}\n\nexport {\n referenceOrder,\n layerGraph,\n orderedLayout\n};\n", "import {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\nimport {\n panSNContig,\n panSNSample\n} from \"./chunk-BPLIXMH7.js\";\n\n// src/layout/walkRows.ts\nfunction sampleOf(path) {\n return path.sample ?? panSNSample(path.name);\n}\nfunction labelOf(path) {\n return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);\n}\nfunction stepsOf(pieces, lengthOf) {\n const steps = [];\n let end;\n for (const piece of pieces) {\n if (end !== void 0 && piece.start !== void 0 && piece.start > end) {\n steps.push(piece.start - end);\n }\n steps.push(...piece.nodeIds);\n const bp = piece.nodeIds.reduce(\n (sum, id) => sum + (lengthOf.get(id) ?? 0),\n 0\n );\n end = piece.start === void 0 ? void 0 : piece.start + bp;\n }\n return steps;\n}\nfunction stepSpans(pieces, lengthOf) {\n const spans = [];\n let end;\n for (const piece of pieces) {\n if (piece.start === void 0 || end !== void 0 && piece.start < end) {\n return void 0;\n }\n if (end !== void 0 && piece.start > end) {\n spans.push({ start: end, end: piece.start });\n }\n let pos = piece.start;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n spans.push({ start: pos, end: pos + len });\n pos += len;\n }\n end = pos;\n }\n return spans;\n}\nfunction sliceBetween(steps, span, region, flanked = true) {\n if (!region || !flanked) {\n return { ids: steps, complete: true, from: -1, to: -1 };\n }\n let i0 = -1;\n let i1 = -1;\n let bestEnd = -Infinity;\n let bestStart = Infinity;\n steps.forEach((id, i) => {\n const s = typeof id === \"string\" ? span.get(id) : void 0;\n if (s) {\n if (s.end <= region.start && s.end > bestEnd) {\n bestEnd = s.end;\n i0 = i;\n }\n if (s.start >= region.end && s.start < bestStart) {\n bestStart = s.start;\n i1 = i;\n }\n }\n });\n if (i0 < 0 || i1 < 0) {\n return { ids: steps, complete: false, from: -1, to: -1 };\n }\n const ids = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));\n return {\n ids: i0 < i1 ? ids : ids.reverse(),\n complete: true,\n from: i0,\n to: i1\n };\n}\nfunction filterSamples(rows, samples) {\n return samples ? rows.filter((r) => samples.includes(r.sample)).sort(\n (a, b) => samples.indexOf(a.sample) - samples.indexOf(b.sample) || a.label.localeCompare(b.label)\n ) : rows;\n}\nfunction walkRows(graph, region, unit) {\n const paths = graph.paths ?? [];\n const isReference = (p) => pathOrigin(p.name).name === graph.referencePath;\n const referencePieces = paths.some(isReference) ? paths.filter(isReference).sort((a, b) => (a.start ?? 0) - (b.start ?? 0)) : paths.slice(0, 1);\n const first = referencePieces[0];\n const others = paths.filter((p) => !referencePieces.includes(p));\n if (!first || others.length === 0) {\n return void 0;\n }\n const walks = /* @__PURE__ */ new Map();\n for (const path of others) {\n walks.set(path.name, [...walks.get(path.name) ?? [], path]);\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const referenceStart = first.start ?? 0;\n const cut = region && region.end > region.start ? region : void 0;\n const span = /* @__PURE__ */ new Map();\n for (const piece of referencePieces) {\n let pos = piece.start ?? 0;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n if (!span.has(id)) {\n span.set(id, { start: pos, end: pos + len });\n }\n pos += len;\n }\n }\n const flanked = cut === void 0 || [...span.values()].some((s) => s.end <= cut.start) && [...span.values()].some((s) => s.start >= cut.end);\n const rowOf = (pieces) => {\n const path = pieces[0];\n const ordered = [...pieces].sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const { ids, complete, from, to } = sliceBetween(\n stepsOf(ordered, lengthOf),\n span,\n cut,\n flanked\n );\n const spans = stepSpans(ordered, lengthOf);\n const contig = path.contig ?? panSNContig(pathOrigin(path.name).name);\n const axis = !spans?.length ? void 0 : from < 0 ? { contig, start: spans[0].start, reversed: false } : from < to ? { contig, start: spans[from].end, reversed: false } : { contig, start: spans[from].start, reversed: true };\n const runs = [];\n let bp = 0;\n let offReferenceBp = 0;\n let gapBp = 0;\n let step = 0;\n for (const id of ids) {\n if (typeof id === \"number\") {\n runs.push({ start: bp, bp: id, onReference: false, gap: true });\n bp += id;\n gapBp += id;\n step = 0;\n continue;\n }\n const len = lengthOf.get(id) ?? 0;\n const s = span.get(id);\n const last = runs.at(-1);\n const at = last?.referenceStart;\n const forward = s && at !== void 0 && step >= 0 && at + last.bp === s.start;\n const backward = s && at !== void 0 && step <= 0 && s.end === at;\n if (!s && last && !last.onReference && !last.gap) {\n last.bp += len;\n } else if (forward || backward) {\n last.bp += len;\n if (!forward) {\n last.referenceStart = s.start;\n last.reversed = true;\n }\n step = forward ? 1 : -1;\n } else {\n runs.push({\n start: bp,\n bp: len,\n onReference: s !== void 0,\n referenceStart: s?.start\n });\n step = 0;\n }\n bp += len;\n if (!s) {\n offReferenceBp += len;\n }\n }\n return {\n name: path.name,\n label: labelOf(path),\n sample: sampleOf(path),\n haplotype: path.haplotype,\n bp,\n offReferenceBp,\n gapBp,\n complete,\n runs,\n axis\n };\n };\n const origin = cut ? cut.start : referenceStart;\n return {\n origin,\n unit,\n reference: rowOf(referencePieces),\n rows: [...walks.values()].map(rowOf).sort(\n (a, b) => Number(b.complete) - Number(a.complete) || b.bp - a.bp || a.label.localeCompare(b.label)\n )\n };\n}\n\nexport {\n filterSamples,\n walkRows\n};\n", "import {\n walkRows\n} from \"./chunk-SZNZ2T6D.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n overlapsWindow\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/walkRowLayout.ts\nvar READOUT_ROOM = 1.3;\nfunction walkRowsExtent(walks) {\n let longest = walks.reference.bp;\n for (const row of walks.rows) {\n longest = Math.max(longest, row.bp);\n }\n return {\n maxX: walks.origin + longest * READOUT_ROOM,\n maxY: walks.rows.length * ROW_HEIGHT_PX\n };\n}\nfunction walkRowLayout(graph, region) {\n const backbone = backboneNodes(graph);\n const walks = walkRows(graph, region);\n if (backbone.length === 0 || !walks) {\n return void 0;\n }\n const overWindow = region ? backbone.filter((n) => overlapsWindow(n, region)) : backbone;\n const nodePositions = backbonePositions(\n overWindow.length > 0 ? overWindow : backbone\n );\n const rowLabels = [\n { label: walks.reference.label, y: 0 },\n ...walks.rows.map((row, i) => ({\n label: row.label,\n y: (i + 1) * ROW_HEIGHT_PX\n }))\n ];\n return {\n nodePositions,\n rowLabels,\n referenceAxis: true,\n pixelRows: true,\n extent: walkRowsExtent(walks)\n };\n}\n\nexport {\n walkRowsExtent,\n walkRowLayout\n};\n", "import {\n hasTubeMapPaths,\n tubeMapLayout,\n tubeMapReferenceLayout\n} from \"./chunk-R6ZUK4Y3.js\";\nimport {\n sampleRowLayout\n} from \"./chunk-LOEA5IHZ.js\";\nimport {\n anchoredLayout\n} from \"./chunk-L3O7AWLI.js\";\nimport {\n orderedLayout\n} from \"./chunk-HNQPEMYE.js\";\nimport {\n walkRowLayout\n} from \"./chunk-EZPBJPK6.js\";\nimport {\n isBackbone,\n isOffReference\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layoutModes.ts\nvar FORCE_LAYOUT_LABEL = \"Force-directed layout\";\nvar hasBackbone = (graph) => graph.nodes.some(isBackbone);\nvar hasWalks = (graph) => hasBackbone(graph) && (graph.paths?.length ?? 0) > 1;\nvar hasTubeMapBackbone = (graph) => hasBackbone(graph) && hasTubeMapPaths(graph);\nvar hasAlleles = (graph) => hasBackbone(graph) && graph.nodes.some(isOffReference);\nvar LAYOUT_MODES = [\n {\n value: \"auto\",\n label: \"Anchored\",\n description: \"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.\",\n run: anchoredLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"samplerows\",\n label: \"Sample rows\",\n description: \"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.\",\n run: sampleRowLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasAlleles,\n drawsLocally: hasAlleles,\n drawsNodes: true\n },\n {\n value: \"walkrows\",\n label: \"Walk rows\",\n description: \"x is each walk's own bp: one bar per haplotype, blue on the reference's path and purple off it, so a repeat expansion reads as bar length, and each bar boxes its haplotype's own genes where the session has them. Needs W or P lines.\",\n run: walkRowLayout,\n cutMargins: false,\n wholeWalks: true,\n available: hasWalks,\n drawsLocally: hasWalks,\n drawsNodes: false\n },\n {\n value: \"ordered\",\n label: \"Ordered\",\n description: \"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.\",\n run: orderedLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"tubemap\",\n label: \"Tube map\",\n description: \"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.\",\n run: tubeMapLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasTubeMapPaths,\n drawsLocally: hasTubeMapPaths,\n drawsNodes: false\n },\n {\n value: \"tubemapref\",\n label: \"Tube map on reference\",\n description: \"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.\",\n run: tubeMapReferenceLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasTubeMapBackbone,\n drawsLocally: hasTubeMapBackbone,\n drawsNodes: false\n },\n {\n value: \"force\",\n label: FORCE_LAYOUT_LABEL,\n description: \"OGDF FMMM, via the external Bandage engine.\",\n run: () => void 0,\n cutMargins: false,\n wholeWalks: false,\n available: () => true,\n drawsLocally: () => false,\n drawsNodes: true\n }\n];\nvar LAYOUT_MODE_VALUES = LAYOUT_MODES.map((m) => m.value);\nfunction modeUsesLayoutEngine(value, graph) {\n return !layoutModeByValue(value).drawsLocally(graph);\n}\nfunction layoutModeByValue(value) {\n return LAYOUT_MODES.find((m) => m.value === value) ?? LAYOUT_MODES[0];\n}\n\nexport {\n FORCE_LAYOUT_LABEL,\n LAYOUT_MODES,\n LAYOUT_MODE_VALUES,\n modeUsesLayoutEngine,\n layoutModeByValue\n};\n", "import {\n REFERENCE_RAMP_ALT_COLOR,\n REFERENCE_RAMP_MAX_HUE,\n hslToRgb\n} from \"./chunk-RX5CSWJW.js\";\nimport {\n packAbgr\n} from \"./chunk-UMNCCYBN.js\";\n\n// src/walkEncoding.ts\nvar WALK_FIELDS = [\n { value: \"progress\", label: \"Progress along the walk\" },\n { value: \"walk\", label: \"One colour for the walk\" },\n { value: \"reference\", label: \"Reference position\" }\n];\nvar WALK_SCHEMES = [\n { value: \"grey\", label: \"Grey to black\", ends: [\"#a3a3a3\", \"#151515\"] },\n { value: \"blue\", label: \"Cyan to navy\", ends: [\"#6ee0f0\", \"#0b2c7a\"] },\n { value: \"red\", label: \"Yellow to red\", ends: [\"#ffd24a\", \"#b3121b\"] },\n { value: \"purple\", label: \"Pink to plum\", ends: [\"#f5a3d8\", \"#5e1a6e\"] },\n { value: \"green\", label: \"Lime to forest\", ends: [\"#b6e36c\", \"#0b5d3b\"] },\n { value: \"rainbow\", label: \"Rainbow\" }\n];\nvar FAMILIES = [\"blue\", \"red\", \"purple\", \"green\"];\nvar isField = (v) => WALK_FIELDS.some((f) => f.value === v);\nvar isScheme = (v) => WALK_SCHEMES.some((s) => s.value === v);\nfunction resolveEncoding(layer, reference, picked, alone = true) {\n const { field: askedField, scheme: askedScheme } = layer.color ?? {};\n const field = isField(askedField) ? askedField : alone ? \"progress\" : \"walk\";\n const family = reference ? \"grey\" : FAMILIES[picked % FAMILIES.length];\n const scheme = isScheme(askedScheme) ? askedScheme === \"rainbow\" && field !== \"reference\" ? family : askedScheme : family;\n return { field, scheme };\n}\nvar BASE_T = 0.5;\nvar toLinear = (c) => c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\nvar toGamma = (c) => c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055;\nfunction oklab(hex) {\n const [r, g, b] = [1, 3, 5].map(\n (i) => toLinear(Number.parseInt(hex.slice(i, i + 2), 16) / 255)\n );\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n ];\n}\nfunction oklabToRgb([L, a, b]) {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s\n ].map((c) => toGamma(Math.max(0, Math.min(1, c))) * 255);\n}\nfunction schemeRgb(scheme, t) {\n const x = Math.max(0, Math.min(1, t));\n const family = WALK_SCHEMES.find((s) => s.value === scheme);\n if (!family || !(\"ends\" in family)) {\n return hslToRgb(x * REFERENCE_RAMP_MAX_HUE, 0.7, 0.5).map((c) => c * 255);\n }\n const from = oklab(family.ends[0]);\n const to = oklab(family.ends[1]);\n return oklabToRgb(from.map((v, i) => v + (to[i] - v) * x));\n}\nfunction schemeCss(scheme, t) {\n const [r, g, b] = schemeRgb(scheme, t).map(Math.round);\n return `rgb(${r}, ${g}, ${b})`;\n}\nfunction schemeColor(scheme, t) {\n const [r, g, b] = schemeRgb(scheme, t).map(Math.round);\n return packAbgr(r, g, b, 255);\n}\nfunction encodedColor({ field, scheme }, t) {\n return field === \"walk\" ? schemeColor(scheme, BASE_T) : t === void 0 ? NO_VALUE_COLOR : schemeColor(scheme, t);\n}\nvar NO_VALUE_COLOR = REFERENCE_RAMP_ALT_COLOR;\nfunction encodingStops({ field, scheme }) {\n return field === \"walk\" ? [{ offset: 0, color: schemeCss(scheme, BASE_T) }] : Array.from({ length: 7 }, (_, i) => ({\n offset: i / 6,\n color: schemeCss(scheme, i / 6)\n }));\n}\nfunction encodingSwatchCss(encoding) {\n const stops = encodingStops(encoding);\n return stops.length === 1 ? stops[0].color : `linear-gradient(to right, ${stops.map((s) => `${s.color} ${s.offset * 100}%`).join(\", \")})`;\n}\n\nexport {\n WALK_FIELDS,\n WALK_SCHEMES,\n resolveEncoding,\n schemeRgb,\n schemeCss,\n schemeColor,\n encodedColor,\n NO_VALUE_COLOR,\n encodingStops,\n encodingSwatchCss\n};\n", "// src/facetGrid.ts\nvar FACET_GAP_PX = 8;\nvar FACET_TITLE_PX = 34;\nvar FACET_PAD_PX = 12;\nvar MIN_FACET_PANEL_PX = 60;\nfunction facetGrid({\n count,\n bounds,\n pixelRows,\n width,\n room,\n columns\n}) {\n function tile(across) {\n const rows = Math.ceil(count / across);\n const panelWidth = Math.floor(\n (width - (across - 1) * FACET_GAP_PX) / across\n );\n const panelRoom = (room - rows * FACET_TITLE_PX - (rows - 1) * FACET_GAP_PX) / rows;\n const fitX = (panelWidth - 2 * FACET_PAD_PX) / bounds.w;\n const fitY = bounds.h > 0 ? (panelRoom - 2 * FACET_PAD_PX) / bounds.h : Infinity;\n const scale = pixelRows ? fitX : Math.min(fitX, fitY);\n const drawn = pixelRows ? bounds.h : bounds.h * scale;\n const height = Math.floor(\n Math.max(\n MIN_FACET_PANEL_PX,\n Math.min(drawn + 2 * FACET_PAD_PX, panelRoom)\n )\n );\n return {\n columns: across,\n width: panelWidth,\n height,\n scale,\n total: rows * (height + FACET_TITLE_PX) + (rows - 1) * FACET_GAP_PX\n };\n }\n if (columns !== void 0) {\n return tile(Math.max(1, Math.min(count, Math.round(columns))));\n }\n let best = tile(1);\n for (let across = 2; across <= count; across++) {\n const grid = tile(across);\n if (grid.scale > best.scale) {\n best = grid;\n }\n }\n return best;\n}\nfunction facetSettingOf(facet) {\n const raw = typeof facet === \"string\" ? { field: facet } : facet ?? {};\n const field = raw.field === \"walk\" || raw.field === \"sample\" ? raw.field : \"\";\n return {\n field,\n domain: [...raw.domain ?? []],\n ...raw.columns === void 0 ? {} : { columns: raw.columns }\n };\n}\nfunction domainFirst(names, domain) {\n const rank = new Map(domain.map((name, i) => [name, i]));\n const listed = (name) => rank.get(name) ?? domain.length;\n return names.map((name, i) => ({ name, i })).sort((a, b) => listed(a.name) - listed(b.name) || a.i - b.i).map(({ name }) => name);\n}\nfunction facetCells(names, by, domain = []) {\n const wrapOrder = domainFirst(names, domain);\n const wrap = {\n columns: void 0,\n count: names.length,\n cells: names.map((name) => wrapOrder.indexOf(name))\n };\n if (by === \"walk\") {\n return wrap;\n }\n const places = names.map((name) => {\n const [sample, haplotype, contig] = name.split(\"#\");\n const n = Number(haplotype);\n return contig !== void 0 && Number.isInteger(n) && n >= 0 ? { sample, column: Math.max(0, n - 1) } : void 0;\n });\n const rows = domainFirst(\n [...new Set(places.flatMap((p) => p ? [p.sample] : []))],\n domain\n );\n const columns = Math.max(1, ...places.map((p) => p ? p.column + 1 : 1));\n const cells = places.map(\n (p) => p ? rows.indexOf(p.sample) * columns + p.column : -1\n );\n return cells.includes(-1) || new Set(cells).size < cells.length ? wrap : { columns, count: rows.length * columns, cells };\n}\n\nexport {\n FACET_GAP_PX,\n FACET_TITLE_PX,\n FACET_PAD_PX,\n facetGrid,\n facetSettingOf,\n facetCells\n};\n", "import {\n SATURATED_PATH_COUNT\n} from \"./chunk-MFKORG3F.js\";\n\n// src/bubbles/classifyBubble.ts\nvar REPEAT_GROWTH = 10;\nfunction coveringRepeat(b, repeats) {\n const span = b.end - b.start;\n const growth = b.longestAlleleLength - b.shortestAlleleLength;\n return repeats.find(\n (r) => growth <= REPEAT_GROWTH * (r.end - r.start) && (span === 0 ? r.start <= b.start && b.start <= r.end : Math.min(b.end, r.end) - Math.max(b.start, r.start) >= span / 2)\n );\n}\nvar SUPERBUBBLE_SEGMENTS = 40;\nfunction formatBp(bp) {\n if (bp >= 1e4) {\n return `${(bp / 1e3).toFixed(0)} kb`;\n }\n if (bp >= 1e3) {\n return `${(bp / 1e3).toFixed(1)} kb`;\n }\n return `${bp} bp`;\n}\nfunction formatBpRange(shortest, longest) {\n const low = formatBp(shortest);\n const high = formatBp(longest);\n const unit = high.slice(high.indexOf(\" \"));\n return low.endsWith(unit) ? `${low.slice(0, -unit.length)}\\u2013${high}` : `${low}\\u2013${high}`;\n}\nfunction routes(count) {\n if (count >= SATURATED_PATH_COUNT) {\n return \"\\u22652.1B routes\";\n }\n if (count >= 1e5) {\n return `${(count / 1e3).toFixed(0)}k routes`;\n }\n return `${count} routes`;\n}\nfunction classifyBubble(b, repeats = []) {\n const c = classifyShape(b, repeats);\n return b.partial ? { ...c, label: `${c.label}, partial` } : c;\n}\nfunction classifyShape(b, repeats) {\n const refSpan = b.end - b.start;\n const {\n shortestAlleleLength: shortest,\n longestAlleleLength: longest,\n pathCount,\n segmentCount,\n inversion\n } = b;\n const range = formatBpRange(shortest, longest);\n if (segmentCount >= SUPERBUBBLE_SEGMENTS) {\n return {\n kind: \"superbubble\",\n label: `${range} superbubble, ${segmentCount} segments, ${routes(pathCount)}${inversion ? \", inv\" : \"\"}`\n };\n }\n if (inversion) {\n return { kind: \"inversion\", label: `${formatBp(longest)} inv` };\n }\n const repeat = longest !== shortest ? coveringRepeat(b, repeats) : void 0;\n if (repeat) {\n const name = repeat.name ? ` (${repeat.name})` : \"\";\n return {\n kind: \"repeat\",\n label: `${range} repeat array${name}, ${routes(pathCount)}`\n };\n }\n const alleles = pathCount > 2 ? `, ${pathCount} alleles` : \"\";\n if (shortest === longest && shortest === refSpan) {\n return refSpan <= 1 ? { kind: \"snp\", label: \"SNP\" } : { kind: \"substitution\", label: `${formatBp(refSpan)} sub` };\n }\n if (refSpan === 0 || shortest === refSpan) {\n return {\n kind: \"insertion\",\n label: `\\u2264${formatBp(longest - refSpan)} ins${alleles}`\n };\n }\n if (longest === refSpan) {\n return {\n kind: \"deletion\",\n label: `${formatBp(refSpan - shortest)} del${alleles}`\n };\n }\n return {\n kind: \"complex\",\n label: `${formatBp(refSpan)} ref \\u2192 ${range}, ${pathCount} alleles`\n };\n}\nvar BUBBLE_KIND_COLORS = {\n snp: \"#5b6b7a\",\n substitution: \"#5b6b7a\",\n insertion: \"#2f8fd6\",\n deletion: \"#c94040\",\n inversion: \"#e07b00\",\n repeat: \"#8e3fbf\",\n superbubble: \"#8e3fbf\",\n complex: \"#8e3fbf\"\n};\nvar BUBBLE_KIND_NAMES = {\n snp: \"SNP\",\n substitution: \"substitution\",\n insertion: \"insertion\",\n deletion: \"deletion\",\n inversion: \"inversion\",\n repeat: \"repeat array\",\n superbubble: \"superbubble\",\n complex: \"site\"\n};\nfunction bubbleSegmentIds(b) {\n return b.segments.split(\",\").filter(Boolean);\n}\n\nexport {\n formatBp,\n classifyBubble,\n BUBBLE_KIND_COLORS,\n BUBBLE_KIND_NAMES,\n bubbleSegmentIds\n};\n", "import {\n RAMP_GRADIENT_CSS,\n RAMP_GRADIENT_STOPS,\n rampHueCss,\n rampStops\n} from \"./chunk-ZHCDYSA5.js\";\nimport {\n REFERENCE_RAMP_ALT_CSS\n} from \"./chunk-RX5CSWJW.js\";\nimport {\n LABEL_CHAR_PX\n} from \"./chunk-AB35TJST.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n el\n} from \"./chunk-NNODIW4U.js\";\n\n// src/layout/walkRowDraw.ts\nvar ON_REFERENCE = \"#2f8fd6\";\nvar OFF_REFERENCE = \"#8e3fbf\";\nvar OUTSIDE_CUT = \"#bdbdbd\";\nvar GENE_INK = \"#1c1c22\";\nvar BAR_PX = 12;\nvar GAP_PX = 4;\nvar MIN_TILE_PX = 3;\nfunction kb(bp) {\n return `${(bp / 1e3).toFixed(bp < 1e4 ? 1 : 0)} kb`;\n}\nfunction units(bp, unit) {\n return unit ? ` \\u2248 ${Math.round(bp / unit)} units` : \"\";\n}\nfunction walkRowReadout(row, reference, unit, call) {\n const { bp, gapBp, complete } = row;\n if (!reference) {\n return `${kb(bp)}${units(bp, unit)}`;\n }\n const delta = bp - reference.bp;\n const against = delta === 0 ? \"\" : ` (${delta > 0 ? \"+\" : \"\\u2212\"}${kb(Math.abs(delta))})`;\n const outside = gapBp > 0 ? ` \\xB7 ${kb(gapBp)} outside the cut` : \"\";\n const called = call ? ` \\xB7 called ${kb(call.bp)}${call.spanningReads === 0 ? \" \\xB7 no spanning read\" : \"\"}` : \"\";\n return `${kb(bp)}${units(bp, unit)}${against}${outside}${complete ? \"\" : \" \\xB7 partial walk\"}${called}`;\n}\nfunction readoutPlacement(text, endX, width) {\n const x = endX + 6;\n const fits = x + text.length * LABEL_CHAR_PX < width;\n return fits ? { x, anchor: \"start\", halo: false } : { x: endX - 6, anchor: \"end\", halo: true };\n}\nfunction unitTicks(bp, unit, pxPerBp) {\n if (unit * pxPerBp < MIN_TILE_PX) {\n return [];\n }\n const ticks = [];\n for (let k = unit; k < bp; k += unit) {\n ticks.push(k);\n }\n return ticks;\n}\nfunction runPaint(run, ramp) {\n if (run.gap) {\n return { fill: OUTSIDE_CUT };\n }\n if (!ramp) {\n return { fill: run.onReference ? ON_REFERENCE : OFF_REFERENCE };\n }\n if (run.referenceStart === void 0) {\n return { fill: REFERENCE_RAMP_ALT_CSS };\n }\n const stops = rampStops({ ...run, start: run.referenceStart }, ramp);\n return stops.length === 1 ? { fill: rampHueCss(stops[0]) } : { stops: stops.map(rampHueCss) };\n}\nfunction alongRow(axis, start, end) {\n return axis.reversed ? { start: axis.start - end, end: axis.start - start } : { start: start - axis.start, end: end - axis.start };\n}\nfunction rowSpan(axis, bp) {\n return axis.reversed ? { start: axis.start - bp, end: axis.start } : { start: axis.start, end: axis.start + bp };\n}\nfunction genesOnRow(row, genes) {\n const contig = row.axis?.contig;\n return genes.filter(\n (g) => g.refName === contig || g.refName.endsWith(`#${contig}`)\n );\n}\nfunction placeRowGenes(rows, byRow) {\n const placed = /* @__PURE__ */ new Map();\n for (const row of rows) {\n const genes = byRow.get(row.name);\n if (!row.axis || !genes) {\n continue;\n }\n const axis = row.axis;\n const clip = ({ start, end }) => ({\n start: Math.max(0, start),\n end: Math.min(row.bp, end)\n });\n placed.set(\n row.name,\n genes.map((g) => ({\n name: g.name,\n ...clip(alongRow(axis, g.start, g.end)),\n exons: g.exons.map((e) => clip(alongRow(axis, e.start, e.end))).filter((e) => e.end > e.start)\n })).filter((g) => g.end > g.start).sort((a, b) => a.start - b.start)\n );\n }\n return placed;\n}\nvar GENE_FONT_PX = 9;\nvar GENE_CHAR_PX = 5.2;\nvar MIN_LETTERED_BAR_PX = 8;\nvar genePad = (rowPx, barPx) => Math.min(2, (rowPx - barPx) / 2 - 1);\nfunction boxesGenes(rowPx, barPx) {\n return genePad(rowPx, barPx) >= 1;\n}\nfunction rowGeneBoxes(genes, X, y, { rowPx = ROW_HEIGHT_PX, barPx = BAR_PX } = {}) {\n if (!boxesGenes(rowPx, barPx)) {\n return [];\n }\n const pad = genePad(rowPx, barPx);\n const boxes = genes.map((g) => {\n const x = X(g.start);\n return {\n g,\n x,\n w: Math.max(2, X(g.end) - x)\n };\n });\n const taken = [];\n const named = new Set(\n (barPx >= MIN_LETTERED_BAR_PX ? [...boxes] : []).sort((a, b) => a.w - b.w).filter(({ g, x, w }) => {\n const half = g.name.length * GENE_CHAR_PX / 2;\n const at = [x + w / 2 - half, x + w / 2 + half];\n if (2 * half > w + 6 || taken.some(([a, b]) => at[0] < b + 2 && at[1] > a - 2)) {\n return false;\n }\n taken.push(at);\n return true;\n })\n );\n return boxes.map((box) => ({\n name: box.g.name,\n x: box.x,\n y: y - barPx / 2 - pad,\n w: box.w,\n h: barPx + 2 * pad,\n exons: box.g.exons.map((e) => ({\n x: X(e.start),\n w: Math.max(1, X(e.end) - X(e.start))\n })),\n label: named.has(box) ? { x: box.x + box.w / 2, y: y + 3, size: GENE_FONT_PX } : void 0\n }));\n}\nvar rowsText = (n) => `${n} row${n === 1 ? \"\" : \"s\"}`;\nfunction walkRowsKey(bars, o = {}) {\n const entries = [\n {\n swatch: o.ramp ? { kind: \"bar\", fill: o.rampCss ?? RAMP_GRADIENT_CSS, ramp: true } : { kind: \"bar\", fill: ON_REFERENCE },\n label: `on ${bars.reference.label}'s path`\n },\n {\n swatch: {\n kind: \"bar\",\n fill: o.ramp ? REFERENCE_RAMP_ALT_CSS : OFF_REFERENCE\n },\n label: `off ${bars.reference.label}'s path`\n }\n ];\n if ([bars.reference, ...bars.rows].some((row) => row.gapBp > 0)) {\n entries.push({\n swatch: { kind: \"gap\", fill: OUTSIDE_CUT },\n label: \"walked outside the cut\"\n });\n }\n if (o.genes?.crowded) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: \"genes left out: too many rows to box them in\",\n note: true\n });\n } else if (o.genes) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: \"genes, each row's own annotation\"\n });\n if (o.genes.untracked) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `no gene track for ${rowsText(o.genes.untracked)}`,\n note: true\n });\n }\n if (o.genes.unplaced) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `no contig coordinates for ${rowsText(o.genes.unplaced)}`,\n note: true\n });\n }\n if (o.genes.unread) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `genes not read for the last ${rowsText(o.genes.unread)}`,\n note: true\n });\n }\n }\n return entries;\n}\nvar CALL_TICK = \"#111\";\nvar UNBACKED_TICK = \"#9e9e9e\";\nvar DISAGREES = \"#c62828\";\nfunction walkRowsKeyTree(entries, x, y, idPrefix = \"walk-key\") {\n let at = 0;\n const parts = entries.flatMap((e, i) => {\n const rampId = `${idPrefix}-ramp-${i}`;\n const ramp = !e.note && e.swatch.kind === \"bar\" && e.swatch.ramp ? el(\n \"linearGradient\",\n { id: rampId },\n ...RAMP_GRADIENT_STOPS.map(\n (s) => el(\"stop\", { offset: s.offset, \"stop-color\": s.color })\n )\n ) : void 0;\n const swatch = e.note ? void 0 : e.swatch.kind === \"gene\" ? el(\"rect\", {\n x: at,\n y: 5,\n width: 18,\n height: 8,\n fill: \"none\",\n stroke: GENE_INK,\n \"stroke-width\": 1.5\n }) : el(\"rect\", {\n x: at,\n y: e.swatch.kind === \"gap\" ? 7 : 5,\n width: 18,\n height: e.swatch.kind === \"gap\" ? GAP_PX : 8,\n rx: 2,\n fill: ramp ? `url(#${rampId})` : e.swatch.fill\n });\n const text = el(\n \"text\",\n {\n x: e.note ? at : at + 23,\n y: 13,\n \"font-style\": e.note ? \"italic\" : void 0,\n fill: e.note ? \"#666\" : void 0\n },\n e.label\n );\n at += (e.note ? 0 : 23) + e.label.length * LABEL_CHAR_PX + 16;\n return [ramp, swatch, text].filter((p) => p !== void 0);\n });\n return {\n width: at,\n tree: el(\n \"g\",\n {\n transform: `translate(${x} ${y})`,\n \"font-family\": \"Helvetica, Arial, sans-serif\",\n \"font-size\": 11\n },\n ...parts\n )\n };\n}\nfunction coalesceRuns(runs, pxPerBp) {\n const minBp = 1 / pxPerBp;\n const out = [];\n let bucket = [];\n const flush = () => {\n if (bucket.length === 0) {\n return;\n }\n if (bucket.length === 1) {\n out.push(bucket[0]);\n } else {\n let on = 0;\n let off = 0;\n for (const r of bucket) {\n if (r.onReference) {\n on += r.bp;\n } else {\n off += r.bp;\n }\n }\n const onReference = on >= off;\n const lead = bucket.find((r) => r.onReference === onReference);\n out.push({\n start: bucket[0].start,\n bp: on + off,\n onReference,\n referenceStart: onReference ? lead.referenceStart : void 0,\n ...lead.reversed ? { reversed: true } : {}\n });\n }\n bucket = [];\n };\n let held = 0;\n for (const run of runs) {\n if (run.gap || run.bp >= minBp) {\n flush();\n held = 0;\n out.push(run);\n continue;\n }\n bucket.push(run);\n held += run.bp;\n if (held >= minBp) {\n flush();\n held = 0;\n }\n }\n flush();\n return out;\n}\nfunction geneTree(box, y, barPx) {\n return el(\n \"g\",\n { class: \"row-gene\", \"data-testid\": \"graph-walk-gene\" },\n el(\"title\", {}, box.name),\n ...box.exons.map(\n (e) => el(\"rect\", {\n x: e.x,\n y: y - barPx / 2,\n width: e.w,\n height: barPx,\n fill: GENE_INK,\n opacity: 0.35\n })\n ),\n el(\"rect\", {\n x: box.x,\n y: box.y,\n width: box.w,\n height: box.h,\n fill: \"none\",\n stroke: GENE_INK,\n \"stroke-width\": 1.5\n }),\n box.label && el(\n \"text\",\n {\n x: box.label.x,\n y: box.label.y,\n \"font-family\": \"sans-serif\",\n \"font-size\": box.label.size,\n \"font-weight\": 600,\n \"text-anchor\": \"middle\",\n fill: GENE_INK,\n stroke: \"white\",\n \"stroke-width\": 2.5,\n \"paint-order\": \"stroke\"\n },\n box.name\n )\n );\n}\nfunction walkRowsTree(bars, frame, o = {}) {\n const X = (bp) => bp * frame.scaleX + frame.translateX;\n const rowPx = frame.rowPx ?? ROW_HEIGHT_PX;\n const barPx = frame.barPx ?? BAR_PX;\n const Y = (row) => row * rowPx * frame.scaleY + frame.translateY;\n const { origin, unit, reference, rows } = bars;\n const along = (offset) => X(origin + offset);\n const prefix = o.idPrefix ?? \"walkrow\";\n const rowTree = (row, i) => {\n const y = Y(i);\n if (y < -barPx || y > frame.height + barPx) {\n return void 0;\n }\n const runs = coalesceRuns(row.runs, frame.scaleX).flatMap((run) => {\n const paint = runPaint(run, o.ramp);\n const h = run.gap ? Math.min(GAP_PX, barPx) : barPx;\n const id = `${prefix}-${i}-${run.start}`;\n const rect = el(\"rect\", {\n x: along(run.start),\n y: y - h / 2,\n width: Math.max(1, run.bp * frame.scaleX),\n height: h,\n fill: \"stops\" in paint ? `url(#${id})` : paint.fill\n });\n return \"stops\" in paint ? [\n el(\n \"linearGradient\",\n { id },\n ...paint.stops.map(\n (color, k) => el(\"stop\", {\n offset: k / (paint.stops.length - 1),\n \"stop-color\": color\n })\n )\n ),\n rect\n ] : [rect];\n });\n const ticks = unit ? unitTicks(row.bp, unit, frame.scaleX).map(\n (k) => el(\"line\", {\n x1: along(k),\n x2: along(k),\n y1: y - barPx / 2,\n y2: y + barPx / 2,\n stroke: \"white\",\n \"stroke-width\": 1\n })\n ) : [];\n const { call } = row;\n const text = walkRowReadout(\n row,\n i === 0 ? void 0 : reference,\n unit,\n call\n );\n const at = readoutPlacement(text, along(row.bp), frame.width);\n const readouts = frame.readouts ?? true;\n return el(\n \"g\",\n {\n \"data-testid\": i === 0 ? \"graph-walk-reference\" : \"graph-walk-row\"\n },\n ...runs,\n ...ticks,\n ...rowGeneBoxes(o.rowGenes?.get(row.name) ?? [], along, y, {\n rowPx,\n barPx\n }).map((box) => geneTree(box, y, barPx)),\n call && el(\"rect\", {\n \"data-testid\": \"graph-walk-call\",\n x: along(call.bp) - 1,\n y: y - barPx / 2 - 3,\n width: 2,\n height: barPx + 6,\n fill: call.spanningReads === 0 ? UNBACKED_TICK : CALL_TICK\n }),\n readouts && el(\n \"text\",\n {\n x: at.x,\n y: y + 4,\n \"font-family\": \"sans-serif\",\n \"font-size\": 11,\n fill: call?.agrees === false ? DISAGREES : \"#333\",\n stroke: at.halo ? \"white\" : void 0,\n \"stroke-width\": at.halo ? 3 : void 0,\n \"paint-order\": \"stroke\",\n \"text-anchor\": at.anchor\n },\n text\n )\n );\n };\n return el(\"g\", {}, ...[reference, ...rows].map(rowTree));\n}\n\nexport {\n ON_REFERENCE,\n OFF_REFERENCE,\n OUTSIDE_CUT,\n GENE_INK,\n BAR_PX,\n GAP_PX,\n kb,\n walkRowReadout,\n readoutPlacement,\n unitTicks,\n runPaint,\n alongRow,\n rowSpan,\n genesOnRow,\n placeRowGenes,\n boxesGenes,\n rowGeneBoxes,\n walkRowsKey,\n DISAGREES,\n walkRowsKeyTree,\n coalesceRuns,\n walkRowsTree\n};\n", "import {\n alongRow,\n boxesGenes\n} from \"./chunk-PJESIRDU.js\";\nimport {\n pathOrigin\n} from \"./chunk-ST2IBUAN.js\";\nimport {\n LABEL_CHAR_PX\n} from \"./chunk-AB35TJST.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n el\n} from \"./chunk-NNODIW4U.js\";\n\n// src/layout/walkStrip.ts\nvar PAD_PX = 6;\nvar WALK_STRIP_CEILING_PX = 260;\nvar LABEL_FONT_PX = 11;\nvar MIN_ROW_PX = 3;\nvar LABELLED_ROW_PX = 12;\nvar READOUT_ROOM = 1.3;\nvar MARK_INK = \"#111\";\nvar TICK_PX = 3;\nfunction stripMarks(graph, rows, node) {\n const visits = graph.pathVisits?.get(node.name) ?? [];\n const marks = [];\n for (const row of rows) {\n const axis = row.axis;\n if (!axis) {\n continue;\n }\n const path = pathOrigin(row.name).name;\n for (const v of visits) {\n if (v.path !== path) {\n continue;\n }\n const { start, end } = alongRow(axis, v.start, v.start + node.length);\n if (end > 0 && start < row.bp) {\n marks.push({ row: row.name, start, bp: end - start });\n }\n }\n }\n return marks;\n}\nvar spanCache = /* @__PURE__ */ new WeakMap();\nfunction spansOf(graph, name) {\n let byName = spanCache.get(graph);\n if (!byName) {\n byName = /* @__PURE__ */ new Map();\n spanCache.set(graph, byName);\n }\n if (byName.has(name)) {\n return byName.get(name);\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const pieces = (graph.paths ?? []).filter((p) => p.name === name);\n let spans;\n if (pieces.every((p) => p.start !== void 0)) {\n spans = { ids: [], starts: [], ends: [] };\n for (const piece of [...pieces].sort((a, b) => a.start - b.start)) {\n let pos = piece.start;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n spans.ids.push(id);\n spans.starts.push(pos);\n spans.ends.push(pos + len);\n pos += len;\n }\n }\n }\n byName.set(name, spans);\n return spans;\n}\nfunction segmentAt(graph, row, offset, pxPerBp) {\n const axis = row.axis;\n const spans = axis && spansOf(graph, row.name);\n if (!axis || !spans || offset < 0 || offset > row.bp) {\n return void 0;\n }\n const at = axis.reversed ? axis.start - offset : axis.start + offset;\n const tol = 0.5 / pxPerBp;\n const bar = axis.reversed ? { start: axis.start - row.bp, end: axis.start } : { start: axis.start, end: axis.start + row.bp };\n const from = Math.max(at - tol, bar.start);\n const to = Math.min(at + tol, bar.end);\n let lo = 0;\n let hi = spans.starts.length;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n if (spans.ends[mid] <= from) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n let best;\n let bestLen = -1;\n let bestHolds = false;\n for (let i = lo; i < spans.starts.length && spans.starts[i] < to; i++) {\n const len = spans.ends[i] - spans.starts[i];\n const holds = spans.starts[i] <= at && at < spans.ends[i];\n if (len > bestLen || len === bestLen && holds && !bestHolds) {\n bestLen = len;\n best = spans.ids[i];\n bestHolds = holds;\n }\n }\n return best;\n}\nfunction walkStripFrame(bars, o) {\n const maxHeight = o.maxHeight ?? WALK_STRIP_CEILING_PX;\n const labelPx = o.labelPx ?? Math.max(...[bars.reference, ...bars.rows].map((r) => r.label.length)) * LABEL_CHAR_PX + 16;\n const count = bars.rows.length + 1;\n const rowPx = Math.max(\n MIN_ROW_PX,\n Math.min(ROW_HEIGHT_PX, Math.floor((maxHeight - 2 * PAD_PX) / count))\n );\n const labelled = rowPx >= LABELLED_ROW_PX;\n const readouts = rowPx >= 14;\n const barPx = Math.max(2, Math.round(rowPx * 0.6));\n const longest = Math.max(bars.reference.bp, ...bars.rows.map((r) => r.bp), 1);\n const left = labelled ? labelPx : PAD_PX;\n const usable = Math.max(1, o.width - left - PAD_PX);\n const scaleX = usable / (longest * (readouts ? READOUT_ROOM : 1));\n return {\n scaleX,\n scaleY: 1,\n translateX: left - bars.origin * scaleX,\n translateY: PAD_PX + rowPx / 2,\n width: o.width,\n height: count * rowPx + 2 * PAD_PX,\n rowPx,\n barPx,\n readouts,\n labelled,\n boxesGenes: boxesGenes(rowPx, barPx)\n };\n}\nfunction stripRowAt(bars, frame, x, y) {\n const i = Math.round((y - frame.translateY) / frame.rowPx);\n const row = [bars.reference, ...bars.rows][i];\n const offset = (x - frame.translateX) / frame.scaleX - bars.origin;\n return row && i >= 0 && offset >= 0 && offset <= row.bp ? { index: i, row, offset } : void 0;\n}\nfunction walkMarksTree(bars, frame, marks) {\n const index = new Map(\n [bars.reference, ...bars.rows].map((row, i) => [row.name, i])\n );\n const X = (offset) => (bars.origin + offset) * frame.scaleX + frame.translateX;\n return el(\n \"g\",\n { \"data-testid\": \"graph-walk-marks\" },\n ...marks.flatMap((m) => {\n const i = index.get(m.row);\n if (i === void 0) {\n return [];\n }\n const y = i * frame.rowPx + frame.translateY;\n const x = X(m.start);\n const w = Math.max(2, m.bp * frame.scaleX);\n const tick = (top) => el(\"rect\", { x, y: top, width: w, height: TICK_PX, fill: MARK_INK });\n return [\n tick(y - frame.barPx / 2 - TICK_PX - 1),\n tick(y + frame.barPx / 2 + 1)\n ];\n })\n );\n}\nfunction walkStripLabelsTree(bars, frame, bold = /* @__PURE__ */ new Set()) {\n return el(\n \"g\",\n { \"font-family\": \"sans-serif\", \"font-size\": LABEL_FONT_PX, fill: \"#333\" },\n ...(frame.labelled ? [bars.reference, ...bars.rows] : []).map(\n (row, i) => el(\n \"text\",\n {\n x: 6,\n y: i * frame.rowPx + frame.translateY + 4,\n \"font-weight\": bold.has(row.name) ? 600 : void 0\n },\n row.label\n )\n )\n );\n}\nfunction stripGeneGaps(frame, rowGenes, gaps) {\n if (!rowGenes?.size) {\n return void 0;\n }\n return frame.boxesGenes ? gaps : { untracked: 0, unread: 0, ...gaps, crowded: true };\n}\n\nexport {\n WALK_STRIP_CEILING_PX,\n LABELLED_ROW_PX,\n stripMarks,\n segmentAt,\n walkStripFrame,\n stripRowAt,\n walkMarksTree,\n walkStripLabelsTree,\n stripGeneGaps\n};\n", "// src/renderer/canvas.ts\nvar MAX_DPR = 2;\nvar MAX_CANVAS_DIM_PX = 8192;\nfunction getDpr() {\n return typeof devicePixelRatio === \"undefined\" ? 1 : Math.min(devicePixelRatio, MAX_DPR);\n}\nvar warnedCanvasClamp = false;\nfunction backingPx(cssSize, dpr, axis) {\n const value = Math.round(cssSize * dpr);\n if (value > MAX_CANVAS_DIM_PX) {\n if (!warnedCanvasClamp) {\n warnedCanvasClamp = true;\n console.warn(\n `Canvas ${axis} ${value}px exceeds the safe limit ${MAX_CANVAS_DIM_PX}px and was clamped`\n );\n }\n return MAX_CANVAS_DIM_PX;\n }\n return value;\n}\nfunction syncCanvasSize(canvas, width, height) {\n const dpr = getDpr();\n const pw = backingPx(width, dpr, \"width\");\n const ph = backingPx(height, dpr, \"height\");\n if (canvas.width !== pw || canvas.height !== ph) {\n canvas.width = pw;\n canvas.height = ph;\n }\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (canvas.style.width !== cssWidth) {\n canvas.style.width = cssWidth;\n }\n if (canvas.style.height !== cssHeight) {\n canvas.style.height = cssHeight;\n }\n}\n\nexport {\n MAX_DPR,\n MAX_CANVAS_DIM_PX,\n getDpr,\n syncCanvasSize\n};\n", "import {\n syncCanvasSize\n} from \"./chunk-4BYTEJGW.js\";\nimport {\n abgrToCssRgba,\n brightenAbgr,\n normalizedRgbToCssRgba\n} from \"./chunk-UMNCCYBN.js\";\n\n// src/renderer/Canvas2DRenderer.ts\nvar Canvas2DRenderer = class {\n constructor(canvas) {\n this.transform = null;\n this.batch = null;\n this.nodeHighlights = /* @__PURE__ */ new Map();\n this.highlightedEdge = null;\n this.highlightFactor = 1;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Canvas 2D context not available\");\n }\n this.canvas = canvas;\n this.ctx = ctx;\n }\n setErrorHandler(_handler) {\n }\n releaseOffscreenTargets() {\n }\n // Not a local `width * devicePixelRatio`: syncCanvasSize clamps the backing\n // store at MAX_CANVAS_DIM_PX, reads the ratio through `getDpr()` so this\n // agrees with the transform the model builds, and writes the css size\n // independently of the backing size.\n resize(width, height) {\n syncCanvasSize(this.canvas, width, height);\n }\n uploadGeometry(batch) {\n this.batch = batch;\n this.highlightedEdge = null;\n }\n setNodeHighlights(factors) {\n this.nodeHighlights = factors;\n }\n setEdgeHighlight(edgeIndex, factor) {\n this.highlightedEdge = edgeIndex;\n this.highlightFactor = factor;\n }\n updateTransform(transform) {\n this.transform = transform;\n }\n render(clearColor) {\n const t = this.transform;\n if (!t) {\n return;\n }\n const ctx = this.ctx;\n const { width, height } = ctx.canvas;\n if (clearColor[3] < 1) {\n ctx.clearRect(0, 0, width, height);\n }\n ctx.fillStyle = normalizedRgbToCssRgba(\n [clearColor[0], clearColor[1], clearColor[2]],\n clearColor[3]\n );\n ctx.fillRect(0, 0, width, height);\n const batch = this.batch;\n if (!batch) {\n return;\n }\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n this.renderEdges(batch);\n this.renderNodes(batch);\n this.renderArrows(batch);\n }\n renderEdges(batch) {\n const t = this.transform;\n const ctx = this.ctx;\n const hl = this.highlightedEdge === null ? void 0 : batch.edgeCurveRuns.get(this.highlightedEdge);\n for (const { color, items } of groupByPaint(batch.edgeCurves, (e, i) => ({\n color: inRun(hl, i) ? brightenAbgr(e.color, this.highlightFactor) : e.color,\n weight: e.thickness,\n last: inRun(hl, i)\n }))) {\n ctx.strokeStyle = abgrToCssRgba(color);\n ctx.lineWidth = items[0].thickness * 2 * t.dpr;\n ctx.beginPath();\n for (const e of items) {\n const first = e.curves[0];\n ctx.moveTo(\n first.x0 * t.scaleX + t.translateX,\n first.y0 * t.scaleY + t.translateY\n );\n for (const c of e.curves) {\n ctx.bezierCurveTo(\n c.cx0 * t.scaleX + t.translateX,\n c.cy0 * t.scaleY + t.translateY,\n c.cx1 * t.scaleX + t.translateX,\n c.cy1 * t.scaleY + t.translateY,\n c.x1 * t.scaleX + t.translateX,\n c.y1 * t.scaleY + t.translateY\n );\n }\n }\n ctx.stroke();\n }\n }\n renderNodes(batch) {\n const t = this.transform;\n const ctx = this.ctx;\n const lifted = /* @__PURE__ */ new Map();\n for (const [nodeId, factor] of this.nodeHighlights) {\n const run = batch.nodeStrokeRuns.get(nodeId);\n if (run) {\n for (let i = run.start; i < run.start + run.count; i++) {\n lifted.set(i, factor);\n }\n }\n }\n for (const { color, items } of groupByPaint(batch.nodeStrokes, (s, i) => {\n const factor = lifted.get(i);\n return {\n color: factor === void 0 ? s.color : brightenAbgr(s.color, factor),\n weight: s.thickness,\n last: factor !== void 0\n };\n })) {\n ctx.strokeStyle = abgrToCssRgba(color);\n ctx.lineWidth = items[0].thickness * 2 * t.dpr;\n ctx.beginPath();\n for (const s of items) {\n const p0 = s.points[0];\n ctx.moveTo(\n p0.x * t.scaleX + t.translateX,\n p0.y * t.scaleY + t.translateY\n );\n for (let i = 1, l = s.points.length; i < l; i++) {\n const p = s.points[i];\n ctx.lineTo(\n p.x * t.scaleX + t.translateX,\n p.y * t.scaleY + t.translateY\n );\n }\n }\n ctx.stroke();\n }\n }\n renderArrows(batch) {\n const t = this.transform;\n const ctx = this.ctx;\n const hl = this.highlightedEdge === null ? void 0 : batch.arrowRuns.get(this.highlightedEdge);\n for (const { color, items } of groupByPaint(batch.arrows, (a, i) => ({\n color: inRun(hl, i) ? brightenAbgr(a.color, this.highlightFactor) : a.color,\n weight: 0,\n last: inRun(hl, i)\n }))) {\n ctx.fillStyle = abgrToCssRgba(color);\n ctx.beginPath();\n for (const a of items) {\n const [tip, left, notch, right] = arrowheadOutline(a, t);\n ctx.moveTo(tip.x, tip.y);\n ctx.lineTo(left.x, left.y);\n ctx.lineTo(notch.x, notch.y);\n ctx.lineTo(right.x, right.y);\n ctx.closePath();\n }\n ctx.fill();\n }\n }\n dispose() {\n this.batch = null;\n this.nodeHighlights = /* @__PURE__ */ new Map();\n this.highlightedEdge = null;\n }\n};\nvar ARROW_NOTCH = 0.25;\nfunction arrowheadOutline(a, t) {\n const ux = Math.cos(a.angle);\n const uy = Math.sin(a.angle);\n const tipX = a.x * t.scaleX + t.translateX;\n const tipY = a.y * t.scaleY + t.translateY;\n const length = a.length * t.dpr;\n const halfWidth = a.halfWidth * t.dpr;\n const backX = tipX - ux * length;\n const backY = tipY - uy * length;\n const notchBack = length * (1 - ARROW_NOTCH);\n return [\n { x: tipX, y: tipY },\n { x: backX - uy * halfWidth, y: backY + ux * halfWidth },\n { x: tipX - ux * notchBack, y: tipY - uy * notchBack },\n { x: backX + uy * halfWidth, y: backY - ux * halfWidth }\n ];\n}\nfunction inRun(run, i) {\n return run !== void 0 && i >= run.start && i < run.start + run.count;\n}\nfunction groupByPaint(items, paintOf) {\n const groups = /* @__PURE__ */ new Map();\n const deferred = /* @__PURE__ */ new Map();\n for (let i = 0, l = items.length; i < l; i++) {\n const item = items[i];\n const { color, weight, last } = paintOf(item, i);\n const into = last ? deferred : groups;\n const key = `${color}:${weight}`;\n const group = into.get(key);\n if (group) {\n group.items.push(item);\n } else {\n into.set(key, { color, items: [item] });\n }\n }\n return [...groups.values(), ...deferred.values()];\n}\n\nexport {\n Canvas2DRenderer,\n arrowheadOutline\n};\n", "import {\n formatBp,\n groupDigits\n} from \"./chunk-N62KBLFC.js\";\n\n// src/walkKey.ts\nfunction rangeText(contig, start, end) {\n const s = Math.round(start);\n const e = Math.round(end);\n return `${contig ? `${contig}:` : \"\"}${groupDigits(s)}-${groupDigits(e)} (${formatBp(e - s)})`;\n}\nfunction walkKey(walk, reference) {\n const { field } = walk.encoding;\n const own = walk.range ? rangeText(walk.range.contig, walk.range.start, walk.range.end) : void 0;\n const scale = field === \"progress\" ? own : field === \"reference\" && reference ? rangeText(reference.name, reference.start, reference.end) : void 0;\n const spanned = walk.range ? walk.range.end - walk.range.start : walk.bp;\n const outside = spanned - walk.bp;\n return {\n delta: walk.referenceBp === void 0 || spanned === walk.referenceBp ? \"\" : ` ${spanned > walk.referenceBp ? \"+\" : \"\\u2212\"}${formatBp(Math.abs(spanned - walk.referenceBp))}`,\n outside: outside > 0 ? `, ${formatBp(outside)} outside the cut` : \"\",\n reversed: walk.reversedBp > 0 ? `, ${formatBp(walk.reversedBp)} reversed` : \"\",\n shades: field !== \"walk\",\n scale,\n hover: scale === own ? void 0 : own\n };\n}\nfunction walkPosition(walk, nodeId, length) {\n const progress = walk.progress.get(nodeId);\n const range = walk.range;\n if (progress === void 0 || !range) {\n return void 0;\n }\n const start = Math.round(\n range.start + progress * (range.end - range.start) - length / 2\n );\n return `${range.contig}:${groupDigits(start)}-${groupDigits(start + length)}`;\n}\n\nexport {\n rangeText,\n walkKey,\n walkPosition\n};\n", "import {\n formatBp\n} from \"./chunk-N62KBLFC.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/tubeMap/axis.ts\nfunction referenceBoxes(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byRefName = /* @__PURE__ */ new Map();\n layout.nodes.forEach((node) => {\n const graphNode = nodeById.get(node.name);\n if (node.order >= 0 && graphNode && isBackbone(graphNode)) {\n const { refName, start } = graphNode.stable;\n const boxes = byRefName.get(refName) ?? byRefName.set(refName, []).get(refName);\n boxes.push({\n bp0: start,\n bp1: start + node.sequenceLength,\n x0: node.x,\n x1: node.x + node.pixelWidth\n });\n }\n });\n for (const boxes of byRefName.values()) {\n boxes.sort((a, b) => a.bp0 - b.bp0);\n }\n return byRefName;\n}\nfunction tubeX(boxes, bp, isEnd = false) {\n let lo = 0;\n let hi = boxes.length - 1;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n const bp1 = boxes[mid].bp1;\n if (isEnd ? bp1 < bp : bp1 <= bp) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n const box = boxes[lo];\n if (bp <= box.bp0) {\n return box.x0;\n }\n const span = box.bp1 - box.bp0;\n return span > 0 ? box.x0 + (Math.min(bp, box.bp1) - box.bp0) / span * (box.x1 - box.x0) : box.x0;\n}\nfunction tubeSpan(boxes, start, end) {\n const a = tubeX(boxes, start);\n const b = tubeX(boxes, end, true);\n return { x0: Math.min(a, b), x1: Math.max(a, b) };\n}\nfunction rulerBoxes(byRefName) {\n let best;\n for (const boxes of byRefName.values()) {\n if (!best || boxes.length > best.length) {\n best = boxes;\n }\n }\n return best;\n}\nvar TICK_PX = 5;\nvar LABEL_GAP_PX = 10;\nvar TARGET_TICK_PX = 110;\nvar MIN_BRACKET_PX = 3;\nfunction rulerInk(darkMode) {\n return darkMode ? \"#b0b0b8\" : \"#55555c\";\n}\nfunction niceStep(raw) {\n const pow = 10 ** Math.floor(Math.log10(raw));\n const m = raw / pow;\n return (m <= 1 ? 1 : m <= 2 ? 2 : m <= 5 ? 5 : 10) * pow;\n}\nfunction placeLabels(candidates) {\n const placed = [];\n for (const a of candidates) {\n if (placed.every(\n (b) => Math.abs(a.at - b.at) >= (a.width + b.width) / 2 + LABEL_GAP_PX\n )) {\n placed.push(a);\n }\n }\n return placed.map(({ text, at }) => ({ text, at }));\n}\nfunction scaleMarks(boxes, x, width, measure) {\n const first = boxes[0];\n const last = boxes.at(-1);\n if (!first || !last) {\n return void 0;\n }\n const from = x(first.x0);\n const to = x(last.x1);\n const bpSpan = last.bp1 - first.bp0;\n if (to <= from || bpSpan <= 0) {\n return void 0;\n }\n const step = niceStep(bpSpan / (to - from) * TARGET_TICK_PX);\n const ticks = [];\n const positions = [];\n for (let bp = Math.ceil(first.bp0 / step) * step; bp <= last.bp1; bp += step) {\n const sx = Math.round(x(tubeX(boxes, bp))) + 0.5;\n if (sx >= 0 && sx <= width) {\n ticks.push(sx);\n const text = bp.toLocaleString(\"en-US\");\n positions.push({ text, at: sx, width: measure(text) });\n }\n }\n return {\n spans: [{ x0: from, x1: to }],\n ticks,\n labels: placeLabels(positions)\n };\n}\nfunction boxMarks(boxes, x, width, measure) {\n const shown = boxes.map((box) => ({ box, s0: x(box.x0), s1: x(box.x1) })).filter(({ s0, s1 }) => s1 >= 0 && s0 <= width);\n const first = shown[0];\n const last = shown.at(-1);\n if (!first || !last) {\n return void 0;\n }\n const label = (text, at) => ({\n text,\n at,\n width: measure(text)\n });\n const position = (bp, at) => label(bp.toLocaleString(\"en-US\"), at);\n const spans = [];\n const ticks = [];\n const lengths = [];\n const boundaries = [];\n for (const { box, s0, s1 } of shown) {\n spans.push({ x0: s0, x1: s1 });\n ticks.push(Math.round(s0) + 0.5);\n if (s1 - s0 >= MIN_BRACKET_PX) {\n ticks.push(Math.round(s1) + 0.5);\n }\n const length = label(formatBp(box.bp1 - box.bp0), (s0 + s1) / 2);\n if (length.width <= s1 - s0) {\n lengths.push(length);\n }\n if (box !== first.box) {\n boundaries.push(position(box.bp0, s0));\n }\n }\n const ends = [\n position(first.box.bp0, first.s0),\n position(last.box.bp1, last.s1)\n ];\n return {\n spans,\n ticks,\n labels: placeLabels([...ends, ...lengths, ...boundaries])\n };\n}\nfunction rulerMarks(boxes, x, width, measure, referenceAxis = false) {\n return (referenceAxis ? scaleMarks : boxMarks)(boxes, x, width, measure);\n}\nfunction drawTubeMapRuler(ctx, boxes, frame, top, referenceAxis = false) {\n const { x, width, darkMode } = frame;\n ctx.font = \"10px sans-serif\";\n const marks = rulerMarks(\n boxes,\n x,\n width,\n (text) => ctx.measureText(text).width,\n referenceAxis\n );\n if (!marks) {\n return;\n }\n const ink = rulerInk(darkMode);\n const y = top + 0.5;\n ctx.strokeStyle = ink;\n ctx.fillStyle = ink;\n ctx.lineWidth = 1;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.beginPath();\n for (const { x0, x1 } of marks.spans) {\n ctx.moveTo(Math.max(0, x0), y);\n ctx.lineTo(Math.min(width, x1), y);\n }\n for (const sx of marks.ticks) {\n ctx.moveTo(sx, top);\n ctx.lineTo(sx, top + TICK_PX);\n }\n ctx.stroke();\n for (const { text, at } of marks.labels) {\n ctx.fillText(text, at, top + TICK_PX + 2);\n }\n}\n\nexport {\n referenceBoxes,\n tubeX,\n tubeSpan,\n rulerBoxes,\n rulerInk,\n rulerMarks,\n drawTubeMapRuler\n};\n", "import {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/tubeMap/connectors.ts\nfunction referenceNodes(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const out = [];\n layout.nodes.forEach((node) => {\n const graphNode = nodeById.get(node.name);\n if (node.order >= 0 && graphNode && isBackbone(graphNode)) {\n out.push({\n node: node.name,\n bp0: graphNode.stable.start,\n bp1: graphNode.stable.start + node.sequenceLength,\n x0: node.x,\n x1: node.x + node.pixelWidth\n });\n }\n });\n return out;\n}\nfunction tubeMapConnectors(nodes, bpToScreen, tubeToScreen, width) {\n const out = [];\n for (const n of nodes) {\n const bottom0 = tubeToScreen(n.x0);\n const bottom1 = tubeToScreen(n.x1);\n if (bottom1 >= 0 && bottom0 <= width) {\n out.push({\n node: n.node,\n top0: bpToScreen(n.bp0),\n top1: bpToScreen(n.bp1),\n bottom0,\n bottom1\n });\n }\n }\n return out;\n}\nvar HIT_SLOP_PX = 3;\nfunction connectorAt(connectors, zoneBottom, sx, sy) {\n if (zoneBottom <= 0 || sy < 0 || sy > zoneBottom) {\n return void 0;\n }\n const t = sy / zoneBottom;\n let hit;\n let best = HIT_SLOP_PX;\n for (const c of connectors) {\n const a = c.top0 + (c.bottom0 - c.top0) * t;\n const b = c.top1 + (c.bottom1 - c.top1) * t;\n const dist = Math.max(0, Math.min(a, b) - sx, sx - Math.max(a, b));\n if (dist < best) {\n best = dist;\n hit = c.node;\n }\n }\n return hit;\n}\nfunction band(ctx, c, bottom) {\n ctx.moveTo(c.top0, 0);\n ctx.lineTo(c.top1, 0);\n ctx.lineTo(c.bottom1, bottom);\n ctx.lineTo(c.bottom0, bottom);\n ctx.closePath();\n}\nfunction sides(ctx, c, bottom) {\n ctx.moveTo(c.top0, 0);\n ctx.lineTo(c.bottom0, bottom);\n ctx.moveTo(c.top1, 0);\n ctx.lineTo(c.bottom1, bottom);\n}\nfunction drawTubeMapConnectors(ctx, connectors, bottom, {\n highlightNode,\n darkMode\n}) {\n if (bottom <= 0 || connectors.length === 0) {\n return;\n }\n const ink = darkMode ? \"255,255,255\" : \"0,0,0\";\n ctx.beginPath();\n for (const c of connectors) {\n band(ctx, c, bottom);\n }\n ctx.fillStyle = `rgba(${ink},0.07)`;\n ctx.fill();\n ctx.beginPath();\n for (const c of connectors) {\n sides(ctx, c, bottom);\n }\n ctx.strokeStyle = `rgba(${ink},0.35)`;\n ctx.lineWidth = 0.5;\n ctx.stroke();\n const lit = connectors.find((c) => c.node === highlightNode);\n if (lit) {\n ctx.beginPath();\n band(ctx, lit, bottom);\n ctx.fillStyle = \"rgba(255,192,203,0.5)\";\n ctx.fill();\n ctx.beginPath();\n sides(ctx, lit, bottom);\n ctx.strokeStyle = \"#ff0000\";\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n}\n\nexport {\n referenceNodes,\n tubeMapConnectors,\n connectorAt,\n drawTubeMapConnectors\n};\n", "// src/tubeMap/mismatches.ts\nimport { forward, getXCoordinateOfBaseWithinNode } from \"@gmod/tubemap-core\";\nfunction readMismatches(read, layout) {\n const marks = [];\n const entries = read.sequenceNew ?? [];\n entries.forEach((entry, i) => {\n const nodeIndex = layout.nodeMap.get(forward(entry.nodeName));\n const node = nodeIndex === void 0 ? void 0 : layout.nodes[nodeIndex];\n let pathIndex = i;\n while (pathIndex < read.path.length && read.path[pathIndex].node !== nodeIndex) {\n pathIndex += 1;\n }\n const y = read.path[pathIndex]?.y;\n if (node && y !== void 0) {\n const base = { readId: read.id, y, height: read.width, nodeY: node.y };\n const at = (pos) => getXCoordinateOfBaseWithinNode(node, pos);\n for (const mm of entry.mismatches) {\n const x0 = at(mm.pos);\n if (x0 !== null) {\n if (mm.type === \"insertion\") {\n const softClip = i === 0 && mm.pos === read.firstNodeOffset || i === entries.length - 1 && mm.pos === read.finalNodeCoverLength;\n marks.push({\n ...base,\n kind: \"insertion\",\n x: x0,\n seq: mm.seq,\n softClip\n });\n } else if (mm.type === \"deletion\" && mm.length !== void 0) {\n const x1 = at(mm.pos + mm.length);\n if (x1 !== null) {\n marks.push({ ...base, kind: \"deletion\", x0, x1 });\n }\n } else if (mm.type === \"substitution\" && mm.seq !== void 0) {\n const x1 = at(mm.pos + mm.seq.length);\n if (x1 !== null) {\n marks.push({ ...base, kind: \"substitution\", x0, x1, seq: mm.seq });\n }\n }\n }\n }\n }\n });\n return marks;\n}\nfunction tubeMapMismatches(layout) {\n return layout.reads.flatMap((read) => readMismatches(read, layout));\n}\n\nexport {\n tubeMapMismatches\n};\n", "import {\n tubeMapMismatches\n} from \"./chunk-EJ5OZTCK.js\";\n\n// src/tubeMap/draw.ts\nimport { curvePaths, nodeOutlinePath } from \"@gmod/tubemap-core\";\nfunction parsePath(d) {\n const tokens = d.trim().split(/[\\s,]+/);\n const commands = [];\n let i = 0;\n const num = () => Number(tokens[i++]);\n while (i < tokens.length) {\n const op = tokens[i++];\n if (op === \"M\" || op === \"L\") {\n commands.push({ op, x: num(), y: num() });\n } else if (op === \"H\") {\n commands.push({ op, x: num() });\n } else if (op === \"V\") {\n commands.push({ op, y: num() });\n } else if (op === \"Q\") {\n commands.push({ op, x1: num(), y1: num(), x: num(), y: num() });\n } else if (op === \"C\") {\n commands.push({\n op,\n x1: num(),\n y1: num(),\n x2: num(),\n y2: num(),\n x: num(),\n y: num()\n });\n } else if (op === \"Z\") {\n commands.push({ op });\n }\n }\n return commands;\n}\nfunction extentOf(commands) {\n let x0 = Infinity;\n let x1 = -Infinity;\n for (const c of commands) {\n if (\"x\" in c) {\n x0 = Math.min(x0, c.x);\n x1 = Math.max(x1, c.x);\n }\n if (\"x1\" in c) {\n x0 = Math.min(x0, c.x1);\n x1 = Math.max(x1, c.x1);\n }\n }\n return { x0, x1 };\n}\nfunction shapeOf(d, color, alpha, track) {\n const commands = parsePath(d);\n return { commands, color, track, alpha, ...extentOf(commands) };\n}\nfunction layerOf(layout, type) {\n const { shapes } = layout;\n const trackOf = (s) => type === \"haplotype\" ? s.id : void 0;\n const rects = [...shapes.rectangles, ...shapes.verticalRectangles].filter((r) => r.type === type).map((r) => ({\n color: r.color,\n track: trackOf(r),\n alpha: r.alpha ?? 1,\n x0: r.xStart,\n x1: r.xEnd + 1,\n y0: r.yStart,\n y1: r.yEnd + 1\n }));\n const curves = curvePaths(shapes.curves, type).map(\n (c) => shapeOf(c.path, c.color, c.alpha ?? 1, trackOf(c))\n );\n const corners = shapes.corners.filter((c) => c.type === type).map((c) => shapeOf(c.path, c.color, 1, trackOf(c)));\n return { rects, shapes: [...curves, ...corners] };\n}\nfunction tubeMapPicture(layout) {\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n const commands = parsePath(nodeOutlinePath(node));\n nodes.push({ name: node.name, commands, ...extentOf(commands) });\n }\n });\n return {\n bounds: layout.bounds,\n layers: [layerOf(layout, \"haplotype\"), layerOf(layout, \"read\")],\n nodes,\n mismatches: tubeMapMismatches(layout).filter(\n (m) => m.kind !== \"insertion\" || !m.softClip\n )\n };\n}\nfunction trace(ctx, commands, x, y) {\n let cx = 0;\n let cy = 0;\n for (const c of commands) {\n switch (c.op) {\n case \"M\":\n cx = c.x;\n cy = c.y;\n ctx.moveTo(x(cx), y(cy));\n break;\n case \"L\":\n cx = c.x;\n cy = c.y;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"H\":\n cx = c.x;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"V\":\n cy = c.y;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"Q\":\n cx = c.x;\n cy = c.y;\n ctx.quadraticCurveTo(x(c.x1), y(c.y1), x(cx), y(cy));\n break;\n case \"C\":\n cx = c.x;\n cy = c.y;\n ctx.bezierCurveTo(x(c.x1), y(c.y1), x(c.x2), y(c.y2), x(cx), y(cy));\n break;\n case \"Z\":\n ctx.closePath();\n break;\n }\n }\n}\nfunction fillByColor(ctx, items, visible, colorOf, addTo) {\n const byColor = /* @__PURE__ */ new Map();\n for (const item of items) {\n if (visible(item)) {\n const key = `${colorOf(item)}|${item.alpha}`;\n const list = byColor.get(key);\n if (list) {\n list.push(item);\n } else {\n byColor.set(key, [item]);\n }\n }\n }\n for (const list of byColor.values()) {\n ctx.fillStyle = colorOf(list[0]);\n ctx.globalAlpha = list[0].alpha;\n ctx.beginPath();\n for (const item of list) {\n addTo(item);\n }\n ctx.fill();\n }\n ctx.globalAlpha = 1;\n}\nvar FULL_OUTLINE_PX = 12;\nvar MIN_OUTLINE_ALPHA = 0.15;\nfunction outlineAlpha(screenWidth) {\n return Math.max(MIN_OUTLINE_ALPHA, Math.min(1, screenWidth / FULL_OUTLINE_PX));\n}\nvar NODE_TINT_ALPHA = 0.55;\nfunction drawTubeMap(ctx, picture, frame) {\n const { x, y, width } = frame;\n const visible = (item) => x(item.x1) >= 0 && x(item.x0) <= width;\n const colorOf = (item) => item.track !== void 0 && frame.tubeColors?.[item.track] || item.color;\n for (const layer of picture.layers) {\n fillByColor(ctx, layer.rects, visible, colorOf, (r) => {\n const left = x(r.x0);\n const top = y(r.y0);\n ctx.rect(left, top, x(r.x1) - left, y(r.y1) - top);\n });\n fillByColor(ctx, layer.shapes, visible, colorOf, (s) => {\n trace(ctx, s.commands, x, y);\n });\n }\n const stroke = frame.darkMode ? \"#d0d0d0\" : \"#000000\";\n const fill = frame.darkMode ? \"rgba(40,40,40,0.4)\" : \"rgba(255,255,255,0.4)\";\n ctx.lineWidth = 2 * Math.max(0.25, Math.min(1, frame.yScale));\n for (const node of picture.nodes) {\n if (visible(node)) {\n const lit = node.name === frame.highlightNode;\n ctx.beginPath();\n trace(ctx, node.commands, x, y);\n const tint = lit ? void 0 : frame.nodeColors?.get(node.name);\n ctx.fillStyle = lit ? \"rgba(255,192,203,0.5)\" : tint ?? fill;\n ctx.strokeStyle = lit ? \"#ff0000\" : stroke;\n ctx.globalAlpha = tint ? NODE_TINT_ALPHA : 1;\n ctx.fill();\n ctx.globalAlpha = lit ? 1 : outlineAlpha(x(node.x1) - x(node.x0));\n ctx.stroke();\n ctx.globalAlpha = 1;\n }\n }\n drawMismatches(ctx, picture.mismatches, frame);\n}\nvar MISMATCH_FONT_PX = 12;\nvar MIN_MISMATCH_FONT_PX = 6;\nfunction mismatchesLegible(yScale) {\n return MISMATCH_FONT_PX * yScale >= MIN_MISMATCH_FONT_PX;\n}\nfunction mismatchOnScreen(m, { x, width }) {\n const [x0, x1] = m.kind === \"insertion\" ? [m.x, m.x] : [m.x0, m.x1];\n return x(x1) >= 0 && x(x0) <= width;\n}\nfunction drawMismatches(ctx, marks, frame) {\n const { x, y, yScale, darkMode } = frame;\n if (!mismatchesLegible(yScale) || marks.length === 0) {\n return;\n }\n const fontPx = MISMATCH_FONT_PX * yScale;\n ctx.fillStyle = \"grey\";\n ctx.beginPath();\n for (const m of marks) {\n if (m.kind === \"deletion\" && mismatchOnScreen(m, frame)) {\n const left = x(m.x0);\n const top = y(m.y);\n ctx.rect(left, top, x(m.x1) - left, y(m.y + m.height) - top);\n }\n }\n ctx.fill();\n ctx.font = `${fontPx}px monospace`;\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = darkMode ? \"#ffffff\" : \"#000000\";\n for (const m of marks) {\n if (!mismatchOnScreen(m, frame)) {\n continue;\n }\n if (m.kind === \"substitution\") {\n ctx.fillText(m.seq, x(m.x0) + 1, y(m.y + m.height));\n } else if (m.kind === \"insertion\") {\n ctx.fillText(\"*\", x(m.x) - 3, y(m.y + m.height));\n }\n }\n}\n\nexport {\n parsePath,\n tubeMapPicture,\n drawTubeMap,\n mismatchesLegible,\n mismatchOnScreen\n};\n", "import {\n tubeSpan\n} from \"./chunk-CS3E4ETM.js\";\n\n// src/tubeMap/genes.ts\nfunction tubeMapGenes(byRefName, genes) {\n const out = [];\n for (const gene of genes) {\n const boxes = byRefName.get(gene.refName);\n const first = boxes?.[0];\n const last = boxes?.at(-1);\n if (!boxes || !first || !last) {\n continue;\n }\n const start = Math.max(gene.start, first.bp0);\n const end = Math.min(gene.end, last.bp1);\n if (end <= start) {\n continue;\n }\n out.push({\n gene,\n ...tubeSpan(boxes, start, end),\n exons: gene.exons.filter((e) => e.end > start && e.start < end).map(\n (e) => tubeSpan(boxes, Math.max(e.start, start), Math.min(e.end, end))\n )\n });\n }\n return out;\n}\nvar GENE_ROW_PX = 22;\nvar MAX_GENE_ROWS = 4;\nvar EXON_PX = 8;\nvar NAME_FONT = \"11px sans-serif\";\nvar NAME_GAP_PX = 8;\nfunction tubeMapGeneRows(genes) {\n const edges = genes.flatMap((g) => [\n { x: g.x0, step: 1 },\n { x: g.x1, step: -1 }\n ]).sort((a, b) => a.x - b.x || a.step - b.step);\n let depth = 0;\n let most = 0;\n for (const { step } of edges) {\n depth += step;\n most = Math.max(most, depth);\n }\n return Math.min(MAX_GENE_ROWS, most);\n}\nfunction drawTubeMapGenes(ctx, genes, frame, bottom, top = 0) {\n const { x, width, darkMode } = frame;\n const rows = Math.max(1, Math.floor((bottom - top) / GENE_ROW_PX));\n const rowEnds = [];\n const ink = darkMode ? \"#e0e0e6\" : \"#1c1c22\";\n ctx.font = NAME_FONT;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = ink;\n ctx.strokeStyle = ink;\n ctx.lineWidth = 1;\n const placed = genes.map((g) => ({ g, s0: x(g.x0), s1: x(g.x1) })).filter(({ s0, s1 }) => s1 >= 0 && s0 <= width).sort((a, b) => a.s0 - b.s0);\n for (const { g, s0, s1 } of placed) {\n const arrow = g.gene.strand > 0 ? \" \\u2192\" : g.gene.strand < 0 ? \"\\u2190 \" : \"\";\n const label = g.gene.strand < 0 ? `${arrow}${g.gene.name}` : `${g.gene.name}${arrow}`;\n const mid = (Math.max(s0, 0) + Math.min(s1, width)) / 2;\n const half = ctx.measureText(label).width / 2;\n const left = Math.min(s0, mid - half);\n const right = Math.max(s1, mid + half);\n let row = rowEnds.findIndex((end) => end + NAME_GAP_PX <= left);\n if (row === -1) {\n row = Math.min(rowEnds.length, rows - 1);\n }\n rowEnds[row] = Math.max(rowEnds[row] ?? -Infinity, right);\n const glyphY = bottom - row * GENE_ROW_PX - EXON_PX / 2;\n ctx.beginPath();\n ctx.moveTo(s0, glyphY + 0.5);\n ctx.lineTo(s1, glyphY + 0.5);\n ctx.stroke();\n for (const e of g.exons) {\n const e0 = x(e.x0);\n ctx.fillRect(e0, glyphY - EXON_PX / 2, Math.max(1, x(e.x1) - e0), EXON_PX);\n }\n ctx.fillText(label, mid, glyphY - EXON_PX / 2 - 2);\n }\n}\n\nexport {\n tubeMapGenes,\n GENE_ROW_PX,\n tubeMapGeneRows,\n drawTubeMapGenes\n};\n", "import {\n LIFT_BACKDROP_CSS,\n computeColorSchemeRange,\n getNodeColor\n} from \"./chunk-RX5CSWJW.js\";\nimport {\n abgrToCssRgba\n} from \"./chunk-UMNCCYBN.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/referenceStrip.ts\nvar REFERENCE_STRIP_PX = 12;\nvar REFERENCE_STRIP_ZONE_PX = REFERENCE_STRIP_PX + 8;\nvar OVERHANG_PX = 8;\nvar OVERHANG_CAP_PX = OVERHANG_PX + 3;\nvar MIN_STAGGER_PX = 12;\nfunction referenceStripBlocks(graph, {\n colorScheme,\n referenceRamp,\n walks\n}) {\n const range = { ...computeColorSchemeRange(graph), referenceRamp };\n const out = [];\n graph.nodes.forEach((node, index) => {\n if (isBackbone(node)) {\n const colors = walks ? walks.map((w) => {\n const lane = w.colors.get(node.id);\n return lane === void 0 ? LIFT_BACKDROP_CSS : abgrToCssRgba(lane);\n }) : [abgrToCssRgba(getNodeColor(node, index, colorScheme, range))];\n out.push({\n node: node.id,\n bp0: node.stable.start,\n bp1: node.stable.start + node.length,\n colors,\n faded: colors.includes(LIFT_BACKDROP_CSS)\n });\n }\n });\n return out.sort((a, b) => a.bp0 - b.bp0);\n}\nfunction span(frame, bp0, bp1) {\n const a = bp0 * frame.scale + frame.translateX;\n const b = bp1 * frame.scale + frame.translateX;\n return a < b ? [a, b] : [b, a];\n}\nvar HIT_SLOP_PX = 2;\nfunction stripOverhang(blocks, frame, width) {\n const a = -frame.translateX / frame.scale;\n const b = (width - frame.translateX) / frame.scale;\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n let below = 0;\n let above = 0;\n for (const block of blocks) {\n below += Math.max(0, Math.min(block.bp1, lo) - block.bp0);\n above += Math.max(0, block.bp1 - Math.max(block.bp0, hi));\n }\n return frame.scale >= 0 ? { left: Math.round(below), right: Math.round(above) } : { left: Math.round(above), right: Math.round(below) };\n}\nfunction stripBlockAt(blocks, frame, sx, sy) {\n if (sy < 0 || sy > REFERENCE_STRIP_PX + HIT_SLOP_PX) {\n return void 0;\n }\n let hit;\n let best = HIT_SLOP_PX;\n for (const b of blocks) {\n const [x0, x1] = span(frame, b.bp0, b.bp1);\n const dist = Math.max(0, x0 - sx, sx - x1);\n if (dist <= best) {\n best = dist;\n hit = b.node;\n }\n }\n return hit;\n}\nfunction nodeAnchor(segments, toScreen) {\n const p = segments?.[Math.floor(segments.length / 2)];\n return p ? toScreen(p) : void 0;\n}\nfunction stripPixels(blocks, frame, width, dpr) {\n const placed = blocks.map((b) => {\n const [x0, x1] = span(frame, b.bp0, b.bp1);\n const px0 = Math.round(x0 * dpr);\n return {\n colors: b.colors,\n x0,\n px0,\n px1: Math.max(Math.round(x1 * dpr), px0 + 1)\n };\n }).filter((b) => b.px1 > 0 && b.px0 < width * dpr).sort((a, b) => a.x0 - b.x0);\n const out = [];\n let claimed = -Infinity;\n const tierEnds = [-Infinity, -Infinity];\n for (const { colors, px0, px1 } of placed) {\n const start = Math.max(px0, claimed);\n if (px1 > start) {\n const tier = tierEnds[0] < start ? 0 : 1;\n tierEnds[tier] = px1;\n out.push({ colors, x0: start / dpr, x1: px1 / dpr, tier });\n claimed = px1;\n }\n }\n const covered = out.length > 0 ? out.at(-1).x1 - out[0].x0 : 0;\n return covered >= out.length * MIN_STAGGER_PX ? out : out.map(({ tier: _, ...b }) => b);\n}\nfunction drawOverhang(ctx, edgeX, inward, ink) {\n const capX = inward > 0 ? edgeX : edgeX - OVERHANG_CAP_PX;\n ctx.clearRect(capX, 0, OVERHANG_CAP_PX, REFERENCE_STRIP_PX);\n const tipX = edgeX + inward;\n const baseX = tipX + inward * OVERHANG_PX;\n ctx.beginPath();\n ctx.moveTo(tipX, REFERENCE_STRIP_PX / 2);\n ctx.lineTo(baseX, 0);\n ctx.lineTo(baseX, REFERENCE_STRIP_PX);\n ctx.closePath();\n ctx.fillStyle = ink;\n ctx.fill();\n}\nfunction rowEdge(row, rows, dpr) {\n return Math.round(row * REFERENCE_STRIP_PX * dpr / rows) / dpr;\n}\nfunction drawReferenceStrip(ctx, blocks, frame, {\n width,\n lit,\n darkMode,\n dpr = 1\n}) {\n const ink = darkMode ? \"#ffffff\" : \"#18181c\";\n ctx.clearRect(0, 0, width, REFERENCE_STRIP_ZONE_PX);\n for (const b of stripPixels(blocks, frame, width, dpr)) {\n const { tier } = b;\n const staggered = tier !== void 0 && b.colors.length === 1;\n const rows = staggered ? 2 : b.colors.length;\n b.colors.forEach((color, i) => {\n const row = staggered ? tier : i;\n const y0 = rowEdge(row, rows, dpr);\n ctx.fillStyle = color;\n ctx.fillRect(b.x0, y0, b.x1 - b.x0, rowEdge(row + 1, rows, dpr) - y0);\n });\n }\n const overhang = stripOverhang(blocks, frame, width);\n if (overhang.left > 0) {\n drawOverhang(ctx, 0, 1, ink);\n }\n if (overhang.right > 0) {\n drawOverhang(ctx, width, -1, ink);\n }\n if (lit) {\n const [x0, x1] = span(frame, lit.start, lit.end);\n const w = Math.max(x1 - x0, 3);\n const left = (x0 + x1) / 2 - w / 2;\n ctx.strokeStyle = ink;\n ctx.lineWidth = 1.5;\n ctx.strokeRect(left, 0.75, w, REFERENCE_STRIP_PX - 1.5);\n if (lit.anchor) {\n ctx.beginPath();\n ctx.moveTo(left + w / 2, REFERENCE_STRIP_PX);\n ctx.lineTo(lit.anchor.x, lit.anchor.y);\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n }\n}\n\nexport {\n REFERENCE_STRIP_PX,\n REFERENCE_STRIP_ZONE_PX,\n referenceStripBlocks,\n stripOverhang,\n stripBlockAt,\n nodeAnchor,\n stripPixels,\n drawReferenceStrip\n};\n", "import {\n isBackbone\n} from \"../chunks/chunk-FYQWPEEY.js\";\n\n// src/tubeMap/deviations.ts\nfunction boxesOf(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const boxes = [];\n layout.nodes.forEach((node, index) => {\n const g = nodeById.get(node.name);\n if (node.order >= 0 && g && isBackbone(g)) {\n const bp0 = g.stable.start;\n boxes.push({ bp0, bp1: bp0 + node.sequenceLength, index, node });\n }\n });\n return boxes.sort((a, b) => a.bp0 - b.bp0);\n}\nfunction boxAt(boxes, bp, visited) {\n let lo = 0;\n let hi = boxes.length - 1;\n while (lo < hi) {\n const mid = lo + hi + 1 >> 1;\n if (boxes[mid].bp0 <= bp) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n return [boxes[lo], boxes[lo - 1]].find(\n (box) => box && visited.has(box.index) && box.bp0 <= bp && bp <= box.bp1\n );\n}\nfunction deviationMarks(graph, layout, deviations) {\n const boxes = boxesOf(graph, layout);\n const marks = [];\n for (const track of layout.tracks) {\n const devs = track.name ? deviations.get(track.name) : void 0;\n if (devs?.length) {\n const visited = /* @__PURE__ */ new Map();\n for (const segment of track.path) {\n if (segment.node !== null && segment.y !== void 0 && !visited.has(segment.node)) {\n visited.set(segment.node, segment.y);\n }\n }\n for (const d of devs) {\n const box = boxAt(boxes, d.start, visited);\n if (box) {\n const { node, bp0, bp1 } = box;\n const at = (bp) => node.x + (Math.min(bp, bp1) - bp0) / (bp1 - bp0) * node.pixelWidth;\n marks.push({\n x0: at(d.start),\n x1: at(d.end),\n y: visited.get(box.index),\n height: track.width\n });\n }\n }\n }\n }\n return marks;\n}\nfunction deviationInk(darkMode) {\n return darkMode ? \"rgba(255,255,255,0.9)\" : \"rgba(0,0,0,0.8)\";\n}\nfunction drawDeviationMarks(ctx, marks, { x, y, width, darkMode }) {\n if (marks.length === 0) {\n return;\n }\n ctx.fillStyle = deviationInk(darkMode);\n ctx.beginPath();\n for (const m of marks) {\n const left = x(m.x0);\n const right = Math.max(x(m.x1), left + 1);\n if (right >= 0 && left <= width) {\n const top = y(m.y);\n ctx.rect(left, top, right - left, y(m.y + m.height) - top);\n }\n }\n ctx.fill();\n}\nexport {\n deviationInk,\n deviationMarks,\n drawDeviationMarks\n};\n", "import type { RepeatCall } from './repeatFeatures'\n\n// Which genotyped allele belongs to which haplotype walk. A VCF states a\n// sample's alleles in genotype order, which is the genotyper's own order and\n// carries no correspondence to the assembly's haplotype numbering \u2014 TRGTdb's\n// ABCA7 record, for one, lists them shortest first. So the walks and the\n// alleles are paired by length instead: the pairing whose total difference is\n// smallest, which for lengths on a line is the non-crossing one.\n//\n// A walk that does not reach both flanking reference nodes is measured whole\n// rather than across the array, and an allele no read spanned is a copy of the\n// one that was called. Neither states a length for this array, so they pair\n// last and take no verdict \u2014 pairing them first let a walk that stops inside\n// the array take the allele that fit one spanning it, and the spanning walk\n// then read as a disagreement.\n\nexport interface WalkCall extends RepeatCall {\n // undefined where the walk and the allele are not both measurements\n agrees?: boolean\n}\n\n// Every walk/call pair over the 94 HPRC samples TRGT genotyped at the ABCA7\n// VNTR is either within 8% of its allele or more than 14% from it, so any\n// threshold across that gap separates them the same way.\nexport const CALL_TOLERANCE = 0.1\n\nfunction agrees(walkBp: number, callBp: number) {\n return Math.abs(callBp - walkBp) <= CALL_TOLERANCE * Math.max(walkBp, callBp)\n}\n\n// Pair two ascending lists of lengths, leaving out the surplus of whichever is\n// longer. `out[i]` is the index in `calls` that `walks[i]` took.\nfunction nearest(walks: number[], calls: number[]) {\n const W = walks.length\n const C = calls.length\n const cost = Array.from({ length: W + 1 }, () => new Array(C + 1).fill(0))\n const paired = Array.from({ length: W + 1 }, () =>\n new Array<boolean>(C + 1).fill(false),\n )\n for (let i = W - 1; i >= 0; i--) {\n for (let j = C - 1; j >= 0; j--) {\n const together = Math.abs(walks[i]! - calls[j]!) + cost[i + 1]![j + 1]!\n const dropWalk = W - i > C - j ? cost[i + 1]![j]! : Infinity\n const dropCall = C - j > W - i ? cost[i]![j + 1]! : Infinity\n cost[i]![j] = Math.min(together, dropWalk, dropCall)\n paired[i]![j] = cost[i]![j] === together\n }\n }\n const out = new Array<number | undefined>(W).fill(undefined)\n for (let i = 0, j = 0; i < W && j < C;) {\n if (paired[i]![j]) {\n out[i++] = j++\n } else if (W - i > C - j) {\n i++\n } else {\n j++\n }\n }\n return out\n}\n\nfunction byLength<T>(items: T[], bp: (item: T) => number) {\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => bp(a.item) - bp(b.item))\n}\n\nconst backed = (call: RepeatCall) => call.spanningReads !== 0\n\nfunction scored(row: { bp: number; complete: boolean }, call: RepeatCall) {\n return {\n ...call,\n agrees: row.complete && backed(call) ? agrees(row.bp, call.bp) : undefined,\n }\n}\n\n// A phased genotype names its walk's haplotype outright. The rest go by\n// length: the walks that span the array against the alleles reads spanned,\n// then everything else against what those two left. That decides the\n// ambiguous cases on merit: which walk carries the one allele a lone spanning\n// read supports, and which allele a walk that stops inside the array is drawn\n// against.\nfunction pairSample<\n R extends { bp: number; complete: boolean; haplotype?: number },\n>(rows: R[], calls: RepeatCall[]) {\n const out = new Map<number, WalkCall>()\n const taken = new Set<RepeatCall>()\n rows.forEach((row, i) => {\n const call = calls.find(\n c => c.haplotype !== undefined && c.haplotype === row.haplotype,\n )\n if (call) {\n taken.add(call)\n out.set(i, scored(row, call))\n }\n })\n const unphased = calls.filter(call => call.haplotype === undefined)\n const ranked = byLength(rows, r => r.bp)\n const stages = [\n [ranked.filter(r => r.item.complete), unphased.filter(backed)],\n [ranked, unphased],\n ] as const\n for (const [pool, group] of stages) {\n const free = pool.filter(r => !out.has(r.i))\n const open = byLength(\n group.filter(call => !taken.has(call)),\n call => call.bp,\n )\n nearest(\n free.map(r => r.item.bp),\n open.map(c => c.item.bp),\n ).forEach((pick, k) => {\n if (pick !== undefined) {\n const row = free[k]!\n const call = open[pick]!.item\n taken.add(call)\n out.set(row.i, scored(row.item, call))\n }\n })\n }\n return out\n}\n\nexport function withCalls<\n R extends {\n sample: string\n bp: number\n complete: boolean\n haplotype?: number\n },\n>(rows: R[], calls: Record<string, RepeatCall[]> | undefined) {\n if (!calls) {\n return rows as (R & { call?: WalkCall })[]\n }\n const paired = new Map<R, WalkCall>()\n const bySample = new Map<string, R[]>()\n for (const row of rows) {\n bySample.set(row.sample, [...(bySample.get(row.sample) ?? []), row])\n }\n for (const [sample, group] of bySample) {\n const called = calls[sample]\n if (called) {\n for (const [i, call] of pairSample(group, called)) {\n paired.set(group[i]!, call)\n }\n }\n }\n return rows.map(row => ({ ...row, call: paired.get(row) }))\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6\"\n}), 'Settings');"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_SvgIcon", "__commonJSMin", "exports", "module", "require_mobx", "__commonJSMin", "exports", "module", "import_SvgIcon", "packAbgr", "r", "g", "b", "a", "abgrRed", "c", "abgrGreen", "abgrBlue", "abgrAlpha", "abgrToCssRgba", "normalizedRgbToCssRgba", "alpha", "fadeAbgr", "brightenAbgr", "factor", "cache", "baseEdgeCurves", "nodePositions", "graph", "axis", "deletions", "version", "routes", "stranded", "scaleX", "scaleY", "cached", "curves", "ei", "edge", "from", "to", "bypassed", "route", "routedEdgeCurves", "strandSides", "computeEdgeCurves", "edgeJoinOf", "bypassedPoints", "MAX_BACKBONE_HOPS", "buildNeighbors", "graph", "neighbors", "add", "from", "to", "list", "edge", "flankingSpan", "nodeId", "nodeById", "seen", "frontier", "minEnd", "maxStart", "hop", "next", "id", "adjacent", "neighborId", "neighbor", "isBackbone", "nodeReferenceSpan", "node", "referenceMidpoints", "midpoints", "span", "EDGE_DEFAULT_COLOR", "packAbgr", "EDGE_PATH_FALLBACK_COLOR", "EDGE_DELETION_COLOR", "DELETION_THICKNESS_FACTOR", "LIFT_BACKDROP_COLOR", "FADED_ALPHA", "LIFT_BACKDROP_CSS", "abgrToCssRgba", "fadeAbgr", "DELETION_DASH_PX", "MIN_PATH_STRIPE_PX", "MIN_WALK_LANE_PX", "MIN_SCALE_FOR_OFFSET", "ARROW_LENGTH_BASE_PX", "ARROW_LENGTH_PER_EDGE_PX", "ARROW_HALF_WIDTH_BASE_PX", "ARROW_HALF_WIDTH_PER_EDGE_PX", "MIN_LINK_HEADS", "MIN_ARROW_FIT", "MIN_ARROW_SCALE", "ARROW_CURVE_STEPS", "ABUTTING_PX", "walkX", "walkY", "walkPx", "backFromEnd", "curves", "scale", "yToX", "untilPx", "most", "last", "n", "px", "ci", "k", "t", "u", "a", "b", "d", "e", "y", "walkPointAt", "i", "from", "to", "f", "arrowheadFor", "edgeHalfWidth", "nodeHalfWidth", "color", "fromSegments", "toSegments", "length", "lengthPx", "abutting", "inset", "fit", "polylinePx", "tip", "base", "dx", "dy", "endTangent", "intoDirection", "segments", "leavesStart", "edge", "first", "stranded", "strandSides", "gap", "p", "final", "pointNormalsOf", "rawPoints", "points", "pointNormals", "nx", "ny", "len", "dx1", "dy1", "len1", "dx2", "dy2", "len2", "nx1", "ny1", "nx2", "ny2", "dot", "offsetPolyline", "normals", "distance", "packNorm", "r", "g", "hslToRgb", "h", "s", "l", "c", "x", "m", "DEPTH_GRADIENT", "STABLE_RANK_GRADIENT", "NODE_LENGTH_GRADIENT", "sampleGradient", "stops", "pos", "hashColor", "str", "alpha", "nameHue", "PATH_SATURATION", "PATH_LIGHTNESS", "REFERENCE_RAMP_MAX_HUE", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "REFERENCE_RAMP_ALT_RGB", "REFERENCE_RAMP_ALT_COLOR", "REFERENCE_RAMP_ALT_CSS", "computeReferenceRamp", "graph", "domain", "midpoints", "referenceMidpoints", "min", "max", "mid", "computeColorSchemeRange", "minDepth", "maxDepth", "minLength", "maxLength", "maxRank", "getNodeColor", "node", "nodeIndex", "colorScheme", "range", "ramp", "frac", "hue", "into", "candidates", "isPolylineInBounds", "bounds", "hit", "isBezierInBounds", "cMinX", "cMaxX", "cMinY", "cMaxY", "paletteCache", "pathPaletteOf", "palette", "pathColorByIndex", "pathIndexByName", "paths", "pathHueAt", "slotsCache", "NO_SLOTS", "pathSlotsOf", "slots", "pathIdx", "path", "nodeId", "visits", "buildGeometry", "options", "nodePositions", "nodeById", "contigThickness", "connectorThickness", "drawPaths", "nodeWidth", "highlight", "axis", "linearLayout", "viewportBounds", "referenceRamp", "deletions", "deletionRoutes", "hiddenEdges", "version", "depthNorm", "meanDepth", "yToXOf", "sharedCurves", "baseEdgeCurves", "nodeStrokes", "nodeStrokeRuns", "arrows", "arrowRuns", "edgeCurves", "edgeCurveRuns", "colorRange", "nodeIndexMap", "pathCount", "pathColorByName", "name", "nodePathSlots", "showArrows", "ei", "baseCurves", "numPaths", "isDeletion", "onWalk", "edgeThickness", "ribbons", "plainEdgeColor", "edgeColor", "toNode", "intoHalfWidth", "nodeWidthPx", "buildSingleEdge", "offsetX", "offsetY", "arrowColor", "translateCurves", "dash", "dashCurves", "head", "edgeCurveStart", "arrowStart", "laneWalks", "fromNode", "width", "laneWidth", "worldPerScreenPx", "walk", "lane", "offset", "offsets", "pathRibbonOffsets", "arrowRibbon", "ribbonColor", "edgeCurveCount", "arrowCount", "faded", "own", "nodeThickness", "start", "slotWidth", "drawable", "lanes", "laneColor", "slot", "stripe", "count", "rampHueCss", "hue", "rampHue", "bp", "domain", "frac", "REFERENCE_RAMP_MAX_HUE", "HUE_STOP_DEG", "rampStops", "start", "reversed", "low", "high", "n", "_", "i", "RAMP_GRADIENT_STOPS", "RAMP_GRADIENT_CSS", "s", "el", "tag", "attrs", "children", "c", "escapeText", "s", "escapeAttr", "serializeEl", "node", "v", "k", "EXON_COLOR", "EXON_GAP_PX", "EXON_LINE_PX", "MIN_LANE_PX", "exonStretches", "pins", "halfWidthPx", "lift", "pathOf", "d", "inkPx", "nodeId", "own", "pin", "exonOutlineTree", "stretches", "o", "stroke", "color", "width", "el", "FALLBACK_CELL_SIZE", "meanExtentCellSize", "extentTotal", "count", "rowPitchOf", "boxes", "distinct", "min", "max", "box", "cellSizeFrom", "extentX", "extentY", "x", "resolveCellSize", "given", "getOrCreateCell", "cells", "cx", "cy", "row", "cell", "addToGrid", "cellSize", "minX", "minY", "maxX", "maxY", "entry", "cx0", "cx1", "cy0", "cy1", "queryGrid", "y", "radiusX", "radiusY", "results", "seen", "SpatialIndex", "nodePositions", "nodeId", "segments", "seg", "next", "b", "EdgeSpatialIndex", "graph", "drawPaths", "axis", "deletions", "version", "routes", "stranded", "baseEdgeCurves", "ei", "edge", "fromSegments", "toSegments", "curves", "curveBounds", "numPaths", "padX", "padY", "o", "pathRibbonOffsets", "distanceToSegment", "px", "py", "x1", "y1", "x2", "y2", "dx", "dy", "lenSq", "t", "distanceToCubicBezier", "cx1", "cy1", "cx2", "cy2", "minDist", "samples", "lastX", "lastY", "i", "u", "bx", "by", "distanceToBezierCurve", "c", "distanceToEdgeCurves", "curves", "yToX", "d", "nodeCache", "getSpatialIndex", "nodePositions", "version", "cached", "index", "SpatialIndex", "edgeCache", "getEdgeSpatialIndex", "graph", "drawPaths", "axis", "deletions", "routes", "stranded", "EdgeSpatialIndex", "MIN_NODE_REACH_PX", "findHoveredNode", "graphX", "graphY", "ink", "yToXOf", "reach", "queryReach", "candidates", "hovered", "best", "nodeId", "segmentIdx", "segments", "dist", "segmentMeetsBox", "a", "b", "box", "t0", "t1", "p", "q", "nodesUnderBox", "screen", "hits", "line", "findHoveredEdge", "hiddenEdges", "deletionRoutes", "edgeThreshold", "edgeIndex", "edgeIdx", "edge", "fromSegments", "toSegments", "numPaths", "baseCurves", "offset", "pathRibbonOffsets", "translateCurves", "HALO_FACTOR", "LEGEND_INSET_PX", "ROUTE_STACK", "GENE_PIN_DROP_PX", "GENE_STACK", "TOPMOST_BASELINE", "LABEL_PX", "LABEL_PAD", "geneCoverageNote", "pin", "length", "per", "unit", "amount", "bp", "geneLabelCandidates", "pins", "screen", "contigThickness", "nodesUnder", "ink", "byExtent", "x", "y", "note", "box", "id", "items", "extent", "a", "b", "layoutLabels", "m", "width", "height", "translateX", "translateY", "scaleX", "scaleY", "frame", "p", "reserved", "label", "rowLabelBox", "stripPx", "LABEL_CHAR_PX", "take", "occupancy", "onRows", "rowsTop", "r", "halo", "byBubble", "h", "bubbles", "placeLabels", "baseline", "genes", "nodesUnderBox", "sizeCandidates", "sizeLabelCandidates", "deletionLabels", "placeSizeLabels", "routes", "route", "nodeLabels", "nodeLabelBudget", "nodeOwnLocation", "node", "isAnchored", "anchoredNodeLocation", "panSNSample", "panSNHaplotype", "panSNContig", "widestCluster", "spans", "maxGap", "sorted", "a", "b", "best", "current", "span", "groupKey", "loc", "contributingAssemblies", "graph", "groups", "key", "group", "bySample", "candidate", "existing", "resolveLocationAssembly", "resolve", "resolveContributors", "contributors", "c", "sample", "locString", "locLabel", "import_jsx_runtime", "CompareArrows_default", "_jsx", "import_jsx_runtime", "HighlightAlt_default", "_jsx", "import_jsx_runtime", "LineStyle_default", "_jsx", "LINEAR_LABEL", "SYNTENY_LABEL", "NO_SYNTENY_TRACK", "oneOrMany", "label", "icon", "entries", "entryLabel", "onSelect", "disabledHelpText", "nameTheOnlyEntry", "first", "empty", "entry", "graphLaunchMenuItems", "contributors", "syntenyTracks", "onShowLinear", "onShowSynteny", "widest", "LineStyle_default", "c", "locLabel", "CompareArrows_default", "track", "nodeLaunchMenuItems", "own", "reference", "highlight", "onHighlight", "HighlightAlt_default", "target", "canonicalStrand", "node", "stepName", "strand", "stepStarts", "lengths", "total", "starts", "head", "i", "tail", "j", "mismatchesByStep", "record", "byStep", "stepAt", "pos2", "atEnd", "s", "start", "length", "add", "mismatch", "list", "last", "pos", "op", "parseCs", "at", "left", "take", "tubeMapReads", "graph", "records", "firstId", "nodeByName", "n", "reads", "nodes", "step", "kept", "first", "mismatches", "names", "lastLength", "k", "FORWARD_READ_COLORS", "REVERSE_READ_COLORS", "readColor", "read", "colors", "emptyTrackShapes", "DEBUG", "DEFAULT_TRACK_COLORS", "configFrom", "options", "track", "config", "bed", "nodes", "tracks", "reads", "nodeMap", "nodesPerOrder", "nodeOrders", "assignments", "extraLeft", "extraRight", "maxOrder", "shapes", "emptyTrackShapes", "imageBounds", "trackForRuler", "coarsenedEdgeMeta", "layoutTubeMap", "inputNodes", "inputTracks", "inputReads", "copies", "deepCopy", "node", "i", "hadInputReads", "filterReads", "t", "straightenTrack", "generateNodeMap", "generateTrackIndexSequences", "generateNodeWidth", "generateNodeSuccessors", "generateNodeOrder", "reverseReversedReads", "mergeNodes", "generateNodeDegree", "getMaxOrder", "switchNodeOrientation", "coarsenHaplotypes", "rulerIndex", "refIndex", "altHaplotypes", "_", "bands", "buildCoarsenedSyntheticBands", "calculateTrackWidth", "generateLaneAssignment", "addTrackFeatures", "drawCoarsenedReads", "generateReadOnlyNodeAttributes", "placeReads", "generateNodeXCoords", "generateSVGShapesFromPath", "getImageDimensions", "generateTrackColor", "highlight", "generateTrackAlpha", "val", "isReverse", "nodeName", "s", "forward", "reverse", "flip", "isForwardIndex", "n", "index", "nodesToInvert", "currentSequence", "cur", "firstForwardIndex", "j", "orderY", "setMapToMax", "step", "map", "key", "value", "existing", "READ_WIDTH", "assignReadsToNodes", "read", "idx", "firstNode", "element", "pathIdx", "elemNode", "generateBasicPathsForReads", "sortedNodes", "compareNodesByOrder", "readsBySource", "source", "bucket", "allSources", "b", "topMargin", "placeReadSet", "bottomY", "calculateBottomY", "elementsWithoutNode", "len", "prevSegment", "lastValidPrev", "seg", "nextSegment", "firstValidNext", "previousVisitToNode", "nextVisitToNode", "betweenCycleReverseTraversal", "compareNoNodeReads", "segment", "readIDs", "toPlace", "incomingReads", "readID", "outgoingReads", "internalReads", "startY", "incomingKeys", "entry", "path", "decisionStep", "foundY", "k", "y", "compareIncomingReadKeys", "currentY", "occupiedUntil", "readElement", "setOccupiedUntil", "maxY", "compareReadOutgoingSegmentsByGoingTo", "occupiedFrom", "firstNodeOffset", "occUntil", "incReadElementIndices", "incRead", "incReadPathElement", "compareInternalReads", "readIdx", "currentRead", "finalNodeCoverLength", "heightIncrease", "adjustVertically3", "a", "pathIndex", "readA", "readB", "segmentA", "segmentB", "prevNodeA", "prevNodeB", "aPrev", "bPrev", "readIndexA", "pathIndexA", "readIndexB", "pathIndexB", "previousValidYA", "previousValidYB", "lastPathIndexA", "lastPathIndexB", "initialNodeA", "initialNodeB", "nodeA", "nodeB", "nextNodeIdx", "beginDiff", "compareTrackByInitialOrdering", "trackA", "trackB", "pathA", "pathB", "AIndex", "BIndex", "trackAOrder", "trackBOrder", "idxA", "idxB", "aFirst", "bFirst", "aLast", "bLast", "currentNodeIndex", "currentNodeIsForward", "currentNode", "previousNode", "previousNodeIsForward", "pos", "sequenceNew", "reverseMismatches", "nodeByName", "temp", "firstLen", "lastLen", "mismatches", "sequenceLength", "mm", "getReverseComplement", "COMPLEMENT", "result", "tracksOrReads", "rawNodeName", "fwdIdx", "switched", "nodeIndex", "NODE_HORIZONTAL_SLACK", "bounds", "successorSets", "predecessorSets", "addEdges", "current", "follower", "generateNodeOrderOfSingleTrack", "sequence", "forwardOrder", "backwardOrder", "minOrder", "order", "increaseOrderForAllNodes", "generateNodeOrderTrackBeginning", "anchorIndex", "anchorSeqVal", "currentOrder", "increment", "UNREACHABLE_ORDER", "fillUnassignedOrders", "orders", "filled", "modifiedSequence", "rightIndex", "leftIndex", "tracksAndReads", "reachability", "uninvert", "increaseOrderForSuccessors", "isSuccessor", "finalOrders", "first", "second", "scratch", "stamp", "generation", "stack", "childIndex", "max", "v", "amount", "startingNode", "tabuNode", "newOrder", "increasedOrders", "queue", "head", "currentNodeOrder", "successor", "predecessor", "pivotPath", "countPaths", "switchNodeOrientationForPaths", "paths", "toSwitch", "pivotNames", "prevOrder", "nextOrder", "addToSwitchScore", "score", "scores", "delta", "currentX", "nextX", "extra", "calculateExtraSpace", "leftSideEdges", "rightSideEdges", "fallAngleAdjustment", "prevSeg", "yDifference", "segmentNumber", "prevSegmentPerOrderPerTrack", "assignmentByOrderAndNode", "trackNo", "addToAssignment", "generateSingleLaneAssignment", "segmentID", "assignment", "getIdealLanesAndCoords", "currentLane", "potentialAdjustmentValues", "prevNameIsNull", "prevTrack", "compareByIdealLane", "adjustVertically", "verticalAdjustment", "minAdjustmentCost", "moveBy", "getVerticalAdjustmentCost", "adjustBy", "assignmentNode", "aNode", "nodeStart", "nodeEnd", "feature", "line", "allAreFour", "NARROW_WIDTH", "WIDE_WIDTH", "getReadXStart", "offset", "clampedXCoordinateOfBaseWithinNode", "getReadXEnd", "cover", "getXCoordinateOfBaseWithinNode", "base", "nodeLeftX", "nodeRightX", "nodePixelCoordinatesInX", "clamped", "xStart", "xEnd", "yStart", "yEnd", "trackColor", "trackAlpha", "dummy", "reversalFlag", "orderStartX", "orderEndX", "colorHighlight", "colorForCurrentHighlight", "createFeatureRectangle", "generateTurnaround", "COARSENED_ID_BASE", "buildCoarsenedSyntheticBands", "source", "unit", "coarsenedEdgeMeta", "edges", "ignoreStrand", "config", "item", "seq", "i", "sSigned", "dSigned", "sIdx", "dIdx", "srcNode", "nodes", "dstNode", "key", "a", "b", "existing", "maxEdgeCount", "e", "BAND_MIN_WIDTH", "READ_WIDTH", "BAND_MAX_WIDTH", "widthForCount", "c", "synthetic", "edge", "id", "COARSENED_ID_BASE", "label", "srcLen", "tallestName", "tallestH", "n", "h", "DEBUG", "createFeatureRectangle", "node", "nodeXStart", "nodeXEnd", "highlight", "track", "rectXStart", "yStart", "trackColor", "reversalFlag", "currentHighlight", "co", "featureXStart", "featureXEnd", "nodeWidth", "feature", "generateTrackColor", "shapes", "MIN_BEND_WIDTH", "generateTurnaround", "dir", "x", "yEnd", "trackWidth", "trackID", "order", "type", "trackName", "extra", "extraRight", "extraLeft", "offset", "apex", "radius", "stem", "yTop", "yBottom", "stubNear", "stubFar", "horizontal", "segTop", "inner", "outer", "d", "nodePixelCoordinatesInX", "nodeLeftX", "nodeRightX", "generateNodeWidth", "charWidth", "len", "mergeNodes", "nodeName", "nodeName2", "predSets", "succSets", "tracksAndReads", "reads", "tracks", "isReverse", "forward", "nodeMap", "reverse", "pred", "s", "succ", "sortedNodes", "compareNodesByOrder", "mergeOffset", "mergeOrigin", "offsetOf", "originOf", "origin", "predecessor", "mergeableWithPred", "nodeByName", "read", "sequenceNew", "mergeableWithSucc", "predLength", "mismatch", "firstEntry", "firstOffset", "donor", "nodeIndex", "index", "predecessorIndex", "successor", "successorIndex", "filterReads", "readList", "focusNames", "groupBy", "items", "key", "groups", "item", "k", "group", "compareCurvesByXYStartValue", "a", "b", "curvePaths", "curves", "type", "groupedCurves", "curve", "curveGroup", "adjustValue", "adjustIncrement", "xAdjusted", "xNextAdjusted", "d", "groupKeys", "aParts", "bParts", "a0", "a1", "b0", "b1", "flattenedGroups", "nodeOutlinePath", "node", "x", "y", "visitStrands", "graph", "strands", "segment", "visits", "visit", "key", "list", "tubeMapTracks", "nodeById", "n", "paths", "path", "index", "reference", "p", "pathOrigin", "visitName", "seen", "sequence", "id", "node", "k", "strand", "canonicalStrand", "stepName", "tubeMapNodes", "hasTubeMapPaths", "STACK_PX", "MIN_TUBE_PX", "MAX_TUBE_PX", "tubeWidth", "trackCount", "runTubeMap", "tracks", "reads", "tubeMapReads", "tubeColor", "pathGreyCssColor", "pathCssColor", "pathColors", "_", "i", "layout", "layoutTubeMap", "track", "readColor", "drawnNodes", "nodes", "centreline", "yOffset", "x0", "x1", "y", "extentOf", "tubeMapLayout", "run", "nodePositions", "minY", "maxY", "tubeMapColumns", "byOrder", "columns", "end", "order", "a", "b", "bp0", "bp1", "graphNode", "isBackbone", "first", "c", "column", "pathsReachBackbone", "tubeMapReferenceLayout", "parsePanSN", "refName", "parts", "haplotype", "collectRun", "seed", "byId", "adj", "claimed", "members", "anchors", "queue", "id", "node", "neighborId", "neighbor", "REFERENCE_RANK", "anchorSpan", "a", "sorted", "b", "first", "last", "start", "end", "runDistances", "entry", "m", "dist", "member", "reach", "known", "runOffsets", "ordered", "rank", "i", "offsets", "offset", "projectAlleles", "graph", "isAnchored", "n", "buildNeighbors", "alleles", "span", "max", "MIN_DELETION_BP", "MIN_ALLELE_SPAN_FRACTION", "placeOffReference", "graph", "span", "rowY", "positions", "minSpan", "alleles", "projectAlleles", "byId", "n", "alleleDeletions", "allele", "skipped", "drawn", "scale", "nodeId", "i", "node", "offset", "even", "at", "bp", "y", "neighbors", "buildNeighbors", "queue", "fromId", "fromEnd", "nextId", "next", "contributingSamples", "graph", "keep", "carried", "node", "isOffReference", "sample", "parsePanSN", "held", "row", "a", "b", "sampleRowLayout", "region", "backbone", "backboneNodes", "samples", "span", "referenceSpan", "rowOf", "s", "i", "nodePositions", "backbonePositions", "spareRow", "alleleDeletions", "placeOffReference", "stable", "ROW_HEIGHT_PX", "rowLabels", "rankRows", "graph", "present", "node", "a", "b", "r", "i", "anchoredLayout", "region", "backbone", "backboneNodes", "span", "referenceSpan", "rows", "nodePositions", "backbonePositions", "alleleDeletions", "placeOffReference", "ROW_HEIGHT_PX", "rowLabels", "rank", "row", "GUTTER", "LANE_PX", "ROW_HEIGHT_PX", "nodeWidth", "node", "compare", "a", "b", "compareKeys", "UNREACHED", "referenceOrder", "graph", "byId", "n", "key", "orderKeys", "placeByWalks", "backbone", "isNode", "startOf", "next", "prev", "i", "head", "insertAfter", "at", "id", "after", "insertBefore", "before", "path", "rising", "falling", "last", "start", "ids", "from", "leading", "lead", "placed", "placeBySearch", "adjacent", "queue", "ka", "kb", "nb", "searched", "sided", "seed", "run", "farHalf", "hops", "deadEnd", "touchesLeft", "other", "k", "e", "isBackbone", "rank", "layerGraph", "order", "isRef", "preds", "succs", "link", "layerOf", "l", "s", "minSucc", "t", "lo", "hi", "layers", "orderedLayout", "layer", "layerWidth", "w", "layerX", "x", "y", "free", "p", "ideal", "taken", "lane", "d", "nodePositions", "cx", "ny", "sampleOf", "path", "panSNSample", "labelOf", "stepsOf", "pieces", "lengthOf", "steps", "end", "piece", "bp", "sum", "id", "stepSpans", "spans", "pos", "len", "sliceBetween", "span", "region", "flanked", "i0", "i1", "bestEnd", "bestStart", "i", "s", "ids", "filterSamples", "rows", "samples", "r", "a", "b", "walkRows", "graph", "unit", "paths", "isReference", "p", "pathOrigin", "referencePieces", "first", "others", "walks", "n", "referenceStart", "cut", "rowOf", "ordered", "complete", "from", "to", "contig", "panSNContig", "axis", "runs", "offReferenceBp", "gapBp", "step", "last", "at", "forward", "backward", "READOUT_ROOM", "walkRowsExtent", "walks", "longest", "row", "ROW_HEIGHT_PX", "walkRowLayout", "graph", "region", "backbone", "backboneNodes", "walkRows", "overWindow", "n", "overlapsWindow", "nodePositions", "backbonePositions", "rowLabels", "i", "FORCE_LAYOUT_LABEL", "hasBackbone", "graph", "isBackbone", "hasWalks", "hasTubeMapBackbone", "hasTubeMapPaths", "hasAlleles", "isOffReference", "LAYOUT_MODES", "anchoredLayout", "sampleRowLayout", "walkRowLayout", "orderedLayout", "tubeMapLayout", "tubeMapReferenceLayout", "LAYOUT_MODE_VALUES", "m", "modeUsesLayoutEngine", "value", "layoutModeByValue", "WALK_FIELDS", "WALK_SCHEMES", "FAMILIES", "isField", "v", "f", "isScheme", "s", "resolveEncoding", "layer", "reference", "picked", "alone", "askedField", "askedScheme", "field", "family", "scheme", "BASE_T", "toLinear", "c", "toGamma", "oklab", "hex", "r", "g", "b", "l", "m", "oklabToRgb", "L", "a", "schemeRgb", "x", "hslToRgb", "REFERENCE_RAMP_MAX_HUE", "from", "to", "schemeCss", "schemeColor", "packAbgr", "encodedColor", "t", "NO_VALUE_COLOR", "REFERENCE_RAMP_ALT_COLOR", "encodingStops", "_", "i", "encodingSwatchCss", "encoding", "stops", "FACET_GAP_PX", "FACET_TITLE_PX", "FACET_PAD_PX", "MIN_FACET_PANEL_PX", "facetGrid", "count", "bounds", "pixelRows", "width", "room", "columns", "tile", "across", "rows", "panelWidth", "panelRoom", "fitX", "fitY", "scale", "drawn", "height", "best", "grid", "facetSettingOf", "facet", "raw", "domainFirst", "names", "domain", "rank", "name", "i", "listed", "a", "b", "facetCells", "by", "wrapOrder", "wrap", "places", "sample", "haplotype", "contig", "n", "p", "cells", "REPEAT_GROWTH", "coveringRepeat", "b", "repeats", "span", "growth", "r", "SUPERBUBBLE_SEGMENTS", "formatBp", "bp", "formatBpRange", "shortest", "longest", "low", "high", "unit", "routes", "count", "SATURATED_PATH_COUNT", "classifyBubble", "c", "classifyShape", "refSpan", "pathCount", "segmentCount", "inversion", "range", "repeat", "name", "alleles", "BUBBLE_KIND_COLORS", "BUBBLE_KIND_NAMES", "bubbleSegmentIds", "ON_REFERENCE", "OFF_REFERENCE", "OUTSIDE_CUT", "GENE_INK", "BAR_PX", "GAP_PX", "MIN_TILE_PX", "kb", "bp", "units", "unit", "walkRowReadout", "row", "reference", "call", "gapBp", "complete", "delta", "against", "outside", "called", "readoutPlacement", "text", "endX", "width", "x", "LABEL_CHAR_PX", "unitTicks", "pxPerBp", "ticks", "k", "runPaint", "run", "ramp", "REFERENCE_RAMP_ALT_CSS", "stops", "rampStops", "rampHueCss", "alongRow", "axis", "start", "end", "rowSpan", "placeRowGenes", "rows", "byRow", "placed", "row", "genes", "axis", "clip", "start", "end", "g", "alongRow", "e", "a", "b", "GENE_FONT_PX", "GENE_CHAR_PX", "MIN_LETTERED_BAR_PX", "genePad", "rowPx", "barPx", "boxesGenes", "rowGeneBoxes", "X", "y", "ROW_HEIGHT_PX", "BAR_PX", "pad", "boxes", "x", "taken", "named", "w", "half", "at", "box", "rowsText", "n", "walkRowsKey", "bars", "o", "entries", "RAMP_GRADIENT_CSS", "ON_REFERENCE", "REFERENCE_RAMP_ALT_CSS", "OFF_REFERENCE", "OUTSIDE_CUT", "CALL_TICK", "UNBACKED_TICK", "DISAGREES", "walkRowsKeyTree", "idPrefix", "parts", "rampId", "ramp", "el", "RAMP_GRADIENT_STOPS", "s", "swatch", "GENE_INK", "GAP_PX", "text", "LABEL_CHAR_PX", "p", "coalesceRuns", "runs", "pxPerBp", "minBp", "out", "bucket", "flush", "on", "off", "r", "onReference", "lead", "held", "run", "geneTree", "walkRowsTree", "frame", "bp", "Y", "origin", "unit", "reference", "along", "offset", "prefix", "rowTree", "i", "paint", "runPaint", "h", "id", "rect", "color", "k", "ticks", "unitTicks", "call", "walkRowReadout", "readoutPlacement", "readouts", "PAD_PX", "WALK_STRIP_CEILING_PX", "LABEL_FONT_PX", "MIN_ROW_PX", "LABELLED_ROW_PX", "READOUT_ROOM", "MARK_INK", "TICK_PX", "stripMarks", "graph", "rows", "node", "visits", "marks", "row", "axis", "path", "pathOrigin", "v", "start", "end", "alongRow", "spanCache", "spansOf", "name", "byName", "lengthOf", "n", "pieces", "p", "spans", "piece", "a", "b", "pos", "id", "len", "segmentAt", "offset", "pxPerBp", "at", "tol", "bar", "from", "to", "lo", "hi", "mid", "best", "bestLen", "bestHolds", "i", "holds", "walkStripFrame", "bars", "o", "maxHeight", "labelPx", "r", "LABEL_CHAR_PX", "count", "rowPx", "ROW_HEIGHT_PX", "labelled", "readouts", "barPx", "longest", "left", "scaleX", "boxesGenes", "stripRowAt", "frame", "x", "y", "walkMarksTree", "index", "X", "el", "m", "w", "tick", "top", "walkStripLabelsTree", "bold", "stripGeneGaps", "rowGenes", "gaps", "MAX_DPR", "MAX_CANVAS_DIM_PX", "getDpr", "warnedCanvasClamp", "backingPx", "cssSize", "dpr", "axis", "value", "syncCanvasSize", "canvas", "width", "height", "pw", "ph", "cssWidth", "cssHeight", "Canvas2DRenderer", "canvas", "ctx", "_handler", "width", "height", "syncCanvasSize", "batch", "factors", "edgeIndex", "factor", "transform", "clearColor", "normalizedRgbToCssRgba", "hl", "color", "items", "groupByPaint", "e", "inRun", "brightenAbgr", "abgrToCssRgba", "first", "c", "lifted", "nodeId", "run", "s", "p0", "i", "l", "p", "tip", "left", "notch", "right", "arrowheadOutline", "ARROW_NOTCH", "a", "ux", "uy", "tipX", "tipY", "length", "halfWidth", "backX", "backY", "notchBack", "paintOf", "groups", "deferred", "item", "weight", "last", "into", "key", "group", "rangeText", "contig", "start", "end", "e", "groupDigits", "formatBp", "walkKey", "walk", "reference", "field", "own", "scale", "spanned", "outside", "walkPosition", "nodeId", "length", "progress", "range", "referenceBoxes", "graph", "layout", "nodeById", "n", "byRefName", "node", "graphNode", "isBackbone", "refName", "start", "boxes", "a", "b", "tubeX", "bp", "isEnd", "lo", "hi", "mid", "bp1", "box", "span", "tubeSpan", "end", "rulerBoxes", "best", "TICK_PX", "LABEL_GAP_PX", "TARGET_TICK_PX", "MIN_BRACKET_PX", "rulerInk", "darkMode", "niceStep", "raw", "pow", "m", "placeLabels", "candidates", "placed", "text", "at", "scaleMarks", "x", "width", "measure", "first", "last", "from", "to", "bpSpan", "step", "ticks", "positions", "sx", "boxMarks", "shown", "s0", "s1", "label", "position", "spans", "lengths", "boundaries", "length", "formatBp", "ends", "rulerMarks", "referenceAxis", "drawTubeMapRuler", "ctx", "frame", "top", "marks", "ink", "y", "x0", "x1", "referenceNodes", "graph", "layout", "nodeById", "n", "out", "node", "graphNode", "isBackbone", "tubeMapConnectors", "nodes", "bpToScreen", "tubeToScreen", "width", "bottom0", "bottom1", "HIT_SLOP_PX", "connectorAt", "connectors", "zoneBottom", "sx", "sy", "t", "hit", "best", "c", "a", "b", "dist", "band", "ctx", "bottom", "sides", "drawTubeMapConnectors", "highlightNode", "darkMode", "ink", "lit", "readMismatches", "read", "layout", "marks", "entries", "entry", "i", "nodeIndex", "forward", "node", "pathIndex", "y", "base", "at", "pos", "getXCoordinateOfBaseWithinNode", "mm", "x0", "softClip", "x1", "tubeMapMismatches", "parsePath", "d", "tokens", "commands", "i", "num", "op", "extentOf", "x0", "x1", "c", "shapeOf", "color", "alpha", "track", "layerOf", "layout", "type", "shapes", "trackOf", "s", "rects", "r", "curves", "curvePaths", "corners", "tubeMapPicture", "nodes", "node", "nodeOutlinePath", "tubeMapMismatches", "m", "trace", "ctx", "x", "y", "cx", "cy", "fillByColor", "items", "visible", "colorOf", "addTo", "byColor", "item", "key", "list", "FULL_OUTLINE_PX", "MIN_OUTLINE_ALPHA", "outlineAlpha", "screenWidth", "NODE_TINT_ALPHA", "drawTubeMap", "picture", "frame", "width", "layer", "left", "top", "stroke", "fill", "lit", "tint", "drawMismatches", "MISMATCH_FONT_PX", "MIN_MISMATCH_FONT_PX", "mismatchesLegible", "yScale", "mismatchOnScreen", "marks", "darkMode", "fontPx", "tubeMapGenes", "byRefName", "genes", "out", "gene", "boxes", "first", "last", "start", "end", "tubeSpan", "e", "GENE_ROW_PX", "MAX_GENE_ROWS", "EXON_PX", "NAME_FONT", "NAME_GAP_PX", "tubeMapGeneRows", "edges", "g", "a", "b", "depth", "most", "step", "drawTubeMapGenes", "ctx", "frame", "bottom", "top", "x", "width", "darkMode", "rows", "rowEnds", "ink", "placed", "s0", "s1", "arrow", "label", "mid", "half", "left", "right", "row", "glyphY", "e0", "REFERENCE_STRIP_PX", "REFERENCE_STRIP_ZONE_PX", "OVERHANG_PX", "OVERHANG_CAP_PX", "MIN_STAGGER_PX", "referenceStripBlocks", "graph", "colorScheme", "referenceRamp", "walks", "range", "computeColorSchemeRange", "out", "node", "index", "isBackbone", "colors", "w", "lane", "LIFT_BACKDROP_CSS", "abgrToCssRgba", "getNodeColor", "b", "span", "frame", "bp0", "bp1", "a", "HIT_SLOP_PX", "stripOverhang", "blocks", "width", "lo", "hi", "below", "above", "block", "stripBlockAt", "sx", "sy", "hit", "best", "x0", "x1", "dist", "nodeAnchor", "segments", "toScreen", "p", "stripPixels", "dpr", "placed", "px0", "claimed", "tierEnds", "px1", "start", "tier", "_", "drawOverhang", "ctx", "edgeX", "inward", "ink", "capX", "tipX", "baseX", "rowEdge", "row", "rows", "drawReferenceStrip", "lit", "darkMode", "staggered", "color", "i", "y0", "overhang", "left", "boxesOf", "graph", "layout", "nodeById", "n", "boxes", "node", "index", "g", "isBackbone", "bp0", "a", "b", "boxAt", "bp", "visited", "lo", "hi", "mid", "box", "deviationMarks", "deviations", "marks", "track", "devs", "segment", "d", "bp1", "at", "deviationInk", "darkMode", "drawDeviationMarks", "ctx", "x", "y", "width", "m", "left", "right", "top", "agrees", "walkBp", "callBp", "nearest", "walks", "calls", "W", "C", "cost", "paired", "j", "together", "dropWalk", "dropCall", "out", "byLength", "items", "bp", "item", "i", "a", "b", "backed", "call", "scored", "row", "pairSample", "rows", "taken", "c", "unphased", "ranked", "r", "stages", "pool", "group", "free", "open", "pick", "k", "withCalls", "bySample", "sample", "called", "import_jsx_runtime", "Settings_default", "_jsx"]
|
|
7
|
+
}
|