@genome-spy/core 0.71.0 → 0.73.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 (121) hide show
  1. package/LICENSE +1 -1
  2. package/dist/bundle/index.es.js +6842 -5365
  3. package/dist/bundle/index.js +159 -140
  4. package/dist/bundle/parquetRead-BnAGCa4_.js +1663 -0
  5. package/dist/schema.json +281 -17
  6. package/dist/src/data/formats/bed.d.ts +8 -0
  7. package/dist/src/data/formats/bed.d.ts.map +1 -0
  8. package/dist/src/data/formats/bed.js +53 -0
  9. package/dist/src/data/formats/bedpe.d.ts +8 -0
  10. package/dist/src/data/formats/bedpe.d.ts.map +1 -0
  11. package/dist/src/data/formats/bedpe.js +160 -0
  12. package/dist/src/data/formats/parquet.d.ts +12 -0
  13. package/dist/src/data/formats/parquet.d.ts.map +1 -0
  14. package/dist/src/data/formats/parquet.js +29 -0
  15. package/dist/src/data/formats/parquetRead.d.ts +18 -0
  16. package/dist/src/data/formats/parquetRead.d.ts.map +1 -0
  17. package/dist/src/data/formats/parquetRead.js +326 -0
  18. package/dist/src/data/sources/dataUtils.d.ts +16 -0
  19. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  20. package/dist/src/data/sources/dataUtils.js +53 -3
  21. package/dist/src/data/sources/urlSource.d.ts +4 -0
  22. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  23. package/dist/src/data/sources/urlSource.js +141 -17
  24. package/dist/src/encoder/encoder.d.ts +2 -2
  25. package/dist/src/fonts/bmFontManager.d.ts +1 -1
  26. package/dist/src/genome/assemblyPreflight.d.ts +31 -0
  27. package/dist/src/genome/assemblyPreflight.d.ts.map +1 -0
  28. package/dist/src/genome/assemblyPreflight.js +99 -0
  29. package/dist/src/genome/genome.d.ts +2 -2
  30. package/dist/src/genome/genome.d.ts.map +1 -1
  31. package/dist/src/genome/genome.js +4 -0
  32. package/dist/src/genome/genomeStore.d.ts +34 -3
  33. package/dist/src/genome/genomeStore.d.ts.map +1 -1
  34. package/dist/src/genome/genomeStore.js +409 -18
  35. package/dist/src/genome/rootGenomeConfig.d.ts +26 -0
  36. package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -0
  37. package/dist/src/genome/rootGenomeConfig.js +94 -0
  38. package/dist/src/genomeSpy/interactionController.d.ts +5 -1
  39. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  40. package/dist/src/genomeSpy/interactionController.js +244 -29
  41. package/dist/src/genomeSpy/renderCoordinator.js +1 -1
  42. package/dist/src/genomeSpy.d.ts +13 -3
  43. package/dist/src/genomeSpy.d.ts.map +1 -1
  44. package/dist/src/genomeSpy.js +83 -7
  45. package/dist/src/gl/canvasSizeHelper.d.ts +74 -0
  46. package/dist/src/gl/canvasSizeHelper.d.ts.map +1 -0
  47. package/dist/src/gl/canvasSizeHelper.js +203 -0
  48. package/dist/src/gl/hashTable.d.ts +78 -0
  49. package/dist/src/gl/hashTable.d.ts.map +1 -0
  50. package/dist/src/gl/hashTable.js +164 -0
  51. package/dist/src/gl/includes/common.glsl.js +1 -1
  52. package/dist/src/gl/webGLHelper.d.ts +25 -11
  53. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  54. package/dist/src/gl/webGLHelper.js +71 -39
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +5 -2
  57. package/dist/src/marks/link.d.ts.map +1 -1
  58. package/dist/src/marks/link.js +5 -3
  59. package/dist/src/marks/mark.d.ts +1 -1
  60. package/dist/src/marks/mark.d.ts.map +1 -1
  61. package/dist/src/marks/mark.js +8 -4
  62. package/dist/src/scales/domainPlanner.d.ts +34 -3
  63. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  64. package/dist/src/scales/domainPlanner.js +247 -26
  65. package/dist/src/scales/scaleInstanceManager.d.ts +2 -1
  66. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  67. package/dist/src/scales/scaleInstanceManager.js +10 -11
  68. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  69. package/dist/src/scales/scaleInteractionController.js +16 -14
  70. package/dist/src/scales/scaleResolution.d.ts +16 -0
  71. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  72. package/dist/src/scales/scaleResolution.js +314 -54
  73. package/dist/src/scales/scaleResolutionTestUtils.d.ts +21 -0
  74. package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -0
  75. package/dist/src/scales/scaleResolutionTestUtils.js +33 -0
  76. package/dist/src/scales/selectionDomainUtils.d.ts +22 -0
  77. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -0
  78. package/dist/src/scales/selectionDomainUtils.js +79 -0
  79. package/dist/src/scales/zoomDomainUtils.d.ts +18 -0
  80. package/dist/src/scales/zoomDomainUtils.d.ts.map +1 -0
  81. package/dist/src/scales/zoomDomainUtils.js +69 -0
  82. package/dist/src/screenshotHarness.d.ts +16 -0
  83. package/dist/src/screenshotHarness.d.ts.map +1 -0
  84. package/dist/src/screenshotHarness.js +242 -0
  85. package/dist/src/singlePageApp.js +1 -1
  86. package/dist/src/spec/data.d.ts +23 -3
  87. package/dist/src/spec/genome.d.ts +22 -2
  88. package/dist/src/spec/parameter.d.ts +39 -2
  89. package/dist/src/spec/root.d.ts +20 -1
  90. package/dist/src/spec/scale.d.ts +41 -5
  91. package/dist/src/styles/genome-spy.css +8 -0
  92. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  93. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  94. package/dist/src/styles/genome-spy.css.js +8 -0
  95. package/dist/src/tooltip/dataTooltipHandler.js +59 -10
  96. package/dist/src/types/embedApi.d.ts +19 -0
  97. package/dist/src/utils/inferSpecBaseUrl.d.ts +14 -0
  98. package/dist/src/utils/inferSpecBaseUrl.d.ts.map +1 -0
  99. package/dist/src/utils/inferSpecBaseUrl.js +73 -0
  100. package/dist/src/utils/interactionEvent.d.ts +53 -3
  101. package/dist/src/utils/interactionEvent.d.ts.map +1 -1
  102. package/dist/src/utils/interactionEvent.js +62 -1
  103. package/dist/src/utils/radixSort.d.ts.map +1 -1
  104. package/dist/src/utils/radixSort.js +26 -1
  105. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  106. package/dist/src/view/containerMutationHelper.js +8 -0
  107. package/dist/src/view/dataReadiness.d.ts +2 -2
  108. package/dist/src/view/dataReadiness.d.ts.map +1 -1
  109. package/dist/src/view/dataReadiness.js +63 -58
  110. package/dist/src/view/facetView.d.ts +1 -1
  111. package/dist/src/view/facetView.js +1 -1
  112. package/dist/src/view/gridView/gridChild.d.ts +7 -0
  113. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  114. package/dist/src/view/gridView/gridChild.js +180 -11
  115. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  116. package/dist/src/view/gridView/gridView.js +60 -17
  117. package/dist/src/view/unitView.d.ts +1 -1
  118. package/dist/src/view/zoom.d.ts +14 -2
  119. package/dist/src/view/zoom.d.ts.map +1 -1
  120. package/dist/src/view/zoom.js +373 -76
  121. package/package.json +5 -2
