@genome-spy/core 0.65.0 → 0.66.1

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 (232) 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 +17587 -16593
  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/flowInit.js +2 -2
  16. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  17. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  18. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  19. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  20. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  21. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  22. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  23. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  24. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  25. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  26. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  27. package/dist/src/encoder/encoder.d.ts +1 -1
  28. package/dist/src/encoder/encoder.d.ts.map +1 -1
  29. package/dist/src/encoder/encoder.js +1 -1
  30. package/dist/src/genome/scaleLocus.d.ts +39 -0
  31. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  32. package/dist/src/genome/scaleLocus.js +76 -0
  33. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  34. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  35. package/dist/src/genomeSpy/canvasExport.js +66 -0
  36. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  37. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  38. package/dist/src/genomeSpy/containerUi.js +78 -0
  39. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  40. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  41. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  42. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  43. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  44. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  45. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  46. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  47. package/dist/src/genomeSpy/interactionController.js +371 -0
  48. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  49. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  50. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  51. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  52. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  53. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  54. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  55. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  56. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  57. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  58. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  59. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  60. package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
  61. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  62. package/dist/src/genomeSpy/viewDataInit.js +41 -0
  63. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  64. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  65. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  66. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  67. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  68. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  69. package/dist/src/genomeSpy.d.ts +16 -71
  70. package/dist/src/genomeSpy.d.ts.map +1 -1
  71. package/dist/src/genomeSpy.js +179 -745
  72. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  73. package/dist/src/gl/webGLHelper.d.ts +2 -2
  74. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  75. package/dist/src/gl/webGLHelper.js +4 -4
  76. package/dist/src/index.d.ts.map +1 -1
  77. package/dist/src/index.js +2 -12
  78. package/dist/src/marks/mark.d.ts.map +1 -1
  79. package/dist/src/marks/mark.js +4 -2
  80. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  81. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  82. package/dist/src/{view → scales}/axisResolution.js +29 -18
  83. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  84. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  85. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  86. package/dist/src/scales/scaleDomainAggregator.js +162 -0
  87. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  88. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  89. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  90. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  91. package/dist/src/scales/scaleInstanceManager.js +313 -0
  92. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  93. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  94. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  95. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  96. package/dist/src/scales/scaleInteractionController.js +336 -0
  97. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  98. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  99. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  100. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  101. package/dist/src/scales/scalePropsResolver.js +74 -0
  102. package/dist/src/{view → scales}/scaleResolution.d.ts +52 -35
  103. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  104. package/dist/src/scales/scaleResolution.js +658 -0
  105. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  106. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  107. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  108. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  109. package/dist/src/scales/scaleRules.d.ts +16 -0
  110. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  111. package/dist/src/scales/scaleRules.js +103 -0
  112. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  113. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  114. package/dist/src/spec/channel.d.ts +13 -18
  115. package/dist/src/spec/scale.d.ts +6 -0
  116. package/dist/src/types/embedApi.d.ts +5 -0
  117. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  118. package/dist/src/view/concatView.d.ts +18 -0
  119. package/dist/src/view/concatView.d.ts.map +1 -1
  120. package/dist/src/view/concatView.js +73 -0
  121. package/dist/src/view/concatView.test.d.ts +2 -0
  122. package/dist/src/view/concatView.test.d.ts.map +1 -0
  123. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  124. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  125. package/dist/src/view/containerMutationHelper.js +114 -0
  126. package/dist/src/view/containerView.d.ts +0 -7
  127. package/dist/src/view/containerView.d.ts.map +1 -1
  128. package/dist/src/view/containerView.js +0 -10
  129. package/dist/src/view/facetView.d.ts.map +1 -1
  130. package/dist/src/view/facetView.js +0 -15
  131. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  132. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  133. package/dist/src/view/gridView/gridChild.js +32 -6
  134. package/dist/src/view/gridView/gridView.d.ts +39 -1
  135. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  136. package/dist/src/view/gridView/gridView.js +106 -48
  137. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  138. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  139. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  140. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  141. package/dist/src/view/gridView/scrollbar.js +184 -69
  142. package/dist/src/view/layerView.d.ts +14 -0
  143. package/dist/src/view/layerView.d.ts.map +1 -1
  144. package/dist/src/view/layerView.js +66 -0
  145. package/dist/src/view/layerView.test.d.ts +2 -0
  146. package/dist/src/view/layerView.test.d.ts.map +1 -0
  147. package/dist/src/view/testUtils.d.ts.map +1 -1
  148. package/dist/src/view/testUtils.js +2 -1
  149. package/dist/src/view/unitView.d.ts.map +1 -1
  150. package/dist/src/view/unitView.js +24 -34
  151. package/dist/src/view/view.d.ts +6 -6
  152. package/dist/src/view/view.d.ts.map +1 -1
  153. package/dist/src/view/view.js +4 -4
  154. package/package.json +2 -2
  155. package/dist/bundle/browser-txUcLy2H.js +0 -123
  156. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  157. package/dist/bundle/index-BhtHKLUo.js +0 -73
  158. package/dist/bundle/index-CCe8rnZz.js +0 -716
  159. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  160. package/dist/src/data/collector.test.js +0 -138
  161. package/dist/src/data/dataFlow.test.js +0 -38
  162. package/dist/src/data/flow.test.js +0 -81
  163. package/dist/src/data/flowInit.test.js +0 -413
  164. package/dist/src/data/flowNode.test.js +0 -50
  165. package/dist/src/data/flowOptimizer.test.js +0 -209
  166. package/dist/src/data/formats/fasta.test.js +0 -27
  167. package/dist/src/data/sources/inlineSource.test.js +0 -63
  168. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  169. package/dist/src/data/transforms/aggregate.test.js +0 -134
  170. package/dist/src/data/transforms/clone.test.js +0 -11
  171. package/dist/src/data/transforms/coverage.test.js +0 -238
  172. package/dist/src/data/transforms/filter.test.js +0 -20
  173. package/dist/src/data/transforms/flatten.test.js +0 -96
  174. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  175. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  176. package/dist/src/data/transforms/formula.test.js +0 -25
  177. package/dist/src/data/transforms/identifier.test.js +0 -92
  178. package/dist/src/data/transforms/pileup.test.js +0 -70
  179. package/dist/src/data/transforms/project.test.js +0 -32
  180. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  181. package/dist/src/data/transforms/regexFold.test.js +0 -201
  182. package/dist/src/data/transforms/sample.test.js +0 -38
  183. package/dist/src/data/transforms/stack.test.js +0 -91
  184. package/dist/src/encoder/accessor.test.js +0 -162
  185. package/dist/src/encoder/encoder.test.js +0 -105
  186. package/dist/src/genome/genome.test.js +0 -268
  187. package/dist/src/genome/genomes.test.js +0 -8
  188. package/dist/src/genome/scaleIndex.test.js +0 -78
  189. package/dist/src/genome/scaleLocus.test.js +0 -4
  190. package/dist/src/scale/scale.test.js +0 -326
  191. package/dist/src/scale/ticks.test.js +0 -46
  192. package/dist/src/selection/selection.test.js +0 -14
  193. package/dist/src/utils/addBaseUrl.test.js +0 -30
  194. package/dist/src/utils/binnedIndex.test.js +0 -201
  195. package/dist/src/utils/cloner.test.js +0 -35
  196. package/dist/src/utils/coalesce.test.js +0 -16
  197. package/dist/src/utils/concatIterables.test.js +0 -8
  198. package/dist/src/utils/domainArray.test.js +0 -130
  199. package/dist/src/utils/indexer.test.js +0 -49
  200. package/dist/src/utils/interactionEvent.test.js +0 -35
  201. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  202. package/dist/src/utils/kWayMerge.test.js +0 -30
  203. package/dist/src/utils/mergeObjects.test.js +0 -42
  204. package/dist/src/utils/numberExtractor.test.js +0 -6
  205. package/dist/src/utils/propertyCacher.test.js +0 -89
  206. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  207. package/dist/src/utils/radixSort.test.js +0 -51
  208. package/dist/src/utils/reservationMap.test.js +0 -20
  209. package/dist/src/utils/ringBuffer.test.js +0 -39
  210. package/dist/src/utils/topK.test.js +0 -54
  211. package/dist/src/utils/trees.test.js +0 -135
  212. package/dist/src/utils/url.test.js +0 -28
  213. package/dist/src/utils/variableTools.test.js +0 -13
  214. package/dist/src/view/axisResolution.d.ts.map +0 -1
  215. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  216. package/dist/src/view/axisResolution.test.js +0 -206
  217. package/dist/src/view/flowBuilder.test.js +0 -125
  218. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  219. package/dist/src/view/layout/flexLayout.test.js +0 -323
  220. package/dist/src/view/layout/grid.test.js +0 -71
  221. package/dist/src/view/layout/rectangle.test.js +0 -192
  222. package/dist/src/view/paramMediator.test.js +0 -282
  223. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  224. package/dist/src/view/scaleResolution.js +0 -1059
  225. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  226. package/dist/src/view/scaleResolution.test.js +0 -645
  227. package/dist/src/view/view.test.js +0 -245
  228. package/dist/src/view/viewDispose.test.js +0 -110
  229. package/dist/src/view/viewFactory.test.js +0 -25
  230. package/dist/src/view/viewUtils.test.js +0 -87
  231. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  232. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -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,6CA0DvD;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;;;;;uBA9FpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
