@genome-spy/core 0.58.1 → 0.60.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 (117) hide show
  1. package/dist/bundle/{index-DwLfOHEk.js → index-5ajWdKly.js} +1 -1
  2. package/dist/bundle/{index-vgGDWUPz.js → index-B03-Om4z.js} +1 -1
  3. package/dist/bundle/index-Bg7C4Xat.js +2750 -0
  4. package/dist/bundle/{index-CalimFw3.js → index-C3QR8Lv6.js} +79 -79
  5. package/dist/bundle/{index-DKe9Bhvi.js → index-g8iXgW0W.js} +1 -1
  6. package/dist/bundle/index.es.js +6554 -6011
  7. package/dist/bundle/index.js +189 -164
  8. package/dist/bundle/{long-BviWyoZx.js → long-B-FASCSo.js} +45 -45
  9. package/dist/schema.json +312 -25
  10. package/dist/src/data/collector.d.ts.map +1 -1
  11. package/dist/src/data/collector.js +1 -0
  12. package/dist/src/data/flowNode.d.ts.map +1 -1
  13. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  14. package/dist/src/data/sources/dataUtils.d.ts +2 -1
  15. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  16. package/dist/src/data/sources/dataUtils.js +3 -4
  17. package/dist/src/data/sources/inlineSource.d.ts +8 -0
  18. package/dist/src/data/sources/inlineSource.d.ts.map +1 -1
  19. package/dist/src/data/sources/inlineSource.js +17 -1
  20. package/dist/src/data/sources/urlSource.d.ts +1 -0
  21. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  22. package/dist/src/data/sources/urlSource.js +33 -4
  23. package/dist/src/data/transforms/identifier.d.ts.map +1 -1
  24. package/dist/src/data/transforms/measureText.js +1 -1
  25. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  26. package/dist/src/data/transforms/regexFold.js +10 -0
  27. package/dist/src/data/transforms/regexFold.test.js +13 -0
  28. package/dist/src/encoder/encoder.d.ts +1 -1
  29. package/dist/src/fonts/bmFontManager.js +2 -2
  30. package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -1
  31. package/dist/src/genomeSpy.d.ts.map +1 -1
  32. package/dist/src/genomeSpy.js +39 -19
  33. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  34. package/dist/src/gl/colorUtils.d.ts +4 -0
  35. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  36. package/dist/src/gl/colorUtils.js +8 -0
  37. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  38. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  39. package/dist/src/gl/glslScaleGenerator.js +1 -9
  40. package/dist/src/gl/includes/common.glsl.js +1 -1
  41. package/dist/src/gl/webGLHelper.d.ts +1 -1
  42. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  43. package/dist/src/marks/link.d.ts.map +1 -1
  44. package/dist/src/marks/link.js +9 -1
  45. package/dist/src/marks/mark.d.ts +8 -0
  46. package/dist/src/marks/mark.d.ts.map +1 -1
  47. package/dist/src/marks/mark.js +101 -3
  48. package/dist/src/marks/point.d.ts +1 -1
  49. package/dist/src/marks/point.d.ts.map +1 -1
  50. package/dist/src/marks/point.fragment.glsl.js +1 -1
  51. package/dist/src/marks/point.vertex.glsl.js +1 -1
  52. package/dist/src/marks/rect.common.glsl.js +1 -1
  53. package/dist/src/marks/rect.d.ts.map +1 -1
  54. package/dist/src/marks/rect.fragment.glsl.js +1 -1
  55. package/dist/src/marks/rect.js +41 -0
  56. package/dist/src/marks/rect.vertex.glsl.js +1 -1
  57. package/dist/src/selection/selection.d.ts +27 -2
  58. package/dist/src/selection/selection.d.ts.map +1 -1
  59. package/dist/src/selection/selection.js +53 -3
  60. package/dist/src/spec/data.d.ts +18 -1
  61. package/dist/src/spec/mark.d.ts +58 -1
  62. package/dist/src/spec/parameter.d.ts +71 -31
  63. package/dist/src/spec/sampleView.d.ts +12 -1
  64. package/dist/src/spec/view.d.ts +9 -2
  65. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  66. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  67. package/dist/src/styles/genome-spy.css.js +12 -1
  68. package/dist/src/styles/genome-spy.scss +19 -1
  69. package/dist/src/types/selectionTypes.d.ts +4 -7
  70. package/dist/src/types/viewContext.d.ts +0 -15
  71. package/dist/src/utils/expression.d.ts.map +1 -1
  72. package/dist/src/utils/expression.js +4 -0
  73. package/dist/src/utils/indexer.d.ts +0 -2
  74. package/dist/src/utils/indexer.d.ts.map +1 -1
  75. package/dist/src/utils/reservationMap.d.ts +4 -4
  76. package/dist/src/utils/reservationMap.d.ts.map +1 -1
  77. package/dist/src/utils/scaleNull.d.ts +0 -2
  78. package/dist/src/utils/scaleNull.d.ts.map +1 -1
  79. package/dist/src/utils/trees.d.ts +2 -2
  80. package/dist/src/utils/ui/tooltip.d.ts +6 -10
  81. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  82. package/dist/src/utils/ui/tooltip.js +74 -42
  83. package/dist/src/view/concatView.d.ts +1 -1
  84. package/dist/src/view/concatView.d.ts.map +1 -1
  85. package/dist/src/view/concatView.js +1 -1
  86. package/dist/src/view/gridView/gridChild.d.ts +53 -0
  87. package/dist/src/view/gridView/gridChild.d.ts.map +1 -0
  88. package/dist/src/view/gridView/gridChild.js +753 -0
  89. package/dist/src/view/gridView/gridView.d.ts +64 -0
  90. package/dist/src/view/gridView/gridView.d.ts.map +1 -0
  91. package/dist/src/view/{gridView.js → gridView/gridView.js} +40 -595
  92. package/dist/src/view/gridView/scrollbar.d.ts +32 -0
  93. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -0
  94. package/dist/src/view/gridView/scrollbar.js +186 -0
  95. package/dist/src/view/gridView/selectionRect.d.ts +10 -0
  96. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -0
  97. package/dist/src/view/gridView/selectionRect.js +182 -0
  98. package/dist/src/view/layout/rectangle.d.ts +11 -1
  99. package/dist/src/view/layout/rectangle.d.ts.map +1 -1
  100. package/dist/src/view/layout/rectangle.js +22 -2
  101. package/dist/src/view/layout/rectangle.test.js +12 -0
  102. package/dist/src/view/paramMediator.d.ts.map +1 -1
  103. package/dist/src/view/paramMediator.js +11 -2
  104. package/dist/src/view/scaleResolution.d.ts +1 -0
  105. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  106. package/dist/src/view/scaleResolution.js +43 -33
  107. package/dist/src/view/testUtils.d.ts.map +1 -1
  108. package/dist/src/view/testUtils.js +0 -4
  109. package/dist/src/view/view.d.ts +6 -0
  110. package/dist/src/view/view.d.ts.map +1 -1
  111. package/dist/src/view/view.js +19 -0
  112. package/dist/src/view/viewFactory.d.ts.map +1 -1
  113. package/dist/src/view/viewFactory.js +13 -1
  114. package/package.json +2 -2
  115. package/dist/bundle/index-DS2hvLgl.js +0 -3425
  116. package/dist/src/view/gridView.d.ts +0 -135
  117. package/dist/src/view/gridView.d.ts.map +0 -1
