@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
@@ -18,6 +18,14 @@ import Scrollbar from "./scrollbar.js";
18
18
  import SelectionRect from "./selectionRect.js";
19
19
 
20
20
  export default class GridChild {
21
+ /**
22
+ * Users guide:
23
+ * - GridChild is owned by GridView and is not meant to be instantiated or
24
+ * managed directly by callers.
25
+ * - Use GridView/ConcatView APIs for insertion/removal so decorations and
26
+ * dataflow are kept in sync.
27
+ */
28
+
21
29
  /**
22
30
  * @param {import("../view.js").default} view
23
31
  * @param {import("../containerView.js").default} layoutParent
@@ -137,7 +145,7 @@ export default class GridChild {
137
145
  const scaleResolutions = Object.fromEntries(
138
146
  channels.map((channel) => {
139
147
  const resolution = this.view.getScaleResolution(channel);
140
- const scale = resolution?.scale;
148
+ const scale = resolution?.getScale();
141
149
 
142
150
  if (!scale || !isContinuous(scale.type)) {
143
151
  throw new Error(
@@ -214,7 +222,7 @@ export default class GridChild {
214
222
  const np = view.coords.normalizePoint(point.x, point.y, true);
215
223
 
216
224
  for (const channel of channels) {
217
- const scale = scaleResolutions[channel].scale;
225
+ const scale = scaleResolutions[channel].getScale();
218
226
  // @ts-ignore
219
227
  const val = scale.invert(channel == "x" ? np.x : np.y);
220
228
  inverted[channel] =
@@ -243,7 +251,7 @@ export default class GridChild {
243
251
  /** @type {number} */ val
244
252
  ) => {
245
253
  if (val == null) return null;
246
- return scaleResolutions[channel].scale(val);
254
+ return scaleResolutions[channel].getScale()(val);
247
255
  };
248
256
  const px = getCoord("x", xVal) ?? i;
249
257
  const py = getCoord("y", yVal) ?? i;