@@ -69,6 +69,8 @@ export function createTestViewContext(viewFactoryOptions = {}) {
69
69
  })
70
70
  ),
71
71
 
72
+ requestLayoutReflow: () => undefined,
73
+
72
74
  isViewConfiguredVisible: () => true,
73
75
 
74
76
  //...partialContext,
@@ -100,7 +102,6 @@ export async function createAndInitialize(spec, viewClass) {
100
102
  const view = await create(spec, viewClass);
101
103
 
102
104
  checkForDuplicateScaleNames(view);
103
-
104
105
  if (view instanceof UnitView) {
105
106
  view.mark.initializeEncoders();
106
107
  } 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,iEA0IC;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;iBAxfgB,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,11 +348,21 @@ 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);
@@ -378,12 +388,22 @@ export default class UnitView extends View {
378
388
  ? undefined
379
389
  : this.extractDataDomain.bind(this);
380
390
 
381
- view.resolutions[type][targetChannel].addMember({
391
+ const resolution = view.resolutions[type][targetChannel];
392
+ const unregister = resolution.registerMember({
382
393
  view: this,
383
394
  channel,
384
395
  channelDef: channelDefWithScale,
385
396
  dataDomainSource,
386
397
  });
398
+ this.registerDisposer(() => {
399
+ // Unregister returns true when it removed the last member.
400
+ if (
401
+ unregister() &&
402
+ view.resolutions[type][targetChannel] === resolution
403
+ ) {
404
+ delete view.resolutions[type][targetChannel];
405
+ }
406
+ });
387
407
  }
388
408
  }
389
409
  }
