@genome-spy/core 0.77.0 → 0.79.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 (317) hide show
  1. package/dist/bundle/{browser-KWU9rWZT.js → browser-CETrb2cm.js} +53 -33
  2. package/dist/bundle/esm-BdLYkz-m.js +248 -0
  3. package/dist/bundle/esm-BwiDsqSb.js +1367 -0
  4. package/dist/bundle/esm-CDFd1cjk.js +441 -0
  5. package/dist/bundle/{esm-CRMf_I9V.js → esm-CTUHLDbv.js} +30 -30
  6. package/dist/bundle/esm-Cx-EbkOj.js +1221 -0
  7. package/dist/bundle/esm-DlYGqi79.js +128 -0
  8. package/dist/bundle/{esm-BygJiwh0.js → esm-k9p3oHkt.js} +133 -158
  9. package/dist/bundle/{esm-CT3ygiMq.js → esm-zAZJQO6D.js} +226 -212
  10. package/dist/bundle/index.es.js +14102 -10810
  11. package/dist/bundle/index.js +109 -95
  12. package/dist/bundle/{parquetRead-DG_-F5j5.js → parquetRead-Cad1SOVV.js} +473 -399
  13. package/dist/schema.json +23788 -11049
  14. package/dist/src/config/axisConfig.d.ts +2 -2
  15. package/dist/src/config/axisConfig.d.ts.map +1 -1
  16. package/dist/src/config/axisConfig.js +28 -44
  17. package/dist/src/config/configLayers.d.ts +45 -0
  18. package/dist/src/config/configLayers.d.ts.map +1 -0
  19. package/dist/src/config/configLayers.js +110 -0
  20. package/dist/src/config/defaultConfig.d.ts.map +1 -1
  21. package/dist/src/config/defaultConfig.js +8 -1
  22. package/dist/src/config/defaults/legendDefaults.d.ts +14 -0
  23. package/dist/src/config/defaults/legendDefaults.d.ts.map +1 -0
  24. package/dist/src/config/defaults/legendDefaults.js +46 -0
  25. package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -1
  26. package/dist/src/config/defaults/titleDefaults.js +26 -18
  27. package/dist/src/config/legendConfig.d.ts +11 -0
  28. package/dist/src/config/legendConfig.d.ts.map +1 -0
  29. package/dist/src/config/legendConfig.js +63 -0
  30. package/dist/src/config/styleUtils.d.ts +8 -2
  31. package/dist/src/config/styleUtils.d.ts.map +1 -1
  32. package/dist/src/config/styleUtils.js +25 -1
  33. package/dist/src/config/themes.d.ts.map +1 -1
  34. package/dist/src/config/themes.js +21 -2
  35. package/dist/src/config/titleConfig.d.ts.map +1 -1
  36. package/dist/src/config/titleConfig.js +2 -18
  37. package/dist/src/data/collector.d.ts.map +1 -1
  38. package/dist/src/data/collector.js +40 -18
  39. package/dist/src/data/flowInit.d.ts +6 -0
  40. package/dist/src/data/flowInit.d.ts.map +1 -1
  41. package/dist/src/data/flowInit.js +1 -1
  42. package/dist/src/data/flowNode.d.ts +32 -0
  43. package/dist/src/data/flowNode.d.ts.map +1 -1
  44. package/dist/src/data/flowNode.js +59 -0
  45. package/dist/src/data/sources/lazy/bamSource.d.ts +0 -1
  46. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  47. package/dist/src/data/sources/lazy/bamSource.js +39 -30
  48. package/dist/src/data/sources/lazy/bigBedSource.d.ts +0 -10
  49. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  50. package/dist/src/data/sources/lazy/bigBedSource.js +127 -62
  51. package/dist/src/data/sources/lazy/bigWigSource.d.ts +2 -2
  52. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  53. package/dist/src/data/sources/lazy/bigWigSource.js +234 -81
  54. package/dist/src/data/sources/lazy/gff3Source.d.ts +7 -3
  55. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  56. package/dist/src/data/sources/lazy/gff3Source.js +7 -8
  57. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts +1 -1
  58. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  59. package/dist/src/data/sources/lazy/indexedFastaSource.js +28 -19
  60. package/dist/src/data/sources/lazy/legendEntriesSource.d.ts +24 -0
  61. package/dist/src/data/sources/lazy/legendEntriesSource.d.ts.map +1 -0
  62. package/dist/src/data/sources/lazy/legendEntriesSource.js +217 -0
  63. package/dist/src/data/sources/lazy/legendGradientSource.d.ts +30 -0
  64. package/dist/src/data/sources/lazy/legendGradientSource.d.ts.map +1 -0
  65. package/dist/src/data/sources/lazy/legendGradientSource.js +388 -0
  66. package/dist/src/data/sources/lazy/mockLazySource.d.ts +4 -1
  67. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -1
  68. package/dist/src/data/sources/lazy/mockLazySource.js +49 -4
  69. package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
  70. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  71. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +3 -4
  72. package/dist/src/data/sources/lazy/tabixSource.d.ts +9 -4
  73. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  74. package/dist/src/data/sources/lazy/tabixSource.js +201 -70
  75. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +2 -3
  76. package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -1
  77. package/dist/src/data/sources/lazy/tabixTsvSource.js +14 -12
  78. package/dist/src/data/sources/lazy/vcfSource.d.ts +7 -3
  79. package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
  80. package/dist/src/data/sources/lazy/vcfSource.js +7 -8
  81. package/dist/src/data/sources/urlDescriptor.d.ts +165 -0
  82. package/dist/src/data/sources/urlDescriptor.d.ts.map +1 -0
  83. package/dist/src/data/sources/urlDescriptor.js +473 -0
  84. package/dist/src/data/sources/urlDescriptorController.d.ts +25 -0
  85. package/dist/src/data/sources/urlDescriptorController.d.ts.map +1 -0
  86. package/dist/src/data/sources/urlDescriptorController.js +72 -0
  87. package/dist/src/data/sources/urlDescriptorState.d.ts +47 -0
  88. package/dist/src/data/sources/urlDescriptorState.d.ts.map +1 -0
  89. package/dist/src/data/sources/urlDescriptorState.js +129 -0
  90. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  91. package/dist/src/data/sources/urlSource.js +101 -61
  92. package/dist/src/data/transforms/packLegendLabels.d.ts +21 -0
  93. package/dist/src/data/transforms/packLegendLabels.d.ts.map +1 -0
  94. package/dist/src/data/transforms/packLegendLabels.js +189 -0
  95. package/dist/src/data/transforms/transformFactory.d.ts.map +1 -1
  96. package/dist/src/data/transforms/transformFactory.js +4 -0
  97. package/dist/src/data/transforms/truncateText.d.ts +27 -0
  98. package/dist/src/data/transforms/truncateText.d.ts.map +1 -0
  99. package/dist/src/data/transforms/truncateText.js +94 -0
  100. package/dist/src/debug/dataflowDebugSnapshot.d.ts +58 -0
  101. package/dist/src/debug/dataflowDebugSnapshot.d.ts.map +1 -0
  102. package/dist/src/debug/dataflowDebugSnapshot.js +159 -0
  103. package/dist/src/debug/markDebugSnapshot.d.ts +54 -0
  104. package/dist/src/debug/markDebugSnapshot.d.ts.map +1 -0
  105. package/dist/src/debug/markDebugSnapshot.js +100 -0
  106. package/dist/src/debug/paramDebugSnapshot.d.ts +53 -0
  107. package/dist/src/debug/paramDebugSnapshot.d.ts.map +1 -0
  108. package/dist/src/debug/paramDebugSnapshot.js +86 -0
  109. package/dist/src/debug/resolutionDebugSnapshot.d.ts +155 -0
  110. package/dist/src/debug/resolutionDebugSnapshot.d.ts.map +1 -0
  111. package/dist/src/debug/resolutionDebugSnapshot.js +291 -0
  112. package/dist/src/debug/valuePreview.d.ts +9 -0
  113. package/dist/src/debug/valuePreview.d.ts.map +1 -0
  114. package/dist/src/debug/valuePreview.js +57 -0
  115. package/dist/src/debug/viewDebugSnapshot.d.ts +131 -0
  116. package/dist/src/debug/viewDebugSnapshot.d.ts.map +1 -0
  117. package/dist/src/debug/viewDebugSnapshot.js +390 -0
  118. package/dist/src/embedFactory.d.ts.map +1 -1
  119. package/dist/src/embedFactory.js +6 -1
  120. package/dist/src/encoder/encoder.d.ts +2 -2
  121. package/dist/src/encoder/encoder.d.ts.map +1 -1
  122. package/dist/src/encoder/encoder.js +5 -4
  123. package/dist/src/fonts/bmFontManager.d.ts +1 -1
  124. package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
  125. package/dist/src/fonts/bmFontManager.js +45 -10
  126. package/dist/src/fonts/textMetrics.d.ts +69 -0
  127. package/dist/src/fonts/textMetrics.d.ts.map +1 -0
  128. package/dist/src/fonts/textMetrics.js +73 -0
  129. package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -1
  130. package/dist/src/genomeSpy/headlessBootstrap.js +8 -0
  131. package/dist/src/genomeSpy/interactionController.d.ts +4 -1
  132. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  133. package/dist/src/genomeSpy/interactionController.js +57 -13
  134. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -1
  135. package/dist/src/genomeSpy/renderCoordinator.js +25 -3
  136. package/dist/src/genomeSpy/viewDataInit.d.ts +14 -0
  137. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  138. package/dist/src/genomeSpy/viewDataInit.js +45 -8
  139. package/dist/src/genomeSpyBase.d.ts +6 -0
  140. package/dist/src/genomeSpyBase.d.ts.map +1 -1
  141. package/dist/src/genomeSpyBase.js +25 -4
  142. package/dist/src/gl/glslScaleGenerator.d.ts +17 -0
  143. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  144. package/dist/src/gl/glslScaleGenerator.js +39 -2
  145. package/dist/src/gl/includes/common.glsl.js +1 -1
  146. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -1
  147. package/dist/src/gl/vertexRangeIndex.js +4 -2
  148. package/dist/src/gl/webGLHelper.d.ts +1 -1
  149. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  150. package/dist/src/gl/webGLHelper.js +13 -8
  151. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +140 -3
  152. package/dist/src/marks/mark.d.ts +47 -4
  153. package/dist/src/marks/mark.d.ts.map +1 -1
  154. package/dist/src/marks/mark.js +158 -54
  155. package/dist/src/marks/point.d.ts.map +1 -1
  156. package/dist/src/marks/point.js +4 -0
  157. package/dist/src/marks/point.vertex.glsl.js +1 -1
  158. package/dist/src/marks/text.d.ts +1 -1
  159. package/dist/src/marks/text.d.ts.map +1 -1
  160. package/dist/src/marks/text.js +2 -7
  161. package/dist/src/marks/text.vertex.glsl.js +1 -1
  162. package/dist/src/paramRuntime/paramUtils.d.ts +43 -9
  163. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -1
  164. package/dist/src/paramRuntime/paramUtils.js +61 -1
  165. package/dist/src/paramRuntime/viewParamRuntime.d.ts +32 -0
  166. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  167. package/dist/src/paramRuntime/viewParamRuntime.js +63 -0
  168. package/dist/src/scales/axisResolution.d.ts +35 -0
  169. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  170. package/dist/src/scales/axisResolution.js +115 -7
  171. package/dist/src/scales/domainExpressions.d.ts +21 -0
  172. package/dist/src/scales/domainExpressions.d.ts.map +1 -0
  173. package/dist/src/scales/domainExpressions.js +43 -0
  174. package/dist/src/scales/domainPlanner.d.ts +12 -1
  175. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  176. package/dist/src/scales/domainPlanner.js +55 -36
  177. package/dist/src/scales/legendResolution.d.ts +83 -0
  178. package/dist/src/scales/legendResolution.d.ts.map +1 -0
  179. package/dist/src/scales/legendResolution.js +461 -0
  180. package/dist/src/scales/scaleInstanceManager.d.ts +1 -0
  181. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  182. package/dist/src/scales/scaleInstanceManager.js +5 -0
  183. package/dist/src/scales/scalePropsResolver.d.ts +6 -1
  184. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  185. package/dist/src/scales/scalePropsResolver.js +35 -10
  186. package/dist/src/scales/scaleResolution.d.ts +52 -0
  187. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  188. package/dist/src/scales/scaleResolution.js +195 -16
  189. package/dist/src/scales/scaleRules.d.ts +10 -0
  190. package/dist/src/scales/scaleRules.d.ts.map +1 -1
  191. package/dist/src/scales/scaleRules.js +38 -1
  192. package/dist/src/scales/viewLevelGuideConfig.d.ts +53 -0
  193. package/dist/src/scales/viewLevelGuideConfig.d.ts.map +1 -0
  194. package/dist/src/scales/viewLevelGuideConfig.js +224 -0
  195. package/dist/src/scales/viewLevelScaleConfig.d.ts +45 -0
  196. package/dist/src/scales/viewLevelScaleConfig.d.ts.map +1 -0
  197. package/dist/src/scales/viewLevelScaleConfig.js +149 -0
  198. package/dist/src/spec/axis.d.ts +109 -3
  199. package/dist/src/spec/channel.d.ts +23 -4
  200. package/dist/src/spec/config.d.ts +59 -4
  201. package/dist/src/spec/data.d.ts +177 -17
  202. package/dist/src/spec/legend.d.ts +246 -0
  203. package/dist/src/spec/mark.d.ts +16 -4
  204. package/dist/src/spec/scale.d.ts +19 -6
  205. package/dist/src/spec/title.d.ts +58 -1
  206. package/dist/src/spec/transform.d.ts +149 -0
  207. package/dist/src/spec/view.d.ts +50 -6
  208. package/dist/src/styles/genome-spy.css +4 -1
  209. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  210. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  211. package/dist/src/styles/genome-spy.css.js +4 -1
  212. package/dist/src/types/embedApi.d.ts +262 -6
  213. package/dist/src/types/rendering.d.ts +19 -3
  214. package/dist/src/types/viewContext.d.ts +18 -2
  215. package/dist/src/utils/arrayUtils.d.ts +11 -0
  216. package/dist/src/utils/arrayUtils.d.ts.map +1 -1
  217. package/dist/src/utils/arrayUtils.js +23 -0
  218. package/dist/src/utils/suspension.d.ts +17 -0
  219. package/dist/src/utils/suspension.d.ts.map +1 -0
  220. package/dist/src/utils/suspension.js +41 -0
  221. package/dist/src/utils/ui/tooltip.d.ts +4 -0
  222. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  223. package/dist/src/utils/ui/tooltip.js +35 -10
  224. package/dist/src/view/axisGridView.d.ts.map +1 -1
  225. package/dist/src/view/axisGridView.js +1 -4
  226. package/dist/src/view/axisView.d.ts +18 -2
  227. package/dist/src/view/axisView.d.ts.map +1 -1
  228. package/dist/src/view/axisView.js +180 -75
  229. package/dist/src/view/concatView.d.ts +10 -2
  230. package/dist/src/view/concatView.d.ts.map +1 -1
  231. package/dist/src/view/concatView.js +46 -9
  232. package/dist/src/view/containerMutationHelper.d.ts +20 -1
  233. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  234. package/dist/src/view/containerMutationHelper.js +203 -32
  235. package/dist/src/view/facetView.d.ts +1 -1
  236. package/dist/src/view/gridView/gridChild.d.ts +54 -4
  237. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  238. package/dist/src/view/gridView/gridChild.js +301 -120
  239. package/dist/src/view/gridView/gridChildLegends.d.ts +57 -0
  240. package/dist/src/view/gridView/gridChildLegends.d.ts.map +1 -0
  241. package/dist/src/view/gridView/gridChildLegends.js +503 -0
  242. package/dist/src/view/gridView/gridView.d.ts +25 -0
  243. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  244. package/dist/src/view/gridView/gridView.js +454 -78
  245. package/dist/src/view/gridView/legendLayout.d.ts +26 -0
  246. package/dist/src/view/gridView/legendLayout.d.ts.map +1 -0
  247. package/dist/src/view/gridView/legendLayout.js +111 -0
  248. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  249. package/dist/src/view/gridView/scrollbar.js +1 -4
  250. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  251. package/dist/src/view/gridView/selectionRect.js +1 -4
  252. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  253. package/dist/src/view/gridView/separatorView.js +1 -4
  254. package/dist/src/view/layerView.d.ts +9 -2
  255. package/dist/src/view/layerView.d.ts.map +1 -1
  256. package/dist/src/view/layerView.js +18 -1
  257. package/dist/src/view/layout/flexLayout.d.ts +20 -4
  258. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  259. package/dist/src/view/layout/flexLayout.js +331 -31
  260. package/dist/src/view/layout/rectangle.d.ts +14 -0
  261. package/dist/src/view/layout/rectangle.d.ts.map +1 -1
  262. package/dist/src/view/layout/rectangle.js +40 -0
  263. package/dist/src/view/legend/legendEntries.d.ts +20 -0
  264. package/dist/src/view/legend/legendEntries.d.ts.map +1 -0
  265. package/dist/src/view/legend/legendEntries.js +21 -0
  266. package/dist/src/view/legendView.d.ts +134 -0
  267. package/dist/src/view/legendView.d.ts.map +1 -0
  268. package/dist/src/view/legendView.js +1611 -0
  269. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  270. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +26 -4
  271. package/dist/src/view/renderingContext/clipOptions.d.ts +44 -0
  272. package/dist/src/view/renderingContext/clipOptions.d.ts.map +1 -0
  273. package/dist/src/view/renderingContext/clipOptions.js +140 -0
  274. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -1
  275. package/dist/src/view/renderingContext/simpleViewRenderingContext.js +12 -1
  276. package/dist/src/view/resolutionPlanner.d.ts +2 -1
  277. package/dist/src/view/resolutionPlanner.d.ts.map +1 -1
  278. package/dist/src/view/resolutionPlanner.js +89 -25
  279. package/dist/src/view/testUtils.d.ts +4 -2
  280. package/dist/src/view/testUtils.d.ts.map +1 -1
  281. package/dist/src/view/testUtils.js +29 -7
  282. package/dist/src/view/titleView.d.ts +37 -0
  283. package/dist/src/view/titleView.d.ts.map +1 -0
  284. package/dist/src/view/titleView.js +584 -0
  285. package/dist/src/view/unitView.d.ts +3 -3
  286. package/dist/src/view/unitView.d.ts.map +1 -1
  287. package/dist/src/view/unitView.js +3 -2
  288. package/dist/src/view/view.d.ts +25 -24
  289. package/dist/src/view/view.d.ts.map +1 -1
  290. package/dist/src/view/view.js +121 -16
  291. package/dist/src/view/viewFactory.d.ts +2 -5
  292. package/dist/src/view/viewFactory.d.ts.map +1 -1
  293. package/dist/src/view/viewFactory.js +1 -2
  294. package/dist/src/view/viewIdentityRegistry.d.ts +37 -0
  295. package/dist/src/view/viewIdentityRegistry.d.ts.map +1 -0
  296. package/dist/src/view/viewIdentityRegistry.js +71 -0
  297. package/dist/src/view/viewMutationAcidTestUtils.d.ts +112 -0
  298. package/dist/src/view/viewMutationAcidTestUtils.d.ts.map +1 -0
  299. package/dist/src/view/viewMutationAcidTestUtils.js +234 -0
  300. package/dist/src/view/viewMutationApi.d.ts +42 -0
  301. package/dist/src/view/viewMutationApi.d.ts.map +1 -0
  302. package/dist/src/view/viewMutationApi.js +811 -0
  303. package/dist/src/view/viewSelectors.d.ts +10 -0
  304. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  305. package/dist/src/view/viewSelectors.js +23 -1
  306. package/package.json +4 -4
  307. package/dist/bundle/esm-0dYHNV_D.js +0 -121
  308. package/dist/bundle/esm-C49STiCR.js +0 -1248
  309. package/dist/bundle/esm-CscjKVDc.js +0 -1426
  310. package/dist/bundle/esm-CuMSzCHy.js +0 -298
  311. package/dist/bundle/esm-DMXpJXM4.js +0 -369
  312. package/dist/src/view/title.d.ts +0 -13
  313. package/dist/src/view/title.d.ts.map +0 -1
  314. package/dist/src/view/title.js +0 -154
  315. /package/dist/bundle/{AbortablePromiseCache-3gHJdF3E.js → AbortablePromiseCache-BTmAcN-t.js} +0 -0
  316. /package/dist/bundle/{esm-CuVa5T98.js → esm-VvpZ9hsq.js} +0 -0
  317. /package/dist/bundle/{chunk-DmhlhrBa.js → rolldown-runtime-Dy4uBu1J.js} +0 -0
