@genome-spy/core 0.72.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 (396) hide show
  1. package/LICENSE +1 -1
  2. package/dist/bundle/AbortablePromiseCache-3gHJdF3E.js +96 -0
  3. package/dist/bundle/browser-BTgw5ieH.js +126 -0
  4. package/dist/bundle/chunk-DmhlhrBa.js +11 -0
  5. package/dist/bundle/esm-BDFRLEuD.js +1248 -0
  6. package/dist/bundle/esm-BygJiwh0.js +573 -0
  7. package/dist/bundle/esm-CGX-qz1d.js +155 -0
  8. package/dist/bundle/esm-CgfVIRJ-.js +121 -0
  9. package/dist/bundle/esm-CuMSzCHy.js +298 -0
  10. package/dist/bundle/esm-DMXpJXM4.js +369 -0
  11. package/dist/bundle/esm-DQiq2Zhd.js +1426 -0
  12. package/dist/bundle/esm-DtE8VqAv.js +1015 -0
  13. package/dist/bundle/esm-sIoQYZ21.js +461 -0
  14. package/dist/bundle/index.es.js +21078 -24556
  15. package/dist/bundle/index.js +379 -383
  16. package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
  17. package/dist/schema.json +13349 -7082
  18. package/dist/src/config/axisConfig.d.ts +16 -0
  19. package/dist/src/config/axisConfig.d.ts.map +1 -0
  20. package/dist/src/config/axisConfig.js +84 -0
  21. package/dist/src/config/defaultConfig.d.ts +3 -0
  22. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  23. package/dist/src/config/defaultConfig.js +38 -0
  24. package/dist/src/config/defaults/axisDefaults.d.ts +5 -0
  25. package/dist/src/config/defaults/axisDefaults.d.ts.map +1 -0
  26. package/dist/src/config/defaults/axisDefaults.js +72 -0
  27. package/dist/src/config/defaults/markDefaults.d.ts +15 -0
  28. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -0
  29. package/dist/src/config/defaults/markDefaults.js +121 -0
  30. package/dist/src/config/defaults/scaleDefaults.d.ts +5 -0
  31. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -0
  32. package/dist/src/config/defaults/scaleDefaults.js +18 -0
  33. package/dist/src/config/defaults/titleDefaults.d.ts +5 -0
  34. package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -0
  35. package/dist/src/config/defaults/titleDefaults.js +47 -0
  36. package/dist/src/config/defaults/viewDefaults.d.ts +3 -0
  37. package/dist/src/config/defaults/viewDefaults.d.ts.map +1 -0
  38. package/dist/src/config/defaults/viewDefaults.js +2 -0
  39. package/dist/src/config/markConfig.d.ts +8 -0
  40. package/dist/src/config/markConfig.d.ts.map +1 -0
  41. package/dist/src/config/markConfig.js +27 -0
  42. package/dist/src/config/mergeConfig.d.ts +8 -0
  43. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  44. package/dist/src/config/mergeConfig.js +81 -0
  45. package/dist/src/config/resolveConfig.d.ts +22 -0
  46. package/dist/src/config/resolveConfig.d.ts.map +1 -0
  47. package/dist/src/config/resolveConfig.js +32 -0
  48. package/dist/src/config/scaleConfig.d.ts +40 -0
  49. package/dist/src/config/scaleConfig.d.ts.map +1 -0
  50. package/dist/src/config/scaleConfig.js +220 -0
  51. package/dist/src/config/styleUtils.d.ts +6 -0
  52. package/dist/src/config/styleUtils.d.ts.map +1 -0
  53. package/dist/src/config/styleUtils.js +10 -0
  54. package/dist/src/config/themes.d.ts +15 -0
  55. package/dist/src/config/themes.d.ts.map +1 -0
  56. package/dist/src/config/themes.js +293 -0
  57. package/dist/src/config/titleConfig.d.ts +12 -0
  58. package/dist/src/config/titleConfig.d.ts.map +1 -0
  59. package/dist/src/config/titleConfig.js +42 -0
  60. package/dist/src/config/viewConfig.d.ts +7 -0
  61. package/dist/src/config/viewConfig.d.ts.map +1 -0
  62. package/dist/src/config/viewConfig.js +29 -0
  63. package/dist/src/data/flowNode.d.ts +22 -1
  64. package/dist/src/data/flowNode.d.ts.map +1 -1
  65. package/dist/src/data/flowNode.js +37 -1
  66. package/dist/src/data/formats/bed.d.ts +8 -0
  67. package/dist/src/data/formats/bed.d.ts.map +1 -0
  68. package/dist/src/data/formats/bed.js +58 -0
  69. package/dist/src/data/formats/bedpe.d.ts +8 -0
  70. package/dist/src/data/formats/bedpe.d.ts.map +1 -0
  71. package/dist/src/data/formats/bedpe.js +164 -0
  72. package/dist/src/data/formats/fasta.d.ts.map +1 -1
  73. package/dist/src/data/formats/fasta.js +4 -0
  74. package/dist/src/data/formats/parquet.d.ts.map +1 -1
  75. package/dist/src/data/formats/parquet.js +4 -0
  76. package/dist/src/data/sources/dataSourceFactory.d.ts +2 -13
  77. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  78. package/dist/src/data/sources/dataSourceFactory.js +5 -141
  79. package/dist/src/data/sources/dataUtils.d.ts +16 -0
  80. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  81. package/dist/src/data/sources/dataUtils.js +53 -3
  82. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  83. package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
  84. package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
  85. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  86. package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
  87. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  88. package/dist/src/data/sources/lazy/bamSource.js +11 -0
  89. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  90. package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
  91. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  92. package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
  93. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  94. package/dist/src/data/sources/lazy/gff3Source.js +12 -1
  95. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  96. package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
  97. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
  98. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
  99. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
  100. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
  101. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
  102. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
  103. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  104. package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
  105. package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
  106. package/dist/src/data/sources/lazy/vcfSource.js +11 -0
  107. package/dist/src/data/sources/urlSource.d.ts +4 -0
  108. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  109. package/dist/src/data/sources/urlSource.js +138 -16
  110. package/dist/src/data/transforms/aggregate.d.ts +1 -0
  111. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  112. package/dist/src/data/transforms/aggregate.js +30 -8
  113. package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
  114. package/dist/src/data/transforms/aggregateOps.js +12 -1
  115. package/dist/src/data/transforms/coverage.js +2 -2
  116. package/dist/src/data/transforms/filter.js +1 -1
  117. package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
  118. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  119. package/dist/src/data/transforms/filterScoredLabels.js +9 -0
  120. package/dist/src/data/transforms/measureText.d.ts +1 -0
  121. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  122. package/dist/src/data/transforms/measureText.js +14 -5
  123. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  124. package/dist/src/data/transforms/pileup.js +1 -2
  125. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  126. package/dist/src/data/transforms/regexFold.js +0 -1
  127. package/dist/src/embedFactory.d.ts +13 -0
  128. package/dist/src/embedFactory.d.ts.map +1 -0
  129. package/dist/src/embedFactory.js +127 -0
  130. package/dist/src/encoder/accessor.d.ts +3 -12
  131. package/dist/src/encoder/accessor.d.ts.map +1 -1
  132. package/dist/src/encoder/accessor.js +10 -65
  133. package/dist/src/encoder/encoder.d.ts +51 -8
  134. package/dist/src/encoder/encoder.d.ts.map +1 -1
  135. package/dist/src/encoder/encoder.js +179 -55
  136. package/dist/src/fonts/bmFontManager.js +1 -1
  137. package/dist/src/full.d.ts +2 -0
  138. package/dist/src/full.d.ts.map +1 -0
  139. package/dist/src/full.js +2 -0
  140. package/dist/src/genome/assemblyPreflight.d.ts +31 -0
  141. package/dist/src/genome/assemblyPreflight.d.ts.map +1 -0
  142. package/dist/src/genome/assemblyPreflight.js +99 -0
  143. package/dist/src/genome/genome.d.ts +10 -2
  144. package/dist/src/genome/genome.d.ts.map +1 -1
  145. package/dist/src/genome/genome.js +20 -2
  146. package/dist/src/genome/genomeStore.d.ts +34 -3
  147. package/dist/src/genome/genomeStore.d.ts.map +1 -1
  148. package/dist/src/genome/genomeStore.js +409 -18
  149. package/dist/src/genome/rootGenomeConfig.d.ts +26 -0
  150. package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -0
  151. package/dist/src/genome/rootGenomeConfig.js +98 -0
  152. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  153. package/dist/src/genome/scaleLocus.js +26 -7
  154. package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
  155. package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
  156. package/dist/src/genomeSpy/cursorManager.js +131 -0
  157. package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
  158. package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
  159. package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
  160. package/dist/src/genomeSpy/interactionController.d.ts +10 -1
  161. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  162. package/dist/src/genomeSpy/interactionController.js +448 -40
  163. package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
  164. package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
  165. package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
  166. package/dist/src/genomeSpy/renderCoordinator.js +1 -1
  167. package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
  168. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  169. package/dist/src/genomeSpy/viewContextFactory.js +12 -4
  170. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  171. package/dist/src/genomeSpy/viewDataInit.js +7 -3
  172. package/dist/src/genomeSpy.d.ts +1 -114
  173. package/dist/src/genomeSpy.d.ts.map +1 -1
  174. package/dist/src/genomeSpy.js +7 -614
  175. package/dist/src/genomeSpyBase.d.ts +133 -0
  176. package/dist/src/genomeSpyBase.d.ts.map +1 -0
  177. package/dist/src/genomeSpyBase.js +719 -0
  178. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  179. package/dist/src/gl/arrayBuilder.js +0 -3
  180. package/dist/src/gl/canvasSizeHelper.d.ts +74 -0
  181. package/dist/src/gl/canvasSizeHelper.d.ts.map +1 -0
  182. package/dist/src/gl/canvasSizeHelper.js +203 -0
  183. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  184. package/dist/src/gl/colorUtils.js +3 -0
  185. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  186. package/dist/src/gl/dataToVertices.js +13 -8
  187. package/dist/src/gl/glslScaleGenerator.d.ts +2 -2
  188. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  189. package/dist/src/gl/glslScaleGenerator.js +5 -7
  190. package/dist/src/gl/webGLHelper.d.ts +25 -11
  191. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  192. package/dist/src/gl/webGLHelper.js +59 -33
  193. package/dist/src/index.d.ts +3 -9
  194. package/dist/src/index.d.ts.map +1 -1
  195. package/dist/src/index.js +5 -111
  196. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
  197. package/dist/src/marks/link.d.ts.map +1 -1
  198. package/dist/src/marks/link.js +5 -26
  199. package/dist/src/marks/mark.d.ts +8 -1
  200. package/dist/src/marks/mark.d.ts.map +1 -1
  201. package/dist/src/marks/mark.js +67 -21
  202. package/dist/src/marks/markUtils.d.ts +18 -1
  203. package/dist/src/marks/markUtils.d.ts.map +1 -1
  204. package/dist/src/marks/markUtils.js +52 -4
  205. package/dist/src/marks/point.d.ts.map +1 -1
  206. package/dist/src/marks/point.js +6 -26
  207. package/dist/src/marks/rect.d.ts.map +1 -1
  208. package/dist/src/marks/rect.js +13 -21
  209. package/dist/src/marks/rule.d.ts +7 -2
  210. package/dist/src/marks/rule.d.ts.map +1 -1
  211. package/dist/src/marks/rule.js +125 -16
  212. package/dist/src/marks/text.d.ts.map +1 -1
  213. package/dist/src/marks/text.js +5 -47
  214. package/dist/src/minimal.d.ts +8 -0
  215. package/dist/src/minimal.d.ts.map +1 -0
  216. package/dist/src/minimal.js +21 -0
  217. package/dist/src/paramRuntime/viewParamRuntime.d.ts +19 -0
  218. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  219. package/dist/src/paramRuntime/viewParamRuntime.js +35 -0
  220. package/dist/src/scale/scale.d.ts.map +1 -1
  221. package/dist/src/scale/scale.js +13 -7
  222. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  223. package/dist/src/scales/axisResolution.js +9 -5
  224. package/dist/src/scales/domainPlanner.d.ts +58 -7
  225. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  226. package/dist/src/scales/domainPlanner.js +395 -40
  227. package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
  228. package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
  229. package/dist/src/scales/indexLikeDomainUtils.js +67 -0
  230. package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
  231. package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
  232. package/dist/src/scales/resolutionMemberOrder.js +22 -0
  233. package/dist/src/scales/scaleInstanceManager.d.ts +2 -1
  234. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  235. package/dist/src/scales/scaleInstanceManager.js +10 -11
  236. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  237. package/dist/src/scales/scaleInteractionController.js +59 -18
  238. package/dist/src/scales/scalePropsResolver.d.ts +3 -1
  239. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  240. package/dist/src/scales/scalePropsResolver.js +83 -6
  241. package/dist/src/scales/scaleResolution.d.ts +39 -0
  242. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  243. package/dist/src/scales/scaleResolution.js +504 -82
  244. package/dist/src/scales/scaleResolutionTestUtils.d.ts +21 -0
  245. package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -0
  246. package/dist/src/scales/scaleResolutionTestUtils.js +37 -0
  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 +52 -0
  250. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -0
  251. package/dist/src/scales/selectionDomainUtils.js +194 -0
  252. package/dist/src/scales/zoomDomainUtils.d.ts +18 -0
  253. package/dist/src/scales/zoomDomainUtils.d.ts.map +1 -0
  254. package/dist/src/scales/zoomDomainUtils.js +69 -0
  255. package/dist/src/screenshotHarness.d.ts +16 -0
  256. package/dist/src/screenshotHarness.d.ts.map +1 -0
  257. package/dist/src/screenshotHarness.js +241 -0
  258. package/dist/src/singlePageApp.js +1 -1
  259. package/dist/src/spec/axis.d.ts +41 -30
  260. package/dist/src/spec/channel.d.ts +15 -9
  261. package/dist/src/spec/config.d.ts +264 -0
  262. package/dist/src/spec/data.d.ts +30 -3
  263. package/dist/src/spec/decoration.d.ts +51 -0
  264. package/dist/src/spec/exampleFiles.d.ts +12 -0
  265. package/dist/src/spec/exampleFiles.d.ts.map +1 -0
  266. package/dist/src/spec/exampleFiles.js +52 -0
  267. package/dist/src/spec/font.d.ts +1 -1
  268. package/dist/src/spec/genome.d.ts +22 -2
  269. package/dist/src/spec/mark.d.ts +97 -13
  270. package/dist/src/spec/parameter.d.ts +62 -5
  271. package/dist/src/spec/root.d.ts +34 -1
  272. package/dist/src/spec/scale.d.ts +46 -5
  273. package/dist/src/spec/title.d.ts +13 -2
  274. package/dist/src/spec/tooltip.d.ts +1 -1
  275. package/dist/src/spec/transform.d.ts +39 -4
  276. package/dist/src/spec/view.d.ts +67 -19
  277. package/dist/src/styles/genome-spy.css +63 -55
  278. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  279. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  280. package/dist/src/styles/genome-spy.css.js +31 -22
  281. package/dist/src/testSetup.d.ts +2 -0
  282. package/dist/src/testSetup.d.ts.map +1 -0
  283. package/dist/src/testSetup.js +5 -0
  284. package/dist/src/tooltip/dataTooltipHandler.js +66 -11
  285. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
  286. package/dist/src/tooltip/tooltipContext.js +3 -2
  287. package/dist/src/types/embedApi.d.ts +26 -0
  288. package/dist/src/types/encoder.d.ts +17 -15
  289. package/dist/src/types/scaleResolutionApi.d.ts +20 -0
  290. package/dist/src/types/viewContext.d.ts +23 -1
  291. package/dist/src/utils/expression.d.ts +2 -2
  292. package/dist/src/utils/expression.d.ts.map +1 -1
  293. package/dist/src/utils/expression.js +63 -8
  294. package/dist/src/utils/field.d.ts.map +1 -1
  295. package/dist/src/utils/field.js +0 -1
  296. package/dist/src/utils/inertia.d.ts.map +1 -1
  297. package/dist/src/utils/inertia.js +0 -1
  298. package/dist/src/utils/inferSpecBaseUrl.d.ts +14 -0
  299. package/dist/src/utils/inferSpecBaseUrl.d.ts.map +1 -0
  300. package/dist/src/utils/inferSpecBaseUrl.js +73 -0
  301. package/dist/src/utils/inputBinding.d.ts +1 -1
  302. package/dist/src/utils/interaction.d.ts +109 -0
  303. package/dist/src/utils/interaction.d.ts.map +1 -0
  304. package/dist/src/utils/interaction.js +200 -0
  305. package/dist/src/utils/interactionEvent.d.ts +62 -33
  306. package/dist/src/utils/interactionEvent.d.ts.map +1 -1
  307. package/dist/src/utils/interactionEvent.js +86 -48
  308. package/dist/src/utils/kWayMerge.js +1 -1
  309. package/dist/src/utils/mergeObjects.d.ts.map +1 -1
  310. package/dist/src/utils/mergeObjects.js +0 -2
  311. package/dist/src/utils/radixSort.d.ts.map +1 -1
  312. package/dist/src/utils/radixSort.js +0 -2
  313. package/dist/src/utils/throttle.d.ts.map +1 -1
  314. package/dist/src/utils/throttle.js +0 -2
  315. package/dist/src/utils/ui/tooltip.d.ts +1 -0
  316. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  317. package/dist/src/utils/ui/tooltip.js +1 -0
  318. package/dist/src/utils/url.js +1 -1
  319. package/dist/src/view/axisGridView.d.ts +1 -1
  320. package/dist/src/view/axisGridView.d.ts.map +1 -1
  321. package/dist/src/view/axisGridView.js +2 -47
  322. package/dist/src/view/axisView.d.ts +2 -3
  323. package/dist/src/view/axisView.d.ts.map +1 -1
  324. package/dist/src/view/axisView.js +251 -106
  325. package/dist/src/view/concatView.d.ts +2 -1
  326. package/dist/src/view/concatView.d.ts.map +1 -1
  327. package/dist/src/view/concatView.js +4 -2
  328. package/dist/src/view/containerMutationHelper.d.ts +3 -0
  329. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  330. package/dist/src/view/containerMutationHelper.js +12 -1
  331. package/dist/src/view/dataReadiness.d.ts +2 -2
  332. package/dist/src/view/dataReadiness.d.ts.map +1 -1
  333. package/dist/src/view/dataReadiness.js +63 -58
  334. package/dist/src/view/facetView.d.ts +1 -1
  335. package/dist/src/view/facetView.js +4 -4
  336. package/dist/src/view/flowBuilder.js +2 -2
  337. package/dist/src/view/gridView/gridChild.d.ts +13 -0
  338. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  339. package/dist/src/view/gridView/gridChild.js +247 -49
  340. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  341. package/dist/src/view/gridView/gridView.js +296 -99
  342. package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
  343. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
  344. package/dist/src/view/gridView/keyboardZoomController.js +1 -1
  345. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  346. package/dist/src/view/gridView/scrollbar.js +4 -2
  347. package/dist/src/view/gridView/selectionRect.d.ts +4 -0
  348. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  349. package/dist/src/view/gridView/selectionRect.js +20 -1
  350. package/dist/src/view/gridView/separatorView.d.ts +1 -0
  351. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  352. package/dist/src/view/gridView/separatorView.js +9 -0
  353. package/dist/src/view/interactionRouting.d.ts +20 -0
  354. package/dist/src/view/interactionRouting.d.ts.map +1 -0
  355. package/dist/src/view/interactionRouting.js +53 -0
  356. package/dist/src/view/layerView.d.ts.map +1 -1
  357. package/dist/src/view/layerView.js +12 -9
  358. package/dist/src/view/layout/grid.js +1 -1
  359. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  360. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
  361. package/dist/src/view/testUtils.d.ts +17 -3
  362. package/dist/src/view/testUtils.d.ts.map +1 -1
  363. package/dist/src/view/testUtils.js +62 -69
  364. package/dist/src/view/title.d.ts +8 -1
  365. package/dist/src/view/title.d.ts.map +1 -1
  366. package/dist/src/view/title.js +66 -76
  367. package/dist/src/view/unitView.d.ts +1 -1
  368. package/dist/src/view/unitView.d.ts.map +1 -1
  369. package/dist/src/view/unitView.js +67 -17
  370. package/dist/src/view/view.d.ts +76 -30
  371. package/dist/src/view/view.d.ts.map +1 -1
  372. package/dist/src/view/view.js +136 -47
  373. package/dist/src/view/viewFactory.d.ts +11 -3
  374. package/dist/src/view/viewFactory.d.ts.map +1 -1
  375. package/dist/src/view/viewFactory.js +37 -11
  376. package/dist/src/view/viewUtils.d.ts.map +1 -1
  377. package/dist/src/view/viewUtils.js +41 -5
  378. package/dist/src/view/zoom.d.ts +15 -3
  379. package/dist/src/view/zoom.d.ts.map +1 -1
  380. package/dist/src/view/zoom.js +375 -80
  381. package/package.json +20 -10
  382. package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
  383. package/dist/bundle/browser-0iNU5Wit.js +0 -138
  384. package/dist/bundle/index-BYsZN7b0.js +0 -1597
  385. package/dist/bundle/index-C3kClAEN.js +0 -1771
  386. package/dist/bundle/index-C7wOh6y1.js +0 -657
  387. package/dist/bundle/index-CRaQAuki.js +0 -326
  388. package/dist/bundle/index-D9v1PCj9.js +0 -507
  389. package/dist/bundle/index-GDOuv_D5.js +0 -266
  390. package/dist/bundle/index-Gt44EOIH.js +0 -628
  391. package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
  392. package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
  393. package/dist/bundle/unzip-Bac01w6X.js +0 -1492
  394. package/dist/src/config/scaleDefaults.d.ts +0 -8
  395. package/dist/src/config/scaleDefaults.d.ts.map +0 -1
  396. package/dist/src/config/scaleDefaults.js +0 -45
