@genome-spy/core 0.73.0 → 0.75.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 (392) 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 +21266 -25938
  14. package/dist/bundle/index.js +367 -383
  15. package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
  16. package/dist/schema.json +13421 -7210
  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/dataUtils.d.ts +25 -0
  77. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  78. package/dist/src/data/sources/dataUtils.js +23 -0
  79. package/dist/src/data/sources/inlineSource.js +2 -2
  80. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  81. package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
  82. package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
  83. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  84. package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
  85. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  86. package/dist/src/data/sources/lazy/bamSource.js +11 -0
  87. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  88. package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
  89. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  90. package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
  91. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  92. package/dist/src/data/sources/lazy/gff3Source.js +12 -1
  93. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  94. package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
  95. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
  96. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
  97. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
  98. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
  99. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
  100. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
  101. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  102. package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
  103. package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
  104. package/dist/src/data/sources/lazy/vcfSource.js +11 -0
  105. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  106. package/dist/src/data/sources/urlSource.js +13 -5
  107. package/dist/src/data/transforms/aggregate.d.ts +1 -0
  108. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  109. package/dist/src/data/transforms/aggregate.js +30 -8
  110. package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
  111. package/dist/src/data/transforms/aggregateOps.js +12 -1
  112. package/dist/src/data/transforms/coverage.js +2 -2
  113. package/dist/src/data/transforms/filter.js +1 -1
  114. package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
  115. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  116. package/dist/src/data/transforms/filterScoredLabels.js +9 -0
  117. package/dist/src/data/transforms/measureText.d.ts +1 -0
  118. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  119. package/dist/src/data/transforms/measureText.js +14 -5
  120. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  121. package/dist/src/data/transforms/pileup.js +1 -2
  122. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  123. package/dist/src/data/transforms/regexFold.js +0 -1
  124. package/dist/src/embedFactory.d.ts +13 -0
  125. package/dist/src/embedFactory.d.ts.map +1 -0
  126. package/dist/src/embedFactory.js +127 -0
  127. package/dist/src/encoder/accessor.d.ts +3 -12
  128. package/dist/src/encoder/accessor.d.ts.map +1 -1
  129. package/dist/src/encoder/accessor.js +10 -65
  130. package/dist/src/encoder/encoder.d.ts +51 -8
  131. package/dist/src/encoder/encoder.d.ts.map +1 -1
  132. package/dist/src/encoder/encoder.js +179 -55
  133. package/dist/src/fonts/bmFontManager.js +1 -1
  134. package/dist/src/full.d.ts +2 -0
  135. package/dist/src/full.d.ts.map +1 -0
  136. package/dist/src/full.js +2 -0
  137. package/dist/src/genome/genome.d.ts +8 -0
  138. package/dist/src/genome/genome.d.ts.map +1 -1
  139. package/dist/src/genome/genome.js +16 -2
  140. package/dist/src/genome/genomeStore.js +1 -1
  141. package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -1
  142. package/dist/src/genome/rootGenomeConfig.js +6 -2
  143. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  144. package/dist/src/genome/scaleLocus.js +31 -7
  145. package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
  146. package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
  147. package/dist/src/genomeSpy/cursorManager.js +131 -0
  148. package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
  149. package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
  150. package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
  151. package/dist/src/genomeSpy/interactionController.d.ts +5 -0
  152. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  153. package/dist/src/genomeSpy/interactionController.js +292 -59
  154. package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
  155. package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
  156. package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
  157. package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
  158. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  159. package/dist/src/genomeSpy/viewContextFactory.js +12 -4
  160. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  161. package/dist/src/genomeSpy/viewDataInit.js +7 -3
  162. package/dist/src/genomeSpy.d.ts +1 -124
  163. package/dist/src/genomeSpy.d.ts.map +1 -1
  164. package/dist/src/genomeSpy.js +7 -688
  165. package/dist/src/genomeSpyBase.d.ts +133 -0
  166. package/dist/src/genomeSpyBase.d.ts.map +1 -0
  167. package/dist/src/genomeSpyBase.js +719 -0
  168. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  169. package/dist/src/gl/arrayBuilder.js +0 -3
  170. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  171. package/dist/src/gl/colorUtils.js +3 -0
  172. package/dist/src/gl/dataToVertices.d.ts +12 -14
  173. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  174. package/dist/src/gl/dataToVertices.js +121 -95
  175. package/dist/src/gl/glslScaleGenerator.d.ts +5 -2
  176. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  177. package/dist/src/gl/glslScaleGenerator.js +15 -15
  178. package/dist/src/gl/vertexRangeIndex.d.ts +23 -0
  179. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -0
  180. package/dist/src/gl/vertexRangeIndex.js +150 -0
  181. package/dist/src/index.d.ts +3 -9
  182. package/dist/src/index.d.ts.map +1 -1
  183. package/dist/src/index.js +5 -114
  184. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
  185. package/dist/src/marks/link.d.ts.map +1 -1
  186. package/dist/src/marks/link.js +0 -23
  187. package/dist/src/marks/mark.d.ts +8 -1
  188. package/dist/src/marks/mark.d.ts.map +1 -1
  189. package/dist/src/marks/mark.js +61 -20
  190. package/dist/src/marks/markUtils.d.ts +18 -1
  191. package/dist/src/marks/markUtils.d.ts.map +1 -1
  192. package/dist/src/marks/markUtils.js +52 -4
  193. package/dist/src/marks/point.d.ts.map +1 -1
  194. package/dist/src/marks/point.js +6 -26
  195. package/dist/src/marks/rect.d.ts.map +1 -1
  196. package/dist/src/marks/rect.js +13 -21
  197. package/dist/src/marks/rule.d.ts +7 -2
  198. package/dist/src/marks/rule.d.ts.map +1 -1
  199. package/dist/src/marks/rule.js +125 -16
  200. package/dist/src/marks/text.d.ts.map +1 -1
  201. package/dist/src/marks/text.js +5 -47
  202. package/dist/src/minimal.d.ts +8 -0
  203. package/dist/src/minimal.d.ts.map +1 -0
  204. package/dist/src/minimal.js +21 -0
  205. package/dist/src/paramRuntime/expressionCompiler.d.ts +2 -1
  206. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -1
  207. package/dist/src/paramRuntime/expressionCompiler.js +3 -2
  208. package/dist/src/paramRuntime/expressionRef.d.ts +4 -1
  209. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -1
  210. package/dist/src/paramRuntime/expressionRef.js +10 -3
  211. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -1
  212. package/dist/src/paramRuntime/graphRuntime.js +15 -6
  213. package/dist/src/paramRuntime/paramRuntime.d.ts +8 -2
  214. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -1
  215. package/dist/src/paramRuntime/paramRuntime.js +10 -5
  216. package/dist/src/paramRuntime/types.d.ts +1 -0
  217. package/dist/src/paramRuntime/types.d.ts.map +1 -1
  218. package/dist/src/paramRuntime/types.js +1 -0
  219. package/dist/src/paramRuntime/viewParamRuntime.d.ts +24 -4
  220. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  221. package/dist/src/paramRuntime/viewParamRuntime.js +52 -6
  222. package/dist/src/scale/scale.d.ts.map +1 -1
  223. package/dist/src/scale/scale.js +14 -7
  224. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  225. package/dist/src/scales/axisResolution.js +9 -5
  226. package/dist/src/scales/domainPlanner.d.ts +82 -16
  227. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  228. package/dist/src/scales/domainPlanner.js +364 -131
  229. package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
  230. package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
  231. package/dist/src/scales/indexLikeDomainUtils.js +67 -0
  232. package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
  233. package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
  234. package/dist/src/scales/resolutionMemberOrder.js +22 -0
  235. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  236. package/dist/src/scales/scaleInstanceManager.js +7 -2
  237. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  238. package/dist/src/scales/scaleInteractionController.js +43 -4
  239. package/dist/src/scales/scalePropsResolver.d.ts +5 -3
  240. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  241. package/dist/src/scales/scalePropsResolver.js +108 -8
  242. package/dist/src/scales/scaleResolution.d.ts +35 -1
  243. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  244. package/dist/src/scales/scaleResolution.js +381 -66
  245. package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -1
  246. package/dist/src/scales/scaleResolutionTestUtils.js +6 -2
  247. package/dist/src/scales/scaleRules.d.ts.map +1 -1
  248. package/dist/src/scales/scaleRules.js +16 -2
  249. package/dist/src/scales/selectionDomainUtils.d.ts +30 -0
  250. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  251. package/dist/src/scales/selectionDomainUtils.js +116 -1
  252. package/dist/src/screenshotExport.d.ts +23 -0
  253. package/dist/src/screenshotExport.d.ts.map +1 -0
  254. package/dist/src/screenshotExport.js +44 -0
  255. package/dist/src/screenshotHarness.d.ts.map +1 -1
  256. package/dist/src/screenshotHarness.js +26 -25
  257. package/dist/src/spec/axis.d.ts +43 -32
  258. package/dist/src/spec/channel.d.ts +19 -13
  259. package/dist/src/spec/config.d.ts +264 -0
  260. package/dist/src/spec/data.d.ts +19 -0
  261. package/dist/src/spec/decoration.d.ts +51 -0
  262. package/dist/src/spec/exampleFiles.d.ts +12 -0
  263. package/dist/src/spec/exampleFiles.d.ts.map +1 -0
  264. package/dist/src/spec/exampleFiles.js +52 -0
  265. package/dist/src/spec/font.d.ts +1 -1
  266. package/dist/src/spec/mark.d.ts +97 -13
  267. package/dist/src/spec/parameter.d.ts +30 -10
  268. package/dist/src/spec/root.d.ts +14 -0
  269. package/dist/src/spec/scale.d.ts +31 -14
  270. package/dist/src/spec/title.d.ts +13 -2
  271. package/dist/src/spec/tooltip.d.ts +1 -1
  272. package/dist/src/spec/transform.d.ts +39 -4
  273. package/dist/src/spec/view.d.ts +67 -19
  274. package/dist/src/styles/genome-spy.css +55 -55
  275. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  276. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  277. package/dist/src/styles/genome-spy.css.js +23 -22
  278. package/dist/src/testSetup.d.ts +2 -0
  279. package/dist/src/testSetup.d.ts.map +1 -0
  280. package/dist/src/testSetup.js +5 -0
  281. package/dist/src/tooltip/dataTooltipHandler.js +8 -2
  282. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
  283. package/dist/src/tooltip/tooltipContext.js +3 -2
  284. package/dist/src/types/embedApi.d.ts +7 -0
  285. package/dist/src/types/encoder.d.ts +17 -15
  286. package/dist/src/types/scaleResolutionApi.d.ts +20 -0
  287. package/dist/src/types/viewContext.d.ts +23 -1
  288. package/dist/src/utils/expression.d.ts +18 -10
  289. package/dist/src/utils/expression.d.ts.map +1 -1
  290. package/dist/src/utils/expression.js +354 -19
  291. package/dist/src/utils/field.d.ts.map +1 -1
  292. package/dist/src/utils/field.js +0 -1
  293. package/dist/src/utils/inertia.d.ts.map +1 -1
  294. package/dist/src/utils/inertia.js +0 -1
  295. package/dist/src/utils/inputBinding.d.ts +1 -1
  296. package/dist/src/utils/interaction.d.ts +109 -0
  297. package/dist/src/utils/interaction.d.ts.map +1 -0
  298. package/dist/src/utils/interaction.js +200 -0
  299. package/dist/src/utils/interactionEvent.d.ts +21 -42
  300. package/dist/src/utils/interactionEvent.d.ts.map +1 -1
  301. package/dist/src/utils/interactionEvent.js +43 -66
  302. package/dist/src/utils/kWayMerge.js +1 -1
  303. package/dist/src/utils/mergeObjects.d.ts.map +1 -1
  304. package/dist/src/utils/mergeObjects.js +0 -2
  305. package/dist/src/utils/radixSort.d.ts.map +1 -1
  306. package/dist/src/utils/radixSort.js +0 -2
  307. package/dist/src/utils/throttle.d.ts.map +1 -1
  308. package/dist/src/utils/throttle.js +0 -2
  309. package/dist/src/utils/ui/tooltip.d.ts +1 -0
  310. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  311. package/dist/src/utils/ui/tooltip.js +1 -0
  312. package/dist/src/utils/url.js +1 -1
  313. package/dist/src/view/axisGridView.d.ts +1 -1
  314. package/dist/src/view/axisGridView.d.ts.map +1 -1
  315. package/dist/src/view/axisGridView.js +2 -47
  316. package/dist/src/view/axisView.d.ts +2 -3
  317. package/dist/src/view/axisView.d.ts.map +1 -1
  318. package/dist/src/view/axisView.js +251 -106
  319. package/dist/src/view/concatView.d.ts +2 -1
  320. package/dist/src/view/concatView.d.ts.map +1 -1
  321. package/dist/src/view/concatView.js +4 -2
  322. package/dist/src/view/containerMutationHelper.d.ts +3 -0
  323. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  324. package/dist/src/view/containerMutationHelper.js +4 -1
  325. package/dist/src/view/facetView.d.ts +1 -1
  326. package/dist/src/view/facetView.js +3 -3
  327. package/dist/src/view/flowBuilder.d.ts +1 -1
  328. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  329. package/dist/src/view/flowBuilder.js +13 -9
  330. package/dist/src/view/gridView/gridChild.d.ts +6 -0
  331. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  332. package/dist/src/view/gridView/gridChild.js +72 -43
  333. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  334. package/dist/src/view/gridView/gridView.js +255 -101
  335. package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
  336. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
  337. package/dist/src/view/gridView/keyboardZoomController.js +1 -1
  338. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  339. package/dist/src/view/gridView/scrollbar.js +4 -2
  340. package/dist/src/view/gridView/selectionRect.d.ts +4 -0
  341. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  342. package/dist/src/view/gridView/selectionRect.js +20 -1
  343. package/dist/src/view/gridView/separatorView.d.ts +1 -0
  344. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  345. package/dist/src/view/gridView/separatorView.js +9 -0
  346. package/dist/src/view/interactionRouting.d.ts +20 -0
  347. package/dist/src/view/interactionRouting.d.ts.map +1 -0
  348. package/dist/src/view/interactionRouting.js +53 -0
  349. package/dist/src/view/layerView.d.ts.map +1 -1
  350. package/dist/src/view/layerView.js +12 -9
  351. package/dist/src/view/layout/grid.js +1 -1
  352. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  353. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
  354. package/dist/src/view/resolutionPlanner.d.ts +9 -0
  355. package/dist/src/view/resolutionPlanner.d.ts.map +1 -0
  356. package/dist/src/view/resolutionPlanner.js +302 -0
  357. package/dist/src/view/testUtils.d.ts +17 -3
  358. package/dist/src/view/testUtils.d.ts.map +1 -1
  359. package/dist/src/view/testUtils.js +62 -69
  360. package/dist/src/view/title.d.ts +8 -1
  361. package/dist/src/view/title.d.ts.map +1 -1
  362. package/dist/src/view/title.js +66 -76
  363. package/dist/src/view/unitView.d.ts +1 -1
  364. package/dist/src/view/unitView.d.ts.map +1 -1
  365. package/dist/src/view/unitView.js +72 -169
  366. package/dist/src/view/view.d.ts +76 -30
  367. package/dist/src/view/view.d.ts.map +1 -1
  368. package/dist/src/view/view.js +138 -48
  369. package/dist/src/view/viewFactory.d.ts +11 -3
  370. package/dist/src/view/viewFactory.d.ts.map +1 -1
  371. package/dist/src/view/viewFactory.js +37 -11
  372. package/dist/src/view/viewUtils.d.ts.map +1 -1
  373. package/dist/src/view/viewUtils.js +41 -5
  374. package/dist/src/view/zoom.d.ts +2 -2
  375. package/dist/src/view/zoom.d.ts.map +1 -1
  376. package/dist/src/view/zoom.js +21 -23
  377. package/package.json +18 -10
  378. package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
  379. package/dist/bundle/browser-0iNU5Wit.js +0 -138
  380. package/dist/bundle/index-BYsZN7b0.js +0 -1597
  381. package/dist/bundle/index-C3kClAEN.js +0 -1771
  382. package/dist/bundle/index-C7wOh6y1.js +0 -657
  383. package/dist/bundle/index-CRaQAuki.js +0 -326
  384. package/dist/bundle/index-D9v1PCj9.js +0 -507
  385. package/dist/bundle/index-GDOuv_D5.js +0 -266
  386. package/dist/bundle/index-Gt44EOIH.js +0 -628
  387. package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
  388. package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
  389. package/dist/bundle/unzip-Bac01w6X.js +0 -1492
  390. package/dist/src/config/scaleDefaults.d.ts +0 -8
  391. package/dist/src/config/scaleDefaults.d.ts.map +0 -1
  392. package/dist/src/config/scaleDefaults.js +0 -45
