@genome-spy/core 0.78.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 (289) 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-DVOHLB1e.js → esm-CTUHLDbv.js} +30 -30
  6. package/dist/bundle/{esm-NIYEaYkc.js → esm-Cx-EbkOj.js} +13 -13
  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 +14840 -11661
  11. package/dist/bundle/index.js +119 -108
  12. package/dist/bundle/{parquetRead-DG_-F5j5.js → parquetRead-Cad1SOVV.js} +473 -399
  13. package/dist/schema.json +18940 -6914
  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 +6 -0
  131. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -1
  132. package/dist/src/genomeSpy/renderCoordinator.js +25 -3
  133. package/dist/src/genomeSpy/viewDataInit.d.ts +14 -0
  134. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  135. package/dist/src/genomeSpy/viewDataInit.js +45 -8
  136. package/dist/src/genomeSpyBase.d.ts +6 -0
  137. package/dist/src/genomeSpyBase.d.ts.map +1 -1
  138. package/dist/src/genomeSpyBase.js +20 -3
  139. package/dist/src/gl/glslScaleGenerator.d.ts +17 -0
  140. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  141. package/dist/src/gl/glslScaleGenerator.js +39 -2
  142. package/dist/src/gl/includes/common.glsl.js +1 -1
  143. package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -1
  144. package/dist/src/gl/vertexRangeIndex.js +4 -2
  145. package/dist/src/gl/webGLHelper.d.ts +1 -1
  146. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  147. package/dist/src/gl/webGLHelper.js +13 -8
  148. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +140 -3
  149. package/dist/src/marks/mark.d.ts +47 -4
  150. package/dist/src/marks/mark.d.ts.map +1 -1
  151. package/dist/src/marks/mark.js +158 -54
  152. package/dist/src/marks/point.d.ts.map +1 -1
  153. package/dist/src/marks/point.js +4 -0
  154. package/dist/src/marks/point.vertex.glsl.js +1 -1
  155. package/dist/src/marks/text.d.ts +1 -1
  156. package/dist/src/marks/text.d.ts.map +1 -1
  157. package/dist/src/marks/text.js +2 -7
  158. package/dist/src/marks/text.vertex.glsl.js +1 -1
  159. package/dist/src/paramRuntime/paramUtils.d.ts +43 -9
  160. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -1
  161. package/dist/src/paramRuntime/paramUtils.js +61 -1
  162. package/dist/src/paramRuntime/viewParamRuntime.d.ts +32 -0
  163. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  164. package/dist/src/paramRuntime/viewParamRuntime.js +63 -0
  165. package/dist/src/scales/axisResolution.d.ts +35 -0
  166. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  167. package/dist/src/scales/axisResolution.js +115 -7
  168. package/dist/src/scales/legendResolution.d.ts +83 -0
  169. package/dist/src/scales/legendResolution.d.ts.map +1 -0
  170. package/dist/src/scales/legendResolution.js +461 -0
  171. package/dist/src/scales/scaleResolution.d.ts +36 -0
  172. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  173. package/dist/src/scales/scaleResolution.js +59 -0
  174. package/dist/src/scales/viewLevelGuideConfig.d.ts +53 -0
  175. package/dist/src/scales/viewLevelGuideConfig.d.ts.map +1 -0
  176. package/dist/src/scales/viewLevelGuideConfig.js +224 -0
  177. package/dist/src/scales/viewLevelScaleConfig.d.ts.map +1 -1
  178. package/dist/src/scales/viewLevelScaleConfig.js +13 -2
  179. package/dist/src/spec/axis.d.ts +109 -3
  180. package/dist/src/spec/channel.d.ts +23 -4
  181. package/dist/src/spec/config.d.ts +59 -4
  182. package/dist/src/spec/data.d.ts +177 -17
  183. package/dist/src/spec/legend.d.ts +246 -0
  184. package/dist/src/spec/mark.d.ts +16 -4
  185. package/dist/src/spec/title.d.ts +58 -1
  186. package/dist/src/spec/transform.d.ts +149 -0
  187. package/dist/src/spec/view.d.ts +39 -6
  188. package/dist/src/types/embedApi.d.ts +262 -6
  189. package/dist/src/types/rendering.d.ts +19 -3
  190. package/dist/src/types/viewContext.d.ts +18 -2
  191. package/dist/src/utils/arrayUtils.d.ts +11 -0
  192. package/dist/src/utils/arrayUtils.d.ts.map +1 -1
  193. package/dist/src/utils/arrayUtils.js +23 -0
  194. package/dist/src/utils/suspension.d.ts +17 -0
  195. package/dist/src/utils/suspension.d.ts.map +1 -0
  196. package/dist/src/utils/suspension.js +41 -0
  197. package/dist/src/view/axisGridView.d.ts.map +1 -1
  198. package/dist/src/view/axisGridView.js +1 -4
  199. package/dist/src/view/axisView.d.ts +18 -2
  200. package/dist/src/view/axisView.d.ts.map +1 -1
  201. package/dist/src/view/axisView.js +180 -75
  202. package/dist/src/view/concatView.d.ts +10 -2
  203. package/dist/src/view/concatView.d.ts.map +1 -1
  204. package/dist/src/view/concatView.js +46 -9
  205. package/dist/src/view/containerMutationHelper.d.ts +20 -1
  206. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  207. package/dist/src/view/containerMutationHelper.js +196 -33
  208. package/dist/src/view/facetView.d.ts +1 -1
  209. package/dist/src/view/gridView/gridChild.d.ts +54 -4
  210. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  211. package/dist/src/view/gridView/gridChild.js +301 -120
  212. package/dist/src/view/gridView/gridChildLegends.d.ts +57 -0
  213. package/dist/src/view/gridView/gridChildLegends.d.ts.map +1 -0
  214. package/dist/src/view/gridView/gridChildLegends.js +503 -0
  215. package/dist/src/view/gridView/gridView.d.ts +25 -0
  216. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  217. package/dist/src/view/gridView/gridView.js +454 -78
  218. package/dist/src/view/gridView/legendLayout.d.ts +26 -0
  219. package/dist/src/view/gridView/legendLayout.d.ts.map +1 -0
  220. package/dist/src/view/gridView/legendLayout.js +111 -0
  221. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  222. package/dist/src/view/gridView/scrollbar.js +1 -4
  223. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  224. package/dist/src/view/gridView/selectionRect.js +1 -4
  225. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  226. package/dist/src/view/gridView/separatorView.js +1 -4
  227. package/dist/src/view/layerView.d.ts +9 -2
  228. package/dist/src/view/layerView.d.ts.map +1 -1
  229. package/dist/src/view/layerView.js +18 -1
  230. package/dist/src/view/layout/flexLayout.d.ts +20 -4
  231. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  232. package/dist/src/view/layout/flexLayout.js +331 -31
  233. package/dist/src/view/layout/rectangle.d.ts +14 -0
  234. package/dist/src/view/layout/rectangle.d.ts.map +1 -1
  235. package/dist/src/view/layout/rectangle.js +40 -0
  236. package/dist/src/view/legend/legendEntries.d.ts +20 -0
  237. package/dist/src/view/legend/legendEntries.d.ts.map +1 -0
  238. package/dist/src/view/legend/legendEntries.js +21 -0
  239. package/dist/src/view/legendView.d.ts +134 -0
  240. package/dist/src/view/legendView.d.ts.map +1 -0
  241. package/dist/src/view/legendView.js +1611 -0
  242. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  243. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +26 -4
  244. package/dist/src/view/renderingContext/clipOptions.d.ts +44 -0
  245. package/dist/src/view/renderingContext/clipOptions.d.ts.map +1 -0
  246. package/dist/src/view/renderingContext/clipOptions.js +140 -0
  247. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -1
  248. package/dist/src/view/renderingContext/simpleViewRenderingContext.js +12 -1
  249. package/dist/src/view/resolutionPlanner.d.ts +2 -1
  250. package/dist/src/view/resolutionPlanner.d.ts.map +1 -1
  251. package/dist/src/view/resolutionPlanner.js +89 -25
  252. package/dist/src/view/testUtils.d.ts +4 -2
  253. package/dist/src/view/testUtils.d.ts.map +1 -1
  254. package/dist/src/view/testUtils.js +29 -7
  255. package/dist/src/view/titleView.d.ts +37 -0
  256. package/dist/src/view/titleView.d.ts.map +1 -0
  257. package/dist/src/view/titleView.js +584 -0
  258. package/dist/src/view/unitView.d.ts +3 -3
  259. package/dist/src/view/unitView.d.ts.map +1 -1
  260. package/dist/src/view/unitView.js +3 -2
  261. package/dist/src/view/view.d.ts +25 -24
  262. package/dist/src/view/view.d.ts.map +1 -1
  263. package/dist/src/view/view.js +121 -16
  264. package/dist/src/view/viewFactory.d.ts +2 -5
  265. package/dist/src/view/viewFactory.d.ts.map +1 -1
  266. package/dist/src/view/viewFactory.js +1 -2
  267. package/dist/src/view/viewIdentityRegistry.d.ts +37 -0
  268. package/dist/src/view/viewIdentityRegistry.d.ts.map +1 -0
  269. package/dist/src/view/viewIdentityRegistry.js +71 -0
  270. package/dist/src/view/viewMutationAcidTestUtils.d.ts +112 -0
  271. package/dist/src/view/viewMutationAcidTestUtils.d.ts.map +1 -0
  272. package/dist/src/view/viewMutationAcidTestUtils.js +234 -0
  273. package/dist/src/view/viewMutationApi.d.ts +42 -0
  274. package/dist/src/view/viewMutationApi.d.ts.map +1 -0
  275. package/dist/src/view/viewMutationApi.js +811 -0
  276. package/dist/src/view/viewSelectors.d.ts +10 -0
  277. package/dist/src/view/viewSelectors.d.ts.map +1 -1
  278. package/dist/src/view/viewSelectors.js +23 -1
  279. package/package.json +4 -4
  280. package/dist/bundle/esm-CuMSzCHy.js +0 -298
  281. package/dist/bundle/esm-DAnOffpD.js +0 -1426
  282. package/dist/bundle/esm-DMXpJXM4.js +0 -369
  283. package/dist/bundle/esm-DNtC3H80.js +0 -121
  284. package/dist/src/view/title.d.ts +0 -13
  285. package/dist/src/view/title.d.ts.map +0 -1
  286. package/dist/src/view/title.js +0 -154
  287. /package/dist/bundle/{AbortablePromiseCache-3gHJdF3E.js → AbortablePromiseCache-BTmAcN-t.js} +0 -0
  288. /package/dist/bundle/{esm-CuVa5T98.js → esm-VvpZ9hsq.js} +0 -0
  289. /package/dist/bundle/{chunk-DmhlhrBa.js → rolldown-runtime-Dy4uBu1J.js} +0 -0
