@jbrowse/bandage-core 11.1.0 → 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +4 -2
  2. package/dist/chunks/{chunk-ZUL52ZX2.js → chunk-3HGYGISG.js} +4 -4
  3. package/dist/chunks/{chunk-LMH5KVJZ.js → chunk-3LZ334X4.js} +1 -1
  4. package/dist/chunks/{chunk-V5MAL7LU.js → chunk-7O7EGTYG.js} +1 -1
  5. package/dist/chunks/{chunk-3XSRT7RQ.js → chunk-B5ARSBOH.js} +36 -30
  6. package/dist/chunks/{chunk-RNYPCQZ3.js → chunk-BXLLMWC3.js} +1 -1
  7. package/dist/chunks/{chunk-AI5PTOSV.js → chunk-CE6ZIKJX.js} +1 -1
  8. package/dist/chunks/{chunk-W6EXQDV5.js → chunk-EFD753MS.js} +1 -1
  9. package/dist/chunks/chunk-JDZ5GTZT.js +20 -0
  10. package/dist/chunks/chunk-M75QPZNJ.js +502 -0
  11. package/dist/chunks/{chunk-IZ6Y5D23.js → chunk-PNM6Z3IE.js} +1 -1
  12. package/dist/chunks/{chunk-KDU4EF66.js → chunk-REOWLPH4.js} +1 -1
  13. package/dist/chunks/{chunk-JFHYG25O.js → chunk-RNNYRNDU.js} +10 -10
  14. package/dist/chunks/{chunk-OI4YVAMM.js → chunk-SLDCKMIP.js} +6 -6
  15. package/dist/chunks/{chunk-IVOK5V3H.js → chunk-T35BSLW5.js} +3 -3
  16. package/dist/chunks/{chunk-NGUM77EP.js → chunk-TEXAKEJX.js} +2 -2
  17. package/dist/chunks/{chunk-RETNT73O.js → chunk-TJOOHTJ6.js} +1 -1
  18. package/dist/chunks/{chunk-YHJ5JLBI.js → chunk-TZLEHZVC.js} +8 -4
  19. package/dist/chunks/chunk-UFUSPK2A.js +227 -0
  20. package/dist/chunks/{chunk-Y3FDMDNT.js → chunk-XEWPWCML.js} +1 -1
  21. package/dist/cli/figure.js +16 -15
  22. package/dist/cli/fold.js +2 -2
  23. package/dist/figure.js +13 -12
  24. package/dist/figureData.js +12 -11
  25. package/dist/figureScene.js +7 -6
  26. package/dist/figureSettings.js +3 -3
  27. package/dist/gfa/graphTables.js +7 -3
  28. package/dist/index.js +47 -27
  29. package/dist/layout/forceCache.js +3 -3
  30. package/dist/layout/tubeMapLayout.js +4 -2
  31. package/dist/layout/walkRowLayout.js +6 -2
  32. package/dist/layout/walkRowLinks.js +12 -0
  33. package/dist/layout/walkRowRuns.js +20 -0
  34. package/dist/layout/walkRows.js +5 -2
  35. package/dist/layout/walkStrip.js +5 -3
  36. package/dist/layoutModes.js +6 -4
  37. package/dist/pipeline.js +2 -2
  38. package/dist/tubeMap/bundle.js +5 -3
  39. package/dist/tubeMap/coarsen.js +5 -3
  40. package/dist/tubeMap/deviations.js +5 -3
  41. package/dist/tubeMap/draw.js +5 -3
  42. package/dist/types/gfa/graphTables.d.ts +10 -1
  43. package/dist/types/index.d.ts +5 -1
  44. package/dist/types/layout/walkRowLayout.d.ts +4 -0
  45. package/dist/types/layout/walkRowLinks.d.ts +32 -0
  46. package/dist/types/layout/walkRowRuns.d.ts +56 -0
  47. package/dist/types/layout/walkRows.d.ts +6 -3
  48. package/dist/types/version.d.ts +1 -1
  49. package/dist/version.js +1 -1
  50. package/dist/viewport.js +3 -3
  51. package/package.json +1 -1
  52. package/dist/chunks/chunk-DEDD7TFJ.js +0 -322