@@ -1,28 +1,51 @@
1
1
  import { span } from "vega-util";
2
2
  import { isContinuous } from "vega-scale";
3
3
 
4
- import { LOCUS } from "./scaleResolutionConstants.js";
4
+ import { INDEX, LOCUS } from "./scaleResolutionConstants.js";
5
+ import {
6
+ toInternalIndexLikeDataDomain,
7
+ toInternalIndexLikeInterval,
8
+ } from "./indexLikeDomainUtils.js";
9
+ import {
10
+ hasIntervalSelectionBindingInScope,
11
+ resolveIntervalSelectionBinding,
12
+ } from "./selectionDomainUtils.js";
5
13
  import createDomain from "../utils/domainArray.js";
6
14
  import { getAccessorDomainKey, isScaleAccessor } from "../encoder/accessor.js";
15
+ import { getEncoderAccessors, getPrimaryChannel } from "../encoder/encoder.js";
16
+ import {
17
+ hasExplicitLocusUpperBound,
18
+ isChromosomalLocusInterval,
19
+ } from "../genome/genome.js";
7
20
 
8
21
  /**
9
22
  * @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
10
23
  * @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
11
24
  * @typedef {import("../spec/scale.js").ScalarDomain} ScalarDomain
25
+ * @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
12
26
  * @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
27
+ * @typedef {{
28
+ * param: string,
29
+ * encoding: "x" | "y",
30
+ * hasInitial: boolean,
31
+ * runtime: any,
32
+ * }} SelectionDomainLinkInfo
13
33
  */
