@fundar/data-chart-telling 1.0.0 → 1.2.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 (560) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +58 -19
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +172 -95
  5. package/dist/configuration/themes/index.d.ts +5 -1304
  6. package/dist/index.d.ts +24 -14
  7. package/dist/index.js +20 -10
  8. package/dist/layout/base/BasePlotLayout.svelte +129 -51
  9. package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
  10. package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
  11. package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
  12. package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
  13. package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
  14. package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
  15. package/dist/layout/coordinates/ZoomedProjection.js +24 -0
  16. package/dist/layout/coordinates/camera.svelte.js +11 -8
  17. package/dist/layout/coordinates/projections/argentina.js +1 -1
  18. package/dist/layout/coordinates/projections/fit.d.ts +1 -1
  19. package/dist/layout/coordinates/projections/fit.js +1 -1
  20. package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
  21. package/dist/layout/coordinates/zoom.svelte.js +4 -5
  22. package/dist/layout/facet/FacetLayout.svelte +1 -1
  23. package/dist/layout/facet/config.js +1 -1
  24. package/dist/layout/figure/Figure.svelte +2 -0
  25. package/dist/layout/geometry/GeometryLayout.svelte +14 -9
  26. package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
  27. package/dist/layout/geometry/MarkerOffset.svelte +28 -0
  28. package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
  29. package/dist/layout/grid/GridCell.svelte +6 -8
  30. package/dist/layout/hover/HoverSettings.d.ts +20 -6
  31. package/dist/layout/hover/HoverSettings.js +29 -4
  32. package/dist/layout/legend/ContinuousSection.svelte +44 -9
  33. package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
  34. package/dist/layout/legend/DiscreteSection.svelte +2 -2
  35. package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
  36. package/dist/layout/legend/LegendChannels.js +36 -12
  37. package/dist/layout/legend/LegendLayout.svelte +9 -1
  38. package/dist/layout/legend/LegendState.svelte.d.ts +9 -0
  39. package/dist/layout/legend/LegendState.svelte.js +24 -3
  40. package/dist/layout/legend/SizeSection.svelte +1 -1
  41. package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
  42. package/dist/layout/margins/PlotMargins.svelte.js +4 -8
  43. package/dist/layout/plot/Plot.svelte +6 -3
  44. package/dist/layout/plot/PublicPlotContext.d.ts +5 -4
  45. package/dist/layout/plot/PublicPlotContext.js +7 -3
  46. package/dist/layout/plot/Slice.d.ts +5 -1
  47. package/dist/layout/plot/Slice.js +18 -6
  48. package/dist/layout/scales/EdgeTicks.d.ts +39 -0
  49. package/dist/layout/scales/EdgeTicks.js +82 -0
  50. package/dist/layout/scales/NiceTicks.d.ts +43 -0
  51. package/dist/layout/scales/NiceTicks.js +76 -0
  52. package/dist/layout/scales/ScalesLayout.svelte +133 -34
  53. package/dist/layout/scales/ScalesLayout.svelte.d.ts +10 -0
  54. package/dist/layout/scales/SveltePlotScale.d.ts +15 -0
  55. package/dist/layout/scales/SveltePlotScale.js +86 -0
  56. package/dist/layout/scales/TickLabels.d.ts +32 -0
  57. package/dist/layout/scales/TickLabels.js +55 -0
  58. package/dist/layout/styles/StylesLayout.svelte +2 -2
  59. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  60. package/dist/layout/styles/ValueLabels.js +83 -23
  61. package/dist/layout/timeline/Timeline.svelte +5 -2
  62. package/dist/layout/timeline/Timeline.svelte.d.ts +2 -0
  63. package/dist/layout/timeline/TimelineLayout.svelte +39 -13
  64. package/dist/layout/timeline/TimelineLayout.svelte.d.ts +7 -5
  65. package/dist/layout/timeline/TimelineRule.svelte +1 -0
  66. package/dist/layout/timeline/TimelineState.svelte.d.ts +13 -5
  67. package/dist/layout/timeline/TimelineState.svelte.js +42 -8
  68. package/dist/layout/timeline/TimelineTime.d.ts +18 -0
  69. package/dist/layout/timeline/TimelineTime.js +117 -0
  70. package/dist/layout/tooltip/Tooltip.svelte +10 -7
  71. package/dist/layout/tooltip/Tooltip.svelte.d.ts +6 -4
  72. package/dist/layout/tooltip/TooltipState.svelte.d.ts +8 -2
  73. package/dist/layout/tooltip/TooltipState.svelte.js +23 -4
  74. package/dist/markers/MarkerKinds.d.ts +5 -0
  75. package/dist/markers/MarkerKinds.js +1 -0
  76. package/dist/markers/area/AreaMarker.svelte +15 -63
  77. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  78. package/dist/markers/bar/BarMarker.svelte +8 -4
  79. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  80. package/dist/markers/box/BoxMarker.svelte +40 -9
  81. package/dist/markers/delta/Delta.js +1 -1
  82. package/dist/markers/delta/DeltaMarker.svelte +9 -7
  83. package/dist/markers/dot/DotMarker.svelte +24 -27
  84. package/dist/markers/image/ImageMarker.svelte +17 -12
  85. package/dist/markers/inset/InsetMarker.svelte +2 -2
  86. package/dist/markers/line/LineMarker.svelte +1 -0
  87. package/dist/markers/link/LinkMarker.svelte +174 -29
  88. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  89. package/dist/markers/rule/RuleMarker.svelte +9 -3
  90. package/dist/markers/text/Declutter.d.ts +4 -0
  91. package/dist/markers/text/Declutter.js +26 -11
  92. package/dist/markers/text/TextMarker.svelte +91 -48
  93. package/dist/markers/tick/TickMarker.svelte +27 -25
  94. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  95. package/dist/markers/utils/MarkerChannels.js +42 -7
  96. package/dist/markers/utils/RowOffset.d.ts +23 -0
  97. package/dist/markers/utils/RowOffset.js +23 -0
  98. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  99. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  100. package/dist/markers/utils/RowStroke.d.ts +31 -0
  101. package/dist/markers/utils/RowStroke.js +28 -0
  102. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  103. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  104. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  105. package/dist/markers/violin/ViolinProfiles.js +55 -0
  106. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  107. package/dist/phases/Pipeline.d.ts +5 -0
  108. package/dist/phases/Pipeline.js +8 -2
  109. package/dist/phases/data/DataPhase.d.ts +5 -11
  110. package/dist/phases/data/DataPhase.js +14 -11
  111. package/dist/phases/data/PlotAxes.d.ts +10 -0
  112. package/dist/phases/data/PlotAxes.js +14 -1
  113. package/dist/phases/facet/FacetPanels.d.ts +55 -0
  114. package/dist/phases/facet/FacetPanels.js +96 -0
  115. package/dist/phases/facet/FacetPhase.d.ts +1 -42
  116. package/dist/phases/facet/FacetPhase.js +1 -87
  117. package/dist/phases/hover/HoverPhase.d.ts +6 -43
  118. package/dist/phases/hover/HoverPhase.js +19 -54
  119. package/dist/phases/mapping/MappingPhase.d.ts +1 -1
  120. package/dist/phases/mapping/MappingPhase.js +3 -5
  121. package/dist/phases/markers/MarkersPhase.js +2 -1
  122. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  123. package/dist/phases/scales/CategoryOrder.js +73 -0
  124. package/dist/phases/scales/ScalesPhase.d.ts +1 -3
  125. package/dist/phases/scales/ScalesPhase.js +37 -27
  126. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +6 -2
  127. package/dist/phases/sharedScales/SharedScalesPhase.js +14 -8
  128. package/dist/phases/statistics/Statistics.d.ts +10 -6
  129. package/dist/phases/statistics/Statistics.js +20 -10
  130. package/dist/phases/statistics/StatisticsPhase.js +10 -6
  131. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  132. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  133. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  134. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  135. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  136. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  137. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  138. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  139. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  140. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  141. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  142. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  143. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  144. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  145. package/dist/phases/tooltip/TooltipPhase.d.ts +4 -2
  146. package/dist/phases/tooltip/TooltipPhase.js +10 -3
  147. package/dist/phases/transforms/ProcessedPositions.d.ts +30 -0
  148. package/dist/phases/transforms/ProcessedPositions.js +74 -0
  149. package/dist/phases/transforms/TransformsPhase.d.ts +5 -42
  150. package/dist/phases/transforms/TransformsPhase.js +67 -58
  151. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  152. package/dist/phases/transforms/ValueSelection.js +53 -0
  153. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  154. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  155. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  156. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  157. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  158. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +4 -3
  159. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  160. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  161. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  162. package/dist/plots/{scatter → correlation/scatter}/defaults.js +6 -5
  163. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  164. package/dist/plots/{scatter → correlation/scatter}/markers.js +5 -4
  165. package/dist/plots/distribution/box/BoxSummaries.d.ts +19 -0
  166. package/dist/plots/distribution/box/BoxSummaries.js +101 -0
  167. package/dist/plots/distribution/box/Plot.svelte +42 -0
  168. package/dist/plots/distribution/box/Plot.svelte.d.ts +26 -0
  169. package/dist/plots/distribution/box/defaults.d.ts +12 -0
  170. package/dist/plots/distribution/box/defaults.js +34 -0
  171. package/dist/plots/distribution/box/markers.d.ts +12 -0
  172. package/dist/plots/distribution/box/markers.js +34 -0
  173. package/dist/plots/distribution/density/Plot.svelte +45 -0
  174. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  175. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  176. package/dist/plots/distribution/density/defaults.js +29 -0
  177. package/dist/plots/distribution/density/markers.d.ts +9 -0
  178. package/dist/plots/distribution/density/markers.js +42 -0
  179. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  180. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  181. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  182. package/dist/plots/{histogram → distribution/histogram}/defaults.js +4 -4
  183. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  184. package/dist/plots/{histogram → distribution/histogram}/markers.js +7 -7
  185. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  186. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  187. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  188. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +7 -6
  189. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  190. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +8 -11
  191. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  192. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  193. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  194. package/dist/plots/distribution/violin/defaults.js +58 -0
  195. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  196. package/dist/plots/distribution/violin/markers.js +71 -0
  197. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  198. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  199. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  200. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  201. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  202. package/dist/plots/{area → evolution/area}/markers.js +2 -3
  203. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  204. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  205. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  206. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  207. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  208. package/dist/plots/{line → evolution/line}/markers.js +7 -6
  209. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  210. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  211. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  212. package/dist/plots/evolution/slope/defaults.js +31 -0
  213. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  214. package/dist/plots/evolution/slope/markers.js +79 -0
  215. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  216. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  217. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  218. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  219. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  220. package/dist/plots/evolution/sparkline/markers.js +56 -0
  221. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  222. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  223. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  224. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  225. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  226. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  227. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  228. package/dist/plots/map/geo/GeoSegments.js +23 -0
  229. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  230. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  231. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  232. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  233. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  234. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  235. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  236. package/dist/plots/{geo → map/geo}/phases/hover.js +5 -5
  237. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  238. package/dist/plots/{geo → map/geo}/phases/markers.js +8 -13
  239. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  240. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  241. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  242. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  243. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  244. package/dist/plots/{geo → map/geo}/slices.js +7 -4
  245. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  246. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  247. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  248. package/dist/plots/{bar → ranking/bar}/defaults.js +17 -15
  249. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  250. package/dist/plots/{bar → ranking/bar}/markers.js +11 -19
  251. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  252. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  253. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  254. package/dist/plots/ranking/bullet/defaults.js +24 -0
  255. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  256. package/dist/plots/ranking/bullet/markers.js +90 -0
  257. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  258. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  259. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  260. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  261. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  262. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  263. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  264. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  265. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  266. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  267. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  268. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  269. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  270. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  271. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  272. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  273. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  274. package/dist/plots/ranking/forest/defaults.js +20 -0
  275. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  276. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  277. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  278. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  279. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  280. package/dist/plots/utils/RowNumbers.js +24 -0
  281. package/dist/plots/utils/gaps.js +1 -1
  282. package/dist/plots/utils/segments.js +1 -1
  283. package/dist/types/configuration/styling.d.ts +287 -132
  284. package/dist/types/layout/composer.d.ts +5 -2
  285. package/dist/types/layout/coordinates.d.ts +5 -4
  286. package/dist/types/layout/legend.d.ts +21 -5
  287. package/dist/types/layout/plot.d.ts +44 -1
  288. package/dist/types/layout/scales.d.ts +51 -3
  289. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  290. package/dist/types/layout/statistics/index.d.ts +7 -2
  291. package/dist/types/layout/styles/base.d.ts +18 -0
  292. package/dist/types/layout/styles/bullet.d.ts +25 -0
  293. package/dist/types/layout/styles/connector.d.ts +98 -0
  294. package/dist/types/layout/styles/curve.d.ts +11 -0
  295. package/dist/types/layout/styles/frame.d.ts +17 -0
  296. package/dist/types/layout/styles/gaps.d.ts +12 -0
  297. package/dist/types/layout/styles/geo.d.ts +55 -0
  298. package/dist/types/layout/styles/index.d.ts +8 -0
  299. package/dist/types/layout/styles/index.js +8 -0
  300. package/dist/types/layout/styles/values.d.ts +47 -0
  301. package/dist/types/layout/timeline.d.ts +19 -7
  302. package/dist/types/layout/tooltip.d.ts +6 -2
  303. package/dist/types/markers/axis/area.d.ts +2 -2
  304. package/dist/types/markers/axis/arrow.d.ts +3 -0
  305. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  306. package/dist/types/markers/axis/bar.d.ts +1 -1
  307. package/dist/types/markers/axis/box.d.ts +5 -0
  308. package/dist/types/markers/axis/difference.d.ts +2 -2
  309. package/dist/types/markers/axis/image.d.ts +3 -2
  310. package/dist/types/markers/axis/line.d.ts +2 -0
  311. package/dist/types/markers/axis/rule.d.ts +9 -0
  312. package/dist/types/markers/axis/trail.d.ts +2 -3
  313. package/dist/types/markers/axis/violin.d.ts +25 -0
  314. package/dist/types/markers/basic/dot.d.ts +3 -2
  315. package/dist/types/markers/basic/text.d.ts +13 -3
  316. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  317. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  318. package/dist/types/markers/common.d.ts +1 -1
  319. package/dist/types/markers/common.js +1 -0
  320. package/dist/types/markers/geo/link.d.ts +5 -1
  321. package/dist/types/phases/hover/phase.d.ts +6 -0
  322. package/dist/types/phases/index.d.ts +1 -1
  323. package/dist/types/phases/scales/phase.d.ts +5 -1
  324. package/dist/types/phases/state.d.ts +20 -4
  325. package/dist/types/phases/statistics/phase.d.ts +3 -1
  326. package/dist/types/phases/statistics/source.d.ts +3 -1
  327. package/dist/types/phases/transforms/phase.d.ts +32 -0
  328. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  329. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  330. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  331. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  332. package/dist/types/plots/distribution/box/props.d.ts +10 -0
  333. package/dist/types/plots/distribution/box/state.d.ts +23 -0
  334. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  335. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  336. package/dist/types/plots/distribution/density/state.js +1 -0
  337. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  338. package/dist/types/plots/distribution/histogram/props.js +1 -0
  339. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  340. package/dist/types/plots/distribution/histogram/state.js +1 -0
  341. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  342. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  343. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  344. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  345. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  346. package/dist/types/plots/distribution/violin/props.js +1 -0
  347. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  348. package/dist/types/plots/distribution/violin/state.js +1 -0
  349. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  350. package/dist/types/plots/evolution/area/props.js +1 -0
  351. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  352. package/dist/types/plots/evolution/area/state.js +1 -0
  353. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  354. package/dist/types/plots/evolution/line/props.js +1 -0
  355. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  356. package/dist/types/plots/evolution/line/state.js +1 -0
  357. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  358. package/dist/types/plots/evolution/slope/props.js +1 -0
  359. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  360. package/dist/types/plots/evolution/slope/state.js +1 -0
  361. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  362. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  363. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  364. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  365. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  366. package/dist/types/plots/map/geo/props.js +1 -0
  367. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  368. package/dist/types/plots/map/geo/state.js +1 -0
  369. package/dist/types/plots/props.d.ts +3 -1
  370. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  371. package/dist/types/plots/ranking/bar/props.js +1 -0
  372. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  373. package/dist/types/plots/ranking/bar/state.js +1 -0
  374. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  375. package/dist/types/plots/ranking/bullet/props.js +1 -0
  376. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  377. package/dist/types/plots/ranking/bullet/state.js +1 -0
  378. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  379. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  380. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  381. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  382. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  383. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  384. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  385. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  386. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  387. package/dist/types/plots/ranking/forest/props.js +1 -0
  388. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  389. package/dist/types/plots/ranking/forest/state.js +1 -0
  390. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  391. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  392. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  393. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  394. package/dist/types/plots/segments/common.d.ts +4 -1
  395. package/dist/utils/OpacityScale.d.ts +14 -0
  396. package/dist/utils/OpacityScale.js +43 -0
  397. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  398. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  399. package/dist/utils/SymbolScale.d.ts +18 -0
  400. package/dist/utils/SymbolScale.js +29 -0
  401. package/dist/utils/color/ColorRamp.d.ts +27 -0
  402. package/dist/utils/color/ColorRamp.js +120 -0
  403. package/dist/utils/color/CssColor.d.ts +19 -0
  404. package/dist/utils/color/CssColor.js +114 -0
  405. package/dist/utils/color/Palette.d.ts +21 -0
  406. package/dist/utils/color/Palette.js +52 -0
  407. package/dist/utils/color/index.d.ts +11 -3
  408. package/dist/utils/color/index.js +14 -3
  409. package/dist/utils/grouping.js +1 -1
  410. package/docs/architecture.md +1 -1
  411. package/docs/chrome.md +39 -8
  412. package/docs/composer.md +19 -3
  413. package/docs/concepts.md +1 -1
  414. package/docs/development.md +14 -5
  415. package/docs/facets.md +62 -8
  416. package/docs/getting-started.md +8 -9
  417. package/docs/legend.md +73 -24
  418. package/docs/markers.md +45 -32
  419. package/docs/plots/correlation/heatmap.md +26 -0
  420. package/docs/plots/correlation/scatter.md +35 -0
  421. package/docs/plots/distribution/box.md +28 -0
  422. package/docs/plots/distribution/density.md +26 -0
  423. package/docs/plots/distribution/histogram.md +33 -0
  424. package/docs/plots/distribution/pyramid.md +31 -0
  425. package/docs/plots/distribution/violin.md +35 -0
  426. package/docs/plots/evolution/area.md +32 -0
  427. package/docs/plots/evolution/line.md +93 -0
  428. package/docs/plots/evolution/slope.md +39 -0
  429. package/docs/plots/evolution/sparkline.md +34 -0
  430. package/docs/plots/ranking/bar.md +59 -0
  431. package/docs/plots/ranking/bullet.md +37 -0
  432. package/docs/plots/ranking/cleveland.md +54 -0
  433. package/docs/plots/ranking/dumbbell.md +39 -0
  434. package/docs/plots/ranking/forest.md +40 -0
  435. package/docs/plots/ranking/lollipop.md +39 -0
  436. package/docs/plots.md +22 -154
  437. package/docs/scales.md +50 -27
  438. package/docs/state.md +1 -1
  439. package/docs/styles-and-segments.md +96 -39
  440. package/docs/theming.md +33 -19
  441. package/docs/timeline.md +62 -28
  442. package/docs/tooltip-and-hover.md +72 -24
  443. package/docs/transforms-and-statistics.md +56 -25
  444. package/examples/BarValues.svelte +2 -2
  445. package/examples/Box.svelte +7 -0
  446. package/examples/Bullet.svelte +17 -0
  447. package/examples/Chrome.svelte +17 -0
  448. package/examples/ChromeOrder.svelte +18 -0
  449. package/examples/Cleveland.svelte +15 -0
  450. package/examples/Composer.svelte +23 -0
  451. package/examples/CustomTooltip.svelte +21 -14
  452. package/examples/Density.svelte +7 -0
  453. package/examples/Dumbbell.svelte +16 -0
  454. package/examples/Facets.svelte +3 -3
  455. package/examples/FacetsCarousel.svelte +14 -0
  456. package/examples/FacetsRowsCols.svelte +23 -0
  457. package/examples/FirstPlot.svelte +7 -0
  458. package/examples/Forest.svelte +17 -0
  459. package/examples/Gaps.svelte +21 -0
  460. package/examples/GroupedBars.svelte +15 -0
  461. package/examples/Heatmap.svelte +7 -0
  462. package/examples/HeatmapSegments.svelte +26 -0
  463. package/examples/Histogram.svelte +14 -0
  464. package/examples/HorizontalBars.svelte +15 -0
  465. package/examples/LegendSections.svelte +27 -0
  466. package/examples/LegendToggle.svelte +3 -3
  467. package/examples/LineByRegion.svelte +18 -0
  468. package/examples/LineDates.svelte +15 -0
  469. package/examples/LineStep.svelte +16 -0
  470. package/examples/LineStepSegment.svelte +18 -0
  471. package/examples/Lollipop.svelte +17 -0
  472. package/examples/Markers.svelte +27 -0
  473. package/examples/MovingAverage.svelte +15 -0
  474. package/examples/Pyramid.svelte +14 -0
  475. package/examples/Regression.svelte +14 -0
  476. package/examples/ResponsiveLine.svelte +7 -7
  477. package/examples/Scales.svelte +26 -0
  478. package/examples/Scatter.svelte +16 -0
  479. package/examples/SegmentHighlight.svelte +22 -0
  480. package/examples/Segments.svelte +11 -3
  481. package/examples/SegmentsBySeries.svelte +25 -0
  482. package/examples/Slope.svelte +17 -0
  483. package/examples/Sparkline.svelte +14 -0
  484. package/examples/StackedArea.svelte +16 -0
  485. package/examples/StackedBars.svelte +15 -0
  486. package/examples/TimelinePlayer.svelte +8 -7
  487. package/examples/TimelineRule.svelte +19 -0
  488. package/examples/Tooltip.svelte +3 -3
  489. package/examples/ValueLabels.svelte +21 -0
  490. package/examples/Violin.svelte +14 -0
  491. package/examples/datasets/argentina-chile-trends.ts +34 -0
  492. package/examples/datasets/commodity-prices.ts +48 -0
  493. package/examples/datasets/countries-over-time.ts +368 -0
  494. package/examples/datasets/daily-temperature.ts +121 -0
  495. package/examples/datasets/earthquakes.ts +977 -0
  496. package/examples/datasets/flight-routes.ts +29 -0
  497. package/examples/datasets/height-density.ts +37 -0
  498. package/examples/datasets/heights.ts +370 -0
  499. package/examples/datasets/index.ts +24 -0
  500. package/examples/datasets/inflation-by-region.ts +44 -0
  501. package/examples/datasets/inflation-ranges.ts +34 -0
  502. package/examples/datasets/iris-flower.ts +207 -0
  503. package/examples/datasets/life-expectancy.ts +95 -0
  504. package/examples/datasets/napoleons-march.ts +182 -0
  505. package/examples/datasets/penguins.ts +54 -0
  506. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  507. package/examples/datasets/population-by-age.ts +890 -0
  508. package/examples/datasets/province-population.ts +521 -0
  509. package/examples/datasets/stock-prices.ts +63 -0
  510. package/examples/datasets/weather-stations-over-time.ts +31 -0
  511. package/examples/datasets/weather-stations.ts +22 -0
  512. package/examples/datasets/wind-vectors.ts +30 -0
  513. package/examples/datasets/world-temperature.ts +400 -0
  514. package/llms-full.txt +51 -12
  515. package/llms.txt +60 -4
  516. package/package.json +12 -2
  517. package/dist/layout/scales/buildScale.d.ts +0 -8
  518. package/dist/layout/scales/buildScale.js +0 -67
  519. package/dist/layout/scales/niceDomain.d.ts +0 -23
  520. package/dist/layout/scales/niceDomain.js +0 -59
  521. package/dist/plots/bar/defaults.d.ts +0 -9
  522. package/dist/plots/geo/features.svelte.d.ts +0 -5
  523. package/dist/plots/geo/features.svelte.js +0 -44
  524. package/dist/plots/geo/phases/tooltip.js +0 -5
  525. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  526. package/dist/plots/utils/geoAccessors.js +0 -220
  527. package/dist/plots/utils/geoSegments.d.ts +0 -29
  528. package/dist/plots/utils/geoSegments.js +0 -37
  529. package/dist/types/layout/styles.d.ts +0 -122
  530. package/dist/types/markers/axis/curveName.d.ts +0 -2
  531. package/dist/types/plots/line/props.d.ts +0 -10
  532. package/dist/utils/color/contrast.d.ts +0 -9
  533. package/dist/utils/color/contrast.js +0 -40
  534. package/dist/utils/color/cssColor.d.ts +0 -4
  535. package/dist/utils/color/cssColor.js +0 -77
  536. package/dist/utils/color/ramp.d.ts +0 -17
  537. package/dist/utils/color/ramp.js +0 -110
  538. package/dist/utils/opacity.d.ts +0 -9
  539. package/dist/utils/opacity.js +0 -38
  540. package/examples/data.ts +0 -12
  541. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  542. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  543. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  544. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  545. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  546. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  547. /package/dist/types/{plots/geo/props.js → layout/styles/gaps.js} +0 -0
  548. /package/dist/types/{plots/geo/state.js → layout/styles/geo.js} +0 -0
  549. /package/dist/types/{plots/heatmap/props.js → layout/styles/values.js} +0 -0
  550. /package/dist/types/{plots/heatmap/state.js → markers/axis/violin.js} +0 -0
  551. /package/dist/types/{plots/histogram/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  552. /package/dist/types/plots/{line → correlation/heatmap}/props.js +0 -0
  553. /package/dist/types/plots/{histogram → correlation/heatmap}/state.js +0 -0
  554. /package/dist/types/plots/{pyramid → correlation/scatter}/props.js +0 -0
  555. /package/dist/types/plots/{line → correlation/scatter}/state.js +0 -0
  556. /package/dist/types/plots/{scatter → distribution/box}/props.js +0 -0
  557. /package/dist/types/plots/{pyramid → distribution/box}/state.js +0 -0
  558. /package/dist/types/plots/{scatter/state.js → distribution/density/props.js} +0 -0
  559. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  560. /package/dist/{plots/utils → utils}/accessors.js +0 -0
package/dist/index.d.ts CHANGED
@@ -1,11 +1,21 @@
1
- export { default as AreaPlot } from './plots/area/Plot.svelte';
2
- export { default as BarPlot } from './plots/bar/Plot.svelte';
3
- export { default as HistogramPlot } from './plots/histogram/Plot.svelte';
4
- export { default as HeatmapPlot } from './plots/heatmap/Plot.svelte';
5
- export { default as LinePlot } from './plots/line/Plot.svelte';
6
- export { default as PyramidPlot } from './plots/pyramid/Plot.svelte';
7
- export { default as ScatterPlot } from './plots/scatter/Plot.svelte';
8
- export { default as GeoPlot } from './plots/geo/Plot.svelte';
1
+ export { default as AreaPlot } from './plots/evolution/area/Plot.svelte';
2
+ export { default as BarPlot } from './plots/ranking/bar/Plot.svelte';
3
+ export { default as BoxPlot } from './plots/distribution/box/Plot.svelte';
4
+ export { default as BulletPlot } from './plots/ranking/bullet/Plot.svelte';
5
+ export { default as ClevelandPlot } from './plots/ranking/cleveland/Plot.svelte';
6
+ export { default as DensityPlot } from './plots/distribution/density/Plot.svelte';
7
+ export { default as DumbbellPlot } from './plots/ranking/dumbbell/Plot.svelte';
8
+ export { default as ForestPlot } from './plots/ranking/forest/Plot.svelte';
9
+ export { default as GeoPlot } from './plots/map/geo/Plot.svelte';
10
+ export { default as HeatmapPlot } from './plots/correlation/heatmap/Plot.svelte';
11
+ export { default as HistogramPlot } from './plots/distribution/histogram/Plot.svelte';
12
+ export { default as LinePlot } from './plots/evolution/line/Plot.svelte';
13
+ export { default as LollipopPlot } from './plots/ranking/lollipop/Plot.svelte';
14
+ export { default as PyramidPlot } from './plots/distribution/pyramid/Plot.svelte';
15
+ export { default as ScatterPlot } from './plots/correlation/scatter/Plot.svelte';
16
+ export { default as SlopePlot } from './plots/evolution/slope/Plot.svelte';
17
+ export { default as SparklinePlot } from './plots/evolution/sparkline/Plot.svelte';
18
+ export { default as ViolinPlot } from './plots/distribution/violin/Plot.svelte';
9
19
  export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
10
20
  export { default as GridCell } from './layout/grid/GridCell.svelte';
11
21
  export { default as Plot } from './layout/plot/Plot.svelte';
@@ -20,20 +30,20 @@ export type { ThemeName } from './configuration/themes';
20
30
  export { groupBy, buildSeries } from './utils/grouping';
21
31
  export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
22
32
  export { Margins } from './layout/margins/Margins';
23
- export { resolveOpacityScale } from './utils/opacity';
24
- export { resolveSymbolScale } from './utils/symbol';
33
+ export { resolveOpacityScale } from './utils/OpacityScale';
34
+ export { resolveSymbolScale } from './utils/SymbolScale';
25
35
  export { Statistics } from './phases/statistics/Statistics';
26
36
  export type { AxisValue, ChannelValue, ChannelName, AxisChannelName, IndependentChannelName, SizeChannelName, ChannelAccessors } from './types/layout/mapping';
27
37
  export type { AxisScale, AxisBasedScalesConfig, ChannelScalesConfig } from './types/layout/scales';
28
38
  export type { Accessor, Series, SeriesProps, DataProps } from './types/plots/data/common';
29
39
  export type { BasePlotProps, PlotCoreProps, PlotChromeProps, FigureBoxProps, SegmentsConfig, ScalesConfig, MarginConfig, TooltipConfig, HoverConfig } from './types/plots/props';
30
- export type { AxisBasedStylesConfig, GapsAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
40
+ export type { AxisBasedStylesConfig, ConnectorBasedStylesConfig, BulletStylesConfig, GapsAwarePlotStylesConfig, CurveAwarePlotStylesConfig, GeoStylesConfig, GeoTileLayerConfig } from './types/layout/styles';
31
41
  export type { GapsConfig } from './types/plots/gaps';
32
42
  export type { LineSegmentStyle, BarSegmentStyle, CellSegmentStyle, GeoSegmentStyle, ScatterSegmentStyle } from './types/plots/segments/common';
33
43
  export type { Range, Area, Segment } from './types/plots/segments/config';
34
44
  export type { SymbolType } from './types/plots/constants';
35
45
  export type { FontStyle, StrokeStyle, DotStyle, AreaStyle } from './types/plots/styling';
36
- export type { AxisBasedMarkersConfig, BrushSelection, MarkerCurveName } from './types/markers/common';
46
+ export type { AxisBasedMarkersConfig, BrushSelection } from './types/markers/common';
37
47
  export type { StatisticConfig } from './types/layout/statistics';
38
48
  export type * from './types/transforms';
39
49
  export type { GeoFeature, GeoJsonInput, GeoDataProps, Topology } from './types/plots/data/geo';
@@ -41,10 +51,10 @@ export type { GeoCustomProjection, GeoCustomProjectionFactory, GeoScalesConfig,
41
51
  export type { GeoCameraConfig } from './types/plots/camera';
42
52
  export type { GeoMarkersConfig } from './types/markers/geo';
43
53
  export type { SharedAxisValues } from './types/phases';
44
- export type { TimeValue, Orientation, TimelineConfig, TimelineType, TimelineCallbacks, PlayerConfig, PlayerControl } from './types/layout/timeline';
54
+ export type { TimelineConfig, TimelineType, TimelineCallbacks, PlayerConfig, PlayerControl } from './types/layout/timeline';
45
55
  export type { ComposerLayout, ComposerTags, ComposerTimelineConfig, ComposerHoverConfig } from './types/layout/composer';
46
56
  export type { GridPlacement, GridInset, GridCellContext, GridCellSnippet } from './types/layout/grid';
47
57
  export type { Responsive, FacetConfig, FacetCellContext, FacetIndicatorContext, FacetIndicatorSnippet, FacetNavDirection, FacetNavContext, FacetNavSnippet } from './types/layout/facet';
48
58
  export type { LegendSection, DiscreteLegendSection, ContinuousLegendSection, LegendItem, LegendNavDirection, LegendNavContext, LegendNavSnippet, LegendEntry, LegendMark, LegendRange } from './types/layout/legend';
49
59
  export type { HoverStrategy, HoverPoint, HoverDisplayPoint } from './types/layout/hover';
50
- export type { PlotStylesConfig, PlotStylesConfigInput, DividerLineStyle, TextStyle } from './types/configuration/styling';
60
+ export type { PlotStylesConfig, PlotStylesConfigInput, PaletteInput, DividerLineStyle, TextStyle } from './types/configuration/styling';
package/dist/index.js CHANGED
@@ -1,14 +1,24 @@
1
1
  // ── Plots ───────────────────────────────────────────────────────────────────
2
2
  // One mark family each, with optional chrome (title, legend, caption),
3
3
  // timeline and facets around it.
4
- export { default as AreaPlot } from './plots/area/Plot.svelte';
5
- export { default as BarPlot } from './plots/bar/Plot.svelte';
6
- export { default as HistogramPlot } from './plots/histogram/Plot.svelte';
7
- export { default as HeatmapPlot } from './plots/heatmap/Plot.svelte';
8
- export { default as LinePlot } from './plots/line/Plot.svelte';
9
- export { default as PyramidPlot } from './plots/pyramid/Plot.svelte';
10
- export { default as ScatterPlot } from './plots/scatter/Plot.svelte';
11
- export { default as GeoPlot } from './plots/geo/Plot.svelte';
4
+ export { default as AreaPlot } from './plots/evolution/area/Plot.svelte';
5
+ export { default as BarPlot } from './plots/ranking/bar/Plot.svelte';
6
+ export { default as BoxPlot } from './plots/distribution/box/Plot.svelte';
7
+ export { default as BulletPlot } from './plots/ranking/bullet/Plot.svelte';
8
+ export { default as ClevelandPlot } from './plots/ranking/cleveland/Plot.svelte';
9
+ export { default as DensityPlot } from './plots/distribution/density/Plot.svelte';
10
+ export { default as DumbbellPlot } from './plots/ranking/dumbbell/Plot.svelte';
11
+ export { default as ForestPlot } from './plots/ranking/forest/Plot.svelte';
12
+ export { default as GeoPlot } from './plots/map/geo/Plot.svelte';
13
+ export { default as HeatmapPlot } from './plots/correlation/heatmap/Plot.svelte';
14
+ export { default as HistogramPlot } from './plots/distribution/histogram/Plot.svelte';
15
+ export { default as LinePlot } from './plots/evolution/line/Plot.svelte';
16
+ export { default as LollipopPlot } from './plots/ranking/lollipop/Plot.svelte';
17
+ export { default as PyramidPlot } from './plots/distribution/pyramid/Plot.svelte';
18
+ export { default as ScatterPlot } from './plots/correlation/scatter/Plot.svelte';
19
+ export { default as SlopePlot } from './plots/evolution/slope/Plot.svelte';
20
+ export { default as SparklinePlot } from './plots/evolution/sparkline/Plot.svelte';
21
+ export { default as ViolinPlot } from './plots/distribution/violin/Plot.svelte';
12
22
  // ── Composition ─────────────────────────────────────────────────────────────
13
23
  // Separate plots combined into one figure, with chrome of its own.
14
24
  export { default as PlotComposer } from './layout/composer/PlotComposer.svelte';
@@ -26,6 +36,6 @@ export { SYSTEM_FONT } from './configuration/fonts';
26
36
  export { groupBy, buildSeries } from './utils/grouping';
27
37
  export { makeColorScale, resolveColorScale, normalize, resolveCssColor, paletteColor, contrastTextColor, contrastRatio } from './utils/color';
28
38
  export { Margins } from './layout/margins/Margins';
29
- export { resolveOpacityScale } from './utils/opacity';
30
- export { resolveSymbolScale } from './utils/symbol';
39
+ export { resolveOpacityScale } from './utils/OpacityScale';
40
+ export { resolveSymbolScale } from './utils/SymbolScale';
31
41
  export { Statistics } from './phases/statistics/Statistics';
@@ -1,55 +1,19 @@
1
- <script module lang="ts">
2
- import type { Margins as MarginsType } from '../margins/Margins';
3
- import type { EdgeBox } from '../../types/layout/box';
4
- import type { StylesLayoutConfig } from '../../types/layout/styles';
5
- import type { HoverPosition } from '../../types/phases';
6
- import type { HoverConfig as PlotHoverConfig } from '../../types/plots/props';
7
-
8
- /**
9
- * What `BasePlotLayout` draws from: the end of a plot's pipeline. An axis
10
- * kind's state is one as is; GeoPlot builds its own.
11
- */
12
- export type PlotLayoutState = {
13
- /** What the pointer can match, and how the hover reads. */
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- hover?: PlotHoverConfig<any>;
16
- /** Where each row sits, for hover matching and the plot's scales. */
17
- hoverPosition?: HoverPosition;
18
- /** The rows the plot draws and hovers over. */
19
- hoverRows?: unknown[];
20
- /** The plot's x/y/r/length scales, and the scales a marker without its own inherits. */
21
- scales?: object;
22
- /** What the plot's position channels are and which way it runs, for what draws inside it. */
23
- axes?: PlotAxes;
24
- /** Every marker the pipeline resolved. */
25
- markers?: object[];
26
- /** All resolved series - axis kinds only. */
27
- resolvedSeries?: object[];
28
- /** Each series' color, by name - axis kinds only. */
29
- colorForSeries?: (name: string) => string;
30
- /** Per-series marker groups - axis kinds only. */
31
- scopedGroups?: object[];
32
- /** The plot's `styles`: its frame and, on a map, its tile layer. */
33
- styles?: StylesLayoutConfig;
34
- /** What an `'auto'` margin side reads as. Defaults to {@link Margins.AXIS_ESTIMATE}. */
35
- marginEstimate?: MarginsType;
36
- /** The plot's value labels, whose `reach` is the room the margins start from. */
37
- valueLabels?: { reach: EdgeBox[] };
38
- };
39
- </script>
40
-
41
1
  <script
42
2
  lang="ts"
43
3
  generics="TData extends Record<string, unknown>, TSeries extends Record<string, unknown> = TData"
44
4
  >
45
5
  import { Margins } from '../margins/Margins';
6
+ import type { AxisScale } from '../../types/layout/scales';
7
+ import type { PlotLayoutState } from '../../types/layout/plot';
46
8
  import { PlotMargins } from '../margins/PlotMargins.svelte';
47
9
  import { LegendState } from '../legend/LegendState.svelte';
48
10
  import { onDestroy, untrack } from 'svelte';
11
+ import { SvelteMap } from 'svelte/reactivity';
49
12
  import type { ComponentProps, Snippet } from 'svelte';
50
13
  import { Plot, Pointer, setPlotDefaults } from 'svelteplot';
51
14
  import { getConfiguration } from '../../configuration/config.svelte';
52
- import { buildScale } from '../scales/buildScale';
15
+ import { SveltePlotScale } from '../scales/SveltePlotScale';
16
+ import { TickLabels } from '../scales/TickLabels';
53
17
  import ScalesLayout from '../scales/ScalesLayout.svelte';
54
18
  import GeometryLayout from '../geometry/GeometryLayout.svelte';
55
19
  import CoordinatesLayout from '../coordinates/CoordinatesLayout.svelte';
@@ -58,7 +22,6 @@
58
22
  import { PlotHover } from '../hover/PlotHover.svelte';
59
23
  import { PlotContext } from '../plot/PlotContext';
60
24
  import { TimelineState } from '../timeline/TimelineState.svelte';
61
- import type { PlotAxes } from '../../phases/data/PlotAxes';
62
25
  import type { AxisBasedScalesConfig } from '../../types/layout/scales';
63
26
  import type { AxisValue } from '../../types/layout/mapping';
64
27
  import type { CoordinatesConfig, GeoScalesConfig } from '../../types/layout/coordinates';
@@ -141,7 +104,9 @@
141
104
  // What this plot draws, on its figure's legend - its series, their colors and marks.
142
105
  const legend = LegendState.current();
143
106
  const legendSource = Symbol('plot');
107
+ const silenced = LegendState.isSilenced();
144
108
  $effect(() => {
109
+ if (silenced) return;
145
110
  const entries = LegendState.entriesOf(state as never);
146
111
  untrack(() => legend?.register(legendSource, entries));
147
112
  });
@@ -161,16 +126,91 @@
161
126
  numberFormat: { useGrouping: 'min2', compactDisplay: untrack(() => cfg.axis.compactDisplay) }
162
127
  });
163
128
 
129
+ /** What an `'auto'` side reads as: the plot's own estimate, less the room of an axis that is not drawn. */
130
+ const marginEstimate = $derived.by(() => {
131
+ const estimate = state.marginEstimate ?? Margins.AXIS_ESTIMATE;
132
+ const bare = { x: scales?.x?.axisDisplay === 'none', y: scales?.y?.axisDisplay === 'none' };
133
+ return estimate.map((value, side) =>
134
+ (bare.x && side === 'bottom') || (bare.y && side === 'left') ? Math.min(value, 8) : value
135
+ );
136
+ });
137
+
138
+ /**
139
+ * How the labels of the plot's category axes (bands, or text laid out as points) are laid out when they would not fit
140
+ * side by side, unless the author set a `tickRotate` of their own or turned
141
+ * `axis.autoRotate` off: the x labels turn (45 degrees, else 90), and either
142
+ * axis leaves some out when even that is not enough. Judged against the plot's
143
+ * width and height less the margins an `'auto'` side is estimated at, so it holds
144
+ * whatever the margins settle on.
145
+ */
146
+ const tickLayout = $derived.by(() => {
147
+ // A kind's band axes, and any axis of text categories a line or scatter lays out as points.
148
+ const bands = (['x', 'y'] as const).filter(
149
+ (axis) => state.axes?.bands.includes(axis) || state.axes?.isDiscrete(axis)
150
+ );
151
+ if (!cfg.axis.autoRotate || bands.length === 0) return undefined;
152
+ const estimate = marginEstimate;
153
+ const categories = (axis: 'x' | 'y') => {
154
+ const given = scales?.[axis]?.domain;
155
+ if (given) return given.map(String);
156
+ const get = axis === 'x' ? getX : getY;
157
+ return [...new Set(data.map((row) => String(get(row))))].sort();
158
+ };
159
+ const out: {
160
+ x?: ReturnType<typeof TickLabels.layout>;
161
+ y?: { every: number; values: string[] };
162
+ } = {};
163
+ if (bands.includes('x') && scales?.x?.tickRotate === undefined) {
164
+ out.x = TickLabels.layout(
165
+ categories('x'),
166
+ width - estimate.left - estimate.right,
167
+ scales?.x?.paddingInner ?? 0.1,
168
+ cfg.axis.fontSize,
169
+ cfg
170
+ );
171
+ }
172
+ if (bands.includes('y') && scales?.y?.ticks == null) {
173
+ const values = categories('y');
174
+ const every = TickLabels.rows(
175
+ values.length,
176
+ height - estimate.top - estimate.bottom,
177
+ cfg.axis.fontSize
178
+ );
179
+ if (every > 1) out.y = { every, values };
180
+ }
181
+ return out;
182
+ });
183
+ /** `scales` with the rotation the tick layout chose for the x labels. */
184
+ const layoutScales = $derived.by(() => {
185
+ const rotate = tickLayout?.x?.rotate;
186
+ if (!rotate || scales === undefined) return scales;
187
+ return { ...scales, x: { ...scales.x, tickRotate: rotate } };
188
+ });
189
+ /** The category labels a crowded axis still writes: one in every few. */
190
+ const tickValues = $derived.by(() => {
191
+ const out: Partial<Record<'x' | 'y', string[]>> = {};
192
+ const x = tickLayout?.x;
193
+ if (x && x.every > 1) {
194
+ const values =
195
+ scales?.x?.domain?.map(String) ?? [...new Set(data.map((row) => String(getX(row))))].sort();
196
+ out.x = values.filter((_, index) => index % x.every === 0);
197
+ }
198
+ const y = tickLayout?.y;
199
+ if (y) out.y = y.values.filter((_, index) => index % y.every === 0);
200
+ return out;
201
+ });
202
+
164
203
  // Created once: this plot's margins, grown to fit the labels its markers report.
165
204
  const plotMargins = new PlotMargins({
166
205
  theme: () => cfg.margins,
167
206
  author: () => margins,
168
- estimate: () => state.marginEstimate ?? Margins.AXIS_ESTIMATE,
207
+ estimate: () => marginEstimate,
169
208
  reserve: () => state.valueLabels?.reach ?? [],
170
209
  size: () => ({ width, height }),
171
210
  resetKey: () => state.resolvedSeries,
172
- scales: () => scales,
211
+ scales: () => layoutScales,
173
212
  tickFontSize: () => cfg.axis.fontSize,
213
+ tickWidth: () => ({ x: tickLayout?.x?.width }),
174
214
  settle: (settled) => (margins = settled)
175
215
  });
176
216
  const numericMargins = $derived(plotMargins.numeric);
@@ -187,9 +227,37 @@
187
227
  size: () => ({ width, height })
188
228
  });