@@ -0,0 +1,461 @@
1
+ import {
2
+ findChannelDefWithScale,
3
+ isColorChannel,
4
+ isFieldDef,
5
+ isValueDef,
6
+ } from "../encoder/encoder.js";
7
+ import { getConfiguredLegendDefaults } from "../config/legendConfig.js";
8
+ import { shallowArrayEquals } from "../utils/arrayUtils.js";
9
+ import { orderResolutionMembers } from "./resolutionMemberOrder.js";
10
+ import { isChromeView } from "../view/viewSelectors.js";
11
+
12
+ /**
13
+ * @typedef {"symbol" | "gradient"} LegendType
14
+ * @typedef {object} LegendResolutionMember
15
+ * @prop {import("../view/unitView.js").default} view
16
+ * @prop {import("../spec/channel.js").ChannelWithScale} channel
17
+ *
18
+ * @typedef {{
19
+ * view: import("../view/unitView.js").default,
20
+ * channel: import("../spec/channel.js").ChannelWithScale,
21
+ * field?: string,
22
+ * type: LegendType,
23
+ * symbolChannels?: Partial<Record<import("../spec/channel.js").ChannelWithScale, string>>,
24
+ * symbolGeometry?: "point" | "stroke",
25
+ * legend: import("../spec/legend.js").LegendConfig,
26
+ * format?: string,
27
+ * dataType: import("../spec/channel.js").Type,
28
+ * scaleResolution: import("./scaleResolution.js").default
29
+ * }} LegendDefinition
30
+ */
31
+
32
+ const SYMBOL_LEGEND_CHANNELS = new Set([
33
+ "color",
34
+ "fill",
35
+ "stroke",
36
+ "opacity",
37
+ "fillOpacity",
38
+ "strokeOpacity",
39
+ "shape",
40
+ "size",
41
+ ]);
42
+ const GRADIENT_LEGEND_CHANNELS = new Set(["color", "fill", "stroke"]);
43
+
44
+ export default class LegendResolution {
45
+ /** @type {Set<LegendResolutionMember>} */
46
+ #members = new Set();
47
+
48
+ /** @type {{ view: import("../view/view.js").default, config: import("../spec/legend.js").Legend } | undefined} */
49
+ #viewLevelLegendConfig;
50
+
51
+ /**
52
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
53
+ */
54
+ constructor(channel) {
55
+ this.channel = channel;
56
+ }
57
+
58
+ /**
59
+ * @param {LegendResolutionMember} member
60
+ * @returns {() => boolean}
61
+ */
62
+ registerMember(member) {
63
+ this.#assertNoMixing(member);
64
+ this.#members.add(member);
65
+ return () => this.removeMember(member) && this.#members.size === 0;
66
+ }
67
+
68
+ /**
69
+ * @param {LegendResolutionMember} member
70
+ * @returns {boolean}
71
+ */
72
+ removeMember(member) {
73
+ return this.#members.delete(member);
74
+ }
75
+
76
+ /**
77
+ * @returns {LegendDefinition[]}
78
+ */
79
+ getLegendDefs() {
80
+ /** @type {Set<import("./scaleResolution.js").default>} */
81
+ const seenScaleResolutions = new Set();
82
+ /** @type {LegendDefinition[]} */
83
+ const definitions = [];
84
+
85
+ for (const member of orderResolutionMembers(this.#members)) {
86
+ const definition = this.#createLegendDefinition(member);
87
+ if (
88
+ definition &&
89
+ !seenScaleResolutions.has(definition.scaleResolution)
90
+ ) {
91
+ seenScaleResolutions.add(definition.scaleResolution);
92
+ definitions.push(definition);
93
+ }
94
+ }
95
+
96
+ return definitions;
97
+ }
98
+
99
+ /**
100
+ * @param {LegendResolutionMember} member
101
+ * @returns {LegendDefinition | undefined}
102
+ */
103
+ #createLegendDefinition(member) {
104
+ const { channel, view: legendParent } = member;
105
+ if (hasRedundantPrimaryLegend(channel, legendParent)) {
106
+ return undefined;
107
+ }
108
+
109
+ const channelDef = getLegendChannelDef(channel, legendParent);
110
+ if (!channelDef || isValueDef(channelDef)) {
111
+ return undefined;
112
+ }
113
+
114
+ const memberLegend =
115
+ "legend" in channelDef ? channelDef.legend : undefined;
116
+ if (!this.#viewLevelLegendConfig && memberLegend === null) {
117
+ return undefined;
118
+ }
119
+
120
+ if ("scale" in channelDef && channelDef.scale === null) {
121
+ return undefined;
122
+ }
123
+
124
+ const explicitLegend =
125
+ this.#viewLevelLegendConfig?.config ?? memberLegend;
126
+ const legendOverrides =
127
+ explicitLegend === undefined
128
+ ? undefined
129
+ : /** @type {import("../spec/legend.js").LegendConfig} */ ({
130
+ disable: false,
131
+ .../** @type {import("../spec/legend.js").Legend} */ (
132
+ explicitLegend
133
+ ),
134
+ });
135
+ const scaleResolution = legendParent.getScaleResolution(channel);
136
+ if (!scaleResolution) {
137
+ return undefined;
138
+ }
139
+
140
+ const legendDefaults = getConfiguredLegendDefaults(
141
+ legendParent.getConfigScopes(),
142
+ legendOverrides,
143
+ { track: isTrackLegendParent(legendParent) }
144
+ );
145
+ if (legendDefaults.disable === true) {
146
+ return undefined;
147
+ }
148
+
149
+ const legendType = getLegendType(channel, channelDef);
150
+ if (!legendType) {
151
+ return undefined;
152
+ }
153
+
154
+ const channelTitle =
155
+ /** @type {import("../spec/legend.js").Legend["title"] | undefined} */ (
156
+ "title" in channelDef ? channelDef.title : undefined
157
+ );
158
+ const title =
159
+ legendDefaults.title !== undefined
160
+ ? legendDefaults.title
161
+ : channelTitle !== undefined
162
+ ? channelTitle
163
+ : isFieldDef(channelDef)
164
+ ? channelDef.field
165
+ : undefined;
166
+ const format = "format" in channelDef ? channelDef.format : undefined;
167
+ const symbolChannels =
168
+ legendType == "symbol"
169
+ ? getRedundantSymbolChannels(channel, legendParent)
170
+ : undefined;
171
+ const symbolGeometry =
172
+ legendType == "symbol"
173
+ ? getSymbolGeometry(channel, legendParent)
174
+ : undefined;
175
+
176
+ return {
177
+ view: legendParent,
178
+ channel,
179
+ field: isFieldDef(channelDef) ? channelDef.field : undefined,
180
+ type: legendType,
181
+ symbolChannels,
182
+ symbolGeometry,
183
+ legend: {
184
+ ...legendDefaults,
185
+ title,
186
+ },
187
+ format,
188
+ dataType: channelDef.type,
189
+ scaleResolution,
190
+ };
191
+ }
192
+
193
+ /**
194
+ * @returns {boolean}
195
+ */
196
+ hasVisibleNonChromeMember() {
197
+ for (const member of this.#members) {
198
+ if (
199
+ member.view.isVisible() &&
200
+ !member.view.getLayoutAncestors().some(isChromeView)
201
+ ) {
202
+ return true;
203
+ }
204
+ }
205
+
206
+ return false;
207
+ }
208
+
209
+ getDebugState() {
210
+ const legendDefs = this.getLegendDefs();
211
+ return {
212
+ kind: "legend",
213
+ channel: this.channel,
214
+ hostView:
215
+ legendDefs[0]?.scaleResolution.getDebugState().hostView ??
216
+ this.#viewLevelLegendConfig?.view ??
217
+ this.#members.values().next().value?.view,
218
+ legendDefs: legendDefs.map((definition) => ({
219
+ ...definition,
220
+ view: definition.view,
221
+ scaleResolution: definition.scaleResolution,
222
+ legend: structuredClone(definition.legend),
223
+ })),
224
+ hasVisibleNonChromeMember: this.hasVisibleNonChromeMember(),
225
+ members: orderResolutionMembers(this.#members).map((member) => ({
226
+ view: member.view,
227
+ channel: member.channel,
228
+ })),
229
+ viewLevelLegendConfig: this.#viewLevelLegendConfig
230
+ ? {
231
+ view: this.#viewLevelLegendConfig.view,
232
+ config: structuredClone(
233
+ this.#viewLevelLegendConfig.config
234
+ ),
235
+ }
236
+ : undefined,
237
+ };
238
+ }
239
+
240
+ /**
241
+ * @param {import("../view/view.js").default} view
242
+ * @param {import("../spec/legend.js").Legend} config
243
+ */
244
+ attachViewLevelLegendConfig(view, config) {
245
+ if (
246
+ this.#viewLevelLegendConfig &&
247
+ this.#viewLevelLegendConfig.view !== view
248
+ ) {
249
+ throw new Error(
250
+ `Multiple view-level legend configs target the same ${this.channel} legend resolution.`
251
+ );
252
+ }
253
+
254
+ const configuredMember = Array.from(this.#members).find((member) =>
255
+ hasExplicitLegendConfig(member)
256
+ );
257
+ if (configuredMember) {
258
+ throw new Error(
259
+ `Cannot mix view-level legends.${this.channel} with encoding.${configuredMember.channel}.legend in the same legend resolution.`
260
+ );
261
+ }
262
+ this.#viewLevelLegendConfig = { view, config };
263
+ }
264
+
265
+ /**
266
+ * @param {import("../view/view.js").default} view
267
+ */
268
+ clearViewLevelLegendConfig(view) {
269
+ if (this.#viewLevelLegendConfig?.view === view) {
270
+ this.#viewLevelLegendConfig = undefined;
271
+ }
272
+ }
273
+
274
+ getViewLevelLegendConfig() {
275
+ return this.#viewLevelLegendConfig;
276
+ }
277
+
278
+ /**
279
+ * @param {LegendResolutionMember} member
280
+ */
281
+ #assertNoMixing(member) {
282
+ if (this.#viewLevelLegendConfig && hasExplicitLegendConfig(member)) {
283
+ throw new Error(
284
+ `Cannot mix view-level legends.${this.channel} with encoding.${member.channel}.legend in the same legend resolution.`
285
+ );
286
+ }
287
+ }
288
+ }
289
+
290
+ /**
291
+ * @param {LegendResolutionMember} member
292
+ * @returns {boolean}
293
+ */
294
+ function hasExplicitLegendConfig(member) {
295
+ const channelDef = getLegendChannelDef(member.channel, member.view);
296
+ return Boolean(
297
+ channelDef && "legend" in channelDef && channelDef.legend !== undefined
298
+ );
299
+ }
300
+
301
+ /**
302
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
303
+ * @param {import("../view/unitView.js").default} legendParent
304
+ * @returns {"point" | "stroke"}
305
+ */
306
+ function getSymbolGeometry(channel, legendParent) {
307
+ const markType = legendParent.getMarkType();
308
+ return channel == "size" && (markType == "rule" || markType == "link")
309
+ ? "stroke"
310
+ : "point";
311
+ }
312
+
313
+ /**
314
+ * @param {import("../view/unitView.js").default} legendParent
315
+ * @returns {boolean}
316
+ */
317
+ function isTrackLegendParent(legendParent) {
318
+ const xDef = getLegendChannelDef("x", legendParent);
319
+ const xScaleType = legendParent
320
+ .getScaleResolution("x")
321
+ ?.getResolvedScaleType();
322
+
323
+ return (
324
+ xDef?.type == "index" ||
325
+ xDef?.type == "locus" ||
326
+ xScaleType == "index" ||
327
+ xScaleType == "locus"
328
+ );
329
+ }
330
+
331
+ /**
332
+ * Classifies currently implemented legend support. Deferred and unsupported
333
+ * channels intentionally return undefined so accidental legends are not
334
+ * generated before their visual representation is designed.
335
+ *
336
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
337
+ * @param {import("../spec/channel.js").ChannelDefWithScale} channelDef
338
+ * @returns {LegendType | undefined}
339
+ */
340
+ function getLegendType(channel, channelDef) {
341
+ if (
342
+ ["opacity", "fillOpacity", "strokeOpacity", "size"].includes(channel) &&
343
+ channelDef.type == "quantitative"
344
+ ) {
345
+ return "symbol";
346
+ } else if (
347
+ (channelDef.type === "nominal" || channelDef.type === "ordinal") &&
348
+ SYMBOL_LEGEND_CHANNELS.has(channel)
349
+ ) {
350
+ return "symbol";
351
+ } else if (
352
+ channelDef.type === "quantitative" &&
353
+ GRADIENT_LEGEND_CHANNELS.has(channel)
354
+ ) {
355
+ return "gradient";
356
+ } else {
357
+ return undefined;
358
+ }
359
+ }
360
+
361
+ /**
362
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
363
+ * @param {import("../view/unitView.js").default} legendParent
364
+ * @returns {import("../spec/channel.js").ChannelDefWithScale | undefined}
365
+ */
366
+ function getLegendChannelDef(channel, legendParent) {
367
+ return findChannelDefWithScale(legendParent.spec.encoding?.[channel]);
368
+ }
369
+
370
+ /**
371
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
372
+ * @param {import("../view/unitView.js").default} legendParent
373
+ * @returns {boolean}
374
+ */
375
+ function isExplicitLegendNull(channel, legendParent) {
376
+ const channelDef = getLegendChannelDef(channel, legendParent);
377
+ return Boolean(
378
+ channelDef && "legend" in channelDef && channelDef.legend === null
379
+ );
380
+ }
381
+
382
+ /**
383
+ * @param {import("../spec/channel.js").ChannelWithScale} primary
384
+ * @param {import("../spec/channel.js").ChannelWithScale} secondary
385
+ * @param {import("../view/unitView.js").default} legendParent
386
+ * @returns {boolean}
387
+ */
388
+ function canMergeSymbolChannels(primary, secondary, legendParent) {
389
+ const primaryDef = getLegendChannelDef(primary, legendParent);
390
+ const secondaryDef = getLegendChannelDef(secondary, legendParent);
391
+ const primaryResolution = legendParent.getScaleResolution(primary);
392
+ const secondaryResolution = legendParent.getScaleResolution(secondary);
393
+
394
+ return (
395
+ isFieldDef(primaryDef) &&
396
+ isFieldDef(secondaryDef) &&
397
+ primaryDef.field === secondaryDef.field &&
398
+ primaryResolution &&
399
+ secondaryResolution &&
400
+ shallowArrayEquals(
401
+ primaryResolution.getDomain(),
402
+ secondaryResolution.getDomain()
403
+ )
404
+ );
405
+ }
406
+
407
+ /**
408
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
409
+ * @param {import("../view/unitView.js").default} legendParent
410
+ * @returns {boolean}
411
+ */
412
+ function hasRedundantPrimaryLegend(channel, legendParent) {
413
+ if (channel !== "shape") {
414
+ return false;
415
+ }
416
+
417
+ const channelDef = getLegendChannelDef(channel, legendParent);
418
+ if (!isFieldDef(channelDef)) {
419
+ return false;
420
+ }
421
+
422
+ for (const primary of /** @type {const} */ (["color", "fill", "stroke"])) {
423
+ if (
424
+ canMergeSymbolChannels(primary, channel, legendParent) &&
425
+ !isExplicitLegendNull(primary, legendParent)
426
+ ) {
427
+ return true;
428
+ }
429
+ }
430
+
431
+ return false;
432
+ }
433
+
434
+ /**
435
+ * @param {import("../spec/channel.js").ChannelWithScale} channel
436
+ * @param {import("../view/unitView.js").default} legendParent
437
+ * @returns {Partial<Record<import("../spec/channel.js").ChannelWithScale, string>>}
438
+ */
439
+ function getRedundantSymbolChannels(channel, legendParent) {
440
+ if (!isColorChannel(channel)) {
441
+ return {};
442
+ }
443
+
444
+ const channelDef = getLegendChannelDef(channel, legendParent);
445
+ const shapeDef = getLegendChannelDef("shape", legendParent);
446
+ const shapeResolution = legendParent.getScaleResolution("shape");
447
+
448
+ if (
449
+ isFieldDef(channelDef) &&
450
+ isFieldDef(shapeDef) &&
451
+ shapeResolution &&
452
+ canMergeSymbolChannels(channel, "shape", legendParent) &&
453
+ !isExplicitLegendNull("shape", legendParent)
454
+ ) {
455
+ return {
456
+ shape: shapeResolution.name ?? "shape",
457
+ };
458
+ }
459
+
460
+ return {};
461
+ }
@@ -96,6 +96,39 @@ export default class ScaleResolution implements ScaleResolutionApi {
96
96
  */
97
97
  isDomainDefinedExplicitly(): boolean;
98
98
  isDomainInitialized(): boolean;
99
+ /**
100
+ * Returns the participating members in the same deterministic order used
101
+ * for scale property merging.
102
+ *
103
+ * @returns {ScaleResolutionMember[]}
104
+ */
105
+ getOrderedMembers(): ScaleResolutionMember[];
106
+ getDebugState(): {
107
+ kind: string;
108
+ channel: import("../spec/channel.js").Channel;
109
+ hostView: import("../view/view.js").default<import("../spec/view.js").ViewSpec>;
110
+ name: string;
111
+ type: import("../spec/channel.js").Type;
112
+ resolvedScaleType: import("../spec/scale.js").ScaleType;
113
+ domain: any[];
114
+ complexDomain: import("../spec/scale.js").NumericDomain | import("../spec/scale.js").ComplexDomain;
115
+ range: any[];
116
+ zoomable: boolean;
117
+ zoomed: boolean;
118
+ members: {
119
+ view: import("../view/unitView.js").default<import("../spec/view.js").UnitSpec>;
120
+ channel: import("../spec/channel.js").ChannelWithScale;
121
+ channelDef: import("../spec/channel.js").ChannelDefWithScale;
122
+ contributesToDomain: boolean;
123
+ active: boolean;
124
+ }[];
125
+ activeMemberCount: number;
126
+ dataDomainMemberCount: number;
127
+ viewLevelScaleConfig: {
128
+ view: import("../view/view.js").default<import("../spec/view.js").ViewSpec>;
129
+ config: import("../spec/scale.js").Scale;
130
+ };
131
+ };
99
132
  /**
100
133
  * Returns locus assembly requirements without initializing the scale.
101
134
  *
@@ -145,6 +178,9 @@ export default class ScaleResolution implements ScaleResolutionApi {
145
178
  * Returns the scale instance, creating it if needed.
146
179
  *
147
180
  * Use this from call sites that may run before explicit initialization.
181
+ * Creating the scale resolves default domains and may require loaded
182
+ * assemblies for locus scales. For side-effect-free type checks, use
183
+ * `getResolvedScaleType()`.
148
184
  *
149
185
  * @returns {ScaleWithProps}
150
186
  */
@@ -1 +1 @@
1
- {"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleResolution.js"],"names":[],"mappings":"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"}
@@ -906,6 +906,62 @@ export default class ScaleResolution {
906
906
  return this.#orderedMembers;
907
907
  }
