@genome-spy/core 0.65.0 → 0.67.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 (249) hide show
  1. package/dist/bundle/browser-BRemItdO.js +138 -0
  2. package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
  3. package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
  4. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  5. package/dist/bundle/index-D28m8tSW.js +1607 -0
  6. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  7. package/dist/bundle/index.es.js +15821 -14601
  8. package/dist/bundle/index.js +214 -212
  9. package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
  10. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  11. package/dist/schema.json +13 -3
  12. package/dist/src/config/scaleDefaults.d.ts +8 -0
  13. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  14. package/dist/src/config/scaleDefaults.js +45 -0
  15. package/dist/src/data/flowHandle.d.ts +2 -0
  16. package/dist/src/data/flowHandle.d.ts.map +1 -1
  17. package/dist/src/data/flowHandle.js +1 -0
  18. package/dist/src/data/flowInit.d.ts +12 -4
  19. package/dist/src/data/flowInit.d.ts.map +1 -1
  20. package/dist/src/data/flowInit.js +115 -16
  21. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  22. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  23. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  25. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  27. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  28. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  29. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  30. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  31. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  32. package/dist/src/encoder/encoder.d.ts +1 -1
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/encoder/encoder.js +1 -1
  35. package/dist/src/genome/scaleLocus.d.ts +39 -0
  36. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  37. package/dist/src/genome/scaleLocus.js +76 -0
  38. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  39. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  40. package/dist/src/genomeSpy/canvasExport.js +66 -0
  41. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  42. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  43. package/dist/src/genomeSpy/containerUi.js +78 -0
  44. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  45. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  46. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  47. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  48. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  49. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  50. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  51. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  52. package/dist/src/genomeSpy/interactionController.js +371 -0
  53. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  54. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  55. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  56. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  57. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  58. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  59. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  60. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  61. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  62. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  63. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  64. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  65. package/dist/src/genomeSpy/viewDataInit.d.ts +22 -0
  66. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  67. package/dist/src/genomeSpy/viewDataInit.js +160 -0
  68. package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
  69. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
  70. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  71. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  73. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  74. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  76. package/dist/src/genomeSpy.d.ts +17 -71
  77. package/dist/src/genomeSpy.d.ts.map +1 -1
  78. package/dist/src/genomeSpy.js +197 -741
  79. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  80. package/dist/src/gl/dataToVertices.js +16 -4
  81. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  82. package/dist/src/gl/webGLHelper.d.ts +2 -2
  83. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  84. package/dist/src/gl/webGLHelper.js +4 -4
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +2 -12
  87. package/dist/src/marks/mark.d.ts.map +1 -1
  88. package/dist/src/marks/mark.js +4 -2
  89. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  90. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  91. package/dist/src/{view → scales}/axisResolution.js +29 -18
  92. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  93. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  94. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  95. package/dist/src/scales/scaleDomainAggregator.js +167 -0
  96. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  97. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  98. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  99. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  100. package/dist/src/scales/scaleInstanceManager.js +317 -0
  101. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  102. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  103. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  104. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  105. package/dist/src/scales/scaleInteractionController.js +336 -0
  106. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  107. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  108. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  109. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  110. package/dist/src/scales/scalePropsResolver.js +74 -0
  111. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -35
  112. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  113. package/dist/src/scales/scaleResolution.js +732 -0
  114. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  115. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  116. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  117. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  118. package/dist/src/scales/scaleRules.d.ts +16 -0
  119. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  120. package/dist/src/scales/scaleRules.js +103 -0
  121. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  122. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  123. package/dist/src/spec/channel.d.ts +13 -18
  124. package/dist/src/spec/scale.d.ts +6 -0
  125. package/dist/src/types/embedApi.d.ts +5 -0
  126. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  127. package/dist/src/utils/domainArray.d.ts.map +1 -1
  128. package/dist/src/utils/domainArray.js +3 -0
  129. package/dist/src/utils/indexer.d.ts +3 -0
  130. package/dist/src/utils/indexer.d.ts.map +1 -1
  131. package/dist/src/utils/indexer.js +3 -0
  132. package/dist/src/view/concatView.d.ts +18 -0
  133. package/dist/src/view/concatView.d.ts.map +1 -1
  134. package/dist/src/view/concatView.js +73 -0
  135. package/dist/src/view/concatView.test.d.ts +2 -0
  136. package/dist/src/view/concatView.test.d.ts.map +1 -0
  137. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  138. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  139. package/dist/src/view/containerMutationHelper.js +118 -0
  140. package/dist/src/view/containerView.d.ts +0 -7
  141. package/dist/src/view/containerView.d.ts.map +1 -1
  142. package/dist/src/view/containerView.js +0 -10
  143. package/dist/src/view/facetView.d.ts.map +1 -1
  144. package/dist/src/view/facetView.js +0 -15
  145. package/dist/src/view/flowBuilder.d.ts +5 -3
  146. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  147. package/dist/src/view/flowBuilder.js +69 -6
  148. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  149. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  150. package/dist/src/view/gridView/gridChild.js +32 -6
  151. package/dist/src/view/gridView/gridView.d.ts +39 -1
  152. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  153. package/dist/src/view/gridView/gridView.js +106 -48
  154. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  155. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  156. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  157. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  158. package/dist/src/view/gridView/scrollbar.js +184 -69
  159. package/dist/src/view/layerView.d.ts +14 -0
  160. package/dist/src/view/layerView.d.ts.map +1 -1
  161. package/dist/src/view/layerView.js +66 -0
  162. package/dist/src/view/layerView.test.d.ts +2 -0
  163. package/dist/src/view/layerView.test.d.ts.map +1 -0
  164. package/dist/src/view/testUtils.d.ts.map +1 -1
  165. package/dist/src/view/testUtils.js +7 -1
  166. package/dist/src/view/unitView.d.ts.map +1 -1
  167. package/dist/src/view/unitView.js +41 -36
  168. package/dist/src/view/view.d.ts +18 -6
  169. package/dist/src/view/view.d.ts.map +1 -1
  170. package/dist/src/view/view.js +30 -4
  171. package/package.json +2 -2
  172. package/dist/bundle/browser-txUcLy2H.js +0 -123
  173. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  174. package/dist/bundle/index-BhtHKLUo.js +0 -73
  175. package/dist/bundle/index-CCe8rnZz.js +0 -716
  176. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  177. package/dist/src/data/collector.test.js +0 -138
  178. package/dist/src/data/dataFlow.test.js +0 -38
  179. package/dist/src/data/flow.test.js +0 -81
  180. package/dist/src/data/flowInit.test.js +0 -413
  181. package/dist/src/data/flowNode.test.js +0 -50
  182. package/dist/src/data/flowOptimizer.test.js +0 -209
  183. package/dist/src/data/formats/fasta.test.js +0 -27
  184. package/dist/src/data/sources/inlineSource.test.js +0 -63
  185. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  186. package/dist/src/data/transforms/aggregate.test.js +0 -134
  187. package/dist/src/data/transforms/clone.test.js +0 -11
  188. package/dist/src/data/transforms/coverage.test.js +0 -238
  189. package/dist/src/data/transforms/filter.test.js +0 -20
  190. package/dist/src/data/transforms/flatten.test.js +0 -96
  191. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  192. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  193. package/dist/src/data/transforms/formula.test.js +0 -25
  194. package/dist/src/data/transforms/identifier.test.js +0 -92
  195. package/dist/src/data/transforms/pileup.test.js +0 -70
  196. package/dist/src/data/transforms/project.test.js +0 -32
  197. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  198. package/dist/src/data/transforms/regexFold.test.js +0 -201
  199. package/dist/src/data/transforms/sample.test.js +0 -38
  200. package/dist/src/data/transforms/stack.test.js +0 -91
  201. package/dist/src/encoder/accessor.test.js +0 -162
  202. package/dist/src/encoder/encoder.test.js +0 -105
  203. package/dist/src/genome/genome.test.js +0 -268
  204. package/dist/src/genome/genomes.test.js +0 -8
  205. package/dist/src/genome/scaleIndex.test.js +0 -78
  206. package/dist/src/genome/scaleLocus.test.js +0 -4
  207. package/dist/src/scale/scale.test.js +0 -326
  208. package/dist/src/scale/ticks.test.js +0 -46
  209. package/dist/src/selection/selection.test.js +0 -14
  210. package/dist/src/utils/addBaseUrl.test.js +0 -30
  211. package/dist/src/utils/binnedIndex.test.js +0 -201
  212. package/dist/src/utils/cloner.test.js +0 -35
  213. package/dist/src/utils/coalesce.test.js +0 -16
  214. package/dist/src/utils/concatIterables.test.js +0 -8
  215. package/dist/src/utils/domainArray.test.js +0 -130
  216. package/dist/src/utils/indexer.test.js +0 -49
  217. package/dist/src/utils/interactionEvent.test.js +0 -35
  218. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  219. package/dist/src/utils/kWayMerge.test.js +0 -30
  220. package/dist/src/utils/mergeObjects.test.js +0 -42
  221. package/dist/src/utils/numberExtractor.test.js +0 -6
  222. package/dist/src/utils/propertyCacher.test.js +0 -89
  223. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  224. package/dist/src/utils/radixSort.test.js +0 -51
  225. package/dist/src/utils/reservationMap.test.js +0 -20
  226. package/dist/src/utils/ringBuffer.test.js +0 -39
  227. package/dist/src/utils/topK.test.js +0 -54
  228. package/dist/src/utils/trees.test.js +0 -135
  229. package/dist/src/utils/url.test.js +0 -28
  230. package/dist/src/utils/variableTools.test.js +0 -13
  231. package/dist/src/view/axisResolution.d.ts.map +0 -1
  232. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  233. package/dist/src/view/axisResolution.test.js +0 -206
  234. package/dist/src/view/flowBuilder.test.js +0 -125
  235. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  236. package/dist/src/view/layout/flexLayout.test.js +0 -323
  237. package/dist/src/view/layout/grid.test.js +0 -71
  238. package/dist/src/view/layout/rectangle.test.js +0 -192
  239. package/dist/src/view/paramMediator.test.js +0 -282
  240. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  241. package/dist/src/view/scaleResolution.js +0 -1059
  242. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  243. package/dist/src/view/scaleResolution.test.js +0 -645
  244. package/dist/src/view/view.test.js +0 -245
  245. package/dist/src/view/viewDispose.test.js +0 -110
  246. package/dist/src/view/viewFactory.test.js +0 -25
  247. package/dist/src/view/viewUtils.test.js +0 -87
  248. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  249. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA;;GAEG;AACH;IAeI;;;OAGG;IACH,uBAHW,OAAO,gBAAgB,EAAE,OAAO,mBAChC,eAAe,EA2FzB;IA/FD,uBAAmB;IAsCf;;;MAAoB;IAIpB;;;;MAQC;IA+CL,2BAKC;IAWD;;;;OAIG;IACH,gCAHW,SAAS,UACT,SAAS,QA8CnB;;CACJ;8BAlLY,YAAY,GAAG,UAAU;qBAHjB,gBAAgB;sBADf,wBAAwB"}
