@genome-spy/core 0.65.0 → 0.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/bundle/browser-BRemItdO.js +138 -0
  2. package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
  3. package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
  4. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  5. package/dist/bundle/index-D28m8tSW.js +1607 -0
  6. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  7. package/dist/bundle/index.es.js +15821 -14601
  8. package/dist/bundle/index.js +214 -212
  9. package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
  10. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  11. package/dist/schema.json +13 -3
  12. package/dist/src/config/scaleDefaults.d.ts +8 -0
  13. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  14. package/dist/src/config/scaleDefaults.js +45 -0
  15. package/dist/src/data/flowHandle.d.ts +2 -0
  16. package/dist/src/data/flowHandle.d.ts.map +1 -1
  17. package/dist/src/data/flowHandle.js +1 -0
  18. package/dist/src/data/flowInit.d.ts +12 -4
  19. package/dist/src/data/flowInit.d.ts.map +1 -1
  20. package/dist/src/data/flowInit.js +115 -16
  21. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  22. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  23. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  25. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  27. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  28. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  29. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  30. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  31. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  32. package/dist/src/encoder/encoder.d.ts +1 -1
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/encoder/encoder.js +1 -1
  35. package/dist/src/genome/scaleLocus.d.ts +39 -0
  36. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  37. package/dist/src/genome/scaleLocus.js +76 -0
  38. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  39. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  40. package/dist/src/genomeSpy/canvasExport.js +66 -0
  41. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  42. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  43. package/dist/src/genomeSpy/containerUi.js +78 -0
  44. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  45. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  46. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  47. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  48. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  49. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  50. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  51. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  52. package/dist/src/genomeSpy/interactionController.js +371 -0
  53. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  54. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  55. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  56. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  57. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  58. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  59. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  60. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  61. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  62. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  63. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  64. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  65. package/dist/src/genomeSpy/viewDataInit.d.ts +22 -0
  66. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  67. package/dist/src/genomeSpy/viewDataInit.js +160 -0
  68. package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
  69. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
  70. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  71. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  73. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  74. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  76. package/dist/src/genomeSpy.d.ts +17 -71
  77. package/dist/src/genomeSpy.d.ts.map +1 -1
  78. package/dist/src/genomeSpy.js +197 -741
  79. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  80. package/dist/src/gl/dataToVertices.js +16 -4
  81. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  82. package/dist/src/gl/webGLHelper.d.ts +2 -2
  83. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  84. package/dist/src/gl/webGLHelper.js +4 -4
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +2 -12
  87. package/dist/src/marks/mark.d.ts.map +1 -1
  88. package/dist/src/marks/mark.js +4 -2
  89. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  90. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  91. package/dist/src/{view → scales}/axisResolution.js +29 -18
  92. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  93. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  94. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  95. package/dist/src/scales/scaleDomainAggregator.js +167 -0
  96. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  97. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  98. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  99. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  100. package/dist/src/scales/scaleInstanceManager.js +317 -0
  101. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  102. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  103. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  104. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  105. package/dist/src/scales/scaleInteractionController.js +336 -0
  106. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  107. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  108. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  109. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  110. package/dist/src/scales/scalePropsResolver.js +74 -0
  111. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -35
  112. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  113. package/dist/src/scales/scaleResolution.js +732 -0
  114. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  115. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  116. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  117. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  118. package/dist/src/scales/scaleRules.d.ts +16 -0
  119. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  120. package/dist/src/scales/scaleRules.js +103 -0
  121. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  122. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  123. package/dist/src/spec/channel.d.ts +13 -18
  124. package/dist/src/spec/scale.d.ts +6 -0
  125. package/dist/src/types/embedApi.d.ts +5 -0
  126. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  127. package/dist/src/utils/domainArray.d.ts.map +1 -1
  128. package/dist/src/utils/domainArray.js +3 -0
  129. package/dist/src/utils/indexer.d.ts +3 -0
  130. package/dist/src/utils/indexer.d.ts.map +1 -1
  131. package/dist/src/utils/indexer.js +3 -0
  132. package/dist/src/view/concatView.d.ts +18 -0
  133. package/dist/src/view/concatView.d.ts.map +1 -1
  134. package/dist/src/view/concatView.js +73 -0
  135. package/dist/src/view/concatView.test.d.ts +2 -0
  136. package/dist/src/view/concatView.test.d.ts.map +1 -0
  137. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  138. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  139. package/dist/src/view/containerMutationHelper.js +118 -0
  140. package/dist/src/view/containerView.d.ts +0 -7
  141. package/dist/src/view/containerView.d.ts.map +1 -1
  142. package/dist/src/view/containerView.js +0 -10
  143. package/dist/src/view/facetView.d.ts.map +1 -1
  144. package/dist/src/view/facetView.js +0 -15
  145. package/dist/src/view/flowBuilder.d.ts +5 -3
  146. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  147. package/dist/src/view/flowBuilder.js +69 -6
  148. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  149. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  150. package/dist/src/view/gridView/gridChild.js +32 -6
  151. package/dist/src/view/gridView/gridView.d.ts +39 -1
  152. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  153. package/dist/src/view/gridView/gridView.js +106 -48
  154. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  155. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  156. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  157. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  158. package/dist/src/view/gridView/scrollbar.js +184 -69
  159. package/dist/src/view/layerView.d.ts +14 -0
  160. package/dist/src/view/layerView.d.ts.map +1 -1
  161. package/dist/src/view/layerView.js +66 -0
  162. package/dist/src/view/layerView.test.d.ts +2 -0
  163. package/dist/src/view/layerView.test.d.ts.map +1 -0
  164. package/dist/src/view/testUtils.d.ts.map +1 -1
  165. package/dist/src/view/testUtils.js +7 -1
  166. package/dist/src/view/unitView.d.ts.map +1 -1
  167. package/dist/src/view/unitView.js +41 -36
  168. package/dist/src/view/view.d.ts +18 -6
  169. package/dist/src/view/view.d.ts.map +1 -1
  170. package/dist/src/view/view.js +30 -4
  171. package/package.json +2 -2
  172. package/dist/bundle/browser-txUcLy2H.js +0 -123
  173. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  174. package/dist/bundle/index-BhtHKLUo.js +0 -73
  175. package/dist/bundle/index-CCe8rnZz.js +0 -716
  176. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  177. package/dist/src/data/collector.test.js +0 -138
  178. package/dist/src/data/dataFlow.test.js +0 -38
  179. package/dist/src/data/flow.test.js +0 -81
  180. package/dist/src/data/flowInit.test.js +0 -413
  181. package/dist/src/data/flowNode.test.js +0 -50
  182. package/dist/src/data/flowOptimizer.test.js +0 -209
  183. package/dist/src/data/formats/fasta.test.js +0 -27
  184. package/dist/src/data/sources/inlineSource.test.js +0 -63
  185. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  186. package/dist/src/data/transforms/aggregate.test.js +0 -134
  187. package/dist/src/data/transforms/clone.test.js +0 -11
  188. package/dist/src/data/transforms/coverage.test.js +0 -238
  189. package/dist/src/data/transforms/filter.test.js +0 -20
  190. package/dist/src/data/transforms/flatten.test.js +0 -96
  191. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  192. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  193. package/dist/src/data/transforms/formula.test.js +0 -25
  194. package/dist/src/data/transforms/identifier.test.js +0 -92
  195. package/dist/src/data/transforms/pileup.test.js +0 -70
  196. package/dist/src/data/transforms/project.test.js +0 -32
  197. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  198. package/dist/src/data/transforms/regexFold.test.js +0 -201
  199. package/dist/src/data/transforms/sample.test.js +0 -38
  200. package/dist/src/data/transforms/stack.test.js +0 -91
  201. package/dist/src/encoder/accessor.test.js +0 -162
  202. package/dist/src/encoder/encoder.test.js +0 -105
  203. package/dist/src/genome/genome.test.js +0 -268
  204. package/dist/src/genome/genomes.test.js +0 -8
  205. package/dist/src/genome/scaleIndex.test.js +0 -78
  206. package/dist/src/genome/scaleLocus.test.js +0 -4
  207. package/dist/src/scale/scale.test.js +0 -326
  208. package/dist/src/scale/ticks.test.js +0 -46
  209. package/dist/src/selection/selection.test.js +0 -14
  210. package/dist/src/utils/addBaseUrl.test.js +0 -30
  211. package/dist/src/utils/binnedIndex.test.js +0 -201
  212. package/dist/src/utils/cloner.test.js +0 -35
  213. package/dist/src/utils/coalesce.test.js +0 -16
  214. package/dist/src/utils/concatIterables.test.js +0 -8
  215. package/dist/src/utils/domainArray.test.js +0 -130
  216. package/dist/src/utils/indexer.test.js +0 -49
  217. package/dist/src/utils/interactionEvent.test.js +0 -35
  218. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  219. package/dist/src/utils/kWayMerge.test.js +0 -30
  220. package/dist/src/utils/mergeObjects.test.js +0 -42
  221. package/dist/src/utils/numberExtractor.test.js +0 -6
  222. package/dist/src/utils/propertyCacher.test.js +0 -89
  223. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  224. package/dist/src/utils/radixSort.test.js +0 -51
  225. package/dist/src/utils/reservationMap.test.js +0 -20
  226. package/dist/src/utils/ringBuffer.test.js +0 -39
  227. package/dist/src/utils/topK.test.js +0 -54
  228. package/dist/src/utils/trees.test.js +0 -135
  229. package/dist/src/utils/url.test.js +0 -28
  230. package/dist/src/utils/variableTools.test.js +0 -13
  231. package/dist/src/view/axisResolution.d.ts.map +0 -1
  232. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  233. package/dist/src/view/axisResolution.test.js +0 -206
  234. package/dist/src/view/flowBuilder.test.js +0 -125
  235. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  236. package/dist/src/view/layout/flexLayout.test.js +0 -323
  237. package/dist/src/view/layout/grid.test.js +0 -71
  238. package/dist/src/view/layout/rectangle.test.js +0 -192
  239. package/dist/src/view/paramMediator.test.js +0 -282
  240. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  241. package/dist/src/view/scaleResolution.js +0 -1059
  242. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  243. package/dist/src/view/scaleResolution.test.js +0 -645
  244. package/dist/src/view/view.test.js +0 -245
  245. package/dist/src/view/viewDispose.test.js +0 -110
  246. package/dist/src/view/viewFactory.test.js +0 -25
  247. package/dist/src/view/viewUtils.test.js +0 -87
  248. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  249. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleResolution.test.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.test.js"],"names":[],"mappings":"sBAYa,OAAO,oBAAoB,EAAE,OAAO"}
