@genome-spy/core 0.66.1 → 0.68.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 (191) hide show
  1. package/dist/bundle/index.es.js +7669 -6115
  2. package/dist/bundle/index.js +114 -133
  3. package/dist/schema.json +534 -132
  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 +10 -0
  10. package/dist/src/data/flowHandle.d.ts +2 -0
  11. package/dist/src/data/flowHandle.d.ts.map +1 -1
  12. package/dist/src/data/flowHandle.js +1 -0
  13. package/dist/src/data/flowInit.d.ts +12 -4
  14. package/dist/src/data/flowInit.d.ts.map +1 -1
  15. package/dist/src/data/flowInit.js +115 -17
  16. package/dist/src/data/flowNode.d.ts +8 -0
  17. package/dist/src/data/flowNode.d.ts.map +1 -1
  18. package/dist/src/data/flowNode.js +18 -0
  19. package/dist/src/data/keyIndex.d.ts +18 -0
  20. package/dist/src/data/keyIndex.d.ts.map +1 -0
  21. package/dist/src/data/keyIndex.js +241 -0
  22. package/dist/src/data/keyIndex.test.d.ts +2 -0
  23. package/dist/src/data/keyIndex.test.d.ts.map +1 -0
  24. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  25. package/dist/src/data/sources/dataSource.js +5 -1
  26. package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
  27. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  28. package/dist/src/data/sources/dataSourceFactory.js +52 -16
  29. package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
  30. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
  31. package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
  32. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
  33. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  34. package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
  35. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  36. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +15 -0
  37. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  38. package/dist/src/data/sources/lazy/tabixSource.js +15 -5
  39. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  40. package/dist/src/data/transforms/stack.js +1 -0
  41. package/dist/src/encoder/accessor.d.ts +43 -0
  42. package/dist/src/encoder/accessor.d.ts.map +1 -1
  43. package/dist/src/encoder/accessor.js +164 -0
  44. package/dist/src/encoder/encoder.d.ts +11 -2
  45. package/dist/src/encoder/encoder.d.ts.map +1 -1
  46. package/dist/src/encoder/encoder.js +24 -4
  47. package/dist/src/encoder/metadataChannels.d.ts +15 -0
  48. package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
  49. package/dist/src/encoder/metadataChannels.js +65 -0
  50. package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
  51. package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
  52. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  53. package/dist/src/genome/scaleLocus.js +14 -1
  54. package/dist/src/genomeSpy/containerUi.d.ts +0 -1
  55. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  56. package/dist/src/genomeSpy/containerUi.js +0 -14
  57. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
  58. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
  59. package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
  60. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
  61. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
  62. package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
  63. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  64. package/dist/src/genomeSpy/viewContextFactory.js +0 -1
  65. package/dist/src/genomeSpy/viewDataInit.d.ts +10 -0
  66. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  67. package/dist/src/genomeSpy/viewDataInit.js +166 -2
  68. package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
  69. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
  70. package/dist/src/genomeSpy.d.ts +1 -2
  71. package/dist/src/genomeSpy.d.ts.map +1 -1
  72. package/dist/src/genomeSpy.js +69 -27
  73. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  74. package/dist/src/gl/dataToVertices.js +16 -4
  75. package/dist/src/marks/mark.d.ts.map +1 -1
  76. package/dist/src/marks/mark.js +18 -11
  77. package/dist/src/marks/markUtils.js +1 -1
  78. package/dist/src/scale/scale.d.ts +6 -1
  79. package/dist/src/scale/scale.d.ts.map +1 -1
  80. package/dist/src/scale/scale.js +83 -23
  81. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  82. package/dist/src/scales/axisResolution.js +10 -0
  83. package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +8 -5
  84. package/dist/src/scales/domainPlanner.d.ts.map +1 -0
  85. package/dist/src/scales/domainPlanner.js +285 -0
  86. package/dist/src/scales/domainPlanner.test.d.ts +2 -0
  87. package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
  88. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  89. package/dist/src/scales/scaleInstanceManager.js +8 -4
  90. package/dist/src/scales/scaleInteractionController.d.ts +6 -0
  91. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  92. package/dist/src/scales/scaleInteractionController.js +41 -3
  93. package/dist/src/scales/scaleResolution.d.ts +19 -16
  94. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  95. package/dist/src/scales/scaleResolution.js +255 -70
  96. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
  97. package/dist/src/selection/selection.d.ts +21 -0
  98. package/dist/src/selection/selection.d.ts.map +1 -1
  99. package/dist/src/selection/selection.js +82 -0
  100. package/dist/src/spec/channel.d.ts +52 -15
  101. package/dist/src/spec/data.d.ts +4 -0
  102. package/dist/src/spec/parameter.d.ts +16 -11
  103. package/dist/src/spec/testing.d.ts +12 -0
  104. package/dist/src/spec/testing.d.ts.map +1 -0
  105. package/dist/src/spec/testing.js +20 -0
  106. package/dist/src/spec/view.d.ts +45 -10
  107. package/dist/src/styles/genome-spy.css +3 -31
  108. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  109. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  110. package/dist/src/styles/genome-spy.css.js +0 -29
  111. package/dist/src/types/encoder.d.ts +37 -2
  112. package/dist/src/types/rendering.d.ts +4 -3
  113. package/dist/src/types/viewContext.d.ts +0 -14
  114. package/dist/src/utils/domainArray.d.ts.map +1 -1
  115. package/dist/src/utils/domainArray.js +3 -0
  116. package/dist/src/utils/indexer.d.ts +3 -0
  117. package/dist/src/utils/indexer.d.ts.map +1 -1
  118. package/dist/src/utils/indexer.js +3 -0
  119. package/dist/src/utils/throttle.d.ts +4 -1
  120. package/dist/src/utils/throttle.d.ts.map +1 -1
  121. package/dist/src/utils/throttle.js +54 -23
  122. package/dist/src/utils/throttle.test.d.ts +2 -0
  123. package/dist/src/utils/throttle.test.d.ts.map +1 -0
  124. package/dist/src/utils/transition.d.ts +21 -0
  125. package/dist/src/utils/transition.d.ts.map +1 -1
  126. package/dist/src/utils/transition.js +28 -0
  127. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  128. package/dist/src/utils/ui/tooltip.js +7 -1
  129. package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
  130. package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
  131. package/dist/src/view/axisGridView.d.ts.map +1 -1
  132. package/dist/src/view/axisGridView.js +22 -5
  133. package/dist/src/view/axisView.d.ts.map +1 -1
  134. package/dist/src/view/axisView.js +20 -5
  135. package/dist/src/view/concatView.js +3 -3
  136. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  137. package/dist/src/view/containerMutationHelper.js +6 -2
  138. package/dist/src/view/containerView.d.ts +9 -5
  139. package/dist/src/view/containerView.d.ts.map +1 -1
  140. package/dist/src/view/containerView.js +34 -9
  141. package/dist/src/view/dataReadiness.d.ts +46 -0
  142. package/dist/src/view/dataReadiness.d.ts.map +1 -0
  143. package/dist/src/view/dataReadiness.js +267 -0
  144. package/dist/src/view/dataReadiness.test.d.ts +2 -0
  145. package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
  146. package/dist/src/view/facetView.d.ts.map +1 -1
  147. package/dist/src/view/facetView.js +7 -5
  148. package/dist/src/view/flowBuilder.d.ts +5 -3
  149. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  150. package/dist/src/view/flowBuilder.js +74 -7
  151. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  152. package/dist/src/view/gridView/gridChild.js +8 -0
  153. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  154. package/dist/src/view/gridView/gridView.js +119 -2
  155. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  156. package/dist/src/view/gridView/scrollbar.js +3 -0
  157. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  158. package/dist/src/view/gridView/selectionRect.js +20 -5
  159. package/dist/src/view/gridView/separatorView.d.ts +51 -0
  160. package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
  161. package/dist/src/view/gridView/separatorView.js +275 -0
  162. package/dist/src/view/layerView.js +3 -3
  163. package/dist/src/view/layout/flexLayout.d.ts +0 -30
  164. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  165. package/dist/src/view/layout/flexLayout.js +0 -86
  166. package/dist/src/view/paramMediator.d.ts +19 -0
  167. package/dist/src/view/paramMediator.d.ts.map +1 -1
  168. package/dist/src/view/paramMediator.js +86 -19
  169. package/dist/src/view/testUtils.d.ts.map +1 -1
  170. package/dist/src/view/testUtils.js +11 -1
  171. package/dist/src/view/unitView.d.ts +8 -13
  172. package/dist/src/view/unitView.d.ts.map +1 -1
  173. package/dist/src/view/unitView.js +127 -43
  174. package/dist/src/view/view.d.ts +34 -14
  175. package/dist/src/view/view.d.ts.map +1 -1
  176. package/dist/src/view/view.js +119 -9
  177. package/dist/src/view/viewFactory.d.ts.map +1 -1
  178. package/dist/src/view/viewFactory.js +20 -1
  179. package/dist/src/view/viewSelectors.d.ts +148 -0
  180. package/dist/src/view/viewSelectors.d.ts.map +1 -0
  181. package/dist/src/view/viewSelectors.js +773 -0
  182. package/dist/src/view/viewSelectors.test.d.ts +2 -0
  183. package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
  184. package/dist/src/view/viewUtils.d.ts +0 -8
  185. package/dist/src/view/viewUtils.d.ts.map +1 -1
  186. package/dist/src/view/viewUtils.js +1 -21
  187. package/package.json +3 -3
  188. package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
  189. package/dist/src/scales/scaleDomainAggregator.js +0 -162
  190. package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
  191. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