1
+ {"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IAwBI;;;;OAIG;IACH,uBAJW,OAAO,gBAAgB,EAAE,OAAO,mBAChC,eAAe,YACf;QAAE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,EAwH/D;IAvID;;;;;;OAMG;IACH,uBAAmB;IAiDf;;;;MAAoB;IAiFxB,2BAEC;IAED;;;OAGG;IACH,yBAHW,MAAM,6BACN;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,QAYtD;IAqFD;;;;;;;;;OASG;IACH,gCAHW,SAAS,iBACT,SAAS,QASnB;IAMG;;;;MAWC;;CAER;;;;;8BAlSY,YAAY,GAAG,UAAU;qBANjB,gBAAgB;sBADf,wBAAwB"}
@@ -4,37 +4,57 @@ import Rectangle from "../layout/rectangle.js";
4
4
  import UnitView from "../unitView.js";
5
5
 
6
6
  /**
7
+ * This class represents a scrollbar thumb that can be used within a grid view
8
+ * to provide scrolling functionality for overflowing content.
9
+ *
7
10
  * @typedef {"horizontal" | "vertical"} ScrollDirection
8
11
  */
9
12
  export default class Scrollbar extends UnitView {
10
13
  /** @type {ScrollDirection} */
11
14
  #scrollDirection;
12
15
 
16
+ // NOTE: Keep this Rectangle instance stable. Buffered rendering caches
17
+ // a reference to coords; replacing it breaks dynamic updates.
13
18
  #scrollbarCoords = Rectangle.ZERO;
14
19
 
15
- #maxScrollOffset = 0;
20
+ #viewportCoords = Rectangle.ZERO;
16
21
 
17
- #maxViewportOffset = 0;
22
+ #contentCoords = Rectangle.ZERO;
18
23
 
19
- // This is the actual state of the scrollbar. It's better to keep track of
20
- // the viewport offset rather than the scrollbar offset because the former
21
- // is more stable when the viewport size changes.
24
+ /**
25
+ * The actual state of the scrollbar.
26
+ *
27
+ * It's better to keep track of the viewport offset rather than the
28
+ * scrollbar offset because the former is more stable when the
29
+ * viewport size changes.
30
+ */
22
31
  viewportOffset = 0;
23
32
 
33
+ /** @type {(offset: number) => void} */
34
+ #onViewportOffsetChange;
35
+
24
36
  /**
25
37
  * @param {import("./gridChild.js").default} gridChild
26
38
  * @param {ScrollDirection} scrollDirection
39
+ * @param {{ onViewportOffsetChange?: (offset: number) => void }} [options]
27
40
  */
28
- constructor(gridChild, scrollDirection) {
29
- // TODO: Configurable
41
+ constructor(gridChild, scrollDirection, options = {}) {
42
+ // TODO: Configurable per view
30
43
  const config = {
31
44
  scrollbarSize: 8,
32
45
  scrollbarPadding: 2,
33
- // TODO: inside/outside view
46
+ scrollbarMinLength: 20,
34
47
  };
35
48
 
36
49
  super(
37
50
  {
51
+ params: [
52
+ {
53
+ name: "scrollbarOpacity",
54
+ value: 1,
55
+ },
56
+ ],
57
+ opacity: { expr: "scrollbarOpacity" },
38
58
  data: { values: [{}] },
39
59
  mark: {
40
60
  type: "rect",
@@ -59,22 +79,41 @@ export default class Scrollbar extends UnitView {
59
79
 
60
80
  this.config = config;
61
81
  this.#scrollDirection = scrollDirection;
82
+ this.#onViewportOffsetChange = options.onViewportOffsetChange;
62
83
 
63
- // Make it smooth!
64
- this.interpolateViewportOffset = makeLerpSmoother(
65
- this.context.animator,
66
- (value) => {
67
- this.viewportOffset = value.x;
68
- },
69
- 50,
70
- 0.4,
71
- { x: this.viewportOffset }
72
- );
84
+ const sPad = this.config.scrollbarPadding;
85
+ const sSize = this.config.scrollbarSize;
86
+
87
+ this.#scrollbarCoords =
88
+ this.#scrollDirection == "vertical"
89
+ ? new Rectangle(
90
+ () =>
91
+ this.#viewportCoords.x +
92
+ this.#viewportCoords.width -
93
+ sSize -
94
+ sPad,
95
+ () => this.#viewportCoords.y + sPad + this.scrollOffset,
96
+ () => sSize,
97
+ () => this.#getScrollLength()
98
+ )
99
+ : new Rectangle(
100
+ () => this.#viewportCoords.x + sPad + this.scrollOffset,
101
+ () =>
102
+ this.#viewportCoords.y +
103
+ this.#viewportCoords.height -
104
+ sSize -
105
+ sPad,
106
+ () => this.#getScrollLength(),
107
+ () => sSize
108
+ );
109
+
110
+ // Smooth viewport offset updates
111
+ this.#initViewportOffsetSmoother(this.viewportOffset);
73
112
 
74
113
  this.addInteractionEventListener("mousedown", (coords, event) => {
75
114
  event.stopPropagation();
76
115
 
77
- if (this.#maxScrollOffset <= 0) {
116
+ if (this.#getMaxScrollOffset() <= 0) {
78
117
  return;
79
118
  }
80
119
 
@@ -91,18 +130,21 @@ export default class Scrollbar extends UnitView {
91
130
  const onMousemove = /** @param {MouseEvent} moveEvent */ (
92
131
  moveEvent
93
132
  ) => {
133
+ const maxScrollOffset = this.#getMaxScrollOffset();
134
+ if (maxScrollOffset <= 0) {
135
+ return;
136
+ }
137
+
94
138
  const scrollOffset = clamp(
95
139
  getMouseOffset(moveEvent) -
96
140
  initialOffset +
97
141
  initialScrollOffset,
98
142
  0,
99
- this.#maxScrollOffset
143
+ maxScrollOffset
100
144
  );
101
145
 
102
146
  this.interpolateViewportOffset({
103
- x:
104
- (scrollOffset / this.#maxScrollOffset) *
105
- this.#maxViewportOffset,
147
+ x: this.#getViewportOffsetFromScrollOffset(scrollOffset),
106
148
  });
107
149
  };
108
150
 
@@ -117,9 +159,95 @@ export default class Scrollbar extends UnitView {
117
159
  }
118
160
 
119
161
  get scrollOffset() {
120
- return (
121
- (this.viewportOffset / this.#maxViewportOffset) *
122
- this.#maxScrollOffset
162
+ return this.#getScrollOffsetFromViewportOffset(this.viewportOffset);
163
+ }
164
+
165
+ /**
166
+ * @param {number} value
167
+ * @param {{ notify?: boolean, syncSmoother?: boolean }} [options]
168
+ */
169
+ setViewportOffset(value, { notify = true, syncSmoother = false } = {}) {
170
+ this.viewportOffset = clamp(value, 0, this.#getMaxViewportOffset());
171
+
172
+ if (syncSmoother) {
173
+ this.#initViewportOffsetSmoother(this.viewportOffset);
174
+ }
175
+
176
+ if (notify && this.#onViewportOffsetChange) {
177
+ this.#onViewportOffsetChange(this.viewportOffset);
178
+ }
179
+ }
180
+
181
+ #getVisibleFraction() {
182
+ const dimension =
183
+ this.#scrollDirection == "horizontal" ? "width" : "height";
184
+
185
+ const viewportSize = this.#viewportCoords[dimension];
186
+ const contentSize = this.#contentCoords[dimension];
187
+
188
+ return contentSize > 0 ? Math.min(1, viewportSize / contentSize) : 1;
189
+ }
190
+
191
+ #getMaxScrollLength() {
192
+ const dimension =
193
+ this.#scrollDirection == "horizontal" ? "width" : "height";
194
+
195
+ return Math.max(
196
+ 0,
197
+ this.#viewportCoords[dimension] - 2 * this.config.scrollbarPadding
198
+ );
199
+ }
200
+
201
+ #getScrollLength() {
202
+ const maxScrollLength = this.#getMaxScrollLength();
203
+ const scrollLength = this.#getVisibleFraction() * maxScrollLength;
204
+ const minLength = this.config.scrollbarMinLength;
205
+
206
+ return Math.min(maxScrollLength, Math.max(minLength, scrollLength));
207
+ }
208
+
209
+ #getMaxScrollOffset() {
210
+ return Math.max(
211
+ 0,
212
+ this.#getMaxScrollLength() - this.#getScrollLength()
213
+ );
214
+ }
215
+
216
+ /**
217
+ * @param {number} viewportOffset
218
+ */
219
+ #getScrollOffsetFromViewportOffset(viewportOffset) {
220
+ const maxViewportOffset = this.#getMaxViewportOffset();
221
+ const maxScrollOffset = this.#getMaxScrollOffset();
222
+
223
+ if (maxViewportOffset <= 0 || maxScrollOffset <= 0) {
224
+ return 0;
225
+ }
226
+
227
+ return (viewportOffset / maxViewportOffset) * maxScrollOffset;
228
+ }
229
+
230
+ /**
231
+ * @param {number} scrollOffset
232
+ */
233
+ #getViewportOffsetFromScrollOffset(scrollOffset) {
234
+ const maxViewportOffset = this.#getMaxViewportOffset();
235
+ const maxScrollOffset = this.#getMaxScrollOffset();
236
+
237
+ if (maxViewportOffset <= 0 || maxScrollOffset <= 0) {
238
+ return 0;
239
+ }
240
+
241
+ return (scrollOffset / maxScrollOffset) * maxViewportOffset;
242
+ }
243
+
244
+ #getMaxViewportOffset() {
245
+ const dimension =
246
+ this.#scrollDirection == "horizontal" ? "width" : "height";
247
+
248
+ return Math.max(
249
+ 0,
250
+ this.#contentCoords[dimension] - this.#viewportCoords[dimension]
123
251
  );
124
252
  }
125
253
 
@@ -129,57 +257,44 @@ export default class Scrollbar extends UnitView {
129
257
  * @param {import("../../types/rendering.js").RenderingOptions} [options]
130
258
  */
131
259
  render(context, coords, options) {
260
+ // NOTE: This only records layout coordinates for buffered rendering.
132
261
  super.render(context, this.#scrollbarCoords, options);
133
262
  }
134
263
 
135
264
  /**
265
+ * Updates the scrollbar with the latest viewport and content rectangles.
266
+ *
267
+ * Viewport coords are flattened to stay stable between layout passes, while
268
+ * content coords may be dynamic (e.g., peek transitions) and are evaluated
269
+ * on demand via accessors.
136
270
  *
137
271
  * @param {Rectangle} viewportCoords
138
- * @param {Rectangle} coords
272
+ * @param {Rectangle} contentCoords
139
273
  */
140
- updateScrollbar(viewportCoords, coords) {
141
- const sPad = this.config.scrollbarPadding;
142
- const sSize = this.config.scrollbarSize;
143
-
144
- const dimension =
145
- this.#scrollDirection == "horizontal" ? "width" : "height";
146
-
147
- const visibleFraction = Math.min(
148
- 1,
149
- viewportCoords[dimension] / coords[dimension]
150
- );
151
- const maxScrollLength = viewportCoords[dimension] - 2 * sPad;
152
- const scrollLength = visibleFraction * maxScrollLength;
274
+ updateScrollbar(viewportCoords, contentCoords) {
275
+ this.#viewportCoords = viewportCoords.flatten();
276
+ this.#contentCoords = contentCoords;
277
+ this.setViewportOffset(this.viewportOffset, {
278
+ notify: false,
279
+ syncSmoother: true,
280
+ });
281
+ }
153
282
 
154
- this.#maxScrollOffset = maxScrollLength - scrollLength;
155
- this.#maxViewportOffset = coords[dimension] - viewportCoords[dimension];
156
- this.viewportOffset = clamp(
157
- this.viewportOffset,
158
- 0,
159
- this.#maxViewportOffset
283
+ /**
284
+ * @param {number} value
285
+ */
286
+ #initViewportOffsetSmoother(value) {
287
+ this.interpolateViewportOffset = makeLerpSmoother(
288
+ this.context.animator,
289
+ (current) => {
290
+ this.setViewportOffset(current.x, {
291
+ notify: true,
292
+ syncSmoother: false,
293
+ });
294
+ },
295
+ 35,
296
+ 0.4,
297
+ { x: value }
160
298
  );
161
-
162
- this.#scrollbarCoords =
163
- this.#scrollDirection == "vertical"
164
- ? new Rectangle(
165
- () =>
166
- viewportCoords.x +
167
- viewportCoords.width -
168
- sSize -
169
- sPad,
170
- () => viewportCoords.y + sPad + this.scrollOffset,
171
- () => sSize,
172
- () => scrollLength
173
- )
174
- : new Rectangle(
175
- () => viewportCoords.x + sPad + this.scrollOffset,
176
- () =>
177
- viewportCoords.y +
178
- viewportCoords.height -
179
- sSize -
180
- sPad,
181
- () => scrollLength,
182
- () => sSize
183
- );
184
299
  }
185
300
  }
@@ -10,6 +10,20 @@ export default class LayerView extends ContainerView {
10
10
  */
11
11
  constructor(spec: import("../spec/view.js").LayerSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
12
12
  spec: import("../spec/view.js").LayerSpec;
13
+ /**
14
+ * Adds a child spec dynamically. Intended for post-initialization updates.
15
+ *
16
+ * @param {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} childSpec
17
+ * @param {number} [index]
18
+ * @returns {Promise<LayerView | import("./unitView.js").default>}
19
+ */
20
+ addChildSpec(childSpec: import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec, index?: number): Promise<LayerView | import("./unitView.js").default>;
21
+ /**
22
+ * Removes a child by index. Intended for post-initialization updates.
23
+ *
24
+ * @param {number} index
25
+ */
26
+ removeChildAt(index: number): Promise<void>;
13
27
  get children(): (import("./unitView.js").default | LayerView)[];
14
28
  #private;
15
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"layerView.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.js"],"names":[],"mappings":"AAIA;IAQI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,SAAS,WACnC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAWzC;IAHG,0CAAgB;IAoCpB,gEAEC;;CA6CJ;0BA7GyB,oBAAoB"}
1
+ {"version":3,"file":"layerView.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.js"],"names":[],"mappings":"AAKA;IAQI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,SAAS,WACnC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAWzC;IAHG,0CAAgB;IAoCpB;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,SAAS,GAAG,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UAC/G,MAAM,GACJ,OAAO,CAAC,SAAS,GAAG,OAAO,eAAe,EAAE,OAAO,CAAC,CAMhE;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAIhB;IA6CD,gEAEC;;CA6CJ;0BA/KyB,oBAAoB"}
@@ -1,6 +1,7 @@
1
1
  import { isLayerSpec, isUnitSpec } from "./viewFactory.js";
2
2
  import ContainerView from "./containerView.js";
3
3
  import ViewError from "./viewError.js";
4
+ import ContainerMutationHelper from "./containerMutationHelper.js";
4
5
 
5
6
  export default class LayerView extends ContainerView {
6
7
  /**
@@ -61,6 +62,71 @@ export default class LayerView extends ContainerView {
61
62
  );
62
63
  }
63
64
 
65
+ /**
66
+ * Adds a child spec dynamically. Intended for post-initialization updates.
67
+ *
68
+ * @param {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} childSpec
69
+ * @param {number} [index]
70
+ * @returns {Promise<LayerView | import("./unitView.js").default>}
71
+ */
72
+ async addChildSpec(childSpec, index) {
73
+ return /** @type {Promise<LayerView | import("./unitView.js").default>} */ (
74
+ this.#getMutationHelper().addChildSpec(childSpec, index)
75
+ );
76
+ }
77
+
78
+ /**
79
+ * Removes a child by index. Intended for post-initialization updates.
80
+ *
81
+ * @param {number} index
82
+ */
83
+ async removeChildAt(index) {
84
+ await this.#getMutationHelper().removeChildAt(index);
85
+ }
86
+
87
+ /**
88
+ * @returns {ContainerMutationHelper}
89
+ */
90
+ #getMutationHelper() {
91
+ return new ContainerMutationHelper(this, {
92
+ getChildSpecs: () => ({
93
+ specs: this.spec.layer,
94
+ insertAt: (index, spec) => {
95
+ this.spec.layer.splice(
96
+ index,
97
+ 0,
98
+ /** @type {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} */ (
99
+ spec
100
+ )
101
+ );
102
+ },
103
+ removeAt: (index) => {
104
+ this.spec.layer.splice(index, 1);
105
+ },
106
+ }),
107
+ insertView: (view, index) => {
108
+ view.layoutParent ??= this;
109
+ this.#children.splice(
110
+ index,
111
+ 0,
112
+ /** @type {LayerView | import("./unitView.js").default} */ (
113
+ view
114
+ )
115
+ );
116
+ return view;
117
+ },
118
+ removeView: (index) => {
119
+ const view = this.#children[index];
120
+ if (!view) {
121
+ throw new Error("Child index out of range!");
122
+ }
123
+ view.disposeSubtree();
124
+ this.#children.splice(index, 1);
125
+ },
126
+ defaultName: (index) => "layer" + index,
127
+ });
128
+ }
129
+
64
130
  get children() {
65
131
  return this.#children.slice();
66
132
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=layerView.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layerView.test.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.test.js"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAwDvD;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;;;;;uBA5FpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
1
+ {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CA+DvD;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;;;;;uBAnGpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
@@ -66,9 +66,16 @@ export function createTestViewContext(viewFactoryOptions = {}) {
66
66
  /** @type {(callback: () => void) => void} */ (
67
67
  (callback) => callback()
68
68
  ),
69
+ transition: (/** @type {any} */ options) => {
70
+ const to = typeof options.to === "number" ? options.to : 1;
71
+ options.onUpdate(to);
72
+ return Promise.resolve();
73
+ },
69
74
  })
70
75
  ),
71
76
 
77
+ requestLayoutReflow: () => undefined,
78
+
72
79
  isViewConfiguredVisible: () => true,
73
80
 
74
81
  //...partialContext,
@@ -100,7 +107,6 @@ export async function createAndInitialize(spec, viewClass) {
100
107
  const view = await create(spec, viewClass);
101
108
 
102
109
  checkForDuplicateScaleNames(view);
103
-
104
110
  if (view instanceof UnitView) {
105
111
  view.mark.initializeEncoders();
106
112
  } else if (view instanceof ContainerView) {
@@ -1 +1 @@
1
- {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAyCzC;IApCG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAoKlC,2DAIC;IAgBD;;;;;OAKG;IAEH,iEAsHC;IAwCD;;;;;OAKG;IACH,4IAMC;IAkBD;;OAEG;IACH,uDAEC;IAED;;;;;;;;;;;;;OAaG;IACH,uEAHW,OAAO,oBAAoB,EAAE,IAAI,iDAqB3C;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBAlgBgB,WAAW"}
1
+ {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAyCzC;IApCG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAoKlC,2DAIC;IAgBD;;;;;OAKG;IAEH,iEAyJC;IAUD;;;;;OAKG;IACH,4IAMC;IAkBD;;OAEG;IACH,uDAEC;IAED;;;;;;;;;;;;;OAaG;IACH,uEAHW,OAAO,oBAAoB,EAAE,IAAI,iDAqB3C;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBAvgBgB,WAAW"}
@@ -4,7 +4,7 @@ import RuleMark from "../marks/rule.js";
4
4
  import LinkMark from "../marks/link.js";
5
5
  import TextMark from "../marks/text.js";
6
6
 
7
- import ScaleResolution from "./scaleResolution.js";
7
+ import ScaleResolution from "../scales/scaleResolution.js";
8
8
  import {
9
9
  isPositionalChannel,
10
10
  isChannelDefWithScale,
@@ -15,7 +15,7 @@ import {
15
15
  isValueDefWithCondition,
16
16
  } from "../encoder/encoder.js";
17
17
  import createDomain from "../utils/domainArray.js";
18
- import AxisResolution from "./axisResolution.js";
18
+ import AxisResolution from "../scales/axisResolution.js";
19
19
  import View from "./view.js";
20
20
  import {
21
21
  asSelectionConfig,
@@ -348,22 +348,47 @@ export default class UnitView extends View {
348
348
  targetChannel
349
349
  );
350
350
  }
351
- view.resolutions[type][targetChannel].addMember({
351
+ const resolution = view.resolutions[type][targetChannel];
352
+ const unregister = resolution.registerMember({
352
353
  view: this,
353
354
  channel,
354
355
  channelDef: channelDefWithScale,
355
356
  });
357
+ this.registerDisposer(() => {
358
+ // Unregister returns true when it removed the last member.
359
+ if (
360
+ unregister() &&
361
+ view.resolutions[type][targetChannel] === resolution
362
+ ) {
363
+ delete view.resolutions[type][targetChannel];
364
+ }
365
+ });
356
366
  } else if (type == "scale" && isChannelWithScale(channel)) {
357
367
  if (!view.resolutions[type][targetChannel]) {
358
368
  const resolution = new ScaleResolution(targetChannel);
359
369
  view.resolutions[type][targetChannel] = resolution;
360
370
 
361
- resolution.addEventListener("range", (event) => {
362
- // Create if WebGLHelper is available, i.e., if not running in headless mode
371
+ const updateRangeTexture = (
372
+ /** @type {import("../types/scaleResolutionApi.js").ScaleResolutionEvent} */ event
373
+ ) => {
374
+ // Create if WebGLHelper is available, i.e., if not running in headless mode.
375
+ // Domain changes can alter discrete texture sizes as well.
363
376
  this.context.glHelper?.createRangeTexture(
364
377
  event.scaleResolution,
365
378
  true
366
379
  );
380
+ };
381
+ resolution.addEventListener("range", updateRangeTexture);
382
+ resolution.addEventListener("domain", updateRangeTexture);
383
+ this.registerDisposer(() => {
384
+ resolution.removeEventListener(
385
+ "range",
386
+ updateRangeTexture
387
+ );
388
+ resolution.removeEventListener(
389
+ "domain",
390
+ updateRangeTexture
391
+ );
367
392
  });
368
393
  }
369
394
 
@@ -378,12 +403,22 @@ export default class UnitView extends View {
378
403
  ? undefined
379
404
  : this.extractDataDomain.bind(this);
380
405
 
381
- view.resolutions[type][targetChannel].addMember({
406
+ const resolution = view.resolutions[type][targetChannel];
407
+ const unregister = resolution.registerMember({
382
408
  view: this,
383
409
  channel,
384
410
  channelDef: channelDefWithScale,
385
411
  dataDomainSource,
386
412
  });
413
+ this.registerDisposer(() => {
414
+ // Unregister returns true when it removed the last member.
415
+ if (
416
+ unregister() &&
417
+ view.resolutions[type][targetChannel] === resolution
418
+ ) {
419
+ delete view.resolutions[type][targetChannel];
420
+ }
421
+ });
387
422
  }
388
423
  }
389
424
  }
@@ -393,39 +428,9 @@ export default class UnitView extends View {
393
428
  */
394
429
  dispose() {
395
430
  super.dispose();
396
-
397
- this.#unresolve();
398
431
  this.mark.dispose();
399
432
  }
400
433
 
401
- #unresolve() {
402
- for (const view of this.getDataAncestors()) {
403
- for (const [channel, resolution] of Object.entries(
404
- view.resolutions.scale
405
- )) {
406
- if (
407
- resolution &&
408
- resolution.removeMembersByView(this) &&
409
- resolution.members.length === 0
410
- ) {
411
- delete view.resolutions.scale[channel];
412
- }
413
- }
414
-
415
- for (const [channel, resolution] of Object.entries(
416
- view.resolutions.axis
417
- )) {
418
- if (
419
- resolution &&
420
- resolution.removeMembersByView(this) &&
421
- resolution.members.length === 0
422
- ) {
423
- delete view.resolutions.axis[channel];
424
- }
425
- }
426
- }
427
- }
428
-
429
434
  /**
430
435
  * Returns an accessor that accesses a field or an evaluated expression,
431
436
  * if there is one.