@@ -393,39 +413,9 @@ export default class UnitView extends View {
393
413
  */
394
414
  dispose() {
395
415
  super.dispose();
396
-
397
- this.#unresolve();
398
416
  this.mark.dispose();
399
417
  }
400
418
 
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
419
  /**
430
420
  * Returns an accessor that accesses a field or an evaluated expression,
431
421
  * if there is one.
@@ -65,14 +65,14 @@ export default class View {
65
65
  resolutions: {
66
66
  /**
67
67
  * Channel-specific scale resolutions
68
- * @type {Partial<Record<import("../spec/channel.js").ChannelWithScale, import("./scaleResolution.js").default>>}
68
+ * @type {Partial<Record<import("../spec/channel.js").ChannelWithScale, import("../scales/scaleResolution.js").default>>}
69
69
  */
70
- scale: Partial<Record<import("../spec/channel.js").ChannelWithScale, import("./scaleResolution.js").default>>;
70
+ scale: Partial<Record<import("../spec/channel.js").ChannelWithScale, import("../scales/scaleResolution.js").default>>;
71
71
  /**
72
72
  * Channel-specific axis resolutions
73
- * @type {Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("./axisResolution.js").default>>}
73
+ * @type {Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("../scales/axisResolution.js").default>>}
74
74
  */
75
- axis: Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("./axisResolution.js").default>>;
75
+ axis: Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("../scales/axisResolution.js").default>>;
76
76
  };