189
229
 
190
- // `buildScale` already left only svelteplot's own scale options.
191
- const resolvedX = $derived(buildScale(scales?.x, data, getX) as SveltePlotProps['x']);
192
- const resolvedY = $derived(buildScale(scales?.y, data, getY) as SveltePlotProps['y']);
230
+ /** The domains `ScalesLayout` widens an axis to, for an edge tick's `'extend'` (see `EdgeTicks`). */
231
+ const edgeDomains = new SvelteMap<'x' | 'y', [number, number]>();
232
+
233
+ /** The title svelteplot would infer from rows, for a slice with none (it infers nothing then). */
234
+ function titleOfEmpty(axis: 'x' | 'y', scale: AxisScale<TData> | undefined): string | undefined {
235
+ const field = state.channels?.[axis]?.source;
236
+ if (data.length > 0 || typeof field !== 'string' || scale?.label !== undefined)
237
+ return undefined;
238
+ if (scale?.type === 'time' || scale?.type === 'utc') return undefined;
239
+ // `ScalesLayout` draws a vertical title.
240
+ if (scale?.labelOrientation === 'vertical') return undefined;
241
+ if (axis === 'y') return `${scale?.reverse ? '↓' : '↑'} ${field}`;
242
+ if (state.axes?.isDiscrete('x')) return field;
243
+ return scale?.reverse ? `← ${field}` : `${field} →`;
244
+ }
245
+
246
+ // `SveltePlotScale.build` already left only svelteplot's own scale options.
247
+ const resolvedX = $derived.by(() => {
248
+ const built = SveltePlotScale.build(layoutScales?.x, data, getX);
249
+ const domain = edgeDomains.get('x');
250
+ const label = titleOfEmpty('x', layoutScales?.x);
251
+ const out = domain ? { ...built, domain, nice: false } : built;
252
+ return (label ? { ...out, label } : out) as SveltePlotProps['x'];
253
+ });
254
+ const resolvedY = $derived.by(() => {
255
+ const built = SveltePlotScale.build(scales?.y, data, getY);
256
+ const domain = edgeDomains.get('y');
257
+ const label = titleOfEmpty('y', scales?.y);
258
+ const out = domain ? { ...built, domain, nice: false } : built;
259
+ return (label ? { ...out, label } : out) as SveltePlotProps['y'];
260
+ });
193
261
  /** Threaded straight into svelteplot's own `r` scale option - see `RScaleConfig`'s own doc comment for why this isn't independently resolved like `color`. */
