@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
@@ -12,6 +12,8 @@ import { isStepSize } from "../view.js";
12
12
  * @typedef {object} SizeDef Size definition inspired by CSS flexbox
13
13
  * @prop {number} [px] Size in pixels
14
14
  * @prop {number} [grow] Share of remaining space
15
+ * @prop {number} [minPx] Minimum size in pixels
16
+ * @prop {number} [maxPx] Maximum size in pixels
15
17
  *
16
18
  * @typedef {object} LocSize One-dimensional location and size
17
19
  * @prop {number} location
@@ -37,16 +39,17 @@ export function mapToPixelCoords(
37
39
  spacing = spacing || 0;
38
40
  offset = offset || 0;
39
41
 
40
- let totalPx = 0;
41
- let totalGrow = 0;
42
+ const itemSizes = resolveItemSizes(items, containerSize, spacing);
42
43
 
43
- for (const size of items) {
44
- totalPx += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
45
- totalGrow += z(size.grow);
44
+ let totalSize = 0;
45
+ let nonZeroCount = 0;
46
+ for (let i = 0; i < items.length; i++) {
47
+ totalSize += itemSizes[i];
48
+ if (!isZeroSizeDef(items[i])) {
49
+ nonZeroCount++;
50
+ }
46
51
  }
47
- totalPx -= spacing;
48
-
49
- const remainingSpace = Math.max(0, containerSize - totalPx);
52
+ const totalPx = totalSize + Math.max(0, nonZeroCount - 1) * spacing;
50
53
 
51
54
  /** @type {function(number):number} x */
52
55
  const round =
@@ -57,9 +60,8 @@ export function mapToPixelCoords(
57
60
  /**
58
61
  * Buffer zero-sized items so that their locations can be spread evenly.
59
62
  * They can then be interpolated nicely.
60
- * @type {SizeDef[]}
61
63
  */
62
- const zeroBuffer = [];
64
+ let zeroCount = 0;
63
65
 
64
66
  /** @type {LocSize[]} */
65
67
  const results = [];
@@ -70,7 +72,7 @@ export function mapToPixelCoords(
70
72
  * @param {boolean} inMiddle
71
73
  */
72
74
  const flushZeroBuffer = (inMiddle) => {
73
- const n = zeroBuffer.length;
75
+ const n = zeroCount;
74
76
  if (!n) {
75
77
  return;
76
78
  }
@@ -86,7 +88,7 @@ export function mapToPixelCoords(
86
88
  }
87
89
  x += s;
88
90
 
89
- zeroBuffer.length = 0;
91
+ zeroCount = 0;
90
92
  };
91
93
 
92
94
  let x = reverse ? Math.max(containerSize, totalPx) : 0 + offset;
@@ -100,13 +102,11 @@ export function mapToPixelCoords(
100
102
  const size = items[i];
101
103
 
102
104
  if (isZeroSizeDef(size)) {
103
- zeroBuffer.push(size);
105
+ zeroCount++;
104
106
  } else {
105
107
  flushZeroBuffer(results.length > 0);
106
108
 
107
- const advance =
108
- z(size.px) +
109
- (totalGrow ? (z(size.grow) / totalGrow) * remainingSpace : 0);
109
+ const advance = itemSizes[i];
110
110
 
111
111
  if (reverse) {
112
112
  x -= advance;
@@ -139,7 +139,8 @@ export function mapToPixelCoords(
139
139
  export function getMinimumSize(items, { spacing } = { spacing: 0 }) {
140
140
  let minimumSize = 0;
141
141
  for (const size of items) {
142
- minimumSize += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
142
+ minimumSize +=
143
+ getSizeDefMinPx(size) + (isZeroSizeDef(size) ? 0 : spacing);
143
144
  }
144
145
  return Math.max(0, minimumSize - spacing);
145
146
  }
@@ -151,12 +152,29 @@ export function getMinimumSize(items, { spacing } = { spacing: 0 }) {
151
152
  export function getLargestSize(items) {
152
153
  let px = 0;
153
154
  let grow = 0;
155
+ let minPx = 0;
156
+ let maxPx = undefined;
157
+ let hasMaxPx = true;
154
158
  for (const s of items) {
155
159
  px = Math.max(px, s.px ?? 0);
156
160
  grow = Math.max(grow, s.grow ?? 0);
161
+ minPx = Math.max(minPx, getSizeDefMinPx(s));
162
+
163
+ const sizeMaxPx = getSizeDefMaxPx(s);
164
+ if (sizeMaxPx === undefined) {
165
+ hasMaxPx = false;
166
+ } else {
167
+ maxPx =
168
+ maxPx === undefined ? sizeMaxPx : Math.max(maxPx, sizeMaxPx);
169
+ }
157
170
  }
158
171
 
159
- return { px, grow };
172
+ return createSizeDef({
173
+ px,
174
+ grow,
175
+ minPx,
176
+ maxPx: hasMaxPx ? maxPx : undefined,
177
+ });
160
178
  }
161
179
 
162
180
  /**
@@ -172,12 +190,24 @@ export function isStretching(items) {
172
190
  * @param {SizeDef[]} sizeDefs
173
191
  */
174
192
  export function sumSizeDefs(sizeDefs) {
175
- const sum = { px: 0, grow: 0 };
193
+ const sum = { px: 0, grow: 0, minPx: 0, maxPx: 0 };
194
+ let hasMaxPx = true;
176
195
  for (const size of sizeDefs) {
177
196
  sum.px += z(size.px);
178
197
  sum.grow += z(size.grow);
198
+ sum.minPx += getSizeDefMinPx(size);
199
+
200
+ const sizeMaxPx = getSizeDefMaxPx(size);
201
+ if (sizeMaxPx === undefined) {
202
+ hasMaxPx = false;
203
+ } else {
204
+ sum.maxPx += sizeMaxPx;
205
+ }
179
206
  }
180
- return sum;
207
+ if (!hasMaxPx) {
208
+ delete sum.maxPx;
209
+ }
210
+ return createSizeDef(sum);
181
211
  }
182
212
 
183
213
  export class FlexDimensions {
@@ -218,14 +248,8 @@ export class FlexDimensions {
218
248
  */
219
249
  #addPx(width, height) {
220
250
  return new FlexDimensions(
221
- {
222
- px: (this.width.px ?? 0) + width,
223
- grow: this.width.grow,
224
- },
225
- {
226
- px: (this.height.px ?? 0) + height,
227
- grow: this.height.grow,
228
- }
251
+ addPxToSizeDef(this.width, width),
252
+ addPxToSizeDef(this.height, height)
229
253
  );
230
254
  }
231
255
 
@@ -260,7 +284,7 @@ export const ZERO_FLEXDIMENSIONS = new FlexDimensions(
260
284
  * @param {SizeDef} sizeDef
261
285
  */
262
286
  export function isZeroSizeDef(sizeDef) {
263
- return !sizeDef.px && !sizeDef.grow;
287
+ return !sizeDef.px && !sizeDef.grow && !sizeDef.minPx;
264
288
  }
265
289
 
266
290
  /**
@@ -278,7 +302,13 @@ function z(value) {
278
302
  * @returns {spec is SizeDef}
279
303
  */
280
304
  export function isSizeDef(spec) {
281
- return spec && (isNumber(spec.px) || isNumber(spec.grow));
305
+ return (
306
+ spec &&
307
+ (isNumber(spec.px) ||
308
+ isNumber(spec.grow) ||
309
+ isNumber(spec.minPx) ||
310
+ isNumber(spec.maxPx))
311
+ );
282
312
  }
283
313
 
284
314
  /**
@@ -290,7 +320,8 @@ export function parseSizeDef(size) {
290
320
  if (isStepSize(size)) {
291
321
  throw new Error("parseSizeDef does not accept step-based sizes.");
292
322
  } else if (isSizeDef(size)) {
293
- return size;
323
+ validateSizeDef(size);
324
+ return createSizeDef(size);
294
325
  } else if (isNumber(size)) {
295
326
  return { px: size, grow: 0 };
296
327
  } else if (size === "container") {
@@ -302,3 +333,272 @@ export function parseSizeDef(size) {
302
333
 
303
334
  throw new Error(`Invalid sizeDef: ${size}`);
304
335
  }
336
+
337
+ /**
338
+ * Resolves final item sizes using GenomeSpy's simplified flex model. It is
339
+ * inspired by CSS Flexbox §9.7 "Resolving Flexible Lengths", but only covers
340
+ * grow-based free-space distribution and min/max constraints.
341
+ *
342
+ * https://www.w3.org/TR/css-flexbox-1/#resolve-flexible-lengths
343
+ *
344
+ * @param {SizeDef[]} items
345
+ * @param {number} containerSize
346
+ * @param {number} spacing
347
+ * @returns {number[]}
348
+ */
349
+ function resolveItemSizes(items, containerSize, spacing) {
350
+ let hasConstraints = false;
351
+ for (const item of items) {
352
+ validateSizeDef(item);
353
+ hasConstraints ||= hasSizeConstraints(item);
354
+ }
355
+
356
+ if (!hasConstraints) {
357
+ return resolveUnconstrainedItemSizes(items, containerSize, spacing);
358
+ }
359
+
360
+ /** @type {number[]} */
361
+ const sizes = Array(items.length).fill(0);
362
+ /** @type {number[]} */
363
+ const flexIndices = [];
364
+ for (let i = 0; i < items.length; i++) {
365
+ if (!isZeroSizeDef(items[i])) {
366
+ flexIndices.push(i);
367
+ }
368
+ }
369
+
370
+ const gapSize = Math.max(0, flexIndices.length - 1) * spacing;
371
+ const availableSize = Math.max(0, containerSize - gapSize);
372
+
373
+ // Fixed-size items do not participate in flex growth, but min/max still
374
+ // clamp them just like flex items with flex-grow: 0.
375
+ /** @type {Set<number>} */
376
+ const frozen = new Set();
377
+
378
+ for (const index of flexIndices) {
379
+ const item = items[index];
380
+ if (!z(item.grow)) {
381
+ sizes[index] = clampSize(z(item.px), item);
382
+ frozen.add(index);
383
+ }
384
+ }
385
+
386
+ while (true) {
387
+ let totalBase = 0;
388
+ let totalGrow = 0;
389
+ let frozenSize = 0;
390
+
391
+ // Frozen items have their final size. Unfrozen items still contribute
392
+ // their base px size and grow factor to the next free-space pass.
393
+ for (const index of flexIndices) {
394
+ if (frozen.has(index)) {
395
+ frozenSize += sizes[index];
396
+ } else {
397
+ totalBase += z(items[index].px);
398
+ totalGrow += z(items[index].grow);
399
+ }
400
+ }
401
+
402
+ if (!totalGrow) {
403
+ for (const index of flexIndices) {
404
+ if (!frozen.has(index)) {
405
+ sizes[index] = clampSize(z(items[index].px), items[index]);
406
+ frozen.add(index);
407
+ }
408
+ }
409
+ break;
410
+ }
411
+
412
+ const remainingSize = Math.max(
413
+ 0,
414
+ availableSize - frozenSize - totalBase
415
+ );
416
+ let totalViolation = 0;
417
+ /** @type {number[]} */
418
+ const minViolations = [];
419
+ /** @type {number[]} */
420
+ const maxViolations = [];
421
+
422
+ // CSS Flexbox §9.7 first clamps every unfrozen item, then uses the
423
+ // aggregate violation to decide which side freezes. We follow that
424
+ // part so mixed min/max violations converge the same way.
425
+ for (const index of flexIndices) {
426
+ if (frozen.has(index)) {
427
+ continue;
428
+ }
429
+
430
+ const item = items[index];
431
+ const targetSize =
432
+ z(item.px) + (z(item.grow) / totalGrow) * remainingSize;
433
+ const clampedSize = clampSize(targetSize, item);
434
+ sizes[index] = clampedSize;
435
+
436
+ const violation = clampedSize - targetSize;
437
+ totalViolation += violation;
438
+ if (violation > 0) {
439
+ minViolations.push(index);
440
+ } else if (violation < 0) {
441
+ maxViolations.push(index);
442
+ }
443
+ }
444
+
445
+ if (!minViolations.length && !maxViolations.length) {
446
+ break;
447
+ } else if (totalViolation > 0) {
448
+ for (const index of minViolations) {
449
+ frozen.add(index);
450
+ }
451
+ } else if (totalViolation < 0) {
452
+ for (const index of maxViolations) {
453
+ frozen.add(index);
454
+ }
455
+ } else {
456
+ for (const index of flexIndices) {
457
+ frozen.add(index);
458
+ }
459
+ }
460
+ }
461
+
462
+ return sizes;
463
+ }
464
+
465
+ /**
466
+ * Fast path for the common SizeDef shape that only uses px and grow.
467
+ *
468
+ * @param {SizeDef[]} items
469
+ * @param {number} containerSize
470
+ * @param {number} spacing
471
+ * @returns {number[]}
472
+ */
473
+ function resolveUnconstrainedItemSizes(items, containerSize, spacing) {
474
+ let totalPx = 0;
475
+ let totalGrow = 0;
476
+
477
+ for (const size of items) {
478
+ totalPx += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
479
+ totalGrow += z(size.grow);
480
+ }
481
+ totalPx -= spacing;
482
+
483
+ const remainingSpace = Math.max(0, containerSize - totalPx);
484
+
485
+ /** @type {number[]} */
486
+ const sizes = Array(items.length);
487
+ for (let i = 0; i < items.length; i++) {
488
+ const size = items[i];
489
+ sizes[i] = isZeroSizeDef(size)
490
+ ? 0
491
+ : z(size.px) +
492
+ (totalGrow ? (z(size.grow) / totalGrow) * remainingSpace : 0);
493
+ }
494
+
495
+ return sizes;
496
+ }
497
+
498
+ /**
499
+ * @param {SizeDef} size
500
+ */
501
+ function validateSizeDef(size) {
502
+ if (
503
+ size.minPx !== undefined &&
504
+ size.maxPx !== undefined &&
505
+ size.minPx > size.maxPx
506
+ ) {
507
+ throw new Error("SizeDef minPx cannot be greater than maxPx.");
508
+ }
509
+ }
510
+
511
+ /**
512
+ * @param {number} size
513
+ * @param {SizeDef} sizeDef
514
+ */
515
+ function clampSize(size, sizeDef) {
516
+ return Math.min(
517
+ Math.max(size, sizeDef.minPx ?? 0),
518
+ sizeDef.maxPx ?? Infinity
519
+ );
520
+ }
521
+
522
+ /**
523
+ * @param {SizeDef} sizeDef
524
+ */
525
+ export function getSizeDefMinPx(sizeDef) {
526
+ return clampSize(z(sizeDef.px), sizeDef);
527
+ }
528
+
529
+ /**
530
+ * @param {SizeDef} sizeDef
531
+ * @returns {number | undefined}
532
+ */
533
+ export function getSizeDefMaxPx(sizeDef) {
534
+ return (
535
+ sizeDef.maxPx ??
536
+ (z(sizeDef.grow) ? undefined : getSizeDefMinPx(sizeDef))
537
+ );
538
+ }
539
+
540
+ /**
541
+ * @param {SizeDef} sizeDef
542
+ */
543
+ function hasSizeConstraints(sizeDef) {
544
+ return sizeDef.minPx !== undefined || sizeDef.maxPx !== undefined;
545
+ }
546
+
547
+ /**
548
+ * @param {SizeDef} sizeDef
549
+ * @param {number} px
550
+ * @returns {SizeDef}
551
+ */
552
+ function addPxToSizeDef(sizeDef, px) {
553
+ return createSizeDef({
554
+ px: (sizeDef.px ?? 0) + px,
555
+ grow: sizeDef.grow,
556
+ minPx:
557
+ sizeDef.minPx === undefined
558
+ ? undefined
559
+ : Math.max(0, sizeDef.minPx + px),
560
+ maxPx:
561
+ sizeDef.maxPx === undefined
562
+ ? undefined
563
+ : Math.max(0, sizeDef.maxPx + px),
564
+ });
565
+ }
566
+
567
+ /**
568
+ * @param {SizeDef} sizeDef
569
+ * @returns {SizeDef}
570
+ */
571
+ function createSizeDef(sizeDef) {
572
+ /** @type {SizeDef} */
573
+ const result = {};
574
+ const hasPx = sizeDef.px !== undefined;
575
+ const hasGrow = sizeDef.grow !== undefined;
576
+ const hasConstraints = hasSizeConstraints(sizeDef);
577
+
578
+ if (sizeDef.px) {
579
+ result.px = sizeDef.px;
580
+ } else if (sizeDef.px === 0) {
581
+ result.px = 0;
582
+ }
583
+
584
+ if (sizeDef.grow) {
585
+ result.grow = sizeDef.grow;
586
+ } else if (sizeDef.grow === 0) {
587
+ result.grow = 0;
588
+ } else if (!hasPx && !hasGrow && hasConstraints) {
589
+ result.grow = 1;
590
+ }
591
+
592
+ if (sizeDef.minPx && sizeDef.minPx > z(sizeDef.px)) {
593
+ result.minPx = sizeDef.minPx;
594
+ }
595
+
596
+ if (
597
+ sizeDef.maxPx !== undefined &&
598
+ (z(result.grow) || sizeDef.maxPx < z(sizeDef.px))
599
+ ) {
600
+ result.maxPx = sizeDef.maxPx;
601
+ }
602
+
603
+ return result;
604
+ }
@@ -95,6 +95,20 @@ export default class Rectangle {
95
95
  * @param {Rectangle} rectangle
96
96
  */
97
97
  intersect(rectangle: Rectangle): Rectangle;
98
+ /**
99
+ * Returns an intersection of this and the other's x range. The y range is
100
+ * preserved.
101
+ *
102
+ * @param {Rectangle} rectangle
103
+ */
104
+ intersectX(rectangle: Rectangle): Rectangle;
105
+ /**
106
+ * Returns an intersection of this and the other's y range. The x range is
107
+ * preserved.
108
+ *
109
+ * @param {Rectangle} rectangle
110
+ */
111
+ intersectY(rectangle: Rectangle): Rectangle;
98
112
  /**
99
113
  * Returns an union of this and the other rectangle.
100
114
  *
@@ -1 +1 @@
1
- {"version":3,"file":"rectangle.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/rectangle.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH;IACI;;;;;;OAMG;IACH,iBALW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,aAShB;IAED,uBAA2C;IA+B3C;;;;;;OAMG;IACH,eALW,QAAQ,KACR,QAAQ,SACR,QAAQ,UACR,QAAQ,EAOlB;IAzCD;;;;OAIG;IACH,cAJW,IAAI,SACJ,MAAM,IAAG,MAAW,MAAM,CAAA,GACxB,QAAQ,CAiBpB;IAED;;OAEG;IACH,mBAFW,IAAI,YAId;IAUG,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,0BAAmB;IACpC,gBAAgB,CAAC,2BAAqB;IAG1C;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,aAFa,MAAM,CAIlB;IAED;;OAEG;IACH,cAFa,MAAM,CAIlB;IAED,iBAEC;IAED,iBAEC;IAED;;;;OAIG;IACH,kBAFW,SAAS,WAcnB;IAED;;;OAGG;IACH,cAFW,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAG,MAAW,MAAM,CAAA,CAAC,CAAC,aAkB3D;IAED;;;;OAIG;IACH,aAHW,MAAM,IAAG,MAAW,MAAM,CAAA,KAC1B,MAAM,IAAG,MAAW,MAAM,CAAA,aAapC;IAED;;;;OAIG;IACH,uBAFW,SAAS,aAKnB;IAED;;;OAGG;IACH,gBAFW,OAAO,iCA0BjB;IAED;;;OAGG;IACH,gBAFW,OAAO,aAIjB;IAED;;;;OAIG;IACH,qBAFW,SAAS,aAenB;IAED;;;;OAIG;IACH,iBAFW,SAAS,aAenB;IAED;;OAEG;IACH,qBAEC;IAED;;;OAGG;IACH,qBAOC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,KACN,MAAM,WAIhB;IAED;;;;;;OAMG;IACH,kBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAWjB;IAED;;;;OAIG;IACH,oBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAUjB;IAED,mBAEC;IAED,0BAMC;CACJ;;;;;mBAnUY,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC;;;;;sBAChC,OAAO,cAAc,EAAE,OAAO;;;;;uBAC9B,MAAM,MAAM"}
1
+ {"version":3,"file":"rectangle.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/rectangle.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH;IACI;;;;;;OAMG;IACH,iBALW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,aAShB;IAED,uBAA2C;IA+B3C;;;;;;OAMG;IACH,eALW,QAAQ,KACR,QAAQ,SACR,QAAQ,UACR,QAAQ,EAOlB;IAzCD;;;;OAIG;IACH,cAJW,IAAI,SACJ,MAAM,IAAG,MAAW,MAAM,CAAA,GACxB,QAAQ,CAiBpB;IAED;;OAEG;IACH,mBAFW,IAAI,YAId;IAUG,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,0BAAmB;IACpC,gBAAgB,CAAC,2BAAqB;IAG1C;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,aAFa,MAAM,CAIlB;IAED;;OAEG;IACH,cAFa,MAAM,CAIlB;IAED,iBAEC;IAED,iBAEC;IAED;;;;OAIG;IACH,kBAFW,SAAS,WAcnB;IAED;;;OAGG;IACH,cAFW,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAG,MAAW,MAAM,CAAA,CAAC,CAAC,aAkB3D;IAED;;;;OAIG;IACH,aAHW,MAAM,IAAG,MAAW,MAAM,CAAA,KAC1B,MAAM,IAAG,MAAW,MAAM,CAAA,aAapC;IAED;;;;OAIG;IACH,uBAFW,SAAS,aAKnB;IAED;;;OAGG;IACH,gBAFW,OAAO,iCA0BjB;IAED;;;OAGG;IACH,gBAFW,OAAO,aAIjB;IAED;;;;OAIG;IACH,qBAFW,SAAS,aAenB;IAED;;;;;OAKG;IACH,sBAFW,SAAS,aAcnB;IAED;;;;;OAKG;IACH,sBAFW,SAAS,aAcnB;IAED;;;;OAIG;IACH,iBAFW,SAAS,aAenB;IAED;;OAEG;IACH,qBAEC;IAED;;;OAGG;IACH,qBAOC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,KACN,MAAM,WAIhB;IAED;;;;;;OAMG;IACH,kBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAWjB;IAED;;;;OAIG;IACH,oBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAUjB;IAED,mBAEC;IAED,0BAMC;CACJ;;;;;mBA3WY,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC;;;;;sBAChC,OAAO,cAAc,EAAE,OAAO;;;;;uBAC9B,MAAM,MAAM"}
@@ -239,6 +239,46 @@ export default class Rectangle {
239
239
  );
240
240
  }
241
241
 
242
+ /**
243
+ * Returns an intersection of this and the other's x range. The y range is
244
+ * preserved.
245
+ *
246
+ * @param {Rectangle} rectangle
247
+ */
248
+ intersectX(rectangle) {
249
+ if (this === rectangle || rectangle == null) {
250
+ return this;
251
+ }
252
+
253
+ return new Rectangle(
254
+ () => Math.max(this.x, rectangle.x),
255
+ this._passThrough("y"),
256
+ () =>
257
+ Math.min(this.x2, rectangle.x2) - Math.max(this.x, rectangle.x),
258
+ this._passThrough("height")
259
+ );
260
+ }
261
+
262
+ /**
263
+ * Returns an intersection of this and the other's y range. The x range is
264
+ * preserved.
265
+ *
266
+ * @param {Rectangle} rectangle
267
+ */
268
+ intersectY(rectangle) {
269
+ if (this === rectangle || rectangle == null) {
270
+ return this;
271
+ }
272
+
273
+ return new Rectangle(
274
+ this._passThrough("x"),
275
+ () => Math.max(this.y, rectangle.y),
276
+ this._passThrough("width"),
277
+ () =>
278
+ Math.min(this.y2, rectangle.y2) - Math.max(this.y, rectangle.y)
279
+ );
280
+ }
281
+
242
282
  /**
243
283
  * Returns an union of this and the other rectangle.
244
284
  *
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @typedef {object} LegendEntry
3
+ * @prop {string | number | boolean} value
4
+ * @prop {string} label
5
+ * @prop {number} _legendIndex
6
+ */
7
+ /**
8
+ * Creates symbol legend entries from a discrete scale resolution.
9
+ *
10
+ * @param {Pick<import("../../scales/scaleResolution.js").default, "getDomain">} resolution
11
+ * @param {(value: import("../../spec/channel.js").Scalar) => string} [format]
12
+ * @returns {LegendEntry[]}
13
+ */
14
+ export function createDiscreteLegendEntries(resolution: Pick<import("../../scales/scaleResolution.js").default, "getDomain">, format?: (value: import("../../spec/channel.js").Scalar) => string): LegendEntry[];
15
+ export type LegendEntry = {
16
+ value: string | number | boolean;
17
+ label: string;
18
+ _legendIndex: number;
19
+ };
20
+ //# sourceMappingURL=legendEntries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legendEntries.d.ts","sourceRoot":"","sources":["../../../../src/view/legend/legendEntries.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,wDAJW,IAAI,CAAC,OAAO,iCAAiC,EAAE,OAAO,EAAE,WAAW,CAAC,WACpE,CAAC,KAAK,EAAE,OAAO,uBAAuB,EAAE,MAAM,KAAK,MAAM,GACvD,WAAW,EAAE,CAQzB;;WAlBS,MAAM,GAAG,MAAM,GAAG,OAAO;WACzB,MAAM;kBACN,MAAM"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @typedef {object} LegendEntry
3
+ * @prop {string | number | boolean} value
4
+ * @prop {string} label
5
+ * @prop {number} _legendIndex
6
+ */
7
+
8
+ /**
9
+ * Creates symbol legend entries from a discrete scale resolution.
10
+ *
11
+ * @param {Pick<import("../../scales/scaleResolution.js").default, "getDomain">} resolution
12
+ * @param {(value: import("../../spec/channel.js").Scalar) => string} [format]
13
+ * @returns {LegendEntry[]}
14
+ */
15
+ export function createDiscreteLegendEntries(resolution, format = String) {
16
+ return resolution.getDomain().map((value, index) => ({
17
+ value,
18
+ label: format(value),
19
+ _legendIndex: index,
20
+ }));
21
+ }