@@ -0,0 +1,502 @@
1
+ import {
2
+ tableNodeIds,
3
+ tablePath
4
+ } from "./chunk-B5ARSBOH.js";
5
+ import {
6
+ pathOrigin
7
+ } from "./chunk-B5X2RLJG.js";
8
+ import {
9
+ gapParts
10
+ } from "./chunk-EIY2SKD3.js";
11
+ import {
12
+ groupBy
13
+ } from "./chunk-BSOZW3FC.js";
14
+ import {
15
+ panSNContig,
16
+ panSNSample
17
+ } from "./chunk-4XWZNPQ2.js";
18
+
19
+ // src/layout/walkRowRuns.ts
20
+ var RUN_ON_REFERENCE = 1;
21
+ var RUN_REVERSED = 2;
22
+ var RUN_GAP = 4;
23
+ var GAP_CAUSES = [void 0, "missing", "elsewhere", "unknown"];
24
+ var CAUSE_SHIFT = 3;
25
+ var causeFlags = (cause) => GAP_CAUSES.indexOf(cause) << CAUSE_SHIFT;
26
+ function referenceOf(names, referencePath, rankZero) {
27
+ return referencePath !== void 0 && names.includes(referencePath) ? referencePath : names.find((n) => rankZero.has(n)) ?? names[0];
28
+ }
29
+ function referenceWalkName(graph) {
30
+ return referenceOf(
31
+ (graph.paths ?? []).map((p) => pathOrigin(p.name).name),
32
+ graph.referencePath,
33
+ new Set(
34
+ graph.nodes.flatMap(
35
+ (n) => n.stable?.rank === 0 ? [n.stable.refName] : []
36
+ )
37
+ )
38
+ );
39
+ }
40
+ function graphPieces(graph) {
41
+ const index = /* @__PURE__ */ new Map();
42
+ const names = [];
43
+ const lengths = [];
44
+ const indexOf = (id) => {
45
+ let i = index.get(id);
46
+ if (i === void 0) {
47
+ i = names.length;
48
+ index.set(id, i);
49
+ names.push(id);
50
+ lengths.push(0);
51
+ }
52
+ return i;
53
+ };
54
+ for (const node of graph.nodes) {
55
+ lengths[indexOf(node.id)] = node.length;
56
+ }
57
+ const heads = graph.paths ?? [];
58
+ const from = new Int32Array(heads.length);
59
+ const to = new Int32Array(heads.length);
60
+ const steps = [];
61
+ heads.forEach((path, p) => {
62
+ from[p] = steps.length;
63
+ for (const id of path.nodeIds) {
64
+ steps.push(indexOf(id));
65
+ }
66
+ to[p] = steps.length;
67
+ });
68
+ return {
69
+ heads,
70
+ from,
71
+ to,
72
+ steps,
73
+ lengths,
74
+ names,
75
+ reference: referenceWalkName(graph)
76
+ };
77
+ }
78
+ function tablePieces(tables, referencePath, visits) {
79
+ const { nodes: n, walks: w } = tables;
80
+ const kept = [];
81
+ for (let p = 0; p < w.names.length; p++) {
82
+ if (w.offsets[p + 1] > w.offsets[p]) {
83
+ kept.push(p);
84
+ }
85
+ }
86
+ const heads = kept.map((p) => tablePath(w, p));
87
+ const rankZero = /* @__PURE__ */ new Set();
88
+ for (let i = 0; i < n.lengths.length; i++) {
89
+ if (n.refs[i] >= 0 && n.ranks[i] === 0) {
90
+ rankZero.add(n.refNames[n.refs[i]]);
91
+ }
92
+ }
93
+ return {
94
+ heads,
95
+ from: kept.map((p) => w.offsets[p]),
96
+ to: kept.map((p) => w.offsets[p + 1]),
97
+ steps: w.steps,
98
+ lengths: n.lengths,
99
+ // a visit names its node as the Graph does, which costs a pass over the
100
+ // steps
101
+ names: visits ? tableNodeIds(tables) : n.names,
102
+ reference: referenceOf(
103
+ heads.map((h) => pathOrigin(h.name).name),
104
+ referencePath,
105
+ rankZero
106
+ )
107
+ };
108
+ }
109
+ function sampleOf(path) {
110
+ return path.sample ?? panSNSample(path.name);
111
+ }
112
+ function labelOf(path) {
113
+ return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);
114
+ }
115
+ var Columns = class {
116
+ constructor(width) {
117
+ this.offsets = [0];
118
+ this.values = Array.from({ length: width }, () => []);
119
+ }
120
+ get length() {
121
+ return this.values[0].length;
122
+ }
123
+ push(...row) {
124
+ row.forEach((v, i) => this.values[i].push(v));
125
+ }
126
+ endRow() {
127
+ this.offsets.push(this.length);
128
+ }
129
+ // the rows in `order`, column i in the array `make[i]` makes
130
+ reorder(order, make) {
131
+ const columns = make.map((m) => m(this.length));
132
+ const offsets = new Uint32Array(order.length + 1);
133
+ let at = 0;
134
+ order.forEach((row, i) => {
135
+ for (let k = this.offsets[row]; k < this.offsets[row + 1]; k++, at++) {
136
+ columns.forEach((column, c) => {
137
+ column[at] = this.values[c][k];
138
+ });
139
+ }
140
+ offsets[i + 1] = at;
141
+ });
142
+ return { offsets, columns };
143
+ }
144
+ };
145
+ var float64 = (n) => new Float64Array(n);
146
+ function walkRowRuns(source, region, o = {}) {
147
+ const {
148
+ heads,
149
+ from,
150
+ to,
151
+ steps: all,
152
+ lengths,
153
+ names,
154
+ reference
155
+ } = "walks" in source ? tablePieces(source, o.referencePath, o.visits) : graphPieces(source);
156
+ const declared = lengths.length;
157
+ const lengthOf = (node) => node < declared ? lengths[node] : 0;
158
+ const nameOf = (p) => pathOrigin(heads[p].name).name;
159
+ const startOf = (p) => heads[p].start;
160
+ const byStart = (a, b) => (startOf(a) ?? 0) - (startOf(b) ?? 0);
161
+ const pieceIds = heads.map((_, p) => p);
162
+ const referencePieces = pieceIds.filter((p) => nameOf(p) === reference).sort(byStart);
163
+ const first = referencePieces[0];
164
+ const others = pieceIds.filter((p) => nameOf(p) !== reference);
165
+ if (first === void 0 || others.length === 0) {
166
+ return void 0;
167
+ }
168
+ const walks = groupBy(others, nameOf);
169
+ const spanStart = new Float64Array(names.length).fill(Number.NaN);
170
+ const spanEnd = new Float64Array(names.length);
171
+ let reachesBefore = false;
172
+ let reachesAfter = false;
173
+ const cut = region && region.end > region.start ? region : void 0;
174
+ for (const piece of referencePieces) {
175
+ let pos = startOf(piece) ?? 0;
176
+ for (let s = from[piece]; s < to[piece]; s++) {
177
+ const node = all[s];
178
+ const len = lengthOf(node);
179
+ if (Number.isNaN(spanStart[node])) {
180
+ spanStart[node] = pos;
181
+ spanEnd[node] = pos + len;
182
+ if (cut) {
183
+ reachesBefore ||= pos + len <= cut.start;
184
+ reachesAfter ||= pos >= cut.end;
185
+ }
186
+ }
187
+ pos += len;
188
+ }
189
+ }
190
+ const flanked = cut === void 0 || reachesBefore && reachesAfter;
191
+ const runs = new Columns(5);
192
+ const chunks = [];
193
+ const chunkIndex = /* @__PURE__ */ new Map();
194
+ const chunkOf = (chunk2) => {
195
+ if (!chunk2) {
196
+ return -1;
197
+ }
198
+ const key = `${chunk2.refName}:${chunk2.start}`;
199
+ let i = chunkIndex.get(key);
200
+ if (i === void 0) {
201
+ i = chunks.length;
202
+ chunkIndex.set(key, i);
203
+ chunks.push(chunk2);
204
+ }
205
+ return i;
206
+ };
207
+ const visits = o.visits ? new Columns(4) : void 0;
208
+ let steps = new Int32Array(0);
209
+ let stepStart = new Float64Array(0);
210
+ const rowOf = (pieces) => {
211
+ const head = heads[pieces[0]];
212
+ const ordered = [...pieces].sort(byStart);
213
+ let count = ordered.length - 1;
214
+ for (const piece of ordered) {
215
+ count += to[piece] - from[piece];
216
+ }
217
+ if (count > steps.length) {
218
+ steps = new Int32Array(count * 2);
219
+ stepStart = new Float64Array(count * 2);
220
+ }
221
+ let length = 0;
222
+ let unplaced = false;
223
+ let end;
224
+ let previous;
225
+ const partsAt = /* @__PURE__ */ new Map();
226
+ for (const piece of ordered) {
227
+ const start2 = startOf(piece);
228
+ if (start2 === void 0 || end !== void 0 && start2 < end) {
229
+ unplaced = true;
230
+ }
231
+ if (end !== void 0 && start2 !== void 0 && start2 > end) {
232
+ partsAt.set(
233
+ length,
234
+ gapParts(
235
+ start2 - end,
236
+ previous === void 0 ? void 0 : heads[previous].after,
237
+ heads[piece].before
238
+ )
239
+ );
240
+ steps[length] = -(start2 - end);
241
+ stepStart[length++] = end;
242
+ }
243
+ let pos = start2 ?? 0;
244
+ for (let s = from[piece]; s < to[piece]; s++) {
245
+ const node = all[s];
246
+ steps[length] = node;
247
+ stepStart[length++] = pos;
248
+ pos += lengthOf(node);
249
+ }
250
+ end = start2 === void 0 ? void 0 : pos;
251
+ previous = piece;
252
+ }
253
+ const onReference = (i) => i >= 0 && i < length && steps[i] >= 0 && !Number.isNaN(spanStart[steps[i]]);
254
+ const stepEnd = (i) => {
255
+ const id = steps[i];
256
+ return stepStart[i] + (id < 0 ? -id : lengthOf(id));
257
+ };
258
+ const partialSide = (i0, i1) => {
259
+ const flank = i0 >= 0 ? i0 : i1;
260
+ let near = -1;
261
+ for (let d = 1; near < 0 && d < length; d++) {
262
+ near = [flank - d, flank + d].find(onReference) ?? -1;
263
+ }
264
+ if (near < 0) {
265
+ return void 0;
266
+ }
267
+ const forward = near > flank === spanStart[steps[near]] > spanStart[steps[flank]];
268
+ const after = forward === (flank === i0);
269
+ const last2 = after ? length - 1 : 0;
270
+ const contigEnds = onReference(last2);
271
+ const stop2 = {
272
+ contigEnds,
273
+ shortBp: contigEnds ? Math.max(
274
+ 0,
275
+ cut.start - spanEnd[steps[last2]],
276
+ spanStart[steps[last2]] - cut.end
277
+ ) : 0
278
+ };
279
+ return {
280
+ stop: stop2,
281
+ lo: after ? flank + 1 : 0,
282
+ hi: after ? length : flank,
283
+ backward: !forward,
284
+ axisStart: forward ? after ? stepEnd(flank) : stepStart[0] : after ? stepEnd(length - 1) : stepStart[flank]
285
+ };
286
+ };
287
+ let lo = 0;
288
+ let hi = length;
289
+ let backward = false;
290
+ let complete = true;
291
+ let flankFrom = -1;
292
+ let flankTo = -1;
293
+ let axisStart;
294
+ let stop;
295
+ if (cut && flanked) {
296
+ let i0 = -1;
297
+ let i1 = -1;
298
+ let bestEnd = -Infinity;
299
+ let bestStart = Infinity;
300
+ for (let i = 0; i < length; i++) {
301
+ if (onReference(i)) {
302
+ const id = steps[i];
303
+ if (spanEnd[id] <= cut.start && spanEnd[id] > bestEnd) {
304
+ bestEnd = spanEnd[id];
305
+ i0 = i;
306
+ }
307
+ if (spanStart[id] >= cut.end && spanStart[id] < bestStart) {
308
+ bestStart = spanStart[id];
309
+ i1 = i;
310
+ }
311
+ }
312
+ }
313
+ if (i0 < 0 || i1 < 0) {
314
+ complete = false;
315
+ const inside = i0 >= 0 || i1 >= 0 ? partialSide(i0, i1) : void 0;
316
+ if (inside) {
317
+ ;
318
+ ({ lo, hi, backward, axisStart, stop } = inside);
319
+ }
320
+ } else {
321
+ lo = Math.min(i0, i1) + 1;
322
+ hi = Math.max(i0, i1);
323
+ backward = i0 > i1;
324
+ flankFrom = i0;
325
+ flankTo = i1;
326
+ }
327
+ }
328
+ const contig = head.contig ?? panSNContig(pathOrigin(head.name).name);
329
+ const axis = unplaced || length === 0 ? void 0 : axisStart !== void 0 ? { contig, start: axisStart, reversed: backward } : flankFrom < 0 ? { contig, start: stepStart[0], reversed: false } : flankFrom < flankTo ? { contig, start: stepEnd(flankFrom), reversed: false } : { contig, start: stepStart[flankFrom], reversed: true };
330
+ let bp2 = 0;
331
+ let offReferenceBp = 0;
332
+ let gapBp = 0;
333
+ let step = 0;
334
+ let last = -1;
335
+ let lastFlags = 0;
336
+ let lastRef = Number.NaN;
337
+ const [, runBp, runRef, runFlags] = runs.values;
338
+ for (let k = lo; k < hi; k++) {
339
+ const index = backward ? hi - 1 - (k - lo) : k;
340
+ const id = steps[index];
341
+ if (id < 0) {
342
+ const parts = partsAt.get(index);
343
+ for (const part of backward ? [...parts].reverse() : parts) {
344
+ runs.push(
345
+ bp2,
346
+ part.bp,
347
+ Number.NaN,
348
+ RUN_GAP | causeFlags(part.cause),
349
+ chunkOf(part.chunk)
350
+ );
351
+ bp2 += part.bp;
352
+ }
353
+ last = runs.length - 1;
354
+ lastFlags = RUN_GAP;
355
+ lastRef = Number.NaN;
356
+ gapBp += -id;
357
+ step = 0;
358
+ continue;
359
+ }
360
+ const len = lengthOf(id);
361
+ const at = spanStart[id];
362
+ const on = !Number.isNaN(at);
363
+ visits?.push(id, bp2, len, on ? 1 : 0);
364
+ const placed = last >= 0 && !Number.isNaN(lastRef);
365
+ const forward = on && placed && step >= 0 && lastRef + (runBp[last] ?? 0) === at;
366
+ const back = on && placed && step <= 0 && spanEnd[id] === lastRef;
367
+ if (!on && last >= 0 && !(lastFlags & (RUN_ON_REFERENCE | RUN_GAP))) {
368
+ runBp[last] += len;
369
+ } else if (forward || back) {
370
+ runBp[last] += len;
371
+ if (!forward) {
372
+ lastRef = at;
373
+ runRef[last] = at;
374
+ lastFlags |= RUN_REVERSED;
375
+ runFlags[last] = lastFlags;
376
+ }
377
+ step = forward ? 1 : -1;
378
+ } else {
379
+ lastFlags = on ? RUN_ON_REFERENCE : 0;
380
+ lastRef = on ? at : Number.NaN;
381
+ runs.push(bp2, len, lastRef, lastFlags, -1);
382
+ last = runs.length - 1;
383
+ step = 0;
384
+ }
385
+ bp2 += len;
386
+ if (!on) {
387
+ offReferenceBp += len;
388
+ }
389
+ }
390
+ runs.endRow();
391
+ visits?.endRow();
392
+ return {
393
+ name: head.name,
394
+ label: labelOf(head),
395
+ sample: sampleOf(head),
396
+ haplotype: head.haplotype,
397
+ bp: bp2,
398
+ offReferenceBp,
399
+ gapBp,
400
+ complete,
401
+ stop,
402
+ axis
403
+ };
404
+ };
405
+ const referenceRow = rowOf(referencePieces);
406
+ const rows = [...walks.values()].map((pieces, i) => ({
407
+ meta: rowOf(pieces),
408
+ row: i + 1
409
+ }));
410
+ rows.sort(
411
+ (a, b) => Number(b.meta.complete) - Number(a.meta.complete) || b.meta.bp - a.meta.bp || a.meta.label.localeCompare(b.meta.label)
412
+ );
413
+ const order = [0, ...rows.map((r) => r.row)];
414
+ const { offsets, columns } = runs.reorder(order, [
415
+ float64,
416
+ float64,
417
+ float64,
418
+ (n) => new Uint8Array(n),
419
+ (n) => new Int32Array(n)
420
+ ]);
421
+ const [start, bp, referenceStart, flags, chunk] = columns;
422
+ return {
423
+ origin: cut ? cut.start : startOf(first) ?? 0,
424
+ rows: [referenceRow, ...rows.map((r) => r.meta)],
425
+ offsets,
426
+ start,
427
+ bp,
428
+ referenceStart,
429
+ flags,
430
+ chunk,
431
+ chunks,
432
+ visits: visits && visitColumns(visits, order, names)
433
+ };
434
+ }
435
+ function visitColumns(visits, order, names) {
436
+ const { offsets, columns } = visits.reorder(order, [
437
+ (n) => new Int32Array(n),
438
+ float64,
439
+ float64,
440
+ (n) => new Uint8Array(n)
441
+ ]);
442
+ const [node, start, bp, onReference] = columns;
443
+ return { offsets, node, start, bp, onReference, names };
444
+ }
445
+ function runAt(t, k) {
446
+ const f = t.flags[k];
447
+ const run = {
448
+ start: t.start[k],
449
+ bp: t.bp[k],
450
+ onReference: (f & RUN_ON_REFERENCE) !== 0
451
+ };
452
+ if (f & RUN_GAP) {
453
+ run.gap = true;
454
+ const cause = GAP_CAUSES[f >> CAUSE_SHIFT & 3];
455
+ if (cause) {
456
+ run.cause = cause;
457
+ }
458
+ const chunk = t.chunks[t.chunk[k]];
459
+ if (chunk) {
460
+ run.chunk = chunk;
461
+ }
462
+ } else {
463
+ run.referenceStart = Number.isNaN(t.referenceStart[k]) ? void 0 : t.referenceStart[k];
464
+ }
465
+ if (f & RUN_REVERSED) {
466
+ run.reversed = true;
467
+ }
468
+ return run;
469
+ }
470
+ function visitsOf(v, row) {
471
+ const out = [];
472
+ for (let k = v.offsets[row]; k < v.offsets[row + 1]; k++) {
473
+ out.push({
474
+ node: v.names[v.node[k]],
475
+ start: v.start[k],
476
+ bp: v.bp[k],
477
+ onReference: v.onReference[k] === 1
478
+ });
479
+ }
480
+ return out;
481
+ }
482
+ function walkRowsOf(t, unit) {
483
+ const rows = t.rows.map((meta, i) => {
484
+ const runs = [];
485
+ for (let k = t.offsets[i]; k < t.offsets[i + 1]; k++) {
486
+ runs.push(runAt(t, k));
487
+ }
488
+ return {
489
+ ...meta,
490
+ runs,
491
+ visits: t.visits && visitsOf(t.visits, i)
492
+ };
493
+ });
494
+ return { origin: t.origin, unit, reference: rows[0], rows: rows.slice(1) };
495
+ }
496
+
497
+ export {
498
+ referenceWalkName,
499
+ walkRowRuns,
500
+ runAt,
501
+ walkRowsOf
502
+ };
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  READOUT_ROOM,
12
12
  longestBar