@@ -27,6 +27,11 @@ import {
27
27
  isDiscreteChannel,
28
28
  } from "../encoder/encoder.js";
29
29
  import { isMultiPointSelection } from "../selection/selection.js";
30
+ import {
31
+ buildHashTableSet,
32
+ computeHashTextureDimensions,
33
+ } from "./hashTable.js";
34
+ import CanvasSizeHelper from "./canvasSizeHelper.js";
30
35
 
31
36
  export default class WebGLHelper {
32
37
  /**
@@ -38,14 +43,23 @@ export default class WebGLHelper {
38
43
  * @param {WebGLContextAttributes} [webglContextAttributes]
39
44
  */
40
45
  constructor(container, sizeSource, webglContextAttributes = {}) {
41
- this._container = container;
42
- this._sizeSource =
46
+ const resolvedSizeSource =
43
47
  sizeSource ??
44
48
  (() => ({
45
49
  width: undefined,
46
50
  height: undefined,
47
51
  }));
48
52
 
53
+ /**
54
+ * @type {CanvasSizeHelper}
55
+ */
56
+ this._canvasSizeHelper = undefined;
57
+
58
+ /**
59
+ * @type {{ logicalWidth: number, logicalHeight: number, physicalWidth: number, physicalHeight: number } | undefined}
60
+ */
61
+ this._appliedCanvasSize = undefined;
62
+
49
63
  /** @type {Map<string, WebGLShader>} */
50
64
  this._shaderCache = new Map();
51
65
 
@@ -120,11 +134,18 @@ export default class WebGLHelper {
120
134
  );
121
135
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
122
136
 
137
+ this._canvasSizeHelper = new CanvasSizeHelper(
138
+ container,
139
+ canvas,
140
+ resolvedSizeSource,
141
+ () => this.adjustGl()
142
+ );
143
+
123
144
  this.adjustGl();
124
145
  }
125
146
 
126
147
  invalidateSize() {
127
- this._logicalCanvasSize = undefined;
148
+ this._canvasSizeHelper.invalidate();
128
149
  this.adjustGl();
129
150
  }
130
151
 
@@ -163,10 +184,21 @@ export default class WebGLHelper {
163
184
 
164
185
  adjustGl() {
165
186
  const logicalSize = this.getLogicalCanvasSize();
187
+ const physicalSize = this.getPhysicalCanvasSize(logicalSize);
188
+
189
+ if (
190
+ this._appliedCanvasSize &&
191
+ this._appliedCanvasSize.logicalWidth == logicalSize.width &&
192
+ this._appliedCanvasSize.logicalHeight == logicalSize.height &&
193
+ this._appliedCanvasSize.physicalWidth == physicalSize.width &&
194
+ this._appliedCanvasSize.physicalHeight == physicalSize.height
195
+ ) {
196
+ return;
197
+ }
198
+
166
199
  this.canvas.style.width = `${logicalSize.width}px`;
167
200
  this.canvas.style.height = `${logicalSize.height}px`;
168
201
 
169
- const physicalSize = this.getPhysicalCanvasSize(logicalSize);
170
202
  this.canvas.width = physicalSize.width;
171
203
  this.canvas.height = physicalSize.height;
172
204
 
@@ -175,9 +207,17 @@ export default class WebGLHelper {
175
207
  this._pickingBufferInfo,
176
208
  this._pickingAttachmentOptions
177
209
  );
210
+
211
+ this._appliedCanvasSize = {
212
+ logicalWidth: logicalSize.width,
213
+ logicalHeight: logicalSize.height,
214
+ physicalWidth: physicalSize.width,
215
+ physicalHeight: physicalSize.height,
216
+ };
178
217
  }
179
218
 
180
219
  finalize() {
220
+ this._canvasSizeHelper.finalize();
181
221
  this.canvas.remove();
182
222
  }
183
223
 
@@ -187,12 +227,16 @@ export default class WebGLHelper {
187
227
  * @param {{ width: number, height: number }} [logicalSize]
188
228
  */
189
229
  getPhysicalCanvasSize(logicalSize) {
190
- const dpr = window.devicePixelRatio ?? 1;
191
- logicalSize = logicalSize || this.getLogicalCanvasSize();
192
- return {
193
- width: logicalSize.width * dpr,
194
- height: logicalSize.height * dpr,
195
- };
230
+ return this._canvasSizeHelper.getPhysicalCanvasSize(logicalSize);
231
+ }
232
+
233
+ /**
234
+ * Returns the ratio between true display pixels and logical pixels.
235
+ *
236
+ * @param {{ width: number, height: number }} [logicalSize]
237
+ */
238
+ getDevicePixelRatio(logicalSize) {
239
+ return this._canvasSizeHelper.getDevicePixelRatio(logicalSize);
196
240
  }
197
241
 
198
242
  /**
@@ -200,28 +244,7 @@ export default class WebGLHelper {
200
244
  * without devicePixelRatio correction.
201
245
  */
202
246
  getLogicalCanvasSize() {
203
- if (this._logicalCanvasSize) {
204
- return this._logicalCanvasSize;
205
- }
206
-
207
- // TODO: The size should never be smaller than the minimum content size!
208
- const contentSize = this._sizeSource();
209
-
210
- const cs = window.getComputedStyle(this._container, null);
211
- const width =
212
- contentSize.width ??
213
- this._container.clientWidth -
214
- parseFloat(cs.paddingLeft) -
215
- parseFloat(cs.paddingRight);
216
-
217
- const height =
218
- contentSize.height ??
219
- this._container.clientHeight -
220
- parseFloat(cs.paddingTop) -
221
- parseFloat(cs.paddingBottom);
222
-
223
- this._logicalCanvasSize = { width, height };
224
- return this._logicalCanvasSize;
247
+ return this._canvasSizeHelper.getLogicalCanvasSize();
225
248
  }
226
249
 
227
250
  /**
@@ -351,9 +374,11 @@ export default class WebGLHelper {
351
374
  );
352
375
  }
353
376
 
354
- const keys = Array.from(selection.data.keys());
355
- // Zero is a special value for no selection. The minimum texture size is 1.
356
- const uniqueIds = keys.length > 0 ? keys.sort((a, b) => a - b) : [0];
377
+ const { table, capacity } = buildHashTableSet(selection.data.keys());
378
+ const { width, height } = computeHashTextureDimensions(
379
+ capacity,
380
+ this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE)
381
+ );
357
382
 
358
383
  const existingTexture = this.selectionTextures.get(selection);
359
384
 
@@ -361,16 +386,23 @@ export default class WebGLHelper {
361
386
  const texture = createOrUpdateTexture(
362
387
  this.gl,
363
388
  {
389
+ // Hash textures are point-lookups and must remain single-level.
390
+ auto: false,
364
391
  level: 0,
365
- minMag: gl.NEAREST,
392
+ min: gl.NEAREST,
393
+ mag: gl.NEAREST,
366
394
  format: gl.RED_INTEGER,
367
395
  internalFormat: gl.R32UI,
368
- height: 1,
369
- width: uniqueIds.length,
396
+ width,
397
+ height,
370
398
  },
371
- new Uint32Array(uniqueIds),
399
+ table,
372
400
  update ? existingTexture : false
373
401
  );
402
+ gl.bindTexture(gl.TEXTURE_2D, texture);
403
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_BASE_LEVEL, 0);
404
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAX_LEVEL, 0);
405
+ gl.bindTexture(gl.TEXTURE_2D, null);
374
406
 
375
407
  this.selectionTextures.set(selection, texture);
376
408
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.js"],"names":[],"mappings":";AAgGA;;;;;GAKG;AACH,8BAFW,MAAM,gBAmBhB;sBApHqB,gBAAgB;qBAFjB,KAAK;iBAGT,kBAAkB;oBACf,6BAA6B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.js"],"names":[],"mappings":";AAoGA;;;;;GAKG;AACH,8BAFW,MAAM,gBAkBhB;sBAvHqB,gBAAgB;qBAFjB,KAAK;iBAGT,kBAAkB;oBACf,6BAA6B"}
package/dist/src/index.js CHANGED
@@ -5,6 +5,7 @@ import GenomeSpy from "./genomeSpy.js";
5
5
  import icon from "./img/bowtie.svg";
6
6
  import favIcon from "./img/genomespy-favicon.svg";
7
7
  import { fetchJson } from "./utils/fetchUtils.js";
8
+ import inferSpecBaseUrl from "./utils/inferSpecBaseUrl.js";
8
9
 
9
10
  export { GenomeSpy, html, icon, favIcon };
10
11
 
@@ -78,7 +79,10 @@ export async function embed(el, spec, options = {}) {
78
79
  return genomeSpy.getNamedScaleResolutions().get(name);
79
80
  },
80
81
 
82
+ awaitVisibleLazyData: genomeSpy.awaitVisibleLazyData.bind(genomeSpy),
83
+ getRenderedBounds: genomeSpy.getRenderedBounds.bind(genomeSpy),
81
84
  updateNamedData: genomeSpy.updateNamedData.bind(genomeSpy),
85
+ getLogicalCanvasSize: genomeSpy.getLogicalCanvasSize.bind(genomeSpy),
82
86
  exportCanvas: genomeSpy.exportCanvas.bind(genomeSpy),
83
87
  };
84
88
  }
@@ -112,8 +116,7 @@ export async function loadSpec(url) {
112
116
  }
113
117
 
114
118
  if (!spec.baseUrl) {
115
- const m = url.match(/^[^?#]*\//);
116
- spec.baseUrl = (m && m[0]) || "./";
119
+ spec.baseUrl = inferSpecBaseUrl(url);
117
120
  }
118
121
 
119
122
  return spec;
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAoC/C;IATG;;;;;OAKG;IACH,yBAEC;IA8HD;;kBAGiC,GAAG;;;;MAEnC;CA4FR;iBA7QgB,WAAW"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAkC/C;IAPG;;;;;OAKG;IACH,yBAAiC;IAkIjC;;kBAGiC,GAAG;;;;MAEnC;CA4FR;iBA/QgB,WAAW"}
@@ -48,9 +48,7 @@ export default class LinkMark extends Mark {
48
48
  *
49
49
  * @private
50
50
  */
51
- this._baseInstanceExt = this.gl.getExtension(
52
- "WEBGL_draw_instanced_base_vertex_base_instance"
53
- );
51
+ this._baseInstanceExt = undefined;
54
52
  }
55
53
 
56
54
  /**
@@ -110,6 +108,10 @@ export default class LinkMark extends Mark {
110
108
  async initializeGraphics() {
111
109
  await super.initializeGraphics();
112
110
 
111
+ this._baseInstanceExt = this.gl.getExtension(
112
+ "WEBGL_draw_instanced_base_vertex_base_instance"
113
+ );
114
+
113
115
  this.createAndLinkShaders(VERTEX_SHADER, FRAGMENT_SHADER, [
114
116
  COMMON_SHADER,
115
117
  ]);
@@ -137,7 +137,7 @@ export default class Mark<P extends import("../spec/mark.js").MarkProps = import
137
137
  */
138
138
  get encoding(): import("../spec/channel.js").Encoding;
139
139
  getContext(): import("../types/viewContext.js").default;
140
- getType(): "link" | "rect" | "text" | "point" | "rule";
140
+ getType(): "link" | "point" | "text" | "rect" | "rule";
141
141
  initializeData(): void;
142
142
  /**
143
143
  * Initialize encoders that encode fields of the data (or constants) to
@@ -1 +1 @@
1
- {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
@@ -528,8 +528,7 @@ export default class Mark {
528
528
  }
529
529
  } else if (isMultiPointSelection(selection)) {
530
530
  // We need a texture for each multi-selection parameter.
531
- // The texture contains the uniqueIds of the selected data objects sorted
532
- // in ascending order, which allows for binary search.
531
+ // The texture stores an open-addressing hash table of selected uniqueIds.
533
532
  if (!selectionParameterUniforms.has(param)) {
534
533
  selectionParameterUniforms.set(param, "multi");
535
534
 
@@ -560,7 +559,7 @@ export default class Mark {
560
559
  const texName = SELECTION_TEXTURE_PREFIX + param;
561
560
  scaleCode.push(
562
561
  `bool ${SELECTION_CHECKER_PREFIX}${param}(bool empty) {\n` +
563
- ` return binarySearchTexture(${texName}, ${uniqueIdAttr}) || (empty && isEmptyBinarySearchTexture(${texName}));\n` +
562
+ ` return hashContainsTexture(${texName}, ${uniqueIdAttr}) || (empty && isEmptyHashTexture(${texName}));\n` +
564
563
  `}`
565
564
  );
566
565
 
@@ -1489,7 +1488,12 @@ export default class Mark {
1489
1488
  }
1490
1489
 
1491
1490
  // Viewport comprises the full canvas
1492
- gl.viewport(0, 0, canvasSize.width * dpr, canvasSize.height * dpr);
1491
+ gl.viewport(
1492
+ 0,
1493
+ 0,
1494
+ Math.round(canvasSize.width * dpr),
1495
+ Math.round(canvasSize.height * dpr)
1496
+ );
1493
1497
  gl.disable(gl.SCISSOR_TEST);
1494
1498
 
1495
1499
  // Offset and scale all drawing to the view rectangle
@@ -1,8 +1,19 @@
1
+ /**
2
+ * @param {any} domain
3
+ * @returns {domain is SelectionDomainRef}
4
+ */
5
+ export function isSelectionDomainRef(domain: any): domain is SelectionDomainRef;
1
6
  /**
2
7
  * @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
3
8
  * @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
4
9
  * @typedef {import("../spec/scale.js").ScalarDomain} ScalarDomain
10
+ * @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
5
11
  * @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
12
+ * @typedef {{
13
+ * param: string,
14
+ * encoding: "x" | "y",
15
+ * sync: "auto" | "oneWay" | "twoWay",
16
+ * }} SelectionDomainLinkInfo
6
17
  */
7
18
  export default class DomainPlanner {
8
19
  /**
@@ -10,14 +21,14 @@ export default class DomainPlanner {
10
21
  * @param {() => Set<ScaleResolutionMember>} options.getMembers
11
22
  * @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
12
23
  * @param {() => import("../spec/channel.js").Type} options.getType
13
- * @param {() => number[]} options.getLocusExtent
24
+ * @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} options.getLocusExtent
14
25
  * @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
15
26
  */
16
27
  constructor({ getMembers, getDataMembers, getType, getLocusExtent, fromComplexInterval, }: {
17
28
  getMembers: () => Set<ScaleResolutionMember>;
18
29
  getDataMembers?: () => Set<ScaleResolutionMember>;
19
30
  getType: () => import("../spec/channel.js").Type;
20
- getLocusExtent: () => number[];
31
+ getLocusExtent: (assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[];
21
32
  fromComplexInterval: (interval: ScalarDomain | ComplexDomain) => number[];
22
33
  });
23
34
  /**
@@ -25,14 +36,28 @@ export default class DomainPlanner {
25
36
  */
26
37
  get initialDomainSnapshot(): any[];
27
38
  hasConfiguredDomain(): boolean;
39
+ hasSelectionConfiguredDomain(): boolean;
40
+ /**
41
+ * @returns {SelectionDomainLinkInfo | undefined}
42
+ */
43
+ getSelectionConfiguredDomainInfo(): SelectionDomainLinkInfo | undefined;
28
44
  invalidateConfiguredDomain(): void;
45
+ /**
46
+ * Returns the default domain without considering configured domains.
47
+ *
48
+ * @param {boolean} [extractDataDomain]
49
+ * @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
50
+ * @returns {any[]}
51
+ */
52
+ getDefaultDomain(extractDataDomain?: boolean, locusAssembly?: import("../spec/scale.js").Scale["assembly"]): any[];
29
53
  /**
30
54
  * Returns the configured domain or a data-derived/default domain.
31
55
  *
32
56
  * @param {boolean} [extractDataDomain]
57
+ * @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
33
58
  * @returns {any[]}
34
59
  */
35
- getConfiguredOrDefaultDomain(extractDataDomain?: boolean): any[];
60
+ getConfiguredOrDefaultDomain(extractDataDomain?: boolean, locusAssembly?: import("../spec/scale.js").Scale["assembly"]): any[];
36
61
  /**
37
62
  * Unions the configured domains of all participating views.
38
63
  *
@@ -56,5 +81,11 @@ export default class DomainPlanner {
56
81
  export type DomainArray = import("../utils/domainArray.js").DomainArray;
57
82
  export type ComplexDomain = import("../spec/scale.js").ComplexDomain;
58
83
  export type ScalarDomain = import("../spec/scale.js").ScalarDomain;
84
+ export type SelectionDomainRef = import("../spec/scale.js").SelectionDomainRef;
59
85
  export type ScaleResolutionMember = import("./scaleResolution.js").ScaleResolutionMember;
86
+ export type SelectionDomainLinkInfo = {
87
+ param: string;
88
+ encoding: "x" | "y";
89
+ sync: "auto" | "oneWay" | "twoWay";
90
+ };
60
91
  //# sourceMappingURL=domainPlanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AAEH;IA2BI;;;;;;;OAOG;IACH,2FANG;QAAkD,UAAU,EAApD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACW,cAAc,GAAzD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACiB,OAAO,EAAxD,MAAM,OAAO,oBAAoB,EAAE,IAAI;QACf,cAAc,EAAtC,MAAM,MAAM,EAAE;QACgD,mBAAmB,EAAjF,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;KAC9D,EAaA;IAED;;OAEG;IACH,6BAFa,GAAG,EAAE,CAIjB;IAED,+BAEC;IAED,mCAEC;IAED;;;;;OAKG;IACH,iDAHW,OAAO,GACL,GAAG,EAAE,CAYjB;IAED;;;;OAIG;IACH,uBAFY,WAAW,CActB;IAED;;;;OAIG;IACH,iBAFY,WAAW,GAAG,SAAS,CAQlC;IAED;;;;OAIG;IACH,4BAJW,OAAO,qBAAqB,EAAE,SAAS,wBACvC,OAAO,GACL,OAAO,CAgBnB;;CAkCJ;0BA7KY,OAAO,yBAAyB,EAAE,WAAW;4BAC7C,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;oCACvC,OAAO,sBAAsB,EAAE,qBAAqB"}
1
+ {"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"AA8ZA;;;GAGG;AACH,6CAHW,GAAG,GACD,MAAM,IAAI,kBAAkB,CASxC;AAhaD;;;;;;;;;;;GAWG;AAEH;IA8BI;;;;;;;OAOG;IACH,2FANG;QAAkD,UAAU,EAApD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACW,cAAc,GAAzD,MAAM,GAAG,CAAC,qBAAqB,CAAC;QACiB,OAAO,EAAxD,MAAM,OAAO,oBAAoB,EAAE,IAAI;QACmD,cAAc,EAAxG,CAAC,QAAQ,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE;QAClB,mBAAmB,EAAjF,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;KAC9D,EAaA;IAED;;OAEG;IACH,6BAFa,GAAG,EAAE,CAIjB;IAED,+BAEC;IAED,wCAGC;IAED;;OAEG;IACH,oCAFa,uBAAuB,GAAG,SAAS,CAK/C;IAED,mCAEC;IAED;;;;;;OAMG;IACH,qCAJW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAC1C,GAAG,EAAE,CASjB;IAED;;;;;;OAMG;IACH,iDAJW,OAAO,kBACP,OAAO,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,GAC1C,GAAG,EAAE,CAQjB;IAED;;;;OAIG;IACH,uBAFY,WAAW,CAetB;IAED;;;;OAIG;IACH,iBAFY,WAAW,GAAG,SAAS,CAQlC;IAED;;;;OAIG;IACH,4BAJW,OAAO,qBAAqB,EAAE,SAAS,wBACvC,OAAO,GACL,OAAO,CAgBnB;;CAkCJ;0BAjNY,OAAO,yBAAyB,EAAE,WAAW;4BAC7C,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;iCACvC,OAAO,kBAAkB,EAAE,kBAAkB;oCAC7C,OAAO,sBAAsB,EAAE,qBAAqB;sCACpD;IACR,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;CACpC"}