@genome-spy/core 0.67.0 → 0.69.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 (290) hide show
  1. package/dist/bundle/index.es.js +15884 -13130
  2. package/dist/bundle/index.js +130 -149
  3. package/dist/schema.json +6498 -6191
  4. package/dist/src/data/collector.d.ts +20 -0
  5. package/dist/src/data/collector.d.ts.map +1 -1
  6. package/dist/src/data/collector.js +148 -0
  7. package/dist/src/data/dataFlow.d.ts +6 -0
  8. package/dist/src/data/dataFlow.d.ts.map +1 -1
  9. package/dist/src/data/dataFlow.js +20 -0
  10. package/dist/src/data/flowInit.d.ts.map +1 -1
  11. package/dist/src/data/flowInit.js +2 -3
  12. package/dist/src/data/flowNode.d.ts +33 -10
  13. package/dist/src/data/flowNode.d.ts.map +1 -1
  14. package/dist/src/data/flowNode.js +84 -13
  15. package/dist/src/data/flowTestUtils.d.ts +2 -2
  16. package/dist/src/data/flowTestUtils.d.ts.map +1 -1
  17. package/dist/src/data/flowTestUtils.js +5 -4
  18. package/dist/src/data/keyIndex.d.ts +18 -0
  19. package/dist/src/data/keyIndex.d.ts.map +1 -0
  20. package/dist/src/data/keyIndex.js +241 -0
  21. package/dist/src/data/keyIndex.test.d.ts +2 -0
  22. package/dist/src/data/keyIndex.test.d.ts.map +1 -0
  23. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  24. package/dist/src/data/sources/dataSource.js +7 -3
  25. package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
  26. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  27. package/dist/src/data/sources/dataSourceFactory.js +52 -16
  28. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  29. package/dist/src/data/sources/lazy/bigBedSource.js +11 -10
  30. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/lazy/bigWigSource.js +11 -10
  32. package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
  33. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
  34. package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
  35. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
  36. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  37. package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
  38. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  39. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +16 -1
  40. package/dist/src/data/sources/lazy/tabixSource.d.ts +0 -1
  41. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  42. package/dist/src/data/sources/lazy/tabixSource.js +56 -16
  43. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  44. package/dist/src/data/sources/sequenceSource.js +5 -3
  45. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  46. package/dist/src/data/sources/urlSource.js +7 -3
  47. package/dist/src/data/transforms/filter.d.ts +4 -4
  48. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  49. package/dist/src/data/transforms/filter.js +13 -7
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.js +11 -6
  52. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +2 -0
  53. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +1 -0
  54. package/dist/src/data/transforms/formula.d.ts +4 -4
  55. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  56. package/dist/src/data/transforms/formula.js +12 -6
  57. package/dist/src/data/transforms/measureText.d.ts +2 -2
  58. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  59. package/dist/src/data/transforms/measureText.js +16 -12
  60. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  61. package/dist/src/data/transforms/stack.js +1 -0
  62. package/dist/src/data/transforms/transform.d.ts +2 -2
  63. package/dist/src/data/transforms/transform.d.ts.map +1 -1
  64. package/dist/src/data/transforms/transform.js +3 -3
  65. package/dist/src/encoder/accessor.d.ts +51 -4
  66. package/dist/src/encoder/accessor.d.ts.map +1 -1
  67. package/dist/src/encoder/accessor.js +174 -10
  68. package/dist/src/encoder/encoder.d.ts +11 -2
  69. package/dist/src/encoder/encoder.d.ts.map +1 -1
  70. package/dist/src/encoder/encoder.js +29 -9
  71. package/dist/src/encoder/metadataChannels.d.ts +15 -0
  72. package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
  73. package/dist/src/encoder/metadataChannels.js +65 -0
  74. package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
  75. package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
  76. package/dist/src/genome/genome.d.ts +8 -0
  77. package/dist/src/genome/genome.d.ts.map +1 -1
  78. package/dist/src/genome/genome.js +16 -1
  79. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  80. package/dist/src/genome/scaleLocus.js +14 -1
  81. package/dist/src/genomeSpy/containerUi.d.ts +0 -1
  82. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  83. package/dist/src/genomeSpy/containerUi.js +0 -14
  84. package/dist/src/genomeSpy/inputBindingManager.js +1 -1
  85. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  86. package/dist/src/genomeSpy/interactionController.js +7 -1
  87. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
  88. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
  89. package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
  90. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
  91. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
  92. package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
  93. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  94. package/dist/src/genomeSpy/viewContextFactory.js +0 -1
  95. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  96. package/dist/src/genomeSpy/viewDataInit.js +56 -11
  97. package/dist/src/genomeSpy.d.ts +0 -2
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +47 -27
  100. package/dist/src/gl/glslScaleGenerator.js +1 -1
  101. package/dist/src/marks/mark.d.ts.map +1 -1
  102. package/dist/src/marks/mark.js +40 -41
  103. package/dist/src/marks/markUtils.js +1 -1
  104. package/dist/src/marks/point.d.ts.map +1 -1
  105. package/dist/src/marks/point.js +4 -6
  106. package/dist/src/paramRuntime/expressionCompiler.d.ts +7 -0
  107. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -0
  108. package/dist/src/paramRuntime/expressionCompiler.js +10 -0
  109. package/dist/src/paramRuntime/expressionRef.d.ts +20 -0
  110. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -0
  111. package/dist/src/paramRuntime/expressionRef.js +95 -0
  112. package/dist/src/paramRuntime/expressionRef.test.d.ts +2 -0
  113. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +1 -0
  114. package/dist/src/paramRuntime/graphRuntime.d.ts +176 -0
  115. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -0
  116. package/dist/src/paramRuntime/graphRuntime.js +628 -0
  117. package/dist/src/paramRuntime/graphRuntime.test.d.ts +2 -0
  118. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +1 -0
  119. package/dist/src/paramRuntime/index.d.ts +9 -0
  120. package/dist/src/paramRuntime/index.d.ts.map +1 -0
  121. package/dist/src/paramRuntime/index.js +8 -0
  122. package/dist/src/paramRuntime/lifecycleRegistry.d.ts +27 -0
  123. package/dist/src/paramRuntime/lifecycleRegistry.d.ts.map +1 -0
  124. package/dist/src/paramRuntime/lifecycleRegistry.js +54 -0
  125. package/dist/src/paramRuntime/paramRuntime.d.ts +165 -0
  126. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -0
  127. package/dist/src/paramRuntime/paramRuntime.js +222 -0
  128. package/dist/src/paramRuntime/paramRuntime.test.d.ts +2 -0
  129. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +1 -0
  130. package/dist/src/paramRuntime/paramStore.d.ts +68 -0
  131. package/dist/src/paramRuntime/paramStore.d.ts.map +1 -0
  132. package/dist/src/paramRuntime/paramStore.js +148 -0
  133. package/dist/src/paramRuntime/paramStore.test.d.ts +2 -0
  134. package/dist/src/paramRuntime/paramStore.test.d.ts.map +1 -0
  135. package/dist/src/paramRuntime/paramUtils.d.ts +86 -0
  136. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -0
  137. package/dist/src/paramRuntime/paramUtils.js +272 -0
  138. package/dist/src/paramRuntime/selectionStore.d.ts +6 -0
  139. package/dist/src/paramRuntime/selectionStore.d.ts.map +1 -0
  140. package/dist/src/paramRuntime/selectionStore.js +13 -0
  141. package/dist/src/paramRuntime/types.d.ts +16 -0
  142. package/dist/src/paramRuntime/types.d.ts.map +1 -0
  143. package/dist/src/paramRuntime/types.js +25 -0
  144. package/dist/src/paramRuntime/viewParamRuntime.d.ts +164 -0
  145. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -0
  146. package/dist/src/paramRuntime/viewParamRuntime.js +443 -0
  147. package/dist/src/scale/scale.d.ts +6 -1
  148. package/dist/src/scale/scale.d.ts.map +1 -1
  149. package/dist/src/scale/scale.js +83 -23
  150. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  151. package/dist/src/scales/axisResolution.js +10 -0
  152. package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
  153. package/dist/src/scales/domainPlanner.d.ts.map +1 -0
  154. package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
  155. package/dist/src/scales/domainPlanner.test.d.ts +2 -0
  156. package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
  157. package/dist/src/scales/scaleInstanceManager.d.ts +6 -3
  158. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  159. package/dist/src/scales/scaleInstanceManager.js +17 -11
  160. package/dist/src/scales/scaleInteractionController.d.ts +6 -0
  161. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  162. package/dist/src/scales/scaleInteractionController.js +41 -3
  163. package/dist/src/scales/scaleResolution.d.ts +20 -17
  164. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  165. package/dist/src/scales/scaleResolution.js +188 -71
  166. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
  167. package/dist/src/selection/selection.d.ts +21 -0
  168. package/dist/src/selection/selection.d.ts.map +1 -1
  169. package/dist/src/selection/selection.js +83 -1
  170. package/dist/src/spec/channel.d.ts +52 -15
  171. package/dist/src/spec/coreSchemaRoot.d.ts +53 -0
  172. package/dist/src/spec/data.d.ts +4 -0
  173. package/dist/src/spec/parameter.d.ts +16 -11
  174. package/dist/src/spec/root.d.ts +1 -1
  175. package/dist/src/spec/testing.d.ts +12 -0
  176. package/dist/src/spec/testing.d.ts.map +1 -0
  177. package/dist/src/spec/testing.js +20 -0
  178. package/dist/src/spec/view.d.ts +157 -41
  179. package/dist/src/styles/genome-spy.css +3 -31
  180. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  181. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  182. package/dist/src/styles/genome-spy.css.js +0 -29
  183. package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
  184. package/dist/src/tooltip/dataTooltipHandler.js +23 -32
  185. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +2 -0
  186. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +1 -0
  187. package/dist/src/tooltip/flattenDatumRows.d.ts +13 -0
  188. package/dist/src/tooltip/flattenDatumRows.d.ts.map +1 -0
  189. package/dist/src/tooltip/flattenDatumRows.js +47 -0
  190. package/dist/src/tooltip/flattenDatumRows.test.d.ts +2 -0
  191. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +1 -0
  192. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
  193. package/dist/src/tooltip/refseqGeneTooltipHandler.js +7 -1
  194. package/dist/src/tooltip/tooltipContext.d.ts +13 -0
  195. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -0
  196. package/dist/src/tooltip/tooltipContext.js +543 -0
  197. package/dist/src/tooltip/tooltipContext.test.d.ts +2 -0
  198. package/dist/src/tooltip/tooltipContext.test.d.ts.map +1 -0
  199. package/dist/src/tooltip/tooltipHandler.d.ts +40 -1
  200. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -1
  201. package/dist/src/tooltip/tooltipHandler.ts +62 -1
  202. package/dist/src/types/encoder.d.ts +38 -3
  203. package/dist/src/types/rendering.d.ts +4 -3
  204. package/dist/src/types/viewContext.d.ts +0 -14
  205. package/dist/src/utils/inputBinding.d.ts +10 -2
  206. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  207. package/dist/src/utils/inputBinding.js +12 -3
  208. package/dist/src/utils/throttle.d.ts +4 -1
  209. package/dist/src/utils/throttle.d.ts.map +1 -1
  210. package/dist/src/utils/throttle.js +54 -23
  211. package/dist/src/utils/throttle.test.d.ts +2 -0
  212. package/dist/src/utils/throttle.test.d.ts.map +1 -0
  213. package/dist/src/utils/transition.d.ts +21 -0
  214. package/dist/src/utils/transition.d.ts.map +1 -1
  215. package/dist/src/utils/transition.js +28 -0
  216. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  217. package/dist/src/utils/ui/tooltip.js +7 -1
  218. package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
  219. package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
  220. package/dist/src/view/axisGridView.d.ts.map +1 -1
  221. package/dist/src/view/axisGridView.js +22 -5
  222. package/dist/src/view/axisView.d.ts.map +1 -1
  223. package/dist/src/view/axisView.js +20 -5
  224. package/dist/src/view/concatView.js +3 -3
  225. package/dist/src/view/containerMutationHelper.js +1 -1
  226. package/dist/src/view/containerView.d.ts +9 -5
  227. package/dist/src/view/containerView.d.ts.map +1 -1
  228. package/dist/src/view/containerView.js +34 -9
  229. package/dist/src/view/dataReadiness.d.ts +46 -0
  230. package/dist/src/view/dataReadiness.d.ts.map +1 -0
  231. package/dist/src/view/dataReadiness.js +267 -0
  232. package/dist/src/view/dataReadiness.test.d.ts +2 -0
  233. package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
  234. package/dist/src/view/facetView.d.ts.map +1 -1
  235. package/dist/src/view/facetView.js +7 -5
  236. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  237. package/dist/src/view/flowBuilder.js +17 -4
  238. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  239. package/dist/src/view/gridView/gridChild.js +16 -3
  240. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  241. package/dist/src/view/gridView/gridView.js +119 -2
  242. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  243. package/dist/src/view/gridView/scrollbar.js +3 -0
  244. package/dist/src/view/gridView/selectionRect.d.ts +6 -10
  245. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  246. package/dist/src/view/gridView/selectionRect.js +22 -24
  247. package/dist/src/view/gridView/separatorView.d.ts +51 -0
  248. package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
  249. package/dist/src/view/gridView/separatorView.js +275 -0
  250. package/dist/src/view/layerView.d.ts.map +1 -1
  251. package/dist/src/view/layerView.js +7 -5
  252. package/dist/src/view/layout/flexLayout.d.ts +0 -30
  253. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  254. package/dist/src/view/layout/flexLayout.js +0 -86
  255. package/dist/src/view/multiscale.d.ts +35 -0
  256. package/dist/src/view/multiscale.d.ts.map +1 -0
  257. package/dist/src/view/multiscale.js +233 -0
  258. package/dist/src/view/multiscale.test.d.ts +2 -0
  259. package/dist/src/view/multiscale.test.d.ts.map +1 -0
  260. package/dist/src/view/testUtils.d.ts.map +1 -1
  261. package/dist/src/view/testUtils.js +6 -1
  262. package/dist/src/view/unitView.d.ts +8 -13
  263. package/dist/src/view/unitView.d.ts.map +1 -1
  264. package/dist/src/view/unitView.js +120 -45
  265. package/dist/src/view/view.d.ts +27 -18
  266. package/dist/src/view/view.d.ts.map +1 -1
  267. package/dist/src/view/view.js +298 -37
  268. package/dist/src/view/viewFactory.d.ts +0 -12
  269. package/dist/src/view/viewFactory.d.ts.map +1 -1
  270. package/dist/src/view/viewFactory.js +55 -25
  271. package/dist/src/view/viewParamRuntime.test.d.ts +2 -0
  272. package/dist/src/view/viewParamRuntime.test.d.ts.map +1 -0
  273. package/dist/src/view/viewSelectors.d.ts +148 -0
  274. package/dist/src/view/viewSelectors.d.ts.map +1 -0
  275. package/dist/src/view/viewSelectors.js +776 -0
  276. package/dist/src/view/viewSelectors.test.d.ts +2 -0
  277. package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
  278. package/dist/src/view/viewUtils.d.ts +0 -8
  279. package/dist/src/view/viewUtils.d.ts.map +1 -1
  280. package/dist/src/view/viewUtils.js +1 -21
  281. package/package.json +4 -4
  282. package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
  283. package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
  284. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
  285. package/dist/src/spec/sampleView.d.ts +0 -197
  286. package/dist/src/view/paramMediator.d.ts +0 -149
  287. package/dist/src/view/paramMediator.d.ts.map +0 -1
  288. package/dist/src/view/paramMediator.js +0 -478
  289. package/dist/src/view/paramMediator.test.d.ts +0 -2
  290. package/dist/src/view/paramMediator.test.d.ts.map +0 -1
