@genome-spy/core 0.73.0 → 0.74.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 (359) hide show
  1. package/dist/bundle/AbortablePromiseCache-3gHJdF3E.js +96 -0
  2. package/dist/bundle/browser-BTgw5ieH.js +126 -0
  3. package/dist/bundle/chunk-DmhlhrBa.js +11 -0
  4. package/dist/bundle/esm-BDFRLEuD.js +1248 -0
  5. package/dist/bundle/esm-BygJiwh0.js +573 -0
  6. package/dist/bundle/esm-CGX-qz1d.js +155 -0
  7. package/dist/bundle/esm-CgfVIRJ-.js +121 -0
  8. package/dist/bundle/esm-CuMSzCHy.js +298 -0
  9. package/dist/bundle/esm-DMXpJXM4.js +369 -0
  10. package/dist/bundle/esm-DQiq2Zhd.js +1426 -0
  11. package/dist/bundle/esm-DtE8VqAv.js +1015 -0
  12. package/dist/bundle/esm-sIoQYZ21.js +461 -0
  13. package/dist/bundle/index.es.js +21071 -25935
  14. package/dist/bundle/index.js +363 -379
  15. package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
  16. package/dist/schema.json +13098 -7095
  17. package/dist/src/config/axisConfig.d.ts +16 -0
  18. package/dist/src/config/axisConfig.d.ts.map +1 -0
  19. package/dist/src/config/axisConfig.js +84 -0
  20. package/dist/src/config/defaultConfig.d.ts +3 -0
  21. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  22. package/dist/src/config/defaultConfig.js +38 -0
  23. package/dist/src/config/defaults/axisDefaults.d.ts +5 -0
  24. package/dist/src/config/defaults/axisDefaults.d.ts.map +1 -0
  25. package/dist/src/config/defaults/axisDefaults.js +72 -0
  26. package/dist/src/config/defaults/markDefaults.d.ts +15 -0
  27. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -0
  28. package/dist/src/config/defaults/markDefaults.js +121 -0
  29. package/dist/src/config/defaults/scaleDefaults.d.ts +5 -0
  30. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -0
  31. package/dist/src/config/defaults/scaleDefaults.js +18 -0
  32. package/dist/src/config/defaults/titleDefaults.d.ts +5 -0
  33. package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -0
  34. package/dist/src/config/defaults/titleDefaults.js +47 -0
  35. package/dist/src/config/defaults/viewDefaults.d.ts +3 -0
  36. package/dist/src/config/defaults/viewDefaults.d.ts.map +1 -0
  37. package/dist/src/config/defaults/viewDefaults.js +2 -0
  38. package/dist/src/config/markConfig.d.ts +8 -0
  39. package/dist/src/config/markConfig.d.ts.map +1 -0
  40. package/dist/src/config/markConfig.js +27 -0
  41. package/dist/src/config/mergeConfig.d.ts +8 -0
  42. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  43. package/dist/src/config/mergeConfig.js +81 -0
  44. package/dist/src/config/resolveConfig.d.ts +22 -0
  45. package/dist/src/config/resolveConfig.d.ts.map +1 -0
  46. package/dist/src/config/resolveConfig.js +32 -0
  47. package/dist/src/config/scaleConfig.d.ts +40 -0
  48. package/dist/src/config/scaleConfig.d.ts.map +1 -0
  49. package/dist/src/config/scaleConfig.js +220 -0
  50. package/dist/src/config/styleUtils.d.ts +6 -0
  51. package/dist/src/config/styleUtils.d.ts.map +1 -0
  52. package/dist/src/config/styleUtils.js +10 -0
  53. package/dist/src/config/themes.d.ts +15 -0
  54. package/dist/src/config/themes.d.ts.map +1 -0
  55. package/dist/src/config/themes.js +293 -0
  56. package/dist/src/config/titleConfig.d.ts +12 -0
  57. package/dist/src/config/titleConfig.d.ts.map +1 -0
  58. package/dist/src/config/titleConfig.js +42 -0
  59. package/dist/src/config/viewConfig.d.ts +7 -0
  60. package/dist/src/config/viewConfig.d.ts.map +1 -0
  61. package/dist/src/config/viewConfig.js +29 -0
  62. package/dist/src/data/flowNode.d.ts +22 -1
  63. package/dist/src/data/flowNode.d.ts.map +1 -1
  64. package/dist/src/data/flowNode.js +37 -1
  65. package/dist/src/data/formats/bed.d.ts.map +1 -1
  66. package/dist/src/data/formats/bed.js +6 -1
  67. package/dist/src/data/formats/bedpe.d.ts.map +1 -1
  68. package/dist/src/data/formats/bedpe.js +4 -0
  69. package/dist/src/data/formats/fasta.d.ts.map +1 -1
  70. package/dist/src/data/formats/fasta.js +4 -0
  71. package/dist/src/data/formats/parquet.d.ts.map +1 -1
  72. package/dist/src/data/formats/parquet.js +4 -0
  73. package/dist/src/data/sources/dataSourceFactory.d.ts +2 -13
  74. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  75. package/dist/src/data/sources/dataSourceFactory.js +5 -141
  76. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  77. package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
  78. package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
  79. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  80. package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
  81. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  82. package/dist/src/data/sources/lazy/bamSource.js +11 -0
  83. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  84. package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
  85. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  86. package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
  87. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  88. package/dist/src/data/sources/lazy/gff3Source.js +12 -1
  89. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  90. package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
  91. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
  92. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
  93. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
  94. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
  95. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
  96. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
  97. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  98. package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
  99. package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
  100. package/dist/src/data/sources/lazy/vcfSource.js +11 -0
  101. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  102. package/dist/src/data/sources/urlSource.js +5 -2
  103. package/dist/src/data/transforms/aggregate.d.ts +1 -0
  104. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  105. package/dist/src/data/transforms/aggregate.js +30 -8
  106. package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
  107. package/dist/src/data/transforms/aggregateOps.js +12 -1
  108. package/dist/src/data/transforms/coverage.js +2 -2
  109. package/dist/src/data/transforms/filter.js +1 -1
  110. package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
  111. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  112. package/dist/src/data/transforms/filterScoredLabels.js +9 -0
  113. package/dist/src/data/transforms/measureText.d.ts +1 -0
  114. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  115. package/dist/src/data/transforms/measureText.js +14 -5
  116. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  117. package/dist/src/data/transforms/pileup.js +1 -2
  118. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  119. package/dist/src/data/transforms/regexFold.js +0 -1
  120. package/dist/src/embedFactory.d.ts +13 -0
  121. package/dist/src/embedFactory.d.ts.map +1 -0
  122. package/dist/src/embedFactory.js +127 -0
  123. package/dist/src/encoder/accessor.d.ts +3 -12
  124. package/dist/src/encoder/accessor.d.ts.map +1 -1
  125. package/dist/src/encoder/accessor.js +10 -65
  126. package/dist/src/encoder/encoder.d.ts +51 -8
  127. package/dist/src/encoder/encoder.d.ts.map +1 -1
  128. package/dist/src/encoder/encoder.js +179 -55
  129. package/dist/src/fonts/bmFontManager.js +1 -1
  130. package/dist/src/full.d.ts +2 -0
  131. package/dist/src/full.d.ts.map +1 -0
  132. package/dist/src/full.js +2 -0
  133. package/dist/src/genome/genome.d.ts +8 -0
  134. package/dist/src/genome/genome.d.ts.map +1 -1
  135. package/dist/src/genome/genome.js +16 -2
  136. package/dist/src/genome/genomeStore.js +1 -1
  137. package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -1
  138. package/dist/src/genome/rootGenomeConfig.js +6 -2
  139. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  140. package/dist/src/genome/scaleLocus.js +26 -7
  141. package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
  142. package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
  143. package/dist/src/genomeSpy/cursorManager.js +131 -0
  144. package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
  145. package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
  146. package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
  147. package/dist/src/genomeSpy/interactionController.d.ts +5 -0
  148. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  149. package/dist/src/genomeSpy/interactionController.js +212 -19
  150. package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
  151. package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
  152. package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
  153. package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
  154. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  155. package/dist/src/genomeSpy/viewContextFactory.js +12 -4
  156. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  157. package/dist/src/genomeSpy/viewDataInit.js +7 -3
  158. package/dist/src/genomeSpy.d.ts +1 -124
  159. package/dist/src/genomeSpy.d.ts.map +1 -1
  160. package/dist/src/genomeSpy.js +7 -688
  161. package/dist/src/genomeSpyBase.d.ts +133 -0
  162. package/dist/src/genomeSpyBase.d.ts.map +1 -0
  163. package/dist/src/genomeSpyBase.js +719 -0
  164. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  165. package/dist/src/gl/arrayBuilder.js +0 -3
  166. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  167. package/dist/src/gl/colorUtils.js +3 -0
  168. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  169. package/dist/src/gl/dataToVertices.js +13 -8
  170. package/dist/src/gl/glslScaleGenerator.d.ts +2 -2
  171. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  172. package/dist/src/gl/glslScaleGenerator.js +5 -7
  173. package/dist/src/index.d.ts +3 -9
  174. package/dist/src/index.d.ts.map +1 -1
  175. package/dist/src/index.js +5 -114
  176. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
  177. package/dist/src/marks/link.d.ts.map +1 -1
  178. package/dist/src/marks/link.js +0 -23
  179. package/dist/src/marks/mark.d.ts +8 -1
  180. package/dist/src/marks/mark.d.ts.map +1 -1
  181. package/dist/src/marks/mark.js +61 -20
  182. package/dist/src/marks/markUtils.d.ts +18 -1
  183. package/dist/src/marks/markUtils.d.ts.map +1 -1
  184. package/dist/src/marks/markUtils.js +52 -4
  185. package/dist/src/marks/point.d.ts.map +1 -1
  186. package/dist/src/marks/point.js +6 -26
  187. package/dist/src/marks/rect.d.ts.map +1 -1
  188. package/dist/src/marks/rect.js +13 -21
  189. package/dist/src/marks/rule.d.ts +7 -2
  190. package/dist/src/marks/rule.d.ts.map +1 -1
  191. package/dist/src/marks/rule.js +125 -16
  192. package/dist/src/marks/text.d.ts.map +1 -1
  193. package/dist/src/marks/text.js +5 -47
  194. package/dist/src/minimal.d.ts +8 -0
  195. package/dist/src/minimal.d.ts.map +1 -0
  196. package/dist/src/minimal.js +21 -0
  197. package/dist/src/paramRuntime/viewParamRuntime.d.ts +19 -0
  198. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  199. package/dist/src/paramRuntime/viewParamRuntime.js +35 -0
  200. package/dist/src/scale/scale.d.ts.map +1 -1
  201. package/dist/src/scale/scale.js +13 -7
  202. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  203. package/dist/src/scales/axisResolution.js +9 -5
  204. package/dist/src/scales/domainPlanner.d.ts +28 -8
  205. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  206. package/dist/src/scales/domainPlanner.js +207 -73
  207. package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
  208. package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
  209. package/dist/src/scales/indexLikeDomainUtils.js +67 -0
  210. package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
  211. package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
  212. package/dist/src/scales/resolutionMemberOrder.js +22 -0
  213. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  214. package/dist/src/scales/scaleInteractionController.js +43 -4
  215. package/dist/src/scales/scalePropsResolver.d.ts +3 -1
  216. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  217. package/dist/src/scales/scalePropsResolver.js +83 -6
  218. package/dist/src/scales/scaleResolution.d.ts +23 -0
  219. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  220. package/dist/src/scales/scaleResolution.js +220 -58
  221. package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -1
  222. package/dist/src/scales/scaleResolutionTestUtils.js +6 -2
  223. package/dist/src/scales/scaleRules.d.ts.map +1 -1
  224. package/dist/src/scales/scaleRules.js +16 -2
  225. package/dist/src/scales/selectionDomainUtils.d.ts +30 -0
  226. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  227. package/dist/src/scales/selectionDomainUtils.js +116 -1
  228. package/dist/src/screenshotHarness.js +3 -4
  229. package/dist/src/spec/axis.d.ts +41 -30
  230. package/dist/src/spec/channel.d.ts +15 -9
  231. package/dist/src/spec/config.d.ts +264 -0
  232. package/dist/src/spec/data.d.ts +7 -0
  233. package/dist/src/spec/decoration.d.ts +51 -0
  234. package/dist/src/spec/exampleFiles.d.ts +12 -0
  235. package/dist/src/spec/exampleFiles.d.ts.map +1 -0
  236. package/dist/src/spec/exampleFiles.js +52 -0
  237. package/dist/src/spec/font.d.ts +1 -1
  238. package/dist/src/spec/mark.d.ts +97 -13
  239. package/dist/src/spec/parameter.d.ts +30 -10
  240. package/dist/src/spec/root.d.ts +14 -0
  241. package/dist/src/spec/scale.d.ts +18 -13
  242. package/dist/src/spec/title.d.ts +13 -2
  243. package/dist/src/spec/tooltip.d.ts +1 -1
  244. package/dist/src/spec/transform.d.ts +39 -4
  245. package/dist/src/spec/view.d.ts +67 -19
  246. package/dist/src/styles/genome-spy.css +55 -55
  247. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  248. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  249. package/dist/src/styles/genome-spy.css.js +23 -22
  250. package/dist/src/testSetup.d.ts +2 -0
  251. package/dist/src/testSetup.d.ts.map +1 -0
  252. package/dist/src/testSetup.js +5 -0
  253. package/dist/src/tooltip/dataTooltipHandler.js +8 -2
  254. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
  255. package/dist/src/tooltip/tooltipContext.js +3 -2
  256. package/dist/src/types/embedApi.d.ts +7 -0
  257. package/dist/src/types/encoder.d.ts +17 -15
  258. package/dist/src/types/scaleResolutionApi.d.ts +20 -0
  259. package/dist/src/types/viewContext.d.ts +23 -1
  260. package/dist/src/utils/expression.d.ts +2 -2
  261. package/dist/src/utils/expression.d.ts.map +1 -1
  262. package/dist/src/utils/expression.js +63 -8
  263. package/dist/src/utils/field.d.ts.map +1 -1
  264. package/dist/src/utils/field.js +0 -1
  265. package/dist/src/utils/inertia.d.ts.map +1 -1
  266. package/dist/src/utils/inertia.js +0 -1
  267. package/dist/src/utils/inputBinding.d.ts +1 -1
  268. package/dist/src/utils/interaction.d.ts +109 -0
  269. package/dist/src/utils/interaction.d.ts.map +1 -0
  270. package/dist/src/utils/interaction.js +200 -0
  271. package/dist/src/utils/interactionEvent.d.ts +21 -42
  272. package/dist/src/utils/interactionEvent.d.ts.map +1 -1
  273. package/dist/src/utils/interactionEvent.js +43 -66
  274. package/dist/src/utils/kWayMerge.js +1 -1
  275. package/dist/src/utils/mergeObjects.d.ts.map +1 -1
  276. package/dist/src/utils/mergeObjects.js +0 -2
  277. package/dist/src/utils/radixSort.d.ts.map +1 -1
  278. package/dist/src/utils/radixSort.js +0 -2
  279. package/dist/src/utils/throttle.d.ts.map +1 -1
  280. package/dist/src/utils/throttle.js +0 -2
  281. package/dist/src/utils/ui/tooltip.d.ts +1 -0
  282. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  283. package/dist/src/utils/ui/tooltip.js +1 -0
  284. package/dist/src/utils/url.js +1 -1
  285. package/dist/src/view/axisGridView.d.ts +1 -1
  286. package/dist/src/view/axisGridView.d.ts.map +1 -1
  287. package/dist/src/view/axisGridView.js +2 -47
  288. package/dist/src/view/axisView.d.ts +2 -3
  289. package/dist/src/view/axisView.d.ts.map +1 -1
  290. package/dist/src/view/axisView.js +251 -106
  291. package/dist/src/view/concatView.d.ts +2 -1
  292. package/dist/src/view/concatView.d.ts.map +1 -1
  293. package/dist/src/view/concatView.js +4 -2
  294. package/dist/src/view/containerMutationHelper.d.ts +3 -0
  295. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  296. package/dist/src/view/containerMutationHelper.js +4 -1
  297. package/dist/src/view/facetView.d.ts +1 -1
  298. package/dist/src/view/facetView.js +3 -3
  299. package/dist/src/view/flowBuilder.js +2 -2
  300. package/dist/src/view/gridView/gridChild.d.ts +6 -0
  301. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  302. package/dist/src/view/gridView/gridChild.js +72 -43
  303. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  304. package/dist/src/view/gridView/gridView.js +255 -101
  305. package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
  306. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
  307. package/dist/src/view/gridView/keyboardZoomController.js +1 -1
  308. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  309. package/dist/src/view/gridView/scrollbar.js +4 -2
  310. package/dist/src/view/gridView/selectionRect.d.ts +4 -0
  311. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  312. package/dist/src/view/gridView/selectionRect.js +20 -1
  313. package/dist/src/view/gridView/separatorView.d.ts +1 -0
  314. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  315. package/dist/src/view/gridView/separatorView.js +9 -0
  316. package/dist/src/view/interactionRouting.d.ts +20 -0
  317. package/dist/src/view/interactionRouting.d.ts.map +1 -0
  318. package/dist/src/view/interactionRouting.js +53 -0
  319. package/dist/src/view/layerView.d.ts.map +1 -1
  320. package/dist/src/view/layerView.js +12 -9
  321. package/dist/src/view/layout/grid.js +1 -1
  322. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  323. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
  324. package/dist/src/view/testUtils.d.ts +17 -3
  325. package/dist/src/view/testUtils.d.ts.map +1 -1
  326. package/dist/src/view/testUtils.js +62 -69
  327. package/dist/src/view/title.d.ts +8 -1
  328. package/dist/src/view/title.d.ts.map +1 -1
  329. package/dist/src/view/title.js +66 -76
  330. package/dist/src/view/unitView.d.ts +1 -1
  331. package/dist/src/view/unitView.d.ts.map +1 -1
  332. package/dist/src/view/unitView.js +67 -17
  333. package/dist/src/view/view.d.ts +76 -30
  334. package/dist/src/view/view.d.ts.map +1 -1
  335. package/dist/src/view/view.js +136 -47
  336. package/dist/src/view/viewFactory.d.ts +11 -3
  337. package/dist/src/view/viewFactory.d.ts.map +1 -1
  338. package/dist/src/view/viewFactory.js +37 -11
  339. package/dist/src/view/viewUtils.d.ts.map +1 -1
  340. package/dist/src/view/viewUtils.js +41 -5
  341. package/dist/src/view/zoom.d.ts +2 -2
  342. package/dist/src/view/zoom.d.ts.map +1 -1
  343. package/dist/src/view/zoom.js +21 -23
  344. package/package.json +18 -10
  345. package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
  346. package/dist/bundle/browser-0iNU5Wit.js +0 -138
  347. package/dist/bundle/index-BYsZN7b0.js +0 -1597
  348. package/dist/bundle/index-C3kClAEN.js +0 -1771
  349. package/dist/bundle/index-C7wOh6y1.js +0 -657
  350. package/dist/bundle/index-CRaQAuki.js +0 -326
  351. package/dist/bundle/index-D9v1PCj9.js +0 -507
  352. package/dist/bundle/index-GDOuv_D5.js +0 -266
  353. package/dist/bundle/index-Gt44EOIH.js +0 -628
  354. package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
  355. package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
  356. package/dist/bundle/unzip-Bac01w6X.js +0 -1492
  357. package/dist/src/config/scaleDefaults.d.ts +0 -8
  358. package/dist/src/config/scaleDefaults.d.ts.map +0 -1
  359. package/dist/src/config/scaleDefaults.js +0 -45