@@ -1 +1 @@
1
- {"version":3,"file":"scaleResolutionTestUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolutionTestUtils.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,+BAJW,OAAO,iBAAiB,EAAE,QAAQ,aAClC;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACxD,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAItD;AAED;;;;GAIG;AACH,iDAJW,OAAO,iBAAiB,EAAE,OAAO,WACjC,OAAO,oBAAoB,EAAE,gBAAgB,GAC3C,OAAO,sBAAsB,EAAE,OAAO,CAQlD;AAED;;;;GAIG;AACH,qCAJW,OAAO,iBAAiB,EAAE,OAAO,WACjC,OAAO,oBAAoB,EAAE,gBAAgB,GAC3C,GAAG,EAAE,CAIjB"}
1
+ {"version":3,"file":"scaleResolutionTestUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolutionTestUtils.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,+BAJW,OAAO,iBAAiB,EAAE,QAAQ,aAClC;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACxD,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAQtD;AAED;;;;GAIG;AACH,iDAJW,OAAO,iBAAiB,EAAE,OAAO,WACjC,OAAO,oBAAoB,EAAE,gBAAgB,GAC3C,OAAO,sBAAsB,EAAE,OAAO,CAQlD;AAED;;;;GAIG;AACH,qCAJW,OAAO,iBAAiB,EAAE,OAAO,WACjC,OAAO,oBAAoB,EAAE,gBAAgB,GAC3C,GAAG,EAAE,CAIjB"}
@@ -1,4 +1,4 @@
1
- import { createAndInitialize } from "../view/testUtils.js";
1
+ import { createHeadlessEngine } from "../genomeSpy/headlessBootstrap.js";
2
2
  import UnitView from "../view/unitView.js";