13
- } from "./chunk-YHJ5JLBI.js";
13
+ } from "./chunk-TZLEHZVC.js";
14
14
  import {
15
15
  pathOrigin
16
16
  } from "./chunk-B5X2RLJG.js";
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-5I3K4R2G.js";
21
21
  import {
22
22
  graphFromTables
23
- } from "./chunk-3XSRT7RQ.js";
23
+ } from "./chunk-B5ARSBOH.js";
24
24
  import {
25
25
  anchorGraph
26
26
  } from "./chunk-B5X2RLJG.js";
@@ -1,3 +1,6 @@
1
+ import {
2
+ Canvas2DRenderer
3
+ } from "./chunk-EJRJAAN7.js";
1
4
  import {
2
5
  svgCanvas
3
6
  } from "./chunk-V4YML3GR.js";
@@ -5,15 +8,12 @@ import {
5
8
  stripGeneGaps,
6
9
  walkStripFrame,
7
10
  walkStripLabelsTree
8
- } from "./chunk-IZ6Y5D23.js";
11
+ } from "./chunk-PNM6Z3IE.js";
9
12
  import {
10
13
  walkRowsKey,
11
14
  walkRowsKeyTree,
12
15
  walkRowsTree
13
16
  } from "./chunk-XZ6PQBU6.js";
