jbrowse-plugin-graphgenomeviewer 8.7.0 → 8.7.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/dist/chunks/AddTrackWorkflow-FANMD3WB.js +2 -0
- package/dist/chunks/{AddTrackWorkflow-IOPTETLH.js.map → AddTrackWorkflow-FANMD3WB.js.map} +2 -2
- package/dist/chunks/{GbzBaseSyntenyAdapter-67NMRHWZ.js → GbzBaseSyntenyAdapter-SDYLJG5H.js} +2 -2
- package/dist/chunks/{GbzBaseSyntenyAdapter-67NMRHWZ.js.map → GbzBaseSyntenyAdapter-SDYLJG5H.js.map} +2 -2
- package/dist/chunks/{GraphGenomeView-RD2XGX6D.js → GraphGenomeView-HCN57HV4.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-R3XOY32L.js → GraphTrackSettingsDialog-ZNZWUEN3.js} +2 -2
- package/dist/chunks/{HighlightColorDialog-AKPIC56I.js → HighlightColorDialog-3H2H2LPS.js} +2 -2
- package/dist/chunks/{LinearGraphDisplay-RRAXTQFC.js → LinearGraphDisplay-W5IT3HYI.js} +2 -2
- package/dist/chunks/{MinigraphBubbleAdapter-2YTXBZYS.js → MinigraphBubbleAdapter-TTGZ45BF.js} +2 -2
- package/dist/chunks/{RgfaTabixAdapter-RCGS6YVM.js → RgfaTabixAdapter-A274AVUU.js} +2 -2
- package/dist/chunks/{WalkFormsAdapter-3M5A4JL3.js → WalkFormsAdapter-7RD7ZAHG.js} +2 -2
- package/dist/chunks/WalkTabixSyntenyAdapter-CLC2CJJT.js +2 -0
- package/dist/chunks/{WalkTabixSyntenyAdapter-576RE5OE.js.map → WalkTabixSyntenyAdapter-CLC2CJJT.js.map} +2 -2
- package/dist/chunks/{chunk-CL4PYWKC.js → chunk-2FG67WIZ.js} +1 -1
- package/dist/chunks/{chunk-CL4PYWKC.js.map → chunk-2FG67WIZ.js.map} +1 -1
- package/dist/chunks/chunk-46O3IEW3.js +2 -0
- package/dist/chunks/{chunk-OPWSPSAE.js.map → chunk-46O3IEW3.js.map} +4 -4
- package/dist/chunks/{chunk-ULPW4VGT.js → chunk-5QJ2ANXK.js} +2 -2
- package/dist/chunks/chunk-5TT5TG4Q.js +2 -0
- package/dist/chunks/chunk-5TT5TG4Q.js.map +7 -0
- package/dist/chunks/{chunk-X2QGBINE.js → chunk-64OSFJLE.js} +1 -1
- package/dist/chunks/{chunk-X2QGBINE.js.map → chunk-64OSFJLE.js.map} +1 -1
- package/dist/chunks/chunk-7BKSSU2R.js +4 -0
- package/dist/chunks/chunk-7BKSSU2R.js.map +7 -0
- package/dist/chunks/{chunk-SVDQVLEU.js → chunk-7HJWQFKE.js} +2 -2
- package/dist/chunks/{chunk-DIGIM3XY.js → chunk-DQC5K7EW.js} +2 -2
- package/dist/chunks/{chunk-W5HHWDGZ.js → chunk-G6NFDDMN.js} +1 -1
- package/dist/chunks/{chunk-W5HHWDGZ.js.map → chunk-G6NFDDMN.js.map} +1 -1
- package/dist/chunks/{chunk-4XY7HUQR.js → chunk-HC2YPYTO.js} +2 -2
- package/dist/chunks/{chunk-4XY7HUQR.js.map → chunk-HC2YPYTO.js.map} +1 -1
- package/dist/chunks/{chunk-HRTRECXN.js → chunk-HTH7NAV4.js} +2 -2
- package/dist/chunks/chunk-KACKTX2U.js +2 -0
- package/dist/chunks/{chunk-Y7MQVQAS.js → chunk-OS52UJIX.js} +2 -2
- package/dist/chunks/{chunk-Y7MQVQAS.js.map → chunk-OS52UJIX.js.map} +1 -1
- package/dist/chunks/{chunk-UC2NHZ7E.js → chunk-S7DQGZX2.js} +1 -1
- package/dist/chunks/{chunk-UC2NHZ7E.js.map → chunk-S7DQGZX2.js.map} +1 -1
- package/dist/chunks/{chunk-4DQWDJG7.js → chunk-T3FHGWNW.js} +2 -2
- package/dist/chunks/{chunk-4DQWDJG7.js.map → chunk-T3FHGWNW.js.map} +2 -2
- package/dist/chunks/chunk-T7LVVBTT.js +2 -0
- package/dist/chunks/chunk-T7LVVBTT.js.map +7 -0
- package/dist/chunks/{chunk-E23AOQPE.js → chunk-VPZZ6XMM.js} +2 -2
- package/dist/chunks/{chunk-E23AOQPE.js.map → chunk-VPZZ6XMM.js.map} +2 -2
- package/dist/chunks/{chunk-XLVKVQJB.js → chunk-VQVQXMNM.js} +2 -2
- package/dist/chunks/{chunk-XLVKVQJB.js.map → chunk-VQVQXMNM.js.map} +2 -2
- package/dist/chunks/chunk-W4Y2JUP7.js +3 -0
- package/dist/chunks/chunk-W4Y2JUP7.js.map +7 -0
- package/dist/chunks/{chunk-ELC7POI6.js → chunk-WJHTNDTQ.js} +2 -2
- package/dist/chunks/{chunk-ELC7POI6.js.map → chunk-WJHTNDTQ.js.map} +4 -4
- package/dist/chunks/{chunk-VNWCN47G.js → chunk-YNMEZ4EZ.js} +2 -2
- package/dist/chunks/{renderSvg-GF64RZ6B.js → renderSvg-PEQY7XLR.js} +2 -2
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +4 -4
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +2 -2
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +7 -5
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +2 -2
- package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +13 -6
- package/src/GraphTrack/GraphTrack.test.ts +68 -0
- package/src/GraphTrack/index.ts +8 -5
- package/src/RgfaTabixAdapter/index.ts +3 -2
- package/src/WalkTabixSyntenyAdapter/walkLanes.ts +1 -1
- package/src/graphTrackDefaults/graphTrackDefaults.test.ts +80 -3
- package/src/graphTrackDefaults/guessAdapter.ts +62 -0
- package/src/graphTrackDefaults/index.ts +16 -51
- package/src/panSNAliases/panSNAliases.test.ts +40 -6
- package/src/panSNAliases/trackAdapterConfig.ts +49 -10
- package/src/version.ts +1 -1
- package/dist/chunks/AddTrackWorkflow-IOPTETLH.js +0 -2
- package/dist/chunks/WalkTabixSyntenyAdapter-576RE5OE.js +0 -2
- package/dist/chunks/chunk-CGPYVMGQ.js +0 -2
- package/dist/chunks/chunk-CGPYVMGQ.js.map +0 -7
- package/dist/chunks/chunk-OPWSPSAE.js +0 -2
- package/dist/chunks/chunk-U6SNNNFV.js +0 -2
- package/dist/chunks/chunk-U6SNNNFV.js.map +0 -7
- package/dist/chunks/chunk-WE7XHNAH.js +0 -4
- package/dist/chunks/chunk-WE7XHNAH.js.map +0 -7
- package/dist/chunks/chunk-WO644UAC.js +0 -3
- package/dist/chunks/chunk-WO644UAC.js.map +0 -7
- package/dist/chunks/chunk-ZA5GPTUM.js +0 -2
- /package/dist/chunks/{GraphGenomeView-RD2XGX6D.js.map → GraphGenomeView-HCN57HV4.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-R3XOY32L.js.map → GraphTrackSettingsDialog-ZNZWUEN3.js.map} +0 -0
- /package/dist/chunks/{HighlightColorDialog-AKPIC56I.js.map → HighlightColorDialog-3H2H2LPS.js.map} +0 -0
- /package/dist/chunks/{LinearGraphDisplay-RRAXTQFC.js.map → LinearGraphDisplay-W5IT3HYI.js.map} +0 -0
- /package/dist/chunks/{MinigraphBubbleAdapter-2YTXBZYS.js.map → MinigraphBubbleAdapter-TTGZ45BF.js.map} +0 -0
- /package/dist/chunks/{RgfaTabixAdapter-RCGS6YVM.js.map → RgfaTabixAdapter-A274AVUU.js.map} +0 -0
- /package/dist/chunks/{WalkFormsAdapter-3M5A4JL3.js.map → WalkFormsAdapter-7RD7ZAHG.js.map} +0 -0
- /package/dist/chunks/{chunk-ULPW4VGT.js.map → chunk-5QJ2ANXK.js.map} +0 -0
- /package/dist/chunks/{chunk-SVDQVLEU.js.map → chunk-7HJWQFKE.js.map} +0 -0
- /package/dist/chunks/{chunk-DIGIM3XY.js.map → chunk-DQC5K7EW.js.map} +0 -0
- /package/dist/chunks/{chunk-HRTRECXN.js.map → chunk-HTH7NAV4.js.map} +0 -0
- /package/dist/chunks/{chunk-ZA5GPTUM.js.map → chunk-KACKTX2U.js.map} +0 -0
- /package/dist/chunks/{chunk-VNWCN47G.js.map → chunk-YNMEZ4EZ.js.map} +0 -0
- /package/dist/chunks/{renderSvg-GF64RZ6B.js.map → renderSvg-PEQY7XLR.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@12.
|
|
4
|
-
"sourcesContent": ["import {\n slideAt\n} from \"./chunk-JJV2GT2Z.js\";\n\n// src/renderer/walkLanes.ts\nvar THREAD_PX = 2;\nvar THREAD_GAP_PX = 1.5;\nvar SLOT_GAP_PX = 4;\nvar LANE_SMOOTHING_PX = 12;\nvar THREAD_REACH_PX = 64;\nvar THREAD_TAPER_PX = 24;\nvar MAX_BAND_PX = 48;\nvar PASSES_KEY = \"a thread per pass through a node\";\nvar threadsPasses = (walks) => walks.length > 1 && walks.some((w) => w.mostPasses > 1);\nvar threadsWidth = (threads) => threads * THREAD_PX + Math.max(0, threads - 1) * THREAD_GAP_PX;\nvar sum = (values) => values.reduce((a, b) => a + b, 0);\nfunction slotLayout(spans, mostPasses, laneWidth) {\n const widths = spans.map(\n (m, i) => mostPasses[i] > 1 ? threadsWidth(m) : laneWidth * Math.min(1, m)\n );\n let seen = 0;\n const gaps = spans.map((m) => {\n const share = Math.min(1, m);\n const gap = SLOT_GAP_PX * share * seen;\n seen = Math.max(seen, share);\n return gap;\n });\n return { widths, gaps, band: sum(widths) + sum(gaps) };\n}\nvar THREAD_PITCH_PX = THREAD_PX + THREAD_GAP_PX;\nfunction slotCentres(spans, mostPasses, held = spans) {\n const { widths, gaps, band } = slotLayout(spans, mostPasses, THREAD_PX);\n let at = -band / 2;\n return widths.map((width, i) => {\n at += gaps[i];\n const slack = mostPasses[i] > 1 ? Math.max(0, width - threadsWidth(held[i])) : 0;\n const centre = at + slack / 2 + THREAD_PX / 2;\n at += width;\n return centre;\n });\n}\nvar bandWidthPx = (mostPasses) => slotLayout(mostPasses, mostPasses, THREAD_PX).band;\nvar bandScale = (mostPasses) => Math.min(1, MAX_BAND_PX / (bandWidthPx(mostPasses) || 1));\nvar passesKey = (walks) => bandScale(walks.map((w) => w.mostPasses)) < 1 ? `${PASSES_KEY}, thinned to fit` : PASSES_KEY;\nfunction laneSlideAt(start, end, along) {\n const vector = ({ normal, offsetX: offsetX2 }) => ({\n dx: normal.nx * offsetX2,\n dy: normal.ny * offsetX2\n });\n const { dx, dy } = slideAt(vector(start), vector(end), along);\n const offsetX = Math.hypot(dx, dy);\n return offsetX > 0 ? { normal: { nx: dx / offsetX, ny: dy / offsetX }, offsetX } : { normal: { nx: 0, ny: 0 }, offsetX: 0 };\n}\nfunction pointIndex(run, p) {\n const i = run.stepOf[p];\n const k = p - run.starts[i];\n return run.forward[i] ? k : run.starts[i + 1] - run.starts[i] - 1 - k;\n}\nvar gapOf = (a, b) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\nfunction arcOf(run) {\n const s = new Float64Array(run.length);\n for (let i = 1; i < run.length; i++) {\n s[i] = s[i - 1] + gapOf(run[i - 1], run[i]);\n }\n return s;\n}\nfunction walkSteps(walkRoutes, nodePositions) {\n const seen = /* @__PURE__ */ new Set();\n return walkRoutes.map((routes) => {\n const visits = /* @__PURE__ */ new Map();\n return routes.map(\n (route) => route.map((id) => {\n const visit = visits.get(id) ?? 0;\n visits.set(id, visit + 1);\n const segments = nodePositions[id];\n const owned = !!segments?.length && !seen.has(id);\n if (owned) {\n seen.add(id);\n }\n return { id, visit, owned, segments };\n })\n );\n });\n}\nfunction laneRuns(steps, yToX, jump) {\n const runs = [];\n steps.forEach((pieces, walk) => {\n let total = 0;\n for (const piece of pieces) {\n for (const { segments } of piece) {\n total += segments?.length ?? 0;\n }\n }\n const xs = new Float64Array(total);\n const ys = new Float64Array(total);\n let at = 0;\n let from = 0;\n let run = fresh();\n function fresh() {\n return {\n walk,\n ids: [],\n visits: [],\n forward: [],\n owned: [],\n starts: [0]\n };\n }\n const breakRun = () => {\n if (run.ids.length) {\n const stepOf = new Int32Array(at - from);\n for (let i = 0; i < run.ids.length; i++) {\n stepOf.fill(i, run.starts[i], run.starts[i + 1]);\n }\n runs.push({\n ...run,\n xs: xs.subarray(from, at),\n ys: ys.subarray(from, at),\n stepOf\n });\n }\n run = fresh();\n from = at;\n };\n const gap = (x, y, p) => {\n const dx = p.x - x;\n const dy = p.y * yToX - y;\n return Math.sqrt(dx * dx + dy * dy);\n };\n for (const piece of pieces) {\n piece.forEach(({ id, visit, owned, segments }, k) => {\n if (!segments?.length) {\n breakRun();\n return;\n }\n const first = segments[0];\n const last = segments.at(-1);\n let forward;\n if (at > from) {\n const x = xs[at - 1];\n const y = ys[at - 1];\n const toFirst = gap(x, y, first);\n const toLast = gap(x, y, last);\n forward = toFirst <= toLast;\n if (Math.min(toFirst, toLast) > jump) {\n breakRun();\n }\n } else {\n const next = piece[k + 1]?.segments;\n const toNext = (p) => next?.length ? Math.min(\n gap(p.x, p.y * yToX, next[0]),\n gap(p.x, p.y * yToX, next.at(-1))\n ) : 0;\n forward = toNext(last) <= toNext(first);\n }\n run.ids.push(id);\n run.visits.push(visit);\n run.forward.push(forward);\n run.owned.push(owned);\n for (let j = 0; j < segments.length; j++) {\n const p = segments[forward ? j : segments.length - 1 - j];\n xs[at] = p.x;\n ys[at] = p.y * yToX;\n at++;\n }\n run.starts.push(at - from);\n });\n breakRun();\n }\n });\n return runs;\n}\nfunction ownedWindows(s, owned, margin) {\n const windows = [];\n for (let i = 0; i < owned.length; i++) {\n if (!owned[i]) {\n continue;\n }\n let j = i;\n while (j + 1 < owned.length && owned[j + 1]) {\n j++;\n }\n const last = windows.at(-1);\n const floor = last ? last[1] : 0;\n let lo = i;\n while (lo > floor && s[i] - s[lo - 1] <= margin) {\n lo--;\n }\n let hi = j;\n while (hi + 1 < s.length && s[hi + 1] - s[j] <= margin) {\n hi++;\n }\n if (last && lo <= last[1] + 1) {\n last[1] = hi;\n } else {\n windows.push([lo, hi]);\n }\n i = j;\n }\n return windows;\n}\nfunction smoothedNormals(run, reach) {\n const s = arcOf(run);\n const end = s.at(-1);\n const pointAt = (at, j) => {\n const a = run[j];\n const b = run[Math.min(j + 1, run.length - 1)];\n const span = s[Math.min(j + 1, run.length - 1)] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n return run.map((_, i) => {\n const back = Math.max(0, s[i] - reach / 2);\n const ahead = Math.min(end, s[i] + reach / 2);\n while (lo < run.length - 1 && s[lo + 1] <= back) {\n lo++;\n }\n while (hi < run.length - 1 && s[hi + 1] <= ahead) {\n hi++;\n }\n const a = pointAt(back, lo);\n const b = pointAt(ahead, hi);\n const len = gapOf(a, b);\n return len > 0 ? { nx: -(b.y - a.y) / len, ny: (b.x - a.x) / len } : void 0;\n });\n}\nfunction cutCurls(run, close, length) {\n const s = arcOf(run);\n const out = run.slice();\n const picks = [];\n s.forEach((at, k) => {\n const last = picks.at(-1);\n if (last === void 0 || at - s[last] >= close / 4) {\n picks.push(k);\n }\n });\n if (picks.at(-1) !== run.length - 1) {\n picks.push(run.length - 1);\n }\n let a = 0;\n while (a < picks.length) {\n const i = picks[a];\n let to = -1;\n for (let b = a + 1; b < picks.length && s[picks[b]] - s[i] <= length; b++) {\n const j2 = picks[b];\n if (s[j2] - s[i] > Math.PI * close && gapOf(run[i], run[j2]) <= close) {\n to = b;\n }\n }\n if (to < 0) {\n a++;\n continue;\n }\n const j = picks[to];\n const p = run[i];\n const q = run[j];\n for (let k = i + 1; k < j; k++) {\n const f = (s[k] - s[i]) / (s[j] - s[i]);\n out[k] = {\n ...run[k],\n x: p.x + (q.x - p.x) * f,\n y: p.y + (q.y - p.y) * f\n };\n }\n a = to;\n }\n return out;\n}\nfunction rounded(run, half) {\n const n = run.length;\n const s = arcOf(run);\n const end = s[n - 1];\n const sumW = new Float64Array(n + 1);\n const sumX = new Float64Array(n + 1);\n const sumY = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const w = (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2;\n sumW[i + 1] = sumW[i] + w;\n sumX[i + 1] = sumX[i] + w * p.x;\n sumY[i + 1] = sumY[i] + w * p.y;\n }\n const out = new Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const reach = Math.min(half, s[i], end - s[i]);\n const from = s[i] - reach;\n const to = s[i] + reach + 1e-9 * (1 + end);\n while (lo < n && s[lo] < from) {\n lo++;\n }\n while (hi < n && s[hi] < to) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? { x: (sumX[hi] - sumX[lo]) / w, y: (sumY[hi] - sumY[lo]) / w } : { x: p.x, y: p.y };\n }\n return out;\n}\nfunction tightPoints(line, radius) {\n const n = line.length;\n const s = arcOf(line);\n const end = s[n - 1];\n const tight = new Uint8Array(n);\n const along = (j, at) => {\n const a = line[j];\n const b = line[j + 1];\n if (!b) {\n return a;\n }\n const span = s[j + 1] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n if (s[i] < radius || end - s[i] < radius) {\n continue;\n }\n while (lo + 1 < n && s[lo + 1] <= s[i] - radius) {\n lo++;\n }\n while (hi + 1 < n && s[hi + 1] <= s[i] + radius) {\n hi++;\n }\n const p = line[i];\n const a = along(lo, s[i] - radius);\n const b = along(hi, s[i] + radius);\n const twice = Math.abs(\n (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x)\n );\n tight[i] = twice > 0 && gapOf(a, b) * gapOf(a, p) * gapOf(p, b) / (2 * twice) < radius ? 1 : 0;\n }\n return { tight, s };\n}\nfunction loosened(line, radius) {\n const out = line.slice();\n const { tight, s } = tightPoints(out, radius);\n let windows = ownedWindows(\n s,\n Array.from(tight, (t) => t > 0),\n 3 * radius\n );\n for (let pass = 0; pass < 8 && windows.length; pass++) {\n windows = windows.filter(([lo, hi]) => {\n const part = out.slice(lo, hi + 1);\n const local = tightPoints(part, radius);\n if (!local.tight.includes(1)) {\n return false;\n }\n const weight = windowMean(local.s, local.tight, radius);\n const smoother = rounded(part, radius);\n for (let k = 0; k < part.length; k++) {\n const w = Math.min(1, 3 * weight[k]);\n if (w > 0) {\n const p = part[k];\n const q = smoother[k];\n out[lo + k] = { x: p.x + (q.x - p.x) * w, y: p.y + (q.y - p.y) * w };\n }\n }\n return true;\n });\n }\n return out;\n}\nfunction runSigns(s, own, canonical, forward, settle, half) {\n const n = own.length;\n const agreement = new Float64Array(n);\n let hi = 0;\n let lo = 0;\n let sum2 = 0;\n let decided = 0;\n let pending = 0;\n for (let i = 0; i < n; i++) {\n while (hi < n && s[hi] - s[i] <= half) {\n const theirs = canonical(hi);\n const mine = own[hi];\n agreement[hi] = theirs && mine ? theirs.nx * mine.nx + theirs.ny * mine.ny : 0;\n sum2 += agreement[hi];\n hi++;\n }\n while (s[i] - s[lo] > half) {\n sum2 -= agreement[lo++];\n }\n if (Math.abs(sum2) > 1e-9) {\n decided = sum2 < 0 ? -1 : 1;\n }\n if (!decided) {\n continue;\n }\n for (; pending <= i; pending++) {\n settle(pending, decided);\n }\n }\n if (pending < n) {\n let along = 0;\n for (let k = 0; k < n; k++) {\n along += forward(k) ? 1 : -1;\n }\n for (; pending < n; pending++) {\n settle(pending, along < 0 ? -1 : 1);\n }\n }\n}\nfunction laneLines(runs, yToX, reach, band, smooth = true) {\n const turn = Math.max(reach, 2 * band);\n const curl = Math.PI * band;\n const context = smooth ? curl + 3 * band + turn / 2 : turn / 2;\n const frames = /* @__PURE__ */ new Map();\n const firsts = /* @__PURE__ */ new Map();\n const arcs = [];\n const stepFrames = [];\n const newFrame = (length) => ({\n normals: new Array(length),\n shifts: smooth ? new Array(length) : []\n });\n const place = (id, walk, visit, f) => {\n let byWalk = frames.get(id);\n if (!byWalk) {\n byWalk = [];\n frames.set(id, byWalk);\n }\n ;\n (byWalk[walk] ??= [])[visit] = f;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, owned, starts, xs, ys, stepOf } = run;\n const steps = ids.length;\n const n = xs.length;\n const own = new Array(steps);\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n own[i] = newFrame(starts[i + 1] - starts[i]);\n firsts.set(ids[i], { run: r, step: i, frame: own[i] });\n place(ids[i], walk, visits[i], own[i]);\n }\n }\n const raw = new Float64Array(n);\n for (let p = 1; p < n; p++) {\n const dx = xs[p] - xs[p - 1];\n const dy = ys[p] - ys[p - 1];\n raw[p] = raw[p - 1] + Math.sqrt(dx * dx + dy * dy);\n }\n const end = raw[n - 1];\n const firstRun = new Int32Array(steps).fill(-1);\n const firstStep = new Int32Array(steps);\n const firstFrame = new Array(steps);\n for (let i = 0; i < steps; i++) {\n const first = owned[i] ? void 0 : firsts.get(ids[i]);\n if (first) {\n firstRun[i] = first.run;\n firstStep[i] = first.step;\n firstFrame[i] = first.frame;\n }\n }\n const plus = new Int32Array(steps);\n const minus = new Int32Array(steps);\n for (let i = 0; i + 1 < steps; i++) {\n const same = firstRun[i] >= 0 && firstRun[i + 1] === firstRun[i];\n const d = same ? firstStep[i + 1] - firstStep[i] : 0;\n plus[i + 1] = plus[i] + (d === 1 ? 1 : 0);\n minus[i + 1] = minus[i] + (d === -1 ? 1 : 0);\n }\n const shared = new Array(steps);\n let reachFrom = 0;\n let reachTo = 0;\n for (let i = 0; i < steps; i++) {\n if (!smooth) {\n shared[i] = !owned[i];\n continue;\n }\n const from = raw[starts[i]] - context;\n const to = raw[starts[i + 1] - 1] + context;\n while (raw[reachFrom] < from) {\n reachFrom++;\n }\n while (reachTo + 1 < n && raw[reachTo + 1] <= to) {\n reachTo++;\n }\n const lo = stepOf[Math.max(0, reachFrom - 1)];\n const hi = stepOf[Math.min(n - 1, reachTo + 1)];\n const span = hi - lo;\n const forward = plus[hi] - plus[lo];\n const backward = minus[hi] - minus[lo];\n shared[i] = !owned[i] && from >= 0 && to <= end && span > 0 && (forward === span || backward === span);\n }\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n continue;\n }\n const first = firstFrame[i];\n own[i] = !smooth && shared[i] ? first : shared[i] ? { normals: first.normals, shifts: first.shifts } : newFrame(first.normals.length);\n place(ids[i], walk, visits[i], own[i]);\n }\n stepFrames.push(own);\n const apart = new Array(n);\n for (let p = 0; p < n; p++) {\n apart[p] = !shared[stepOf[p]];\n }\n for (const [from, to] of ownedWindows(raw, apart, context)) {\n const points = [];\n for (let p = from; p <= to; p++) {\n points.push({ x: xs[p], y: ys[p] });\n }\n const line = smooth ? loosened(\n rounded(cutCurls(points, band / 2, curl), band / 2),\n band / 2\n ) : points;\n const normals = smoothedNormals(line, turn);\n runSigns(\n arcOf(line),\n normals,\n (k) => {\n const i = stepOf[from + k];\n return (owned[i] ? own[i] : firstFrame[i])?.normals[pointIndex(run, from + k)];\n },\n (k) => run.forward[stepOf[from + k]],\n (k, sign) => {\n const p = from + k;\n const i = stepOf[p];\n if (shared[i]) {\n return;\n }\n const index = pointIndex(run, p);\n const m = normals[k];\n own[i].normals[index] = m && (sign > 0 ? m : { nx: -m.nx, ny: -m.ny });\n if (smooth) {\n own[i].shifts[index] = {\n dx: line[k].x - points[k].x,\n dy: (line[k].y - points[k].y) / yToX\n };\n }\n },\n turn\n );\n }\n if (!smooth) {\n arcs.push(raw);\n return;\n }\n const s = new Float64Array(n);\n let px = 0;\n let py = 0;\n for (let p = 0; p < n; p++) {\n const shift = own[stepOf[p]].shifts[pointIndex(run, p)];\n const x = xs[p] + (shift?.dx ?? 0);\n const y = ys[p] + (shift?.dy ?? 0) * yToX;\n s[p] = p ? s[p - 1] + Math.sqrt((x - px) ** 2 + (y - py) ** 2) : 0;\n px = x;\n py = y;\n }\n arcs.push(s);\n });\n return { frames, arcs, stepFrames };\n}\nfunction windowed(s, v, half, sign) {\n const out = new Array(v.length);\n const deque = [];\n let head = 0;\n let next = 0;\n for (let i = 0; i < v.length; i++) {\n while (next < v.length && s[next] - s[i] <= half) {\n while (deque.length > head && sign * v[deque.at(-1)] <= sign * v[next]) {\n deque.pop();\n }\n deque.push(next++);\n }\n while (s[i] - s[deque[head]] > half) {\n head++;\n }\n out[i] = v[deque[head]];\n }\n return out;\n}\nfunction windowMean(s, v, half, counted = () => true) {\n const n = v.length;\n const sumW = new Float64Array(n + 1);\n const sumWV = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const w = !counted(v[i]) ? 0 : n > 1 ? (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2 : 1;\n sumW[i + 1] = sumW[i] + w;\n sumWV[i + 1] = sumWV[i] + w * v[i];\n }\n const out = new Float64Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n while (s[i] - s[lo] > half) {\n lo++;\n }\n while (hi < n && s[hi] - s[i] <= half) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? (sumWV[hi] - sumWV[lo]) / w : v[i];\n }\n return out;\n}\nvar ONE_THREAD = [0];\nfunction repeats(passes) {\n for (const p of passes.values()) {\n if (p > 1) {\n return true;\n }\n }\n return false;\n}\nfunction walkThreads(route, passes, nodePositions, yToX, reach) {\n if (!repeats(passes)) {\n return {\n span: passes,\n nodeThreads: /* @__PURE__ */ new Map(),\n threadPasses: /* @__PURE__ */ new Map(),\n threadAt: /* @__PURE__ */ new Map(),\n linkThreads: /* @__PURE__ */ new Map()\n };\n }\n const index = /* @__PURE__ */ new Map();\n const ids = [];\n const widths = [];\n const visits = [];\n const steps = [];\n const stepVisits = [];\n const stepWants = [];\n const stepGlides = [];\n for (const piece of route) {\n const points = [];\n const nodes = [];\n for (const id of piece) {\n let k = index.get(id);\n if (k === void 0) {\n k = ids.length;\n index.set(id, k);\n ids.push(id);\n widths.push(0);\n visits.push(0);\n }\n nodes.push(k);\n const segments = nodePositions[id];\n const mid = segments?.[Math.floor(segments.length / 2)];\n points.push(\n mid ? { x: mid.x, y: mid.y * yToX } : points.at(-1) ?? { x: 0, y: 0 }\n );\n }\n const s = arcOf(points);\n const p = piece.map((id) => passes.get(id) ?? 1);\n const most = windowed(s, p, reach / 2, 1);\n const copy = nodes.map((k) => ++visits[k]);\n const n = piece.length;\n const before = new Int32Array(n);\n let last = -1;\n for (let i = 0; i < n; i++) {\n last = p[i] === most[i] ? i : last;\n before[i] = last;\n }\n const after = new Int32Array(n);\n last = -1;\n for (let i = n - 1; i >= 0; i--) {\n last = p[i] === most[i] ? i : last;\n after[i] = last;\n }\n const wants = new Array(n);\n const glides = new Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n const b = before[i];\n const a = after[i];\n const nearest = b < 0 ? a : a < 0 ? b : s[i] - s[b] <= s[a] - s[i] ? b : a;\n const want = (k) => Math.min(copy[k], most[i]) - 1;\n wants[i] = want(nearest);\n if (p[i] === 1 && b >= 0 && a >= 0 && want(a) !== want(b)) {\n const f = (s[i] - s[b]) / (s[a] - s[b] || 1);\n glides[i] = want(b) + (want(a) - want(b)) * f;\n }\n widths[nodes[i]] = Math.max(widths[nodes[i]], most[i]);\n }\n steps.push(nodes);\n stepVisits.push(copy);\n stepWants.push(wants);\n stepGlides.push(glides);\n }\n const taken = [];\n const threadOf = [];\n const free = (k, want) => {\n const width = widths[k];\n const own = taken[k] ??= /* @__PURE__ */ new Set();\n for (let d = 0; d < width; d++) {\n for (const c of [want - d, want + d]) {\n if (c >= 0 && c < width && !own.has(c)) {\n return c;\n }\n }\n }\n return want;\n };\n const glideOf = [];\n steps.forEach((nodes, piece) => {\n nodes.forEach((k, i) => {\n if (widths[k] > 1) {\n const glide = stepGlides[piece][i];\n const t = free(\n k,\n Number.isNaN(glide) ? stepWants[piece][i] : Math.round(glide)\n );\n taken[k].add(t);\n (threadOf[k] ??= [])[stepVisits[piece][i]] = t;\n if (!Number.isNaN(glide)) {\n ;\n (glideOf[k] ??= [])[t] = glide;\n }\n }\n });\n });\n const span = /* @__PURE__ */ new Map();\n const nodeThreads = /* @__PURE__ */ new Map();\n const threadPasses = /* @__PURE__ */ new Map();\n const threadAt = /* @__PURE__ */ new Map();\n ids.forEach((id, k) => {\n if (glideOf[k]) {\n threadAt.set(id, glideOf[k]);\n }\n span.set(id, widths[k]);\n nodeThreads.set(\n id,\n taken[k] ? [...taken[k]].sort((a, b) => a - b) : ONE_THREAD\n );\n const passOf = [];\n threadOf[k]?.forEach((thread, visit) => {\n passOf[thread] = visit - 1;\n });\n threadPasses.set(id, passOf);\n });\n const linkThreads = /* @__PURE__ */ new Map();\n steps.forEach((nodes, piece) => {\n const visit = stepVisits[piece];\n for (let i = 1; i < nodes.length; i++) {\n const from = nodes[i - 1];\n const to = nodes[i];\n const pair = [\n threadOf[from]?.[visit[i - 1]] ?? 0,\n threadOf[to]?.[visit[i]] ?? 0\n ];\n let ahead = linkThreads.get(ids[from]);\n if (!ahead) {\n ahead = /* @__PURE__ */ new Map();\n linkThreads.set(ids[from], ahead);\n }\n const list = ahead.get(ids[to]);\n if (!list) {\n ahead.set(ids[to], [pair]);\n } else if (!list.some(([a, b]) => a === pair[0] && b === pair[1])) {\n list.push(pair);\n }\n }\n });\n return { span, nodeThreads, threadPasses, threadAt, linkThreads };\n}\nfunction bandSpans(runs, arcs, spans, { reach, taper }) {\n const out = /* @__PURE__ */ new Map();\n runs.forEach((run, r) => {\n const s = arcs[r];\n const along = run.ids.map((_, i) => {\n const length = run.starts[i + 1] - run.starts[i];\n const middle = Math.floor(length / 2);\n return s[run.starts[i] + (run.forward[i] ? middle : length - 1 - middle)];\n });\n for (const [lo, hi] of ownedWindows(\n along,\n run.owned,\n reach / 2 + taper / 2\n )) {\n const at = along.slice(lo, hi + 1);\n const ids = run.ids.slice(lo, hi + 1);\n const eased = spans.map((own) => {\n const raw = ids.map((id) => own.get(id) ?? 0);\n return raw.every((v) => v === raw[0]) ? { slot: raw, held: raw } : {\n slot: windowMean(at, windowed(at, raw, reach / 2, 1), taper / 2),\n held: windowMean(at, raw, taper / 2, (v) => v > 0)\n };\n });\n ids.forEach((id, i) => {\n if (run.owned[lo + i]) {\n out.set(id, {\n slot: eased.map((e) => e.slot[i]),\n held: eased.map((e) => e.held[i])\n });\n }\n });\n }\n });\n return out;\n}\nfunction easeOffsets(runs, stepFrames, arcs, spans, passes, threads, half) {\n const plain = slotCentres(passes, passes);\n const byNode = /* @__PURE__ */ new Map();\n const centresAt = (id) => {\n let centres = byNode.get(id);\n if (!centres) {\n const own = spans.get(id);\n centres = own ? slotCentres(own.slot, passes, own.held) : plain;\n byNode.set(id, centres);\n }\n return centres;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, starts } = run;\n const { threadPasses, threadAt } = threads[walk];\n const raw = new Float64Array(run.xs.length);\n ids.forEach((id, i) => {\n const thread = Math.max(0, threadPasses.get(id)?.indexOf(visits[i]) ?? 0);\n const place = threadAt.get(id)?.[thread] ?? thread;\n raw.fill(\n centresAt(id)[walk] + place * THREAD_PITCH_PX,\n starts[i],\n starts[i + 1]\n );\n });\n const eased = windowMean(arcs[r], raw, half);\n stepFrames[r].forEach((frame, i) => {\n const from = starts[i];\n const to = starts[i + 1];\n let constant = true;\n for (let p = from + 1; constant && p < to; p++) {\n constant = Math.abs(eased[p] - eased[from]) < 1e-9;\n }\n if (constant) {\n frame.offset = eased[from];\n return;\n }\n const offsets = new Array(to - from);\n for (let p = from; p < to; p++) {\n offsets[pointIndex(run, p)] = eased[p];\n }\n frame.offsets = offsets;\n });\n });\n}\nfunction liftLanes(walks, nodePositions, yToX, worldPerScreenPx, steps = walkSteps(\n walks.map((w) => w.route),\n nodePositions\n)) {\n const threaded = threadsPasses(walks);\n const passes = walks.map((w) => w.mostPasses);\n const reach = THREAD_REACH_PX * worldPerScreenPx;\n const runs = laneRuns(steps, yToX, LANE_SMOOTHING_PX * worldPerScreenPx);\n const band = bandWidthPx(passes) * (threaded ? bandScale(passes) : 1) * worldPerScreenPx;\n const lines = laneLines(\n runs,\n yToX,\n LANE_SMOOTHING_PX * worldPerScreenPx,\n band,\n threaded\n );\n const threads = threaded ? walks.map((w) => walkThreads(w.route, w.passes, nodePositions, yToX, reach)) : void 0;\n const spans = threads ? bandSpans(\n runs,\n lines.arcs,\n threads.map((t) => t.span),\n { reach, taper: THREAD_TAPER_PX * worldPerScreenPx }\n ) : void 0;\n if (spans && threads) {\n easeOffsets(\n runs,\n lines.stepFrames,\n lines.arcs,\n spans,\n passes,\n threads,\n THREAD_TAPER_PX / 2 * worldPerScreenPx\n );\n }\n const furthestShift = { dx: 0, dy: 0 };\n const seenShifts = /* @__PURE__ */ new Set();\n for (const byWalk of lines.frames.values()) {\n for (const { shifts } of byWalk.flat()) {\n if (seenShifts.has(shifts)) {\n continue;\n }\n seenShifts.add(shifts);\n for (const shift of shifts) {\n furthestShift.dx = Math.max(furthestShift.dx, Math.abs(shift?.dx ?? 0));\n furthestShift.dy = Math.max(furthestShift.dy, Math.abs(shift?.dy ?? 0));\n }\n }\n }\n return { lines, threads, spans, furthestShift };\n}\n\nexport {\n THREAD_PX,\n THREAD_GAP_PX,\n SLOT_GAP_PX,\n LANE_SMOOTHING_PX,\n THREAD_REACH_PX,\n THREAD_TAPER_PX,\n MAX_BAND_PX,\n PASSES_KEY,\n threadsPasses,\n THREAD_PITCH_PX,\n slotCentres,\n bandWidthPx,\n bandScale,\n passesKey,\n laneSlideAt,\n walkSteps,\n laneRuns,\n laneLines,\n walkThreads,\n bandSpans,\n liftLanes\n};\n", "// 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 const t = Math.max(0, 1 - 1 / factor);\n const lift = (v) => Math.round(v + (255 - v) * t);\n return packAbgr(\n lift(abgrRed(c)),\n lift(abgrGreen(c)),\n lift(abgrBlue(c)),\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", "// src/referenceRampCss.ts\nvar REFERENCE_RAMP_MAX_HUE = 300;\nvar REFERENCE_RAMP_SATURATION = 0.7;\nvar REFERENCE_RAMP_LIGHTNESS = 0.5;\nfunction rampHueCss(hue) {\n return `hsl(${hue}, ${REFERENCE_RAMP_SATURATION * 100}%, ${REFERENCE_RAMP_LIGHTNESS * 100}%)`;\n}\nfunction rampHueAt(frac) {\n return Math.max(0, Math.min(1, frac)) * REFERENCE_RAMP_MAX_HUE;\n}\nfunction rampHue(bp, domain) {\n return rampHueAt((bp - domain.start) / (domain.end - domain.start));\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 REFERENCE_RAMP_MAX_HUE,\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS,\n rampHueCss,\n rampHueAt,\n rampHue,\n rampStops,\n RAMP_GRADIENT_STOPS,\n RAMP_GRADIENT_CSS\n};\n", "import {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n edgeCurvesOf\n} from \"./chunk-ALGYCMMH.js\";\n\n// src/util/edgeCurves.ts\nvar cache = weakMemo();\nfunction baseEdgeCurves(nodePositions, graph, axis, deletions, version, routes, stranded = false) {\n return cache(\n nodePositions,\n [graph, axis.scaleX, axis.scaleY, deletions, routes, stranded, version],\n () => {\n const curves = /* @__PURE__ */ new Map();\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const bypassed = deletions?.get(ei);\n const edgeCurves = edgeCurvesOf(\n nodePositions,\n graph.edges[ei],\n axis,\n bypassed,\n bypassed && routes?.[ei],\n stranded\n );\n if (edgeCurves) {\n curves.set(ei, edgeCurves);\n }\n }\n return curves;\n }\n );\n}\n\nexport {\n baseEdgeCurves\n};\n", "import {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/referenceSpan.ts\nvar MAX_BACKBONE_HOPS = 4;\nfunction buildNeighbors(graph) {\n const neighbors = /* @__PURE__ */ new Map();\n for (const edge of graph.edges) {\n pushTo(neighbors, edge.from, edge.to);\n pushTo(neighbors, 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}\nfunction referencePositions(graph) {\n const positions = referenceMidpoints(graph);\n const neighbors = buildNeighbors(graph);\n let frontier = [...positions.keys()];\n while (frontier.length > 0) {\n const next = [];\n for (const id of frontier) {\n for (const neighborId of neighbors.get(id) ?? []) {\n if (!positions.has(neighborId)) {\n positions.set(neighborId, positions.get(id));\n next.push(neighborId);\n }\n }\n }\n frontier = next;\n }\n return positions;\n}\n\nexport {\n buildNeighbors,\n nodeReferenceSpan,\n referenceMidpoints,\n referencePositions\n};\n", "import {\n THREAD_PITCH_PX,\n THREAD_PX,\n bandScale,\n bandWidthPx,\n liftLanes,\n slotCentres,\n threadsPasses,\n walkSteps\n} from \"./chunk-YUIKEUKY.js\";\nimport {\n abgrToCssRgba,\n fadeAbgr,\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n PATH_LIGHTNESS,\n PATH_SATURATION,\n nameHue,\n pathHueAt\n} from \"./chunk-ZULVAGVE.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.js\";\nimport {\n baseEdgeCurves\n} from \"./chunk-URPU4XCM.js\";\nimport {\n nodeWidthPx,\n walkLaneWidthPx,\n widthNorm\n} from \"./chunk-XWH4LB56.js\";\nimport {\n referenceMidpoints\n} from \"./chunk-L4DBSRA2.js\";\nimport {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n dashSpans,\n pathRibbonOffsets,\n polylinePx,\n slideCurves,\n strandSides,\n translateCurves,\n yToXOf\n} from \"./chunk-JJV2GT2Z.js\";\nimport {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\nimport {\n busiestEdge,\n edgeWidthFactor\n} from \"./chunk-DAEEMZ74.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 MOVED_ALPHA = 0.45;\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_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, 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}\nvar FIRST_THREADS = [[0, 0]];\nvar ONE_PASS = [0];\nvar NO_SHIFT = { dx: 0, dy: 0 };\nfunction nearerStart(at, segments, yToX) {\n const gap = (p) => Math.hypot(p.x - at.x, (p.y - at.y) * yToX);\n return gap(segments[0]) < gap(segments.at(-1));\n}\nfunction leavesStart(edge, segments, first, stranded, yToX) {\n return stranded ? strandSides(edge).from === \"start\" : nearerStart({ x: first.x0, y: first.y0 }, segments, yToX);\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 normal(a, b) {\n if (!a || !b) {\n return void 0;\n }\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n return len > 0 ? { nx: -dy / len, ny: dx / len } : void 0;\n}\nvar MITRE_LIMIT = 0.1;\nvar LONGEST_NORMAL = 1 / Math.sqrt(MITRE_LIMIT);\nfunction pointNormalsOf(rawPoints, yToX = 1) {\n const points = yToX === 1 ? rawPoints : rawPoints.map((p) => ({ x: p.x, y: p.y * yToX }));\n return points.map((p, i) => {\n const before = normal(points[i - 1], p);\n const after = normal(p, points[i + 1]);\n if (before && after) {\n const nx = (before.nx + after.nx) / 2;\n const ny = (before.ny + after.ny) / 2;\n const dot = before.nx * nx + before.ny * ny;\n return dot > MITRE_LIMIT ? { nx: nx / dot, ny: ny / dot } : { nx, ny };\n }\n return before ?? after ?? { nx: 0, ny: 0 };\n });\n}\nfunction offsetPolyline(points, normals, distance, yToX = 1) {\n const out = new Array(points.length);\n for (let i = 0; i < points.length; i++) {\n const d = typeof distance === \"number\" ? distance : distance[i];\n out[i] = {\n x: points[i].x + normals[i].nx * d,\n y: points[i].y + normals[i].ny * d / yToX\n };\n }\n return out;\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}\nfunction packHsl(h, s, l, a = 1) {\n const [r, g, b] = hslToRgb(h, s, l);\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}\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 return packHsl(nameHue(str), PATH_SATURATION, PATH_LIGHTNESS, alpha);\n}\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 rampFraction(node, ramp) {\n const mid = ramp.midpoints.get(node.id);\n return isBackbone(node) && mid !== void 0 ? (mid - ramp.start) / ramp.span : void 0;\n}\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, referenceRamp) {\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 referenceRamp\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, so only the backbone takes a hue\n case \"reference-position\": {\n const ramp = range.referenceRamp;\n if (ramp === void 0) {\n return packAbgr(160, 160, 160, 255);\n }\n const t = rampFraction(node, ramp);\n return t === void 0 ? REFERENCE_RAMP_ALT_COLOR : packHsl(\n rampHueAt(t),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n );\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 return packHsl(hue, 0.75, 0.5);\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, growX = 0, growY = 0) {\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 - growX && cMinX <= bounds.maxX + growX && cMaxY >= bounds.minY - growY && cMinY <= bounds.maxY + growY) {\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 pathColorByIndex.push(\n packHsl(\n pathHueAt(i, paths.length),\n PATH_SATURATION,\n PATH_LIGHTNESS,\n 0.85\n )\n );\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 pushTo(slots, nodeId, pathIdx);\n }\n }\n slotsCache.set(graph, slots);\n }\n return slots;\n}\nvar lanesCache = weakMemo();\nvar stepsCache = weakMemo();\nvar linksCache = /* @__PURE__ */ new WeakMap();\nfunction linksOf(graph) {\n let links = linksCache.get(graph);\n if (!links) {\n links = /* @__PURE__ */ new Map();\n for (const { from, to } of graph.edges) {\n let out = links.get(from);\n if (!out) {\n out = /* @__PURE__ */ new Set();\n links.set(from, out);\n }\n out.add(to);\n }\n linksCache.set(graph, links);\n }\n return links;\n}\nfunction buildGeometry(options) {\n const {\n nodePositions,\n graph,\n nodeById,\n colorScheme,\n contigThickness,\n connectorThickness,\n drawPaths,\n nodeWidth = \"uniform\",\n edgeWidth = \"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 widthScale = widthNorm(graph, nodeWidth);\n const busiest = edgeWidth === \"walks\" ? busiestEdge(graph) : 0;\n const scale = axis.scaleX;\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\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 liftedWalks = highlight?.walks ?? [];\n const threaded = threadsPasses(liftedWalks);\n const lanePasses = liftedWalks.map((w) => w.mostPasses);\n const thinned = threaded ? bandScale(lanePasses) : 1;\n const fields = highlight && liftedWalks.length > 1 ? lanesCache(\n highlight,\n [nodePositions, version, axis.scaleX, axis.scaleY],\n () => liftLanes(\n liftedWalks,\n nodePositions,\n yToX,\n worldPerScreenPx,\n stepsCache(\n highlight,\n [nodePositions, version],\n () => walkSteps(\n liftedWalks.map((w) => w.route),\n nodePositions\n )\n )\n )\n ) : void 0;\n const lines = fields?.lines;\n const threads = fields?.threads;\n const spanField = fields?.spans;\n const plainCentres = threaded ? slotCentres(lanePasses, lanePasses) : [];\n const centresByNode = /* @__PURE__ */ new Map();\n const centresOf = (nodeId) => {\n let centres = centresByNode.get(nodeId);\n if (!centres) {\n const spans = spanField?.get(nodeId);\n centres = spans ? slotCentres(spans.slot, lanePasses, spans.held) : plainCentres;\n centresByNode.set(nodeId, centres);\n }\n return centres;\n };\n const laneOffset = (nodeId, laneWidth, lane, pass) => threaded ? (centresOf(nodeId)[lane] + pass * THREAD_PITCH_PX) * thinned : (lane - (liftedWalks.length - 1) / 2) * laneWidth;\n const threadOffsetAt = (frame, at, fallback) => {\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return eased === void 0 ? fallback : eased * thinned;\n };\n const laneHalfWidth = (laneWidth) => threaded ? THREAD_PX / 2 * thinned : laneWidth / 2;\n const plainNormals = /* @__PURE__ */ new Map();\n const visitNormals = /* @__PURE__ */ new WeakMap();\n const visitOf = (lane, nodeId, thread) => threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0;\n const plainNormalsOf = (nodeId, segments) => {\n let normals = plainNormals.get(nodeId);\n if (!normals) {\n normals = pointNormalsOf(segments, yToX);\n plainNormals.set(nodeId, normals);\n }\n return normals;\n };\n const laneNormalsOf = (nodeId, segments, frame) => {\n if (!frame) {\n return plainNormalsOf(nodeId, segments);\n }\n let normals = visitNormals.get(frame.normals);\n if (!normals) {\n normals = plainNormalsOf(nodeId, segments).map(\n (n, i) => frame.normals[i] ?? n\n );\n visitNormals.set(frame.normals, normals);\n }\n return normals;\n };\n const laneWidths = /* @__PURE__ */ new Map();\n const laneWidthOf = (id) => {\n let width = laneWidths.get(id);\n if (width === void 0) {\n const node = nodeById.get(id);\n width = walkLaneWidthPx(\n node ? nodeWidthPx(node, contigThickness, nodeWidth, widthScale) : contigThickness,\n liftedWalks.length\n );\n laneWidths.set(id, width);\n }\n return width;\n };\n const laneEndOf = (id, frames, segments, atStart, lane, thread) => {\n const at = atStart ? 0 : segments.length - 1;\n const frame = frames?.[lane]?.[visitOf(lane, id, thread)];\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return {\n normal: frame?.normals[at] ?? plainNormalsOf(id, segments)[at] ?? { nx: 0, ny: 0 },\n shift: frame?.shifts[at] ?? NO_SHIFT,\n offset: eased === void 0 ? laneOffset(id, laneWidthOf(id), lane, thread) : eased * thinned\n };\n };\n const lanesMayShow = (curves, fromId) => {\n if (!viewportBounds) {\n return true;\n }\n const offset = threaded ? bandWidthPx(lanePasses) * thinned : (liftedWalks.length - 1) / 2 * laneWidthOf(fromId);\n const reach = LONGEST_NORMAL * offset * worldPerScreenPx;\n return isBezierInBounds(\n curves,\n viewportBounds,\n reach + (fields?.furthestShift.dx ?? 0),\n reach / yToX + (fields?.furthestShift.dy ?? 0)\n );\n };\n const threadPairs = (lane, from, to) => {\n const own = threads?.[lane]?.linkThreads;\n if (!own?.size) {\n return FIRST_THREADS;\n }\n const ahead = own.get(from)?.get(to);\n const back = linksOf(graph).get(to)?.has(from) ? void 0 : own.get(to)?.get(from);\n if (!back) {\n return ahead ?? FIRST_THREADS;\n }\n const turned = back.map(([a, b]) => [b, a]);\n return ahead ? [...ahead, ...turned] : turned;\n };\n const threadColor = (lane, nodeId, thread) => liftedWalks[lane]?.passColors.get(nodeId)?.[threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0];\n const visitPoints = /* @__PURE__ */ new WeakMap();\n const lanePointsOf = (segments, frame) => {\n if (!frame || !threaded) {\n return segments;\n }\n let points = visitPoints.get(frame.shifts);\n if (!points) {\n const { shifts } = frame;\n points = segments.map((p, i) => {\n const { dx, dy } = shifts[i] ?? NO_SHIFT;\n return { ...p, x: p.x + dx, y: p.y + dy };\n });\n visitPoints.set(frame.shifts, points);\n }\n return points;\n };\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 ribbonThickness = connectorThickness / 2 * (isDeletion ? DELETION_THICKNESS_FACTOR : 1);\n const walkFactor = edgeWidthFactor(numPaths, busiest, edgeWidth);\n const edgeThickness = connectorThickness / 2 * (!isDeletion ? walkFactor : edgeWidth === \"walks\" && busiest > 0 ? Math.max(1, walkFactor) : DELETION_THICKNESS_FACTOR);\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, widthScale) : contigThickness) / 2;\n const inView = (curves) => !viewportBounds || isBezierInBounds(curves, viewportBounds);\n const dashesOf = (curves) => dashSpans(curves, DELETION_DASH_PX / scale, yToX, viewportBounds);\n const stroke = (curves, thickness, color) => {\n if (!isDeletion) {\n edgeCurves.push({ curves, thickness, color });\n return;\n }\n for (const dash of dashesOf(curves)) {\n edgeCurves.push({ curves: dash.curves, thickness, color });\n }\n };\n const laneStroke = (curves, thickness, color, walk, pass, normal2, offsetX, endNormal, endOffsetX) => {\n edgeCurves.push({\n curves,\n thickness,\n color,\n walk,\n pass,\n normal: normal2,\n offsetX,\n endNormal,\n endOffsetX\n });\n };\n const arrowOn = (curves) => {\n const head = showArrows ? arrowheadFor({\n curves,\n edgeHalfWidth: isDeletion || ribbons ? connectorThickness / 2 : edgeThickness,\n nodeHalfWidth: intoHalfWidth,\n scale,\n yToX,\n color: edgeColor,\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?.walks.length && onWalk && !ribbons ? highlight.walks : void 0;\n if (laneWalks && !lanesMayShow(baseCurves, edge.from)) {\n continue;\n }\n if (laneWalks) {\n const fromAtStart = leavesStart(\n edge,\n fromSegments,\n baseCurves[0],\n stranded,\n yToX\n );\n const last = baseCurves.at(-1);\n const toAtStart = nearerStart(\n { x: last.x1, y: last.y1 },\n toSegments,\n yToX\n );\n const single = laneWalks.length === 1;\n const thickness = laneHalfWidth(laneWidthOf(edge.from));\n const fromFrames = lines?.frames.get(edge.from);\n const toFrames = lines?.frames.get(edge.to);\n for (let lane = 0; lane < laneWalks.length; lane++) {\n const walk = laneWalks[lane];\n if (!walk.edgeIndexes.has(ei)) {\n continue;\n }\n for (const [pass, toPass] of threadPairs(lane, edge.from, edge.to)) {\n const from = laneEndOf(\n edge.from,\n fromFrames,\n fromSegments,\n fromAtStart,\n lane,\n pass\n );\n const to = threaded ? laneEndOf(edge.to, toFrames, toSegments, toAtStart, lane, toPass) : from;\n const offsetX = single ? 0 : from.offset * worldPerScreenPx;\n const endOffsetX = threaded ? to.offset * worldPerScreenPx : offsetX;\n const curves = threaded ? slideCurves(\n baseCurves,\n from.shift.dx + from.normal.nx * offsetX,\n from.shift.dy + from.normal.ny * offsetX / yToX,\n to.shift.dx + to.normal.nx * endOffsetX,\n to.shift.dy + to.normal.ny * endOffsetX / yToX\n ) : offsetX === 0 ? baseCurves : translateCurves(\n baseCurves,\n from.normal.nx * offsetX,\n from.normal.ny * offsetX / yToX\n );\n if (inView(curves)) {\n laneStroke(\n curves,\n thickness,\n threadColor(lane, edge.from, pass) ?? threadColor(lane, edge.to, toPass) ?? plainEdgeColor,\n lane,\n pass,\n from.normal,\n offsetX,\n to.normal,\n endOffsetX\n );\n }\n }\n }\n if (edgeCurves.length > edgeCurveStart) {\n arrowOn(baseCurves);\n }\n } else if (!ribbons) {\n if (inView(baseCurves)) {\n stroke(baseCurves, edgeThickness, edgeColor);\n arrowOn(baseCurves);\n }\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 { x, y } = offsets[pathIdx];\n const curves = x === 0 && y === 0 ? baseCurves : translateCurves(baseCurves, x, y);\n if (!inView(curves)) {\n continue;\n }\n const ribbonColor = pathColorByName(edge.pathIds[pathIdx]);\n stroke(\n curves,\n ribbonThickness,\n highlight && (highlight.walks.length ? !highlight.names.has(edge.pathIds[pathIdx]) : !onWalk) ? fadeAbgr(ribbonColor, FADED_ALPHA) : ribbonColor\n );\n if (pathIdx === arrowRibbon) {\n arrowOn(curves);\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) : node.moved ? fadeAbgr(own, MOVED_ALPHA) : own;\n const width = nodeWidthPx(node, contigThickness, nodeWidth, widthScale);\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?.walks.length && !faded && !slots?.length ? highlight.walks : void 0;\n if (drawable && lanes) {\n const laneWidth = walkLaneWidthPx(width, lanes.length);\n const thickness = laneHalfWidth(laneWidth);\n const frames = lines?.frames.get(nodeId);\n for (let lane = 0; lane < lanes.length; lane++) {\n const laneColor = lanes[lane].colors.get(nodeId);\n if (laneColor === void 0) {\n continue;\n }\n const onThreads = threads?.[lane]?.nodeThreads.get(nodeId) ?? ONE_PASS;\n for (const pass of onThreads) {\n const color2 = threadColor(lane, nodeId, pass) ?? laneColor;\n if (lanes.length === 1) {\n nodeStrokes.push({\n points: segments,\n thickness,\n color: color2,\n walk: lane,\n pass\n });\n continue;\n }\n const frame = frames?.[lane]?.[visitOf(lane, nodeId, pass)];\n const normals = laneNormalsOf(nodeId, segments, frame);\n const points = lanePointsOf(segments, frame);\n const plain = laneOffset(nodeId, laneWidth, lane, pass);\n const offsets = frame?.offsets?.map(\n (o) => o * thinned * worldPerScreenPx\n );\n const offsetX = offsets ? offsets[Math.floor(offsets.length / 2)] : threadOffsetAt(frame, 0, plain) * worldPerScreenPx;\n nodeStrokes.push({\n points: offsetPolyline(points, normals, offsets ?? offsetX, yToX),\n thickness,\n color: color2,\n walk: lane,\n pass,\n normals,\n offsetX,\n ...offsets && { offsets }\n });\n }\n }\n } else if (drawable && slots?.length && slotWidth >= MIN_PATH_STRIPE_PX) {\n const normals = pointNormalsOf(segments, yToX);\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_ALT_COLOR,\n REFERENCE_RAMP_ALT_CSS,\n rampFraction,\n computeReferenceRamp,\n computeColorSchemeRange,\n getNodeColor,\n endTangent,\n buildGeometry\n};\n", "import {\n REFERENCE_RAMP_ALT_COLOR,\n hslToRgb\n} from \"./chunk-NQPCXWVP.js\";\nimport {\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.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: \"orange\", label: \"Peach to rust\", ends: [\"#ffc285\", \"#8f3a00\"] },\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 const round = Math.floor(picked / FAMILIES.length) % SHADES.length;\n return field === \"walk\" && scheme === family && round > 0 ? { field, scheme, shade: SHADES[round] } : alone || field === \"walk\" ? { field, scheme } : { field, scheme, darkest: TOGETHER_DARKEST };\n}\nvar TOGETHER_DARKEST = 0.55;\nvar BASE_T = 0.5;\nvar SHADES = [BASE_T, 0.85, 0.2];\nvar STRETCH_GAP = 0.08;\nvar rampsOn = ({ field, scheme }) => field !== \"walk\" && scheme !== \"rainbow\";\nfunction splitFamilies(encodings) {\n const counts = /* @__PURE__ */ new Map();\n for (const e of encodings) {\n if (rampsOn(e)) {\n counts.set(e.scheme, (counts.get(e.scheme) ?? 0) + 1);\n }\n }\n const seen = /* @__PURE__ */ new Map();\n return encodings.map((e) => {\n const k = rampsOn(e) ? counts.get(e.scheme) : 1;\n if (k < 2) {\n return e;\n }\n const j = seen.get(e.scheme) ?? 0;\n seen.set(e.scheme, j + 1);\n const half = STRETCH_GAP / 2;\n return {\n ...e,\n stretch: [\n j / k + (j > 0 ? half : 0),\n (j + 1) / k - (j < k - 1 ? half : 0)\n ]\n };\n });\n}\nvar along = ({ stretch }, t) => stretch ? stretch[0] + (stretch[1] - stretch[0]) * t : t;\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}\nvar endsCache = /* @__PURE__ */ new Map();\nfunction oklabEnds(scheme) {\n if (!endsCache.has(scheme)) {\n const family = WALK_SCHEMES.find((s) => s.value === scheme);\n endsCache.set(\n scheme,\n family && \"ends\" in family ? family.ends.map(oklab) : void 0\n );\n }\n return endsCache.get(scheme);\n}\nfunction schemeRgb(scheme, t, darkest = 0) {\n const x = Math.max(0, Math.min(1, t));\n const ends = oklabEnds(scheme);\n if (!ends) {\n return hslToRgb(\n rampHueAt(x),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n ).map((c) => c * 255);\n }\n const [from, to] = ends;\n const light = from[0];\n const dark = to[0];\n const reach = dark < darkest && light > darkest ? (light - darkest) / (light - dark) : 1;\n return oklabToRgb(from.map((v, i) => v + (to[i] - v) * x * reach));\n}\nfunction schemeCss(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return `rgb(${r}, ${g}, ${b})`;\n}\nfunction schemeColor(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return packAbgr(r, g, b, 255);\n}\nfunction encodedColor(encoding, t) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n return field === \"walk\" ? schemeColor(scheme, shade) : t === void 0 ? NO_VALUE_COLOR : schemeColor(scheme, along(encoding, t), darkest);\n}\nvar NO_VALUE_COLOR = REFERENCE_RAMP_ALT_COLOR;\nfunction encodingStops(encoding) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n const stop = (offset, t) => ({\n offset,\n color: schemeCss(scheme, t, darkest),\n abgr: schemeColor(scheme, t, darkest)\n });\n return field === \"walk\" ? [stop(0, shade)] : Array.from({ length: 7 }, (_, i) => stop(i / 6, along(encoding, i / 6)));\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 splitFamilies,\n schemeRgb,\n schemeCss,\n schemeColor,\n encodedColor,\n NO_VALUE_COLOR,\n encodingStops,\n encodingSwatchCss\n};\n"],
|
|
3
|
+
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-YUIKEUKY.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-G2FD7S3C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-GQZVR5DW.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ZXOELYF3.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L4DBSRA2.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-KJHJF64Y.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-NO7LNPHJ.js"],
|
|
4
|
+
"sourcesContent": ["import {\n slideAt\n} from \"./chunk-JJV2GT2Z.js\";\n\n// src/renderer/walkLanes.ts\nvar THREAD_PX = 2;\nvar THREAD_GAP_PX = 1.5;\nvar SLOT_GAP_PX = 4;\nvar LANE_SMOOTHING_PX = 12;\nvar THREAD_REACH_PX = 64;\nvar THREAD_TAPER_PX = 24;\nvar MAX_BAND_PX = 48;\nvar PASSES_KEY = \"a thread per pass through a node\";\nvar threadsPasses = (walks) => walks.length > 1 && walks.some((w) => w.mostPasses > 1);\nvar threadsWidth = (threads) => threads * THREAD_PX + Math.max(0, threads - 1) * THREAD_GAP_PX;\nvar sum = (values) => values.reduce((a, b) => a + b, 0);\nfunction slotLayout(spans, mostPasses, laneWidth) {\n const widths = spans.map(\n (m, i) => mostPasses[i] > 1 ? threadsWidth(m) : laneWidth * Math.min(1, m)\n );\n let seen = 0;\n const gaps = spans.map((m) => {\n const share = Math.min(1, m);\n const gap = SLOT_GAP_PX * share * seen;\n seen = Math.max(seen, share);\n return gap;\n });\n return { widths, gaps, band: sum(widths) + sum(gaps) };\n}\nvar THREAD_PITCH_PX = THREAD_PX + THREAD_GAP_PX;\nfunction slotCentres(spans, mostPasses, held = spans) {\n const { widths, gaps, band } = slotLayout(spans, mostPasses, THREAD_PX);\n let at = -band / 2;\n return widths.map((width, i) => {\n at += gaps[i];\n const slack = mostPasses[i] > 1 ? Math.max(0, width - threadsWidth(held[i])) : 0;\n const centre = at + slack / 2 + THREAD_PX / 2;\n at += width;\n return centre;\n });\n}\nvar bandWidthPx = (mostPasses) => slotLayout(mostPasses, mostPasses, THREAD_PX).band;\nvar bandScale = (mostPasses) => Math.min(1, MAX_BAND_PX / (bandWidthPx(mostPasses) || 1));\nvar passesKey = (walks) => bandScale(walks.map((w) => w.mostPasses)) < 1 ? `${PASSES_KEY}, thinned to fit` : PASSES_KEY;\nfunction laneSlideAt(start, end, along) {\n const vector = ({ normal, offsetX: offsetX2 }) => ({\n dx: normal.nx * offsetX2,\n dy: normal.ny * offsetX2\n });\n const { dx, dy } = slideAt(vector(start), vector(end), along);\n const offsetX = Math.hypot(dx, dy);\n return offsetX > 0 ? { normal: { nx: dx / offsetX, ny: dy / offsetX }, offsetX } : { normal: { nx: 0, ny: 0 }, offsetX: 0 };\n}\nfunction pointIndex(run, p) {\n const i = run.stepOf[p];\n const k = p - run.starts[i];\n return run.forward[i] ? k : run.starts[i + 1] - run.starts[i] - 1 - k;\n}\nvar gapOf = (a, b) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\nfunction arcOf(run) {\n const s = new Float64Array(run.length);\n for (let i = 1; i < run.length; i++) {\n s[i] = s[i - 1] + gapOf(run[i - 1], run[i]);\n }\n return s;\n}\nfunction walkSteps(walkRoutes, nodePositions) {\n const seen = /* @__PURE__ */ new Set();\n return walkRoutes.map((routes) => {\n const visits = /* @__PURE__ */ new Map();\n return routes.map(\n (route) => route.map((id) => {\n const visit = visits.get(id) ?? 0;\n visits.set(id, visit + 1);\n const segments = nodePositions[id];\n const owned = !!segments?.length && !seen.has(id);\n if (owned) {\n seen.add(id);\n }\n return { id, visit, owned, segments };\n })\n );\n });\n}\nfunction laneRuns(steps, yToX, jump) {\n const runs = [];\n steps.forEach((pieces, walk) => {\n let total = 0;\n for (const piece of pieces) {\n for (const { segments } of piece) {\n total += segments?.length ?? 0;\n }\n }\n const xs = new Float64Array(total);\n const ys = new Float64Array(total);\n let at = 0;\n let from = 0;\n let run = fresh();\n function fresh() {\n return {\n walk,\n ids: [],\n visits: [],\n forward: [],\n owned: [],\n starts: [0]\n };\n }\n const breakRun = () => {\n if (run.ids.length) {\n const stepOf = new Int32Array(at - from);\n for (let i = 0; i < run.ids.length; i++) {\n stepOf.fill(i, run.starts[i], run.starts[i + 1]);\n }\n runs.push({\n ...run,\n xs: xs.subarray(from, at),\n ys: ys.subarray(from, at),\n stepOf\n });\n }\n run = fresh();\n from = at;\n };\n const gap = (x, y, p) => {\n const dx = p.x - x;\n const dy = p.y * yToX - y;\n return Math.sqrt(dx * dx + dy * dy);\n };\n for (const piece of pieces) {\n piece.forEach(({ id, visit, owned, segments }, k) => {\n if (!segments?.length) {\n breakRun();\n return;\n }\n const first = segments[0];\n const last = segments.at(-1);\n let forward;\n if (at > from) {\n const x = xs[at - 1];\n const y = ys[at - 1];\n const toFirst = gap(x, y, first);\n const toLast = gap(x, y, last);\n forward = toFirst <= toLast;\n if (Math.min(toFirst, toLast) > jump) {\n breakRun();\n }\n } else {\n const next = piece[k + 1]?.segments;\n const toNext = (p) => next?.length ? Math.min(\n gap(p.x, p.y * yToX, next[0]),\n gap(p.x, p.y * yToX, next.at(-1))\n ) : 0;\n forward = toNext(last) <= toNext(first);\n }\n run.ids.push(id);\n run.visits.push(visit);\n run.forward.push(forward);\n run.owned.push(owned);\n for (let j = 0; j < segments.length; j++) {\n const p = segments[forward ? j : segments.length - 1 - j];\n xs[at] = p.x;\n ys[at] = p.y * yToX;\n at++;\n }\n run.starts.push(at - from);\n });\n breakRun();\n }\n });\n return runs;\n}\nfunction ownedWindows(s, owned, margin) {\n const windows = [];\n for (let i = 0; i < owned.length; i++) {\n if (!owned[i]) {\n continue;\n }\n let j = i;\n while (j + 1 < owned.length && owned[j + 1]) {\n j++;\n }\n const last = windows.at(-1);\n const floor = last ? last[1] : 0;\n let lo = i;\n while (lo > floor && s[i] - s[lo - 1] <= margin) {\n lo--;\n }\n let hi = j;\n while (hi + 1 < s.length && s[hi + 1] - s[j] <= margin) {\n hi++;\n }\n if (last && lo <= last[1] + 1) {\n last[1] = hi;\n } else {\n windows.push([lo, hi]);\n }\n i = j;\n }\n return windows;\n}\nfunction smoothedNormals(run, reach) {\n const s = arcOf(run);\n const end = s.at(-1);\n const pointAt = (at, j) => {\n const a = run[j];\n const b = run[Math.min(j + 1, run.length - 1)];\n const span = s[Math.min(j + 1, run.length - 1)] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n return run.map((_, i) => {\n const back = Math.max(0, s[i] - reach / 2);\n const ahead = Math.min(end, s[i] + reach / 2);\n while (lo < run.length - 1 && s[lo + 1] <= back) {\n lo++;\n }\n while (hi < run.length - 1 && s[hi + 1] <= ahead) {\n hi++;\n }\n const a = pointAt(back, lo);\n const b = pointAt(ahead, hi);\n const len = gapOf(a, b);\n return len > 0 ? { nx: -(b.y - a.y) / len, ny: (b.x - a.x) / len } : void 0;\n });\n}\nfunction cutCurls(run, close, length) {\n const s = arcOf(run);\n const out = run.slice();\n const picks = [];\n s.forEach((at, k) => {\n const last = picks.at(-1);\n if (last === void 0 || at - s[last] >= close / 4) {\n picks.push(k);\n }\n });\n if (picks.at(-1) !== run.length - 1) {\n picks.push(run.length - 1);\n }\n let a = 0;\n while (a < picks.length) {\n const i = picks[a];\n let to = -1;\n for (let b = a + 1; b < picks.length && s[picks[b]] - s[i] <= length; b++) {\n const j2 = picks[b];\n if (s[j2] - s[i] > Math.PI * close && gapOf(run[i], run[j2]) <= close) {\n to = b;\n }\n }\n if (to < 0) {\n a++;\n continue;\n }\n const j = picks[to];\n const p = run[i];\n const q = run[j];\n for (let k = i + 1; k < j; k++) {\n const f = (s[k] - s[i]) / (s[j] - s[i]);\n out[k] = {\n ...run[k],\n x: p.x + (q.x - p.x) * f,\n y: p.y + (q.y - p.y) * f\n };\n }\n a = to;\n }\n return out;\n}\nfunction rounded(run, half) {\n const n = run.length;\n const s = arcOf(run);\n const end = s[n - 1];\n const sumW = new Float64Array(n + 1);\n const sumX = new Float64Array(n + 1);\n const sumY = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const w = (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2;\n sumW[i + 1] = sumW[i] + w;\n sumX[i + 1] = sumX[i] + w * p.x;\n sumY[i + 1] = sumY[i] + w * p.y;\n }\n const out = new Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const reach = Math.min(half, s[i], end - s[i]);\n const from = s[i] - reach;\n const to = s[i] + reach + 1e-9 * (1 + end);\n while (lo < n && s[lo] < from) {\n lo++;\n }\n while (hi < n && s[hi] < to) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? { x: (sumX[hi] - sumX[lo]) / w, y: (sumY[hi] - sumY[lo]) / w } : { x: p.x, y: p.y };\n }\n return out;\n}\nfunction tightPoints(line, radius) {\n const n = line.length;\n const s = arcOf(line);\n const end = s[n - 1];\n const tight = new Uint8Array(n);\n const along = (j, at) => {\n const a = line[j];\n const b = line[j + 1];\n if (!b) {\n return a;\n }\n const span = s[j + 1] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n if (s[i] < radius || end - s[i] < radius) {\n continue;\n }\n while (lo + 1 < n && s[lo + 1] <= s[i] - radius) {\n lo++;\n }\n while (hi + 1 < n && s[hi + 1] <= s[i] + radius) {\n hi++;\n }\n const p = line[i];\n const a = along(lo, s[i] - radius);\n const b = along(hi, s[i] + radius);\n const twice = Math.abs(\n (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x)\n );\n tight[i] = twice > 0 && gapOf(a, b) * gapOf(a, p) * gapOf(p, b) / (2 * twice) < radius ? 1 : 0;\n }\n return { tight, s };\n}\nfunction loosened(line, radius) {\n const out = line.slice();\n const { tight, s } = tightPoints(out, radius);\n let windows = ownedWindows(\n s,\n Array.from(tight, (t) => t > 0),\n 3 * radius\n );\n for (let pass = 0; pass < 8 && windows.length; pass++) {\n windows = windows.filter(([lo, hi]) => {\n const part = out.slice(lo, hi + 1);\n const local = tightPoints(part, radius);\n if (!local.tight.includes(1)) {\n return false;\n }\n const weight = windowMean(local.s, local.tight, radius);\n const smoother = rounded(part, radius);\n for (let k = 0; k < part.length; k++) {\n const w = Math.min(1, 3 * weight[k]);\n if (w > 0) {\n const p = part[k];\n const q = smoother[k];\n out[lo + k] = { x: p.x + (q.x - p.x) * w, y: p.y + (q.y - p.y) * w };\n }\n }\n return true;\n });\n }\n return out;\n}\nfunction runSigns(s, own, canonical, forward, settle, half) {\n const n = own.length;\n const agreement = new Float64Array(n);\n let hi = 0;\n let lo = 0;\n let sum2 = 0;\n let decided = 0;\n let pending = 0;\n for (let i = 0; i < n; i++) {\n while (hi < n && s[hi] - s[i] <= half) {\n const theirs = canonical(hi);\n const mine = own[hi];\n agreement[hi] = theirs && mine ? theirs.nx * mine.nx + theirs.ny * mine.ny : 0;\n sum2 += agreement[hi];\n hi++;\n }\n while (s[i] - s[lo] > half) {\n sum2 -= agreement[lo++];\n }\n if (Math.abs(sum2) > 1e-9) {\n decided = sum2 < 0 ? -1 : 1;\n }\n if (!decided) {\n continue;\n }\n for (; pending <= i; pending++) {\n settle(pending, decided);\n }\n }\n if (pending < n) {\n let along = 0;\n for (let k = 0; k < n; k++) {\n along += forward(k) ? 1 : -1;\n }\n for (; pending < n; pending++) {\n settle(pending, along < 0 ? -1 : 1);\n }\n }\n}\nfunction laneLines(runs, yToX, reach, band, smooth = true) {\n const turn = Math.max(reach, 2 * band);\n const curl = Math.PI * band;\n const context = smooth ? curl + 3 * band + turn / 2 : turn / 2;\n const frames = /* @__PURE__ */ new Map();\n const firsts = /* @__PURE__ */ new Map();\n const arcs = [];\n const stepFrames = [];\n const newFrame = (length) => ({\n normals: new Array(length),\n shifts: smooth ? new Array(length) : []\n });\n const place = (id, walk, visit, f) => {\n let byWalk = frames.get(id);\n if (!byWalk) {\n byWalk = [];\n frames.set(id, byWalk);\n }\n ;\n (byWalk[walk] ??= [])[visit] = f;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, owned, starts, xs, ys, stepOf } = run;\n const steps = ids.length;\n const n = xs.length;\n const own = new Array(steps);\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n own[i] = newFrame(starts[i + 1] - starts[i]);\n firsts.set(ids[i], { run: r, step: i, frame: own[i] });\n place(ids[i], walk, visits[i], own[i]);\n }\n }\n const raw = new Float64Array(n);\n for (let p = 1; p < n; p++) {\n const dx = xs[p] - xs[p - 1];\n const dy = ys[p] - ys[p - 1];\n raw[p] = raw[p - 1] + Math.sqrt(dx * dx + dy * dy);\n }\n const end = raw[n - 1];\n const firstRun = new Int32Array(steps).fill(-1);\n const firstStep = new Int32Array(steps);\n const firstFrame = new Array(steps);\n for (let i = 0; i < steps; i++) {\n const first = owned[i] ? void 0 : firsts.get(ids[i]);\n if (first) {\n firstRun[i] = first.run;\n firstStep[i] = first.step;\n firstFrame[i] = first.frame;\n }\n }\n const plus = new Int32Array(steps);\n const minus = new Int32Array(steps);\n for (let i = 0; i + 1 < steps; i++) {\n const same = firstRun[i] >= 0 && firstRun[i + 1] === firstRun[i];\n const d = same ? firstStep[i + 1] - firstStep[i] : 0;\n plus[i + 1] = plus[i] + (d === 1 ? 1 : 0);\n minus[i + 1] = minus[i] + (d === -1 ? 1 : 0);\n }\n const shared = new Array(steps);\n let reachFrom = 0;\n let reachTo = 0;\n for (let i = 0; i < steps; i++) {\n if (!smooth) {\n shared[i] = !owned[i];\n continue;\n }\n const from = raw[starts[i]] - context;\n const to = raw[starts[i + 1] - 1] + context;\n while (raw[reachFrom] < from) {\n reachFrom++;\n }\n while (reachTo + 1 < n && raw[reachTo + 1] <= to) {\n reachTo++;\n }\n const lo = stepOf[Math.max(0, reachFrom - 1)];\n const hi = stepOf[Math.min(n - 1, reachTo + 1)];\n const span = hi - lo;\n const forward = plus[hi] - plus[lo];\n const backward = minus[hi] - minus[lo];\n shared[i] = !owned[i] && from >= 0 && to <= end && span > 0 && (forward === span || backward === span);\n }\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n continue;\n }\n const first = firstFrame[i];\n own[i] = !smooth && shared[i] ? first : shared[i] ? { normals: first.normals, shifts: first.shifts } : newFrame(first.normals.length);\n place(ids[i], walk, visits[i], own[i]);\n }\n stepFrames.push(own);\n const apart = new Array(n);\n for (let p = 0; p < n; p++) {\n apart[p] = !shared[stepOf[p]];\n }\n for (const [from, to] of ownedWindows(raw, apart, context)) {\n const points = [];\n for (let p = from; p <= to; p++) {\n points.push({ x: xs[p], y: ys[p] });\n }\n const line = smooth ? loosened(\n rounded(cutCurls(points, band / 2, curl), band / 2),\n band / 2\n ) : points;\n const normals = smoothedNormals(line, turn);\n runSigns(\n arcOf(line),\n normals,\n (k) => {\n const i = stepOf[from + k];\n return (owned[i] ? own[i] : firstFrame[i])?.normals[pointIndex(run, from + k)];\n },\n (k) => run.forward[stepOf[from + k]],\n (k, sign) => {\n const p = from + k;\n const i = stepOf[p];\n if (shared[i]) {\n return;\n }\n const index = pointIndex(run, p);\n const m = normals[k];\n own[i].normals[index] = m && (sign > 0 ? m : { nx: -m.nx, ny: -m.ny });\n if (smooth) {\n own[i].shifts[index] = {\n dx: line[k].x - points[k].x,\n dy: (line[k].y - points[k].y) / yToX\n };\n }\n },\n turn\n );\n }\n if (!smooth) {\n arcs.push(raw);\n return;\n }\n const s = new Float64Array(n);\n let px = 0;\n let py = 0;\n for (let p = 0; p < n; p++) {\n const shift = own[stepOf[p]].shifts[pointIndex(run, p)];\n const x = xs[p] + (shift?.dx ?? 0);\n const y = ys[p] + (shift?.dy ?? 0) * yToX;\n s[p] = p ? s[p - 1] + Math.sqrt((x - px) ** 2 + (y - py) ** 2) : 0;\n px = x;\n py = y;\n }\n arcs.push(s);\n });\n return { frames, arcs, stepFrames };\n}\nfunction windowed(s, v, half, sign) {\n const out = new Array(v.length);\n const deque = [];\n let head = 0;\n let next = 0;\n for (let i = 0; i < v.length; i++) {\n while (next < v.length && s[next] - s[i] <= half) {\n while (deque.length > head && sign * v[deque.at(-1)] <= sign * v[next]) {\n deque.pop();\n }\n deque.push(next++);\n }\n while (s[i] - s[deque[head]] > half) {\n head++;\n }\n out[i] = v[deque[head]];\n }\n return out;\n}\nfunction windowMean(s, v, half, counted = () => true) {\n const n = v.length;\n const sumW = new Float64Array(n + 1);\n const sumWV = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const w = !counted(v[i]) ? 0 : n > 1 ? (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2 : 1;\n sumW[i + 1] = sumW[i] + w;\n sumWV[i + 1] = sumWV[i] + w * v[i];\n }\n const out = new Float64Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n while (s[i] - s[lo] > half) {\n lo++;\n }\n while (hi < n && s[hi] - s[i] <= half) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? (sumWV[hi] - sumWV[lo]) / w : v[i];\n }\n return out;\n}\nvar ONE_THREAD = [0];\nfunction repeats(passes) {\n for (const p of passes.values()) {\n if (p > 1) {\n return true;\n }\n }\n return false;\n}\nfunction walkThreads(route, passes, nodePositions, yToX, reach) {\n if (!repeats(passes)) {\n return {\n span: passes,\n nodeThreads: /* @__PURE__ */ new Map(),\n threadPasses: /* @__PURE__ */ new Map(),\n threadAt: /* @__PURE__ */ new Map(),\n linkThreads: /* @__PURE__ */ new Map()\n };\n }\n const index = /* @__PURE__ */ new Map();\n const ids = [];\n const widths = [];\n const visits = [];\n const steps = [];\n const stepVisits = [];\n const stepWants = [];\n const stepGlides = [];\n for (const piece of route) {\n const points = [];\n const nodes = [];\n for (const id of piece) {\n let k = index.get(id);\n if (k === void 0) {\n k = ids.length;\n index.set(id, k);\n ids.push(id);\n widths.push(0);\n visits.push(0);\n }\n nodes.push(k);\n const segments = nodePositions[id];\n const mid = segments?.[Math.floor(segments.length / 2)];\n points.push(\n mid ? { x: mid.x, y: mid.y * yToX } : points.at(-1) ?? { x: 0, y: 0 }\n );\n }\n const s = arcOf(points);\n const p = piece.map((id) => passes.get(id) ?? 1);\n const most = windowed(s, p, reach / 2, 1);\n const copy = nodes.map((k) => ++visits[k]);\n const n = piece.length;\n const before = new Int32Array(n);\n let last = -1;\n for (let i = 0; i < n; i++) {\n last = p[i] === most[i] ? i : last;\n before[i] = last;\n }\n const after = new Int32Array(n);\n last = -1;\n for (let i = n - 1; i >= 0; i--) {\n last = p[i] === most[i] ? i : last;\n after[i] = last;\n }\n const wants = new Array(n);\n const glides = new Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n const b = before[i];\n const a = after[i];\n const nearest = b < 0 ? a : a < 0 ? b : s[i] - s[b] <= s[a] - s[i] ? b : a;\n const want = (k) => Math.min(copy[k], most[i]) - 1;\n wants[i] = want(nearest);\n if (p[i] === 1 && b >= 0 && a >= 0 && want(a) !== want(b)) {\n const f = (s[i] - s[b]) / (s[a] - s[b] || 1);\n glides[i] = want(b) + (want(a) - want(b)) * f;\n }\n widths[nodes[i]] = Math.max(widths[nodes[i]], most[i]);\n }\n steps.push(nodes);\n stepVisits.push(copy);\n stepWants.push(wants);\n stepGlides.push(glides);\n }\n const taken = [];\n const threadOf = [];\n const free = (k, want) => {\n const width = widths[k];\n const own = taken[k] ??= /* @__PURE__ */ new Set();\n for (let d = 0; d < width; d++) {\n for (const c of [want - d, want + d]) {\n if (c >= 0 && c < width && !own.has(c)) {\n return c;\n }\n }\n }\n return want;\n };\n const glideOf = [];\n steps.forEach((nodes, piece) => {\n nodes.forEach((k, i) => {\n if (widths[k] > 1) {\n const glide = stepGlides[piece][i];\n const t = free(\n k,\n Number.isNaN(glide) ? stepWants[piece][i] : Math.round(glide)\n );\n taken[k].add(t);\n (threadOf[k] ??= [])[stepVisits[piece][i]] = t;\n if (!Number.isNaN(glide)) {\n ;\n (glideOf[k] ??= [])[t] = glide;\n }\n }\n });\n });\n const span = /* @__PURE__ */ new Map();\n const nodeThreads = /* @__PURE__ */ new Map();\n const threadPasses = /* @__PURE__ */ new Map();\n const threadAt = /* @__PURE__ */ new Map();\n ids.forEach((id, k) => {\n if (glideOf[k]) {\n threadAt.set(id, glideOf[k]);\n }\n span.set(id, widths[k]);\n nodeThreads.set(\n id,\n taken[k] ? [...taken[k]].sort((a, b) => a - b) : ONE_THREAD\n );\n const passOf = [];\n threadOf[k]?.forEach((thread, visit) => {\n passOf[thread] = visit - 1;\n });\n threadPasses.set(id, passOf);\n });\n const linkThreads = /* @__PURE__ */ new Map();\n steps.forEach((nodes, piece) => {\n const visit = stepVisits[piece];\n for (let i = 1; i < nodes.length; i++) {\n const from = nodes[i - 1];\n const to = nodes[i];\n const pair = [\n threadOf[from]?.[visit[i - 1]] ?? 0,\n threadOf[to]?.[visit[i]] ?? 0\n ];\n let ahead = linkThreads.get(ids[from]);\n if (!ahead) {\n ahead = /* @__PURE__ */ new Map();\n linkThreads.set(ids[from], ahead);\n }\n const list = ahead.get(ids[to]);\n if (!list) {\n ahead.set(ids[to], [pair]);\n } else if (!list.some(([a, b]) => a === pair[0] && b === pair[1])) {\n list.push(pair);\n }\n }\n });\n return { span, nodeThreads, threadPasses, threadAt, linkThreads };\n}\nfunction bandSpans(runs, arcs, spans, { reach, taper }) {\n const out = /* @__PURE__ */ new Map();\n runs.forEach((run, r) => {\n const s = arcs[r];\n const along = run.ids.map((_, i) => {\n const length = run.starts[i + 1] - run.starts[i];\n const middle = Math.floor(length / 2);\n return s[run.starts[i] + (run.forward[i] ? middle : length - 1 - middle)];\n });\n for (const [lo, hi] of ownedWindows(\n along,\n run.owned,\n reach / 2 + taper / 2\n )) {\n const at = along.slice(lo, hi + 1);\n const ids = run.ids.slice(lo, hi + 1);\n const eased = spans.map((own) => {\n const raw = ids.map((id) => own.get(id) ?? 0);\n return raw.every((v) => v === raw[0]) ? { slot: raw, held: raw } : {\n slot: windowMean(at, windowed(at, raw, reach / 2, 1), taper / 2),\n held: windowMean(at, raw, taper / 2, (v) => v > 0)\n };\n });\n ids.forEach((id, i) => {\n if (run.owned[lo + i]) {\n out.set(id, {\n slot: eased.map((e) => e.slot[i]),\n held: eased.map((e) => e.held[i])\n });\n }\n });\n }\n });\n return out;\n}\nfunction easeOffsets(runs, stepFrames, arcs, spans, passes, threads, half) {\n const plain = slotCentres(passes, passes);\n const byNode = /* @__PURE__ */ new Map();\n const centresAt = (id) => {\n let centres = byNode.get(id);\n if (!centres) {\n const own = spans.get(id);\n centres = own ? slotCentres(own.slot, passes, own.held) : plain;\n byNode.set(id, centres);\n }\n return centres;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, starts } = run;\n const { threadPasses, threadAt } = threads[walk];\n const raw = new Float64Array(run.xs.length);\n ids.forEach((id, i) => {\n const thread = Math.max(0, threadPasses.get(id)?.indexOf(visits[i]) ?? 0);\n const place = threadAt.get(id)?.[thread] ?? thread;\n raw.fill(\n centresAt(id)[walk] + place * THREAD_PITCH_PX,\n starts[i],\n starts[i + 1]\n );\n });\n const eased = windowMean(arcs[r], raw, half);\n stepFrames[r].forEach((frame, i) => {\n const from = starts[i];\n const to = starts[i + 1];\n let constant = true;\n for (let p = from + 1; constant && p < to; p++) {\n constant = Math.abs(eased[p] - eased[from]) < 1e-9;\n }\n if (constant) {\n frame.offset = eased[from];\n return;\n }\n const offsets = new Array(to - from);\n for (let p = from; p < to; p++) {\n offsets[pointIndex(run, p)] = eased[p];\n }\n frame.offsets = offsets;\n });\n });\n}\nfunction liftLanes(walks, nodePositions, yToX, worldPerScreenPx, steps = walkSteps(\n walks.map((w) => w.route),\n nodePositions\n)) {\n const threaded = threadsPasses(walks);\n const passes = walks.map((w) => w.mostPasses);\n const reach = THREAD_REACH_PX * worldPerScreenPx;\n const runs = laneRuns(steps, yToX, LANE_SMOOTHING_PX * worldPerScreenPx);\n const band = bandWidthPx(passes) * (threaded ? bandScale(passes) : 1) * worldPerScreenPx;\n const lines = laneLines(\n runs,\n yToX,\n LANE_SMOOTHING_PX * worldPerScreenPx,\n band,\n threaded\n );\n const threads = threaded ? walks.map((w) => walkThreads(w.route, w.passes, nodePositions, yToX, reach)) : void 0;\n const spans = threads ? bandSpans(\n runs,\n lines.arcs,\n threads.map((t) => t.span),\n { reach, taper: THREAD_TAPER_PX * worldPerScreenPx }\n ) : void 0;\n if (spans && threads) {\n easeOffsets(\n runs,\n lines.stepFrames,\n lines.arcs,\n spans,\n passes,\n threads,\n THREAD_TAPER_PX / 2 * worldPerScreenPx\n );\n }\n const furthestShift = { dx: 0, dy: 0 };\n const seenShifts = /* @__PURE__ */ new Set();\n for (const byWalk of lines.frames.values()) {\n for (const { shifts } of byWalk.flat()) {\n if (seenShifts.has(shifts)) {\n continue;\n }\n seenShifts.add(shifts);\n for (const shift of shifts) {\n furthestShift.dx = Math.max(furthestShift.dx, Math.abs(shift?.dx ?? 0));\n furthestShift.dy = Math.max(furthestShift.dy, Math.abs(shift?.dy ?? 0));\n }\n }\n }\n return { lines, threads, spans, furthestShift };\n}\n\nexport {\n THREAD_PX,\n THREAD_GAP_PX,\n SLOT_GAP_PX,\n LANE_SMOOTHING_PX,\n THREAD_REACH_PX,\n THREAD_TAPER_PX,\n MAX_BAND_PX,\n PASSES_KEY,\n threadsPasses,\n THREAD_PITCH_PX,\n slotCentres,\n bandWidthPx,\n bandScale,\n passesKey,\n laneSlideAt,\n walkSteps,\n laneRuns,\n laneLines,\n walkThreads,\n bandSpans,\n liftLanes\n};\n", "// 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 const t = Math.max(0, 1 - 1 / factor);\n const lift = (v) => Math.round(v + (255 - v) * t);\n return packAbgr(\n lift(abgrRed(c)),\n lift(abgrGreen(c)),\n lift(abgrBlue(c)),\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", "// src/referenceRampCss.ts\nvar REFERENCE_RAMP_MAX_HUE = 300;\nvar REFERENCE_RAMP_SATURATION = 0.7;\nvar REFERENCE_RAMP_LIGHTNESS = 0.5;\nfunction rampHueCss(hue) {\n return `hsl(${hue}, ${REFERENCE_RAMP_SATURATION * 100}%, ${REFERENCE_RAMP_LIGHTNESS * 100}%)`;\n}\nfunction rampHueAt(frac) {\n return Math.max(0, Math.min(1, frac)) * REFERENCE_RAMP_MAX_HUE;\n}\nfunction rampHue(bp, domain) {\n return rampHueAt((bp - domain.start) / (domain.end - domain.start));\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 REFERENCE_RAMP_MAX_HUE,\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS,\n rampHueCss,\n rampHueAt,\n rampHue,\n rampStops,\n RAMP_GRADIENT_STOPS,\n RAMP_GRADIENT_CSS\n};\n", "import {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n edgeCurvesOf\n} from \"./chunk-TJLERGAI.js\";\n\n// src/util/edgeCurves.ts\nvar cache = weakMemo();\nfunction baseEdgeCurves(nodePositions, graph, axis, deletions, version, routes, stranded = false) {\n return cache(\n nodePositions,\n [graph, axis.scaleX, axis.scaleY, deletions, routes, stranded, version],\n () => {\n const curves = /* @__PURE__ */ new Map();\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const bypassed = deletions?.get(ei);\n const edgeCurves = edgeCurvesOf(\n nodePositions,\n graph.edges[ei],\n axis,\n bypassed,\n bypassed && routes?.[ei],\n stranded\n );\n if (edgeCurves) {\n curves.set(ei, edgeCurves);\n }\n }\n return curves;\n }\n );\n}\n\nexport {\n baseEdgeCurves\n};\n", "import {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/referenceSpan.ts\nvar MAX_BACKBONE_HOPS = 4;\nfunction buildNeighbors(graph) {\n const neighbors = /* @__PURE__ */ new Map();\n for (const edge of graph.edges) {\n pushTo(neighbors, edge.from, edge.to);\n pushTo(neighbors, 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}\nfunction referencePositions(graph) {\n const positions = referenceMidpoints(graph);\n const neighbors = buildNeighbors(graph);\n let frontier = [...positions.keys()];\n while (frontier.length > 0) {\n const next = [];\n for (const id of frontier) {\n for (const neighborId of neighbors.get(id) ?? []) {\n if (!positions.has(neighborId)) {\n positions.set(neighborId, positions.get(id));\n next.push(neighborId);\n }\n }\n }\n frontier = next;\n }\n return positions;\n}\n\nexport {\n buildNeighbors,\n nodeReferenceSpan,\n referenceMidpoints,\n referencePositions\n};\n", "import {\n THREAD_PITCH_PX,\n THREAD_PX,\n bandScale,\n bandWidthPx,\n liftLanes,\n slotCentres,\n threadsPasses,\n walkSteps\n} from \"./chunk-YUIKEUKY.js\";\nimport {\n abgrToCssRgba,\n fadeAbgr,\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n PATH_LIGHTNESS,\n PATH_SATURATION,\n nameHue,\n pathHueAt\n} from \"./chunk-KKYPJITI.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.js\";\nimport {\n baseEdgeCurves\n} from \"./chunk-ZXOELYF3.js\";\nimport {\n nodeWidthPx,\n walkLaneWidthPx,\n widthNorm\n} from \"./chunk-XWH4LB56.js\";\nimport {\n referenceMidpoints\n} from \"./chunk-L4DBSRA2.js\";\nimport {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n dashSpans,\n pathRibbonOffsets,\n polylinePx,\n slideCurves,\n strandSides,\n translateCurves,\n yToXOf\n} from \"./chunk-JJV2GT2Z.js\";\nimport {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\nimport {\n busiestEdge,\n edgeWidthFactor\n} from \"./chunk-DAEEMZ74.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 MOVED_ALPHA = 0.45;\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_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, 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}\nvar FIRST_THREADS = [[0, 0]];\nvar ONE_PASS = [0];\nvar NO_SHIFT = { dx: 0, dy: 0 };\nfunction nearerStart(at, segments, yToX) {\n const gap = (p) => Math.hypot(p.x - at.x, (p.y - at.y) * yToX);\n return gap(segments[0]) < gap(segments.at(-1));\n}\nfunction leavesStart(edge, segments, first, stranded, yToX) {\n return stranded ? strandSides(edge).from === \"start\" : nearerStart({ x: first.x0, y: first.y0 }, segments, yToX);\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 normal(a, b) {\n if (!a || !b) {\n return void 0;\n }\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n return len > 0 ? { nx: -dy / len, ny: dx / len } : void 0;\n}\nvar MITRE_LIMIT = 0.1;\nvar LONGEST_NORMAL = 1 / Math.sqrt(MITRE_LIMIT);\nfunction pointNormalsOf(rawPoints, yToX = 1) {\n const points = yToX === 1 ? rawPoints : rawPoints.map((p) => ({ x: p.x, y: p.y * yToX }));\n return points.map((p, i) => {\n const before = normal(points[i - 1], p);\n const after = normal(p, points[i + 1]);\n if (before && after) {\n const nx = (before.nx + after.nx) / 2;\n const ny = (before.ny + after.ny) / 2;\n const dot = before.nx * nx + before.ny * ny;\n return dot > MITRE_LIMIT ? { nx: nx / dot, ny: ny / dot } : { nx, ny };\n }\n return before ?? after ?? { nx: 0, ny: 0 };\n });\n}\nfunction offsetPolyline(points, normals, distance, yToX = 1) {\n const out = new Array(points.length);\n for (let i = 0; i < points.length; i++) {\n const d = typeof distance === \"number\" ? distance : distance[i];\n out[i] = {\n x: points[i].x + normals[i].nx * d,\n y: points[i].y + normals[i].ny * d / yToX\n };\n }\n return out;\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}\nfunction packHsl(h, s, l, a = 1) {\n const [r, g, b] = hslToRgb(h, s, l);\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}\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 return packHsl(nameHue(str), PATH_SATURATION, PATH_LIGHTNESS, alpha);\n}\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 rampFraction(node, ramp) {\n const mid = ramp.midpoints.get(node.id);\n return isBackbone(node) && mid !== void 0 ? (mid - ramp.start) / ramp.span : void 0;\n}\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, referenceRamp) {\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 referenceRamp\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, so only the backbone takes a hue\n case \"reference-position\": {\n const ramp = range.referenceRamp;\n if (ramp === void 0) {\n return packAbgr(160, 160, 160, 255);\n }\n const t = rampFraction(node, ramp);\n return t === void 0 ? REFERENCE_RAMP_ALT_COLOR : packHsl(\n rampHueAt(t),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n );\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 return packHsl(hue, 0.75, 0.5);\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, growX = 0, growY = 0) {\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 - growX && cMinX <= bounds.maxX + growX && cMaxY >= bounds.minY - growY && cMinY <= bounds.maxY + growY) {\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 pathColorByIndex.push(\n packHsl(\n pathHueAt(i, paths.length),\n PATH_SATURATION,\n PATH_LIGHTNESS,\n 0.85\n )\n );\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 pushTo(slots, nodeId, pathIdx);\n }\n }\n slotsCache.set(graph, slots);\n }\n return slots;\n}\nvar lanesCache = weakMemo();\nvar stepsCache = weakMemo();\nvar linksCache = /* @__PURE__ */ new WeakMap();\nfunction linksOf(graph) {\n let links = linksCache.get(graph);\n if (!links) {\n links = /* @__PURE__ */ new Map();\n for (const { from, to } of graph.edges) {\n let out = links.get(from);\n if (!out) {\n out = /* @__PURE__ */ new Set();\n links.set(from, out);\n }\n out.add(to);\n }\n linksCache.set(graph, links);\n }\n return links;\n}\nfunction buildGeometry(options) {\n const {\n nodePositions,\n graph,\n nodeById,\n colorScheme,\n contigThickness,\n connectorThickness,\n drawPaths,\n nodeWidth = \"uniform\",\n edgeWidth = \"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 widthScale = widthNorm(graph, nodeWidth);\n const busiest = edgeWidth === \"walks\" ? busiestEdge(graph) : 0;\n const scale = axis.scaleX;\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\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 liftedWalks = highlight?.walks ?? [];\n const threaded = threadsPasses(liftedWalks);\n const lanePasses = liftedWalks.map((w) => w.mostPasses);\n const thinned = threaded ? bandScale(lanePasses) : 1;\n const fields = highlight && liftedWalks.length > 1 ? lanesCache(\n highlight,\n [nodePositions, version, axis.scaleX, axis.scaleY],\n () => liftLanes(\n liftedWalks,\n nodePositions,\n yToX,\n worldPerScreenPx,\n stepsCache(\n highlight,\n [nodePositions, version],\n () => walkSteps(\n liftedWalks.map((w) => w.route),\n nodePositions\n )\n )\n )\n ) : void 0;\n const lines = fields?.lines;\n const threads = fields?.threads;\n const spanField = fields?.spans;\n const plainCentres = threaded ? slotCentres(lanePasses, lanePasses) : [];\n const centresByNode = /* @__PURE__ */ new Map();\n const centresOf = (nodeId) => {\n let centres = centresByNode.get(nodeId);\n if (!centres) {\n const spans = spanField?.get(nodeId);\n centres = spans ? slotCentres(spans.slot, lanePasses, spans.held) : plainCentres;\n centresByNode.set(nodeId, centres);\n }\n return centres;\n };\n const laneOffset = (nodeId, laneWidth, lane, pass) => threaded ? (centresOf(nodeId)[lane] + pass * THREAD_PITCH_PX) * thinned : (lane - (liftedWalks.length - 1) / 2) * laneWidth;\n const threadOffsetAt = (frame, at, fallback) => {\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return eased === void 0 ? fallback : eased * thinned;\n };\n const laneHalfWidth = (laneWidth) => threaded ? THREAD_PX / 2 * thinned : laneWidth / 2;\n const plainNormals = /* @__PURE__ */ new Map();\n const visitNormals = /* @__PURE__ */ new WeakMap();\n const visitOf = (lane, nodeId, thread) => threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0;\n const plainNormalsOf = (nodeId, segments) => {\n let normals = plainNormals.get(nodeId);\n if (!normals) {\n normals = pointNormalsOf(segments, yToX);\n plainNormals.set(nodeId, normals);\n }\n return normals;\n };\n const laneNormalsOf = (nodeId, segments, frame) => {\n if (!frame) {\n return plainNormalsOf(nodeId, segments);\n }\n let normals = visitNormals.get(frame.normals);\n if (!normals) {\n normals = plainNormalsOf(nodeId, segments).map(\n (n, i) => frame.normals[i] ?? n\n );\n visitNormals.set(frame.normals, normals);\n }\n return normals;\n };\n const laneWidths = /* @__PURE__ */ new Map();\n const laneWidthOf = (id) => {\n let width = laneWidths.get(id);\n if (width === void 0) {\n const node = nodeById.get(id);\n width = walkLaneWidthPx(\n node ? nodeWidthPx(node, contigThickness, nodeWidth, widthScale) : contigThickness,\n liftedWalks.length\n );\n laneWidths.set(id, width);\n }\n return width;\n };\n const laneEndOf = (id, frames, segments, atStart, lane, thread) => {\n const at = atStart ? 0 : segments.length - 1;\n const frame = frames?.[lane]?.[visitOf(lane, id, thread)];\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return {\n normal: frame?.normals[at] ?? plainNormalsOf(id, segments)[at] ?? { nx: 0, ny: 0 },\n shift: frame?.shifts[at] ?? NO_SHIFT,\n offset: eased === void 0 ? laneOffset(id, laneWidthOf(id), lane, thread) : eased * thinned\n };\n };\n const lanesMayShow = (curves, fromId) => {\n if (!viewportBounds) {\n return true;\n }\n const offset = threaded ? bandWidthPx(lanePasses) * thinned : (liftedWalks.length - 1) / 2 * laneWidthOf(fromId);\n const reach = LONGEST_NORMAL * offset * worldPerScreenPx;\n return isBezierInBounds(\n curves,\n viewportBounds,\n reach + (fields?.furthestShift.dx ?? 0),\n reach / yToX + (fields?.furthestShift.dy ?? 0)\n );\n };\n const threadPairs = (lane, from, to) => {\n const own = threads?.[lane]?.linkThreads;\n if (!own?.size) {\n return FIRST_THREADS;\n }\n const ahead = own.get(from)?.get(to);\n const back = linksOf(graph).get(to)?.has(from) ? void 0 : own.get(to)?.get(from);\n if (!back) {\n return ahead ?? FIRST_THREADS;\n }\n const turned = back.map(([a, b]) => [b, a]);\n return ahead ? [...ahead, ...turned] : turned;\n };\n const threadColor = (lane, nodeId, thread) => liftedWalks[lane]?.passColors.get(nodeId)?.[threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0];\n const visitPoints = /* @__PURE__ */ new WeakMap();\n const lanePointsOf = (segments, frame) => {\n if (!frame || !threaded) {\n return segments;\n }\n let points = visitPoints.get(frame.shifts);\n if (!points) {\n const { shifts } = frame;\n points = segments.map((p, i) => {\n const { dx, dy } = shifts[i] ?? NO_SHIFT;\n return { ...p, x: p.x + dx, y: p.y + dy };\n });\n visitPoints.set(frame.shifts, points);\n }\n return points;\n };\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 ribbonThickness = connectorThickness / 2 * (isDeletion ? DELETION_THICKNESS_FACTOR : 1);\n const walkFactor = edgeWidthFactor(numPaths, busiest, edgeWidth);\n const edgeThickness = connectorThickness / 2 * (!isDeletion ? walkFactor : edgeWidth === \"walks\" && busiest > 0 ? Math.max(1, walkFactor) : DELETION_THICKNESS_FACTOR);\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, widthScale) : contigThickness) / 2;\n const inView = (curves) => !viewportBounds || isBezierInBounds(curves, viewportBounds);\n const dashesOf = (curves) => dashSpans(curves, DELETION_DASH_PX / scale, yToX, viewportBounds);\n const stroke = (curves, thickness, color) => {\n if (!isDeletion) {\n edgeCurves.push({ curves, thickness, color });\n return;\n }\n for (const dash of dashesOf(curves)) {\n edgeCurves.push({ curves: dash.curves, thickness, color });\n }\n };\n const laneStroke = (curves, thickness, color, walk, pass, normal2, offsetX, endNormal, endOffsetX) => {\n edgeCurves.push({\n curves,\n thickness,\n color,\n walk,\n pass,\n normal: normal2,\n offsetX,\n endNormal,\n endOffsetX\n });\n };\n const arrowOn = (curves) => {\n const head = showArrows ? arrowheadFor({\n curves,\n edgeHalfWidth: isDeletion || ribbons ? connectorThickness / 2 : edgeThickness,\n nodeHalfWidth: intoHalfWidth,\n scale,\n yToX,\n color: edgeColor,\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?.walks.length && onWalk && !ribbons ? highlight.walks : void 0;\n if (laneWalks && !lanesMayShow(baseCurves, edge.from)) {\n continue;\n }\n if (laneWalks) {\n const fromAtStart = leavesStart(\n edge,\n fromSegments,\n baseCurves[0],\n stranded,\n yToX\n );\n const last = baseCurves.at(-1);\n const toAtStart = nearerStart(\n { x: last.x1, y: last.y1 },\n toSegments,\n yToX\n );\n const single = laneWalks.length === 1;\n const thickness = laneHalfWidth(laneWidthOf(edge.from));\n const fromFrames = lines?.frames.get(edge.from);\n const toFrames = lines?.frames.get(edge.to);\n for (let lane = 0; lane < laneWalks.length; lane++) {\n const walk = laneWalks[lane];\n if (!walk.edgeIndexes.has(ei)) {\n continue;\n }\n for (const [pass, toPass] of threadPairs(lane, edge.from, edge.to)) {\n const from = laneEndOf(\n edge.from,\n fromFrames,\n fromSegments,\n fromAtStart,\n lane,\n pass\n );\n const to = threaded ? laneEndOf(edge.to, toFrames, toSegments, toAtStart, lane, toPass) : from;\n const offsetX = single ? 0 : from.offset * worldPerScreenPx;\n const endOffsetX = threaded ? to.offset * worldPerScreenPx : offsetX;\n const curves = threaded ? slideCurves(\n baseCurves,\n from.shift.dx + from.normal.nx * offsetX,\n from.shift.dy + from.normal.ny * offsetX / yToX,\n to.shift.dx + to.normal.nx * endOffsetX,\n to.shift.dy + to.normal.ny * endOffsetX / yToX\n ) : offsetX === 0 ? baseCurves : translateCurves(\n baseCurves,\n from.normal.nx * offsetX,\n from.normal.ny * offsetX / yToX\n );\n if (inView(curves)) {\n laneStroke(\n curves,\n thickness,\n threadColor(lane, edge.from, pass) ?? threadColor(lane, edge.to, toPass) ?? plainEdgeColor,\n lane,\n pass,\n from.normal,\n offsetX,\n to.normal,\n endOffsetX\n );\n }\n }\n }\n if (edgeCurves.length > edgeCurveStart) {\n arrowOn(baseCurves);\n }\n } else if (!ribbons) {\n if (inView(baseCurves)) {\n stroke(baseCurves, edgeThickness, edgeColor);\n arrowOn(baseCurves);\n }\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 { x, y } = offsets[pathIdx];\n const curves = x === 0 && y === 0 ? baseCurves : translateCurves(baseCurves, x, y);\n if (!inView(curves)) {\n continue;\n }\n const ribbonColor = pathColorByName(edge.pathIds[pathIdx]);\n stroke(\n curves,\n ribbonThickness,\n highlight && (highlight.walks.length ? !highlight.names.has(edge.pathIds[pathIdx]) : !onWalk) ? fadeAbgr(ribbonColor, FADED_ALPHA) : ribbonColor\n );\n if (pathIdx === arrowRibbon) {\n arrowOn(curves);\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) : node.moved ? fadeAbgr(own, MOVED_ALPHA) : own;\n const width = nodeWidthPx(node, contigThickness, nodeWidth, widthScale);\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?.walks.length && !faded && !slots?.length ? highlight.walks : void 0;\n if (drawable && lanes) {\n const laneWidth = walkLaneWidthPx(width, lanes.length);\n const thickness = laneHalfWidth(laneWidth);\n const frames = lines?.frames.get(nodeId);\n for (let lane = 0; lane < lanes.length; lane++) {\n const laneColor = lanes[lane].colors.get(nodeId);\n if (laneColor === void 0) {\n continue;\n }\n const onThreads = threads?.[lane]?.nodeThreads.get(nodeId) ?? ONE_PASS;\n for (const pass of onThreads) {\n const color2 = threadColor(lane, nodeId, pass) ?? laneColor;\n if (lanes.length === 1) {\n nodeStrokes.push({\n points: segments,\n thickness,\n color: color2,\n walk: lane,\n pass\n });\n continue;\n }\n const frame = frames?.[lane]?.[visitOf(lane, nodeId, pass)];\n const normals = laneNormalsOf(nodeId, segments, frame);\n const points = lanePointsOf(segments, frame);\n const plain = laneOffset(nodeId, laneWidth, lane, pass);\n const offsets = frame?.offsets?.map(\n (o) => o * thinned * worldPerScreenPx\n );\n const offsetX = offsets ? offsets[Math.floor(offsets.length / 2)] : threadOffsetAt(frame, 0, plain) * worldPerScreenPx;\n nodeStrokes.push({\n points: offsetPolyline(points, normals, offsets ?? offsetX, yToX),\n thickness,\n color: color2,\n walk: lane,\n pass,\n normals,\n offsetX,\n ...offsets && { offsets }\n });\n }\n }\n } else if (drawable && slots?.length && slotWidth >= MIN_PATH_STRIPE_PX) {\n const normals = pointNormalsOf(segments, yToX);\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_ALT_COLOR,\n REFERENCE_RAMP_ALT_CSS,\n rampFraction,\n computeReferenceRamp,\n computeColorSchemeRange,\n getNodeColor,\n endTangent,\n buildGeometry\n};\n", "import {\n REFERENCE_RAMP_ALT_COLOR,\n hslToRgb\n} from \"./chunk-KJHJF64Y.js\";\nimport {\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.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: \"orange\", label: \"Peach to rust\", ends: [\"#ffc285\", \"#8f3a00\"] },\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 const round = Math.floor(picked / FAMILIES.length) % SHADES.length;\n return field === \"walk\" && scheme === family && round > 0 ? { field, scheme, shade: SHADES[round] } : alone || field === \"walk\" ? { field, scheme } : { field, scheme, darkest: TOGETHER_DARKEST };\n}\nvar TOGETHER_DARKEST = 0.55;\nvar BASE_T = 0.5;\nvar SHADES = [BASE_T, 0.85, 0.2];\nvar STRETCH_GAP = 0.08;\nvar rampsOn = ({ field, scheme }) => field !== \"walk\" && scheme !== \"rainbow\";\nfunction splitFamilies(encodings) {\n const counts = /* @__PURE__ */ new Map();\n for (const e of encodings) {\n if (rampsOn(e)) {\n counts.set(e.scheme, (counts.get(e.scheme) ?? 0) + 1);\n }\n }\n const seen = /* @__PURE__ */ new Map();\n return encodings.map((e) => {\n const k = rampsOn(e) ? counts.get(e.scheme) : 1;\n if (k < 2) {\n return e;\n }\n const j = seen.get(e.scheme) ?? 0;\n seen.set(e.scheme, j + 1);\n const half = STRETCH_GAP / 2;\n return {\n ...e,\n stretch: [\n j / k + (j > 0 ? half : 0),\n (j + 1) / k - (j < k - 1 ? half : 0)\n ]\n };\n });\n}\nvar along = ({ stretch }, t) => stretch ? stretch[0] + (stretch[1] - stretch[0]) * t : t;\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}\nvar endsCache = /* @__PURE__ */ new Map();\nfunction oklabEnds(scheme) {\n if (!endsCache.has(scheme)) {\n const family = WALK_SCHEMES.find((s) => s.value === scheme);\n endsCache.set(\n scheme,\n family && \"ends\" in family ? family.ends.map(oklab) : void 0\n );\n }\n return endsCache.get(scheme);\n}\nfunction schemeRgb(scheme, t, darkest = 0) {\n const x = Math.max(0, Math.min(1, t));\n const ends = oklabEnds(scheme);\n if (!ends) {\n return hslToRgb(\n rampHueAt(x),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n ).map((c) => c * 255);\n }\n const [from, to] = ends;\n const light = from[0];\n const dark = to[0];\n const reach = dark < darkest && light > darkest ? (light - darkest) / (light - dark) : 1;\n return oklabToRgb(from.map((v, i) => v + (to[i] - v) * x * reach));\n}\nfunction schemeCss(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return `rgb(${r}, ${g}, ${b})`;\n}\nfunction schemeColor(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return packAbgr(r, g, b, 255);\n}\nfunction encodedColor(encoding, t) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n return field === \"walk\" ? schemeColor(scheme, shade) : t === void 0 ? NO_VALUE_COLOR : schemeColor(scheme, along(encoding, t), darkest);\n}\nvar NO_VALUE_COLOR = REFERENCE_RAMP_ALT_COLOR;\nfunction encodingStops(encoding) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n const stop = (offset, t) => ({\n offset,\n color: schemeCss(scheme, t, darkest),\n abgr: schemeColor(scheme, t, darkest)\n });\n return field === \"walk\" ? [stop(0, shade)] : Array.from({ length: 7 }, (_, i) => stop(i / 6, along(encoding, i / 6)));\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 splitFamilies,\n schemeRgb,\n schemeCss,\n schemeColor,\n encodedColor,\n NO_VALUE_COLOR,\n encodingStops,\n encodingSwatchCss\n};\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["THREAD_PX", "THREAD_GAP_PX", "SLOT_GAP_PX", "LANE_SMOOTHING_PX", "THREAD_REACH_PX", "THREAD_TAPER_PX", "MAX_BAND_PX", "PASSES_KEY", "threadsPasses", "walks", "w", "threadsWidth", "threads", "sum", "values", "a", "b", "slotLayout", "spans", "mostPasses", "laneWidth", "widths", "m", "i", "seen", "gaps", "share", "gap", "THREAD_PITCH_PX", "slotCentres", "held", "band", "at", "width", "slack", "centre", "bandWidthPx", "bandScale", "passesKey", "pointIndex", "run", "p", "i", "k", "gapOf", "a", "b", "dx", "dy", "arcOf", "s", "walkSteps", "walkRoutes", "nodePositions", "seen", "routes", "visits", "route", "id", "visit", "segments", "owned", "laneRuns", "steps", "yToX", "jump", "runs", "pieces", "walk", "total", "piece", "xs", "ys", "at", "from", "fresh", "breakRun", "stepOf", "gap", "x", "y", "first", "last", "forward", "toFirst", "toLast", "next", "toNext", "j", "ownedWindows", "margin", "windows", "floor", "lo", "hi", "smoothedNormals", "reach", "end", "pointAt", "span", "f", "_", "back", "ahead", "len", "cutCurls", "close", "length", "out", "picks", "to", "j2", "q", "rounded", "half", "n", "sumW", "sumX", "sumY", "w", "tightPoints", "line", "radius", "tight", "along", "twice", "loosened", "t", "pass", "part", "local", "weight", "windowMean", "smoother", "runSigns", "own", "canonical", "settle", "agreement", "sum2", "decided", "pending", "theirs", "mine", "laneLines", "band", "smooth", "turn", "curl", "context", "frames", "firsts", "arcs", "stepFrames", "newFrame", "place", "byWalk", "r", "ids", "starts", "raw", "firstRun", "firstStep", "firstFrame", "plus", "minus", "d", "shared", "reachFrom", "reachTo", "backward", "apart", "points", "normals", "sign", "index", "m", "px", "py", "shift", "windowed", "v", "deque", "head", "counted", "sumWV", "ONE_THREAD", "repeats", "passes", "walkThreads", "widths", "stepVisits", "stepWants", "stepGlides", "nodes", "mid", "most", "copy", "before", "after", "wants", "glides", "nearest", "want", "taken", "threadOf", "free", "width", "c", "glideOf", "glide", "nodeThreads", "threadPasses", "threadAt", "passOf", "thread", "linkThreads", "pair", "list", "bandSpans", "spans", "taper", "middle", "eased", "e", "easeOffsets", "threads", "plain", "slotCentres", "byNode", "centresAt", "centres", "THREAD_PITCH_PX", "frame", "constant", "offsets", "liftLanes", "walks", "worldPerScreenPx", "threaded", "threadsPasses", "THREAD_REACH_PX", "LANE_SMOOTHING_PX", "bandWidthPx", "bandScale", "lines", "THREAD_TAPER_PX", "furthestShift", "seenShifts", "shifts", "packAbgr", "r", "g", "b", "a", "abgrRed", "c", "abgrGreen", "abgrBlue", "abgrAlpha", "abgrToCssRgba", "normalizedRgbToCssRgba", "alpha", "fadeAbgr", "brightenAbgr", "factor", "t", "lift", "v", "REFERENCE_RAMP_MAX_HUE", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "rampHueCss", "hue", "rampHueAt", "frac", "rampHue", "bp", "domain", "HUE_STOP_DEG", "rampStops", "start", "reversed", "low", "high", "n", "_", "RAMP_GRADIENT_STOPS", "i", "RAMP_GRADIENT_CSS", "s", "cache", "weakMemo", "baseEdgeCurves", "nodePositions", "graph", "axis", "deletions", "version", "routes", "stranded", "curves", "ei", "bypassed", "edgeCurves", "edgeCurvesOf", "MAX_BACKBONE_HOPS", "buildNeighbors", "graph", "neighbors", "edge", "pushTo", "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", "MOVED_ALPHA", "LIFT_BACKDROP_CSS", "abgrToCssRgba", "fadeAbgr", "DELETION_DASH_PX", "MIN_PATH_STRIPE_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", "c", "k", "t", "a", "b", "d", "e", "x", "y", "walkPointAt", "i", "from", "to", "f", "arrowheadFor", "edgeHalfWidth", "nodeHalfWidth", "color", "fromSegments", "toSegments", "length", "lengthPx", "abutting", "inset", "fit", "polylinePx", "tip", "base", "dx", "dy", "endTangent", "intoDirection", "FIRST_THREADS", "ONE_PASS", "NO_SHIFT", "nearerStart", "at", "segments", "gap", "p", "leavesStart", "edge", "first", "stranded", "strandSides", "final", "normal", "len", "MITRE_LIMIT", "LONGEST_NORMAL", "pointNormalsOf", "rawPoints", "points", "before", "after", "nx", "ny", "dot", "offsetPolyline", "normals", "distance", "out", "hslToRgb", "h", "s", "l", "m", "r", "g", "packHsl", "DEPTH_GRADIENT", "STABLE_RANK_GRADIENT", "NODE_LENGTH_GRADIENT", "sampleGradient", "stops", "pos", "hashColor", "str", "alpha", "nameHue", "PATH_SATURATION", "PATH_LIGHTNESS", "REFERENCE_RAMP_ALT_RGB", "REFERENCE_RAMP_ALT_COLOR", "REFERENCE_RAMP_ALT_CSS", "rampFraction", "node", "ramp", "mid", "isBackbone", "computeReferenceRamp", "graph", "domain", "midpoints", "referenceMidpoints", "min", "max", "computeColorSchemeRange", "referenceRamp", "minDepth", "maxDepth", "minLength", "maxLength", "maxRank", "getNodeColor", "nodeIndex", "colorScheme", "range", "rampHueAt", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "hue", "into", "candidates", "isPolylineInBounds", "bounds", "hit", "isBezierInBounds", "growX", "growY", "cMinX", "cMaxX", "cMinY", "cMaxY", "paletteCache", "pathPaletteOf", "palette", "pathColorByIndex", "pathIndexByName", "paths", "pathHueAt", "slotsCache", "NO_SLOTS", "pathSlotsOf", "slots", "pathIdx", "path", "nodeId", "pushTo", "lanesCache", "weakMemo", "stepsCache", "linksCache", "linksOf", "links", "buildGeometry", "options", "nodePositions", "nodeById", "contigThickness", "connectorThickness", "drawPaths", "nodeWidth", "edgeWidth", "highlight", "axis", "linearLayout", "viewportBounds", "deletions", "deletionRoutes", "hiddenEdges", "version", "widthScale", "widthNorm", "busiest", "busiestEdge", "worldPerScreenPx", "yToXOf", "sharedCurves", "baseEdgeCurves", "nodeStrokes", "nodeStrokeRuns", "arrows", "arrowRuns", "edgeCurves", "edgeCurveRuns", "colorRange", "nodeIndexMap", "pathCount", "pathColorByName", "name", "nodePathSlots", "liftedWalks", "threaded", "threadsPasses", "lanePasses", "w", "thinned", "bandScale", "fields", "liftLanes", "walkSteps", "lines", "threads", "spanField", "plainCentres", "slotCentres", "centresByNode", "centresOf", "centres", "spans", "laneOffset", "laneWidth", "lane", "pass", "THREAD_PITCH_PX", "threadOffsetAt", "frame", "fallback", "eased", "laneHalfWidth", "THREAD_PX", "plainNormals", "visitNormals", "visitOf", "thread", "plainNormalsOf", "laneNormalsOf", "laneWidths", "laneWidthOf", "id", "width", "walkLaneWidthPx", "nodeWidthPx", "laneEndOf", "frames", "atStart", "lanesMayShow", "fromId", "offset", "bandWidthPx", "reach", "threadPairs", "own", "ahead", "back", "turned", "threadColor", "visitPoints", "lanePointsOf", "shifts", "showArrows", "ei", "baseCurves", "numPaths", "isDeletion", "onWalk", "ribbonThickness", "walkFactor", "edgeWidthFactor", "edgeThickness", "ribbons", "plainEdgeColor", "edgeColor", "toNode", "intoHalfWidth", "inView", "dashesOf", "dashSpans", "stroke", "thickness", "dash", "laneStroke", "walk", "normal2", "offsetX", "endNormal", "endOffsetX", "arrowOn", "head", "edgeCurveStart", "arrowStart", "laneWalks", "fromAtStart", "toAtStart", "single", "fromFrames", "toFrames", "toPass", "slideCurves", "translateCurves", "offsets", "pathRibbonOffsets", "arrowRibbon", "ribbonColor", "edgeCurveCount", "arrowCount", "faded", "nodeThickness", "start", "slotWidth", "drawable", "lanes", "laneColor", "onThreads", "color2", "plain", "o", "slot", "stripe", "count", "WALK_FIELDS", "WALK_SCHEMES", "FAMILIES", "isField", "v", "f", "isScheme", "s", "resolveEncoding", "layer", "reference", "picked", "alone", "askedField", "askedScheme", "field", "family", "scheme", "round", "SHADES", "TOGETHER_DARKEST", "BASE_T", "STRETCH_GAP", "rampsOn", "splitFamilies", "encodings", "counts", "seen", "k", "j", "half", "along", "stretch", "t", "toLinear", "c", "toGamma", "oklab", "hex", "r", "g", "b", "i", "l", "m", "oklabToRgb", "L", "a", "endsCache", "oklabEnds", "schemeRgb", "darkest", "x", "ends", "hslToRgb", "rampHueAt", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "from", "to", "light", "dark", "reach", "schemeCss", "schemeColor", "packAbgr", "encodedColor", "encoding", "shade", "NO_VALUE_COLOR", "REFERENCE_RAMP_ALT_COLOR", "encodingStops", "stop", "offset", "_"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as F}from"./chunk-TMM73K4C.js";import{a as p,b as d,c as y,d as T,h as r,i as g,j as f}from"./chunk-6VNDP3UB.js";import{a as I}from"./chunk-D6TY2QEG.js";var W=5e3;function G(e){return typeof e=="string"&&/^[\w+-][\w.+-]*$/.test(e)}function k(e){return e==null}function M(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function L(e){return M(e)&&G(e.prefix)&&typeof e.foldBelowBp=="number"&&Number.isFinite(e.foldBelowBp)&&e.foldBelowBp>0}function P(e){let n;try{n=JSON.parse(e)}catch{return}if(!M(n)||n.schema!==1)return;let{reference:t,tier:i,index:a,contig:o,bubbles:s,alleles:l}=n;if((k(t)||typeof t=="string"&&t.trim()!=="")&&(k(i)||L(i))&&[a,o,s,l].every(A=>k(A)||G(A)))return{...typeof t=="string"?{reference:t.trim()}:{},...L(i)?{tier:{prefix:i.prefix,foldBelowBp:i.foldBelowBp,...i.format===2?{format:2}:{}}}:{}}}function b(e,n){return f(e,t=>t.replace(/[^/\\]*$/,n))}function R(e){let n=r(e);return[p,d].find(t=>n.endsWith(t))}function N(e){return g(e)&&R(e)!==void 0}function B(e,n){let t=R(e)??p;return f(e,i=>`${i.slice(0,-t.length)}${n}`)}function _(e){return N(e)?B(e,".graph.json"):void 0}async function j(e,n){let t=_(e);if(t)try{let i=await I(t,n).readFile({encoding:"utf8",signal:AbortSignal.timeout(W)});return P(i)}catch{return}}var J={RgfaTabixAdapter:"Indexed GFA (gfa-to-tabix .segs.bed.gz or .graph.bed.gz)",RgfaTabixWalks:"Haplotype walks without lanes (.walks.bed.gz)",WalkTabixSyntenyAdapter:"Haplotype walks (.walks.bed.gz)",GbzBaseSyntenyAdapter:"GBZ database (.gbz.db)",MinigraphBubbleAdapter:"Minigraph bubbles (tabix BED)"},E="Path to a walk file (<prefix>.<sample>.walks.bed.gz from gfa-to-tabix --walks, for the sample this assembly is)",Z={RgfaTabixAdapter:"Path to segments BED (.segs.bed.gz from gfa-to-tabix; the .links.bed.gz, its index and any .graph.json are read beside it), or format 2's .graph.bed.gz",RgfaTabixWalks:E,WalkTabixSyntenyAdapter:E,GbzBaseSyntenyAdapter:"Path to the .gbz.db written by gbz-base construct",MinigraphBubbleAdapter:"Path to bubbles BED (.bed.gz from gfatools bubble)"},u="Path to tabix index (optional; the sibling .tbi is assumed, a .csi is recognised by name)",q={RgfaTabixAdapter:u,RgfaTabixWalks:u,WalkTabixSyntenyAdapter:u,GbzBaseSyntenyAdapter:"Path to the haplotype index (optional; graph.haplotype-index.db beside the database is assumed)",MinigraphBubbleAdapter:u};function x(e,n){return f(e,t=>t+n)}function C(e){if(!r(e).endsWith(p))throw new Error(`Expected a segments BED ending in ${p}, got ${r(e)}`);return B(e,".links.bed.gz")}function c(e,n){return n?{location:n,indexType:F(r(n),"CSI","TBI")}:{location:x(e,".tbi"),indexType:"TBI"}}function h(e,n){return n!==void 0&&F(r(n),"CSI","TBI")==="CSI"?{location:x(e,".csi"),indexType:"CSI"}:{location:x(e,".tbi"),indexType:"TBI"}}function w(e,n){let t=n.trim();return t&&e?{assemblyNameToPanSN:{[e]:t}}:{}}function z(e,n,t){if(!t)return{};if(t.format===2){let o=b(e,`${t.prefix}${d}`);return{coarse:{foldBelowBp:t.foldBelowBp,graphLocation:o,graphIndex:h(o,n)}}}let i=b(e,`${t.prefix}${p}`),a=b(e,`${t.prefix}.links.bed.gz`);return{coarse:{foldBelowBp:t.foldBelowBp,segmentsLocation:i,segmentsIndex:h(i,n),linksLocation:a,linksIndex:h(a,n)}}}function S(e,n,t){let i=t===e?void 0:t;return w(e,n.trim()||i||"")}function $(e){return e?{readsLocation:e,...r(e).endsWith(".gz")&&g(e)?{readsIndex:{location:x(e,".tbi")}}:{}}:{}}function Q(e){return e.split(/[\s,]+/).filter(n=>n!=="")}function D({choice:e,loc:n,indexLoc:t,readsLoc:i,manifest:a,assembly:o,sample:s,haplotypes:l=[]}){if(e==="RgfaTabixWalks"||e==="WalkTabixSyntenyAdapter"){if(!r(n).endsWith(y))throw new Error(`Expected a walk file ending in ${y}, got ${r(n)}`);return{type:e==="RgfaTabixWalks"?"RgfaTabixAdapter":e,walksLocation:n,walksIndex:c(n,t),...S(o,s,T(n)),...l.length>0?{defaultHaplotypes:l}:{}}}if(e==="GbzBaseSyntenyAdapter")return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:n,...t?{haplotypeIndexLocation:t}:{},...$(i),...w(o,s)};if(e==="MinigraphBubbleAdapter")return{type:"MinigraphBubbleAdapter",bubblesLocation:n,index:c(n,t),...w(o,s)};if(r(n).endsWith(d))return{type:"RgfaTabixAdapter",graphLocation:n,graphIndex:c(n,t),...S(o,s,a?.reference),...z(n,t,a?.tier)};let m=C(n);return{type:"RgfaTabixAdapter",segmentsLocation:n,segmentsIndex:c(n,t),linksLocation:m,linksIndex:h(m,t),...S(o,s,a?.reference),...z(n,t,a?.tier)}}function V(e){let{choice:n,assembly:t,trackId:i,name:a}=e;return{type:n==="MinigraphBubbleAdapter"?"FeatureTrack":"GraphTrack",trackId:i,name:a,assemblyNames:[t],adapter:D(e),...n==="RgfaTabixAdapter"||n==="RgfaTabixWalks"?{displayDefaults:{labels:{name:{show:!1},description:{show:!1}}}}:{}}}export{N as a,j as b,J as c,Z as d,q as e,Q as f,D as g,V as h};
|
|
2
|
+
//# sourceMappingURL=chunk-T7LVVBTT.js.map
|