@genome-spy/core 0.64.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 (285) hide show
  1. package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
  2. package/dist/bundle/browser-BRemItdO.js +138 -0
  3. package/dist/bundle/index-BatuyGAI.js +271 -0
  4. package/dist/bundle/index-ByuE8dvu.js +332 -0
  5. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  6. package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
  7. package/dist/bundle/index-D28m8tSW.js +1607 -0
  8. package/dist/bundle/index-D74H8TTz.js +508 -0
  9. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  10. package/dist/bundle/index.es.js +15034 -13842
  11. package/dist/bundle/index.js +223 -237
  12. package/dist/bundle/inflate-GtwLkvSP.js +1048 -0
  13. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  14. package/dist/schema.json +22 -4
  15. package/dist/src/config/scaleDefaults.d.ts +8 -0
  16. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  17. package/dist/src/config/scaleDefaults.js +45 -0
  18. package/dist/src/data/collector.d.ts +7 -2
  19. package/dist/src/data/collector.d.ts.map +1 -1
  20. package/dist/src/data/collector.js +13 -2
  21. package/dist/src/data/dataFlow.d.ts +20 -42
  22. package/dist/src/data/dataFlow.d.ts.map +1 -1
  23. package/dist/src/data/dataFlow.js +57 -80
  24. package/dist/src/data/flowHandle.d.ts +15 -0
  25. package/dist/src/data/flowHandle.d.ts.map +1 -0
  26. package/dist/src/data/flowHandle.js +13 -0
  27. package/dist/src/data/flowInit.d.ts +85 -0
  28. package/dist/src/data/flowInit.d.ts.map +1 -0
  29. package/dist/src/data/flowInit.js +238 -0
  30. package/dist/src/data/flowInit.test.d.ts +2 -0
  31. package/dist/src/data/flowInit.test.d.ts.map +1 -0
  32. package/dist/src/data/flowOptimizer.d.ts +6 -4
  33. package/dist/src/data/flowOptimizer.d.ts.map +1 -1
  34. package/dist/src/data/flowOptimizer.js +29 -14
  35. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  36. package/dist/src/data/sources/lazy/bamSource.js +1 -1
  37. package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
  38. package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
  39. package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
  40. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  41. package/dist/src/data/sources/lazy/gff3Source.js +4 -8
  42. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  43. package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
  44. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  45. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  46. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  47. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  48. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  49. package/dist/src/data/sources/lazy/tabixSource.js +1 -1
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  52. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  53. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  54. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  55. package/dist/src/encoder/encoder.d.ts +1 -1
  56. package/dist/src/encoder/encoder.d.ts.map +1 -1
  57. package/dist/src/encoder/encoder.js +1 -1
  58. package/dist/src/genome/scaleLocus.d.ts +39 -0
  59. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  60. package/dist/src/genome/scaleLocus.js +76 -0
  61. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  62. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  63. package/dist/src/genomeSpy/canvasExport.js +66 -0
  64. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  65. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  66. package/dist/src/genomeSpy/containerUi.js +78 -0
  67. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  68. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  69. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  70. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  71. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  73. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  74. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/interactionController.js +371 -0
  76. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  77. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  78. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  79. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  80. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  81. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  82. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  83. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  84. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  85. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  86. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  87. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  88. package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
  89. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  90. package/dist/src/genomeSpy/viewDataInit.js +41 -0
  91. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  92. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  93. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  94. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  95. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  96. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  97. package/dist/src/genomeSpy.d.ts +17 -72
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +180 -789
  100. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  101. package/dist/src/gl/webGLHelper.d.ts +2 -2
  102. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  103. package/dist/src/gl/webGLHelper.js +4 -4
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/index.js +2 -12
  106. package/dist/src/marks/mark.d.ts +1 -0
  107. package/dist/src/marks/mark.d.ts.map +1 -1
  108. package/dist/src/marks/mark.js +26 -3
  109. package/dist/src/{view → scales}/axisResolution.d.ts +12 -14
  110. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  111. package/dist/src/{view → scales}/axisResolution.js +38 -12
  112. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  113. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  114. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  115. package/dist/src/scales/scaleDomainAggregator.js +162 -0
  116. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  117. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  118. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  119. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  120. package/dist/src/scales/scaleInstanceManager.js +313 -0
  121. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  122. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  123. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  124. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  125. package/dist/src/scales/scaleInteractionController.js +336 -0
  126. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  127. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  128. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  129. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  130. package/dist/src/scales/scalePropsResolver.js +74 -0
  131. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -31
  132. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  133. package/dist/src/scales/scaleResolution.js +658 -0
  134. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  135. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  136. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  137. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  138. package/dist/src/scales/scaleRules.d.ts +16 -0
  139. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  140. package/dist/src/scales/scaleRules.js +103 -0
  141. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  142. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  143. package/dist/src/spec/channel.d.ts +13 -18
  144. package/dist/src/spec/sampleView.d.ts +3 -2
  145. package/dist/src/spec/scale.d.ts +6 -0
  146. package/dist/src/types/embedApi.d.ts +5 -0
  147. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  148. package/dist/src/types/viewContext.d.ts +1 -1
  149. package/dist/src/view/concatView.d.ts +18 -0
  150. package/dist/src/view/concatView.d.ts.map +1 -1
  151. package/dist/src/view/concatView.js +73 -0
  152. package/dist/src/view/concatView.test.d.ts +2 -0
  153. package/dist/src/view/concatView.test.d.ts.map +1 -0
  154. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  155. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  156. package/dist/src/view/containerMutationHelper.js +114 -0
  157. package/dist/src/view/containerView.d.ts +0 -7
  158. package/dist/src/view/containerView.d.ts.map +1 -1
  159. package/dist/src/view/containerView.js +0 -10
  160. package/dist/src/view/facetView.d.ts.map +1 -1
  161. package/dist/src/view/facetView.js +0 -14
  162. package/dist/src/view/flowBuilder.d.ts +2 -2
  163. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  164. package/dist/src/view/flowBuilder.js +21 -4
  165. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  166. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  167. package/dist/src/view/gridView/gridChild.js +32 -6
  168. package/dist/src/view/gridView/gridView.d.ts +39 -1
  169. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  170. package/dist/src/view/gridView/gridView.js +113 -42
  171. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  172. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  173. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  174. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  175. package/dist/src/view/gridView/scrollbar.js +184 -69
  176. package/dist/src/view/gridView/selectionRect.d.ts +8 -4
  177. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  178. package/dist/src/view/gridView/selectionRect.js +28 -3
  179. package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
  180. package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
  181. package/dist/src/view/layerView.d.ts +14 -0
  182. package/dist/src/view/layerView.d.ts.map +1 -1
  183. package/dist/src/view/layerView.js +66 -0
  184. package/dist/src/view/layerView.test.d.ts +2 -0
  185. package/dist/src/view/layerView.test.d.ts.map +1 -0
  186. package/dist/src/view/paramMediator.d.ts +2 -1
  187. package/dist/src/view/paramMediator.d.ts.map +1 -1
  188. package/dist/src/view/paramMediator.js +13 -1
  189. package/dist/src/view/testUtils.d.ts.map +1 -1
  190. package/dist/src/view/testUtils.js +18 -5
  191. package/dist/src/view/unitView.d.ts.map +1 -1
  192. package/dist/src/view/unitView.js +52 -12
  193. package/dist/src/view/view.d.ts +23 -7
  194. package/dist/src/view/view.d.ts.map +1 -1
  195. package/dist/src/view/view.js +61 -5
  196. package/dist/src/view/viewDispose.test.d.ts +2 -0
  197. package/dist/src/view/viewDispose.test.d.ts.map +1 -0
  198. package/dist/src/view/viewUtils.d.ts +4 -4
  199. package/dist/src/view/viewUtils.d.ts.map +1 -1
  200. package/dist/src/view/viewUtils.js +19 -15
  201. package/dist/src/view/viewUtils.test.d.ts +2 -0
  202. package/dist/src/view/viewUtils.test.d.ts.map +1 -0
  203. package/package.json +10 -10
  204. package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
  205. package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
  206. package/dist/bundle/index-5ajWdKly.js +0 -1319
  207. package/dist/bundle/index-B03-Om4z.js +0 -274
  208. package/dist/bundle/index-BftNdA0O.js +0 -27
  209. package/dist/bundle/index-Bg7C4Xat.js +0 -2750
  210. package/dist/bundle/index-C3QR8Lv6.js +0 -2131
  211. package/dist/bundle/index-DTcHjAHp.js +0 -505
  212. package/dist/bundle/index-DnIkxb0L.js +0 -1025
  213. package/dist/bundle/index-Ww3TAo6_.js +0 -71
  214. package/dist/bundle/index-g8iXgW0W.js +0 -651
  215. package/dist/bundle/long-B-FASCSo.js +0 -2387
  216. package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
  217. package/dist/src/data/collector.test.js +0 -138
  218. package/dist/src/data/dataFlow.test.js +0 -5
  219. package/dist/src/data/flow.test.js +0 -81
  220. package/dist/src/data/flowNode.test.js +0 -50
  221. package/dist/src/data/flowOptimizer.test.js +0 -204
  222. package/dist/src/data/formats/fasta.test.js +0 -27
  223. package/dist/src/data/sources/inlineSource.test.js +0 -63
  224. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  225. package/dist/src/data/transforms/aggregate.test.js +0 -134
  226. package/dist/src/data/transforms/clone.test.js +0 -11
  227. package/dist/src/data/transforms/coverage.test.js +0 -238
  228. package/dist/src/data/transforms/filter.test.js +0 -20
  229. package/dist/src/data/transforms/flatten.test.js +0 -96
  230. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  231. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  232. package/dist/src/data/transforms/formula.test.js +0 -25
  233. package/dist/src/data/transforms/identifier.test.js +0 -92
  234. package/dist/src/data/transforms/pileup.test.js +0 -70
  235. package/dist/src/data/transforms/project.test.js +0 -32
  236. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  237. package/dist/src/data/transforms/regexFold.test.js +0 -201
  238. package/dist/src/data/transforms/sample.test.js +0 -38
  239. package/dist/src/data/transforms/stack.test.js +0 -91
  240. package/dist/src/encoder/accessor.test.js +0 -162
  241. package/dist/src/encoder/encoder.test.js +0 -105
  242. package/dist/src/genome/genome.test.js +0 -268
  243. package/dist/src/genome/genomes.test.js +0 -8
  244. package/dist/src/genome/scaleIndex.test.js +0 -78
  245. package/dist/src/genome/scaleLocus.test.js +0 -4
  246. package/dist/src/scale/scale.test.js +0 -326
  247. package/dist/src/scale/ticks.test.js +0 -46
  248. package/dist/src/selection/selection.test.js +0 -14
  249. package/dist/src/utils/addBaseUrl.test.js +0 -30
  250. package/dist/src/utils/binnedIndex.test.js +0 -201
  251. package/dist/src/utils/cloner.test.js +0 -35
  252. package/dist/src/utils/coalesce.test.js +0 -16
  253. package/dist/src/utils/concatIterables.test.js +0 -8
  254. package/dist/src/utils/domainArray.test.js +0 -130
  255. package/dist/src/utils/indexer.test.js +0 -49
  256. package/dist/src/utils/interactionEvent.test.js +0 -35
  257. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  258. package/dist/src/utils/kWayMerge.test.js +0 -30
  259. package/dist/src/utils/mergeObjects.test.js +0 -42
  260. package/dist/src/utils/numberExtractor.test.js +0 -6
  261. package/dist/src/utils/propertyCacher.test.js +0 -89
  262. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  263. package/dist/src/utils/radixSort.test.js +0 -51
  264. package/dist/src/utils/reservationMap.test.js +0 -20
  265. package/dist/src/utils/ringBuffer.test.js +0 -39
  266. package/dist/src/utils/topK.test.js +0 -54
  267. package/dist/src/utils/trees.test.js +0 -135
  268. package/dist/src/utils/url.test.js +0 -28
  269. package/dist/src/utils/variableTools.test.js +0 -13
  270. package/dist/src/view/axisResolution.d.ts.map +0 -1
  271. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  272. package/dist/src/view/axisResolution.test.js +0 -206
  273. package/dist/src/view/flowBuilder.test.js +0 -125
  274. package/dist/src/view/layout/flexLayout.test.js +0 -323
  275. package/dist/src/view/layout/grid.test.js +0 -71
  276. package/dist/src/view/layout/rectangle.test.js +0 -192
  277. package/dist/src/view/paramMediator.test.js +0 -260
  278. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  279. package/dist/src/view/scaleResolution.js +0 -1049
  280. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  281. package/dist/src/view/scaleResolution.test.js +0 -645
  282. package/dist/src/view/view.test.js +0 -245
  283. package/dist/src/view/viewFactory.test.js +0 -25
  284. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  285. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @typedef {import("../types/viewContext.js").default} ViewContext