@@ -0,0 +1,6 @@
1
+ export const QUANTITATIVE: "quantitative";
2
+ export const ORDINAL: "ordinal";
3
+ export const NOMINAL: "nominal";
4
+ export const LOCUS: "locus";
5
+ export const INDEX: "index";
6
+ //# sourceMappingURL=scaleResolutionConstants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleResolutionConstants.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolutionConstants.js"],"names":[],"mappings":"AAAA,2BAA4B,cAAc,CAAC;AAC3C,sBAAuB,SAAS,CAAC;AACjC,sBAAuB,SAAS,CAAC;AACjC,oBAAqB,OAAO,CAAC;AAC7B,oBAAqB,OAAO,CAAC"}
@@ -0,0 +1,5 @@
1
+ export const QUANTITATIVE = "quantitative";
2
+ export const ORDINAL = "ordinal";
3
+ export const NOMINAL = "nominal";
4
+ export const LOCUS = "locus";
5
+ export const INDEX = "index";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @typedef {import("../spec/channel.js").Channel} Channel
3
+ */
4
+ /**
5
+ * @param {Channel} channel
6
+ * @param {import("../spec/channel.js").Type} dataType
7
+ * @returns {import("../spec/scale.js").ScaleType}
8
+ */
9
+ export function getDefaultScaleType(channel: Channel, dataType: import("../spec/channel.js").Type): import("../spec/scale.js").ScaleType;
10
+ /**
11
+ * @param {import("../spec/scale.js").Scale} props
12
+ * @param {Channel} channel
13
+ */
14
+ export function applyLockedProperties(props: import("../spec/scale.js").Scale, channel: Channel): void;
15
+ export type Channel = import("../spec/channel.js").Channel;
16
+ //# sourceMappingURL=scaleRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleRules.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleRules.js"],"names":[],"mappings":"AAcA;;GAEG;AAEH;;;;GAIG;AACH,6CAJW,OAAO,YACP,OAAO,oBAAoB,EAAE,IAAI,GAC/B,OAAO,kBAAkB,EAAE,SAAS,CAkEhD;AAED;;;GAGG;AACH,6CAHW,OAAO,kBAAkB,EAAE,KAAK,WAChC,OAAO,QAWjB;sBAvFY,OAAO,oBAAoB,EAAE,OAAO"}
@@ -0,0 +1,103 @@
1
+ import { isContinuous } from "vega-scale";
2
+
3
+ import {
4
+ isPositionalChannel,
5
+ isPrimaryPositionalChannel,
6
+ } from "../encoder/encoder.js";
7
+ import {
8
+ INDEX,
9
+ LOCUS,
10
+ NOMINAL,
11
+ ORDINAL,
12
+ QUANTITATIVE,
13
+ } from "./scaleResolutionConstants.js";
14
+
15
+ /**
16
+ * @typedef {import("../spec/channel.js").Channel} Channel
17
+ */
18
+
19
+ /**
20
+ * @param {Channel} channel
21
+ * @param {import("../spec/channel.js").Type} dataType
22
+ * @returns {import("../spec/scale.js").ScaleType}
23
+ */
24
+ export function getDefaultScaleType(channel, dataType) {
25
+ // TODO: Band scale, Bin-Quantitative
26
+
27
+ if (dataType == INDEX || dataType == LOCUS) {
28
+ if (isPrimaryPositionalChannel(channel)) {
29
+ return dataType;
30
+ } else {
31
+ // TODO: Also explicitly set scales should be validated
32
+ throw new Error(
33
+ channel +
34
+ " does not support " +
35
+ dataType +
36
+ " data type. Only positional channels do."
37
+ );
38
+ }
39
+ }
40
+
41
+ /**
42
+ * @type {Partial<Record<Channel, (import("../spec/scale.js").ScaleType | undefined)[]>>}
43
+ * Default types: nominal, ordinal, quantitative.
44
+ * undefined = incompatible, "null" = disabled (pass-thru)
45
+ */
46
+ const defaults = {
47
+ x: ["band", "band", "linear"],
48
+ y: ["band", "band", "linear"],
49
+ size: [undefined, "point", "linear"],
50
+ opacity: [undefined, "point", "linear"],
51
+ fillOpacity: [undefined, "point", "linear"],
52
+ strokeOpacity: [undefined, "point", "linear"],
53
+ color: ["ordinal", "ordinal", "linear"],
54
+ fill: ["ordinal", "ordinal", "linear"],
55
+ stroke: ["ordinal", "ordinal", "linear"],
56
+ strokeWidth: [undefined, undefined, "linear"],
57
+ shape: ["ordinal", "ordinal", undefined],
58
+ dx: [undefined, undefined, "null"],
59
+ dy: [undefined, undefined, "null"],
60
+ angle: [undefined, undefined, "linear"],
61
+ sample: ["null", undefined, undefined],
62
+ };
63
+
64
+ /** @type {Channel[]} */
65
+ const typelessChannels = ["sample"];
66
+
67
+ const type = typelessChannels.includes(channel)
68
+ ? "null"
69
+ : defaults[channel]
70
+ ? defaults[channel][
71
+ [NOMINAL, ORDINAL, QUANTITATIVE].indexOf(dataType)
72
+ ]
73
+ : dataType == QUANTITATIVE
74
+ ? "linear"
75
+ : "ordinal";
76
+
77
+ if (type === undefined) {
78
+ throw new Error(
79
+ 'Channel "' +
80
+ channel +
81
+ '" is not compatible with "' +
82
+ dataType +
83
+ '" data type. Use of a proper scale may be needed.'
84
+ );
85
+ }
86
+
87
+ return type;
88
+ }
89
+
90
+ /**
91
+ * @param {import("../spec/scale.js").Scale} props
92
+ * @param {Channel} channel
93
+ */
94
+ export function applyLockedProperties(props, channel) {
95
+ if (isPositionalChannel(channel) && props.type !== "ordinal") {
96
+ // Unit ranges are a temporary default until pixel ranges are adopted.
97
+ props.range = [0, 1];
98
+ }
99
+
100
+ if (channel == "opacity" && isContinuous(props.type)) {
101
+ props.clamp = true;
102
+ }
103
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scaleRules.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaleRules.test.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleRules.test.js"],"names":[],"mappings":""}
@@ -166,19 +166,15 @@ export interface ValueDefBase<V extends Value = Scalar> {
166
166
  export type ValueDef<V extends Value = Scalar> = ValueDefBase<V> & TitleMixins;
167
167
 
168
168
  export interface DatumDef<V extends Scalar | ExprRef = Scalar | ExprRef>
169
- extends Partial<TypeMixins<Type>>,
170
- BandMixins,
171
- ScaleMixins,
172
- TitleMixins {
169
+ extends Partial<TypeMixins<Type>>, BandMixins, ScaleMixins, TitleMixins {
173
170
  /**
174
171
  * A constant value in data domain.
175
172
  */
176
173
  datum?: V;
177
174
  }
178
175
 
179
- export interface ExprDef<>extends Partial<TypeMixins<Type>>,
180
- BandMixins,
181
- TitleMixins {
176
+ export interface ExprDef
177
+ extends Partial<TypeMixins<Type>>, BandMixins, TitleMixins {
182
178
  /**
183
179
  * An expression. Properties of the data can be accessed through the `datum` object.
184
180
  */
@@ -200,17 +196,16 @@ export type MarkPropDatumDef<T extends Type> = LegendMixins &
200
196
  ScaleDatumDef &
201
197
  TypeMixins<T>;
202
198
 
203
- export interface LegendMixins {
204
- /**
205
- * An object defining properties of the legend.
206
- * If `null`, the legend for the encoding channel will be removed.
207
- *
208
- * __Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
209
- *
210
- * __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
211
- */
212
- // TODO: legend?: Legend<ExprRef | SignalRef> | null;
213
- }
199
+ /**
200
+ * An object defining properties of the legend.
201
+ * If `null`, the legend for the encoding channel will be removed.
202
+ *
203
+ * __Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied.
204
+ *
205
+ * __See also:__ [`legend`](https://vega.github.io/vega-lite/docs/legend.html) documentation.
206
+ */
207
+ // TODO: legend?: Legend<ExprRef | SignalRef> | null;
208
+ export type LegendMixins = Record<string, never>;
214
209
 
215
210
  export type ConditionalTemplate =
216
211
  | FieldDef<any>
@@ -47,6 +47,12 @@ export interface Scale {
47
47
  */
48
48
  type?: ScaleType;
49
49
 
50
+ /**
51
+ * The genome assembly name for locus scales. If undefined, the default
52
+ * genome from the genome store is used.
53
+ */
54
+ assembly?: string;
55
+
50
56
  /**
51
57
  * Customized domain values.
52
58
  *
@@ -40,6 +40,11 @@ export interface EmbedOptions {
40
40
  * @genome-spy/app package.
41
41
  */
42
42
  powerPreference?: "default" | "high-performance" | "low-power";
43
+
44
+ /**
45
+ * Optional hook for handling launch errors. Return true to suppress default UI.
46
+ */
47
+ onError?: (error: unknown, container: HTMLElement) => boolean | void;
43
48
  }
44
49
 
45
50
  /**
@@ -1,5 +1,5 @@
1
1
  import { ComplexDomain, NumericDomain } from "../spec/scale.js";
2
- import ScaleResolution from "../view/scaleResolution.js";
2
+ import ScaleResolution from "../scales/scaleResolution.js";
3
3
 
4
4
  export type ScaleResolutionEventType = "domain" | "range";
5
5
  export interface ScaleResolutionEvent {
@@ -1 +1 @@
1
- {"version":3,"file":"domainArray.d.ts","sourceRoot":"","sources":["../../../src/utils/domainArray.js"],"names":[],"mappings":"AA8KA;;;;GAIG;AACH,2CAHW,MAAM,kBACN,MAAM,EAAE,eAiBlB;AAED;;;;GAIG;AACH,4CAFW,WAAW,GAAG,GAAG,EAAE,SAI7B;AA3MD;;GAEG;AAEH;IACI,cAIC;IAFG,qBAAqB;IACrB,MADW,MAAM,CACI;IAGzB;;;;OAIG;IACH,cAHW,MAAM,GACJ,WAAW,CAIvB;IAED;;;;OAIG;IACH,kBAHW,QAAQ,CAAC,MAAM,CAAC,GACd,WAAW,CAcvB;IAED;;;;;OAKG;IACH,sBAFa,CAAC,UAHH,QAAQ,CAAC,CAAC,CAAC,aACX,CAAS,IAAC,EAAD,CAAC,KAAE,MAAM,GAChB,WAAW,CASvB;CACJ;AAED;IAoBgB,UAAe;IAEf,UAAe;CAS9B;AAED;;GAEG;AACH;IAKQ,0BAA0B;IAC1B,cADW,GAAG,CAAC,MAAM,CAAC,CACO;CAoBpC;AAED;CAKC;AAED;IACI;;;OAGG;IACH,2BAFW,MAAM,EAAE,EAiBlB;CAgBJ;qBAhKY,OAAO,GAAG,MAAM,GAAG,MAAM"}
1
+ {"version":3,"file":"domainArray.d.ts","sourceRoot":"","sources":["../../../src/utils/domainArray.js"],"names":[],"mappings":"AAiLA;;;;GAIG;AACH,2CAHW,MAAM,kBACN,MAAM,EAAE,eAiBlB;AAED;;;;GAIG;AACH,4CAFW,WAAW,GAAG,GAAG,EAAE,SAI7B;AA9MD;;GAEG;AAKH;IACI,cAIC;IAFG,qBAAqB;IACrB,MADW,MAAM,CACI;IAGzB;;;;OAIG;IACH,cAHW,MAAM,GACJ,WAAW,CAIvB;IAED;;;;OAIG;IACH,kBAHW,QAAQ,CAAC,MAAM,CAAC,GACd,WAAW,CAcvB;IAED;;;;;OAKG;IACH,sBAFa,CAAC,UAHH,QAAQ,CAAC,CAAC,CAAC,aACX,CAAS,IAAC,EAAD,CAAC,KAAE,MAAM,GAChB,WAAW,CASvB;CACJ;AAED;IAoBgB,UAAe;IAEf,UAAe;CAS9B;AAED;;GAEG;AACH;IAKQ,0BAA0B;IAC1B,cADW,GAAG,CAAC,MAAM,CAAC,CACO;CAoBpC;AAED;CAKC;AAED;IACI;;;OAGG;IACH,2BAFW,MAAM,EAAE,EAiBlB;CAgBJ;qBAnKY,OAAO,GAAG,MAAM,GAAG,MAAM"}
@@ -2,6 +2,9 @@
2
2
  * @typedef {boolean | number | string} scalar
3
3
  */
4
4
 
5
+ // DomainArray tracks categorical order for scale domain extraction.
6
+ // For rendering, ScaleResolution maintains a stable Indexer to prevent
7
+ // categorical indices from changing across updates.
5
8
  export class DomainArray /** @type {Array<scalar>} */ extends Array {
6
9
  constructor() {
7
10
  super();
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Assigns unique values an index number in the order they are encountered.
3
3
  *
4
+ * Used to keep categorical GPU encodings stable: once a value gets an index,
5
+ * it must never change for the lifetime of the owning scale.
6
+ *
4
7
  * TODO: What about undefined?
5
8
  *
6
9
  * @template T
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/utils/indexer.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,sCAFa,CAAC;YAYE,CAAC;qBAeD,QAAQ,CAAC,CAAC,CAAC;kBAOX,MAAM;;EAYrB"}
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/utils/indexer.js"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,sCAFa,CAAC;YAYE,CAAC;qBAeD,QAAQ,CAAC,CAAC,CAAC;kBAOX,MAAM;;EAYrB"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * Assigns unique values an index number in the order they are encountered.
3
3
  *
4
+ * Used to keep categorical GPU encodings stable: once a value gets an index,
5
+ * it must never change for the lifetime of the owning scale.
6
+ *
4
7
  * TODO: What about undefined?
5
8
  *
6
9
  * @template T
@@ -11,6 +11,24 @@ export default class ConcatView extends GridView {
11
11
  * @param {string} name
12
12
  */
13
13
  constructor(spec: import("../spec/view.js").AnyConcatSpec, context: import("../types/viewContext.js").default, layoutParent: import("./containerView.js").default, dataParent: import("./view.js").default, name: string);
14
+ /**
15
+ * Adds a child spec dynamically. Intended for post-initialization updates.
16
+ *
17
+ * Callers should prefer this over direct GridView insertion to ensure
18
+ * dataflow initialization, axis wiring, and layout reflow are handled.
19
+ *
20
+ * @param {import("../spec/view.js").ViewSpec} childSpec
21
+ * @param {number} [index]
22
+ * @returns {Promise<import("./view.js").default>}
23
+ */
24
+ addChildSpec(childSpec: import("../spec/view.js").ViewSpec, index?: number): Promise<import("./view.js").default>;
25
+ /**
26
+ * Removes a child by index. Intended for post-initialization updates.
27
+ *
28
+ * @param {number} index
29
+ */
30
+ removeChildAt(index: number): Promise<void>;
31
+ #private;
14
32
  }
15
33
  import GridView from "./gridView/gridView.js";
16
34
  //# sourceMappingURL=concatView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"concatView.d.ts","sourceRoot":"","sources":["../../../src/view/concatView.js"],"names":[],"mappings":"AAGA;;GAEG;AACH;IACI;;;;;;;OAOG;IACH,kBANW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,EAiBhB;CAqDJ;qBAlFoB,wBAAwB"}
1
+ {"version":3,"file":"concatView.d.ts","sourceRoot":"","sources":["../../../src/view/concatView.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;;;;;;OAOG;IACH,kBANW,OAAO,iBAAiB,EAAE,aAAa,WACvC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,EAiBhB;IA6BD;;;;;;;;;OASG;IACH,wBAJW,OAAO,iBAAiB,EAAE,QAAQ,UAClC,MAAM,GACJ,OAAO,CAAC,OAAO,WAAW,EAAE,OAAO,CAAC,CAIhD;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAIhB;;CA2EJ;qBA3JoB,wBAAwB"}
@@ -1,5 +1,6 @@
1
1
  import { isConcatSpec, isHConcatSpec, isVConcatSpec } from "./viewFactory.js";
2
2
  import GridView from "./gridView/gridView.js";
3
+ import ContainerMutationHelper from "./containerMutationHelper.js";
3
4
 
4
5
  /**
5
6
  * Creates a vertically or horizontally concatenated layout for children.
@@ -57,6 +58,29 @@ export default class ConcatView extends GridView {
57
58
  await this.createAxes();
58
59
  }
59
60
 
61
+ /**
62
+ * Adds a child spec dynamically. Intended for post-initialization updates.
63
+ *
64
+ * Callers should prefer this over direct GridView insertion to ensure
65
+ * dataflow initialization, axis wiring, and layout reflow are handled.
66
+ *
67
+ * @param {import("../spec/view.js").ViewSpec} childSpec
68
+ * @param {number} [index]
69
+ * @returns {Promise<import("./view.js").default>}
70
+ */
71
+ async addChildSpec(childSpec, index) {
72
+ return this.#getMutationHelper().addChildSpec(childSpec, index);
73
+ }
74
+
75
+ /**
76
+ * Removes a child by index. Intended for post-initialization updates.
77
+ *
78
+ * @param {number} index
79
+ */
80
+ async removeChildAt(index) {
81
+ await this.#getMutationHelper().removeChildAt(index);
82
+ }
83
+
60
84
  /**
61
85
  * @param {import("../spec/channel.js").Channel} channel
62
86
  * @param {import("../spec/view.js").ResolutionTarget} resolutionType
@@ -81,4 +105,53 @@ export default class ConcatView extends GridView {
81
105
  return "independent";
82
106
  }
83
107
  }
108
+
109
+ /**
110
+ * @returns {{
111
+ * specs: (import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec)[],
112
+ * insertAt: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => void,
113
+ * removeAt: (index: number) => void
114
+ * }}
115
+ */
116
+ #getChildSpecs() {
117
+ const spec = this.spec;
118
+ let specs;
119
+
120
+ if (isConcatSpec(spec)) {
121
+ specs = spec.concat;
122
+ } else if (isVConcatSpec(spec)) {
123
+ specs = spec.vconcat;
124
+ } else {
125
+ specs = spec.hconcat;
126
+ }
127
+
128
+ return {
129
+ specs,
130
+ insertAt: (index, childSpec) => {
131
+ specs.splice(index, 0, childSpec);
132
+ },
133
+ removeAt: (index) => {
134
+ specs.splice(index, 1);
135
+ },
136
+ };
137
+ }
138
+
139
+ /**
140
+ * @returns {ContainerMutationHelper}
141
+ */
142
+ #getMutationHelper() {
143
+ return new ContainerMutationHelper(this, {
144
+ getChildSpecs: this.#getChildSpecs.bind(this),
145
+ insertView: (view, index) => this.insertChildViewAt(view, index),
146
+ removeView: (index) => super.removeChildAt(index),
147
+ prepareView: async (view, _index, gridChild) => {
148
+ await gridChild.createAxes();
149
+ await this.syncSharedAxes();
150
+ },
151
+ afterRemove: async () => {
152
+ await this.syncSharedAxes();
153
+ },
154
+ defaultName: (_index) => "grid" + this.childCount,
155
+ });
156
+ }
84
157
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=concatView.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concatView.test.d.ts","sourceRoot":"","sources":["../../../src/view/concatView.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Shared helper for dynamic container mutations.
3
+ * Encapsulates the common lifecycle for adding/removing child views.
4
+ */
5
+ export default class ContainerMutationHelper {
6
+ /**
7
+ * @typedef {import("./view.js").default} View
8
+ * @typedef {import("../spec/view.js").ViewSpec} ViewSpec
9
+ * @typedef {import("../spec/view.js").ImportSpec} ImportSpec
10
+ *
11
+ * @typedef {{
12
+ * specs: (ViewSpec | ImportSpec)[],
13
+ * insertAt: (index: number, spec: ViewSpec | ImportSpec) => void,
14
+ * removeAt: (index: number) => void
15
+ * }} ChildSpecs
16
+ */
17
+ /**
18
+ * @typedef {{
19
+ * getChildSpecs: () => ChildSpecs,
20
+ * insertView: (view: View, index: number) => any,
21
+ * removeView: (index: number) => void,
22
+ * prepareView?: (view: View, index: number, insertionResult: any) => Promise<void>,
23
+ * afterRemove?: (index: number) => Promise<void>,
24
+ * defaultName?: (index: number, spec: ViewSpec | ImportSpec) => string,
25
+ * requestLayout?: boolean
26
+ * }} MutationOptions
27
+ */
28
+ /**
29
+ * @param {import("./containerView.js").default} container
30
+ * @param {MutationOptions} options
31
+ */
32
+ constructor(container: import("./containerView.js").default, options: {
33
+ getChildSpecs: () => {
34
+ specs: (import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec)[];
35
+ insertAt: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => void;
36
+ removeAt: (index: number) => void;
37
+ };
38
+ insertView: (view: import("./view.js").default, index: number) => any;
39
+ removeView: (index: number) => void;
40
+ prepareView?: (view: import("./view.js").default, index: number, insertionResult: any) => Promise<void>;
41
+ afterRemove?: (index: number) => Promise<void>;
42
+ defaultName?: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => string;
43
+ requestLayout?: boolean;
44
+ });
45
+ container: import("./containerView.js").default;
46
+ options: {
47
+ getChildSpecs: () => {
48
+ specs: (import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec)[];
49
+ insertAt: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => void;
50
+ removeAt: (index: number) => void;
51
+ };
52
+ insertView: (view: import("./view.js").default, index: number) => any;
53
+ removeView: (index: number) => void;
54
+ prepareView?: (view: import("./view.js").default, index: number, insertionResult: any) => Promise<void>;
55
+ afterRemove?: (index: number) => Promise<void>;
56
+ defaultName?: (index: number, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec) => string;
57
+ requestLayout?: boolean;
58
+ };
59
+ /**
60
+ * Adds a child spec dynamically and initializes its subtree dataflow.
61
+ *
62
+ * @param {import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec} childSpec
63
+ * @param {number} [index]
64
+ * @returns {Promise<View>}
65
+ */
66
+ addChildSpec(childSpec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, index?: number): Promise<import("./view.js").default>;
67
+ /**
68
+ * Removes a child by index and updates the backing spec list.
69
+ *
70
+ * @param {number} index
71
+ */
72
+ removeChildAt(index: number): Promise<void>;
73
+ }
74
+ //# sourceMappingURL=containerMutationHelper.d.ts.map
@@ -0,0 +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,CA8CzB;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAehB;CACJ"}
@@ -0,0 +1,118 @@
1
+ import {
2
+ initializeViewSubtree,
3
+ loadViewSubtreeData,
4
+ } from "../data/flowInit.js";
5
+ import { configureViewOpacity } from "../genomeSpy/viewHierarchyConfig.js";
6
+ import { finalizeSubtreeGraphics } from "./viewUtils.js";
7
+
8
+ /**
9
+ * Shared helper for dynamic container mutations.
10
+ * Encapsulates the common lifecycle for adding/removing child views.
11
+ */
12
+ export default class ContainerMutationHelper {
13
+ /**
14
+ * @typedef {import("./view.js").default} View
15
+ * @typedef {import("../spec/view.js").ViewSpec} ViewSpec
16
+ * @typedef {import("../spec/view.js").ImportSpec} ImportSpec
17
+ *
18
+ * @typedef {{
19
+ * specs: (ViewSpec | ImportSpec)[],
20
+ * insertAt: (index: number, spec: ViewSpec | ImportSpec) => void,
21
+ * removeAt: (index: number) => void
22
+ * }} ChildSpecs
23
+ */
24
+
25
+ /**
26
+ * @typedef {{
27
+ * getChildSpecs: () => ChildSpecs,
28
+ * insertView: (view: View, index: number) => any,
29
+ * removeView: (index: number) => void,
30
+ * prepareView?: (view: View, index: number, insertionResult: any) => Promise<void>,
31
+ * afterRemove?: (index: number) => Promise<void>,
32
+ * defaultName?: (index: number, spec: ViewSpec | ImportSpec) => string,
33
+ * requestLayout?: boolean
34
+ * }} MutationOptions
35
+ */
36
+
37
+ /**
38
+ * @param {import("./containerView.js").default} container
39
+ * @param {MutationOptions} options
40
+ */
41
+ constructor(container, options) {
42
+ this.container = container;
43
+ this.options = options;
44
+ }
45
+
46
+ /**
47
+ * Adds a child spec dynamically and initializes its subtree dataflow.
48
+ *
49
+ * @param {import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec} childSpec
50
+ * @param {number} [index]
51
+ * @returns {Promise<View>}
52
+ */
53
+ async addChildSpec(childSpec, index) {
54
+ const { specs, insertAt } = this.options.getChildSpecs();
55
+ const insertIndex = index ?? specs.length;
56
+ const name =
57
+ this.options.defaultName?.(insertIndex, childSpec) ??
58
+ "child" + specs.length;
59
+
60
+ const childView = await this.container.context.createOrImportView(
61
+ childSpec,
62
+ this.container,
63
+ this.container,
64
+ name
65
+ );
66
+
67
+ insertAt(insertIndex, childSpec);
68
+ const insertionResult = this.options.insertView(childView, insertIndex);
69
+
70
+ if (this.options.prepareView) {
71
+ await this.options.prepareView(
72
+ childView,
73
+ insertIndex,
74
+ insertionResult
75
+ );
76
+ }
77
+
78
+ configureViewOpacity(childView);
79
+
80
+ const visibilityPredicate = (
81
+ /** @type {import("./view.js").default} */ view
82
+ ) => view.isConfiguredVisible();
83
+ const { dataSources, graphicsPromises } = initializeViewSubtree(
84
+ childView,
85
+ this.container.context.dataFlow,
86
+ visibilityPredicate
87
+ );
88
+ await loadViewSubtreeData(childView, dataSources);
89
+ await finalizeSubtreeGraphics(graphicsPromises);
90
+
91
+ if (this.options.requestLayout !== false) {
92
+ this.container.invalidateSizeCache();
93
+ this.container.context.requestLayoutReflow();
94
+ }
95
+
96
+ return childView;
97
+ }
98
+
99
+ /**
100
+ * Removes a child by index and updates the backing spec list.
101
+ *
102
+ * @param {number} index
103
+ */
104
+ async removeChildAt(index) {
105
+ const { removeAt } = this.options.getChildSpecs();
106
+ this.options.removeView(index);
107
+ removeAt(index);
108
+
109
+ if (this.options.afterRemove) {
110
+ await this.options.afterRemove(index);
111
+ }
112
+
113
+ if (this.options.requestLayout !== false) {
114
+ this.container.invalidateSizeCache();
115
+ this.container.context.requestLayoutReflow();
116
+ }
117
+ }
118
+ }
@@ -14,13 +14,6 @@ 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
- * Replaces a child view with another one. Does not alter the old or new child.
19
- *
20
- * @param {import("./view.js").default} child
21
- * @param {import("./view.js").default} replacement
22
- */
23
- replaceChild(child: import("./view.js").default, replacement: import("./view.js").default): void;
24
17
  /**
25
18
  * @param {string[]} path An array of view names
26
19
  * @returns {View}
@@ -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;IASD;;;;;OAKG;IACH,oBAHW,OAAO,WAAW,EAAE,OAAO,eAC3B,OAAO,WAAW,EAAE,OAAO,QAIrC;IA+CD;;;OAGG;IACH,2BAHW,MAAM,EAAE,GACN,IAAI,CAYhB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,2BAFW,MAAM,QAchB;IA1GD;;OAEG;IACH,qBAFa,gBAAgB,CAAC,IAAI,CAAC,CAIlC;CA+GJ;iBA7I4C,WAAW"}
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"}
@@ -30,16 +30,6 @@ export default class ContainerView extends View {
30
30
  // override
31
31
  }
32
32
 
33
- /**
34
- * Replaces a child view with another one. Does not alter the old or new child.
35
- *
36
- * @param {import("./view.js").default} child
37
- * @param {import("./view.js").default} replacement
38
- */
39
- replaceChild(child, replacement) {
40
- throw new Error("Not implemented");
41
- }
42
-
43
33
  /**
44
34
  * Visits child views in depth-first pre-order. Terminates the search and returns
45
35
  * the value if the visitor returns a defined value. The `afterChildren` callback