14
- import {
15
- Canvas2DRenderer
16
- } from "./chunk-EJRJAAN7.js";
17
17
  import {
18
18
  EXON_COLOR,
19
19
  exonOutlineTree,
@@ -34,13 +34,13 @@ import {
34
34
  } from "./chunk-77EGQQJU.js";
35
35
  import {
36
36
  version
37
- } from "./chunk-Y3FDMDNT.js";
37
+ } from "./chunk-XEWPWCML.js";
38
38
  import {
39
39
  axisScaleOf
40
- } from "./chunk-AI5PTOSV.js";
40
+ } from "./chunk-CE6ZIKJX.js";
41
41
  import {
42
42
  figureScene
43
- } from "./chunk-IVOK5V3H.js";
43
+ } from "./chunk-T35BSLW5.js";
44
44
  import {
45
45
  encodingStops
46
46
  } from "./chunk-TABI4JEU.js";
@@ -49,17 +49,17 @@ import {
49
49
  } from "./chunk-D4ZFRBB4.js";
50
50
  import {
51
51
  walkRowLabels
52
- } from "./chunk-YHJ5JLBI.js";
52
+ } from "./chunk-TZLEHZVC.js";
53
53
  import {
54
54
  nodeInk
55
55
  } from "./chunk-CRCD3ODN.js";