@@ -477,10 +485,12 @@ export default class GridChild {
477
485
  * Create view decorations, grid lines, axes, etc.
478
486
  */
479
487
  async createAxes() {
488
+ this.disposeAxisViews();
489
+
480
490
  const { view, axes, gridLines } = this;
481
491
 
482
492
  /**
483
- * @param {import("../axisResolution.js").default} r
493
+ * @param {import("../../scales/axisResolution.js").default} r
484
494
  * @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
485
495
  */
486
496
  const getAxisPropsWithDefaults = (r, channel) => {
@@ -521,7 +531,7 @@ export default class GridChild {
521
531
  };
522
532
 
523
533
  /**
524
- * @param {import("../axisResolution.js").default} r
534
+ * @param {import("../../scales/axisResolution.js").default} r
525
535
  * @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
526
536
  * @param {import("../view.js").default} axisParent
527
537
  */
@@ -548,7 +558,7 @@ export default class GridChild {
548
558
  };
549
559
 
550
560
  /**
551
- * @param {import("../axisResolution.js").default} r
561
+ * @param {import("../../scales/axisResolution.js").default} r
552
562
  * @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
553
563
  * @param {import("../view.js").default} axisParent
554
564
  */
@@ -644,6 +654,22 @@ export default class GridChild {
644
654
  );
645
655
  }
646
656
 
657
+ /**
658
+ * Disposes axis and gridline views so axes can be recreated safely.
659
+ */
660
+ disposeAxisViews() {
661
+ for (const axisView of Object.values(this.axes)) {
662
+ axisView.disposeSubtree();
663
+ }
664
+
665
+ for (const gridView of Object.values(this.gridLines)) {
666
+ gridView.disposeSubtree();
667
+ }
668
+
669
+ this.axes = {};
670
+ this.gridLines = {};
671
+ }
672
+
647
673
  getOverhang() {
648
674
  const calculate = (
649
675
  /** @type {import("../../spec/axis.js").AxisOrient} */ orient
@@ -43,6 +43,37 @@ export default class GridView extends ContainerView {
43
43
  * @param {View} view
44
44
  */
45
45
  appendChild(view: import("../view.js").default): void;
46
+ /**
47
+ * Appends a child view without initializing dataflow or axes.
48
+ * Intended for ConcatView when building the initial hierarchy.
49
+ *
50
+ * @param {View} view
51
+ * @returns {GridChild}
52
+ */
53
+ appendChildView(view: import("../view.js").default): GridChild;
54
+ /**
55
+ * Inserts a child view without initializing dataflow or axes.
56
+ * Callers should create axes, initialize subtree data, and request layout.
57
+ *
58
+ * @param {View} view
59
+ * @param {number} index
60
+ * @returns {GridChild}
61
+ */
62
+ insertChildViewAt(view: import("../view.js").default, index: number): GridChild;
63
+ /**
64
+ * Removes a child by instance and disposes its subtree.
65
+ * Callers should sync shared axes and request layout.
66
+ *
67
+ * @param {View} view
68
+ */
69
+ removeChildView(view: import("../view.js").default): void;
70
+ /**
71
+ * Removes a child by index and disposes its subtree.
72
+ * Callers should sync shared axes and request layout.
73
+ *
74
+ * @param {number} index
75
+ */
76
+ removeChildAt(index: number): void;
46
77
  /**
47
78
  * @param {View[]} views
48
79
  */
@@ -55,10 +86,17 @@ export default class GridView extends ContainerView {
55
86
  /**
56
87
  * @protected
57
88
  */
58
- protected createAxes(): Promise<void[]>;
89
+ protected createAxes(): Promise<void>;
90
+ /**
91
+ * Recreates shared axes based on current axis resolutions.
92
+ *
93
+ * This is used after dynamic child insert/remove to keep shared axes in sync.
94
+ */
95
+ syncSharedAxes(): Promise<void>;
59
96
  #private;
60
97
  }
61
98
  import AxisView from "../axisView.js";
62
99
  import Rectangle from "../layout/rectangle.js";
63
100
  import ContainerView from "../containerView.js";
101
+ import GridChild from "./gridChild.js";
64
102
  //# sourceMappingURL=gridView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAkzBA;;GAEG;AACH,+EAUC;AAED;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AAr0BD;;;;;;;;;;;;;;;GAeG;AACH;IA6BI;;;;;;;;;OASG;IACH,kBARW,OAAO,oBAAoB,EAAE,aAAa,WAC1C,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,kDAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAoB1C;IARG,iDAAgB;IAOhB,uBAA0B;IAG9B;;OAEG;IACH,sDAIC;IAeD;;OAEG;IACH,mBAFW,8BAAM,QAUhB;IA+BD;;OAEG;IACH,+CAEC;IAED,yBAEC;IAED;;OAEG;IACH,wCAmCC;;CAwkBJ;qBA3wB0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB"}
1
+ {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AA42BA;;GAEG;AACH,+EAUC;AAED;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AA/3BD;;;;;;;;;;;;;;;GAeG;AACH;IAoCI;;;;;;;;;OASG;IACH,kBARW,OAAO,oBAAoB,EAAE,aAAa,WAC1C,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,kDAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAoB1C;IARG,iDAAgB;IAOhB,uBAA0B;IAG9B;;OAEG;IACH,sDAEC;IAED;;;;;;OAMG;IACH,qDAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,6DAHW,MAAM,GACJ,SAAS,CAQrB;IAED;;;;;OAKG;IACH,0DAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAShB;IAeD;;OAEG;IACH,mBAFW,8BAAM,QAUhB;IAYD;;OAEG;IACH,+CAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAwkBJ;qBAr0B0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAIzB,gBAAgB"}
@@ -34,6 +34,13 @@ import GridChild from "./gridChild.js";
34
34
  * - And later on, brushing, legend(?)
35
35
  */
36
36
  export default class GridView extends ContainerView {
37
+ /**
38
+ * Users guide:
39
+ * - GridView owns GridChild instances and manages decorations and shared axes.
40
+ * - Use ConcatView helpers for dynamic insertion/removal so dataflow and axes
41
+ * lifecycle stays consistent.
42
+ */
43
+
37
44
  /**
38
45
  * @typedef {"row" | "column"} Direction
39
46
  * @typedef {"horizontal" | "vertical"} ScrollDirection
@@ -96,9 +103,65 @@ export default class GridView extends ContainerView {
96
103
  * @param {View} view
97
104
  */
98
105
  appendChild(view) {
106
+ this.appendChildView(view);
107
+ }
108
+
109
+ /**
110
+ * Appends a child view without initializing dataflow or axes.
111
+ * Intended for ConcatView when building the initial hierarchy.
112
+ *
113
+ * @param {View} view
114
+ * @returns {GridChild}
115
+ */
116
+ appendChildView(view) {
117
+ return this.insertChildViewAt(view, this.#children.length);
118
+ }
119
+
120
+ /**
121
+ * Inserts a child view without initializing dataflow or axes.
122
+ * Callers should create axes, initialize subtree data, and request layout.
123
+ *
124
+ * @param {View} view
125
+ * @param {number} index
126
+ * @returns {GridChild}
127
+ */
128
+ insertChildViewAt(view, index) {
99
129
  view.layoutParent ??= this;
100
- this.#children.push(new GridChild(view, this, this.#childSerial));
130
+ const gridChild = new GridChild(view, this, this.#childSerial);
101
131
  this.#childSerial++;
132
+ this.#children.splice(index, 0, gridChild);
133
+ return gridChild;
134
+ }
135
+
136
+ /**
137
+ * Removes a child by instance and disposes its subtree.
138
+ * Callers should sync shared axes and request layout.
139
+ *
140
+ * @param {View} view
141
+ */
142
+ removeChildView(view) {
143
+ const index = this.#children.findIndex(
144
+ (gridChild) => gridChild.view === view
145
+ );
146
+ if (index < 0) {
147
+ throw new Error("Not my child view!");
148
+ }
149
+ this.removeChildAt(index);
150
+ }
151
+
152
+ /**
153
+ * Removes a child by index and disposes its subtree.
154
+ * Callers should sync shared axes and request layout.
155
+ *
156
+ * @param {number} index
157
+ */
158
+ removeChildAt(index) {
159
+ const gridChild = this.#children[index];
160
+ if (!gridChild) {
161
+ throw new Error("Child index out of range!");
162
+ }
163
+ this.#disposeGridChild(gridChild);
164
+ this.#children.splice(index, 1);
102
165
  }
103
166
 
104
167
  get #visibleChildren() {
@@ -127,30 +190,11 @@ export default class GridView extends ContainerView {
127
190
  }
128
191
  }
129
192
 
130
- /**
131
- * @param {View} child
132
- * @param {View} replacement
133
- */
134
- replaceChild(child, replacement) {
135
- const i = this.#children.findIndex(
136
- (gridChild) => gridChild.view == child
137
- );
138
- if (i >= 0) {
139
- this.#disposeGridChild(this.#children[i]);
140
- this.#children[i] = new GridChild(
141
- replacement,
142
- this,
143
- this.#childSerial
144
- );
145
- } else {
146
- throw new Error("Not my child view!");
147
- }
148
- }
149
-
150
193
  /**
151
194
  * @param {GridChild} gridChild
152
195
  */
153
196
  #disposeGridChild(gridChild) {
197
+ gridChild.disposeAxisViews();
154
198
  for (const view of gridChild.getChildren()) {
155
199
  view.disposeSubtree();
156
200
  }
@@ -171,40 +215,54 @@ export default class GridView extends ContainerView {
171
215
  * @protected
172
216
  */
173
217
  async createAxes() {
218
+ await this.syncSharedAxes();
219
+ await Promise.all(
220
+ this.#children.map((gridChild) => gridChild.createAxes())
221
+ );
222
+ }
223
+
224
+ /**
225
+ * Recreates shared axes based on current axis resolutions.
226
+ *
227
+ * This is used after dynamic child insert/remove to keep shared axes in sync.
228
+ */
229
+ async syncSharedAxes() {
230
+ for (const axisView of Object.values(this.#sharedAxes)) {
231
+ axisView.disposeSubtree();
232
+ }
233
+ this.#sharedAxes = {};
234
+
174
235
  /** @type {Promise<void>[]} */
175
236
  const promises = [];
176
237
 
177
- // Axis ticks, labels, etc. They should be created only if this view has caught
178
- // the scale resolution for the channel.
179
238
  for (const channel of primaryPositionalChannels) {
180
239
  const r = this.resolutions.axis[channel];
181
- if (r) {
182
- const props = r.getAxisProps();
183
- if (props) {
184
- const propsWithDefaults = {
185
- title: r.getTitle(),
186
- orient: CHANNEL_ORIENTS[channel][0],
187
- ...props,
188
- };
189
- // TODO: Validate that channel and orient are compatible
190
- const v = new AxisView(
191
- propsWithDefaults,
192
- r.scaleResolution.type,
193
- this.context,
194
- this,
195
- this
196
- );
197
- promises.push(v.initializeChildren());
198
- this.#sharedAxes[channel] = v;
199
- }
240
+ if (!r) {
241
+ continue;
200
242
  }
243
+
244
+ const props = r.getAxisProps();
245
+ if (!props) {
246
+ continue;
247
+ }
248
+
249
+ const propsWithDefaults = {
250
+ title: r.getTitle(),
251
+ orient: CHANNEL_ORIENTS[channel][0],
252
+ ...props,
253
+ };
254
+ const axisView = new AxisView(
255
+ propsWithDefaults,
256
+ r.scaleResolution.type,
257
+ this.context,
258
+ this,
259
+ this
260
+ );
261
+ promises.push(axisView.initializeChildren());
262
+ this.#sharedAxes[channel] = axisView;
201
263
  }
202
264
 
203
- // Create view decorations, grid lines, and independent axes for each child
204
- return Promise.all([
205
- ...promises,
206
- ...this.#children.map((gridChild) => gridChild.createAxes()),
207
- ]);
265
+ await Promise.all(promises);
208
266
  }
209
267
 
210
268
  /**
@@ -797,7 +855,7 @@ export default class GridView extends ContainerView {
797
855
  * @returns
798
856
  */
799
857
  function getZoomableResolutions(view) {
800
- /** @type {Record<import("../../spec/channel.js").PrimaryPositionalChannel, Set<import("../scaleResolution.js").default>>} */
858
+ /** @type {Record<import("../../spec/channel.js").PrimaryPositionalChannel, Set<import("../../scales/scaleResolution.js").default>>} */
801
859
  const resolutions = {
802
860
  x: new Set(),
803
861
  y: new Set(),
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gridView.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gridView.test.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.test.js"],"names":[],"mappings":""}
@@ -1,31 +1,62 @@
1
1
  /**
2
+ * This class represents a scrollbar thumb that can be used within a grid view
3
+ * to provide scrolling functionality for overflowing content.
4
+ *
2
5
  * @typedef {"horizontal" | "vertical"} ScrollDirection
3
6
  */
4
7
  export default class Scrollbar extends UnitView {
5
8
  /**
6
9
  * @param {import("./gridChild.js").default} gridChild
7
10
  * @param {ScrollDirection} scrollDirection
11
+ * @param {{ onViewportOffsetChange?: (offset: number) => void }} [options]
12
+ */
13
+ constructor(gridChild: import("./gridChild.js").default, scrollDirection: ScrollDirection, options?: {
14
+ onViewportOffsetChange?: (offset: number) => void;
15
+ });
16
+ /**
17
+ * The actual state of the scrollbar.
18
+ *
19
+ * It's better to keep track of the viewport offset rather than the
20
+ * scrollbar offset because the former is more stable when the
21
+ * viewport size changes.
8
22
  */
9
- constructor(gridChild: import("./gridChild.js").default, scrollDirection: ScrollDirection);
10
23
  viewportOffset: number;
11
24
  config: {
12
25
  scrollbarSize: number;
13
26
  scrollbarPadding: number;
14
- };
15
- interpolateViewportOffset: ((target: {
16
- x: number;
17
- }) => void) & {
18
- stop: () => void;
27
+ scrollbarMinLength: number;
19
28
  };
20
29
  get scrollOffset(): number;
21
30
  /**
31
+ * @param {number} value
32
+ * @param {{ notify?: boolean, syncSmoother?: boolean }} [options]
33
+ */
34
+ setViewportOffset(value: number, { notify, syncSmoother }?: {
35
+ notify?: boolean;
36
+ syncSmoother?: boolean;
37
+ }): void;
38
+ /**
39
+ * Updates the scrollbar with the latest viewport and content rectangles.
40
+ *
41
+ * Viewport coords are flattened to stay stable between layout passes, while
42
+ * content coords may be dynamic (e.g., peek transitions) and are evaluated
43
+ * on demand via accessors.
22
44
  *
23
45
  * @param {Rectangle} viewportCoords
24
- * @param {Rectangle} coords
46
+ * @param {Rectangle} contentCoords
25
47
  */
26
- updateScrollbar(viewportCoords: Rectangle, coords: Rectangle): void;
48
+ updateScrollbar(viewportCoords: Rectangle, contentCoords: Rectangle): void;
49
+ interpolateViewportOffset: ((target: {
50
+ x: number;
51
+ }) => void) & {
52
+ stop: () => void;
53
+ };
27
54
  #private;
28
55
  }
56
+ /**
57
+ * This class represents a scrollbar thumb that can be used within a grid view
58
+ * to provide scrolling functionality for overflowing content.
59
+ */
29
60
  export type ScrollDirection = "horizontal" | "vertical";
30
61
  import UnitView from "../unitView.js";
31
62
  import Rectangle from "../layout/rectangle.js";
@@ -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"}