3
+ */
4
+ /**
5
+ * Creates a ViewContext from a partial input. Omitted fields default to
6
+ * "fail-fast" placeholders that throw when called. This lets tests supply only
7
+ * what they need while keeping production usage explicit.
8
+ *
9
+ * @param {Partial<ViewContext> & {
10
+ * createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void) => Promise<import("../view/view.js").default>
11
+ * }} options
12
+ * @returns {ViewContext}
13
+ */
14
+ export function createViewContext(options: Partial<ViewContext> & {
15
+ createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void) => Promise<import("../view/view.js").default>;
16
+ }): ViewContext;
17
+ export type ViewContext = import("../types/viewContext.js").default;
18
+ //# sourceMappingURL=viewContextFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewContextFactory.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewContextFactory.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,2CALW,OAAO,CAAC,WAAW,CAAC,GAAG;IAC7B,6BAA6B,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,KAAK,IAAI,KAAK,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAAA;CACvX,GACS,WAAW,CAkEvB;0BA7EY,OAAO,yBAAyB,EAAE,OAAO"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @typedef {import("../types/viewContext.js").default} ViewContext
3
+ */
4
+
5
+ /**
6
+ * Creates a ViewContext from a partial input. Omitted fields default to
7
+ * "fail-fast" placeholders that throw when called. This lets tests supply only
8
+ * what they need while keeping production usage explicit.
9
+ *
10
+ * @param {Partial<ViewContext> & {
11
+ * createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void) => Promise<import("../view/view.js").default>
12
+ * }} options
13
+ * @returns {ViewContext}
14
+ */
15
+ export function createViewContext(options) {
16
+ /** @param {string} name */
17
+ const missing = (name) => {
18
+ throw new Error("ViewContext." + name + " is not configured.");
19
+ };
20
+ /** @type {Partial<ViewContext>} */
21
+ const context = {
22
+ dataFlow: options.dataFlow ?? missing("dataFlow"),
23
+ glHelper: options.glHelper ?? missing("glHelper"),
24
+ animator: options.animator ?? missing("animator"),
25
+ genomeStore: options.genomeStore,
26
+ fontManager: options.fontManager ?? missing("fontManager"),
27
+ createOrImportView: async function (
28
+ spec,
29
+ layoutParent,
30
+ dataParent,
31
+ defaultName,
32
+ validator
33
+ ) {
34
+ const create = options.createOrImportViewWithContext;
35
+ if (!create) {
36
+ return Promise.reject(
37
+ new Error(
38
+ "ViewContext.createOrImportView is not configured."
39
+ )
40
+ );
41
+ }
42
+
43
+ // Needs the fully wired context for recursive view creation.
44
+ return create(
45
+ /** @type {ViewContext} */ (context),
46
+ spec,
47
+ layoutParent,
48
+ dataParent,
49
+ defaultName,
50
+ validator
51
+ );
52
+ },
53
+ };
54
+
55
+ /** @type {(keyof ViewContext)[]} */
56
+ const methodNames = [
57
+ "requestLayoutReflow",
58
+ "updateTooltip",
59
+ "getNamedDataFromProvider",
60
+ "getCurrentHover",
61
+ "setDataLoadingStatus",
62
+ "addKeyboardListener",
63
+ "addBroadcastListener",
64
+ "removeBroadcastListener",
65
+ "highlightView",
66
+ "isViewConfiguredVisible",
67
+ "isViewSpec",
68
+ ];
69
+
70
+ /** @type {Partial<ViewContext>} */
71
+ const optionValues = options;
72
+ const contextAny = /** @type {any} */ (context);
73
+
74
+ for (const name of methodNames) {
75
+ contextAny[name] = optionValues[name] ?? (() => missing(name));
76
+ }
77
+
78
+ return /** @type {ViewContext} */ (context);
79
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Initializes the view data pipeline: builds the flow graph, awaits fonts,
3
+ * loads sources, and finalizes graphics for rendering.
4
+ *
5
+ * @param {import("../view/view.js").default} viewRoot
6
+ * @param {import("../data/dataFlow.js").default} dataFlow
7
+ * @param {import("../fonts/bmFontManager.js").default} fontManager
8
+ * @param {(dataFlow: import("../data/dataFlow.js").default) => void} onDataFlowBuilt
9
+ * @returns {Promise<import("../data/dataFlow.js").default>}
10
+ */
11
+ export function initializeViewData(viewRoot: import("../view/view.js").default, dataFlow: import("../data/dataFlow.js").default, fontManager: import("../fonts/bmFontManager.js").default, onDataFlowBuilt: (dataFlow: import("../data/dataFlow.js").default) => void): Promise<import("../data/dataFlow.js").default>;
12
+ //# sourceMappingURL=viewDataInit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewDataInit.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewDataInit.js"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,6CANW,OAAO,iBAAiB,EAAE,OAAO,YACjC,OAAO,qBAAqB,EAAE,OAAO,eACrC,OAAO,2BAA2B,EAAE,OAAO,mBAC3C,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,OAAO,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CA0B1D"}
@@ -0,0 +1,41 @@
1
+ import {
2
+ initializeViewSubtree,
3
+ loadViewSubtreeData,
4
+ } from "../data/flowInit.js";
5
+ import { finalizeSubtreeGraphics } from "../view/viewUtils.js";
6
+
7
+ /**
8
+ * Initializes the view data pipeline: builds the flow graph, awaits fonts,
9
+ * loads sources, and finalizes graphics for rendering.
10
+ *
11
+ * @param {import("../view/view.js").default} viewRoot
12
+ * @param {import("../data/dataFlow.js").default} dataFlow
13
+ * @param {import("../fonts/bmFontManager.js").default} fontManager
14
+ * @param {(dataFlow: import("../data/dataFlow.js").default) => void} onDataFlowBuilt
15
+ * @returns {Promise<import("../data/dataFlow.js").default>}
16
+ */
17
+ export async function initializeViewData(
18
+ viewRoot,
19
+ dataFlow,
20
+ fontManager,
21
+ onDataFlowBuilt
22
+ ) {
23
+ const { dataFlow: builtDataFlow, graphicsPromises } = initializeViewSubtree(
24
+ viewRoot,
25
+ dataFlow
26
+ );
27
+ onDataFlowBuilt(builtDataFlow);
28
+
29
+ // Have to wait until asynchronous font loading is complete.
30
+ // Text mark's geometry builder needs font metrics before data can be
31
+ // converted into geometries.
32
+ // TODO: Make updateGraphicsData async and await font loading there.
33
+ await fontManager.waitUntilReady();
34
+
35
+ // Find all data sources and initiate loading.
36
+ await loadViewSubtreeData(viewRoot, new Set(builtDataFlow.dataSources));
37
+
38
+ await finalizeSubtreeGraphics(graphicsPromises);
39
+
40
+ return builtDataFlow;
41
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @param {import("../view/view.js").default} viewRoot
3
+ */
4
+ export function configureViewHierarchy(viewRoot: import("../view/view.js").default): void;
5
+ /**
6
+ * Configures view opacity after scale/axis resolution has stabilized.
7
+ *
8
+ * NOTE: This is a separate pass because dynamic opacity needs resolved scales.
9
+ * If we end up with more post-resolve work, consider a post-resolve thunk queue.
10
+ *
11
+ * @param {import("../view/view.js").default} viewRoot
12
+ */
13
+ export function configureViewOpacity(viewRoot: import("../view/view.js").default): void;
14
+ //# sourceMappingURL=viewHierarchyConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewHierarchyConfig.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewHierarchyConfig.js"],"names":[],"mappings":"AAKA;;GAEG;AACH,iDAFW,OAAO,iBAAiB,EAAE,OAAO,QAK3C;AAED;;;;;;;GAOG;AACH,+CAFW,OAAO,iBAAiB,EAAE,OAAO,QAI3C"}
@@ -0,0 +1,24 @@
1
+ import {
2
+ checkForDuplicateScaleNames,
3
+ setImplicitScaleNames,
4
+ } from "../view/viewUtils.js";
5
+
6
+ /**
7
+ * @param {import("../view/view.js").default} viewRoot
8
+ */
9
+ export function configureViewHierarchy(viewRoot) {
10
+ checkForDuplicateScaleNames(viewRoot);
11
+ setImplicitScaleNames(viewRoot);
12
+ }
13
+
14
+ /**
15
+ * Configures view opacity after scale/axis resolution has stabilized.
16
+ *
17
+ * NOTE: This is a separate pass because dynamic opacity needs resolved scales.
18
+ * If we end up with more post-resolve work, consider a post-resolve thunk queue.
19
+ *
20
+ * @param {import("../view/view.js").default} viewRoot
21
+ */
22
+ export function configureViewOpacity(viewRoot) {
23
+ viewRoot.getDescendants().forEach((view) => view.configureViewOpacity());
24
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @param {HTMLElement} container
3
+ */
4
+ export function createViewHighlighter(container: HTMLElement): (view: import("../view/view.js").default | null) => void;
5
+ //# sourceMappingURL=viewHighlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewHighlight.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewHighlight.js"],"names":[],"mappings":"AAAA;;GAEG;AACH,iDAFW,WAAW,IAMV,MAFG,OAAO,iBAAiB,EAAE,OAAO,GAAG,IAEnC,UAsBf"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @param {HTMLElement} container
3
+ */
4
+ export function createViewHighlighter(container) {
5
+ /**
6
+ * @param {import("../view/view.js").default | null} view
7
+ */
8
+ return (view) => {
9
+ container.querySelector(".view-highlight")?.remove();
10
+ if (view) {
11
+ if (!view.isConfiguredVisible()) {
12
+ return;
13
+ }
14
+ const coords = view.coords;
15
+ if (coords) {
16
+ const div = document.createElement("div");
17
+ div.className = "view-highlight";
18
+ div.style.position = "absolute";
19
+ div.style.left = coords.x + "px";
20
+ div.style.top = coords.y + "px";
21
+ div.style.width = coords.width + "px";
22
+ div.style.height = coords.height + "px";
23
+ div.style.border = "1px solid green";
24
+ div.style.backgroundColor = "rgba(0, 255, 0, 0.1)";
25
+ div.style.pointerEvents = "none";
26
+ container.appendChild(div);
27
+ }
28
+ }
29
+ };
30
+ }
@@ -14,8 +14,6 @@ export default class GenomeSpy {
14
14
  constructor(container: HTMLElement, spec: import("./spec/root.js").RootSpec, options?: import("./types/embedApi.js").EmbedOptions);
15
15
  container: HTMLElement;
16
16
  options: import("./types/embedApi.js").EmbedOptions;
17
- /** @type {(() => void)[]} */
18
- _destructionCallbacks: (() => void)[];
19
17
  /** Root level configuration object */
20
18
  spec: import("./spec/root.js").RootSpec;
21
19
  viewFactory: ViewFactory;
@@ -31,59 +29,10 @@ export default class GenomeSpy {
31
29
  * @type {(view: View) => boolean}
32
30
  */
33
31
  viewVisibilityPredicate: (view: import("./view/view.js").default) => boolean;
34
- /** @type {BufferedViewRenderingContext} */
35
- _renderingContext: BufferedViewRenderingContext;
36
- /** @type {BufferedViewRenderingContext} */
37
- _pickingContext: BufferedViewRenderingContext;
38
- /** Does picking buffer need to be rendered again */
39
- _dirtyPickingBuffer: boolean;
40
- /**
41
- * Currently hovered mark and datum
42
- * @type {{ mark: import("./marks/mark.js").default, datum: import("./data/flowNode.js").Datum, uniqueId: number }}
43
- */
44
- _currentHover: {
45
- mark: import("./marks/mark.js").default;
46
- datum: import("./data/flowNode.js").Datum;
47
- uniqueId: number;
48
- };
49
- _wheelInertia: Inertia;
50
- /**
51
- * Keeping track so that these can be cleaned up upon finalization.
52
- * @type {Map<string, (function(KeyboardEvent):void)[]>}
53
- */
54
- _keyboardListeners: Map<string, ((arg0: KeyboardEvent) => void)[]>;
55
- /**
56
- * Listers for exposed high-level events such as click on a mark instance.
57
- * These should probably be in the View class and support bubbling through
58
- * the hierarchy.
59
- *
60
- * @type {Map<string, Set<(event: any) => void>>}
61
- */
62
- _eventListeners: Map<string, Set<(event: any) => void>>;
63
- /**
64
- *
65
- * @type {Map<string, Set<(event: any) => void>>}
66
- */
67
- _extraBroadcastListeners: Map<string, Set<(event: any) => void>>;
68
32
  /** @type {Record<string, import("./tooltip/tooltipHandler.js").TooltipHandler>}> */
69
33
  tooltipHandlers: Record<string, import("./tooltip/tooltipHandler.js").TooltipHandler>;
70
34
  /** @type {View} */
71
35
  viewRoot: import("./view/view.js").default;
72
- /**
73
- * Views that are currently loading data using lazy sources.
74
- *
75
- * @type {Map<View, { status: import("./types/viewContext.js").DataLoadingStatus, detail?: string }>}
76
- */
77
- _loadingViews: Map<import("./view/view.js").default, {
78
- status: import("./types/viewContext.js").DataLoadingStatus;
79
- detail?: string;
80
- }>;
81
- /**
82
- * @type {HTMLElement}
83
- */
84
- _inputBindingContainer: HTMLElement;
85
- /** @type {Point} */
86
- _mouseDownCoords: Point;
87
36
  dpr: number;
88
37
  /**
89
38
  *
@@ -100,6 +49,16 @@ export default class GenomeSpy {
100
49
  * @param {any[]} data
101
50
  */
102
51
  updateNamedData(name: string, data: any[]): void;
52
+ /**
53
+ * @param {string} type
54
+ * @param {(event: any) => void} listener
55
+ */
56
+ addEventListener(type: string, listener: (event: any) => void): void;
57
+ /**
58
+ * @param {string} type
59
+ * @param {(event: any) => void} listener
60
+ */
61
+ removeEventListener(type: string, listener: (event: any) => void): void;
103
62
  /**
104
63
  * Broadcast a message to all views
105
64
 
@@ -107,32 +66,19 @@ export default class GenomeSpy {
107
66
  * @param {any} [payload]
108
67
  */
109
68
  broadcast(type: BroadcastEventType, payload?: any): void;
110
- /**
111
- * Draw some layers on top of the canvas. It's easier to do fancy spinning
112
- * animations with html elements than with WebGL.
113
- */
114
- _updateLoadingIndicators(): void;
115
- _glHelper: WebGLHelper;
116
69
  loadingMessageElement: HTMLElement;
117
70
  loadingIndicatorsElement: HTMLElement;
118
- tooltip: Tooltip;
71
+ tooltip: import("./utils/ui/tooltip.js").default;
119
72
  /**
120
73
  * Unregisters all listeners, removes all created dom elements, removes all css classes from the container
121
74
  */
122
75
  destroy(): void;
123
- _prepareViewsAndData(): Promise<void>;
124
76
  /**
125
77
  * TODO: Come up with a sensible name. And maybe this should be called at the end of the constructor.
126
78
  * @returns {Promise<boolean>} true if the launch was successful
127
79
  */
128
80
  launch(): Promise<boolean>;
129
81
  registerMouseEvents(): void;
130
- _tooltipUpdateRequested: boolean;
131
- /**
132
- * @param {number} x
133
- * @param {number} y
134
- */
135
- _handlePicking(x: number, y: number): void;
136
82
  /**
137
83
  * This method should be called in a mouseMove handler. If not called, the
138
84
  * tooltip will be hidden.
@@ -152,24 +98,23 @@ export default class GenomeSpy {
152
98
  * @returns A PNG data Url
153
99
  */
154
100
  exportCanvas(logicalWidth?: number, logicalHeight?: number, devicePixelRatio?: number, clearColor?: string): string;
101
+ getLogicalCanvasSize(): {
102
+ width: any;
103
+ height: any;
104
+ };
155
105
  computeLayout(): void;
156
106
  renderAll(): void;
157
107
  renderPickingFramebuffer(): void;
158
108
  getSearchableViews(): UnitView[];
159
- getNamedScaleResolutions(): Map<string, import("./view/scaleResolution.js").default>;
109
+ getNamedScaleResolutions(): Map<string, import("./scales/scaleResolution.js").default>;
160
110
  #private;
161
111
  }
162
112
  /**
163
113
  * Events that are broadcasted to all views.
164
114
  */
165
- export type BroadcastEventType = "dataFlowBuilt" | "dataLoaded" | "layout" | "layoutComputed";
115
+ export type BroadcastEventType = "dataFlowBuilt" | "layout" | "layoutComputed" | "subtreeDataReady";
166
116
  import { ViewFactory } from "./view/viewFactory.js";
167
117
  import Animator from "./utils/animator.js";
168
118
  import GenomeStore from "./genome/genomeStore.js";
169
- import BufferedViewRenderingContext from "./view/renderingContext/bufferedViewRenderingContext.js";
170
- import Inertia from "./utils/inertia.js";
171
- import Point from "./view/layout/point.js";
172
- import WebGLHelper from "./gl/webGLHelper.js";
173
- import Tooltip from "./utils/ui/tooltip.js";
174
119
  import UnitView from "./view/unitView.js";
175
120
  //# sourceMappingURL=genomeSpy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA0CA;IAkBI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA0CpD;IAvCG,uBAA0B;IAC1B,oDAAsB;IAItB,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,CAAC,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,yBAFU,CAAC,IAAI,kCAAM,KAAK,OAAO,CAE8B;IAE/D,oFAAoF;IACpF,iBADW,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAIzB,YAAkC;IAatC;;;OAGG;IACH,oCAFW,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAYf;IAED;;;OAGG;IACH,uBAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;OAGG;IACH,0BAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAMb;IAiEG,mCAAkD;IAKlD,sCAAwD;IACxD,iDAAsB;IAM1B;;OAEG;IACH,gBAmBC;IA8ID;;;OAGG;IACH,UAFa,OAAO,CAAC,OAAO,CAAC,CAgC5B;IAED,4BAEC;IAED;;;;;;;OAOG;IACH,cAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAKlF;IAED;;;;;;;;OAQG;IACH,4BANW,MAAM,kBACN,MAAM,qBACN,MAAM,eACN,MAAM,UAuBhB;IAED;;;MAEC;IAED,sBAEC;IAED,kBAEC;IAED,iCAEC;IAED,iCASC;IAED,uFAWC;;CACJ;;;;iCAlgBY,eAAe,GAAG,QAAQ,GAAG,gBAAgB,GAAG,kBAAkB;4BAZnC,uBAAuB;qBAR9C,qBAAqB;wBAElB,yBAAyB;qBAL5B,oBAAoB"}