194
262
  const resolvedR = $derived(scales?.r as SveltePlotProps['r']);
195
263
  /** Threaded straight into svelteplot's own `length` scale option - see `LengthScaleConfig`'s own doc comment. `GeoPlot`-only in practice (see `scales`'s own doc comment), same mechanism as `r`. */
@@ -248,18 +316,27 @@
248
316
  locale={cfg.axis.locale}
249
317
  {data}
250
318
  {containerEl}
251
- remountKey={plotMargins.remountKey}
252
319
  >
253
320
  <StylesLayout styles={state.styles} {width} {height} {numericMargins} />
254
321
  <!-- Axes for every kind but GeoPlot. -->
255
322
  {#if scales !== undefined && coordinates === undefined}
256
- <ScalesLayout {data} {getX} {getY} {width} {height} {numericMargins} {scales} />
323
+ <ScalesLayout
324
+ {data}
325
+ {getX}
326
+ {getY}
327
+ {width}
328
+ {height}
329
+ {numericMargins}
330
+ scales={layoutScales}
331
+ {edgeDomains}
332
+ {tickValues}
333
+ {state}
334
+ />
257
335
  {/if}
258
336
  <GeometryLayout
259
337
  markers={resolvedMarkers}
260
338
  seriesData={seriesData ?? []}
261
339
  scopedGroups={scopedGroups ?? []}
262
- channelScales={scales}
263
340
  {ctrl}
264
341
  {width}
265
342
  {height}
@@ -295,8 +372,9 @@
295
372
  visible={ctrl.showTooltip && ctrl.tooltipPosition != null}
296
373
  x={ctrl.tooltipPosition?.x ?? 0}
297
374
  y={ctrl.tooltipPosition?.y ?? 0}
298
- rows={ctrl.matchedRows.map((p) => p.row)}
375
+ rows={ctrl.matchedRows.map((p) => ({ ...p.row, seriesColor: p.color }))}
299
376
  format={hover.tooltip.format}
377
+ sort={hover.tooltip.sort}
300
378
  content={hover.tooltip.content}
301
379
  anchorX={hover.tooltip.anchorX}
302
380
  anchorY={hover.tooltip.anchorY}
@@ -1,42 +1,5 @@
1
- import type { Margins as MarginsType } from '../margins/Margins';
2
- import type { EdgeBox } from '../../types/layout/box';
3
- import type { StylesLayoutConfig } from '../../types/layout/styles';
4
- import type { HoverPosition } from '../../types/phases';
5
- import type { HoverConfig as PlotHoverConfig } from '../../types/plots/props';
6
- /**
7
- * What `BasePlotLayout` draws from: the end of a plot's pipeline. An axis
8
- * kind's state is one as is; GeoPlot builds its own.
9
- */
10
- export type PlotLayoutState = {
11
- /** What the pointer can match, and how the hover reads. */
12
- hover?: PlotHoverConfig<any>;
13
- /** Where each row sits, for hover matching and the plot's scales. */
14
- hoverPosition?: HoverPosition;
15
- /** The rows the plot draws and hovers over. */
16
- hoverRows?: unknown[];
17
- /** The plot's x/y/r/length scales, and the scales a marker without its own inherits. */
18
- scales?: object;
19
- /** What the plot's position channels are and which way it runs, for what draws inside it. */
20
- axes?: PlotAxes;
21
- /** Every marker the pipeline resolved. */
22
- markers?: object[];
23
- /** All resolved series - axis kinds only. */
24
- resolvedSeries?: object[];
25
- /** Each series' color, by name - axis kinds only. */
26
- colorForSeries?: (name: string) => string;
27
- /** Per-series marker groups - axis kinds only. */
28
- scopedGroups?: object[];
29
- /** The plot's `styles`: its frame and, on a map, its tile layer. */
30
- styles?: StylesLayoutConfig;
31
- /** What an `'auto'` margin side reads as. Defaults to {@link Margins.AXIS_ESTIMATE}. */
32
- marginEstimate?: MarginsType;
33
- /** The plot's value labels, whose `reach` is the room the margins start from. */
34
- valueLabels?: {
35
- reach: EdgeBox[];
36
- };
37
- };
1
+ import type { PlotLayoutState } from '../../types/layout/plot';
38
2
  import type { Snippet } from 'svelte';
39
- import type { PlotAxes } from '../../phases/data/PlotAxes';
40
3
  import type { CoordinatesConfig } from '../../types/layout/coordinates';
41
4
  import type { HoverPoint } from '../../types/layout/hover';
42
5
  import type { MarginConfig } from '../../types/plots/props';
@@ -11,6 +11,7 @@
11
11
  createCameraRotateTween
12
12
  } from './camera.svelte';