@@ -0,0 +1,503 @@
1
+ import { findChannelDefWithScale, isValueDef } from "../../encoder/encoder.js";
2
+ import {
3
+ activateExprRefProps,
4
+ resolveInitOnlyExprRef,
5
+ } from "../../paramRuntime/paramUtils.js";
6
+ import LegendView, {
7
+ LegendRegionView,
8
+ getExternalLegendOverhang,
9
+ } from "../legendView.js";
10
+
11
+ /**
12
+ * @typedef {{
13
+ * legendView: LegendView,
14
+ * resolution: import("../../scales/legendResolution.js").default,
15
+ * }} GridChildLegendEntry
16
+ *
17
+ * @typedef {{
18
+ * definition: import("../../scales/legendResolution.js").LegendDefinition,
19
+ * resolution: import("../../scales/legendResolution.js").default,
20
+ * }} OrderedLegendEntry
21
+ *
22
+ * @typedef {{
23
+ * legendView: LegendRegionView,
24
+ * entries: GridChildLegendEntry[],
25
+ * }} GridChildLegendRegion
26
+ *
27
+ * @typedef {Partial<Record<import("../../spec/legend.js").LegendOrient, GridChildLegendRegion>>} GridChildLegends
28
+ * @typedef {Omit<import("../../spec/legend.js").LegendConfig, "orient"> & {
29
+ * orient?: import("../../spec/legend.js").LegendOrient
30
+ * }} ResolvedLegendConfig
31
+ */
32
+
33
+ const INHERITED_SYMBOL_ENCODING_CHANNELS = /** @type {const} */ ([
34
+ "color",
35
+ "fill",
36
+ "stroke",
37
+ "opacity",
38
+ "fillOpacity",
39
+ "strokeOpacity",
40
+ "strokeWidth",
41
+ "shape",
42
+ ]);
43
+
44
+ const LEGEND_ORIENTS = new Set(
45
+ /** @type {const} */ ([
46
+ "left",
47
+ "right",
48
+ "top",
49
+ "bottom",
50
+ "top-left",
51
+ "top-right",
52
+ "bottom-left",
53
+ "bottom-right",
54
+ ])
55
+ );
56
+
57
+ /**
58
+ * @param {import("../view.js").default[]} legendOwners
59
+ * @returns {Map<import("../view.js").default, number>}
60
+ */
61
+ function getDepthFirstViewOrder(legendOwners) {
62
+ /** @type {Map<import("../view.js").default, number>} */
63
+ const order = new Map();
64
+
65
+ for (const owner of legendOwners) {
66
+ owner.visit((view) => {
67
+ if (!order.has(view)) {
68
+ order.set(view, order.size);
69
+ }
70
+ });
71
+ }
72
+
73
+ return order;
74
+ }
75
+
76
+ /**
77
+ * @param {import("../../scales/legendResolution.js").LegendDefinition} definition
78
+ * @returns {string}
79
+ */
80
+ function getLegendSortLabel(definition) {
81
+ return String(
82
+ definition.legend.title ?? definition.field ?? definition.channel
83
+ ).toLocaleLowerCase();
84
+ }
85
+
86
+ /**
87
+ * @param {import("../view.js").default[]} legendOwners
88
+ * @returns {OrderedLegendEntry[]}
89
+ */
90
+ export function getOrderedLegendEntries(legendOwners) {
91
+ const viewOrder = getDepthFirstViewOrder(legendOwners);
92
+ /** @type {OrderedLegendEntry[]} */
93
+ const entries = [];
94
+
95
+ for (const legendOwner of legendOwners) {
96
+ for (const resolution of Object.values(
97
+ legendOwner.resolutions.legend
98
+ )) {
99
+ for (const definition of resolution.getLegendDefs()) {
100
+ entries.push({ definition, resolution });
101
+ }
102
+ }
103
+ }
104
+
105
+ entries.sort((a, b) => {
106
+ const viewDiff =
107
+ (viewOrder.get(a.definition.view) ?? Number.MAX_SAFE_INTEGER) -
108
+ (viewOrder.get(b.definition.view) ?? Number.MAX_SAFE_INTEGER);
109
+ if (viewDiff != 0) {
110
+ return viewDiff;
111
+ }
112
+
113
+ const labelDiff = getLegendSortLabel(a.definition).localeCompare(
114
+ getLegendSortLabel(b.definition)
115
+ );
116
+ if (labelDiff != 0) {
117
+ return labelDiff;
118
+ }
119
+
120
+ return a.definition.channel.localeCompare(b.definition.channel);
121
+ });
122
+
123
+ return entries;
124
+ }
125
+
126
+ /**
127
+ * @param {import("../../spec/channel.js").ChannelDef | undefined} channelDef
128
+ * @returns {import("../../spec/channel.js").ValueDef | undefined}
129
+ */
130
+ function getEmptySelectionValueDef(channelDef) {
131
+ if (channelDef && "condition" in channelDef) {
132
+ const conditions = Array.isArray(channelDef.condition)
133
+ ? channelDef.condition
134
+ : [channelDef.condition];
135
+ for (const condition of conditions) {
136
+ if (condition.empty !== false && "value" in condition) {
137
+ return { value: condition.value };
138
+ }
139
+ }
140
+ }
141
+
142
+ return isValueDef(channelDef) ? { value: channelDef.value } : undefined;
143
+ }
144
+
145
+ /**
146
+ * @param {any} value
147
+ * @returns {value is string}
148
+ */
149
+ function isConstantColor(value) {
150
+ return typeof value === "string";
151
+ }
152
+
153
+ /**
154
+ * @param {Record<string, import("../../spec/channel.js").ValueDef<any>>} encoding
155
+ * @param {Set<string>} scaledChannels
156
+ * @param {Partial<import("../../spec/mark.js").PointProps>} sourceProps
157
+ */
158
+ function applyConstantMarkColorStyle(encoding, scaledChannels, sourceProps) {
159
+ if (isConstantColor(sourceProps.fill) && !scaledChannels.has("fill")) {
160
+ encoding.fill = { value: sourceProps.fill };
161
+ }
162
+ if (isConstantColor(sourceProps.stroke) && !scaledChannels.has("stroke")) {
163
+ encoding.stroke = { value: sourceProps.stroke };
164
+ }
165
+
166
+ if (isConstantColor(sourceProps.color) && !scaledChannels.has("color")) {
167
+ if (sourceProps.filled) {
168
+ if (!scaledChannels.has("fill")) {
169
+ encoding.fill = { value: sourceProps.color };
170
+ }
171
+ if (!scaledChannels.has("stroke")) {
172
+ encoding.stroke = { value: null };
173
+ }
174
+ if (!scaledChannels.has("strokeWidth")) {
175
+ encoding.strokeWidth = { value: 0 };
176
+ }
177
+ } else {
178
+ if (!scaledChannels.has("stroke")) {
179
+ encoding.stroke = { value: sourceProps.color };
180
+ }
181
+ if (!scaledChannels.has("fill")) {
182
+ encoding.fill = { value: sourceProps.color };
183
+ }
184
+ if (!scaledChannels.has("fillOpacity")) {
185
+ encoding.fillOpacity = { value: 0 };
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ /**
192
+ * @param {import("../unitView.js").default} sourceView
193
+ * @param {import("../../spec/channel.js").ChannelWithScale} channel
194
+ * @returns {boolean}
195
+ */
196
+ function hasScaleBackedChannel(sourceView, channel) {
197
+ return Boolean(
198
+ findChannelDefWithScale(sourceView.spec.encoding?.[channel])
199
+ );
200
+ }
201
+
202
+ /**
203
+ * Vega-Lite's `compile/legend/encode.ts` neutralizes non-redundant color
204
+ * encodings in other symbol legends. See its
205
+ * "should have fill if a color encoding exists" test: a size legend with an
206
+ * independent color scale gets a neutral black symbol instead of reusing the
207
+ * color scale. GenomeSpy follows that behavior to avoid suggesting that the
208
+ * size legend also explains color.
209
+ *
210
+ * @param {Record<string, import("../../spec/channel.js").ValueDef<any>>} encoding
211
+ * @param {Set<string>} scaledChannels
212
+ * @param {import("../unitView.js").default} sourceView
213
+ */
214
+ function applyConflictingScaledColorStyle(
215
+ encoding,
216
+ scaledChannels,
217
+ sourceView
218
+ ) {
219
+ const hasConflictingColorScale = /** @type {const} */ ([
220
+ "color",
221
+ "fill",
222
+ "stroke",
223
+ ]).some(
224
+ (channel) =>
225
+ !scaledChannels.has(channel) &&
226
+ hasScaleBackedChannel(sourceView, channel)
227
+ );
228
+
229
+ if (hasConflictingColorScale && !scaledChannels.has("fill")) {
230
+ encoding.fill = { value: "black" };
231
+ }
232
+ }
233
+
234
+ /**
235
+ * @param {import("../../spec/channel.js").ChannelWithScale} channel
236
+ * @param {Partial<Record<import("../../spec/channel.js").ChannelWithScale, string>>} symbolChannels
237
+ * @param {import("../unitView.js").default} sourceView
238
+ */
239
+ function createInheritedSymbolStyle(channel, symbolChannels, sourceView) {
240
+ const scaledChannels = new Set([channel, ...Object.keys(symbolChannels)]);
241
+
242
+ /** @type {import("../legendView.js").SymbolLegendStyle} */
243
+ const style = { mark: {}, encoding: {} };
244
+ const sourceProps =
245
+ /** @type {Partial<import("../../spec/mark.js").PointProps>} */ (
246
+ sourceView.mark.properties
247
+ );
248
+ const styleEncoding =
249
+ /** @type {Record<string, import("../../spec/channel.js").ValueDef<any>>} */ (
250
+ style.encoding
251
+ );
252
+ const styleMark =
253
+ /** @type {Partial<import("../../spec/mark.js").PointProps>} */ (
254
+ style.mark
255
+ );
256
+
257
+ if (sourceProps.filled !== undefined) {
258
+ styleMark.filled = sourceProps.filled;
259
+ }
260
+ if (sourceProps.opacity !== undefined) {
261
+ styleMark.opacity = sourceProps.opacity;
262
+ }
263
+ if (sourceProps.fillOpacity !== undefined) {
264
+ styleMark.fillOpacity = sourceProps.fillOpacity;
265
+ }
266
+ if (sourceProps.strokeOpacity !== undefined) {
267
+ styleMark.strokeOpacity = sourceProps.strokeOpacity;
268
+ }
269
+ if (sourceProps.strokeWidth !== undefined) {
270
+ styleMark.strokeWidth = sourceProps.strokeWidth;
271
+ }
272
+ if (sourceProps.shape !== undefined) {
273
+ styleMark.shape = sourceProps.shape;
274
+ } else if (sourceView.getMarkType() == "rect") {
275
+ styleMark.shape = "square";
276
+ }
277
+
278
+ applyConstantMarkColorStyle(styleEncoding, scaledChannels, sourceProps);
279
+ applyConflictingScaledColorStyle(styleEncoding, scaledChannels, sourceView);
280
+
281
+ const colorDef = sourceView.spec.encoding?.color;
282
+ const filled = sourceProps.filled;
283
+ const colorValueDef = getEmptySelectionValueDef(colorDef);
284
+ if (colorValueDef && !scaledChannels.has("color")) {
285
+ if (filled) {
286
+ styleEncoding.fill = colorValueDef;
287
+ styleEncoding.stroke = { value: null };
288
+ styleEncoding.strokeWidth = { value: 0 };
289
+ } else {
290
+ styleEncoding.stroke = colorValueDef;
291
+ styleEncoding.fill = colorValueDef;
292
+ styleEncoding.fillOpacity = { value: 0 };
293
+ }
294
+ }
295
+
296
+ for (const channel of INHERITED_SYMBOL_ENCODING_CHANNELS) {
297
+ if (channel == "color" || scaledChannels.has(channel)) {
298
+ continue;
299
+ }
300
+
301
+ const channelDef = sourceView.spec.encoding?.[channel];
302
+ const valueDef = getEmptySelectionValueDef(channelDef);
303
+ if (valueDef) {
304
+ styleEncoding[channel] = valueDef;
305
+ }
306
+ }
307
+
308
+ return style;
309
+ }
310
+
311
+ /**
312
+ * @param {any} orient
313
+ * @returns {asserts orient is import("../../spec/legend.js").LegendOrient}
314
+ */
315
+ function assertLegendOrient(orient) {
316
+ if (!LEGEND_ORIENTS.has(orient)) {
317
+ throw new Error(`Invalid legend orientation "${orient}"!`);
318
+ }
319
+ }
320
+
321
+ /**
322
+ * @param {import("../../spec/legend.js").LegendConfig} legend
323
+ * @param {import("../view.js").default} legendParent
324
+ * @param {(disposer: () => void) => void} registerDisposer
325
+ * @returns {ResolvedLegendConfig}
326
+ */
327
+ function resolveLegendOrient(legend, legendParent, registerDisposer) {
328
+ const orient = resolveInitOnlyExprRef(
329
+ legendParent.paramRuntime,
330
+ legend.orient,
331
+ "Reactive legend orient changes are not supported.",
332
+ registerDisposer
333
+ );
334
+ if (orient !== undefined) {
335
+ assertLegendOrient(orient);
336
+ }
337
+
338
+ return orient === legend.orient
339
+ ? /** @type {ResolvedLegendConfig} */ (legend)
340
+ : /** @type {ResolvedLegendConfig} */ ({ ...legend, orient });
341
+ }
342
+
343
+ /**
344
+ * @param {import("../../spec/legend.js").LegendConfig} legend
345
+ * @param {import("../view.js").default} legendParent
346
+ * @param {(disposer: () => void) => void} registerDisposer
347
+ * @param {() => void} listener
348
+ * @returns {ResolvedLegendConfig}
349
+ */
350
+ function resolveLegendProps(legend, legendParent, registerDisposer, listener) {
351
+ const orientedLegend = resolveLegendOrient(
352
+ legend,
353
+ legendParent,
354
+ registerDisposer
355
+ );
356
+
357
+ return activateExprRefProps(
358
+ legendParent.paramRuntime,
359
+ orientedLegend,
360
+ (props) => {
361
+ if (props.has("disable")) {
362
+ listener();
363
+ }
364
+ },
365
+ registerDisposer
366
+ );
367
+ }
368
+
369
+ /**
370
+ * @param {import("../../scales/legendResolution.js").LegendDefinition} definition
371
+ * @param {import("../containerView.js").default} layoutParent
372
+ * @returns {Promise<LegendView>}
373
+ */
374
+ export async function createGridChildLegend(definition, layoutParent) {
375
+ const legendParent = definition.view;
376
+ /** @type {(() => void)[]} */
377
+ const legendDisposers = [];
378
+ /** @type {LegendView | undefined} */
379
+ let legend;
380
+ const legendProps = resolveLegendProps(
381
+ definition.legend,
382
+ legendParent,
383
+ (disposer) => legendDisposers.push(disposer),
384
+ () => {
385
+ if (!legend) {
386
+ throw new Error("Legend has not been initialized!");
387
+ }
388
+
389
+ legend.invalidateSizeCache();
390
+
391
+ legend.context.requestLayoutReflow();
392
+ }
393
+ );
394
+ const symbolStyle =
395
+ definition.type == "symbol"
396
+ ? createInheritedSymbolStyle(
397
+ definition.channel,
398
+ definition.symbolChannels ?? {},
399
+ // Multi-view arbitration is intentionally simple for now:
400
+ // use the first deterministic contributor.
401
+ definition.scaleResolution.getOrderedMembers()[0].view
402
+ )
403
+ : undefined;
404
+
405
+ legend = new LegendView(
406
+ {
407
+ channel: definition.channel,
408
+ type: definition.type,
409
+ symbolChannels: definition.symbolChannels,
410
+ symbolGeometry: definition.symbolGeometry,
411
+ symbolStyle,
412
+ legend: legendProps,
413
+ format: definition.format,
414
+ dataType: definition.dataType,
415
+ },
416
+ layoutParent.context,
417
+ layoutParent,
418
+ legendParent
419
+ );
420
+
421
+ for (const dispose of legendDisposers) {
422
+ legend.registerDisposer(dispose);
423
+ }
424
+
425
+ await legend.initializeChildren();
426
+ return legend;
427
+ }
428
+
429
+ /**
430
+ * @param {GridChildLegends} legends
431
+ * @param {LegendView} legend
432
+ * @param {import("../../scales/legendResolution.js").default} resolution
433
+ */
434
+ export async function addLegendView(legends, legend, resolution) {
435
+ const orient = /** @type {import("../../spec/legend.js").LegendOrient} */ (
436
+ legend.legendProps.orient ?? "right"
437
+ );
438
+ let region = legends[orient];
439
+
440
+ if (!region) {
441
+ const regionView = new LegendRegionView(
442
+ orient,
443
+ legend.legendProps.spacing ?? 0,
444
+ legend.context,
445
+ legend.layoutParent,
446
+ legend.dataParent
447
+ );
448
+ await regionView.initializeChildren();
449
+ region = { legendView: regionView, entries: [] };
450
+ legends[orient] = region;
451
+ }
452
+
453
+ legend.setActivePredicate(
454
+ () =>
455
+ !legend.legendProps.disable &&
456
+ resolution.hasVisibleNonChromeMember()
457
+ );
458
+ region.legendView.addLegendView(legend);
459
+ region.entries.push({ legendView: legend, resolution });
460
+ }
461
+
462
+ /**
463
+ * @param {GridChildLegends} legends
464
+ */
465
+ export function* iterateLegendViews(legends) {
466
+ for (const region of Object.values(legends)) {
467
+ yield region.legendView;
468
+ }
469
+ }
470
+
471
+ /**
472
+ * @param {GridChildLegends} legends
473
+ */
474
+ export function disposeLegendViews(legends) {
475
+ for (const legendView of iterateLegendViews(legends)) {
476
+ legendView.disposeSubtree();
477
+ }
478
+ }
479
+
480
+ /**
481
+ * @param {GridChildLegends} legends
482
+ * @param {import("../../spec/legend.js").LegendOrient} orient
483
+ */
484
+ export function getLegendOverhang(legends, orient) {
485
+ const region = legends[orient];
486
+ return region && isActiveLegendRegion(region)
487
+ ? getExternalLegendOverhang(region.legendView)
488
+ : 0;
489
+ }
490
+
491
+ /**
492
+ * @param {GridChildLegendEntry} entry
493
+ */
494
+ export function isActiveLegendEntry(entry) {
495
+ return entry.resolution.hasVisibleNonChromeMember();
496
+ }
497
+
498
+ /**
499
+ * @param {GridChildLegendRegion} region
500
+ */
501
+ export function isActiveLegendRegion(region) {
502
+ return region.entries.some(isActiveLegendEntry);
503
+ }
@@ -76,6 +76,13 @@ export default class GridView<TSpec extends import("../../spec/view.js").AnyConc
76
76
  * @param {number} index
77
77
  */
78
78
  removeChildAt(index: number): void;
79
+ /**
80
+ * Moves a child within the grid without disposing it.
81
+ *
82
+ * @param {number} fromIndex
83
+ * @param {number} index Destination index after temporarily removing the child.
84
+ */
85
+ moveChildAt(fromIndex: number, index: number): void;
79
86
  /**
80
87
  * @param {View[]} views
81
88
  */
@@ -89,12 +96,30 @@ export default class GridView<TSpec extends import("../../spec/view.js").AnyConc
89
96
  * @protected
90
97
  */
91
98
  protected createAxes(): Promise<void>;
99
+ /**
100
+ * Recreates guide and chrome views that depend on the child hierarchy.
101
+ * Shared guides always depend on the whole container. Grid-child guides can
102
+ * be limited to newly inserted children during mutations.
103
+ *
104
+ * @param {{ gridChildren?: GridChild[] }} [options]
105
+ */
106
+ syncGuideViews(options?: {
107
+ gridChildren?: GridChild[];
108
+ }): Promise<void>;
92
109
  /**
93
110
  * Recreates shared axes based on current axis resolutions.
94
111
  *
95
112
  * This is used after dynamic child insert/remove to keep shared axes in sync.
96
113
  */
97
114
  syncSharedAxes(): Promise<void>;
115
+ /**
116
+ * Recreates shared legends based on current legend resolutions.
117
+ *
118
+ * Shared legends are GridView-owned for the same reason as shared axes:
119
+ * their placement is relative to the whole child grid, not any individual
120
+ * GridChild.
121
+ */
122
+ syncSharedLegends(): Promise<void>;
98
123
  #private;
99
124
  }
100
125
  import AxisView from "../axisView.js";
@@ -1 +1 @@
1
- {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AAywCA;;GAEG;AACH,sHAUC;AA4DD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AA3zCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IA6CrD;;;;;;;;;OASG;IACH,kBARW,KAAK,WACL,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,yFAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAyC1C;IAtBG,uBAA0B;IAwB9B;;OAEG;IACH,6FAEC;IAED;;;;;;OAMG;IACH,4FAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,oGAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,iGAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAu4BJ;qBAjsC0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAQzB,gBAAgB"}
1
+ {"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AA4lDA;;GAEG;AACH,sHAUC;AAqFD;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aA+BlB;AArlDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAH2D,KAAK,SAAnD,OAAQ,oBAAoB,EAAE,aAAc;IAgDrD;;;;;;;;;OASG;IACH,kBARW,KAAK,WACL,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,yFAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAyC1C;IAtBG,uBAA0B;IAwB9B;;OAEG;IACH,6FAEC;IAED;;;;;;OAMG;IACH,4FAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,oGAHW,MAAM,GACJ,SAAS,CASrB;IAED;;;;;OAKG;IACH,iGAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAUhB;IAED;;;;;OAKG;IACH,uBAHW,MAAM,SACN,MAAM,QAKhB;IAeD;;OAEG;IACH,mBAFW,qEAAM,QAWhB;IAYD;;OAEG;IACH,sFAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAEC;IAED;;;;;;OAMG;IACH,yBAFW;QAAE,YAAY,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,iBAWxC;IAED;;;;OAIG;IACH,gCAqCC;IAED;;;;;;OAMG;IACH,mCAUC;;CA4kCJ;qBA9gDM,gBAAgB;sBALD,wBAAwB;0BAMpB,qBAAqB;sBAQzB,gBAAgB"}