14
34
 
15
35
  export default class DomainPlanner {
16
36
  /** @type {() => Set<ScaleResolutionMember>} */
17
37
  #getMembers;
18
38
 
39
+ /** @type {() => Set<ScaleResolutionMember>} */
40
+ #getAllMembers;
41
+
19
42
  /** @type {() => Set<ScaleResolutionMember>} */
20
43
  #getDataMembers;
21
44
 
22
45
  /** @type {() => import("../spec/channel.js").Type} */
23
46
  #getType;
24
47
 
25
- /** @type {() => number[]} */
48
+ /** @type {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} */
26
49
  #getLocusExtent;
27
50
 
28
51
  /** @type {(interval: ScalarDomain | ComplexDomain) => number[]} */
@@ -31,30 +54,36 @@ export default class DomainPlanner {
31
54
  /** @type {any[]} */
32
55
  #initialDomain;
33
56
 
34
- /** @type {DomainArray | undefined} */
35
- #configuredDomain;
57
+ /** @type {SelectionDomainLinkInfo | undefined} */
58
+ #selectionDomainLinkInfo = undefined;
36
59
 
37
60
  #configuredDomainDirty = true;
38
61
 
62
+ /** @type {Map<boolean, DomainArray | undefined>} */
63
+ #configuredDomainsByInitialMode = new Map();
64
+
39
65
  /** @type {WeakMap<ScaleResolutionMember, import("../types/encoder.js").ScaleAccessor[]>} */
40
66
  #accessorsByMember = new WeakMap();
41
67
 
42
68
  /**
43
69
  * @param {object} options
44
70
  * @param {() => Set<ScaleResolutionMember>} options.getMembers
71
+ * @param {() => Set<ScaleResolutionMember>} [options.getAllMembers]
45
72
  * @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
46
73
  * @param {() => import("../spec/channel.js").Type} options.getType
47
- * @param {() => number[]} options.getLocusExtent
74
+ * @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} options.getLocusExtent
48
75
  * @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
49
76
  */
50
77
  constructor({
51
78
  getMembers,
79
+ getAllMembers,
52
80
  getDataMembers,
53
81
  getType,
54
82
  getLocusExtent,
55
83
  fromComplexInterval,
56
84
  }) {
57
85
  this.#getMembers = getMembers;
86
+ this.#getAllMembers = getAllMembers ?? getMembers;
58
87
  this.#getDataMembers = getDataMembers ?? getMembers;
59
88
  this.#getType = getType;
60
89
  this.#getLocusExtent = getLocusExtent;
@@ -68,49 +97,118 @@ export default class DomainPlanner {
68
97
  return this.#initialDomain;
69
98
  }
70
99
 
71
- hasConfiguredDomain() {
72
- return !!this.getConfiguredDomain();
100
+ /**
101
+ * @param {{ includeSelectionInitial?: boolean }} [options]
102
+ */
103
+ hasConfiguredDomain(options = {}) {
104
+ return !!this.getConfiguredDomain(options);
105
+ }
106
+
107
+ hasSelectionConfiguredDomain() {
108
+ this.getSelectionConfiguredDomainBindingInfo();
109
+ return !!this.#selectionDomainLinkInfo;
110
+ }
111
+
112
+ /**
113
+ * @returns {SelectionDomainLinkInfo | undefined}
114
+ */
115
+ getSelectionConfiguredDomainBindingInfo() {
116
+ if (this.#selectionDomainLinkInfo || !this.#configuredDomainDirty) {
117
+ return this.#selectionDomainLinkInfo;
118
+ }
119
+
120
+ this.getConfiguredDomain();
121
+ return this.#selectionDomainLinkInfo;
122
+ }
123
+
124
+ getSelectionConfiguredDomainInfo() {
125
+ const bindingInfo = this.getSelectionConfiguredDomainBindingInfo();
126
+ if (!bindingInfo) {
127
+ return;
128
+ }
129
+
130
+ return {
131
+ param: bindingInfo.param,
132
+ encoding: bindingInfo.encoding,
133
+ };
73
134
  }
74
135
 
75
136
  invalidateConfiguredDomain() {
76
137
  this.#configuredDomainDirty = true;
138
+ this.#selectionDomainLinkInfo = undefined;
139
+ this.#configuredDomainsByInitialMode.clear();
140
+ }
141
+
142
+ /**
143
+ * Returns the default domain without considering configured domains.
144
+ *
145
+ * @param {boolean} [extractDataDomain]
146
+ * @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
147
+ * @returns {any[]}
148
+ */
149
+ getDefaultDomain(extractDataDomain = false, locusAssembly) {
150
+ return resolveDefaultDomain(
151
+ this.#getType(),
152
+ this.#getLocusExtent,
153
+ extractDataDomain ? this.getDataDomain() : undefined,
154
+ locusAssembly
155
+ );
77
156
  }
78
157
 
79
158
  /**
80
159
  * Returns the configured domain or a data-derived/default domain.
81
160
  *
82
161
  * @param {boolean} [extractDataDomain]
162
+ * @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
163
+ * @param {{ includeSelectionInitial?: boolean }} [options]
83
164
  * @returns {any[]}
84
165
  */
85
- getConfiguredOrDefaultDomain(extractDataDomain = false) {
166
+ getConfiguredOrDefaultDomain(
167
+ extractDataDomain = false,
168
+ locusAssembly,
169
+ options = {}
170
+ ) {
86
171
  // TODO: intersect the domain with zoom extent (if it's defined)
87
172
  return (
88
- this.getConfiguredDomain() ??
89
- resolveDefaultDomain(
90
- this.#getType(),
91
- this.#getLocusExtent,
92
- extractDataDomain ? this.getDataDomain() : undefined
93
- )
173
+ this.getConfiguredDomain(options) ??
174
+ this.getDefaultDomain(extractDataDomain, locusAssembly)
94
175
  );
95
176
  }
96
177
 
97
178
  /**
98
179
  * Unions the configured domains of all participating views.
99
180
  *
181
+ * @param {{ includeSelectionInitial?: boolean }} [options]
100
182
  * @return {DomainArray}
101
183
  */
102
- getConfiguredDomain() {
103
- if (!this.#configuredDomainDirty) {
104
- return this.#configuredDomain;
184
+ getConfiguredDomain(options = {}) {
185
+ const includeSelectionInitial = options.includeSelectionInitial ?? true;
186
+
187
+ if (
188
+ !this.#configuredDomainDirty &&
189
+ this.#configuredDomainsByInitialMode.has(includeSelectionInitial)
190
+ ) {
191
+ return this.#configuredDomainsByInitialMode.get(
192
+ includeSelectionInitial
193
+ );
105
194
  }
106
195
 
107
- const domain = resolveConfiguredDomain(
196
+ const configuredDomain = resolveConfiguredDomain(
108
197
  this.#getMembers(),
109
- this.#fromComplexInterval
198
+ this.#fromComplexInterval,
199
+ includeSelectionInitial
200
+ );
201
+ validateSharedSelectionDomain(
202
+ this.#getAllMembers(),
203
+ configuredDomain.selectionRef
204
+ );
205
+ this.#selectionDomainLinkInfo = configuredDomain.selectionRef;
206
+ this.#configuredDomainsByInitialMode.set(
207
+ includeSelectionInitial,
208
+ configuredDomain.domain
110
209
  );
111
- this.#configuredDomain = domain;
112
210
  this.#configuredDomainDirty = false;
113
- return domain;
211
+ return configuredDomain.domain;
114
212
  }
115
213
 
116
214
  /**
@@ -129,18 +227,19 @@ export default class DomainPlanner {
129
227
  /**
130
228
  * @param {import("../types/encoder.js").VegaScale} scale
131
229
  * @param {boolean} domainWasInitialized
230
+ * @param {any[]} [snapshotDomain]
132
231
  * @returns {boolean} true if listeners should be notified immediately
133
232
  */
134
- captureInitialDomain(scale, domainWasInitialized) {
233
+ captureInitialDomain(scale, domainWasInitialized, snapshotDomain) {
135
234
  if (!this.#initialDomain && isContinuous(scale.type)) {
136
- const domain = scale.domain();
235
+ const domain = snapshotDomain ?? scale.domain();
137
236
  if (span(domain) > 0) {
138
237
  this.#initialDomain = domain;
139
238
  }
140
239
  }
141
240
 
142
241
  if (!domainWasInitialized) {
143
- this.#initialDomain = scale.domain();
242
+ this.#initialDomain = snapshotDomain ?? scale.domain();
144
243
  return true;
145
244
  }
146
245
 
@@ -167,7 +266,7 @@ export default class DomainPlanner {
167
266
  return [];
168
267
  }
169
268
 
170
- const accessors = encoder.accessors ?? [];
269
+ const accessors = getEncoderAccessors(encoder);
171
270
  if (accessors.length === 0) {
172
271
  return [];
173
272
  }
@@ -184,25 +283,277 @@ export default class DomainPlanner {
184
283
  /**
185
284
  * @param {Set<ScaleResolutionMember>} members
186
285
  * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
187
- * @returns {DomainArray | undefined}
286
+ * @param {boolean} includeSelectionInitial
287
+ * @returns {{
288
+ * domain: DomainArray | undefined,
289
+ * selectionRef: SelectionDomainLinkInfo | undefined,
290
+ * }}
188
291
  */
189
- function resolveConfiguredDomain(members, fromComplexInterval) {
190
- const domains = Array.from(members)
292
+ function resolveConfiguredDomain(
293
+ members,
294
+ fromComplexInterval,
295
+ includeSelectionInitial
296
+ ) {
297
+ const domainMembers = Array.from(members)
191
298
  .filter((member) => member.contributesToDomain)
192
- .map((member) => member.channelDef)
193
- .filter((channelDef) => channelDef.scale?.domain)
194
- .map((channelDef) =>
195
- // TODO: Handle ExprRefs and Param in domain
196
- createDomain(
197
- channelDef.type,
198
- // Chrom/pos must be linearized first
199
- fromComplexInterval(channelDef.scale.domain)
299
+ .filter((member) => member.channelDef.scale?.domain);
300
+
301
+ /** @type {DomainArray[]} */
302
+ const domains = [];
303
+
304
+ /** @type {any} */
305
+ let selectionRefRuntime = undefined;
306
+ /** @type {string | undefined} */
307
+ let selectionRefDescription = undefined;
308
+ /** @type {SelectionDomainLinkInfo | undefined} */
309
+ let selectionRef = undefined;
310
+ let hasLiteralDomain = false;
311
+
312
+ for (const member of domainMembers) {
313
+ const domainDef = member.channelDef.scale.domain;
314
+ if (isSelectionDomainRef(domainDef)) {
315
+ if (hasLiteralDomain) {
316
+ throw new Error(
317
+ "Cannot mix selection-driven and literal configured domains on a shared scale."
318
+ );
319
+ }
320
+
321
+ const resolved = resolveSelectionDomain(
322
+ member,
323
+ domainDef,
324
+ fromComplexInterval,
325
+ includeSelectionInitial
326
+ );
327
+
328
+ if (
329
+ selectionRef &&
330
+ (selectionRef.runtime !== resolved.runtime ||
331
+ selectionRef.param !== resolved.param ||
332
+ selectionRef.encoding !== resolved.encoding)
333
+ ) {
334
+ throw new Error(
335
+ "Conflicting selection domain references on a shared scale: " +
336
+ selectionRefDescription +
337
+ " vs " +
338
+ resolved.description +
339
+ "."
340
+ );
341
+ }
342
+
343
+ selectionRefRuntime = resolved.runtime;
344
+ selectionRefDescription = resolved.description;
345
+ selectionRef = {
346
+ param: resolved.param,
347
+ encoding: resolved.encoding,
348
+ hasInitial:
349
+ (selectionRef?.hasInitial ?? false) || resolved.hasInitial,
350
+ runtime: resolved.runtime,
351
+ };
352
+
353
+ if (resolved.domain) {
354
+ domains.push(resolved.domain);
355
+ }
356
+ continue;
357
+ }
358
+
359
+ if (selectionRefRuntime) {
360
+ throw new Error(
361
+ "Cannot mix literal configured domains with selection-driven domains on a shared scale."
362
+ );
363
+ }
364
+
365
+ hasLiteralDomain = true;
366
+ domains.push(
367
+ resolveConfiguredIntervalDomain(
368
+ member.channelDef.type,
369
+ domainDef,
370
+ fromComplexInterval
200
371
  )
201
372
  );
373
+ }
202
374
 
203
375
  if (domains.length > 0) {
204
- return domains.reduce((acc, curr) => acc.extendAll(curr));
376
+ return {
377
+ domain: domains.reduce((acc, curr) => acc.extendAll(curr)),
378
+ selectionRef,
379
+ };
380
+ }
381
+
382
+ if (selectionRefRuntime) {
383
+ // Selection refs are still the source of truth even when the
384
+ // selection interval currently resolves to no domain.
385
+ return { domain: undefined, selectionRef };
386
+ }
387
+
388
+ return { domain: undefined, selectionRef: undefined };
389
+ }
390
+
391
+ /**
392
+ * @param {ScaleResolutionMember} member
393
+ * @param {SelectionDomainRef} domainRef
394
+ * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
395
+ * @param {boolean} includeSelectionInitial
396
+ * @returns {{
397
+ * domain: DomainArray | undefined,
398
+ * description: string,
399
+ * param: string,
400
+ * encoding: "x" | "y",
401
+ * hasInitial: boolean,
402
+ * runtime: any,
403
+ * }}
404
+ */
405
+ function resolveSelectionDomain(
406
+ member,
407
+ domainRef,
408
+ fromComplexInterval,
409
+ includeSelectionInitial
410
+ ) {
411
+ const paramName = domainRef.param;
412
+
413
+ const resolvedChannel = resolveSelectionDomainChannel(
414
+ member.channel,
415
+ domainRef,
416
+ paramName
417
+ );
418
+
419
+ const binding = resolveIntervalSelectionBinding(
420
+ member.view,
421
+ paramName,
422
+ resolvedChannel
423
+ );
424
+ const hasInitial = domainRef.initial !== undefined;
425
+ const interval = binding.selection.intervals[resolvedChannel];
426
+ const description = paramName + "." + resolvedChannel;
427
+ if (!interval || interval.length !== 2) {
428
+ const initialDomain = includeSelectionInitial
429
+ ? domainRef.initial
430
+ ? resolveConfiguredIntervalDomain(
431
+ member.channelDef.type,
432
+ domainRef.initial,
433
+ fromComplexInterval
434
+ )
435
+ : undefined
436
+ : undefined;
437
+ return {
438
+ domain: initialDomain,
439
+ description,
440
+ param: paramName,
441
+ encoding: resolvedChannel,
442
+ hasInitial,
443
+ runtime: binding.runtime,
444
+ };
445
+ }
446
+
447
+ return {
448
+ // Selection intervals already use internal scale-domain coordinates.
449
+ domain: createDomain(
450
+ member.channelDef.type,
451
+ fromComplexInterval(interval)
452
+ ),
453
+ description,
454
+ param: paramName,
455
+ encoding: resolvedChannel,
456
+ hasInitial,
457
+ runtime: binding.runtime,
458
+ };
459
+ }
460
+
461
+ /**
462
+ * @param {import("../spec/channel.js").Type} type
463
+ * @param {ScalarDomain | ComplexDomain} interval
464
+ * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
465
+ * @returns {DomainArray}
466
+ */
467
+ function resolveConfiguredIntervalDomain(type, interval, fromComplexInterval) {
468
+ const numericDomain = fromComplexInterval(interval);
469
+ const internalDomain =
470
+ type === LOCUS &&
471
+ isChromosomalLocusInterval(interval) &&
472
+ !hasExplicitLocusUpperBound(interval)
473
+ ? numericDomain
474
+ : toInternalIndexLikeInterval(type, numericDomain);
475
+
476
+ return createDomain(type, internalDomain);
477
+ }
478
+
479
+ /**
480
+ * Fails fast when a selection-driven scale domain ends up sharing the same
481
+ * scale resolution as the interval selection that drives it. This typically
482
+ * happens when an overview/detail spec forgets to make the linked positional
483
+ * scale independent.
484
+ *
485
+ * @param {Set<ScaleResolutionMember>} members
486
+ * @param {SelectionDomainLinkInfo | undefined} selectionRef
487
+ */
488
+ function validateSharedSelectionDomain(members, selectionRef) {
489
+ if (
490
+ !selectionRef ||
491
+ members.size < 2 ||
492
+ !Array.from(members).some((member) =>
493
+ hasIntervalSelectionBindingInScope(
494
+ member.view,
495
+ selectionRef.runtime,
496
+ selectionRef.param,
497
+ selectionRef.encoding
498
+ )
499
+ )
500
+ ) {
501
+ return;
205
502
  }
503
+
504
+ const viewPaths = Array.from(
505
+ new Set(
506
+ Array.from(members)
507
+ .filter((member) => member.contributesToDomain)
508
+ .map(
509
+ (member) =>
510
+ member.view.getPathString?.() ??
511
+ member.view.name ??
512
+ "(unknown)"
513
+ )
514
+ )
515
+ );
516
+
517
+ throw new Error(
518
+ `Selection domain reference "${selectionRef.param}.${selectionRef.encoding}" cannot use a shared ${selectionRef.encoding} scale when the same interval selection is defined in that shared view group (${viewPaths.join(", ")}). ` +
519
+ `This creates a feedback loop between brushing and the scale domain. ` +
520
+ `Make the linked ${selectionRef.encoding} scale independent, for example with ` +
521
+ `"resolve": { "scale": { "${selectionRef.encoding}": "independent" } } on the common ancestor.`
522
+ );
523
+ }
524
+
525
+ /**
526
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
527
+ * @param {SelectionDomainRef} domainRef
528
+ * @param {string} paramName
529
+ * @returns {"x" | "y"}
530
+ */
531
+ function resolveSelectionDomainChannel(channel, domainRef, paramName) {
532
+ if (domainRef.encoding) {
533
+ return domainRef.encoding;
534
+ }
535
+
536
+ const primaryChannel = getPrimaryChannel(channel);
537
+ if (primaryChannel === "x" || primaryChannel === "y") {
538
+ return primaryChannel;
539
+ }
540
+
541
+ throw new Error(
542
+ `Selection domain reference "${paramName}" on channel "${channel}" requires an explicit "encoding" ("x" or "y").`
543
+ );
544
+ }
545
+
546
+ /**
547
+ * @param {any} domain
548
+ * @returns {domain is SelectionDomainRef}
549
+ */
550
+ export function isSelectionDomainRef(domain) {
551
+ return (
552
+ typeof domain === "object" &&
553
+ domain !== null &&
554
+ !Array.isArray(domain) &&
555
+ typeof domain.param === "string"
556
+ );
206
557
  }
207
558
 
208
559
  /**
@@ -273,13 +624,17 @@ function resolveDataDomain(members, getType, getAccessorsForMember) {
273
624
 
274
625
  /**
275
626
  * @param {import("../spec/channel.js").Type} type
276
- * @param {() => number[]} getLocusExtent
627
+ * @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} getLocusExtent
277
628
  * @param {DomainArray | undefined} dataDomain
629
+ * @param {import("../spec/scale.js").Scale["assembly"] | undefined} locusAssembly
278
630
  * @returns {any[]}
279
631
  */
280
- function resolveDefaultDomain(type, getLocusExtent, dataDomain) {
632
+ function resolveDefaultDomain(type, getLocusExtent, dataDomain, locusAssembly) {
281
633
  if (type == LOCUS) {
282
- return getLocusExtent();
634
+ return getLocusExtent(locusAssembly);
635
+ }
636
+ if (type == INDEX) {
637
+ return toInternalIndexLikeDataDomain(type, dataDomain) ?? [];
283
638
  }
284
639
  return dataDomain ?? [];
285
640
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
3
+ * @returns {boolean}
4
+ */
5
+ export function isIndexLikeDomainType(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType): boolean;
6
+ /**
7
+ * Converts a numeric user-facing inclusive interval into the internal half-open
8
+ * form used by index-like scales.
9
+ *
10
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
11
+ * @param {number[]} interval
12
+ * @returns {number[]}
13
+ */
14
+ export function toInternalIndexLikeInterval(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[]): number[];
15
+ /**
16
+ * Converts an internal half-open interval into a user-facing inclusive form.
17
+ *
18
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
19
+ * @param {number[]} interval
20
+ * @returns {number[]}
21
+ */
22
+ export function toExternalIndexLikeInterval(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[]): number[];
23
+ /**
24
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
25
+ * @param {number[] | undefined} interval
26
+ * @returns {number[] | undefined}
27
+ */
28
+ export function toInternalIndexLikeDataDomain(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[] | undefined): number[] | undefined;
29
+ //# sourceMappingURL=indexLikeDomainUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexLikeDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/indexLikeDomainUtils.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,4CAHW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,GACtE,OAAO,CAInB;AAED;;;;;;;GAOG;AACH,kDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GACN,MAAM,EAAE,CAIpB;AAED;;;;;;GAMG;AACH,kDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GACN,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,oDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GAAG,SAAS,GAClB,MAAM,EAAE,GAAG,SAAS,CAMhC"}
@@ -0,0 +1,67 @@
1
+ import { INDEX, LOCUS } from "./scaleResolutionConstants.js";
2
+
3
+ /**
4
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
5
+ * @returns {boolean}
6
+ */
7
+ export function isIndexLikeDomainType(type) {
8
+ return type === INDEX || type === LOCUS;
9
+ }
10
+
11
+ /**
12
+ * Converts a numeric user-facing inclusive interval into the internal half-open
13
+ * form used by index-like scales.
14
+ *
15
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
16
+ * @param {number[]} interval
17
+ * @returns {number[]}
18
+ */
19
+ export function toInternalIndexLikeInterval(type, interval) {
20
+ return isIndexLikeDomainType(type) ? expandUpperBound(interval) : interval;
21
+ }
22
+
23
+ /**
24
+ * Converts an internal half-open interval into a user-facing inclusive form.
25
+ *
26
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
27
+ * @param {number[]} interval
28
+ * @returns {number[]}
29
+ */
30
+ export function toExternalIndexLikeInterval(type, interval) {
31
+ return isIndexLikeDomainType(type) ? shrinkUpperBound(interval) : interval;
32
+ }
33
+
34
+ /**
35
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
36
+ * @param {number[] | undefined} interval
37
+ * @returns {number[] | undefined}
38
+ */
39
+ export function toInternalIndexLikeDataDomain(type, interval) {
40
+ return interval && isIndexLikeDomainType(type)
41
+ ? expandUpperBound(interval)
42
+ : interval;
43
+ }
44
+
45
+ /**
46
+ * @param {number[]} interval
47
+ * @returns {number[]}
48
+ */
49
+ function expandUpperBound(interval) {
50
+ return [interval[0], interval[1] + getDirection(interval)];
51
+ }
52
+
53
+ /**
54
+ * @param {number[]} interval
55
+ * @returns {number[]}
56
+ */
57
+ function shrinkUpperBound(interval) {
58
+ return [interval[0], interval[1] - getDirection(interval)];
59
+ }
60
+
61
+ /**
62
+ * @param {number[]} interval
63
+ * @returns {1 | -1}
64
+ */
65
+ function getDirection(interval) {
66
+ return interval[1] >= interval[0] ? 1 : -1;
67
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Stable ordering for resolution members so merge behavior does not depend on
3
+ * registration order.
4
+ *
5
+ * @template {{ view: { getPathString(): string }, channel?: string }} T
6
+ * @param {Set<T> | Iterable<T>} members
7
+ * @returns {T[]}
8
+ */
9
+ export function orderResolutionMembers<T extends {
10
+ view: {
11
+ getPathString(): string;
12
+ };
13
+ channel?: string;
14
+ }>(members: Set<T> | Iterable<T>): T[];
15
+ //# sourceMappingURL=resolutionMemberOrder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolutionMemberOrder.d.ts","sourceRoot":"","sources":["../../../src/scales/resolutionMemberOrder.js"],"names":[],"mappings":"AASA;;;;;;;GAOG;AACH,uCAJuE,CAAC,SAA3D;IAAG,IAAI,EAAE;QAAE,aAAa,IAAI,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAG,WAC3D,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAClB,CAAC,EAAE,CAMf"}