13
13
  import CameraFit from './CameraFit.svelte';
14
+ import ProjectionZoom from './ProjectionZoom.svelte';
14
15
  import type { CoordinatesConfig } from '../../types/layout/coordinates';
15
16
 
16
17
  type SveltePlotProps = ComponentProps<typeof Plot>;
@@ -19,8 +20,8 @@
19
20
  * Resolves the active coordinate system (a `d3-geo` projection) and owns
20
21
  * `<Plot>` itself, since `projection` must be known before it mounts.
21
22
  * Also owns pan/zoom/rotate gesture state and the declarative `camera`,
22
- * composed into the `<g>` transform wrapper (and, for `camera`/`rotate`
23
- * on `orthographic`, into the projection's own `rotate`). A no-op for
23
+ * applied to the projection's output by `ProjectionZoom` (and, for
24
+ * `camera`/`rotate` on `orthographic`, to the projection's own `rotate`). A no-op for
24
25
  * every plot kind but `GeoPlot`.
25
26
  */
26
27
  let {
@@ -35,7 +36,6 @@
35
36
  locale = undefined,
36
37
  data,
37
38
  containerEl,
38
- remountKey = undefined,
39
39
  children
40
40
  }: {
41
41
  width: number;
@@ -53,8 +53,6 @@
53
53
  /** Fed to `resolveProjection`'s `domain: 'data'` sentinel and to `coordinates.camera`'s `{features}` target resolution. */
54
54
  data: TData[];
55
55
  containerEl?: HTMLDivElement;
56
- /** See `BasePlotLayout`'s own `remountKey` doc comment - forwarded verbatim to key svelteplot's `<Plot>` itself. */
57
- remountKey?: string | number;
58
56
  children: Snippet;
59
57
  } = $props();
60
58
 
@@ -131,13 +129,17 @@
131
129
  );