56
56
  import {
57
57
  FIGURE_DEFAULTS
58
- } from "./chunk-W6EXQDV5.js";
58
+ } from "./chunk-EFD753MS.js";
59
59
  import {
60
60
  FIT_PADDING,
61
61
  fitTransform
62
- } from "./chunk-KDU4EF66.js";
62
+ } from "./chunk-REOWLPH4.js";
63
63
  import {
64
64
  LABEL_CHAR_PX,
65
65
  LABEL_PAD,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-JMABOQWL.js";
4
4
  import {
5
5
  layoutModeByValue
6
- } from "./chunk-NGUM77EP.js";
6
+ } from "./chunk-TEXAKEJX.js";
7
7
  import {
8
8
  parseRegion
9
9
  } from "./chunk-TUQKGAK3.js";
@@ -12,13 +12,13 @@ import {
12
12
  } from "./chunk-77EGQQJU.js";
13
13
  import {
14
14
  version
15
- } from "./chunk-Y3FDMDNT.js";
15
+ } from "./chunk-XEWPWCML.js";
16
16
  import {
17
17
  axisScaleOf
18
- } from "./chunk-AI5PTOSV.js";
18
+ } from "./chunk-CE6ZIKJX.js";
19
19
  import {
20
20
  figureScene
21
- } from "./chunk-IVOK5V3H.js";
21
+ } from "./chunk-T35BSLW5.js";
22
22
  import {
23
23
  encodingStops
24
24
  } from "./chunk-TABI4JEU.js";