@@ -1,37 +1,68 @@
1
- /* eslint-disable consistent-this */
2
-
3
1
  /**
4
2
  * https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
5
3
  *
6
4
  * @param {function} func
7
5
  * @param {number} limit
6
+ * @returns {((...args: any[]) => void) & { cancel: () => void }}
8
7
  */
9
8
  export default function throttle(func, limit) {
10
- /** @type {number} */
11
- let lastFunc;
9
+ /** @type {ReturnType<typeof setTimeout> | null} */
10
+ let timeoutId = null;
11
+
12
+ /** @type {number | null} */
13
+ let lastRan = null;
14
+
15
+ /** @type {IArguments | null} */
16
+ let lastArgs = null;
12
17
 
13
- /** @type {number} */
14
- let lastRan;
18
+ /** @type {any} */
19
+ let lastContext = null;
15
20
 
16
- return function () {
21
+ const throttled = function () {
17
22
  // eslint-disable-next-line no-invalid-this
18
- const context = this;
23
+ lastContext = this;
19
24
  // eslint-disable-next-line prefer-rest-params
20
- const args = arguments;
21
- if (!lastRan) {
22
- func.apply(context, args);
23
- lastRan = Date.now();
24
- } else {
25
- clearTimeout(lastFunc);
26
- lastFunc = window.setTimeout(
27
- function () {
28
- if (Date.now() - lastRan >= limit) {
29
- func.apply(context, args);
30
- lastRan = Date.now();
31
- }
32
- },
33
- limit - (Date.now() - lastRan)
34
- );
25
+ lastArgs = arguments;
26
+
27
+ const now = Date.now();
28
+ if (lastRan === null) {
29
+ func.apply(lastContext, lastArgs);
30
+ lastRan = now;
31
+ return;
32
+ }
33
+
34
+ const remaining = limit - (now - lastRan);
35
+ if (remaining <= 0) {
36
+ if (timeoutId) {
37
+ clearTimeout(timeoutId);
38
+ timeoutId = null;
39
+ }
40
+ func.apply(lastContext, lastArgs);
41
+ lastRan = now;
42
+ return;
35
43
  }
44
+
45
+ if (timeoutId) {
46
+ clearTimeout(timeoutId);
47
+ }
48
+ timeoutId = setTimeout(() => {
49
+ timeoutId = null;
50
+ if (lastRan !== null && Date.now() - lastRan >= limit) {
51
+ func.apply(lastContext, lastArgs);
52
+ lastRan = Date.now();
53
+ }
54
+ }, remaining);
55
+ };
56
+
57
+ throttled.cancel = () => {
58
+ if (timeoutId) {
59
+ clearTimeout(timeoutId);
60
+ timeoutId = null;
61
+ }
62
+ lastArgs = null;
63
+ lastContext = null;
64
+ lastRan = null;
36
65
  };
66
+
67
+ return throttled;
37
68
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=throttle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.test.d.ts","sourceRoot":"","sources":["../../../src/utils/throttle.test.js"],"names":[],"mappings":""}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Lightweight cancellation token for transitions.
3
+ * Use this when you want a cheap, synchronous cancel path without errors.
4
+ *
5
+ * @returns {{ canceled: boolean }}
6
+ */
7
+ export function createCancelToken(): {
8
+ canceled: boolean;
9
+ };
1
10
  /**
2
11
  * @param {TransitionOptions} options
3
12
  *
@@ -11,6 +20,10 @@
11
20
  * @prop {function(function(number):void):void} [requestAnimationFrame]
12
21
  * default: window.requestAnimationFrame
13
22
  * @prop {AbortSignal} [signal]
23
+ * @prop {{ canceled: boolean }} [cancelToken]
24
+ * Prefer this for internal transitions where cancellation is expected and should be cheap.
25
+ * The transition resolves immediately when canceled and does not throw or reject.
26
+ * Use AbortSignal when you need external orchestration or standardized cancellation.
14
27
  */
15
28
  export default function transition(options: TransitionOptions): Promise<any>;
16
29
  export type TransitionOptions = {
@@ -40,5 +53,13 @@ export type TransitionOptions = {
40
53
  */
41
54
  requestAnimationFrame?: (arg0: (arg0: number) => void) => void;
42
55
  signal?: AbortSignal;
56
+ /**
57
+ * Prefer this for internal transitions where cancellation is expected and should be cheap.
58
+ * The transition resolves immediately when canceled and does not throw or reject.
59
+ * Use AbortSignal when you need external orchestration or standardized cancellation.
60
+ */
61
+ cancelToken?: {
62
+ canceled: boolean;
63
+ };
43
64
  };
44
65
  //# sourceMappingURL=transition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/utils/transition.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,4CAbW,iBAAiB,gBAqE3B;;;;;WAlES,MAAM;;;;SACN,MAAM;;;;eACN,MAAM;;;;YACN,MAAM;cACN,CAAS,IAAM,EAAN,MAAM,KAAE,IAAI;;;;qBACrB,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM;;;;4BACvB,CAAS,IAAqB,EAArB,CAAS,IAAM,EAAN,MAAM,KAAE,IAAI,KAAE,IAAI;aAEpC,WAAW"}
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/utils/transition.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,qCAFa;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAIjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,4CAjBW,iBAAiB,gBAuF3B;;;;;WApFS,MAAM;;;;SACN,MAAM;;;;eACN,MAAM;;;;YACN,MAAM;cACN,CAAS,IAAM,EAAN,MAAM,KAAE,IAAI;;;;qBACrB,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM;;;;4BACvB,CAAS,IAAqB,EAArB,CAAS,IAAM,EAAN,MAAM,KAAE,IAAI,KAAE,IAAI;aAEpC,WAAW;;;;;;kBACX;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE"}
@@ -1,6 +1,16 @@
1
1
  /** @param {number} ms */
2
2
  const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
3
3
 
4
+ /**
5
+ * Lightweight cancellation token for transitions.
6
+ * Use this when you want a cheap, synchronous cancel path without errors.
7
+ *
8
+ * @returns {{ canceled: boolean }}
9
+ */
10
+ export function createCancelToken() {
11
+ return { canceled: false };
12
+ }
13
+
4
14
  /**
5
15
  * @param {TransitionOptions} options
6
16
  *
@@ -14,15 +24,24 @@ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
14
24
  * @prop {function(function(number):void):void} [requestAnimationFrame]
15
25
  * default: window.requestAnimationFrame
16
26
  * @prop {AbortSignal} [signal]
27
+ * @prop {{ canceled: boolean }} [cancelToken]
28
+ * Prefer this for internal transitions where cancellation is expected and should be cheap.
29
+ * The transition resolves immediately when canceled and does not throw or reject.
30
+ * Use AbortSignal when you need external orchestration or standardized cancellation.
17
31
  */
18
32
  export default function transition(options) {
19
33
  const requestAnimationFrame =
20
34
  options.requestAnimationFrame || window.requestAnimationFrame;
21
35
 
22
36
  const signal = options.signal;
37
+ const cancelToken = options.cancelToken;
23
38
 
24
39
  const makePromise = () =>
25
40
  new Promise((resolve, reject) => {
41
+ if (cancelToken?.canceled) {
42
+ return resolve();
43
+ }
44
+
26
45
  if (signal?.aborted) {
27
46
  return reject("aborted");
28
47
  }
@@ -46,6 +65,11 @@ export default function transition(options) {
46
65
 
47
66
  /** @param {number} stamp */
48
67
  const step = (stamp) => {
68
+ if (cancelToken?.canceled) {
69
+ resolve();
70
+ return;
71
+ }
72
+
49
73
  if (signal?.aborted) {
50
74
  reject("aborted");
51
75
  } else {
@@ -63,6 +87,10 @@ export default function transition(options) {
63
87
  });
64
88
 
65
89
  if (options.delay) {
90
+ if (cancelToken?.canceled) {
91
+ return Promise.resolve();
92
+ }
93
+
66
94
  if (signal?.aborted) {
67
95
  return Promise.reject("aborted");
68
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../src/utils/ui/tooltip.js"],"names":[],"mappings":"AAIA,0CAA2C,qBAAqB,CAAC;AAEjE;IAsBI;;OAEG;IACH,uBAFW,WAAW,EAUrB;IAED;;OAEG;IACH,mBAFW,OAAO,EAQjB;IAED,cAVW,OAAO,CAYjB;IAED;;OAEG;IACH,qBAFW,OAAO,EAOjB;IAED,eATW,OAAO,CAWjB;IAED,uBAEC;IAED;;OAEG;IACH,0BAFW,OAAO,QAOjB;IAED,wBAEC;IAED;;OAEG;IACH,4BAFW,UAAU,QAsCpB;IA/BG,8BAA2D;IAiC/D,wBAiBC;IAED;;OAEG;IACH,oBAFW,MAAM,GAAG,OAAO,KAAK,EAAE,cAAc,GAAG,WAAW,QAqB7D;IAED,cAGC;IAED;;;;;;;OAOG;IACH,gBAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAmBlF;IAED,sBAEC;;CACJ"}
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../src/utils/ui/tooltip.js"],"names":[],"mappings":"AAIA,0CAA2C,qBAAqB,CAAC;AAEjE;IAsBI;;OAEG;IACH,uBAFW,WAAW,EAUrB;IAED;;OAEG;IACH,mBAFW,OAAO,EAQjB;IAED,cAVW,OAAO,CAYjB;IAED;;OAEG;IACH,qBAFW,OAAO,EAOjB;IAED,eATW,OAAO,CAWjB;IAED,uBAEC;IAED;;OAEG;IACH,0BAFW,OAAO,QAOjB;IAED,wBAEC;IAED;;OAEG;IACH,4BAFW,UAAU,QAsCpB;IA/BG,8BAA2D;IAiC/D,wBAiBC;IAED;;OAEG;IACH,oBAFW,MAAM,GAAG,OAAO,KAAK,EAAE,cAAc,GAAG,WAAW,QAqB7D;IAED,cAGC;IAED;;;;;;;OAOG;IACH,gBAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAyBlF;IAED,sBAEC;;CACJ"}
@@ -191,8 +191,14 @@ export default class Tooltip {
191
191
  Promise.resolve(html` ${JSON.stringify(d)} `);
192
192
  }
193
193
 
194
+ const requestedDatum = datum;
194
195
  converter(datum)
195
- .then((result) => this.setContent(result))
196
+ .then((result) => {
197
+ if (this.#previousTooltipDatum !== requestedDatum) {
198
+ return;
199
+ }
200
+ this.setContent(result);
201
+ })
196
202
  .catch((error) => {
197
203
  if (error !== "debounced") {
198
204
  throw error;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tooltip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/ui/tooltip.test.js"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"axisGridView.d.ts","sourceRoot":"","sources":["../../../src/view/axisGridView.js"],"names":[],"mappings":"AAGA;;;GAGG;AAEH;;;;;;GAMG;AACH;IACI;;;;;;;OAOG;IACH,uBAPW,IAAI,QAEJ,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EA4BzC;IADG,iFAA8B;IAGlC,kDAEC;CAKJ;gCAvDY,OAAO,oBAAoB,EAAE,wBAAwB;iCACrD,OAAO,iBAAiB,EAAE,kBAAkB;;;;mBAM5C,OAAO,WAAW,EAAE,OAAO;;;;mBAC3B,OAAO,iBAAiB,EAAE,IAAI;;;;yBAC9B,OAAO,iBAAiB,EAAE,UAAU;sBAb3B,gBAAgB"}
1
+ {"version":3,"file":"axisGridView.d.ts","sourceRoot":"","sources":["../../../src/view/axisGridView.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;GAMG;AACH;IACI;;;;;;;OAOG;IACH,uBAPW,IAAI,QAEJ,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EA6BzC;IAHG,iFAA8B;IAKlC,kDAEC;CAKJ;gCAxDY,OAAO,oBAAoB,EAAE,wBAAwB;iCACrD,OAAO,iBAAiB,EAAE,kBAAkB;;;;mBAM5C,OAAO,WAAW,EAAE,OAAO;;;;mBAC3B,OAAO,iBAAiB,EAAE,IAAI;;;;yBAC9B,OAAO,iBAAiB,EAAE,UAAU;sBAd3B,gBAAgB"}
@@ -1,5 +1,6 @@
1
1
  import LayerView from "./layerView.js";
2
2
  import { orient2channel } from "./axisView.js";
3
+ import { markViewAsNonAddressable } from "./viewSelectors.js";
3
4
 
4
5
  /**
5
6
  * @typedef {import("../spec/channel.js").PrimaryPositionalChannel} PositionalChannel
@@ -42,12 +43,13 @@ export default class AxisGridView extends LayerView {
42
43
  `axisGrid_${axisProps.orient}`,
43
44
  {
44
45
  blockEncodingInheritance: true,
45
- contributesToScaleDomain: false,
46
46
  ...options,
47
47
  }
48
48
  );
49
49
 
50
50
  this.axisProps = fullAxisProps;
51
+
52
+ markViewAsNonAddressable(this, { skipSubtree: true });
51
53
  }
52
54
 
53
55
  getOrient() {
@@ -121,7 +123,10 @@ function createRegularAxisGrid(axisProps, type) {
121
123
  minBufferSize: 300,
122
124
  },
123
125
  encoding: {
124
- [channel]: { field: "value", type },
126
+ [channel]: {
127
+ field: "value",
128
+ type,
129
+ },
125
130
  },
126
131
  };
127
132
  }
@@ -153,7 +158,11 @@ function createChromAxisGrid(axisProps, type) {
153
158
  },
154
159
  encoding: {
155
160
  // TODO: { chrom: "name", type: "locus" } // without pos = pos is 0
156
- [channel]: { field: "continuousStart", type, band: 0 },
161
+ [channel]: {
162
+ field: "continuousStart",
163
+ type,
164
+ band: 0,
165
+ },
157
166
  },
158
167
  };
159
168
  }
@@ -180,8 +189,15 @@ function createChromAxisFill(axisProps, type) {
180
189
  },
181
190
  encoding: {
182
191
  // TODO: { chrom: "name", type: "locus" } // without pos = pos is 0
183
- [channel]: { field: "continuousStart", type, band: 0 },
184
- [channel + "2"]: { field: "continuousEnd", band: 0 },
192
+ [channel]: {
193
+ field: "continuousStart",
194
+ type,
195
+ band: 0,
196
+ },
197
+ [channel + "2"]: {
198
+ field: "continuousEnd",
199
+ band: 0,
200
+ },
185
201
  fill: {
186
202
  field: "odd",
187
203
  type: "nominal",
@@ -245,6 +261,7 @@ function createAxisGrid(axisProps, type) {
245
261
  opacity: "independent",
246
262
  },
247
263
  },
264
+ domainInert: true,
248
265
  layer: layers,
249
266
  };
250
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"axisView.d.ts","sourceRoot":"","sources":["../../../src/view/axisView.js"],"names":[],"mappings":"AAoCA;;GAEG;AACH,kIAEC;AAkYD;;;;GAIG;AACH,wFAHW,MAAM,uCA2MhB;AArmBD;;GAEG;AACH,8BAFU,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,sCAAY,CAAC,CAKnF;AAEF;;GAEG;AACH,8BAFU,MAAM,uCAAa,OAAO,oBAAoB,EAAE,wBAAwB,CAAC,CAMjF;AASF;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;OAOG;IACH,6DALW,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAiCzC;IADG,iFAA8B;IAiBlC,+BAEC;CAKJ;sBA5HqB,gBAAgB"}
1
+ {"version":3,"file":"axisView.d.ts","sourceRoot":"","sources":["../../../src/view/axisView.js"],"names":[],"mappings":"AAqCA;;GAEG;AACH,kIAEC;AAyYD;;;;GAIG;AACH,wFAHW,MAAM,uCAkNhB;AAnnBD;;GAEG;AACH,8BAFU,MAAM,CAAC,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,sCAAY,CAAC,CAKnF;AAEF;;GAEG;AACH,8BAFU,MAAM,uCAAa,OAAO,oBAAoB,EAAE,wBAAwB,CAAC,CAMjF;AASF;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;OAOG;IACH,6DALW,MAAM,WADN,OAAO,yBAAyB,EAAE,OAAO,gBAEzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,YAC3B,OAAO,WAAW,EAAE,WAAW,EAkCzC;IAHG,iFAA8B;IAmBlC,+BAEC;CAKJ;sBA9HqB,gBAAgB"}
@@ -1,5 +1,6 @@
1
1
  import LayerView from "./layerView.js";
2
2
  import { FlexDimensions } from "./layout/flexLayout.js";
3
+ import { markViewAsNonAddressable } from "./viewSelectors.js";
3
4
 
4
5
  const CHROM_LAYER_NAME = "chromosome_ticks_and_labels";
5
6
 
@@ -93,12 +94,13 @@ export default class AxisView extends LayerView {
93
94
  `axis_${axisProps.orient}`,
94
95
  {
95
96
  blockEncodingInheritance: true,
96
- contributesToScaleDomain: false,
97
97
  ...options,
98
98
  }
99
99
  );
100
100
 
101
101
  this.axisProps = fullAxisProps;
102
+
103
+ markViewAsNonAddressable(this, { skipSubtree: true });
102
104
  }
103
105
 
104
106
  getSize() {
@@ -266,6 +268,11 @@ function createAxis(axisProps, type) {
266
268
 
267
269
  const anchor = ap.orient == "bottom" || ap.orient == "left" ? 1 : 0;
268
270
 
271
+ const makeMainDomainDef = () => ({
272
+ field: "value",
273
+ type,
274
+ });
275
+
269
276
  /**
270
277
  * @return {import("../spec/view.js").UnitSpec}
271
278
  */
@@ -302,7 +309,7 @@ function createAxis(axisProps, type) {
302
309
  minBufferSize: 1500, // to prevent GPU buffer reallocation when zooming
303
310
  },
304
311
  encoding: {
305
- [main]: { field: "value", type },
312
+ [main]: makeMainDomainDef(),
306
313
  text: { field: "label" },
307
314
  },
308
315
  });
@@ -358,7 +365,7 @@ function createAxis(axisProps, type) {
358
365
  const spec = {
359
366
  name: "ticks_and_labels",
360
367
  encoding: {
361
- [main]: { field: "value", type },
368
+ [main]: makeMainDomainDef(),
362
369
  },
363
370
  layer: [],
364
371
  };
@@ -378,6 +385,7 @@ function createAxis(axisProps, type) {
378
385
  const axisSpec = {
379
386
  // Force the resolution towards the parent view even if it has "independent" behavior
380
387
  resolve: { scale: { [main]: "forced" } },
388
+ domainInert: true,
381
389
  [CHANNEL_DIMENSIONS[getPerpendicularChannel(main)]]: ap.extent,
382
390
  data: {
383
391
  lazy: {
@@ -527,7 +535,10 @@ export function createGenomeAxis(axisProps, type) {
527
535
  ...chromLabelMarkProps,
528
536
  },
529
537
  encoding: {
530
- [main + "2"]: { field: "continuousEnd", type },
538
+ [main + "2"]: {
539
+ field: "continuousEnd",
540
+ type,
541
+ },
531
542
  text: { field: "name" },
532
543
  },
533
544
  };
@@ -582,7 +593,11 @@ export function createGenomeAxis(axisProps, type) {
582
593
  },
583
594
  encoding: {
584
595
  // TODO: { chrom: "name", type: "locus" } // without pos = pos is 0
585
- [main]: { field: "continuousStart", type, band: 0 },
596
+ [main]: {
597
+ field: "continuousStart",
598
+ type,
599
+ band: 0,
600
+ },
586
601
  },
587
602
  layer: [],
588
603
  };
@@ -44,12 +44,12 @@ export default class ConcatView extends GridView {
44
44
 
45
45
  this.setChildren(
46
46
  await Promise.all(
47
- childSpecs.map((childSpec, i) =>
47
+ childSpecs.map((childSpec) =>
48
48
  this.context.createOrImportView(
49
49
  childSpec,
50
50
  this,
51
51
  this,
52
- "grid" + i
52
+ this.getNextAutoName("grid")
53
53
  )
54
54
  )
55
55
  )
@@ -151,7 +151,7 @@ export default class ConcatView extends GridView {
151
151
  afterRemove: async () => {
152
152
  await this.syncSharedAxes();
153
153
  },
154
- defaultName: (_index) => "grid" + this.childCount,
154
+ defaultName: () => this.getNextAutoName("grid"),
155
155
  });
156
156
  }
157
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"containerMutationHelper.d.ts","sourceRoot":"","sources":["../../../src/view/containerMutationHelper.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;;;;OAUG;IAEH;;;OAGG;IACH,uBAHW,OAAO,oBAAoB,EAAE,OAAO;uBAX3B;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;OAW3B;IAFG,gDAA0B;IAC1B;uBAhBgB;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;MAUF;IAG1B;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UACzE,MAAM,GACJ,OAAO,6BAAM,CA0CzB;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAehB;CACJ"}
1
+ {"version":3,"file":"containerMutationHelper.d.ts","sourceRoot":"","sources":["../../../src/view/containerMutationHelper.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH;IACI;;;;;;;;;;OAUG;IAEH;;;;;;;;;;OAUG;IAEH;;;OAGG;IACH,uBAHW,OAAO,oBAAoB,EAAE,OAAO;uBAX3B;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;OAW3B;IAFG,gDAA0B;IAC1B;uBAhBgB;mBARR,CAAC,yEAAqB,CAAC,EAAE;sBACtB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,IAAI;sBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;SAMF;oBACnB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG;oBAClC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;sBACrB,CAAC,IAAI,6BAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC;sBAClE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;sBAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAqB,KAAK,MAAM;wBACpD,OAAO;MAUF;IAG1B;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UACzE,MAAM,GACJ,OAAO,6BAAM,CA8CzB;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAehB;CACJ"}
@@ -55,7 +55,7 @@ export default class ContainerMutationHelper {
55
55
  const insertIndex = index ?? specs.length;
56
56
  const name =
57
57
  this.options.defaultName?.(insertIndex, childSpec) ??
58
- "child" + specs.length;
58
+ this.container.getNextAutoName("child");
59
59
 
60
60
  const childView = await this.container.context.createOrImportView(
61
61
  childSpec,
@@ -77,9 +77,13 @@ export default class ContainerMutationHelper {
77
77
 
78
78
  configureViewOpacity(childView);
79
79
 
80
+ const visibilityPredicate = (
81
+ /** @type {import("./view.js").default} */ view
82
+ ) => view.isConfiguredVisible();
80
83
  const { dataSources, graphicsPromises } = initializeViewSubtree(
81
84
  childView,
82
- this.container.context.dataFlow
85
+ this.container.context.dataFlow,
86
+ visibilityPredicate
83
87
  );
84
88
  await loadViewSubtreeData(childView, dataSources);
85
89
  await finalizeSubtreeGraphics(graphicsPromises);
@@ -14,16 +14,19 @@ export default class ContainerView extends View {
14
14
  constructor(spec: import("../spec/view.js").ContainerSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
15
15
  spec: import("../spec/view.js").ContainerSpec;
16
16
  initializeChildren(): Promise<void>;
17
+ /**
18
+ * Generates an auto name that is guaranteed to be unique within this container
19
+ * for the given prefix. Intended for debugging-only default names.
20
+ *
21
+ * @param {string} prefix
22
+ * @returns {string}
23
+ */
24
+ getNextAutoName(prefix: string): string;
17
25
  /**
18
26
  * @param {string[]} path An array of view names
19
27
  * @returns {View}
20
28
  */
21
29
  findDescendantByPath(path: string[]): View;
22
- /**
23
- *
24
- * @param {string} name
25
- */
26
- findChildByName(name: string): View;
27
30
  /**
28
31
  *
29
32
  * @param {string} name
@@ -33,6 +36,7 @@ export default class ContainerView extends View {
33
36
  * @returns {IterableIterator<View>}
34
37
  */
35
38
  [Symbol.iterator](): IterableIterator<View>;
39
+ #private;
36
40
  }
37
41
  import View from "./view.js";
38
42
  //# sourceMappingURL=containerView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"containerView.d.ts","sourceRoot":"","sources":["../../../src/view/containerView.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IACI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAMzC;IADG,8CAAgB;IAGpB,oCAEC;IAsDD;;;OAGG;IACH,2BAHW,MAAM,EAAE,GACN,IAAI,CAYhB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,2BAFW,MAAM,QAchB;IAhGD;;OAEG;IACH,qBAFa,gBAAgB,CAAC,IAAI,CAAC,CAIlC;CAqGJ;iBAnI4C,WAAW"}
1
+ {"version":3,"file":"containerView.d.ts","sourceRoot":"","sources":["../../../src/view/containerView.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IAII;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAMzC;IADG,8CAAgB;IAGpB,oCAEC;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAMlB;IAsDD;;;OAGG;IACH,2BAHW,MAAM,EAAE,GACN,IAAI,CAsBhB;IAaD;;;OAGG;IACH,2BAFW,MAAM,QAchB;IAzGD;;OAEG;IACH,qBAFa,gBAAgB,CAAC,IAAI,CAAC,CAIlC;;CA8GJ;iBA5J4C,WAAW"}
@@ -4,6 +4,9 @@ import View, { VISIT_STOP, VISIT_SKIP } from "./view.js";
4
4
  * Compositor view represents a non-leaf node in the view hierarchy.
5
5
  */
6
6
  export default class ContainerView extends View {
7
+ /** @type {Map<string, number>} */
8
+ #autoNameCounters = new Map();
9
+
7
10
  /**
8
11
  *
9
12
  * @param {import("../spec/view.js").ContainerSpec} spec
@@ -23,6 +26,19 @@ export default class ContainerView extends View {
23
26
  // override
24
27
  }
25
28
 
29
+ /**
30
+ * Generates an auto name that is guaranteed to be unique within this container
31
+ * for the given prefix. Intended for debugging-only default names.
32
+ *
33
+ * @param {string} prefix
34
+ * @returns {string}
35
+ */
36
+ getNextAutoName(prefix) {
37
+ const counter = this.#autoNameCounters.get(prefix) ?? 0;
38
+ this.#autoNameCounters.set(prefix, counter + 1);
39
+ return prefix + counter;
40
+ }
41
+
26
42
  /**
27
43
  * @returns {IterableIterator<View>}
28
44
  */
@@ -80,22 +96,31 @@ export default class ContainerView extends View {
80
96
  * @returns {View}
81
97
  */
82
98
  findDescendantByPath(path) {
83
- for (const child of this) {
84
- if (child.name === path[0]) {
85
- if (path.length == 1) {
86
- return child;
87
- } else if (child instanceof ContainerView) {
88
- return child.findDescendantByPath(path.slice(1));
89
- }
99
+ /** @type {View | ContainerView} */
100
+ let current = this;
101
+
102
+ for (let i = 0; i < path.length; i++) {
103
+ if (!(current instanceof ContainerView)) {
104
+ return;
105
+ }
106
+
107
+ const next = current.#findImmediateChildByName(path[i]);
108
+ if (!next) {
109
+ return;
90
110
  }
111
+
112
+ if (i === path.length - 1) {
113
+ return next;
114
+ }
115
+
116
+ current = next;
91
117
  }
92
118
  }
93
119
 
94
120
  /**
95
- *
96
121
  * @param {string} name
97
122
  */
98
- findChildByName(name) {
123
+ #findImmediateChildByName(name) {
99
124
  for (const child of this) {
100
125
  if (child.name === name) {
101
126
  return child;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @typedef {import("../view/view.js").default} View
3
+ * @typedef {import("../data/sources/lazy/singleAxisLazySource.js").DataReadinessRequest} DataReadinessRequest
4
+ */
5
+ /**
6
+ * Builds a readiness request for the provided channels.
7
+ *
8
+ * @param {View} view
9
+ * @param {import("../spec/channel.js").PrimaryPositionalChannel[]} channels
10
+ * @returns {DataReadinessRequest | undefined}
11
+ */
12
+ export function buildReadinessRequest(view: View, channels: import("../spec/channel.js").PrimaryPositionalChannel[]): DataReadinessRequest | undefined;
13
+ /**
14
+ * Checks whether all data sources under the subtree report readiness.
15
+ *
16
+ * @param {View} subtreeRoot
17
+ * @param {DataReadinessRequest} readinessRequest
18
+ * @param {(view: View) => boolean} [viewFilter]
19
+ * @returns {boolean}
20
+ */
21
+ export function isSubtreeReady(subtreeRoot: View, readinessRequest: DataReadinessRequest, viewFilter?: (view: View) => boolean): boolean;
22
+ /**
23
+ * Checks readiness for lazy data sources under the subtree. Non-lazy sources
24
+ * are ignored so they do not block readiness checks.
25
+ *
26
+ * @param {View} subtreeRoot
27
+ * @param {DataReadinessRequest | undefined} readinessRequest
28
+ * @param {(view: View) => boolean} [viewFilter]
29
+ * @returns {boolean}
30
+ */
31
+ export function isSubtreeLazyReady(subtreeRoot: View, readinessRequest: DataReadinessRequest | undefined, viewFilter?: (view: View) => boolean): boolean;
32
+ /**
33
+ * Waits until lazy data sources under the subtree satisfy the readiness request.
34
+ * Non-lazy sources are ignored so they do not block readiness checks.
35
+ *
36
+ * @param {import("../types/viewContext.js").default} context
37
+ * @param {View} subtreeRoot
38
+ * @param {DataReadinessRequest} readinessRequest
39
+ * @param {AbortSignal} [signal]
40
+ * @param {(view: View) => boolean} [viewFilter]
41
+ * @returns {Promise<void>}
42
+ */
43
+ export function awaitSubtreeLazyReady(context: import("../types/viewContext.js").default, subtreeRoot: View, readinessRequest: DataReadinessRequest, signal?: AbortSignal, viewFilter?: (view: View) => boolean): Promise<void>;
44
+ export type View = import("../view/view.js").default;
45
+ export type DataReadinessRequest = import("../data/sources/lazy/singleAxisLazySource.js").DataReadinessRequest;
46
+ //# sourceMappingURL=dataReadiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataReadiness.d.ts","sourceRoot":"","sources":["../../../src/view/dataReadiness.js"],"names":[],"mappings":"AAGA;;;GAGG;AAEH;;;;;;GAMG;AACH,4CAJW,IAAI,YACJ,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,GACrD,oBAAoB,GAAG,SAAS,CAe5C;AAED;;;;;;;GAOG;AACH,4CALW,IAAI,oBACJ,oBAAoB,eACpB,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GACrB,OAAO,CAiDnB;AAED;;;;;;;;GAQG;AACH,gDALW,IAAI,oBACJ,oBAAoB,GAAG,SAAS,eAChC,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GACrB,OAAO,CAwDnB;AAED;;;;;;;;;;GAUG;AACH,+CAPW,OAAO,yBAAyB,EAAE,OAAO,eACzC,IAAI,oBACJ,oBAAoB,WACpB,WAAW,eACX,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAyGzB;mBAtQY,OAAO,iBAAiB,EAAE,OAAO;mCACjC,OAAO,8CAA8C,EAAE,oBAAoB"}