132
130
  const rotateOverrideActive = $derived(cameraOrthoRotate != null || rotateEnabled);
133
131
 
132
+ /** Moving the view past the plot's box needs what is outside it drawn too: the frame clip would cut it at the unmoved box, so the plot's own clip does it instead. */
133
+ const movesView = $derived(zoomEnabled || panEnabled || cameraActive);
134
+
134
135
  const finalProjection = $derived.by(() => {
135
- if (!rotateOverrideActive) return resolvedProjection;
136
+ if (!rotateOverrideActive && !movesView) return resolvedProjection;
136
137
  return {
137
138
  ...(typeof resolvedProjection === 'string'
138
139
  ? { type: resolvedProjection }
139
140
  : resolvedProjection),
140
- rotate: activeRotate
141
+ ...(rotateOverrideActive ? { rotate: activeRotate } : {}),
142
+ ...(movesView ? { clip: false } : {})
141
143
  };
142
144
  });
143
145
 
@@ -149,41 +151,41 @@
149
151
  transition: () => cameraConfig?.transition
150
152
  });
151
153
  const cameraTransform = $derived(cameraTransformTween.current ?? { x: 0, y: 0, k: 1 });
154
+ const clipId = `geo-frame-clip-${Math.random().toString(36).slice(2, 9)}`;
152
155
  </script>