@@ -30,13 +30,13 @@ import {
30
30
  } from "./chunk-G2FD7S3C.js";
31
31
  import {
32
32
  FIGURE_DEFAULTS
33
- } from "./chunk-W6EXQDV5.js";
33
+ } from "./chunk-EFD753MS.js";
34
34
  import {
35
35
  engineSettingsOf,
36
36
  fitTransform,
37
37
  forceLayout,
38
38
  loadGraph
39
- } from "./chunk-KDU4EF66.js";
39
+ } from "./chunk-REOWLPH4.js";
40
40
  import {
41
41
  isBackbone
42
42
  } from "./chunk-RJWPJCIB.js";
@@ -14,17 +14,17 @@ import {
14
14
  } from "./chunk-SWCULW6S.js";
15
15
  import {
16
16
  walkRowsExtent
17
- } from "./chunk-YHJ5JLBI.js";
17
+ } from "./chunk-TZLEHZVC.js";
18
18
  import {
19
19
  pathLegend,
20
20
  walkLabelsOf
21
21
  } from "./chunk-3GP3KT5L.js";
22
22
  import {
23
23
  FIGURE_DEFAULTS
24
- } from "./chunk-W6EXQDV5.js";
24
+ } from "./chunk-EFD753MS.js";
25
25
  import {
26
26
  drawingBounds
27
- } from "./chunk-KDU4EF66.js";
27
+ } from "./chunk-REOWLPH4.js";
28
28
  import {
29
29
  referenceLabel
30
30
  } from "./chunk-234NFZS4.js";