908
908
 
909
+ /**
910
+ * Returns the participating members in the same deterministic order used
911
+ * for scale property merging.
912
+ *
913
+ * @returns {ScaleResolutionMember[]}
914
+ */
915
+ getOrderedMembers() {
916
+ return this.#getOrderedMembers().slice();
917
+ }
918
+
919
+ getDebugState() {
920
+ const scale = this.#scaleManager.scale;
921
+ const canReadDomain = scale && typeof scale.domain === "function";
922
+ const canReadRange = scale && typeof scale.range === "function";
923
+
924
+ return {
925
+ kind: "scale",
926
+ channel: this.channel,
927
+ hostView: this.#resolutionView,
928
+ name: this.name,
929
+ type: this.type,
930
+ resolvedScaleType: this.getResolvedScaleType(),
931
+ domain: canReadDomain ? this.getDomain() : undefined,
932
+ complexDomain: canReadDomain ? this.getComplexDomain() : undefined,
933
+ range: canReadRange ? scale.range() : undefined,
934
+ zoomable: this.isZoomable(),
935
+ zoomed: this.isZoomable() ? this.isZoomed() : false,
936
+ members: this.#getOrderedMembers().map((member) =>
937
+ this.#createDebugMember(member)
938
+ ),
939
+ activeMemberCount: this.#getActiveMembers().size,
940
+ dataDomainMemberCount: this.#dataDomainMembers.size,
941
+ viewLevelScaleConfig: this.#viewLevelScaleConfig
942
+ ? {
943
+ view: this.#viewLevelScaleConfig.view,
944
+ config: structuredClone(
945
+ this.#viewLevelScaleConfig.config
946
+ ),
947
+ }
948
+ : undefined,
949
+ };
950
+ }
951
+
952
+ /**
953
+ * @param {ScaleResolutionMember} member
954
+ */
955
+ #createDebugMember(member) {
956
+ return {
957
+ view: member.view,
958
+ channel: member.channel,
959
+ channelDef: structuredClone(member.channelDef),
960
+ contributesToDomain: member.contributesToDomain,
961
+ active: this.#getActiveMembers().has(member),
962
+ };
963
+ }
964
+
909
965
  #invalidateConfiguredDomain() {