@@ -2,62 +2,155 @@ import {
2
2
  isIntervalSelection,
3
3
  makeSelectionTestExpression,
4
4
  } from "../selection/selection.js";
5
- import { createConditionalAccessors } from "./accessor.js";
5
+ import { createAccessor } from "./accessor.js";
6
+ import { makeConstantExprRef } from "../paramRuntime/paramUtils.js";
6
7
 
7
8
  /**
8
- * TODO: Complete this. Not tested yet.
9
- *
10
- * Creates a selection predicate that can be used in conditional encoding.
9
+ * Creates a host-side predicate for selection-driven conditional encoding.
10
+ * The selection test expression is compiled lazily when the predicate is
11
+ * first evaluated so encoder construction does not depend on eager selection
12
+ * materialization.
11
13
  *
12
14
  * @param {string} param
13
15
  * @param {import("../spec/channel.js").Encoding} encoding
14
16
  * @param {{ findValue: (param: string) => any, createExpression: (expr: string) => import("../paramRuntime/types.js").ExprRefFunction }} paramRuntime
15
17
  * @param {boolean} empty
18
+ * @returns {import("../types/encoder.js").Predicate}
16
19
  */
17
- // eslint-disable-next-line no-unused-vars
18
- function createSelectionPredicate(param, encoding, paramRuntime, empty) {
19
- const selection =
20
- /** @type {import("../types/selectionTypes.js").Selection} */ (
20
+ export function createSelectionPredicate(param, encoding, paramRuntime, empty) {
21
+ /**
22
+ * @typedef {import("../data/flowNode.js").Datum} Datum
23
+ * @typedef {import("../types/selectionTypes.js").Selection} Selection
24
+ * @typedef {import("../types/encoder.js").Predicate} Predicate
25
+ */
26
+
27
+ /** @type {import("../paramRuntime/types.js").ExprRefFunction | undefined} */
28
+ let compiled;
29
+
30
+ const fallback = makeConstantExprRef(false);
31
+
32
+ const ensureCompiled = () => {
33
+ if (compiled) {
34
+ return compiled;
35
+ }
36
+
37
+ const selection = /** @type {Selection | undefined} */ (
21
38
  paramRuntime.findValue(param)
22
39
  );
23
- if (!selection) {
24
- throw new Error(`No selection parameter found: ${param}`);
25
- }
40
+ if (!selection) {
41
+ return fallback;
42
+ }
26
43
 
27
- /** @type {Partial<Record<import("../spec/channel.js").PositionalChannel, import("../spec/channel.js").Field>>} */
28
- const fields = {};
29
- if (isIntervalSelection(selection)) {
30
- const channels = Object.keys(selection.intervals);
31
- for (const channel of channels) {
32
- const channelDef = encoding[channel];
33
- if (isFieldDef(channelDef)) {
34
- fields[channel] = channelDef.field;
35
- continue;
36
- } else if ("condition" in channelDef) {
37
- const condition = channelDef.condition;
38
- if (isFieldDef(condition)) {
39
- fields[channel] = condition.field;
44
+ /** @type {Partial<Record<import("../spec/channel.js").PositionalChannel, import("../spec/channel.js").Field>>} */
45
+ const fields = {};
46
+ if (isIntervalSelection(selection)) {
47
+ const channels = Object.keys(selection.intervals);
48
+ for (const channel of channels) {
49
+ const channelDef = encoding[channel];
50
+ if (isFieldDef(channelDef)) {
51
+ fields[channel] = channelDef.field;
40
52
  continue;
53
+ } else if (channelDef && "condition" in channelDef) {
54
+ const condition = channelDef.condition;
55
+ if (isFieldDef(condition)) {
56
+ fields[channel] = condition.field;
57
+ continue;
58
+ }
41
59
  }
60
+ throw new Error(
61
+ `Selection "${param}" has an interval for "${channel}" channel, but could not find a fieldDef: ${JSON.stringify(encoding[channel])}`
62
+ );
42
63
  }
43
- throw new Error(
44
- `Selection "${param}" has an interval for "${channel}" channel, but could not find a fieldDef: ${JSON.stringify(encoding[channel])}`
45
- );
46
64
  }
47
- }
48
65
 
49
- const expr = makeSelectionTestExpression(
50
- { type: "filter", param, fields, empty },
51
- selection
66
+ const expr = makeSelectionTestExpression(
67
+ { type: "filter", param, fields, empty },
68
+ selection
69
+ );
70
+
71
+ compiled = paramRuntime.createExpression(expr);
72
+ return compiled;
73
+ };
74
+
75
+ /** @type {Predicate} */
76
+ const predicate = Object.assign(
77
+ /** @param {Datum} datum */ (datum) => ensureCompiled()(datum),
78
+ {
79
+ param,
80
+ empty: empty ?? true,
81
+ }
52
82
  );
53
83
 
54
- return paramRuntime.createExpression(expr);
84
+ return predicate;
55
85
  }
56
86
 
57
87
  /**
58
- * Creates an object that contains encoders for every channel of a mark
88
+ * Creates ordered conditional branches for a channel definition. The last
89
+ * branch is always the fallback branch.
59
90
  *
60
- * TODO: This method should have a test. But how to mock Mark...
91
+ * @param {import("../spec/channel.js").Channel} channel
92
+ * @param {import("../spec/channel.js").ChannelDef} channelDef
93
+ * @param {import("../spec/channel.js").Encoding} encoding
94
+ * @param {{ createExpression: (expr: string) => import("../paramRuntime/types.js").ExprRefFunction, findValue: (param: string) => any }} paramRuntime
95
+ * @returns {import("../types/encoder.js").EncodingBranch[]}
96
+ */
97
+ export function createConditionalBranches(
98
+ channel,
99
+ channelDef,
100
+ encoding,
101
+ paramRuntime
102
+ ) {
103
+ const conditions =
104
+ isFieldOrDatumDefWithCondition(channelDef) ||
105
+ isValueDefWithCondition(channelDef)
106
+ ? Array.isArray(channelDef.condition)
107
+ ? channelDef.condition
108
+ : [channelDef.condition]
109
+ : [];
110
+
111
+ const branchChannelDefs = [...conditions, channelDef];
112
+
113
+ /** @type {import("../types/encoder.js").EncodingBranch[]} */
114
+ const branches = branchChannelDefs.map((branchChannelDef, index) => {
115
+ const condition = conditions[index];
116
+ const accessor = createAccessor(
117
+ channel,
118
+ branchChannelDef,
119
+ paramRuntime
120
+ );
121
+
122
+ /** @type {import("../types/encoder.js").Predicate} */
123
+ const predicate = condition?.param
124
+ ? createSelectionPredicate(
125
+ condition.param,
126
+ encoding,
127
+ paramRuntime,
128
+ condition.empty
129
+ )
130
+ : Object.assign(
131
+ makeConstantExprRef(index === branchChannelDefs.length - 1),
132
+ {
133
+ empty: false,
134
+ }
135
+ );
136
+
137
+ return {
138
+ accessor,
139
+ predicate,
140
+ };
141
+ });
142
+
143
+ if (branches.filter((branch) => !branch.accessor.constant).length > 1) {
144
+ throw new Error(
145
+ "Only one accessor can be non-constant. Channel: " + channel
146
+ );
147
+ }
148
+
149
+ return branches;
150
+ }
151
+
152
+ /**
153
+ * Creates encoders for direct mark-property channels in an encoding object.
61
154
  *
62
155
  * @param {import("../view/unitView.js").default} unitView
63
156
  * @param {import("../spec/channel.js").Encoding} encoding
@@ -91,9 +184,10 @@ export default function createEncoders(unitView, encoding) {
91
184
  const typedChannelDef =
92
185
  /** @type {import("../spec/channel.js").ChannelDef} */ (channelDef);
93
186
  encoders[typedChannel] = createSimpleOrConditionalEncoder(
94
- createConditionalAccessors(
187
+ createConditionalBranches(
95
188
  typedChannel,
96
189
  typedChannelDef,
190
+ encoding,
97
191
  unitView.paramRuntime
98
192
  ),
99
193
  scaleSource
@@ -116,23 +210,46 @@ export function isNonMarkPropertyChannel(channel) {
116
210
  }
117
211
 
118
212
  /**
119
- * @param {import("../types/encoder.js").Accessor[]} accessors
213
+ * @param {import("../types/encoder.js").Encoder} encoder
214
+ * @returns {import("../types/encoder.js").Accessor[]}
215
+ */
216
+ export function getEncoderAccessors(encoder) {
217
+ return encoder.branches.map((branch) => branch.accessor);
218
+ }
219
+
220
+ /**
221
+ * @param {import("../types/encoder.js").Encoder} encoder
222
+ * @returns {import("../types/encoder.js").Accessor | undefined}
223
+ */
224
+ export function getEncoderDataAccessor(encoder) {
225
+ return encoder.branches.find((branch) => !branch.accessor.constant)
226
+ ?.accessor;
227
+ }
228
+
229
+ /**
230
+ * Creates an encoder from ordered branches. The first matching branch wins.
231
+ *
232
+ * @param {import("../types/encoder.js").EncodingBranch[]} branches
120
233
  * @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
121
234
  * @returns {Encoder}
122
235
  */
123
- export function createSimpleOrConditionalEncoder(accessors, scaleSource) {
236
+ export function createSimpleOrConditionalEncoder(branches, scaleSource) {
124
237
  /**
125
238
  * @typedef {import("../types/encoder.js").Encoder} Encoder
126
- * @typedef {import("../types/encoder.js").Accessor} Accessor
127
239
  * @typedef {import("../data/flowNode.js").Datum} Datum
128
240
  */
129
- if (accessors.length === 1) {
130
- return createEncoder(accessors[0], scaleSource);
241
+ if (branches.length === 1) {
242
+ const encoder = createEncoder(branches[0].accessor, scaleSource);
243
+ return Object.assign(encoder, {
244
+ branches,
245
+ });
131
246
  }
132
247
 
133
- const predicates = accessors.map((a) => a.predicate);
248
+ const predicates = branches.map((branch) => branch.predicate);
134
249
 
135
- const encoders = accessors.map((a) => createEncoder(a, scaleSource));
250
+ const encoders = branches.map((branch) =>
251
+ createEncoder(branch.accessor, scaleSource)
252
+ );
136
253
 
137
254
  const encoder = Object.assign(
138
255
  (/** @type {Datum} */ datum) => {
@@ -144,12 +261,9 @@ export function createSimpleOrConditionalEncoder(accessors, scaleSource) {
144
261
  },
145
262
  {
146
263
  constant: false,
147
- accessors: /** @type {Accessor[]} */ (
148
- encoders.map((e) => e.accessors[0])
149
- ),
150
- dataAccessor: encoders.map((e) => e.dataAccessor).find((a) => a),
264
+ branches,
151
265
  scale: encoders.map((e) => e.scale).find((s) => s),
152
- channelDef: accessors.at(-1).channelDef,
266
+ channelDef: branches.at(-1).accessor.channelDef,
153
267
  }
154
268
  );
155
269
 
@@ -157,6 +271,8 @@ export function createSimpleOrConditionalEncoder(accessors, scaleSource) {
157
271
  }
158
272
 
159
273
  /**
274
+ * Wraps a single accessor with optional scale application and encoder metadata.
275
+ *
160
276
  * @param {Accessor} accessor
161
277
  * @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
162
278
  * @returns {Encoder}
@@ -189,17 +305,18 @@ export function createEncoder(accessor, scaleSource) {
189
305
  {
190
306
  scale,
191
307
  constant: accessor.constant,
192
- accessors: [accessor],
193
- dataAccessor: accessor.constant ? undefined : accessor,
194
- // TODO: Accessor already has the channelDef
308
+ branches: [
309
+ {
310
+ accessor,
311
+ predicate: makeConstantExprRef(true),
312
+ },
313
+ ],
195
314
  channelDef,
196
315
  }
197
316
  );
198
317
  }
199
318
 
200
319
  /**
201
- * TODO: Move to a more generic place
202
- *
203
320
  * @param {import("../spec/channel.js").ChannelDef} channelDef
204
321
  * @returns {channelDef is import("../spec/channel.js").ValueDef}
205
322
  */
@@ -224,11 +341,13 @@ export function isDatumDef(channelDef) {
224
341
  }
225
342
 
226
343
  /**
344
+ * Returns true for direct channel definitions that participate in scale
345
+ * resolution. Conditional wrappers must be unwrapped by the caller first.
346
+ *
227
347
  * @param {import("../spec/channel.js").ChannelDef} channelDef
228
348
  * @returns {channelDef is import("../spec/channel.js").ChannelDefWithScale}
229
349
  */
230
350
  export function isChannelDefWithScale(channelDef) {
231
- // TODO: Not accurate, fix
232
351
  return (
233
352
  isFieldDef(channelDef) ||
234
353
  isDatumDef(channelDef) ||
@@ -257,11 +376,16 @@ export function findChannelDefWithScale(channelDef) {
257
376
  */
258
377
  export function getChannelDefWithScale(view, channel) {
259
378
  const channelDef = view.mark.encoding[channel];
260
- if (!Array.isArray(channelDef) && isChannelDefWithScale(channelDef)) {
261
- return channelDef;
379
+ if (!Array.isArray(channelDef)) {
380
+ const channelDefWithScale = findChannelDefWithScale(channelDef);
381
+ if (channelDefWithScale) {
382
+ return channelDefWithScale;
383
+ }
262
384
  } else {
263
385
  throw new Error("Not a channel def with scale!");
264
386
  }
387
+
388
+ throw new Error("Not a channel def with scale!");
265
389
  }
266
390
 
267
391
  /**
@@ -131,7 +131,7 @@ export default class BmFontManager {
131
131
 
132
132
  fontEntry.texture = await texturePromise;
133
133
  fontEntry.metrics = await metricsPromise;
134
- } catch (error) {
134
+ } catch {
135
135
  console.warn(
136
136
  `Cannot load font: "${key.family}". Using the embedded default font.`
137
137
  );
@@ -0,0 +1,2 @@
1
+ export * from "./index.js";
2
+ //# sourceMappingURL=full.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.d.ts","sourceRoot":"","sources":["../../src/full.js"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ // Explicit alias for the default fat core entry point.
2
+ export * from "./index.js";
@@ -18,6 +18,14 @@ export function isChromosomalLocus(value: any): value is ChromosomalLocus;
18
18
  * @return {value is ChromosomalLocus[]}
19
19
  */
20
20
  export function isChromosomalLocusInterval(value: any[]): value is ChromosomalLocus[];
21
+ /**
22
+ * Returns true when the right bound is an explicit locus position rather than a
23
+ * chromosome shortcut such as `{ chrom: "chr2" }`.
24
+ *
25
+ * @param {any} value
26
+ * @returns {value is ChromosomalLocus[]}
27
+ */
28
+ export function hasExplicitLocusUpperBound(value: any): value is ChromosomalLocus[];
21
29
  /**
22
30
  * @param {any} value
23
31
  * @returns {value is GenomeConfig}
@@ -1 +1 @@
1
- {"version":3,"file":"genome.d.ts","sourceRoot":"","sources":["../../../src/genome/genome.js"],"names":[],"mappings":"AA2XA;;;GAGG;AACH,gDAFW,MAAM;;;IAOhB;AAED;;;;GAIG;AACH,0CAHW,GAAG,GACF,KAAK,IAAI,gBAAgB,CAIpC;AAED;;;;GAIG;AACH,kDAHW,GAAG,EAAE,GACJ,KAAK,IAAI,gBAAgB,EAAE,CAItC;AAED;;;GAGG;AACH,sCAHW,GAAG,GACD,KAAK,IAAI,YAAY,CASjC;AAED;;;GAGG;AACH,yCAHW,GAAG,GACD,KAAK,IAAI,OAAO,mBAAmB,EAAE,eAAe,CAIhE;AAED;;;GAGG;AACH,4CAHW,GAAG,GACD,KAAK,IAAI,OAAO,mBAAmB,EAAE,kBAAkB,CAInE;AA5aD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;IACI;;OAEG;IACH,oBAFW,YAAY,EA6CtB;IA1CG;;;;;;;;MAA2C;IAc3C,oDAAoD;IACpD,aADW,CAAC,UAAU,GAAG,oBAAoB,CAAC,EAAE,CAC3B;IAErB,2CAA2C;IAC3C,0BADW,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CACE;IAEzC,sEAAsE;IACtE,mBADW,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,GAAG,oBAAoB,CAAC,CAChC;IAElC,uBAAuB;IACvB,cADW,MAAM,EAAE,CACG;IAEtB,kBAAkB;IAkBtB,mBAEC;IAED;;OAEG;IACH,cAFW,MAAM,iBAmBhB;IAED,wBAEC;IAED;;;OAGG;IACH,0BAFW,UAAU,EAAE,QA+CtB;IAED,sBAEC;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GAAG,MAAM,OACf,MAAM,UAShB;IAED;;;OAGG;IACH,4BAFW,MAAM,qCAgBhB;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,gBAAgB,CAY5B;IAED;;;OAGG;IACH,oBAFW,MAAM,qCAIhB;IAED;;;;;;;;;;OAUG;IACH,yBAHW,MAAM,EAAE,GACN,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,2BAHW,MAAM,GACJ,MAAM,CAQlB;IAED;;;OAGG;IACH,gCAHW,MAAM,EAAE,GACN,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAUhD;IAED;;;;;;OAMG;IACH,kCAFW,gBAAgB,EAAE,YAgB5B;IAED;;;;;OAKG;IACH,wCAHW,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAClC,0BAA0B,EAAE,CAiCxC;IAED;;;;OAIG;IACH,4DAFW,MAAM,EAAE,gCAOlB;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,CAAC,CAgC5B;CACJ;2BAjXY,OAAO,mBAAmB,EAAE,YAAY;+BACxC,OAAO,mBAAmB,EAAE,gBAAgB;;UAG/C,MAAM;UACN,MAAM;;;;;;WAGN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM;;;;mBACN,MAAM;wBACN,MAAM,EAAE;;;;SACR,OAAO;;;WAGP,MAAM;cACN,MAAM;YACN,MAAM"}
1
+ {"version":3,"file":"genome.d.ts","sourceRoot":"","sources":["../../../src/genome/genome.js"],"names":[],"mappings":"AA2XA;;;GAGG;AACH,gDAFW,MAAM;;;IAOhB;AAED;;;;GAIG;AACH,0CAHW,GAAG,GACF,KAAK,IAAI,gBAAgB,CAIpC;AAED;;;;GAIG;AACH,kDAHW,GAAG,EAAE,GACJ,KAAK,IAAI,gBAAgB,EAAE,CAItC;AAED;;;;;;GAMG;AACH,kDAHW,GAAG,GACD,KAAK,IAAI,gBAAgB,EAAE,CAOvC;AAED;;;GAGG;AACH,sCAHW,GAAG,GACD,KAAK,IAAI,YAAY,CASjC;AAED;;;GAGG;AACH,yCAHW,GAAG,GACD,KAAK,IAAI,OAAO,mBAAmB,EAAE,eAAe,CAIhE;AAED;;;GAGG;AACH,4CAHW,GAAG,GACD,KAAK,IAAI,OAAO,mBAAmB,EAAE,kBAAkB,CAInE;AA1bD;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;IACI;;OAEG;IACH,oBAFW,YAAY,EA6CtB;IA1CG;;;;;;;;MAA2C;IAc3C,oDAAoD;IACpD,aADW,CAAC,UAAU,GAAG,oBAAoB,CAAC,EAAE,CAC3B;IAErB,2CAA2C;IAC3C,0BADW,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,CACE;IAEzC,sEAAsE;IACtE,mBADW,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,GAAG,oBAAoB,CAAC,CAChC;IAElC,uBAAuB;IACvB,cADW,MAAM,EAAE,CACG;IAEtB,kBAAkB;IAkBtB,mBAEC;IAED;;OAEG;IACH,cAFW,MAAM,iBAoBhB;IAED,wBAEC;IAED;;;OAGG;IACH,0BAFW,UAAU,EAAE,QA8CtB;IAED,sBAEC;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GAAG,MAAM,OACf,MAAM,UAShB;IAED;;;OAGG;IACH,4BAFW,MAAM,qCAgBhB;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,gBAAgB,CAY5B;IAED;;;OAGG;IACH,oBAFW,MAAM,qCAIhB;IAED;;;;;;;;;;OAUG;IACH,yBAHW,MAAM,EAAE,GACN,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,2BAHW,MAAM,GACJ,MAAM,CAQlB;IAED;;;OAGG;IACH,gCAHW,MAAM,EAAE,GACN,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAUhD;IAED;;;;;;OAMG;IACH,kCAFW,gBAAgB,EAAE,YAgB5B;IAED;;;;;OAKG;IACH,wCAHW,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,GAClC,0BAA0B,EAAE,CAiCxC;IAED;;;;OAIG;IACH,4DAFW,MAAM,EAAE,gCAOlB;IAED;;;;OAIG;IACH,mBAHW,MAAM,GACJ,CAAC,MAAM,EAAE,MAAM,CAAC,CAgC5B;CACJ;2BAjXY,OAAO,mBAAmB,EAAE,YAAY;+BACxC,OAAO,mBAAmB,EAAE,gBAAgB;;UAG/C,MAAM;UACN,MAAM;;;;;;WAGN,MAAM;;;;YACN,MAAM;;;;qBACN,MAAM;;;;mBACN,MAAM;wBACN,MAAM,EAAE;;;;SACR,OAAO;;;WAGP,MAAM;cACN,MAAM;YACN,MAAM"}
@@ -97,7 +97,8 @@ export default class Genome {
97
97
  this.setChromSizes(parseChromSizes(await result.text()));
98
98
  } catch (e) {
99
99
  throw new Error(
100
- `Could not load chrom sizes: ${this.config.url}. Reason: ${e.message}`
100
+ `Could not load chrom sizes: ${this.config.url}. Reason: ${e.message}`,
101
+ { cause: e }
101
102
  );
102
103
  }
103
104
  }
@@ -129,7 +130,6 @@ export default class Genome {
129
130
  continuousInterval: [pos, pos + size],
130
131
  index: i,
131
132
  number: i + 1,
132
- // eslint-disable-next-line no-bitwise
133
133
  odd: !(i & 1),
134
134
  };
135
135
 
@@ -406,6 +406,20 @@ export function isChromosomalLocusInterval(value) {
406
406
  return value.every(isChromosomalLocus);
407
407
  }
408
408
 
409
+ /**
410
+ * Returns true when the right bound is an explicit locus position rather than a
411
+ * chromosome shortcut such as `{ chrom: "chr2" }`.
412
+ *
413
+ * @param {any} value
414
+ * @returns {value is ChromosomalLocus[]}
415
+ */
416
+ export function hasExplicitLocusUpperBound(value) {
417
+ return (
418
+ isChromosomalLocusInterval(value) &&
419
+ (value[1] ?? value[0]).pos !== undefined
420
+ );
421
+ }
422
+
409
423
  /**
410
424
  * @param {any} value
411
425
  * @returns {value is GenomeConfig}
@@ -207,7 +207,7 @@ export default class GenomeStore {
207
207
  #tryCreateBuiltInGenome(name) {
208
208
  try {
209
209
  return new Genome({ name });
210
- } catch (_error) {
210
+ } catch {
211
211
  return undefined;
212
212
  }
213
213
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rootGenomeConfig.d.ts","sourceRoot":"","sources":["../../../src/genome/rootGenomeConfig.js"],"names":[],"mappings":"AAEA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;;;GAMG;AACH,oDAHW,UAAU,GACR,wBAAwB,CAkDpC;yBAlEY,OAAO,iBAAiB,EAAE,UAAU;oCACpC,OAAO,iBAAiB,EAAE,iBAAiB;;mBAK9C,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC;qBAClC,MAAM,GAAG,SAAS;wBAClB,MAAM,GAAG,SAAS"}
1
+ {"version":3,"file":"rootGenomeConfig.d.ts","sourceRoot":"","sources":["../../../src/genome/rootGenomeConfig.js"],"names":[],"mappings":"AAEA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;;;GAMG;AACH,oDAHW,UAAU,GACR,wBAAwB,CAsDpC;yBAtEY,OAAO,iBAAiB,EAAE,UAAU;oCACpC,OAAO,iBAAiB,EAAE,iBAAiB;;mBAK9C,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC;qBAClC,MAAM,GAAG,SAAS;wBAClB,MAAM,GAAG,SAAS"}
@@ -34,8 +34,12 @@ export function resolveRootGenomeConfig(rootConfig) {
34
34
 
35
35
  if (rootConfig.genome) {
36
36
  const { name, ...config } = rootConfig.genome;
37
+ const hasDefinition = Object.keys(config).length > 0;
37
38
  return {
38
- genomesByName: new Map([[name, config]]),
39
+ genomesByName:
40
+ !hasDefinition && isBuiltInAssembly(name)
41
+ ? new Map()
42
+ : new Map([[name, config]]),
39
43
  defaultAssembly: name,
40
44
  deprecationWarning: getLegacyGenomeWarning(),
41
45
  };
@@ -88,7 +92,7 @@ function isBuiltInAssembly(name) {
88
92
  try {
89
93
  getContigs(name);
90
94
  return true;
91
- } catch (_error) {
95
+ } catch {
92
96
  return false;
93
97
  }
94
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scaleLocus.d.ts","sourceRoot":"","sources":["../../../src/genome/scaleLocus.js"],"names":[],"mappings":"AAMA,2EAsGC;;AASD;;;;GAIG;AACH,8CAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,SAC5F,MAAM,GACJ,MAAM,GAAG,OAAO,aAAa,EAAE,gBAAgB,CAK3D;AAED;;;;GAIG;AACH,gDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,WAC5F,MAAM,GAAG,OAAO,aAAa,EAAE,gBAAgB,GAC7C,MAAM,CAQlB;AAED;;;;GAIG;AACH,mDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,YAC5F,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,GAChF,MAAM,EAAE,CAQpB;AAED;;;;GAIG;AACH,iDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,YAC5F,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,GAChF,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,CAO9F;AAED;;;GAGG;AACH,+CAHW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC1F,MAAM,EAAE,CAQpB"}
1
+ {"version":3,"file":"scaleLocus.d.ts","sourceRoot":"","sources":["../../../src/genome/scaleLocus.js"],"names":[],"mappings":"AAQA,2EAuHC;;AASD;;;;GAIG;AACH,8CAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,SAC5F,MAAM,GACJ,MAAM,GAAG,OAAO,aAAa,EAAE,gBAAgB,CAK3D;AAED;;;;GAIG;AACH,gDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,WAC5F,MAAM,GAAG,OAAO,aAAa,EAAE,gBAAgB,GAC7C,MAAM,CAQlB;AAED;;;;GAIG;AACH,mDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,YAC5F,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,GAChF,MAAM,EAAE,CAQpB;AAED;;;;GAIG;AACH,iDAJW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,YAC5F,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,GAChF,OAAO,kBAAkB,EAAE,YAAY,GAAG,OAAO,kBAAkB,EAAE,aAAa,CAO9F;AAED;;;GAGG;AACH,+CAHW,OAAO,aAAa,EAAE,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,OAAO,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,GAC1F,MAAM,EAAE,CAQpB"}
@@ -4,6 +4,8 @@ import { format as d3format } from "d3-format";
4
4
  import scaleIndex from "./scaleIndex.js";
5
5
  import { isChromosomalLocus, isChromosomalLocusInterval } from "./genome.js";
6
6
 
7
+ const EXACT_LOCUS_LABEL_STEP_THRESHOLD = 1e6;
8
+
7
9
  export default function scaleLocus() {
8
10
  /** @type {import("./scaleLocus.js").ScaleLocus} */
9
11
  const scale = /** @type {any} */ (scaleIndex().numberingOffset(1));
@@ -27,14 +29,26 @@ export default function scaleLocus() {
27
29
  }
28
30
 
29
31
  const domain = scale.domain();
32
+ const domainSpan = domain[1] - domain[0];
30
33
  const numberingOffset = scale.numberingOffset();
31
34
 
32
- const [minChrom, maxChrom] = [
33
- Math.max(domain[0], 0),
34
- Math.min(domain[1], genome.totalSize - 1),
35
- ].map((x) => genome.toChromosome(x));
35
+ const minChrom = genome.toChromosome(Math.max(domain[0], 0));
36
+ const maxChrom = genome.toChromosome(
37
+ Math.min(domain[1], genome.totalSize - 1)
38
+ );
39
+
40
+ const requestedCount = Math.max(
41
+ 1,
42
+ Math.min(count ?? 10, Math.ceil(domainSpan))
43
+ );
44
+
45
+ let step = tickStep(domain[0], domain[1], requestedCount);
46
+
47
+ if (step < EXACT_LOCUS_LABEL_STEP_THRESHOLD) {
48
+ step = tickStep(domain[0], domain[1], requestedCount * 0.65);
49
+ }
36
50
 
37
- const step = Math.max(1, tickStep(domain[0], domain[1], count));
51
+ step = Math.max(1, step);
38
52
 
39
53
  const ticks = [];
40
54
 
@@ -75,12 +89,17 @@ export default function scaleLocus() {
75
89
  const step = tickStep(
76
90
  domain[0],
77
91
  domain[1],
78
- Math.min(count, Math.ceil(domainSpan))
92
+ Math.max(1, Math.min(count ?? 10, Math.ceil(domainSpan)))
79
93
  );
80
94
  // Use higher display precision for smaller spans
81
95
  // TODO: max absolute value should be taken into account too. 2.00M vs 200M
82
- const numberFormat = step < 1e6 ? d3format(",") : d3format(".3s");
96
+ const numberFormat =
97
+ step < EXACT_LOCUS_LABEL_STEP_THRESHOLD
98
+ ? d3format(",")
99
+ : d3format(".3s");
83
100
 
101
+ // Axis tick values live in the continuous whole-genome coordinate
102
+ // system, but labels should show chromosome-local one-based positions.
84
103
  /** @type {function(number):number} */
85
104
  const fixer = (x) => x - genome.toChromosome(x).continuousStart;
86
105
 
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @typedef {{
3
+ * owner: object,
4
+ * raw: unknown,
5
+ * evaluate: () => string | undefined,
6
+ * watch: (registerDisposer: (dispose: () => void) => void, listener: () => void) => void,
7
+ * }} CursorSource
8
+ */
9
+ /**
10
+ * @param {CursorView | undefined} target
11
+ * @param {{ mark?: CursorOwner } | undefined} hover
12
+ * @returns {CursorSource | undefined}
13
+ */
14
+ export function resolveCursorSource(target: CursorView | undefined, hover: {
15
+ mark?: CursorOwner;
16
+ } | undefined): CursorSource | undefined;
17
+ /**
18
+ * Resolves and applies the active canvas cursor based on the current mark hover
19
+ * and interaction target path.
20
+ */
21
+ /**
22
+ * @typedef {{
23
+ * getCursorSpec?: () => unknown,
24
+ * getCursor: () => string | undefined,
25
+ * watchCursor?: (listener: () => void, registerDisposer: (dispose: () => void) => void) => void,
26
+ * }} CursorOwner
27
+ */
28
+ /**
29
+ * @typedef {CursorOwner & {
30
+ * getLayoutAncestors: () => CursorView[],
31
+ * }} CursorView
32
+ */
33
+ export default class CursorManager {
34
+ /**
35
+ * @param {object} options
36
+ * @param {HTMLCanvasElement} options.canvas
37
+ */
38
+ constructor({ canvas }: {
39
+ canvas: HTMLCanvasElement;
40
+ });
41
+ /**
42
+ * @param {object} options
43
+ * @param {CursorView | undefined} options.target
44
+ * @param {{ mark?: CursorOwner } | undefined} options.hover
45
+ */
46
+ update({ target, hover }: {
47
+ target: CursorView | undefined;
48
+ hover: {
49
+ mark?: CursorOwner;
50
+ } | undefined;
51
+ }): void;
52
+ clear(): void;
53
+ #private;
54
+ }
55
+ export type CursorSource = {
56
+ owner: object;
57
+ raw: unknown;
58
+ evaluate: () => string | undefined;
59
+ watch: (registerDisposer: (dispose: () => void) => void, listener: () => void) => void;
60
+ };
61
+ export type CursorOwner = {
62
+ getCursorSpec?: () => unknown;
63
+ getCursor: () => string | undefined;
64
+ watchCursor?: (listener: () => void, registerDisposer: (dispose: () => void) => void) => void;
65
+ };
66
+ export type CursorView = CursorOwner & {
67
+ getLayoutAncestors: () => CursorView[];
68
+ };
69
+ //# sourceMappingURL=cursorManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorManager.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/cursorManager.js"],"names":[],"mappings":"AA+EA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,4CAJW,UAAU,GAAG,SAAS,SACtB;IAAE,IAAI,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,GAChC,YAAY,GAAG,SAAS,CA2BpC;AAtHD;;;GAGG;AAEH;;;;;;GAMG;AAEH;;;;GAIG;AAEH;IAUI;;;OAGG;IACH,wBAFG;QAAmC,MAAM,EAAjC,iBAAiB;KAC3B,EAGA;IAED;;;;OAIG;IACH,0BAHG;QAAwC,MAAM,EAAtC,UAAU,GAAG,SAAS;QACsB,KAAK,EAAjD;YAAE,IAAI,CAAC,EAAE,WAAW,CAAA;SAAE,GAAG,SAAS;KAC5C,QAGA;IAED,cAEC;;CA6BJ;2BAGY;IACR,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACxF;0BA/ES;IACR,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;CAC/F;yBAIS,WAAW,GAAG;IACtB,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;CACxC"}