@@ -27,9 +27,6 @@ export const VISIT_STOP: "VISIT_STOP";
27
27
  * @typedef {object} ViewOptions
28
28
  * @prop {boolean} [blockEncodingInheritance]
29
29
  * Don't inherit encodings from parent. Default: false.
30
- * @prop {boolean} [contributesToScaleDomain]
31
- * Whether ScaleResolution should include this view or its children in the
32
- * domain. Default: true
33
30
  * @prop {boolean} [layersChildren]
34
31
  * View's children are layered on top of each other and they have the same
35
32
  * coordinates as their parent.
@@ -60,7 +57,6 @@ export default class View {
60
57
  context: import("../types/viewContext.js").default;
61
58
  layoutParent: import("./containerView.js").default;
62
59
  dataParent: View;
63
- name: string;
64
60
  spec: import("../spec/view.js").ViewSpec;
65
61
  resolutions: {
66
62
  /**
@@ -79,11 +75,6 @@ export default class View {
79
75
  * Don't inherit encodings from parent. Default: false.
80
76
  */
81
77
  blockEncodingInheritance: boolean;
82
- /**
83
- * Whether ScaleResolution should include this view or its children in the
84
- * domain. Default: true
85
- */
86
- contributesToScaleDomain: boolean;
87
78
  /**
88
79
  * View's children are layered on top of each other and they have the same
89
80
  * coordinates as their parent.
@@ -100,8 +91,22 @@ export default class View {
100
91
  * @type {Record<import("../spec/channel.js").PrimaryPositionalChannel, boolean>}
101
92
  */
102
93
  needsAxes: Record<import("../spec/channel.js").PrimaryPositionalChannel, boolean>;
103
- /** @type {ParamMediator} */
104
- paramMediator: ParamMediator;
94
+ /** @type {ViewParamRuntime} */
95
+ paramRuntime: ViewParamRuntime;
96
+ /**
97
+ * Effective view name. Equals the explicit name (`spec.name`) when provided,
98
+ * otherwise falls back to an auto-generated default name.
99
+ */
100
+ get name(): string;
101
+ /**
102
+ * The explicit name from the spec (`spec.name`), if any.
103
+ */
104
+ get explicitName(): string;
105
+ /**
106
+ * The auto-generated default name that was assigned by the parent/factory.
107
+ * Intended for debugging only.
108
+ */
109
+ get defaultName(): string;
105
110
  /**
106
111
  * Returns the coords of the view. If view has been faceted, returns the coords
107
112
  * of an arbitrary facet. If all or specific facet coords are needed, use `facetCoords`.
@@ -134,6 +139,7 @@ export default class View {
134
139
  * @returns {FlexDimensions}
135
140
  */
136
141
  getViewportSize(): FlexDimensions;
142
+ registerStepSizeInvalidation(): void;
137
143
  isConfiguredVisible(): boolean;
138
144
  isVisibleInSpec(): boolean;
139
145
  /**
@@ -146,6 +152,12 @@ export default class View {
146
152
  * @returns {boolean}
147
153
  */
148
154
  isVisible(): boolean;
155
+ /**
156
+ * Returns true if this view or any ancestor is marked as domain inert.
157
+ *
158
+ * @returns {boolean}
159
+ */
160
+ isDomainInert(): boolean;
149
161
  /**
150
162
  * @returns {"none" | "pending" | "ready"}
151
163
  */
@@ -186,8 +198,9 @@ export default class View {
186
198
  *
187
199
  * @param {string} type
188
200
  * @param {function(BroadcastMessage):void} handler
201
+ * @returns {() => void}
189
202
  */
190
- _addBroadcastHandler(type: string, handler: (arg0: BroadcastMessage) => void): void;
203
+ _addBroadcastHandler(type: string, handler: (arg0: BroadcastMessage) => void): () => void;
191
204
  /**
192
205
  * Handles an interactionEvent
193
206
  *
@@ -250,6 +263,7 @@ export default class View {
250
263
  * pass. The order is depth first, pre order.
251
264
  */
252
265
  onBeforeRender(): void;
266
+ hasRendered(): boolean;
253
267
  render(context: import("./renderingContext/viewRenderingContext.js").default, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
254
268
  /**
255
269
  * Returns the encodings specified in this view combined with the inherited
@@ -372,18 +386,13 @@ export type ViewOptions = {
372
386
  * Don't inherit encodings from parent. Default: false.
373
387
  */
374
388
  blockEncodingInheritance?: boolean;
375
- /**
376
- * Whether ScaleResolution should include this view or its children in the
377
- * domain. Default: true
378
- */
379
- contributesToScaleDomain?: boolean;
380
389
  /**
381
390
  * View's children are layered on top of each other and they have the same
382
391
  * coordinates as their parent.
383
392
  */
384
393
  layersChildren?: boolean;
385
394
  };
386
- import ParamMediator from "./paramMediator.js";
395
+ import ViewParamRuntime from "../paramRuntime/viewParamRuntime.js";
387
396
  import Padding from "./layout/padding.js";
388
397
  import { FlexDimensions } from "./layout/flexLayout.js";
389
398
  //# sourceMappingURL=view.d.ts.map
@@ -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":"AA4BA,oBAAoB;AACpB,yBAA0B,YAAY,CAAC;AACvC,0BAA0B;AAC1B,yBAA0B,YAAY,CAAC;AAKvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IA6CI;;;;;;;;;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,EAsErB;IApGD;;OAEG;IACH,iBAFU,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM,CAEQ;IAYzC;;;;;OAKG;IACH,aAFU,GAAG,CAAC,GAAG,EAAE,OAAO,uBAAuB,EAAE,OAAO,CAAC,CAEX;IAiB5C,mDAAsB;IACtB,mDAAgC;IAChC,iBAA4B;IAE5B,yCAAgB;IAEhB;QACI;;;WAGG;eADO,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,gBAAgB,EAAE,OAAO,8BAA8B,EAAE,OAAO,CAAC,CAAC;QAGxH;;;WAGG;cADO,OAAO,CAAC,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC,CAAC;MAGlI;IAID;;;;kCAvFE,OAAO;;;;;yBAEP,OAAO;MAwFR;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,+BAA+B;IAC/B,cADW,gBAAgB,CAG1B;IAuBL;;;OAGG;IACH,mBAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;OAGG;IACH,0BAEC;IAED;;;;;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;IAqED,qCAGC;IA2BD,+BAEC;IAED,2BAEC;IAED;;;;;;;;OAQG;IACH,aAFa,OAAO,CAMnB;IAED;;;;OAIG;IACH,iBAFa,OAAO,CAanB;IAED;;OAEG;IACH,8BAFa,MAAM,GAAG,SAAS,GAAG,OAAO,CAIxC;IAED;;;;;OAKG;IACH,mCAFW,MAAM,GAAG,SAAS,GAAG,OAAO,QAItC;IAED,6BAEC;IAED;;;;;;;OAOG;IACH,uBAFa,MAAM,CAMlB;IAED,wBAKC;IAkBD;;OAEG;IACH,6BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;OAIG;IACH,yBAFW,gBAAgB,QAO1B;IAED;;;;;OAKG;IACH,2BAJW,MAAM,WACN,CAAS,IAAgB,EAAhB,gBAAgB,KAAE,IAAI,GAC7B,MAAM,IAAI,CAqBtB;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,gBA0BC;IAED;;OAEG;IACH,2BAFW,MAAM,IAAI,QAIpB;IAED;;OAEG;IACH,uBAOC;IAED;;OAEG;IACH,6BASC;IAED;;;OAGG;IACH,uBAIC;IAED,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,kDAWvD;IAED;;OAEG;IACH,2BAFW,OAAO,oBAAoB,EAAE,iBAAiB,iDAWxD;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,4BAIC;IAED;;;;;OAKG;IACH,iCAFW,OAAO,8BAA8B,EAAE,OAAO,QAIxD;;CACJ;AAqOM,iCAHI,GAAG,GACF,IAAI,IAAI,OAAO,iBAAiB,EAAE,IAAI,CAEF;0BAlnCnC,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;;;;;qBAEP,OAAO;;6BA3CY,qCAAqC;oBAb9C,qBAAqB;+BADlC,wBAAwB"}
@@ -9,14 +9,15 @@ import {
9
9
  initPropertyCache,
10
10
  invalidatePrefix,
11
11
  } from "../utils/propertyCacher.js";
12
- import { isNumber, isString, span } from "vega-util";
12
+ import { isArray, isNumber, isString, span } from "vega-util";
13
13
  import { scaleLog } from "d3-scale";
14
14
  import { isFieldDef, getPrimaryChannel } from "../encoder/encoder.js";
15
15
  import { concatUrl } from "../utils/url.js";
16
16
  import { isDiscrete, bandSpace } from "vega-scale";
17
17
  import { peek } from "../utils/arrayUtils.js";
18
18
  import ViewError from "./viewError.js";
19
- import ParamMediator, { isExprRef } from "./paramMediator.js";
19
+ import ViewParamRuntime from "../paramRuntime/viewParamRuntime.js";
20
+ import { isExprRef } from "../paramRuntime/paramUtils.js";
20
21
  import { InternMap } from "internmap";
21
22
  import { endWithSlash } from "../utils/addBaseUrl.js";
22
23
 
@@ -58,14 +59,14 @@ const defaultOpacityFunction = (parentOpacity) => parentOpacity;
58
59
  * @typedef {object} ViewOptions
59
60
  * @prop {boolean} [blockEncodingInheritance]
60
61
  * Don't inherit encodings from parent. Default: false.
61
- * @prop {boolean} [contributesToScaleDomain]
62
- * Whether ScaleResolution should include this view or its children in the
63
- * domain. Default: true
64
62
  * @prop {boolean} [layersChildren]
65
63
  * View's children are layered on top of each other and they have the same
66
64
  * coordinates as their parent.
67
65
  */
68
66
  export default class View {
67
+ /** @type {string | undefined} */
68
+ #defaultName;
69
+
69
70
  /** @type {Record<string, (function(BroadcastMessage):void)[]>} */
70
71
  #broadcastHandlers = {};
71
72
 
@@ -81,6 +82,9 @@ export default class View {
81
82
  /** @type {(value: number) => void} */
82
83
  #heightSetter;
83
84
 
85
+ /** @type {boolean} */
86
+ #hasRendered = false;
87
+
84
88
  /**
85
89
  * @type {function(number):number}
86
90
  */
@@ -122,7 +126,7 @@ export default class View {
122
126
  this.context = context;
123
127
  this.layoutParent = layoutParent;
124
128
  this.dataParent = dataParent;
125
- this.name = spec.name || name;
129
+ this.#defaultName = name;
126
130
  this.spec = spec;
127
131
 
128
132
  this.resolutions = {
@@ -142,7 +146,6 @@ export default class View {
142
146
 
143
147
  this.options = {
144
148
  blockEncodingInheritance: false,
145
- contributesToScaleDomain: true,
146
149
  ...options,
147
150
  };
148
151
 
@@ -158,15 +161,15 @@ export default class View {
158
161
  */
159
162
  this.needsAxes = { x: false, y: false };
160
163
 
161
- /** @type {ParamMediator} */
162
- this.paramMediator = new ParamMediator(
163
- () => this.dataParent?.paramMediator
164
+ /** @type {ViewParamRuntime} */
165
+ this.paramRuntime = new ViewParamRuntime(
166
+ () => this.dataParent?.paramRuntime
164
167
  );
165
168
 
166
169
  if (spec.params) {
167
170
  for (const param of spec.params) {
168
171
  // TODO: If interval selection, validate `encodings` or provides defaults
169
- this.paramMediator.registerParam(param);
172
+ this.paramRuntime.registerParam(param);
170
173
  }
171
174
  }
172
175
 
@@ -176,14 +179,37 @@ export default class View {
176
179
  // doesn't make much sense, but it's used in the App's SampleView
177
180
  // to set the height to sample facets' height.
178
181
  const allocateIfFree = (/** @type {string} */ name) =>
179
- this.paramMediator.findMediatorForParam(name)
182
+ this.paramRuntime.findRuntimeForParam(name)
180
183
  ? undefined
181
- : this.paramMediator.allocateSetter(name, 0);
184
+ : this.paramRuntime.allocateSetter(name, 0);
182
185
  this.#heightSetter = allocateIfFree("height");
183
186
  this.#widthSetter = allocateIfFree("width");
184
187
  }
185
188
  }
186
189
 
190
+ /**
191
+ * Effective view name. Equals the explicit name (`spec.name`) when provided,
192
+ * otherwise falls back to an auto-generated default name.
193
+ */
194
+ get name() {
195
+ return this.spec.name ?? this.#defaultName;
196
+ }
197
+
198
+ /**
199
+ * The explicit name from the spec (`spec.name`), if any.
200
+ */
201
+ get explicitName() {
202
+ return this.spec.name;
203
+ }
204
+
205
+ /**
206
+ * The auto-generated default name that was assigned by the parent/factory.
207
+ * Intended for debugging only.
208
+ */
209
+ get defaultName() {
210
+ return this.#defaultName;
211
+ }
212
+
187
213
  /**
188
214
  * Returns the coords of the view. If view has been faceted, returns the coords
189
215
  * of an arbitrary facet. If all or specific facet coords are needed, use `facetCoords`.
@@ -265,11 +291,12 @@ export default class View {
265
291
  */
266
292
  #getDimensionSize(dimension) {
267
293
  let value = this.spec[dimension];
294
+ const needsStepInvalidation = isStepSize(value);
268
295
 
269
296
  const viewport =
270
297
  dimension == "viewportWidth" || dimension == "viewportHeight";
271
298
 
272
- if (isStepSize(value)) {
299
+ if (needsStepInvalidation) {
273
300
  if (viewport) {
274
301
  throw new ViewError(
275
302
  `Cannot use step-based size with "${dimension}"!`,
@@ -313,7 +340,7 @@ export default class View {
313
340
  return { px: steps * stepSize, grow: 0 };
314
341
  } else {
315
342
  throw new ViewError(
316
- "Cannot use 'step' size with missing scale!",
343
+ `Cannot use step-based size with "${dimension}"!`,
317
344
  this
318
345
  );
319
346
  }
@@ -325,6 +352,36 @@ export default class View {
325
352
  }
326
353
  }
327
354
 
355
+ registerStepSizeInvalidation() {
356
+ this.#registerStepSizeInvalidationFor("width", "x");
357
+ this.#registerStepSizeInvalidationFor("height", "y");
358
+ }
359
+
360
+ /**
361
+ * @param {"width" | "height"} dimension
362
+ * @param {import("../spec/channel.js").PrimaryPositionalChannel} channel
363
+ */
364
+ #registerStepSizeInvalidationFor(dimension, channel) {
365
+ const value = this.spec[dimension];
366
+ if (!isStepSize(value)) {
367
+ return;
368
+ }
369
+
370
+ const resolution = this.getScaleResolution(channel);
371
+ if (!resolution) {
372
+ throw new ViewError(
373
+ "Cannot use 'step' size without a scale!",
374
+ this
375
+ );
376
+ }
377
+
378
+ const listener = () => this.invalidateSizeCache();
379
+ resolution.addEventListener("domain", listener);
380
+ this.registerDisposer(() =>
381
+ resolution.removeEventListener("domain", listener)
382
+ );
383
+ }
384
+
328
385
  isConfiguredVisible() {
329
386
  return this.context.isViewConfiguredVisible(this);
330
387
  }
@@ -348,6 +405,24 @@ export default class View {
348
405
  );
349
406
  }
350
407
 
408
+ /**
409
+ * Returns true if this view or any ancestor is marked as domain inert.
410
+ *
411
+ * @returns {boolean}
412
+ */
413
+ isDomainInert() {
414
+ if (this.spec.domainInert) {
415
+ return true;
416
+ }
417
+
418
+ const parent = this.dataParent;
419
+ if (!parent) {
420
+ return false;
421
+ }
422
+
423
+ return parent.isDomainInert();
424
+ }
425
+
351
426
  /**
352
427
  * @returns {"none" | "pending" | "ready"}
353
428
  */
@@ -436,6 +511,7 @@ export default class View {
436
511
  *
437
512
  * @param {string} type
438
513
  * @param {function(BroadcastMessage):void} handler
514
+ * @returns {() => void}
439
515
  */
440
516
  _addBroadcastHandler(type, handler) {
441
517
  let handlers = this.#broadcastHandlers[type];
@@ -444,6 +520,18 @@ export default class View {
444
520
  this.#broadcastHandlers[type] = handlers;
445
521
  }
446
522
  handlers.push(handler);
523
+
524
+ return () => {
525
+ const currentHandlers = this.#broadcastHandlers[type];
526
+ if (!currentHandlers) {
527
+ return;
528
+ }
529
+
530
+ const index = currentHandlers.indexOf(handler);
531
+ if (index >= 0) {
532
+ currentHandlers.splice(index, 1);
533
+ }
534
+ };
447
535
  }
448
536
 
449
537
  /**
@@ -568,6 +656,10 @@ export default class View {
568
656
  this.context.dataFlow.removeDataSource(handle.dataSource);
569
657
  }
570
658
 
659
+ this.paramRuntime.dispose();
660
+
661
+ this.context.dataFlow.loadingStatusRegistry.delete(this);
662
+
571
663
  this.flowHandle = undefined;
572
664
  }
573
665
 
@@ -609,7 +701,13 @@ export default class View {
609
701
  * pass. The order is depth first, pre order.
610
702
  */
611
703
  onBeforeRender() {
612
- //
704
+ if (!this.#hasRendered) {
705
+ this.#hasRendered = true;
706
+ }
707
+ }
708
+
709
+ hasRendered() {
710
+ return this.#hasRendered;
613
711
  }
614
712
 
615
713
  /**
@@ -793,7 +891,7 @@ export default class View {
793
891
  return isString(title)
794
892
  ? title
795
893
  : isExprRef(title.text)
796
- ? this.paramMediator.evaluateAndGet(title.text.expr)
894
+ ? this.paramRuntime.evaluateAndGet(title.text.expr)
797
895
  : title.text;
798
896
  }
799
897
  }
@@ -832,7 +930,9 @@ export default class View {
832
930
  }
833
931
 
834
932
  invalidateSizeCache() {
835
- this._invalidateCacheByPrefix("size/", "ancestors");
933
+ // Clear both "size" and "size/*" cache keys.
934
+ invalidatePrefix(this, "size");
935
+ this._invalidateCacheByPrefix("size", "ancestors");
836
936
  }
837
937
 
838
938
  /**
@@ -856,6 +956,16 @@ function isDynamicOpacity(opacity) {
856
956
  }
857
957
 
858
958
  /**
959
+ * Builds the effective opacity function for a view.
960
+ *
961
+ * The resulting function multiplies parent opacity with one of:
962
+ * 1. constant opacity (`number`)
963
+ * 2. zoom-driven dynamic opacity (`DynamicOpacity`) that maps the current
964
+ * units-per-pixel metric through a log interpolation
965
+ * 3. expression-driven opacity (`ExprRef`) that is evaluated reactively
966
+ *
967
+ * Dynamic opacity supports scale selection via `channel` (`x`, `y`, or
968
+ * `"auto"`), where `"auto"` averages available x/y metrics.
859
969
  *
860
970
  * @param {View} view
861
971
  * @returns {function(number):number}
@@ -867,46 +977,197 @@ function createViewOpacityFunction(view) {
867
977
  if (isNumber(opacityDef)) {
868
978
  return (parentOpacity) => parentOpacity * opacityDef;
869
979
  } else if (isDynamicOpacity(opacityDef)) {
870
- /** @type {(channel: import("../spec/channel.js").ChannelWithScale) => any} */
871
- const getScale = (channel) => {
872
- const scale = view.getScaleResolution(channel)?.getScale();
980
+ /**
981
+ * @param {import("../spec/channel.js").PrimaryPositionalChannel} channel
982
+ */
983
+ const getScaleContext = (channel) => {
984
+ const scaleResolution = view.getScaleResolution(channel);
985
+ const scale = scaleResolution?.getScale();
873
986
  // Only works on linear scales
874
987
  if (["linear", "index", "locus"].includes(scale?.type)) {
875
- return scale;
988
+ return { scale, scaleResolution };
876
989
  }
877
990
  };
878
991
 
879
- const scale = opacityDef.channel
880
- ? getScale(opacityDef.channel)
881
- : (getScale("x") ?? getScale("y"));
992
+ const opacityValues = asFiniteNumberArray(
993
+ opacityDef.values,
994
+ "opacity.values",
995
+ view
996
+ );
882
997
 
883
- if (!scale) {
998
+ if (!isArray(opacityDef.unitsPerPixel)) {
884
999
  throw new ViewError(
885
- "Cannot find a resolved quantitative scale for dynamic opacity!",
1000
+ '"opacity.unitsPerPixel" must be an array.',
886
1001
  view
887
1002
  );
888
1003
  }
889
1004
 
890
- const interpolate = scaleLog()
891
- .domain(opacityDef.unitsPerPixel)
892
- .range(opacityDef.values)
893
- .clamp(true);
1005
+ /** @type {function(number): number} */
1006
+ let interpolate = () => 1;
894
1007
 
895
- return (parentOpacity) => {
896
- const rangeSpan = 1000; //TODO: span(scale.range());
897
- const unitsPerPixel = span(scale.domain()) / rangeSpan;
1008
+ /** @type {(() => number)[]} */
1009
+ let stopReaders = [];
898
1010
 
899
- return interpolate(unitsPerPixel) * parentOpacity;
1011
+ const updateInterpolator = () => {
1012
+ const unitsPerPixel = asFiniteNumberArray(
1013
+ stopReaders.map((readStop) => readStop()),
1014
+ "opacity.unitsPerPixel",
1015
+ view
1016
+ );
1017
+
1018
+ validateDynamicOpacityStops(unitsPerPixel, opacityValues, view);
1019
+
1020
+ const scale = scaleLog()
1021
+ .domain(unitsPerPixel)
1022
+ .range(opacityValues)
1023
+ .clamp(true);
1024
+
1025
+ interpolate = (value) => scale(value);
1026
+ };
1027
+
1028
+ stopReaders = opacityDef.unitsPerPixel.map((stop) => {
1029
+ if (isExprRef(stop)) {
1030
+ const fn = view.paramRuntime.watchExpression(
1031
+ stop.expr,
1032
+ () => {
1033
+ updateInterpolator();
1034
+ view.context.animator.requestRender();
1035
+ }
1036
+ );
1037
+ return () => fn(null);
1038
+ } else {
1039
+ return () => stop;
1040
+ }
1041
+ });
1042
+
1043
+ updateInterpolator();
1044
+
1045
+ /**
1046
+ * @param {{ scale: any, scaleResolution: import("../scales/scaleResolution.js").default }} scaleContext
1047
+ */
1048
+ const getUnitsPerPixel = (scaleContext) => {
1049
+ const axisLength = scaleContext.scaleResolution.getAxisLength();
1050
+ const rangeSpan = axisLength || 1000;
1051
+ return span(scaleContext.scale.domain()) / rangeSpan;
1052
+ };
1053
+
1054
+ /** @type {() => number} */
1055
+ let getMetric;
1056
+
1057
+ if (opacityDef.channel === "auto") {
1058
+ const xScale = getScaleContext("x");
1059
+ const yScale = getScaleContext("y");
1060
+
1061
+ if (xScale && yScale) {
1062
+ getMetric = () =>
1063
+ (getUnitsPerPixel(xScale) + getUnitsPerPixel(yScale)) /
1064
+ 2;
1065
+ } else if (xScale) {
1066
+ getMetric = () => getUnitsPerPixel(xScale);
1067
+ } else if (yScale) {
1068
+ getMetric = () => getUnitsPerPixel(yScale);
1069
+ } else {
1070
+ throw new ViewError(
1071
+ "Cannot find a resolved quantitative x or y scale for dynamic opacity!",
1072
+ view
1073
+ );
1074
+ }
1075
+ } else {
1076
+ const scaleContext = opacityDef.channel
1077
+ ? getScaleContext(opacityDef.channel)
1078
+ : (getScaleContext("x") ?? getScaleContext("y"));
1079
+
1080
+ if (!scaleContext) {
1081
+ throw new ViewError(
1082
+ "Cannot find a resolved quantitative scale for dynamic opacity!",
1083
+ view
1084
+ );
1085
+ }
1086
+
1087
+ getMetric = () => getUnitsPerPixel(scaleContext);
1088
+ }
1089
+
1090
+ return (parentOpacity) => {
1091
+ return interpolate(getMetric()) * parentOpacity;
900
1092
  };
901
1093
  } else if (isExprRef(opacityDef)) {
902
- const fn = view.paramMediator.createExpression(opacityDef.expr);
903
- fn.addListener(() => view.context.animator.requestRender());
1094
+ const fn = view.paramRuntime.watchExpression(opacityDef.expr, () =>
1095
+ view.context.animator.requestRender()
1096
+ );
904
1097
  return (parentOpacity) => fn(null) * parentOpacity;
905
1098
  }
906
1099
  }
907
1100
  return (parentOpacity) => parentOpacity;
908
1101
  }
909
1102
 
1103
+ /**
1104
+ * @param {number[]} unitsPerPixel
1105
+ * @param {number[]} values
1106
+ * @param {View} view
1107
+ */
1108
+ function validateDynamicOpacityStops(unitsPerPixel, values, view) {
1109
+ if (!unitsPerPixel.length) {
1110
+ throw new ViewError(
1111
+ '"opacity.unitsPerPixel" must contain at least one stop.',
1112
+ view
1113
+ );
1114
+ }
1115
+
1116
+ if (unitsPerPixel.length !== values.length) {
1117
+ throw new ViewError(
1118
+ '"opacity.unitsPerPixel" and "opacity.values" must have the same length.',
1119
+ view
1120
+ );
1121
+ }
1122
+
1123
+ unitsPerPixel.forEach((value, index) => {
1124
+ if (value <= 0) {
1125
+ throw new ViewError(
1126
+ "Invalid opacity.unitsPerPixel value at index " +
1127
+ index +
1128
+ ". Stop values must be positive.",
1129
+ view
1130
+ );
1131
+ }
1132
+ });
1133
+
1134
+ for (let i = 1; i < unitsPerPixel.length; i++) {
1135
+ if (unitsPerPixel[i - 1] <= unitsPerPixel[i]) {
1136
+ throw new ViewError(
1137
+ '"opacity.unitsPerPixel" must be strictly decreasing.',
1138
+ view
1139
+ );
1140
+ }
1141
+ }
1142
+ }
1143
+
1144
+ /**
1145
+ * @param {unknown} value
1146
+ * @param {string} label
1147
+ * @param {View} view
1148
+ * @returns {number[]}
1149
+ */
1150
+ function asFiniteNumberArray(value, label, view) {
1151
+ if (!isArray(value)) {
1152
+ throw new ViewError('"' + label + '" must evaluate to an array.', view);
1153
+ }
1154
+
1155
+ return value.map((item, index) => {
1156
+ if (!isNumber(item) || !Number.isFinite(item)) {
1157
+ throw new ViewError(
1158
+ "Invalid " +
1159
+ label +
1160
+ " value at index " +
1161
+ index +
1162
+ ". Expected a finite number.",
1163
+ view
1164
+ );
1165
+ }
1166
+
1167
+ return item;
1168
+ });
1169
+ }
1170
+
910
1171
  /**
911
1172
  *
912
1173
  * @param {any} size
@@ -16,12 +16,6 @@ export function isLayerSpec(spec: import("../spec/view.js").ViewSpec): spec is i
16
16
  * @returns {spec is LayerSpec}
17
17
  */
18
18
  export function isFacetSpec(spec: import("../spec/view.js").ViewSpec): spec is import("../spec/view.js").LayerSpec;
19
- /**
20
- *
21
- * @param {ViewSpec} spec
22
- * @returns {spec is import("../spec/view.js").AggregateSamplesSpec}
23
- */
24
- export function isAggregateSamplesSpec(spec: import("../spec/view.js").ViewSpec): spec is import("../spec/view.js").AggregateSamplesSpec;
25
19
  /**
26
20
  *
27
21
  * @param {object} spec
@@ -46,12 +40,6 @@ export function isHConcatSpec(spec: import("../spec/view.js").ViewSpec): spec is
46
40
  * @returns {spec is ConcatSpec}
47
41
  */
48
42
  export function isConcatSpec(spec: import("../spec/view.js").ViewSpec): spec is import("../spec/view.js").ConcatSpec;
49
- /**
50
- *
51
- * @param {ViewSpec} spec
52
- * @returns {spec is SampleSpec}
53
- */
54
- export function isSampleSpec(spec: import("../spec/view.js").ViewSpec): spec is import("../spec/sampleView.js").SampleSpec;
55
43
  export const VIEW_ROOT_NAME: "viewRoot";
56
44
  /**
57
45
  * @typedef {object} ViewFactoryOptions
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"viewFactory.d.ts","sourceRoot":"","sources":["../../../src/view/viewFactory.js"],"names":[],"mappings":"AAwUA;;;;GAIG;AACH,sEAFa,IAAI,sCAAY,CAI5B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAI7B;AAED;;;;GAIG;AACH,uEAFa,IAAI,uCAAa,CAS7B;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;AAxXD,6BAA8B,UAAU,CAAC;AAEzC;;;;GAIG;AAEH;;GAEG;AACH;IAiBI;;OAEG;IACH,sBAFW,kBAAkB,EAiD5B;IA9CG,2CAA2C;IAC3C,SADW,QAAQ,CAAC,kBAAkB,CAAC,CAKtC;IA2CL;;;OAGG;IACH,qEA/DiC,OAAO,yHAC2B,OAAO,oBAAoB,EAAE,OAAO,eAAe,OAAO,WAAW,EAAE,OAAO,gBAAgB,MAAM,KAAK,IAAI,QAgE/K;IAED;;;;;;OAMG;IACH,wHAJW,OAAO,oBAAoB,EAAE,OAAO,eACpC,OAAO,WAAW,EAAE,OAAO,gBAC3B,MAAM,QAyBhB;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,iBAiGlC;;CACJ;;;;;kBA9Oa,OAAO;eACP,OAAO;;iBAtBJ,WAAW"}