@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,11 +1,13 @@
1
1
  import UnitView from "../view/unitView.js";
2
2
  import { VISIT_STOP } from "../view/view.js";
3
3
  import { readPickingPixel } from "../gl/webGLHelper.js";
4
- import InteractionEvent from "../utils/interactionEvent.js";
5
4
  import Inertia, { makeEventTemplate } from "../utils/inertia.js";
6
5
  import Point from "../view/layout/point.js";
7
6
  import { isStillZooming } from "../view/zoom.js";
8
7
  import createTooltipContext from "../tooltip/tooltipContext.js";
8
+ import { FREEZE_INTERACTION_CLASS_NAME } from "../utils/ui/tooltip.js";
9
+ import InteractionDispatcher from "./interactionDispatcher.js";
10
+ import CursorManager from "./cursorManager.js";
9
11
 
10
12
  export default class InteractionController {
11
13
  /** @type {import("../view/view.js").default} */
@@ -24,6 +26,10 @@ export default class InteractionController {
24
26
  #renderPickingFramebuffer;
25
27
  /** @type {() => number} */
26
28
  #getDevicePixelRatio;
29
+ /** @type {InteractionDispatcher} */
30
+ #interactionDispatcher;
31
+ /** @type {CursorManager} */
32
+ #cursorManager;
27
33
  /**
28
34
  * @type {{ mark: import("../marks/mark.js").default, datum: import("../data/flowNode.js").Datum, uniqueId: number }}
29
35
  */
@@ -32,8 +38,13 @@ export default class InteractionController {
32
38
  #wheelInertia;
33
39
  /** @type {Point} */
34
40
  #mouseDownCoords;
35
- /** @type {boolean} */
36
- #tooltipUpdateRequested;
41
+ /** @type {Point | undefined} */
42
+ #lastPointerPoint;
43
+ #tooltipUpdateRequested = false;
44
+ #longPressPending = false;
45
+ #suppressTooltipUntilMouseMove = false;
46
+ #hoverTrackingSuspensionCount = 0;
47
+ #postRenderHoverRefreshRequested = false;
37
48
  /**
38
49
  * @param {object} options
39
50
  * @param {import("../view/view.js").default} options.viewRoot
@@ -63,6 +74,8 @@ export default class InteractionController {
63
74
  this.#tooltipHandlers = tooltipHandlers;
64
75
  this.#renderPickingFramebuffer = renderPickingFramebuffer;
65
76
  this.#getDevicePixelRatio = getDevicePixelRatio;
77
+ this.#interactionDispatcher = new InteractionDispatcher({ viewRoot });
78
+ this.#cursorManager = new CursorManager({ canvas: glHelper.canvas });
66
79
 
67
80
  /**
68
81
  * Currently hovered mark and datum
@@ -74,14 +87,72 @@ export default class InteractionController {
74
87
 
75
88
  /** @type {Point} */
76
89
  this.#mouseDownCoords = undefined;
77
-
78
- this.#tooltipUpdateRequested = false;
90
+ this.#lastPointerPoint = undefined;
79
91
  }
80
92
 
81
93
  getCurrentHover() {
82
94
  return this.#currentHover;
83
95
  }
84
96
 
97
+ suspendHoverTracking() {
98
+ this.#hoverTrackingSuspensionCount++;
99
+ if (this.#longPressPending) {
100
+ return;
101
+ }
102
+
103
+ this.#tooltip.clear();
104
+ this.#tooltipUpdateRequested = false;
105
+ }
106
+
107
+ /**
108
+ * @param {MouseEvent} [mouseEvent]
109
+ */
110
+ resumeHoverTracking(mouseEvent) {
111
+ if (this.#hoverTrackingSuspensionCount <= 0) {
112
+ return;
113
+ }
114
+
115
+ this.#hoverTrackingSuspensionCount--;
116
+ if (this.#hoverTrackingSuspensionCount > 0) {
117
+ return;
118
+ }
119
+
120
+ this.#tooltip.clear();
121
+ this.#tooltipUpdateRequested = false;
122
+
123
+ if (this.#isInteractionFrozen()) {
124
+ return;
125
+ }
126
+
127
+ if (mouseEvent) {
128
+ const point = this.#toCanvasPoint(mouseEvent);
129
+ this.#lastPointerPoint = point;
130
+ if (this.#isInsideCanvas(point)) {
131
+ this.#refreshHover(point);
132
+ this.#cursorManager.update({
133
+ target: this.#interactionDispatcher.getCurrentTarget(),
134
+ hover: this.#currentHover,
135
+ });
136
+ return;
137
+ }
138
+
139
+ this.#interactionDispatcher.handlePointerLeave(mouseEvent);
140
+ } else if (
141
+ this.#lastPointerPoint &&
142
+ this.#isInsideCanvas(this.#lastPointerPoint)
143
+ ) {
144
+ this.#refreshHover(this.#lastPointerPoint);
145
+ this.#cursorManager.update({
146
+ target: this.#interactionDispatcher.getCurrentTarget(),
147
+ hover: this.#currentHover,
148
+ });
149
+ return;
150
+ }
151
+
152
+ this.#currentHover = null;
153
+ this.#cursorManager.clear();
154
+ }
155
+
85
156
  registerInteractionEvents() {
86
157
  const canvas = this.#glHelper.canvas;
87
158
 
@@ -93,17 +164,26 @@ export default class InteractionController {
93
164
  /**
94
165
  * @param {Point} point
95
166
  * @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
96
- * @returns {InteractionEvent}
167
+ * @returns {import("../utils/interaction.js").default}
97
168
  */
98
- const dispatchInteractionEvent = (point, uiEvent) => {
99
- const interactionEvent = new InteractionEvent(point, uiEvent);
100
- this.#viewRoot.propagateInteractionEvent(interactionEvent);
169
+ const dispatchInteraction = (point, uiEvent) => {
170
+ const interaction = this.#interactionDispatcher.dispatch(
171
+ point,
172
+ uiEvent
173
+ );
101
174
 
102
- if (!this.#tooltipUpdateRequested) {
175
+ if (!this.#tooltipUpdateRequested && !this.#longPressPending) {
103
176
  this.#tooltip.clear();
104
177
  }
105
178
 
106
- return interactionEvent;
179
+ if (uiEvent instanceof MouseEvent && uiEvent.type !== "mouseout") {
180
+ this.#cursorManager.update({
181
+ target: interaction.target,
182
+ hover: this.#currentHover,
183
+ });
184
+ }
185
+
186
+ return interaction;
107
187
  };
108
188
 
109
189
  /** @param {Event} event */
@@ -112,13 +192,22 @@ export default class InteractionController {
112
192
  const wheeling = now - lastWheelEvent < 200;
113
193
 
114
194
  if (event instanceof MouseEvent) {
115
- const rect = canvas.getBoundingClientRect();
116
- const point = new Point(
117
- event.clientX - rect.left - canvas.clientLeft,
118
- event.clientY - rect.top - canvas.clientTop
119
- );
195
+ if (
196
+ event.type !== "contextmenu" &&
197
+ this.#isInteractionFrozen()
198
+ ) {
199
+ return;
200
+ }
120
201
 
121
- if (event.type == "mousemove" && !wheeling) {
202
+ const point = this.#toCanvasPoint(event);
203
+ this.#lastPointerPoint = point;
204
+
205
+ if (
206
+ event.type == "mousemove" &&
207
+ !wheeling &&
208
+ this.#hoverTrackingSuspensionCount === 0
209
+ ) {
210
+ this.#suppressTooltipUntilMouseMove = false;
122
211
  this.#tooltip.handleMouseMove(event);
123
212
  this.#tooltipUpdateRequested = false;
124
213
 
@@ -135,7 +224,7 @@ export default class InteractionController {
135
224
  * @param {MouseEvent} dispatchedEvent
136
225
  */
137
226
  const dispatchEvent = (dispatchedEvent) => {
138
- dispatchInteractionEvent(point, dispatchedEvent);
227
+ dispatchInteraction(point, dispatchedEvent);
139
228
  };
140
229
 
141
230
  if (event.type != "wheel") {
@@ -174,7 +263,7 @@ export default class InteractionController {
174
263
  // wheel ownership without running real wheel side
175
264
  // effects first. Inertia is layered on top of that
176
265
  // decision and is not the reason for the probe.
177
- const probeEvent = dispatchInteractionEvent(point, {
266
+ const probeEvent = dispatchInteraction(point, {
178
267
  type: "wheelclaimprobe",
179
268
  });
180
269
 
@@ -239,11 +328,97 @@ export default class InteractionController {
239
328
  this.#mouseDownCoords?.subtract(Point.fromMouseEvent(event))
240
329
  .length < 3
241
330
  ) {
242
- dispatchEvent(event);
331
+ const interaction = dispatchInteraction(point, event);
332
+
333
+ if (
334
+ event.type == "dblclick" &&
335
+ this.#hoverTrackingSuspensionCount === 0 &&
336
+ this.#isInsideCanvas(point)
337
+ ) {
338
+ this.#scheduleHoverRefreshAfterRender();
339
+ }
340
+
341
+ return interaction;
243
342
  }
244
343
  }
245
344
  };
246
345
 
346
+ canvas.addEventListener("mousedown", (/** @type {MouseEvent} */ e) => {
347
+ this.#mouseDownCoords = Point.fromMouseEvent(e);
348
+ this.#longPressPending = false;
349
+ const hasModifier = e.shiftKey || e.ctrlKey || e.metaKey;
350
+
351
+ if (this.#tooltip.sticky) {
352
+ this.#tooltip.sticky = false;
353
+ this.#suppressTooltipUntilMouseMove = true;
354
+ this.#tooltip.clear();
355
+ // Dismiss the sticky tooltip before routing the press so the
356
+ // click only affects the tooltip state.
357
+ longPressTriggered = true;
358
+ } else {
359
+ longPressTriggered = false;
360
+ }
361
+
362
+ const disableTooltip = () => {
363
+ document.addEventListener(
364
+ "mouseup",
365
+ () => this.#tooltip.popEnabledState(),
366
+ {
367
+ once: true,
368
+ capture: true,
369
+ }
370
+ );
371
+ this.#tooltip.pushEnabledState(false);
372
+ };
373
+
374
+ // Right-click opens the context menu and disables tooltips.
375
+ // Left-button presses keep the current tooltip visible through the
376
+ // press; plain clicks may still promote it to sticky mode.
377
+ if (e.button == 2) {
378
+ disableTooltip();
379
+ } else if (e.button == 0 && this.#tooltip.visible) {
380
+ // Preserve the current tooltip through the press. Plain clicks
381
+ // may also escalate this state into a sticky tooltip.
382
+ this.#longPressPending = true;
383
+
384
+ /** @type {ReturnType<typeof setTimeout> | undefined} */
385
+ let timeout;
386
+ if (!hasModifier) {
387
+ // Make tooltip sticky if the user long-presses
388
+ timeout = setTimeout(() => {
389
+ longPressTriggered = true;
390
+ this.#longPressPending = false;
391
+ this.#tooltip.sticky = true;
392
+ }, 400);
393
+ }
394
+
395
+ /**
396
+ * @param {boolean} clearTooltipOnMove
397
+ */
398
+ const clear = (clearTooltipOnMove) => {
399
+ clearTimeout(timeout);
400
+ if (!this.#longPressPending) {
401
+ return;
402
+ }
403
+
404
+ this.#longPressPending = false;
405
+ if (
406
+ clearTooltipOnMove &&
407
+ this.#hoverTrackingSuspensionCount > 0
408
+ ) {
409
+ this.#tooltip.clear();
410
+ this.#tooltipUpdateRequested = false;
411
+ }
412
+ };
413
+ document.addEventListener("mouseup", () => clear(false), {
414
+ once: true,
415
+ });
416
+ document.addEventListener("mousemove", () => clear(true), {
417
+ once: true,
418
+ });
419
+ }
420
+ });
421
+
247
422
  [
248
423
  "mousedown",
249
424
  "mouseup",
@@ -313,7 +488,7 @@ export default class InteractionController {
313
488
  zDelta
314
489
  ) => {
315
490
  const point = toCanvasPoint(x, y);
316
- dispatchInteractionEvent(point, {
491
+ dispatchInteraction(point, {
317
492
  type: "touchgesture",
318
493
  phase,
319
494
  pointerCount,
@@ -412,54 +587,108 @@ export default class InteractionController {
412
587
  passive: false,
413
588
  });
414
589
 
415
- canvas.addEventListener("mousedown", (/** @type {MouseEvent} */ e) => {
416
- this.#mouseDownCoords = Point.fromMouseEvent(e);
417
- if (this.#tooltip.sticky) {
418
- this.#tooltip.sticky = false;
419
- this.#tooltip.clear();
420
- // A hack to prevent selection if the tooltip is sticky.
421
- // Let the tooltip be destickified first.
422
- longPressTriggered = true;
423
- } else {
424
- longPressTriggered = false;
425
- }
590
+ // Prevent text selections etc while dragging
591
+ canvas.addEventListener("dragstart", (event) =>
592
+ event.stopPropagation()
593
+ );
426
594
 
427
- const disableTooltip = () => {
428
- document.addEventListener(
429
- "mouseup",
430
- () => this.#tooltip.popEnabledState(),
431
- { once: true }
432
- );
433
- this.#tooltip.pushEnabledState(false);
434
- };
595
+ canvas.addEventListener("mouseout", (event) => {
596
+ if (this.#isInteractionFrozen()) {
597
+ return;
598
+ }
435
599
 
436
- // Opening context menu or using modifier keys disables the tooltip
437
- if (e.button == 2 || e.shiftKey || e.ctrlKey || e.metaKey) {
438
- disableTooltip();
439
- } else if (this.#tooltip.visible) {
440
- // Make tooltip sticky if the user long-presses
441
- const timeout = setTimeout(() => {
442
- longPressTriggered = true;
443
- this.#tooltip.sticky = true;
444
- }, 400);
445
-
446
- const clear = () => clearTimeout(timeout);
447
- document.addEventListener("mouseup", clear, { once: true });
448
- document.addEventListener("mousemove", clear, { once: true });
600
+ if (this.#hoverTrackingSuspensionCount > 0) {
601
+ this.#tooltip.clear();
602
+ this.#tooltipUpdateRequested = false;
603
+ return;
449
604
  }
605
+
606
+ this.#interactionDispatcher.handlePointerLeave(
607
+ /** @type {MouseEvent} */ (event)
608
+ );
609
+ this.#cursorManager.clear();
610
+ this.#tooltip.clear();
611
+ this.#currentHover = null;
450
612
  });
613
+ }
451
614
 
452
- // Prevent text selections etc while dragging
453
- canvas.addEventListener("dragstart", (event) =>
454
- event.stopPropagation()
615
+ /**
616
+ * @param {MouseEvent} event
617
+ */
618
+ #toCanvasPoint(event) {
619
+ const canvas = this.#glHelper.canvas;
620
+ const rect = canvas.getBoundingClientRect();
621
+ return new Point(
622
+ event.clientX - rect.left - canvas.clientLeft,
623
+ event.clientY - rect.top - canvas.clientTop
624
+ );
625
+ }
626
+
627
+ /**
628
+ * @param {Point} point
629
+ */
630
+ #isInsideCanvas(point) {
631
+ const canvas = this.#glHelper.canvas;
632
+ return (
633
+ point.x >= 0 &&
634
+ point.y >= 0 &&
635
+ point.x <= canvas.clientWidth &&
636
+ point.y <= canvas.clientHeight
455
637
  );
638
+ }
639
+
640
+ /**
641
+ * @param {Point} point
642
+ */
643
+ #refreshHover(point) {
644
+ if (!isStillZooming()) {
645
+ this.#renderPickingFramebuffer();
646
+ this.#handlePicking(point.x, point.y);
647
+ }
648
+ }
649
+
650
+ #scheduleHoverRefreshAfterRender() {
651
+ if (this.#postRenderHoverRefreshRequested) {
652
+ return;
653
+ }
654
+
655
+ this.#postRenderHoverRefreshRequested = true;
656
+ this.#animator.requestRender();
657
+ window.requestAnimationFrame(() => {
658
+ this.#postRenderHoverRefreshRequested = false;
659
+
660
+ if (
661
+ this.#hoverTrackingSuspensionCount > 0 ||
662
+ this.#isInteractionFrozen()
663
+ ) {
664
+ return;
665
+ }
666
+
667
+ const point = this.#lastPointerPoint;
668
+ if (!point || !this.#isInsideCanvas(point)) {
669
+ this.#currentHover = null;
670
+ this.#cursorManager.clear();
671
+ return;
672
+ }
456
673
 
457
- canvas.addEventListener("mouseout", () => {
458
674
  this.#tooltip.clear();
459
- this.#currentHover = null;
675
+ this.#tooltipUpdateRequested = false;
676
+ this.#refreshHover(point);
677
+ this.#cursorManager.update({
678
+ target: this.#interactionDispatcher.getCurrentTarget(),
679
+ hover: this.#currentHover,
680
+ });
460
681
  });
461
682
  }
462
683
 
684
+ #isInteractionFrozen() {
685
+ return (
686
+ typeof document !== "undefined" &&
687
+ !!document.body &&
688
+ document.body.classList.contains(FREEZE_INTERACTION_CLASS_NAME)
689
+ );
690
+ }
691
+
463
692
  /**
464
693
  * @param {number} x
465
694
  * @param {number} y
@@ -520,7 +749,7 @@ export default class InteractionController {
520
749
 
521
750
  const tooltipProps = mark.properties.tooltip;
522
751
 
523
- if (tooltipProps !== null) {
752
+ if (tooltipProps !== null && tooltipProps !== false) {
524
753
  const handlerName = tooltipProps?.handler ?? "default";
525
754
  const handler = this.#tooltipHandlers[handlerName];
526
755
  if (!handler) {
@@ -549,6 +778,10 @@ export default class InteractionController {
549
778
  * @template T
550
779
  */
551
780
  updateTooltip(datum, converter) {
781
+ if (this.#suppressTooltipUntilMouseMove) {
782
+ return;
783
+ }
784
+
552
785
  if (!this.#tooltipUpdateRequested || !datum) {
553
786
  this.#tooltip.updateWithDatum(datum, converter);
554
787
  this.#tooltipUpdateRequested = true;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Dispatches `Interaction` objects through the view hierarchy and synthesizes
3
+ * subtree-level pointer transition events.
4
+ *
5
+ * The dispatcher keeps track of the previously hovered target path and
6
+ * compares it with the current one on every `mousemove`. From that diff it
7
+ * emits:
8
+ * - `mouseleave` for views that are no longer in the pointed subtree
9
+ * - `mouseenter` for views that have newly entered the pointed subtree
10
+ *
11
+ * This is intentionally closer to `mouseenter` / `mouseleave` semantics than
12
+ * DOM `mouseover` / `mouseout`. Moving between descendants inside the same
13
+ * subtree does not cause the ancestor to leave and re-enter.
14
+ *
15
+ * `dispatch()` handles ordinary event propagation and updates the current
16
+ * pointed target. `handlePointerLeave()` is used when the pointer leaves the
17
+ * canvas entirely, in which case the dispatcher emits `mouseleave` for the
18
+ * whole previously hovered path and clears its tracked state.
19
+ *
20
+ * The dispatcher does not do hit testing itself. It relies on views to route
21
+ * the incoming interaction and set `interaction.target` during propagation.
22
+ */
23
+ export default class InteractionDispatcher {
24
+ /**
25
+ * @param {object} options
26
+ * @param {import("../view/view.js").default} options.viewRoot
27
+ */
28
+ constructor({ viewRoot }: {
29
+ viewRoot: import("../view/view.js").default;
30
+ });
31
+ /**
32
+ * Dispatches an interaction through the view tree and updates the tracked
33
+ * hover path for transition synthesis.
34
+ *
35
+ * @param {import("../view/layout/point.js").default} point
36
+ * @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
37
+ * @returns {Interaction}
38
+ */
39
+ dispatch(point: import("../view/layout/point.js").default, uiEvent: import("../utils/interactionEvent.js").InteractionUiEvent): Interaction;
40
+ /**
41
+ * Dispatches mouseleave transitions when the pointer leaves the canvas.
42
+ *
43
+ * @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
44
+ */
45
+ handlePointerLeave(uiEvent: import("../utils/interactionEvent.js").InteractionUiEvent): void;
46
+ getCurrentTarget(): import("../view/view.js").default<import("../spec/view.js").ViewSpec>;
47
+ #private;
48
+ }
49
+ import Interaction from "../utils/interaction.js";
50
+ //# sourceMappingURL=interactionDispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactionDispatcher.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/interactionDispatcher.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAUI;;;OAGG;IACH,0BAFG;QAAmD,QAAQ,EAAnD,OAAO,iBAAiB,EAAE,OAAO;KAC3C,EAGA;IAED;;;;;;;OAOG;IACH,gBAJW,OAAO,yBAAyB,EAAE,OAAO,WACzC,OAAO,8BAA8B,EAAE,kBAAkB,GACvD,WAAW,CAavB;IAED;;;;OAIG;IACH,4BAFW,OAAO,8BAA8B,EAAE,kBAAkB,QAiBnE;IAED,0FAEC;;CAmHJ;wBA1MuB,yBAAyB"}