153
156
 
154
- {#key remountKey}
155
- <Plot
156
- {width}
157
- {height}
158
- {margin}
159
- {x}
160
- {y}
161
- {r}
162
- {length}
163
- {locale}
164
- projection={finalProjection as SveltePlotProps['projection']}
165
- >
166
- {#if cameraActive && resolvedCameraTarget}
167
- <CameraFit
168
- target={resolvedCameraTarget}
169
- anchor={cameraConfig?.anchor}
170
- padding={cameraConfig?.padding}
171
- zoom={cameraConfig?.zoom}
172
- {width}
173
- {height}
174
- onFit={(fit) => (cameraFit = fit)}
175
- />
176
- {/if}
177
- <g transform="translate({cameraTransform.x}, {cameraTransform.y}) scale({cameraTransform.k})">
178
- <g
179
- transform="translate({geoZoom.transform.x}, {geoZoom.transform.y}) scale({geoZoom.transform
180
- .k})"
181
- >
182
- {@render children()}
183
- </g>
184
- </g>
185
- </Plot>
186
- {/key}
157
+ <Plot
158
+ {width}
159
+ {height}
160
+ {margin}
161
+ {x}
162
+ {y}
163
+ {r}
164
+ {length}
165
+ {locale}
166
+ projection={finalProjection as SveltePlotProps['projection']}
167
+ >
168
+ {#if cameraActive && resolvedCameraTarget}
169
+ <CameraFit
170
+ target={resolvedCameraTarget}
171
+ anchor={cameraConfig?.anchor}
172
+ padding={cameraConfig?.padding}
173
+ zoom={cameraConfig?.zoom}
174
+ {width}
175
+ {height}
176
+ onFit={(fit) => (cameraFit = fit)}
177
+ />
178
+ {/if}
179
+ <!-- What a zoom or a camera pushes past the plot's box is cut there, so it never covers the legend or the chrome around it. -->
180
+ <defs>
181
+ <clipPath id={clipId}><rect x="0" y="0" {width} {height} /></clipPath>
182
+ </defs>
183
+ <g clip-path="url(#{clipId})">
184
+ <ProjectionZoom inner={geoZoom.transform} outer={cameraTransform}>
185
+ {@render children()}
186
+ </ProjectionZoom>
187
+ </g>
188
+ </Plot>
187
189
 
188
190
  <style>
189
191
  :global(figure.svelteplot svg) {
@@ -17,8 +17,6 @@ declare function $$render<TData extends Record<string, unknown>>(): {
17
17
  /** Fed to `resolveProjection`'s `domain: 'data'` sentinel and to `coordinates.camera`'s `{features}` target resolution. */
18
18
  data: TData[];
19
19
  containerEl?: HTMLDivElement;
20
- /** See `BasePlotLayout`'s own `remountKey` doc comment - forwarded verbatim to key svelteplot's `<Plot>` itself. */
21
- remountKey?: string | number;
22
20
  children: Snippet;
23
21
  };
24
22
  exports: {};
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { getContext, setContext, type Snippet } from 'svelte';
3
+ import { ZoomedProjection } from './ZoomedProjection';
4
+ import type { GeoZoomTransform } from './zoom.svelte';
5
+ import type { StreamingProjection } from '../../plots/utils/tiles';
6
+
7
+ /**
8
+ * Draws everything inside it through the plot's projection moved by `inner`
9
+ * then `outer`, instead of scaling the drawn SVG: a zoom moves and spreads the
10
+ * positions, while dots, text and strokes keep their size. Works by handing
11
+ * the marks below a view of svelteplot's plot state whose `scales.projection`
12
+ * is the moved one.
13
+ */
14
+ let {
15
+ inner,
16
+ outer,
17
+ children
18
+ }: { inner: GeoZoomTransform; outer: GeoZoomTransform; children: Snippet } = $props();
19
+
20
+ type Scales = { projection?: StreamingProjection & { aspectRatio?: number } } | undefined;
21
+ type PlotState = { scales: Scales; publicState: object };
22
+ type PlotContext = { getPlotState: () => PlotState } & Record<string, unknown>;
23
+
24
+ const context = getContext<PlotContext>('svelteplot');
25
+ const state = context.getPlotState();
26
+
27
+ const scales = $derived.by((): Scales => {
28
+ const own = state.scales;
29
+ return own?.projection
30
+ ? { ...own, projection: ZoomedProjection.of(own.projection, inner, outer) }
31
+ : own;
32
+ });
33
+
34
+ const publicState = new Proxy(state.publicState, {
35
+ get: (target, key) => (key === 'scales' ? scales : Reflect.get(target, key, target))
36
+ });
37
+ const movedState = new Proxy(state, {
38
+ get: (target, key) => {
39
+ if (key === 'scales') return scales;
40
+ if (key === 'publicState') return publicState;
41
+ return Reflect.get(target, key, target);
42
+ }
43
+ });
44
+
45
+ setContext('svelteplot', { ...context, getPlotState: () => movedState });
46
+ </script>
47
+
48
+ {@render children()}
@@ -0,0 +1,10 @@
1
+ import { type Snippet } from 'svelte';
2
+ import type { GeoZoomTransform } from './zoom.svelte';
3
+ type $$ComponentProps = {
4
+ inner: GeoZoomTransform;
5
+ outer: GeoZoomTransform;
6
+ children: Snippet;
7
+ };
8
+ declare const ProjectionZoom: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type ProjectionZoom = ReturnType<typeof ProjectionZoom>;
10
+ export default ProjectionZoom;
@@ -0,0 +1,11 @@
1
+ import type { GeoZoomTransform } from './zoom.svelte';
2
+ import type { StreamingProjection } from '../../plots/utils/tiles';
3
+ /** A fitted projection with a pan and scale applied to where it puts things, so positions move and zoom while what is drawn at them keeps its size. */
4
+ export declare class ZoomedProjection {
5
+ /** `projection`, then `outer` over `inner` (each a pan and scale) as one move in pixels. */
6
+ static of(projection: StreamingProjection & {
7
+ aspectRatio?: number;
8
+ }, inner: GeoZoomTransform, outer: GeoZoomTransform): StreamingProjection & {
9
+ aspectRatio?: number;
10
+ };
11
+ }
@@ -0,0 +1,24 @@
1
+ import { geoTransform } from 'd3-geo';
2
+ /** A fitted projection with a pan and scale applied to where it puts things, so positions move and zoom while what is drawn at them keeps its size. */
3
+ export class ZoomedProjection {
4
+ /** `projection`, then `outer` over `inner` (each a pan and scale) as one move in pixels. */
5
+ static of(projection, inner, outer) {
6
+ const k = inner.k * outer.k;
7
+ const x = outer.k * inner.x + outer.x;
8
+ const y = outer.k * inner.y + outer.y;
9
+ if (k === 1 && x === 0 && y === 0)
10
+ return projection;
11
+ const move = geoTransform({
12
+ point(px, py) {
13
+ this.stream.point(px * k + x, py * k + y);
14
+ }
15
+ });
16
+ return {
17
+ aspectRatio: projection.aspectRatio,
18
+ invert: projection.invert
19
+ ? ([px, py]) => projection.invert([(px - x) / k, (py - y) / k])
20
+ : undefined,
21
+ stream: (sink) => projection.stream(move.stream(sink))
22
+ };
23
+ }
24
+ }