@@ -3,7 +3,7 @@ import {
3
3
  hasTubeMapPaths,
4
4
  tubeMapLayout,
5
5
  tubeMapReferenceLayout
6
- } from "./chunk-LMH5KVJZ.js";
6
+ } from "./chunk-3LZ334X4.js";
7
7
  import {
8
8
  sampleRowLayout
9
9
  } from "./chunk-GJU6BJJA.js";
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-UAFATXYA.js";
16
16
  import {
17
17
  walkRowLayout
18
- } from "./chunk-YHJ5JLBI.js";
18
+ } from "./chunk-TZLEHZVC.js";
19
19
  import {
20
20
  isBackbone,
21
21
  isOffReference
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pathSteps
3
- } from "./chunk-LMH5KVJZ.js";
3
+ } from "./chunk-3LZ334X4.js";
4
4
  import {
5
5
  pathOrigin
6
6
  } from "./chunk-B5X2RLJG.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  walkRows
3
- } from "./chunk-DEDD7TFJ.js";
3
+ } from "./chunk-JDZ5GTZT.js";
4
4
  import {
5
5
  ROW_HEIGHT_PX
6
6
  } from "./chunk-CPMHA4W5.js";
@@ -37,9 +37,12 @@ function walkRowLabels(rows, layout, pitch) {
37
37
  }));
38
38
  }
39
39
  function walkRowLayout(graph, region) {
40
- const backbone = backboneNodes(graph);
41
40
  const walks = walkRows(graph, region);
42
- if (backbone.length === 0 || !walks) {
41
+ return walks && walkRowLayoutOf(graph, walks, region);
42
+ }
43
+ function walkRowLayoutOf(graph, walks, region) {
44
+ const backbone = backboneNodes(graph);
45
+ if (backbone.length === 0) {
43
46
  return void 0;
44
47
  }
45
48
  const overWindow = region ? backbone.filter((n) => overlapsWindow(n, region)) : backbone;
@@ -60,5 +63,6 @@ export {
60
63
  longestBar,
61
64
  walkRowsExtent,
62
65
  walkRowLabels,
63
- walkRowLayout
66
+ walkRowLayout,
67
+ walkRowLayoutOf
64
68
  };