@genome-spy/core 0.67.0 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/dist/bundle/index.es.js +15884 -13130
  2. package/dist/bundle/index.js +130 -149
  3. package/dist/schema.json +6498 -6191
  4. package/dist/src/data/collector.d.ts +20 -0
  5. package/dist/src/data/collector.d.ts.map +1 -1
  6. package/dist/src/data/collector.js +148 -0
  7. package/dist/src/data/dataFlow.d.ts +6 -0
  8. package/dist/src/data/dataFlow.d.ts.map +1 -1
  9. package/dist/src/data/dataFlow.js +20 -0
  10. package/dist/src/data/flowInit.d.ts.map +1 -1
  11. package/dist/src/data/flowInit.js +2 -3
  12. package/dist/src/data/flowNode.d.ts +33 -10
  13. package/dist/src/data/flowNode.d.ts.map +1 -1
  14. package/dist/src/data/flowNode.js +84 -13
  15. package/dist/src/data/flowTestUtils.d.ts +2 -2
  16. package/dist/src/data/flowTestUtils.d.ts.map +1 -1
  17. package/dist/src/data/flowTestUtils.js +5 -4
  18. package/dist/src/data/keyIndex.d.ts +18 -0
  19. package/dist/src/data/keyIndex.d.ts.map +1 -0
  20. package/dist/src/data/keyIndex.js +241 -0
  21. package/dist/src/data/keyIndex.test.d.ts +2 -0
  22. package/dist/src/data/keyIndex.test.d.ts.map +1 -0
  23. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  24. package/dist/src/data/sources/dataSource.js +7 -3
  25. package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
  26. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  27. package/dist/src/data/sources/dataSourceFactory.js +52 -16
  28. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  29. package/dist/src/data/sources/lazy/bigBedSource.js +11 -10
  30. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/lazy/bigWigSource.js +11 -10
  32. package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
  33. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
  34. package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
  35. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
  36. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  37. package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
  38. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  39. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +16 -1
  40. package/dist/src/data/sources/lazy/tabixSource.d.ts +0 -1
  41. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  42. package/dist/src/data/sources/lazy/tabixSource.js +56 -16
  43. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  44. package/dist/src/data/sources/sequenceSource.js +5 -3
  45. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  46. package/dist/src/data/sources/urlSource.js +7 -3
  47. package/dist/src/data/transforms/filter.d.ts +4 -4
  48. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  49. package/dist/src/data/transforms/filter.js +13 -7
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.js +11 -6
  52. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +2 -0
  53. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +1 -0
  54. package/dist/src/data/transforms/formula.d.ts +4 -4
  55. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  56. package/dist/src/data/transforms/formula.js +12 -6
  57. package/dist/src/data/transforms/measureText.d.ts +2 -2
  58. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  59. package/dist/src/data/transforms/measureText.js +16 -12
  60. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  61. package/dist/src/data/transforms/stack.js +1 -0
  62. package/dist/src/data/transforms/transform.d.ts +2 -2
  63. package/dist/src/data/transforms/transform.d.ts.map +1 -1
  64. package/dist/src/data/transforms/transform.js +3 -3
  65. package/dist/src/encoder/accessor.d.ts +51 -4
  66. package/dist/src/encoder/accessor.d.ts.map +1 -1
  67. package/dist/src/encoder/accessor.js +174 -10
  68. package/dist/src/encoder/encoder.d.ts +11 -2
  69. package/dist/src/encoder/encoder.d.ts.map +1 -1
  70. package/dist/src/encoder/encoder.js +29 -9
  71. package/dist/src/encoder/metadataChannels.d.ts +15 -0
  72. package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
  73. package/dist/src/encoder/metadataChannels.js +65 -0
  74. package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
  75. package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
  76. package/dist/src/genome/genome.d.ts +8 -0
  77. package/dist/src/genome/genome.d.ts.map +1 -1
  78. package/dist/src/genome/genome.js +16 -1
  79. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  80. package/dist/src/genome/scaleLocus.js +14 -1
  81. package/dist/src/genomeSpy/containerUi.d.ts +0 -1
  82. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  83. package/dist/src/genomeSpy/containerUi.js +0 -14
  84. package/dist/src/genomeSpy/inputBindingManager.js +1 -1
  85. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  86. package/dist/src/genomeSpy/interactionController.js +7 -1
  87. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
  88. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
  89. package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
  90. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
  91. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
  92. package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
  93. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  94. package/dist/src/genomeSpy/viewContextFactory.js +0 -1
  95. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  96. package/dist/src/genomeSpy/viewDataInit.js +56 -11
  97. package/dist/src/genomeSpy.d.ts +0 -2
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +47 -27
  100. package/dist/src/gl/glslScaleGenerator.js +1 -1
  101. package/dist/src/marks/mark.d.ts.map +1 -1
  102. package/dist/src/marks/mark.js +40 -41
  103. package/dist/src/marks/markUtils.js +1 -1
  104. package/dist/src/marks/point.d.ts.map +1 -1
  105. package/dist/src/marks/point.js +4 -6
  106. package/dist/src/paramRuntime/expressionCompiler.d.ts +7 -0
  107. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -0
  108. package/dist/src/paramRuntime/expressionCompiler.js +10 -0
  109. package/dist/src/paramRuntime/expressionRef.d.ts +20 -0
  110. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -0
  111. package/dist/src/paramRuntime/expressionRef.js +95 -0
  112. package/dist/src/paramRuntime/expressionRef.test.d.ts +2 -0
  113. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +1 -0
  114. package/dist/src/paramRuntime/graphRuntime.d.ts +176 -0
  115. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -0
  116. package/dist/src/paramRuntime/graphRuntime.js +628 -0
  117. package/dist/src/paramRuntime/graphRuntime.test.d.ts +2 -0
  118. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +1 -0
  119. package/dist/src/paramRuntime/index.d.ts +9 -0
  120. package/dist/src/paramRuntime/index.d.ts.map +1 -0
  121. package/dist/src/paramRuntime/index.js +8 -0
  122. package/dist/src/paramRuntime/lifecycleRegistry.d.ts +27 -0
  123. package/dist/src/paramRuntime/lifecycleRegistry.d.ts.map +1 -0
  124. package/dist/src/paramRuntime/lifecycleRegistry.js +54 -0
  125. package/dist/src/paramRuntime/paramRuntime.d.ts +165 -0
  126. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -0
  127. package/dist/src/paramRuntime/paramRuntime.js +222 -0
  128. package/dist/src/paramRuntime/paramRuntime.test.d.ts +2 -0
  129. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +1 -0
  130. package/dist/src/paramRuntime/paramStore.d.ts +68 -0
  131. package/dist/src/paramRuntime/paramStore.d.ts.map +1 -0
  132. package/dist/src/paramRuntime/paramStore.js +148 -0
  133. package/dist/src/paramRuntime/paramStore.test.d.ts +2 -0
  134. package/dist/src/paramRuntime/paramStore.test.d.ts.map +1 -0
  135. package/dist/src/paramRuntime/paramUtils.d.ts +86 -0
  136. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -0
  137. package/dist/src/paramRuntime/paramUtils.js +272 -0
  138. package/dist/src/paramRuntime/selectionStore.d.ts +6 -0
  139. package/dist/src/paramRuntime/selectionStore.d.ts.map +1 -0
  140. package/dist/src/paramRuntime/selectionStore.js +13 -0
  141. package/dist/src/paramRuntime/types.d.ts +16 -0
  142. package/dist/src/paramRuntime/types.d.ts.map +1 -0
  143. package/dist/src/paramRuntime/types.js +25 -0
  144. package/dist/src/paramRuntime/viewParamRuntime.d.ts +164 -0
  145. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -0
  146. package/dist/src/paramRuntime/viewParamRuntime.js +443 -0
  147. package/dist/src/scale/scale.d.ts +6 -1
  148. package/dist/src/scale/scale.d.ts.map +1 -1
  149. package/dist/src/scale/scale.js +83 -23
  150. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  151. package/dist/src/scales/axisResolution.js +10 -0
  152. package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
  153. package/dist/src/scales/domainPlanner.d.ts.map +1 -0
  154. package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
  155. package/dist/src/scales/domainPlanner.test.d.ts +2 -0
  156. package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
  157. package/dist/src/scales/scaleInstanceManager.d.ts +6 -3
  158. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  159. package/dist/src/scales/scaleInstanceManager.js +17 -11
  160. package/dist/src/scales/scaleInteractionController.d.ts +6 -0
  161. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  162. package/dist/src/scales/scaleInteractionController.js +41 -3
  163. package/dist/src/scales/scaleResolution.d.ts +20 -17
  164. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  165. package/dist/src/scales/scaleResolution.js +188 -71
  166. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
  167. package/dist/src/selection/selection.d.ts +21 -0
  168. package/dist/src/selection/selection.d.ts.map +1 -1
  169. package/dist/src/selection/selection.js +83 -1
  170. package/dist/src/spec/channel.d.ts +52 -15
  171. package/dist/src/spec/coreSchemaRoot.d.ts +53 -0
  172. package/dist/src/spec/data.d.ts +4 -0
  173. package/dist/src/spec/parameter.d.ts +16 -11
  174. package/dist/src/spec/root.d.ts +1 -1
  175. package/dist/src/spec/testing.d.ts +12 -0
  176. package/dist/src/spec/testing.d.ts.map +1 -0
  177. package/dist/src/spec/testing.js +20 -0
  178. package/dist/src/spec/view.d.ts +157 -41
  179. package/dist/src/styles/genome-spy.css +3 -31
  180. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  181. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  182. package/dist/src/styles/genome-spy.css.js +0 -29
  183. package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
  184. package/dist/src/tooltip/dataTooltipHandler.js +23 -32
  185. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +2 -0
  186. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +1 -0
  187. package/dist/src/tooltip/flattenDatumRows.d.ts +13 -0
  188. package/dist/src/tooltip/flattenDatumRows.d.ts.map +1 -0
  189. package/dist/src/tooltip/flattenDatumRows.js +47 -0
  190. package/dist/src/tooltip/flattenDatumRows.test.d.ts +2 -0
  191. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +1 -0
  192. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
  193. package/dist/src/tooltip/refseqGeneTooltipHandler.js +7 -1
  194. package/dist/src/tooltip/tooltipContext.d.ts +13 -0
  195. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -0
  196. package/dist/src/tooltip/tooltipContext.js +543 -0
  197. package/dist/src/tooltip/tooltipContext.test.d.ts +2 -0
  198. package/dist/src/tooltip/tooltipContext.test.d.ts.map +1 -0
  199. package/dist/src/tooltip/tooltipHandler.d.ts +40 -1
  200. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -1
  201. package/dist/src/tooltip/tooltipHandler.ts +62 -1
  202. package/dist/src/types/encoder.d.ts +38 -3
  203. package/dist/src/types/rendering.d.ts +4 -3
  204. package/dist/src/types/viewContext.d.ts +0 -14
  205. package/dist/src/utils/inputBinding.d.ts +10 -2
  206. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  207. package/dist/src/utils/inputBinding.js +12 -3
  208. package/dist/src/utils/throttle.d.ts +4 -1
  209. package/dist/src/utils/throttle.d.ts.map +1 -1
  210. package/dist/src/utils/throttle.js +54 -23
  211. package/dist/src/utils/throttle.test.d.ts +2 -0
  212. package/dist/src/utils/throttle.test.d.ts.map +1 -0
  213. package/dist/src/utils/transition.d.ts +21 -0
  214. package/dist/src/utils/transition.d.ts.map +1 -1
  215. package/dist/src/utils/transition.js +28 -0
  216. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  217. package/dist/src/utils/ui/tooltip.js +7 -1
  218. package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
  219. package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
  220. package/dist/src/view/axisGridView.d.ts.map +1 -1
  221. package/dist/src/view/axisGridView.js +22 -5
  222. package/dist/src/view/axisView.d.ts.map +1 -1
  223. package/dist/src/view/axisView.js +20 -5
  224. package/dist/src/view/concatView.js +3 -3
  225. package/dist/src/view/containerMutationHelper.js +1 -1
  226. package/dist/src/view/containerView.d.ts +9 -5
  227. package/dist/src/view/containerView.d.ts.map +1 -1
  228. package/dist/src/view/containerView.js +34 -9
  229. package/dist/src/view/dataReadiness.d.ts +46 -0
  230. package/dist/src/view/dataReadiness.d.ts.map +1 -0
  231. package/dist/src/view/dataReadiness.js +267 -0
  232. package/dist/src/view/dataReadiness.test.d.ts +2 -0
  233. package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
  234. package/dist/src/view/facetView.d.ts.map +1 -1
  235. package/dist/src/view/facetView.js +7 -5
  236. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  237. package/dist/src/view/flowBuilder.js +17 -4
  238. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  239. package/dist/src/view/gridView/gridChild.js +16 -3
  240. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  241. package/dist/src/view/gridView/gridView.js +119 -2
  242. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  243. package/dist/src/view/gridView/scrollbar.js +3 -0
  244. package/dist/src/view/gridView/selectionRect.d.ts +6 -10
  245. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  246. package/dist/src/view/gridView/selectionRect.js +22 -24
  247. package/dist/src/view/gridView/separatorView.d.ts +51 -0
  248. package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
  249. package/dist/src/view/gridView/separatorView.js +275 -0
  250. package/dist/src/view/layerView.d.ts.map +1 -1
  251. package/dist/src/view/layerView.js +7 -5
  252. package/dist/src/view/layout/flexLayout.d.ts +0 -30
  253. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  254. package/dist/src/view/layout/flexLayout.js +0 -86
  255. package/dist/src/view/multiscale.d.ts +35 -0
  256. package/dist/src/view/multiscale.d.ts.map +1 -0
  257. package/dist/src/view/multiscale.js +233 -0
  258. package/dist/src/view/multiscale.test.d.ts +2 -0
  259. package/dist/src/view/multiscale.test.d.ts.map +1 -0
  260. package/dist/src/view/testUtils.d.ts.map +1 -1
  261. package/dist/src/view/testUtils.js +6 -1
  262. package/dist/src/view/unitView.d.ts +8 -13
  263. package/dist/src/view/unitView.d.ts.map +1 -1
  264. package/dist/src/view/unitView.js +120 -45
  265. package/dist/src/view/view.d.ts +27 -18
  266. package/dist/src/view/view.d.ts.map +1 -1
  267. package/dist/src/view/view.js +298 -37
  268. package/dist/src/view/viewFactory.d.ts +0 -12
  269. package/dist/src/view/viewFactory.d.ts.map +1 -1
  270. package/dist/src/view/viewFactory.js +55 -25
  271. package/dist/src/view/viewParamRuntime.test.d.ts +2 -0
  272. package/dist/src/view/viewParamRuntime.test.d.ts.map +1 -0
  273. package/dist/src/view/viewSelectors.d.ts +148 -0
  274. package/dist/src/view/viewSelectors.d.ts.map +1 -0
  275. package/dist/src/view/viewSelectors.js +776 -0
  276. package/dist/src/view/viewSelectors.test.d.ts +2 -0
  277. package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
  278. package/dist/src/view/viewUtils.d.ts +0 -8
  279. package/dist/src/view/viewUtils.d.ts.map +1 -1
  280. package/dist/src/view/viewUtils.js +1 -21
  281. package/package.json +4 -4
  282. package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
  283. package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
  284. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
  285. package/dist/src/spec/sampleView.d.ts +0 -197
  286. package/dist/src/view/paramMediator.d.ts +0 -149
  287. package/dist/src/view/paramMediator.d.ts.map +0 -1
  288. package/dist/src/view/paramMediator.js +0 -478
  289. package/dist/src/view/paramMediator.test.d.ts +0 -2
  290. package/dist/src/view/paramMediator.test.d.ts.map +0 -1
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @typedef {import("./tooltipHandler.js").TooltipRow} TooltipRow
3
+ */
4
+ /**
5
+ * Flattens an object into tooltip rows using dot-separated keys.
6
+ * Keys starting with "_" are omitted.
7
+ *
8
+ * @param {Record<string, any>} datum
9
+ * @returns {TooltipRow[]}
10
+ */
11
+ export function flattenDatumRows(datum: Record<string, any>): TooltipRow[];
12
+ export type TooltipRow = import("./tooltipHandler.js").TooltipRow;
13
+ //# sourceMappingURL=flattenDatumRows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenDatumRows.d.ts","sourceRoot":"","sources":["../../../src/tooltip/flattenDatumRows.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;GAMG;AACH,wCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,UAAU,EAAE,CAOxB;yBAfY,OAAO,qBAAqB,EAAE,UAAU"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @typedef {import("./tooltipHandler.js").TooltipRow} TooltipRow
3
+ */
4
+
5
+ /**
6
+ * Flattens an object into tooltip rows using dot-separated keys.
7
+ * Keys starting with "_" are omitted.
8
+ *
9
+ * @param {Record<string, any>} datum
10
+ * @returns {TooltipRow[]}
11
+ */
12
+ export function flattenDatumRows(datum) {
13
+ /** @type {TooltipRow[]} */
14
+ const rows = [];
15
+ collectRows(Object.entries(datum), rows);
16
+ return rows;
17
+ }
18
+
19
+ /**
20
+ * @param {[string, any][]} entries
21
+ * @param {TooltipRow[]} output
22
+ * @param {string} [prefix]
23
+ */
24
+ function collectRows(entries, output, prefix) {
25
+ for (const [key, value] of entries) {
26
+ if (key.startsWith("_")) {
27
+ continue;
28
+ }
29
+
30
+ if (
31
+ value !== null &&
32
+ typeof value === "object" &&
33
+ !Array.isArray(value)
34
+ ) {
35
+ collectRows(
36
+ Object.entries(value),
37
+ output,
38
+ (prefix ? prefix : "") + key + "."
39
+ );
40
+ } else {
41
+ output.push({
42
+ key: (prefix ? prefix : "") + key,
43
+ value: value,
44
+ });
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=flattenDatumRows.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenDatumRows.test.d.ts","sourceRoot":"","sources":["../../../src/tooltip/flattenDatumRows.test.js"],"names":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- export default function refseqGeneTooltipHandler(datum: Record<string, any>, mark: import("../marks/mark.js").default, params?: Record<string, any>): Promise<string | import("lit-html").TemplateResult | HTMLElement>;
1
+ export default function refseqGeneTooltipHandler(datum: Record<string, any>, mark: import("../marks/mark.js").default, params?: import("./tooltipHandler.js").TooltipHandlerParams, context?: import("./tooltipHandler.js").TooltipContext): Promise<string | import("lit-html").TemplateResult | HTMLElement>;
2
2
  //# sourceMappingURL=refseqGeneTooltipHandler.d.ts.map
@@ -23,12 +23,18 @@ export default async function refseqGeneTooltipHandler(
23
23
  ) {
24
24
  const symbol = datum.symbol;
25
25
 
26
+ /** @type {Record<string, string>} */
26
27
  const term = {
27
28
  ...defaultParams,
28
- ...params,
29
29
  GENE: symbol,
30
30
  };
31
31
 
32
+ for (const [key, value] of Object.entries(params)) {
33
+ if (typeof value === "string") {
34
+ term[key] = value;
35
+ }
36
+ }
37
+
32
38
  let summary =
33
39
  symbolSummaryCache.get(symbol) ??
34
40
  (await debouncedFetchGeneSummary(term));
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Creates a stable context object for tooltip handlers.
3
+ *
4
+ * @param {Record<string, any>} datum
5
+ * @param {import("../marks/mark.js").default} mark
6
+ * @param {import("./tooltipHandler.js").TooltipHandlerParams} [params]
7
+ * @returns {TooltipContext}
8
+ */
9
+ export default function createTooltipContext(datum: Record<string, any>, mark: import("../marks/mark.js").default, params?: import("./tooltipHandler.js").TooltipHandlerParams): TooltipContext;
10
+ export type TooltipContext = import("./tooltipHandler.js").TooltipContext;
11
+ export type TooltipGenomicDisplayMode = import("./tooltipHandler.js").TooltipGenomicDisplayMode;
12
+ export type TooltipRow = import("./tooltipHandler.js").TooltipRow;
13
+ //# sourceMappingURL=tooltipContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltipContext.d.ts","sourceRoot":"","sources":["../../../src/tooltip/tooltipContext.js"],"names":[],"mappings":"AA2BA;;;;;;;GAOG;AACH,oDALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,OAAO,kBAAkB,EAAE,OAAO,WAClC,OAAO,qBAAqB,EAAE,oBAAoB,GAChD,cAAc,CAgE1B;6BAhGY,OAAO,qBAAqB,EAAE,cAAc;wCAC5C,OAAO,qBAAqB,EAAE,yBAAyB;yBACvD,OAAO,qBAAqB,EAAE,UAAU"}
@@ -0,0 +1,543 @@
1
+ /**
2
+ * @typedef {import("./tooltipHandler.js").TooltipContext} TooltipContext
3
+ * @typedef {import("./tooltipHandler.js").TooltipGenomicDisplayMode} TooltipGenomicDisplayMode
4
+ * @typedef {import("./tooltipHandler.js").TooltipRow} TooltipRow
5
+ */
6
+
7
+ import { asArray } from "../utils/arrayUtils.js";
8
+ import { flattenDatumRows } from "./flattenDatumRows.js";
9
+
10
+ /** @type {Record<"x" | "y", "x2" | "y2">} */
11
+ const SECONDARY_AXIS = {
12
+ x: "x2",
13
+ y: "y2",
14
+ };
15
+
16
+ /** @type {Set<string>} */
17
+ const GENOMIC_MODES = new Set([
18
+ "auto",
19
+ "locus",
20
+ "interval",
21
+ "endpoints",
22
+ "disabled",
23
+ ]);
24
+
25
+ /** @type {WeakMap<object, Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>>} */
26
+ const linearizationMappingCache = new WeakMap();
27
+
28
+ /**
29
+ * Creates a stable context object for tooltip handlers.
30
+ *
31
+ * @param {Record<string, any>} datum
32
+ * @param {import("../marks/mark.js").default} mark
33
+ * @param {import("./tooltipHandler.js").TooltipHandlerParams} [params]
34
+ * @returns {TooltipContext}
35
+ */
36
+ export default function createTooltipContext(datum, mark, params) {
37
+ const mappingByLinearizedField = getLinearizationMappings(mark);
38
+
39
+ const xGenomic = buildGenomicRowsForAxis(
40
+ "x",
41
+ datum,
42
+ mark,
43
+ mappingByLinearizedField,
44
+ getConfiguredMode(params, "x")
45
+ );
46
+ const yGenomic = buildGenomicRowsForAxis(
47
+ "y",
48
+ datum,
49
+ mark,
50
+ mappingByLinearizedField,
51
+ getConfiguredMode(params, "y")
52
+ );
53
+
54
+ const useAxisPrefixes =
55
+ xGenomic.rows.length > 0 && yGenomic.rows.length > 0;
56
+
57
+ /** @type {TooltipRow[]} */
58
+ const genomicRows = [
59
+ ...(useAxisPrefixes
60
+ ? prefixGenomicRows("x", xGenomic.rows)
61
+ : xGenomic.rows),
62
+ ...(useAxisPrefixes
63
+ ? prefixGenomicRows("y", yGenomic.rows)
64
+ : yGenomic.rows),
65
+ ];
66
+
67
+ /** @type {Set<string>} */
68
+ const hiddenRowKeys = new Set();
69
+ for (const axisGenomic of [xGenomic, yGenomic]) {
70
+ for (const field of axisGenomic.usedLinearizedFields) {
71
+ const mapping = mappingByLinearizedField.get(field);
72
+ if (!mapping || mapping.ambiguous) {
73
+ continue;
74
+ }
75
+
76
+ const verified = verifyLinearizationMapping(
77
+ datum,
78
+ field,
79
+ mapping,
80
+ mark
81
+ );
82
+ if (verified) {
83
+ hiddenRowKeys.add(mapping.chrom);
84
+ hiddenRowKeys.add(mapping.pos);
85
+ }
86
+ }
87
+ }
88
+
89
+ return {
90
+ hiddenRowKeys: [...hiddenRowKeys],
91
+ genomicRows,
92
+ flattenDatumRows: () => flattenDatumRows(datum),
93
+ formatGenomicLocus: (axis, continuousPos) =>
94
+ formatGenomicLocus(mark, axis, continuousPos),
95
+ formatGenomicInterval: (axis, interval) =>
96
+ formatGenomicInterval(mark, axis, interval),
97
+ };
98
+ }
99
+
100
+ /**
101
+ * @param {import("../marks/mark.js").default} mark
102
+ * @returns {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>}
103
+ */
104
+ function getLinearizationMappings(mark) {
105
+ const cached = linearizationMappingCache.get(mark);
106
+ if (cached) {
107
+ return cached;
108
+ }
109
+
110
+ const collected = collectLinearizationMappings(mark);
111
+ linearizationMappingCache.set(mark, collected);
112
+ return collected;
113
+ }
114
+
115
+ /**
116
+ * @param {"x" | "y"} axis
117
+ * @param {TooltipRow[]} rows
118
+ * @returns {TooltipRow[]}
119
+ */
120
+ function prefixGenomicRows(axis, rows) {
121
+ const axisPrefix = axis.toUpperCase() + " ";
122
+ return rows.map((row) => ({
123
+ key: axisPrefix + row.key,
124
+ value: row.value,
125
+ }));
126
+ }
127
+
128
+ /**
129
+ * @param {"x" | "y"} axis
130
+ * @param {Record<string, any>} datum
131
+ * @param {import("../marks/mark.js").default} mark
132
+ * @param {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} mappingByLinearizedField
133
+ * @param {TooltipGenomicDisplayMode} mode
134
+ * @returns {{ rows: TooltipRow[], usedLinearizedFields: Set<string> }}
135
+ */
136
+ function buildGenomicRowsForAxis(
137
+ axis,
138
+ datum,
139
+ mark,
140
+ mappingByLinearizedField,
141
+ mode
142
+ ) {
143
+ /** @type {Set<string>} */
144
+ const usedLinearizedFields = new Set();
145
+
146
+ if (mode === "disabled") {
147
+ return {
148
+ rows: [],
149
+ usedLinearizedFields,
150
+ };
151
+ }
152
+
153
+ const primary = readLocusCoordinate(mark, axis, datum);
154
+ if (!primary) {
155
+ return {
156
+ rows: [],
157
+ usedLinearizedFields,
158
+ };
159
+ }
160
+ if (primary.field) {
161
+ usedLinearizedFields.add(primary.field);
162
+ }
163
+
164
+ const secondary = readLocusCoordinate(mark, SECONDARY_AXIS[axis], datum);
165
+ if (secondary?.field) {
166
+ usedLinearizedFields.add(secondary.field);
167
+ }
168
+
169
+ /** @type {TooltipGenomicDisplayMode} */
170
+ const effectiveMode =
171
+ mode === "auto"
172
+ ? resolveAutoMode(primary, secondary, mappingByLinearizedField)
173
+ : mode;
174
+
175
+ if (effectiveMode === "endpoints" && secondary) {
176
+ const [endpoint1, endpoint2] = orderEndpointsByFieldHints(
177
+ primary,
178
+ secondary,
179
+ mappingByLinearizedField
180
+ );
181
+
182
+ return {
183
+ rows: [
184
+ {
185
+ key: "Endpoint 1",
186
+ value:
187
+ formatGenomicLocus(mark, axis, endpoint1.value) ??
188
+ String(endpoint1.value),
189
+ },
190
+ {
191
+ key: "Endpoint 2",
192
+ value:
193
+ formatGenomicLocus(mark, axis, endpoint2.value) ??
194
+ String(endpoint2.value),
195
+ },
196
+ ],
197
+ usedLinearizedFields,
198
+ };
199
+ }
200
+
201
+ if (effectiveMode === "interval" && secondary) {
202
+ return {
203
+ rows: [
204
+ {
205
+ key: "Interval",
206
+ value:
207
+ formatGenomicInterval(mark, axis, [
208
+ primary.value,
209
+ secondary.value,
210
+ ]) ?? primary.value + " - " + secondary.value,
211
+ },
212
+ ],
213
+ usedLinearizedFields,
214
+ };
215
+ }
216
+
217
+ return {
218
+ rows: [
219
+ {
220
+ key: "Coordinate",
221
+ value:
222
+ formatGenomicLocus(mark, axis, primary.value) ??
223
+ String(primary.value),
224
+ },
225
+ ],
226
+ usedLinearizedFields,
227
+ };
228
+ }
229
+
230
+ /**
231
+ * @param {{ field?: string }} primary
232
+ * @param {{ field?: string } | undefined} secondary
233
+ * @param {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} mappingByLinearizedField
234
+ * @returns {TooltipGenomicDisplayMode}
235
+ */
236
+ function resolveAutoMode(primary, secondary, mappingByLinearizedField) {
237
+ if (!secondary) {
238
+ return "locus";
239
+ }
240
+
241
+ const primaryGroup = getMappingGroup(
242
+ primary.field,
243
+ mappingByLinearizedField
244
+ );
245
+ const secondaryGroup = getMappingGroup(
246
+ secondary.field,
247
+ mappingByLinearizedField
248
+ );
249
+
250
+ if (primaryGroup && secondaryGroup && primaryGroup !== secondaryGroup) {
251
+ return "endpoints";
252
+ }
253
+
254
+ // Default to interval when grouping cannot be inferred.
255
+ return "interval";
256
+ }
257
+
258
+ /**
259
+ * @param {string | undefined} field
260
+ * @param {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} mappingByLinearizedField
261
+ */
262
+ function getMappingGroup(field, mappingByLinearizedField) {
263
+ const mapping = field ? mappingByLinearizedField.get(field) : undefined;
264
+ return mapping && !mapping.ambiguous ? mapping.groupId : undefined;
265
+ }
266
+
267
+ /**
268
+ * Heuristically preserves endpoint numbering from source fields. If one
269
+ * endpoint is recognized as "2" (or the other as "1"), swap display order.
270
+ *
271
+ * @param {{ value: number, field?: string }} primary
272
+ * @param {{ value: number, field?: string }} secondary
273
+ * @param {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} mappingByLinearizedField
274
+ */
275
+ function orderEndpointsByFieldHints(
276
+ primary,
277
+ secondary,
278
+ mappingByLinearizedField
279
+ ) {
280
+ const firstHint = inferEndpointOrdinal(
281
+ primary.field,
282
+ mappingByLinearizedField
283
+ );
284
+ const secondHint = inferEndpointOrdinal(
285
+ secondary.field,
286
+ mappingByLinearizedField
287
+ );
288
+
289
+ if (firstHint === 2 && secondHint !== 2) {
290
+ return [secondary, primary];
291
+ }
292
+
293
+ if (secondHint === 1 && firstHint !== 1) {
294
+ return [secondary, primary];
295
+ }
296
+
297
+ if (firstHint === 2 && secondHint === 1) {
298
+ return [secondary, primary];
299
+ }
300
+
301
+ return [primary, secondary];
302
+ }
303
+
304
+ /**
305
+ * @param {string | undefined} linearizedField
306
+ * @param {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} mappingByLinearizedField
307
+ * @returns {1 | 2 | undefined}
308
+ */
309
+ function inferEndpointOrdinal(linearizedField, mappingByLinearizedField) {
310
+ const mapping = linearizedField
311
+ ? mappingByLinearizedField.get(linearizedField)
312
+ : undefined;
313
+ /** @type {(string | undefined)[]} */
314
+ const candidates = [mapping?.pos, mapping?.chrom, linearizedField];
315
+
316
+ /** @type {1 | 2 | undefined} */
317
+ let ordinal;
318
+ for (const candidate of candidates) {
319
+ const detected = detectEndpointOrdinal(candidate);
320
+ if (detected === undefined) {
321
+ continue;
322
+ }
323
+ if (ordinal === undefined) {
324
+ ordinal = detected;
325
+ } else if (ordinal !== detected) {
326
+ return undefined;
327
+ }
328
+ }
329
+
330
+ return ordinal;
331
+ }
332
+
333
+ /**
334
+ * @param {string | undefined} fieldName
335
+ * @returns {1 | 2 | undefined}
336
+ */
337
+ function detectEndpointOrdinal(fieldName) {
338
+ if (!fieldName) {
339
+ return undefined;
340
+ }
341
+
342
+ const normalized = fieldName.toLowerCase();
343
+
344
+ const trailing = normalized.match(/(?:^|[^0-9])(1|2)$/);
345
+ if (trailing) {
346
+ return trailing[1] === "1" ? 1 : 2;
347
+ }
348
+
349
+ const word = normalized.match(/(?:^|[_-])(first|second)(?:[_-]|$)/);
350
+ if (word) {
351
+ return word[1] === "first" ? 1 : 2;
352
+ }
353
+
354
+ return undefined;
355
+ }
356
+
357
+ /**
358
+ * @param {import("../marks/mark.js").default} mark
359
+ * @param {"x" | "x2" | "y" | "y2"} channel
360
+ * @param {Record<string, any>} datum
361
+ * @returns {{ value: number, field?: string } | undefined}
362
+ */
363
+ function readLocusCoordinate(mark, channel, datum) {
364
+ const encoder = mark.encoders?.[channel];
365
+ if (encoder?.scale?.type !== "locus") {
366
+ return;
367
+ }
368
+
369
+ const accessor = encoder.dataAccessor;
370
+ if (!accessor) {
371
+ return;
372
+ }
373
+
374
+ const value = +accessor(datum);
375
+ if (!Number.isFinite(value)) {
376
+ return;
377
+ }
378
+
379
+ return {
380
+ value,
381
+ field: accessor.fields?.length === 1 ? accessor.fields[0] : undefined,
382
+ };
383
+ }
384
+
385
+ /**
386
+ * @param {import("../marks/mark.js").default} mark
387
+ * @returns {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>}
388
+ */
389
+ function collectLinearizationMappings(mark) {
390
+ /** @type {Map<string, {groupId: string, chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean}>} */
391
+ const mappingByField = new Map();
392
+
393
+ let group = 0;
394
+ const collector = mark.unitView?.getCollector?.();
395
+ let current = collector?.parent;
396
+ while (current) {
397
+ const params = /** @type {any} */ (current).params;
398
+ if (params?.type === "linearizeGenomicCoordinate") {
399
+ const as = asArray(params.as);
400
+ const pos = asArray(params.pos);
401
+ const offsets = normalizeOffsets(params.offset, pos.length);
402
+ const groupId = "g" + group++;
403
+ const channel = params.channel === "y" ? "y" : "x";
404
+
405
+ for (let i = 0; i < as.length; i++) {
406
+ if (i >= pos.length) {
407
+ continue;
408
+ }
409
+
410
+ const existing = mappingByField.get(as[i]);
411
+ if (existing) {
412
+ existing.ambiguous = true;
413
+ } else {
414
+ mappingByField.set(as[i], {
415
+ groupId,
416
+ chrom: params.chrom,
417
+ pos: pos[i],
418
+ offset: offsets[i],
419
+ channel,
420
+ ambiguous: false,
421
+ });
422
+ }
423
+ }
424
+ }
425
+ current = current.parent;
426
+ }
427
+
428
+ return mappingByField;
429
+ }
430
+
431
+ /**
432
+ * @param {number | number[] | undefined} offset
433
+ * @param {number} count
434
+ * @returns {number[]}
435
+ */
436
+ function normalizeOffsets(offset, count) {
437
+ const offsets = asArray(offset);
438
+
439
+ if (offsets.length === 0) {
440
+ return new Array(count).fill(0);
441
+ }
442
+ if (offsets.length === 1) {
443
+ return new Array(count).fill(offsets[0]);
444
+ }
445
+ if (offsets.length === count) {
446
+ return offsets;
447
+ }
448
+
449
+ return new Array(count).fill(0);
450
+ }
451
+
452
+ /**
453
+ * @param {import("../marks/mark.js").default} mark
454
+ * @param {"x" | "y"} axis
455
+ * @param {number} continuousPos
456
+ * @returns {string | undefined}
457
+ */
458
+ function formatGenomicLocus(mark, axis, continuousPos) {
459
+ const genome = getGenome(mark, axis);
460
+ return genome?.formatLocus(continuousPos);
461
+ }
462
+
463
+ /**
464
+ * @param {import("../marks/mark.js").default} mark
465
+ * @param {"x" | "y"} axis
466
+ * @param {[number, number]} interval
467
+ * @returns {string | undefined}
468
+ */
469
+ function formatGenomicInterval(mark, axis, interval) {
470
+ const genome = getGenome(mark, axis);
471
+ return genome?.formatInterval(interval);
472
+ }
473
+
474
+ /**
475
+ * @param {import("../marks/mark.js").default} mark
476
+ * @param {"x" | "y"} axis
477
+ */
478
+ function getGenome(mark, axis) {
479
+ const scale = mark.encoders?.[axis]?.scale;
480
+ return scale?.type === "locus" && "genome" in scale
481
+ ? scale.genome()
482
+ : undefined;
483
+ }
484
+
485
+ /**
486
+ * @param {import("./tooltipHandler.js").TooltipHandlerParams | undefined} params
487
+ * @param {"x" | "y"} axis
488
+ * @returns {TooltipGenomicDisplayMode}
489
+ */
490
+ function getConfiguredMode(params, axis) {
491
+ const configured = params?.genomicCoordinates?.[axis];
492
+ const mode =
493
+ typeof configured === "string"
494
+ ? configured
495
+ : (configured?.mode ?? "auto");
496
+
497
+ if (!GENOMIC_MODES.has(mode)) {
498
+ throw new Error(
499
+ 'Unknown genomic coordinate display mode: "' + mode + '"'
500
+ );
501
+ }
502
+
503
+ return /** @type {TooltipGenomicDisplayMode} */ (mode);
504
+ }
505
+
506
+ /**
507
+ * @param {Record<string, any>} datum
508
+ * @param {string} linearizedField
509
+ * @param {{ chrom: string, pos: string, offset: number, channel: "x" | "y", ambiguous: boolean }} mapping
510
+ * @param {import("../marks/mark.js").default} mark
511
+ */
512
+ function verifyLinearizationMapping(datum, linearizedField, mapping, mark) {
513
+ // TODO: This picks a genome by transform channel. In mixed-axis or
514
+ // mixed-assembly cases, verify against both active genomic axes.
515
+ const genome = getGenome(mark, mapping.channel);
516
+ if (!genome) {
517
+ return false;
518
+ }
519
+
520
+ const chrom = datum[mapping.chrom];
521
+ const pos = datum[mapping.pos];
522
+ const linearized = datum[linearizedField];
523
+
524
+ if (chrom === undefined || pos === undefined || linearized === undefined) {
525
+ return false;
526
+ }
527
+
528
+ const numericPos = +pos;
529
+ const numericLinearized = +linearized;
530
+
531
+ if (!Number.isFinite(numericPos) || !Number.isFinite(numericLinearized)) {
532
+ return false;
533
+ }
534
+
535
+ let expected;
536
+ try {
537
+ expected = genome.toContinuous(chrom, numericPos - mapping.offset);
538
+ } catch (_error) {
539
+ return false;
540
+ }
541
+
542
+ return Math.abs(expected - numericLinearized) < 1e-6;
543
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tooltipContext.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltipContext.test.d.ts","sourceRoot":"","sources":["../../../src/tooltip/tooltipContext.test.js"],"names":[],"mappings":""}