910
966
  this.#domainAggregator.invalidateConfiguredDomain();
911
967
  this.#invalidateMergedScaleProps();
@@ -1269,6 +1325,9 @@ export default class ScaleResolution {
1269
1325
  * Returns the scale instance, creating it if needed.
1270
1326
  *
1271
1327
  * Use this from call sites that may run before explicit initialization.
1328
+ * Creating the scale resolves default domains and may require loaded
1329
+ * assemblies for locus scales. For side-effect-free type checks, use
1330
+ * `getResolvedScaleType()`.
1272
1331
  *
1273
1332
  * @returns {ScaleWithProps}
1274
1333
  */
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Maps view-level axis configs and attaches non-pending configs to their
3
+ * target resolutions.
4
+ *
5
+ * @param {View} root
6
+ * @returns {ViewLevelAxisConfigMapping[]}
7
+ */
8
+ export function attachViewLevelAxisConfigs(root: View): ViewLevelAxisConfigMapping[];
9
+ /**
10
+ * Maps view-level legend configs and attaches non-pending configs to their
11
+ * target resolutions.
12
+ *
13
+ * @param {View} root
14
+ * @returns {ViewLevelLegendConfigMapping[]}
15
+ */
16
+ export function attachViewLevelLegendConfigs(root: View): ViewLevelLegendConfigMapping[];
17
+ /**
18
+ * Clears view-level guide configs owned by views in the subtree.
19
+ *
20
+ * @param {View} root
21
+ */
22
+ export function clearViewLevelGuideConfigs(root: View): void;
23
+ export type ChannelWithScale = import("../spec/channel.js").ChannelWithScale;
24
+ export type PrimaryPositionalChannel = import("../spec/channel.js").PrimaryPositionalChannel;
25
+ export type AxisConfig = import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis;
26
+ export type LegendConfig = import("../spec/legend.js").Legend;
27
+ export type View = import("../view/view.js").default;
28
+ export type AxisResolution = import("./axisResolution.js").default;
29
+ export type LegendResolution = import("./legendResolution.js").default;
30
+ export type ViewLevelAxisConfigMapping = {
31
+ view: View;
32
+ channel: PrimaryPositionalChannel;
33
+ config: Partial<AxisConfig>;
34
+ resolution: AxisResolution | undefined;
35
+ };
36
+ export type ViewLevelLegendConfigMapping = {
37
+ view: View;
38
+ channel: ChannelWithScale;
39
+ config: LegendConfig;
40
+ resolution: LegendResolution | undefined;
41
+ };
42
+ export type GuideConfigSpec = {
43
+ configKey: "axes" | "legends";
44
+ resolutionType: "axis" | "legend";
45
+ getResolution: (view: View, channel: any) => AxisResolution | LegendResolution | undefined;
46
+ getAllResolutions: (view: View) => Iterable<AxisResolution | LegendResolution>;
47
+ attach: (resolution: any, view: View, config: any) => void;
48
+ getAttachedConfig: (resolution: any) => {
49
+ view: View;
50
+ } | undefined;
51
+ clear: (resolution: any, view: View) => void;
52
+ };
53
+ //# sourceMappingURL=viewLevelGuideConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewLevelGuideConfig.d.ts","sourceRoot":"","sources":["../../../src/scales/viewLevelGuideConfig.js"],"names":[],"mappings":"AA0DA;;;;;;GAMG;AACH,iDAHW,IAAI,GACF,0BAA0B,EAAE,CAMxC;AAED;;;;;;GAMG;AACH,mDAHW,IAAI,GACF,4BAA4B,EAAE,CAM1C;AAED;;;;GAIG;AACH,iDAFW,IAAI,QAKd;+BAxFY,OAAO,oBAAoB,EAAE,gBAAgB;uCAC7C,OAAO,oBAAoB,EAAE,wBAAwB;yBACrD,OAAO,iBAAiB,EAAE,IAAI,GAAG,OAAO,iBAAiB,EAAE,UAAU;2BACrE,OAAO,mBAAmB,EAAE,MAAM;mBAClC,OAAO,iBAAiB,EAAE,OAAO;6BACjC,OAAO,qBAAqB,EAAE,OAAO;+BACrC,OAAO,uBAAuB,EAAE,OAAO;;UAG1C,IAAI;aACJ,wBAAwB;YACxB,OAAO,CAAC,UAAU,CAAC;gBACnB,cAAc,GAAG,SAAS;;;UAG1B,IAAI;aACJ,gBAAgB;YAChB,YAAY;gBACZ,gBAAgB,GAAG,SAAS;;;eAG5B,MAAM,GAAG,SAAS;oBAClB,MAAM,GAAG,QAAQ;mBACjB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,cAAc,GAAG,gBAAgB,GAAG,SAAS;uBAC3E,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,cAAc,GAAG,gBAAgB,CAAC;YAC3D,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI;uBAClD,CAAC,UAAU,EAAE,GAAG,KAAK;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,SAAS;WAC/C,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI"}