@@ -85,9 +85,6 @@ export default class ScaleResolution {
85
85
  * @typedef {VegaScale & { props: import("../spec/scale.js").Scale }} ScaleWithProps
86
86
  */
87
87
 
88
- /** @type {number[]} */
89
- #zoomExtent;
90
-
91
88
  /**
92
89
  * @type {Record<ScaleResolutionEventType, Set<ScaleResolutionListener>>}
93
90
  */
@@ -99,6 +96,12 @@ export default class ScaleResolution {
99
96
  /** @type {ScaleWithProps} */
100
97
  #scale;
101
98
 
99
+ /**
100
+ * The initial domain before any zooming.
101
+ * @type {any[]}
102
+ */
103
+ #initialDomain;
104
+
102
105
  /**
103
106
  * Keeps track of the expression references in the range. If range is modified,
104
107
  * new expressions are created and the old ones must be invalidated.
@@ -129,6 +132,14 @@ export default class ScaleResolution {
129
132
  return this.#firstMemberView.context;
130
133
  }
131
134
 
135
+ get zoomExtent() {
136
+ return (
137
+ (this.#scale &&
138
+ isContinuous(this.#scale.type) &&
139
+ this.#getZoomExtent()) ?? [-Infinity, Infinity]
140
+ );
141
+ }
142
+
132
143
  /**
133
144
  * Adds a listener that is called when the scale domain is changed,
134
145
  * e.g., zoomed. The call is synchronous and happens before the views
@@ -170,11 +181,17 @@ export default class ScaleResolution {
170
181
  addMember(newMember) {
171
182
  const { channel, channelDef } = newMember;
172
183
 
184
+ // A convenience hack for cases where the new member should adapt
185
+ // the scale type to the existing one. For example: SelectionRect
186
+ // TODO: Add test
187
+ const adapt = channelDef.type == null && this.type;
188
+
173
189
  if (
174
190
  // @ts-expect-error "sample" is not really a channel with scale
175
191
  channel != "sample" &&
176
192
  !channelDef.type &&
177
- !isSecondaryChannel(channel)
193
+ !isSecondaryChannel(channel) &&
194
+ !adapt
178
195
  ) {
179
196
  throw new Error(
180
197
  `The "type" property must be defined in channel definition: "${channel}": ${JSON.stringify(
@@ -198,15 +215,17 @@ export default class ScaleResolution {
198
215
  this.name = name;
199
216
  }
200
217
 
201
- if (!this.type) {
202
- this.type = type;
203
- } else if (type !== this.type && !isSecondaryChannel(channel)) {
204
- // TODO: Include a reference to the layer
205
- throw new Error(
206
- `Can not use shared scale for different data types: ${this.type} vs. ${type}. Use "resolve: independent" for channel ${this.channel}`
207
- );
208
- // Actually, point scale could be changed into band scale
209
- // TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
218
+ if (!adapt) {
219
+ if (!this.type) {
220
+ this.type = type;
221
+ } else if (type !== this.type && !isSecondaryChannel(channel)) {
222
+ // TODO: Include a reference to the layer
223
+ throw new Error(
224
+ `Can not use shared scale for different data types: ${this.type} vs. ${type}. Use "resolve: independent" for channel ${this.channel}`
225
+ );
226
+ // Actually, point scale could be changed into band scale
227
+ // TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
228
+ }
210
229
  }
211
230
 
212
231
  this.members.push(newMember);
@@ -450,11 +469,8 @@ export default class ScaleResolution {
450
469
  scale.props = props;
451
470
  this.#configureRange();
452
471
 
453
- if (isContinuous(scale.type)) {
454
- this.#zoomExtent = this.#getZoomExtent();
455
- }
456
-
457
472
  if (!domainWasInitialized) {
473
+ this.#initialDomain = scale.domain();
458
474
  this.#notifyListeners("domain");
459
475
  return;
460
476
  }
@@ -502,10 +518,6 @@ export default class ScaleResolution {
502
518
  scale.genome(this.getGenome());
503
519
  }
504
520
 
505
- if (isContinuous(scale.type)) {
506
- this.#zoomExtent = this.#getZoomExtent();
507
- }
508
-
509
521
  // Hijack the range method
510
522
  const range = scale.range;
511
523
  if (range) {
@@ -630,13 +642,8 @@ export default class ScaleResolution {
630
642
  }
631
643
 
632
644
  // TODO: Use the zoomTo method. Move clamping etc there.
633
- if (this.#zoomExtent) {
634
- newDomain = clampRange(
635
- newDomain,
636
- this.#zoomExtent[0],
637
- this.#zoomExtent[1]
638
- );
639
- }
645
+ const zoomExtent = this.zoomExtent;
646
+ newDomain = clampRange(newDomain, zoomExtent[0], zoomExtent[1]);
640
647
 
641
648
  if ([0, 1].some((i) => newDomain[i] != oldDomain[i])) {
642
649
  scale.domain(newDomain);
@@ -741,7 +748,7 @@ export default class ScaleResolution {
741
748
  getZoomLevel() {
742
749
  // Zoom level makes sense only for user-zoomable scales where zoom extent is defined
743
750
  if (this.isZoomable()) {
744
- return span(this.#zoomExtent) / span(this.scale.domain());
751
+ return span(this.zoomExtent) / span(this.scale.domain());
745
752
  }
746
753
 
747
754
  return 1.0;
@@ -777,6 +784,9 @@ export default class ScaleResolution {
777
784
  : 0;
778
785
  }
779
786
 
787
+ /**
788
+ * @returns {number[]}
789
+ */
780
790
  #getZoomExtent() {
781
791
  const props = this.scale.props;
782
792
  const zoom = props.zoom;
@@ -791,11 +801,11 @@ export default class ScaleResolution {
791
801
  if (props.type == "locus") {
792
802
  return this.getGenome().getExtent();
793
803
  }
794
-
795
- // TODO: Perhaps this should be "domain" for index scale and nothing for quantitative.
796
- // Would behave similarly to Vega-Lite, which doesn't have constraints.
797
- return this.#scale.domain();
798
804
  }
805
+
806
+ // TODO: Perhaps this should be "domain" for index scale and nothing for quantitative.
807
+ // Would behave similarly to Vega-Lite, which doesn't have constraints.
808
+ return this.#initialDomain;
799
809
  }
800
810
 
801
811
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAmDvD;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAgBhL,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;;;;;uBApFpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CA+CvD;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAgBhL,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;;;;;uBAhFpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
@@ -37,10 +37,6 @@ export function createTestViewContext(viewFactoryOptions = {}) {
37
37
 
38
38
  // @ts-expect-error
39
39
  const c = /** @type {ViewContext} */ ({
40
- createView: function (spec, parent, defaultName) {
41
- throw new Error("Not implemented: createView");
42
- },
43
-
44
40
  createOrImportView: async function (
45
41
  spec,
46
42
  parent,
@@ -194,6 +194,12 @@ export default class View {
194
194
  * @param {boolean} [useCapture]
195
195
  */
196
196
  addInteractionEventListener(type: string, listener: InteractionEventListener, useCapture?: boolean): void;
197
+ /**
198
+ * @param {string} type
199
+ * @param {InteractionEventListener} listener
200
+ * @param {boolean} [useCapture]
201
+ */
202
+ removeInteractionEventListener(type: string, listener: InteractionEventListener, useCapture?: boolean): void;
197
203
  /**
198
204
  * Visits child views in depth-first order. Visitor's return value
199
205
  * controls the traversal.
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
@@ -150,6 +150,7 @@ export default class View {
150
150
 
151
151
  if (spec.params) {
152
152
  for (const param of spec.params) {
153
+ // TODO: If interval selection, validate `encodings` or provides defaults
153
154
  this.paramMediator.registerParam(param);
154
155
  }
155
156
  }
@@ -451,6 +452,24 @@ export default class View {
451
452
  listeners.push(listener);
452
453
  }
453
454
 
455
+ /**
456
+ * @param {string} type
457
+ * @param {InteractionEventListener} listener
458
+ * @param {boolean} [useCapture]
459
+ */
460
+ removeInteractionEventListener(type, listener, useCapture) {
461
+ const listenersByType = useCapture
462
+ ? this.#capturingInteractionEventListeners
463
+ : this.#nonCapturingInteractionEventListeners;
464
+ let listeners = listenersByType?.[type];
465
+ if (listeners) {
466
+ const index = listeners.indexOf(listener);
467
+ if (index >= 0) {
468
+ listeners.splice(index, 1);
469
+ }
470
+ }
471
+ }
472
+
454
473
  /**
455
474
  * Visits child views in depth-first order. Visitor's return value
456
475
  * controls the traversal.
@@ -1 +1 @@
1
- {"version":3,"file":"viewFactory.d.ts","sourceRoot":"","sources":["../../../src/view/viewFactory.js"],"names":[],"mappings":"AAgRA;;;;GAIG;AACH,sEAFa,IAAI,sCAAY,CAI5B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAI7B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAS7B;AAED;;;;GAIG;AACH,kFAFa,IAAI,IAAI,OAAO,iBAAiB,EAAE,oBAAoB,CAQlE;AAED;;;;GAIG;AACH,mCAHW,MAAM,GACJ,IAAI,IAAI,OAAO,iBAAiB,EAAE,UAAU,CAIxD;AAED;;;;GAIG;AACH,yEAFa,IAAI,yCAAe,CAI/B;AAED;;;;GAIG;AACH,yEAFa,IAAI,IAAI,WAAW,CAI/B;AAED;;;;GAIG;AACH,wEAFa,IAAI,wCAAc,CAI9B;AAED;;;;GAIG;AACH,wEAFa,IAAI,8CAAc,CAS9B;AAlWD,wCAAyC;AAEzC;;;;GAIG;AAEH;;GAEG;AACH;IAiBI;;OAEG;IACH,sBAFW,kBAAkB,EAoC5B;IAjCG,2CAA2C;IAC3C,SADW,QAAQ,CAAC,kBAAkB,CAAC,CAKtC;IA8BL;;;OAGG;IACH,qEAlDiC,OAAO,yHAC2B,OAAO,oBAAoB,EAAE,OAAO,eAAe,OAAO,WAAW,EAAE,OAAO,gBAAgB,MAAM,KAAK,IAAI,QAmD/K;IAED;;;;;;OAMG;IACH,wHAJW,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,QAmBhB;IAED;;;;OAIG;IACH,sDAFa,IAAI,sCAAY,CAU5B;IAED;;;;;;;;;;OAUG;IACH,yBAPW,qCAAW,OAAO,iBAAiB,EAAE,UAAU,qEAE/C,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,cACN,CAAC,IAAI,oCAAU,KAAK,IAAI,iBAuElC;;CACJ;;;;;kBAjMa,OAAO;eACP,OAAO;;iBAfJ,WAAW"}
1
+ {"version":3,"file":"viewFactory.d.ts","sourceRoot":"","sources":["../../../src/view/viewFactory.js"],"names":[],"mappings":"AA4RA;;;;GAIG;AACH,sEAFa,IAAI,sCAAY,CAI5B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAI7B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAS7B;AAED;;;;GAIG;AACH,kFAFa,IAAI,IAAI,OAAO,iBAAiB,EAAE,oBAAoB,CAQlE;AAED;;;;GAIG;AACH,mCAHW,MAAM,GACJ,IAAI,IAAI,OAAO,iBAAiB,EAAE,UAAU,CAIxD;AAED;;;;GAIG;AACH,yEAFa,IAAI,yCAAe,CAI/B;AAED;;;;GAIG;AACH,yEAFa,IAAI,IAAI,WAAW,CAI/B;AAED;;;;GAIG;AACH,wEAFa,IAAI,wCAAc,CAI9B;AAED;;;;GAIG;AACH,wEAFa,IAAI,8CAAc,CAS9B;AA5WD,6BAA8B,UAAU,CAAC;AAEzC;;;;GAIG;AAEH;;GAEG;AACH;IAiBI;;OAEG;IACH,sBAFW,kBAAkB,EAoC5B;IAjCG,2CAA2C;IAC3C,SADW,QAAQ,CAAC,kBAAkB,CAAC,CAKtC;IA8BL;;;OAGG;IACH,qEAlDiC,OAAO,yHAC2B,OAAO,oBAAoB,EAAE,OAAO,eAAe,OAAO,WAAW,EAAE,OAAO,gBAAgB,MAAM,KAAK,IAAI,QAmD/K;IAED;;;;;;OAMG;IACH,wHAJW,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,QAmBhB;IAED;;;;OAIG;IACH,sDAFa,IAAI,sCAAY,CAU5B;IAED;;;;;;;;;;OAUG;IACH,yBAPW,qCAAW,OAAO,iBAAiB,EAAE,UAAU,qEAE/C,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,cACN,CAAC,IAAI,oCAAU,KAAK,IAAI,iBAiFlC;;CACJ;;;;;kBA3Ma,OAAO;eACP,OAAO;;iBAjBJ,WAAW"}
@@ -8,6 +8,8 @@ import { isArray, isObject, isString } from "vega-util";
8
8
  import { loadExternalViewSpec } from "./viewUtils.js";
9
9
  import ContainerView from "./containerView.js";
10
10
  import ViewError from "./viewError.js";
11
+ import { isSelectionParameter } from "./paramMediator.js";
12
+ import { asSelectionConfig } from "../selection/selection.js";
11
13
 
12
14
  export const VIEW_ROOT_NAME = "viewRoot";
13
15
 
@@ -179,11 +181,21 @@ export class ViewFactory {
179
181
  viewSpec = spec;
180
182
  }
181
183
 
184
+ // A view with an interval selection always needs a parent.
185
+ const hasIntervalSelection = (/** @type {ViewSpec} */ spec) =>
186
+ spec?.params?.some(
187
+ (param) =>
188
+ isSelectionParameter(param) &&
189
+ asSelectionConfig(param.select).type == "interval"
190
+ );
191
+
182
192
  // Wrap a unit spec at root into a grid view to get axes, etc.
183
193
  if (
184
194
  !dataParent &&
185
195
  this.options.wrapRoot &&
186
- (isUnitSpec(viewSpec) || isLayerSpec(viewSpec)) &&
196
+ (isUnitSpec(viewSpec) ||
197
+ isLayerSpec(viewSpec) ||
198
+ hasIntervalSelection(viewSpec)) &&
187
199
  defaultName === VIEW_ROOT_NAME
188
200
  ) {
189
201
  viewSpec = {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.58.1",
10
+ "version": "0.60.0",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -67,5 +67,5 @@
67
67
  "devDependencies": {
68
68
  "@types/long": "^4.0.1"
69
69
  },
70
- "gitHead": "384bbeb23f684e1f6faea11b4e94bfdbba303987"
70
+ "gitHead": "82948eadeadfedcb13e669f6664e163dac3a6a92"
71
71
  }