3
3
 
4
4
  /**
@@ -7,7 +7,11 @@ import UnitView from "../view/unitView.js";
7
7
  * @returns {Promise<import("../view/view.js").default>}
8
8
  */
9
9
  export async function initView(spec, viewType = UnitView) {
10
- return createAndInitialize(spec, viewType);
10
+ const { view } = await createHeadlessEngine(spec);
11
+ if (!(view instanceof viewType)) {
12
+ throw new Error("ViewClass and the spec do not match!");
13
+ }
14
+ return view;
11
15
  }
12
16
 
13
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scaleRules.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleRules.js"],"names":[],"mappings":"AAcA;;GAEG;AAEH;;;;GAIG;AACH,6CAJW,OAAO,YACP,OAAO,oBAAoB,EAAE,IAAI,GAC/B,OAAO,kBAAkB,EAAE,SAAS,CAkEhD;AAED;;;GAGG;AACH,6CAHW,OAAO,kBAAkB,EAAE,KAAK,WAChC,OAAO,QAWjB;sBAvFY,OAAO,oBAAoB,EAAE,OAAO"}
1
+ {"version":3,"file":"scaleRules.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleRules.js"],"names":[],"mappings":"AAcA;;GAEG;AAEH;;;;GAIG;AACH,6CAJW,OAAO,YACP,OAAO,oBAAoB,EAAE,IAAI,GAC/B,OAAO,kBAAkB,EAAE,SAAS,CA2EhD;AAED;;;GAGG;AACH,6CAHW,OAAO,kBAAkB,EAAE,KAAK,WAChC,OAAO,QAgBjB;sBArGY,OAAO,oBAAoB,EAAE,OAAO"}
@@ -22,6 +22,15 @@ import {
22
22
  * @returns {import("../spec/scale.js").ScaleType}
23
23
  */
24
24
  export function getDefaultScaleType(channel, dataType) {
25
+ // TODO: Follow up with Vega-Lite-like discrete positional scale inference.
26
+ // For nominal/ordinal x/y channels, the default should not always be "band".
27
+ // The choice should depend on resolved mark usage and related signals:
28
+ // - rect/bar/rule/tick-like coverage -> "band"
29
+ // - point/text/link-like centered positions -> "point"
30
+ // - explicit relative band sizing / axis tickBand / nested offsets -> "band"
31
+ // This requires passing richer context than just channel + dataType.
32
+ //
33
+ // Keep the current behavior in this branch to avoid changing existing specs.
25
34
  // TODO: Band scale, Bin-Quantitative
26
35
 
27
36
  if (dataType == INDEX || dataType == LOCUS) {
@@ -93,11 +102,16 @@ export function getDefaultScaleType(channel, dataType) {
93
102
  */
94
103
  export function applyLockedProperties(props, channel) {
95
104
  if (isPositionalChannel(channel) && props.type !== "ordinal") {
96
- // Unit ranges are a temporary default until pixel ranges are adopted.
105
+ // Positional scales currently operate in unit coordinates.
106
+ // Keep this invariant until pixel ranges are adopted.
97
107
  props.range = [0, 1];
98
108
  }
99
109
 
100
- if (channel == "opacity" && isContinuous(props.type)) {
110
+ if (
111
+ channel == "opacity" &&
112
+ isContinuous(props.type) &&
113
+ props.clamp === undefined
114
+ ) {
101
115
  props.clamp = true;
102
116
  }
103
117
  }
@@ -10,6 +10,36 @@ export function requireParamRuntime(paramRuntime: {
10
10
  * @param {string} paramName
11
11
  */
12
12
  export function requireIntervalSelection(selection: any, paramName: string): import("../types/selectionTypes.js").IntervalSelection;
13
+ /**
14
+ * Resolves the runtime-backed interval selection binding used by a linked
15
+ * domain. Matching is based on the actual resolved runtime slot instead of
16
+ * parameter name alone, so scoped params with the same name remain distinct.
17
+ *
18
+ * @param {import("../view/view.js").default} view
19
+ * @param {string} paramName
20
+ * @param {"x" | "y"} encoding
21
+ */
22
+ export function resolveIntervalSelectionBinding(view: import("../view/view.js").default, paramName: string, encoding: "x" | "y"): {
23
+ runtime: any;
24
+ selection: import("../types/selectionTypes.js").IntervalSelection;
25
+ };
26
+ /**
27
+ * @param {import("../view/view.js").default} root
28
+ * @param {any} runtime
29
+ * @param {string} paramName
30
+ * @param {"x" | "y"} encoding
31
+ */
32
+ export function findIntervalSelectionBindingOwners(root: import("../view/view.js").default, runtime: any, paramName: string, encoding: "x" | "y"): {
33
+ view: import("../view/view.js").default;
34
+ param: import("../spec/parameter.js").SelectionParameter;
35
+ }[];
36
+ /**
37
+ * @param {import("../view/view.js").default} view
38
+ * @param {any} runtime
39
+ * @param {string} paramName
40
+ * @param {"x" | "y"} encoding
41
+ */
42
+ export function hasIntervalSelectionBindingInScope(view: import("../view/view.js").default, runtime: any, paramName: string, encoding: "x" | "y"): boolean;
13
43
  /**
14
44
  * @param {number[]} interval
15
45
  * @param {number[]} zoomExtent
@@ -1 +1 @@
1
- {"version":3,"file":"selectionDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/selectionDomainUtils.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,kDAHW;IAAE,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;CAAE,aAC9C,MAAM,OAUhB;AAED;;;GAGG;AACH,oDAHW,GAAG,aACH,MAAM,0DAgBhB;AAED;;;;;GAKG;AACH,wDALW,MAAM,EAAE,cACR,MAAM,EAAE,YACR;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAsCxC"}
1
+ {"version":3,"file":"selectionDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/selectionDomainUtils.js"],"names":[],"mappings":"AAOA;;;GAGG;AACH,kDAHW;IAAE,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAA;CAAE,aAC9C,MAAM,OAUhB;AAED;;;GAGG;AACH,oDAHW,GAAG,aACH,MAAM,0DAgBhB;AAED;;;;;;;;GAQG;AACH,sDAJW,OAAO,iBAAiB,EAAE,OAAO,aACjC,MAAM,YACN,GAAG,GAAG,GAAG;;;EAiBnB;AAED;;;;;GAKG;AACH,yDALW,OAAO,iBAAiB,EAAE,OAAO,WACjC,GAAG,aACH,MAAM,YACN,GAAG,GAAG,GAAG;UAGG,OAAO,iBAAiB,EAAE,OAAO;WAAS,OAAO,sBAAsB,EAAE,kBAAkB;IAuBjH;AAED;;;;;GAKG;AACH,yDALW,OAAO,iBAAiB,EAAE,OAAO,WACjC,GAAG,aACH,MAAM,YACN,GAAG,GAAG,GAAG,WA8CnB;AAED;;;;;GAKG;AACH,wDALW,MAAM,EAAE,cACR,MAAM,EAAE,YACR;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAsCxC"}
@@ -1,4 +1,9 @@
1
- import { isIntervalSelection } from "../selection/selection.js";
1
+ import { isSelectionParameter } from "../paramRuntime/paramUtils.js";
2
+ import {
3
+ asSelectionConfig,
4
+ isIntervalSelection,
5
+ isIntervalSelectionConfig,
6
+ } from "../selection/selection.js";
2
7
 
3
8
  /**
4
9
  * @param {{ findRuntimeForParam: (name: string) => any }} paramRuntime
@@ -34,6 +39,116 @@ export function requireIntervalSelection(selection, paramName) {
34
39
  return selection;
35
40
  }
36
41
 
42
+ /**
43
+ * Resolves the runtime-backed interval selection binding used by a linked
44
+ * domain. Matching is based on the actual resolved runtime slot instead of
45
+ * parameter name alone, so scoped params with the same name remain distinct.
46
+ *
47
+ * @param {import("../view/view.js").default} view
48
+ * @param {string} paramName
49
+ * @param {"x" | "y"} encoding
50
+ */
51
+ export function resolveIntervalSelectionBinding(view, paramName, encoding) {
52
+ const runtime = view.paramRuntime.findRuntimeForParam
53
+ ? requireParamRuntime(view.paramRuntime, paramName)
54
+ : view.paramRuntime;
55
+ const selection = requireIntervalSelection(
56
+ runtime.getValue
57
+ ? runtime.getValue(paramName)
58
+ : view.paramRuntime.findValue(paramName),
59
+ paramName
60
+ );
61
+
62
+ return {
63
+ runtime,
64
+ selection,
65
+ };
66
+ }
67
+
68
+ /**
69
+ * @param {import("../view/view.js").default} root
70
+ * @param {any} runtime
71
+ * @param {string} paramName
72
+ * @param {"x" | "y"} encoding
73
+ */
74
+ export function findIntervalSelectionBindingOwners(root, runtime, paramName, encoding) {
75
+ /** @type {{ view: import("../view/view.js").default, param: import("../spec/parameter.js").SelectionParameter }[]} */
76
+ const owners = [];
77
+
78
+ root.visit((view) => {
79
+ const param = view.paramRuntime?.paramConfigs?.get(paramName);
80
+ if (!param || !isSelectionParameter(param)) {
81
+ return;
82
+ }
83
+
84
+ const select = asSelectionConfig(param.select);
85
+ if (
86
+ !isIntervalSelectionConfig(select) ||
87
+ !select.encodings?.includes(encoding)
88
+ ) {
89
+ return;
90
+ }
91
+
92
+ if (view.paramRuntime.findRuntimeForParam(paramName) === runtime) {
93
+ owners.push({ view, param });
94
+ }
95
+ });
96
+
97
+ return owners;
98
+ }
99
+
100
+ /**
101
+ * @param {import("../view/view.js").default} view
102
+ * @param {any} runtime
103
+ * @param {string} paramName
104
+ * @param {"x" | "y"} encoding
105
+ */
106
+ export function hasIntervalSelectionBindingInScope(
107
+ view,
108
+ runtime,
109
+ paramName,
110
+ encoding
111
+ ) {
112
+ const seen = new Set();
113
+ const ancestorGroups = [
114
+ view.getLayoutAncestors?.(),
115
+ view.getDataAncestors?.(),
116
+ [view],
117
+ ];
118
+
119
+ for (const views of ancestorGroups) {
120
+ for (const candidateView of views ?? []) {
121
+ if (!candidateView || seen.has(candidateView)) {
122
+ continue;
123
+ }
124
+
125
+ seen.add(candidateView);
126
+
127
+ const param = candidateView.paramRuntime?.paramConfigs?.get(paramName);
128
+ if (!param || !isSelectionParameter(param)) {
129
+ continue;
130
+ }
131
+
132
+ const select = asSelectionConfig(param.select);
133
+ if (
134
+ !isIntervalSelectionConfig(select) ||
135
+ !select.encodings?.includes(encoding)
136
+ ) {
137
+ continue;
138
+ }
139
+
140
+ if (
141
+ candidateView.paramRuntime.findRuntimeForParam?.(paramName) ===
142
+ runtime
143
+ ) {
144
+ return true;
145
+ }
146
+ }
147
+ }
148
+
149
+ return false;
150
+ }
151
+
37
152
  /**
38
153
  * @param {number[]} interval
39
154
  * @param {number[]} zoomExtent
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {{ width: number | undefined, height: number | undefined }} renderedBounds
3
+ * @param {{ width: number, height: number }} logicalSize
4
+ */
5
+ export function resolveExportSize(renderedBounds: {
6
+ width: number | undefined;
7
+ height: number | undefined;
8
+ }, logicalSize: {
9
+ width: number;
10
+ height: number;
11
+ }): {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ /**
16
+ * Returns the smallest DPR that yields at least 400 physical pixels vertically.
17
+ *
18
+ * Fractional DPRs are rounded upward to the nearest 0.5.
19
+ *
20
+ * @param {number} logicalHeight
21
+ */
22
+ export function resolveCaptureDevicePixelRatio(logicalHeight: number): number;
23
+ //# sourceMappingURL=screenshotExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotExport.d.ts","sourceRoot":"","sources":["../../src/screenshotExport.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,kDAHW;IAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,eACzD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;;;EAiB3C;AAED;;;;;;GAMG;AACH,8DAFW,MAAM,UAehB"}
@@ -0,0 +1,44 @@
1
+ const MIN_VERTICAL_RESOLUTION = 400;
2
+
3
+ /**
4
+ * @param {{ width: number | undefined, height: number | undefined }} renderedBounds
5
+ * @param {{ width: number, height: number }} logicalSize
6
+ */
7
+ export function resolveExportSize(renderedBounds, logicalSize) {
8
+ return {
9
+ width:
10
+ Number.isFinite(renderedBounds.width) && renderedBounds.width > 0
11
+ ? Math.ceil(renderedBounds.width)
12
+ : Number.isFinite(logicalSize.width) && logicalSize.width > 0
13
+ ? logicalSize.width
14
+ : 500,
15
+ height:
16
+ Number.isFinite(renderedBounds.height) && renderedBounds.height > 0
17
+ ? Math.ceil(renderedBounds.height)
18
+ : Number.isFinite(logicalSize.height) && logicalSize.height > 0
19
+ ? logicalSize.height
20
+ : 280,
21
+ };
22
+ }
23
+
24
+ /**
25
+ * Returns the smallest DPR that yields at least 400 physical pixels vertically.
26
+ *
27
+ * Fractional DPRs are rounded upward to the nearest 0.5.
28
+ *
29
+ * @param {number} logicalHeight
30
+ */
31
+ export function resolveCaptureDevicePixelRatio(logicalHeight) {
32
+ if (!Number.isFinite(logicalHeight) || logicalHeight <= 0) {
33
+ throw new Error(
34
+ `Expected a positive logical height, got ${logicalHeight}.`
35
+ );
36
+ }
37
+
38
+ if (logicalHeight >= MIN_VERTICAL_RESOLUTION) {
39
+ return 1;
40
+ }
41
+
42
+ const requiredDevicePixelRatio = MIN_VERTICAL_RESOLUTION / logicalHeight;
43
+ return Math.ceil(requiredDevicePixelRatio * 2) / 2;
44
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotHarness.d.ts","sourceRoot":"","sources":["../../src/screenshotHarness.js"],"names":[],"mappings":"8BAQa;IACR,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5F;+BAIS,MAAM,GAAG,OAAO,UAAU,GAAG;IAAE,qBAAqB,EAAE,eAAe,CAAA;CAAE"}
1
+ {"version":3,"file":"screenshotHarness.d.ts","sourceRoot":"","sources":["../../src/screenshotHarness.js"],"names":[],"mappings":"8BAYa;IACR,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC5F;+BAIS,MAAM,GAAG,OAAO,UAAU,GAAG;IAAE,qBAAqB,EAAE,eAAe,CAAA;CAAE"}
@@ -1,8 +1,12 @@
1
1
  import { embed, loadSpec } from "./index.js";
2
-
3
- const DEFAULT_CONTAINER_WIDTH = 600;
4
- const DEFAULT_CONTAINER_HEIGHT = 320;
5
- const DEFAULT_LAZY_READY_TIMEOUT_MS = 30_000;
2
+ import {
3
+ resolveCaptureDevicePixelRatio,
4
+ resolveExportSize,
5
+ } from "./screenshotExport.js";
6
+
7
+ const DEFAULT_CONTAINER_WIDTH = 500;
8
+ const DEFAULT_CONTAINER_HEIGHT = 300;
9
+ const DEFAULT_LAZY_READY_TIMEOUT_MS = 10_000;
6
10
  const READY_DELAY_MS = 100;
7
11
 
8
12
  /**
@@ -89,22 +93,30 @@ async function initializeHarness(url) {
89
93
  api.getRenderedBounds(),
90
94
  api.getLogicalCanvasSize()
91
95
  );
96
+ const devicePixelRatio = resolveCaptureDevicePixelRatio(
97
+ logicalSize.height
98
+ );
92
99
 
93
100
  screenshotWindow.__genomeSpyScreenshot = {
94
101
  status: "ready",
95
- detail: `Ready (${logicalSize.width}x${logicalSize.height}, DPR 1)`,
102
+ detail: `Ready (${logicalSize.width}x${logicalSize.height}, DPR ${formatDevicePixelRatio(
103
+ devicePixelRatio
104
+ )})`,
96
105
  error: "",
97
106
  async capture() {
98
107
  const currentSize = resolveExportSize(
99
108
  api.getRenderedBounds(),
100
109
  api.getLogicalCanvasSize()
101
110
  );
111
+ const currentDevicePixelRatio = resolveCaptureDevicePixelRatio(
112
+ currentSize.height
113
+ );
102
114
  return {
103
115
  logicalSize: currentSize,
104
116
  dataUrl: api.exportCanvas(
105
117
  currentSize.width,
106
118
  currentSize.height,
107
- 1,
119
+ currentDevicePixelRatio,
108
120
  "white"
109
121
  ),
110
122
  };
@@ -112,7 +124,9 @@ async function initializeHarness(url) {
112
124
  };
113
125
 
114
126
  setStatus(
115
- `Ready (${logicalSize.width}x${logicalSize.height}, DPR 1)`
127
+ `Ready (${logicalSize.width}x${logicalSize.height}, DPR ${formatDevicePixelRatio(
128
+ devicePixelRatio
129
+ )})`
116
130
  );
117
131
  } catch (error) {
118
132
  setFailure(error instanceof Error ? error.message : String(error));
@@ -144,7 +158,8 @@ async function waitForVisibleLazyData(api, timeoutMs) {
144
158
  } catch (error) {
145
159
  if (timedOut) {
146
160
  throw new Error(
147
- `Timed out after ${timeoutMs} ms while waiting for visible lazy data.`
161
+ `Timed out after ${timeoutMs} ms while waiting for visible lazy data.`,
162
+ { cause: error }
148
163
  );
149
164
  }
150
165
 
@@ -185,24 +200,10 @@ function parseTimeoutMs(value, fallback) {
185
200
  }
186
201
 
187
202
  /**
188
- * @param {{ width: number | undefined, height: number | undefined }} renderedBounds
189
- * @param {{ width: number, height: number }} logicalSize
203
+ * @param {number} value
190
204
  */
191
- function resolveExportSize(renderedBounds, logicalSize) {
192
- return {
193
- width:
194
- Number.isFinite(renderedBounds.width) && renderedBounds.width > 0
195
- ? Math.ceil(renderedBounds.width)
196
- : Number.isFinite(logicalSize.width) && logicalSize.width > 0
197
- ? logicalSize.width
198
- : DEFAULT_CONTAINER_WIDTH,
199
- height:
200
- Number.isFinite(renderedBounds.height) && renderedBounds.height > 0
201
- ? Math.ceil(renderedBounds.height)
202
- : Number.isFinite(logicalSize.height) && logicalSize.height > 0
203
- ? logicalSize.height
204
- : DEFAULT_CONTAINER_HEIGHT,
205
- };
205
+ function formatDevicePixelRatio(value) {
206
+ return value.toFixed(3).replace(/\.?0+$/, "");
206
207
  }
207
208
 
208
209
  /**
@@ -1,4 +1,5 @@
1
1
  import { Align, Baseline, FontStyle, FontWeight } from "./font.js";
2
+ import { ZIndexProps } from "./decoration.js";
2
3
 
3
4
  export interface GenomeAxis extends Axis {
4
5
  chromTicks?: boolean;
@@ -91,7 +92,13 @@ export interface GenomeAxis extends Axis {
91
92
 
92
93
  export type AxisOrient = "top" | "bottom" | "left" | "right";
93
94
 
94
- export interface Axis extends BaseAxis {
95
+ export interface Axis extends BaseAxis, ZIndexProps {
96
+ /**
97
+ * Named style reference(s) resolved from `config.style`.
98
+ * If an array is provided, later styles override earlier ones.
99
+ */
100
+ style?: string | string[];
101
+
95
102
  /**
96
103
  * The orientation of the axis. One of `"top"`, `"bottom"`, `"left"` or `"right"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart).
97
104
  *
@@ -106,9 +113,9 @@ export interface Axis extends BaseAxis {
106
113
  format?: string;
107
114
 
108
115
  /**
109
- * A title for the axis (none by default).
116
+ * A title for the axis (none by default). Set to `null` to remove it.
110
117
  */
111
- title?: string;
118
+ title?: string | null;
112
119
 
113
120
  /**
114
121
  * The orthogonal offset in pixels by which to displace the axis from its position along the edge of the chart.
@@ -131,68 +138,72 @@ export interface Axis extends BaseAxis {
131
138
  * Explicitly set the visible axis tick and label values.
132
139
  */
133
140
  values?: any[];
141
+
142
+ /**
143
+ * Z-order of the axis relative to the view content.
144
+ *
145
+ * Values greater than `0` render after the view marks. Values less than or
146
+ * equal to `0` render before the marks.
147
+ *
148
+ * __Default value:__ `0`, or `10` when the view content is clipped or
149
+ * scrollable.
150
+ */
151
+ zindex?: number;
134
152
  }
135
153
 
136
- export interface BaseAxis<
137
- N = number,
138
- B = boolean,
139
- S = string,
140
- C = string,
141
- FW = string,
142
- FS = string,
143
- > {
154
+ export interface BaseAxis {
144
155
  /**
145
156
  * The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles.
146
157
  *
147
158
  * __Default value:__ `30` for y-axis; `undefined` for x-axis.
148
159
  */
149
- minExtent?: N;
160
+ minExtent?: number;
150
161
 
151
162
  /**
152
163
  * The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles.
153
164
  *
154
165
  * __Default value:__ `undefined`.
155
166
  */
156
- maxExtent?: N;
167
+ maxExtent?: number;
157
168
 
158
169
  // ---------- Title ----------
159
170
  /**
160
171
  * The padding, in pixels, between title and axis.
161
172
  */
162
- titlePadding?: N;
173
+ titlePadding?: number;
163
174
 
164
175
  /**
165
176
  * Color of the title, can be in hex color code or regular color name.
166
177
  */
167
- titleColor?: C;
178
+ titleColor?: string;
168
179
 
169
180
  /**
170
181
  * Font of the title. (e.g., `"Helvetica Neue"`).
171
182
  */
172
- titleFont?: S;
183
+ titleFont?: string;
173
184
 
174
185
  /**
175
186
  * Font size of the title.
176
187
  *
177
188
  * @minimum 0
178
189
  */
179
- titleFontSize?: N;
190
+ titleFontSize?: number;
180
191
 
181
192
  /**
182
193
  * Font style of the title.
183
194
  */
184
- titleFontStyle?: FS;
195
+ titleFontStyle?: FontStyle;
185
196
 
186
197
  /**
187
198
  * Font weight of the title.
188
199
  * This can be either a string (e.g `"bold"`, `"normal"`) or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`).
189
200
  */
190
- titleFontWeight?: FW;
201
+ titleFontWeight?: FontWeight;
191
202
 
192
203
  /**
193
204
  * Opacity of the axis title.
194
205
  */
195
- titleOpacity?: N;
206
+ titleOpacity?: number;
196
207
 
197
208
  // ---------- Domain ----------
198
209
  /**
@@ -224,14 +235,14 @@ export interface BaseAxis<
224
235
  *
225
236
  * __Default value:__ `"gray"`.
226
237
  */
227
- domainColor?: C;
238
+ domainColor?: string;
228
239
 
229
240
  /**
230
241
  * Stroke width of axis domain line
231
242
  *
232
243
  * __Default value:__ `1`
233
244
  */
234
- domainWidth?: N;
245
+ domainWidth?: number;
235
246
 
236
247
  // ---------- Ticks ----------
237
248
  /**
@@ -239,7 +250,7 @@ export interface BaseAxis<
239
250
  *
240
251
  * __Default value:__ `true`
241
252
  */
242
- ticks?: B;
253
+ ticks?: boolean;
243
254
 
244
255
  /**
245
256
  * The stroke cap for the tick lines' ending style. One of `"butt"`, `"round"` or `"square"`.
@@ -253,7 +264,7 @@ export interface BaseAxis<
253
264
  *
254
265
  * __Default value:__ `"gray"`
255
266
  */
256
- tickColor?: C;
267
+ tickColor?: string;
257
268
 
258
269
  /**
259
270
  * An array of alternating [stroke, space] lengths for dashed tick mark lines.
@@ -271,7 +282,7 @@ export interface BaseAxis<
271
282
  * __Default value:__ `5`
272
283
  * @minimum 0
273
284
  */
274
- tickSize?: N;
285
+ tickSize?: number;
275
286
 
276
287
  /**
277
288
  * The width, in pixels, of ticks.
@@ -279,7 +290,7 @@ export interface BaseAxis<
279
290
  * __Default value:__ `1`
280
291
  * @minimum 0
281
292
  */
282
- tickWidth?: N;
293
+ tickWidth?: number;
283
294
 
284
295
  // ---------- Labels ----------
285
296
  /**
@@ -313,36 +324,36 @@ export interface BaseAxis<
313
324
  /**
314
325
  * The color of the tick label, can be in hex color code or regular color name.
315
326
  */
316
- labelColor?: C;
327
+ labelColor?: string;
317
328
 
318
329
  /**
319
330
  * The font of the tick label.
320
331
  */
321
- labelFont?: S;
332
+ labelFont?: string;
322
333
 
323
334
  /**
324
335
  * The font size of the label, in pixels.
325
336
  *
326
337
  * @minimum 0
327
338
  */
328
- labelFontSize?: N;
339
+ labelFontSize?: number;
329
340
 
330
341
  /**
331
342
  * Font style of the title.
332
343
  */
333
- labelFontStyle?: FS;
344
+ labelFontStyle?: FontStyle;
334
345
 
335
346
  /**
336
347
  * Font weight of axis tick labels.
337
348
  */
338
- labelFontWeight?: FW;
349
+ labelFontWeight?: FontWeight;
339
350
 
340
351
  /**
341
352
  * Maximum allowed pixel width of axis tick labels.
342
353
  *
343
354
  * __Default value:__ `180`
344
355
  */
345
- labelLimit?: N;
356
+ labelLimit?: number;
346
357
 
347
358
  /**
348
359
  * The padding, in pixels, between axis and text labels.