77
77
  options: {
78
78
  /**
@@ -280,11 +280,11 @@ export default class View {
280
280
  /**
281
281
  * @param {import("../spec/channel.js").ChannelWithScale} channel
282
282
  */
283
- getScaleResolution(channel: import("../spec/channel.js").ChannelWithScale): import("./scaleResolution.js").default;
283
+ getScaleResolution(channel: import("../spec/channel.js").ChannelWithScale): import("../scales/scaleResolution.js").default;
284
284
  /**
285
285
  * @param {import("../spec/channel.js").PositionalChannel} channel
286
286
  */
287
- getAxisResolution(channel: import("../spec/channel.js").PositionalChannel): import("./axisResolution.js").default;
287
+ getAxisResolution(channel: import("../spec/channel.js").PositionalChannel): import("../scales/axisResolution.js").default;
288
288
  /**
289
289
  * @param {import("../spec/channel.js").Channel | "default"} channel
290
290
  * @param {import("../spec/view.js").ResolutionTarget} resolutionType
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"AA2BA,oBAAoB;AACpB,yBAA0B,YAAY,CAAC;AACvC,0BAA0B;AAC1B,yBAA0B,YAAY,CAAC;AAKvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH;IAkCI;;;;;;;;;OASG;IACH,kBARW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,WAAW,EAuErB;IAhGD;;OAEG;IACH,iBAFU,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM,CAEQ;IAOzC;;;;;OAKG;IACH,aAFU,GAAG,CAAC,GAAG,EAAE,OAAO,uBAAuB,EAAE,OAAO,CAAC,CAEX;IAiB5C,mDAAsB;IACtB,mDAAgC;IAChC,iBAA4B;IAC5B,aAA6B;IAC7B,yCAAgB;IAEhB;QACI;;;WAGG;eADO,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAGhH;;;WAGG;cADO,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC;MAG1H;IAID;;;;kCA/EE,OAAO;;;;;kCAEP,OAAO;;;;;yBAGP,OAAO;MA8ER;IAED;;OAEG;IACH,YAFU,OAAO,uBAAuB,EAAE,UAAU,GAAG,SAAS,CAErC;IAE3B;;;;OAIG;IACH,WAFU,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAEzC;IAEvC,4BAA4B;IAC5B,eADW,aAAa,CAGvB;IAuBL;;;;;OAKG;IACH,cAFa,OAAO,uBAAuB,EAAE,OAAO,CAInD;IAED,sBAIC;IAED;;;;OAIG;IACH,eAFa,OAAO,CAInB;IAED;;;;;OAKG;IACH,gBAFa,OAAO,CAMnB;IAED;;;;;OAKG;IACH,WAFa,cAAc,CAW1B;IAED;;OAEG;IACH,mBAFa,cAAc,CAkB1B;IAoED,+BAEC;IAED,2BAEC;IAED;;;;;;;;OAQG;IACH,aAFa,OAAO,CAMnB;IAED;;;;;;;OAOG;IACH,uBAFa,MAAM,CAMlB;IAED,wBAKC;IAkBD;;OAEG;IACH,6BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;OAIG;IACH,yBAFW,gBAAgB,QAO1B;IAED;;;;OAIG;IACH,2BAHW,MAAM,WACN,CAAS,IAAgB,EAAhB,gBAAgB,KAAE,IAAI,QASzC;IAED;;;;;;;;OAQG;IACH,yCANW,OAAO,uBAAuB,EAAE,OAAO,SAEvC,OAAO,8BAA8B,EAAE,OAAO,aAC9C,OAAO,QAUjB;IAED;;;;;;;;;;OAUG;IACH,kCAJW,MAAM,YACN,wBAAwB,eACxB,OAAO,QAajB;IAED;;;;OAIG;IACH,qCAJW,MAAM,YACN,wBAAwB,eACxB,OAAO,QAajB;IAED;;;;;;;OAOG;IACH,eAJW,OAAO,GACL,WAAW,CAmBvB;IAED;;OAEG;IACH,yBAOC;IAED;;OAEG;IACH,gBAsBC;IAED;;OAEG;IACH,2BAFW,MAAM,IAAI,QAIpB;IAED;;OAEG;IACH,uBAOC;IAED;;OAEG;IACH,6BASC;IAED;;;OAGG;IACH,uBAEC;;IAyBD;;;;;;OAMG;IACH,eAFY,OAAO,oBAAoB,EAAE,QAAQ,CAuBhD;IAED;;;;OAIG;IACH,+BAJW,IAAI,GAEH,CAAS,IAAM,EAAN,MAAM,KAAE,GAAG,CAM/B;IAED;;;;;OAKG;IACH,6BAHW,IAAI,GACF,MAAM,EAAE,CASpB;IAED;;;;;;;;;;;;;;;OAeG;IACH,yBAFY,YAAY,CAIvB;IAED;;OAEG;IACH,4BAFW,OAAO,oBAAoB,EAAE,gBAAgB,0CAWvD;IAED;;OAEG;IACH,2BAFW,OAAO,oBAAoB,EAAE,iBAAiB,yCAWxD;IAED;;;;OAIG;IACH,iCAJW,OAAO,oBAAoB,EAAE,OAAO,GAAG,SAAS,kBAChD,OAAO,iBAAiB,EAAE,gBAAgB,GACxC,OAAO,iBAAiB,EAAE,kBAAkB,CAIxD;IAED;;;;OAIG;IACH,0CAJW,OAAO,oBAAoB,EAAE,OAAO,kBACpC,OAAO,iBAAiB,EAAE,gBAAgB,GACxC,OAAO,iBAAiB,EAAE,kBAAkB,CAQxD;IAED;;;;OAIG;IACH,8BAJW,OAAO,oBAAoB,EAAE,OAAO,kBACpC,OAAO,iBAAiB,EAAE,gBAAgB,GACxC,OAAO,iBAAiB,EAAE,kBAAkB,CAIxD;IAED;;OAEG;IACH,cAFa,MAAM,CAOlB;IAED;;OAEG;IACH,8BAEC;IAED,oBASC;IAED;;;;;;OAMG;IACH,iBAHa,CAAC,OAHH,GAAG,YACH,CAAS,IAAI,EAAJ,UAAI,KAAE,CAAC,GACd,CAAC,CAMb;IAED;;;;OAIG;IACH,8BAHW,MAAM,cACN,MAAM,GAAG,SAAS,GAAG,WAAW,QAiB1C;IAED,4BAEC;IAED;;;;;OAKG;IACH,iCAFW,OAAO,8BAA8B,EAAE,OAAO,QAIxD;;CACJ;AAoEM,iCAHI,GAAG,GACF,IAAI,IAAI,OAAO,iBAAiB,EAAE,IAAI,CAEF;0BAp1BnC,8BAAsB,IAAI;qCAG5B,IAAI,KACF,WAAW;sBAEX,eAAe,GAAG;IACvB,SAAS,CAAC,EAAE,CAAS,IAAI,EAAJ,IAAI,KAAE,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,CAAS,IAAI,EAAJ,IAAI,KAAE,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,CAAS,IAAI,EAAJ,IAAI,KAAE,IAAI,CAAA;CAAC;;;;;UAIlC,OAAO,iBAAiB,EAAE,kBAAkB;;;;cAC5C,GAAG;;gDAGF,OAAO,uBAAuB,EAAE,OAAO,SAEvC,OAAO,8BAA8B,EAAE,OAAO;;;;;+BAG/C,OAAO;;;;;+BAEP,OAAO;;;;;qBAGP,OAAO;;0BA7CwB,oBAAoB;oBAbzC,qBAAqB;+BADlC,wBAAwB"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
@@ -123,12 +123,12 @@ export default class View {
123
123
  this.resolutions = {
124
124
  /**
125
125
  * Channel-specific scale resolutions
126
- * @type {Partial<Record<import("../spec/channel.js").ChannelWithScale, import("./scaleResolution.js").default>>}
126
+ * @type {Partial<Record<import("../spec/channel.js").ChannelWithScale, import("../scales/scaleResolution.js").default>>}
127
127
  */
128
128
  scale: {},
129
129
  /**
130
130
  * Channel-specific axis resolutions
131
- * @type {Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("./axisResolution.js").default>>}
131
+ * @type {Partial<Record<import("../spec/channel.js").PrimaryPositionalChannel, import("../scales/axisResolution.js").default>>}
132
132
  */
133
133
  axis: {},
134
134
  };
@@ -276,7 +276,7 @@ export default class View {
276
276
 
277
277
  const scale = this.getScaleResolution(
278
278
  dimension == "width" ? "x" : "y"
279
- )?.scale;
279
+ )?.getScale();
280
280
 
281
281
  if (scale) {
282
282
  // Note: this and all ancestral views need to be refreshed when the domain is changed.
@@ -843,7 +843,7 @@ function createViewOpacityFunction(view) {
843
843
  } else if (isDynamicOpacity(opacityDef)) {
844
844
  /** @type {(channel: import("../spec/channel.js").ChannelWithScale) => any} */
845
845
  const getScale = (channel) => {
846
- const scale = view.getScaleResolution(channel)?.scale;
846
+ const scale = view.getScaleResolution(channel)?.getScale();
847
847
  // Only works on linear scales
848
848
  if (["linear", "index", "locus"].includes(scale?.type)) {
849
849
  return scale;